From: Naveen Kumar Date: Tue, 6 Dec 2016 14:02:12 +0000 (+0530) Subject: Merge commit '07772caf5ca22365dd62bc042de179a4da55f665' into remote X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=1f8c0e2f7937b2e1baabf79cc558be45e0dd6164;hp=b46b3ddc43134a6ea3ba4cb843971208f37fadb1;p=android-x86%2Fsystem-bt.git Merge commit '07772caf5ca22365dd62bc042de179a4da55f665' into remote Conflicts: device/include/interop_database.h Change-Id: Ib74501079c29033065b1fa2335777c69edcfda23 --- diff --git a/Android.mk b/Android.mk index 11aaa7417..00e8261f1 100644 --- a/Android.mk +++ b/Android.mk @@ -23,6 +23,10 @@ endif bluetooth_CFLAGS += -DUSE_AUDIO_TRACK +ifeq ($(BOARD_USES_WIPOWER),true) +bluetooth_CFLAGS += -DWIPOWER_SUPPORTED +endif + bluetooth_CFLAGS += -DEXPORT_SYMBOL="__attribute__((visibility(\"default\")))" # diff --git a/audio_a2dp_hw/audio_a2dp_hw.h b/audio_a2dp_hw/audio_a2dp_hw.h index 8c30b76e0..1baac4b60 100644 --- a/audio_a2dp_hw/audio_a2dp_hw.h +++ b/audio_a2dp_hw/audio_a2dp_hw.h @@ -124,6 +124,7 @@ struct a2dp_config { }; /* move ctrl_fd outside output stream and keep open until HAL unloaded ? */ +#define MAX_CODEC_CFG_SIZE 30 struct a2dp_stream_common { pthread_mutex_t lock; @@ -132,7 +133,7 @@ struct a2dp_stream_common { size_t buffer_sz; struct a2dp_config cfg; a2dp_state_t state; - uint8_t codec_cfg[20]; + uint8_t codec_cfg[MAX_CODEC_CFG_SIZE]; }; /***************************************************************************** ** Type definitions for callback functions diff --git a/audio_a2dp_hw/bthost_ipc.c b/audio_a2dp_hw/bthost_ipc.c index 7139cc550..261f3eaee 100644 --- a/audio_a2dp_hw/bthost_ipc.c +++ b/audio_a2dp_hw/bthost_ipc.c @@ -172,7 +172,13 @@ static void* a2dp_codec_parser(uint8_t *codec_cfg, audio_format_t *codec_type) char byte,len; uint8_t *p_cfg = codec_cfg; INFO("%s",__func__); - if (codec_cfg[CODEC_OFFSET] == CODEC_TYPE_SBC) + if (codec_cfg[CODEC_OFFSET] == CODEC_TYPE_PCM) + { + *codec_type = AUDIO_FORMAT_PCM_16_BIT; + //For the time being Audio does not require any param to be passed for PCM so returning null + return NULL; + } + else if (codec_cfg[CODEC_OFFSET] == CODEC_TYPE_SBC) { memset(&sbc_codec,0,sizeof(audio_sbc_encoder_config)); p_cfg++;//skip dev idx @@ -688,7 +694,7 @@ int a2dp_read_codec_config(struct a2dp_stream_common *common,uint8_t idx) cmd[0] = A2DP_CTRL_GET_CODEC_CONFIG; cmd[1] = idx; INFO("%s",__func__); - memset(p_codec_cfg,0,20); + memset(p_codec_cfg,0,MAX_CODEC_CFG_SIZE); INFO("%s",__func__); if (send(common->ctrl_fd, cmd, 2, MSG_NOSIGNAL) == -1) diff --git a/audio_a2dp_hw/bthost_ipc.h b/audio_a2dp_hw/bthost_ipc.h index da91522a8..4110bf4a6 100644 --- a/audio_a2dp_hw/bthost_ipc.h +++ b/audio_a2dp_hw/bthost_ipc.h @@ -54,6 +54,7 @@ codec specific definitions #define CODEC_OFFSET 3 #define VENDOR_ID_OFFSET 4 #define CODEC_ID_OFFSET (VENDOR_ID_OFFSET + 4) +#define CODEC_TYPE_PCM 0x05 #ifndef VENDOR_APTX #define VENDOR_APTX 0x4F diff --git a/bta/ag/bta_ag_cmd.c b/bta/ag/bta_ag_cmd.c index 9a878597c..744d8521c 100644 --- a/bta/ag/bta_ag_cmd.c +++ b/bta/ag/bta_ag_cmd.c @@ -1233,11 +1233,12 @@ void bta_ag_at_hfp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type, break; case BTA_AG_HF_CMD_BRSF: - /* store peer features */ + /* store peer features. */ p_scb->peer_features = (UINT16) int_arg; features = p_scb->features & BTA_AG_BSRF_FEAT_SPEC; /* if the devices does not support HFP 1.7, report DUT's HFP version as 1.6 */ - if (p_scb->peer_version < HFP_VERSION_1_7) + if ((p_scb->peer_version < HFP_VERSION_1_7) && + (!(p_scb->peer_features & BTA_AG_PEER_FEAT_HFIND))) { /* For PTS keep flags as is. */ if (property_get("bt.pts.certification", value, "false") && diff --git a/bta/av/bta_av_act.c b/bta/av/bta_av_act.c index d80128d10..b2d62e0ba 100644 --- a/bta/av/bta_av_act.c +++ b/bta/av/bta_av_act.c @@ -65,6 +65,10 @@ #define BTA_AV_ACCEPT_SIGNALLING_TIMEOUT_MS (2 * 1000) /* 2 seconds */ #endif +#ifndef AVRC_CONNECT_RETRY_DELAY_MS +#define AVRC_CONNECT_RETRY_DELAY_MS 2000 +#endif + extern fixed_queue_t *btu_bta_alarm_queue; static void bta_av_accept_signalling_timer_cback(void *data); @@ -2113,6 +2117,15 @@ void bta_av_rc_disc_done(tBTA_AV_DATA *p_data) } APPL_TRACE_DEBUG("%s rc_handle %d", __FUNCTION__, rc_handle); + if (rc_handle == BTA_AV_RC_HANDLE_NONE) + { + if (AVRC_CheckIncomingConn(p_scb->peer_addr) == TRUE) + { + bta_sys_start_timer(p_scb->avrc_ct_timer, AVRC_CONNECT_RETRY_DELAY_MS, + BTA_AV_SDP_AVRC_DISC_EVT,p_scb->hndl); + } + } + #if (BTA_AV_SINK_INCLUDED == TRUE) if (p_cb->sdp_a2d_snk_handle) { diff --git a/bta/av/bta_av_main.c b/bta/av/bta_av_main.c index c516612ee..49666b76e 100644 --- a/bta/av/bta_av_main.c +++ b/bta/av/bta_av_main.c @@ -763,6 +763,10 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data) continue; } } + } else if (codec_type == AAC) { + //Don't add AAC in Non split mode + index++; + continue; } if(AVDT_CreateStream(&p_scb->seps[index - startIndex].av_handle, &cs) == diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c index e42429a08..718032d0b 100644 --- a/bta/dm/bta_dm_act.c +++ b/bta/dm/bta_dm_act.c @@ -507,8 +507,13 @@ void bta_dm_disable (tBTA_DM_MSG *p_data) /* Disable SOC Logging */ if (soc_type == BT_SOC_SMD) { - UINT8 param[5] = {0x10,0x02,0x00,0x00,0x01}; - BTM_VendorSpecificCommand(HCI_VS_HOST_LOG_OPCODE,5,param,NULL); + UINT8 param[5] = {0x10, 0x02, 0x00, 0x00, 0x01}; + BTM_VendorSpecificCommand(HCI_VS_HOST_LOG_OPCODE, 5, param, NULL); + } + else if (soc_type == BT_SOC_CHEROKEE) + { + UINT8 param_cherokee[2] = {0x14, 0x00}; + BTM_VendorSpecificCommand(HCI_VS_HOST_LOG_OPCODE, 2, param_cherokee, NULL); } if(BTM_GetNumAclLinks()==0) diff --git a/bta/dm/bta_dm_int.h b/bta/dm/bta_dm_int.h index 4c0f9dd27..907d936c5 100644 --- a/bta/dm/bta_dm_int.h +++ b/bta/dm/bta_dm_int.h @@ -766,8 +766,12 @@ typedef union tBTA_DM_API_VENDOR_SPECIFIC_COMMAND vendor_command; } tBTA_DM_MSG; - +#ifndef MAX_ACL_CONNECTIONS #define BTA_DM_NUM_PEER_DEVICE 7 +#else +#define BTA_DM_NUM_PEER_DEVICE MAX_ACL_CONNECTIONS +#endif + #define BTA_DM_NOT_CONNECTED 0 #define BTA_DM_CONNECTED 1 diff --git a/bta/gatt/bta_gattc_int.h b/bta/gatt/bta_gattc_int.h index d895864c8..44fe5eacd 100644 --- a/bta/gatt/bta_gattc_int.h +++ b/bta/gatt/bta_gattc_int.h @@ -79,7 +79,11 @@ typedef UINT16 tBTA_GATTC_INT_EVT; /* max known devices GATTC can support */ #ifndef BTA_GATTC_KNOWN_SR_MAX +#ifndef MAX_ACL_CONNECTIONS #define BTA_GATTC_KNOWN_SR_MAX 10 +#else +#define BTA_GATTC_KNOWN_SR_MAX MAX_ACL_CONNECTIONS +#endif #endif #define BTA_GATTC_CONN_MAX GATT_MAX_PHY_CHANNEL @@ -296,7 +300,11 @@ typedef struct } tBTA_GATTC_SERV; #ifndef BTA_GATTC_NOTIF_REG_MAX +#ifndef MAX_ACL_CONNECTIONS #define BTA_GATTC_NOTIF_REG_MAX 15 +#else +#define BTA_GATTC_NOTIF_REG_MAX MAX_ACL_CONNECTIONS*3 +#endif #endif typedef struct diff --git a/btif/co/bta_av_co.c b/btif/co/bta_av_co.c index cdf4690ec..39a8ebfa7 100644 --- a/btif/co/bta_av_co.c +++ b/btif/co/bta_av_co.c @@ -1357,6 +1357,8 @@ void bta_av_co_audio_delay(tBTA_AV_HNDL hndl, UINT16 delay) static BOOLEAN bta_av_co_audio_codec_build_config(const UINT8 *p_codec_caps, UINT8 *p_codec_cfg) { FUNC_TRACE(); + tA2D_AAC_CIE peer_aac_cfg; + tA2D_AAC_CIE aac_cfg_selected; memset(p_codec_cfg, 0, AVDT_CODEC_SIZE); @@ -1380,6 +1382,17 @@ static BOOLEAN bta_av_co_audio_codec_build_config(const UINT8 *p_codec_caps, UIN case BTIF_AV_CODEC_M24: /* only copy the relevant portions for this codec to avoid issues when comparing codec configs covering larger codec sets than SBC (7 bytes) */ + A2D_ParsAacInfo (&peer_aac_cfg ,(UINT8*)p_codec_caps, FALSE); + A2D_ParsAacInfo (&aac_cfg_selected ,bta_av_co_cb.codec_cfg->info, FALSE); + + aac_cfg_selected.bit_rate = + BTA_AV_CO_MIN(peer_aac_cfg.bit_rate, + aac_cfg_selected.bit_rate); + APPL_TRACE_EVENT("%s AAC bitrate selected %d", __func__, + aac_cfg_selected.bit_rate); + //update with new value + A2D_BldAacInfo (AVDT_MEDIA_AUDIO, &aac_cfg_selected, bta_av_co_cb.codec_cfg->info); + memcpy(p_codec_cfg, bta_av_co_cb.codec_cfg->info, A2D_AAC_INFO_LEN+1); APPL_TRACE_DEBUG("%s AAC", __func__); break; diff --git a/btif/include/btif_hh.h b/btif/include/btif_hh.h index aa9793ece..b58be360d 100644 --- a/btif/include/btif_hh.h +++ b/btif/include/btif_hh.h @@ -31,7 +31,12 @@ ** Constants & Macros ********************************************************************************/ +#ifndef MAX_ACL_CONNECTIONS #define BTIF_HH_MAX_HID 8 +#else +#define BTIF_HH_MAX_HID MAX_ACL_CONNECTIONS +#endif + #define BTIF_HH_MAX_ADDED_DEV 32 #define BTIF_HH_MAX_KEYSTATES 3 diff --git a/btif/src/bluetooth.c b/btif/src/bluetooth.c index ae9850d1b..008e5968f 100644 --- a/btif/src/bluetooth.c +++ b/btif/src/bluetooth.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -44,6 +45,9 @@ #include #include #include +#ifdef WIPOWER_SUPPORTED +#include +#endif #include "bt_utils.h" #include "btif_api.h" @@ -67,6 +71,7 @@ #include "btif/include/btif_media.h" #include "l2cdefs.h" #include "l2c_api.h" +#include "stack_config.h" #if TEST_APP_INTERFACE == TRUE #include @@ -113,6 +118,9 @@ extern btgatt_interface_t *btif_gatt_get_interface(); /* avrc target */ extern btrc_interface_t *btif_rc_get_interface(); /* avrc controller */ +#ifdef WIPOWER_SUPPORTED +extern wipower_interface_t *get_wipower_interface(); +#endif extern btrc_interface_t *btif_rc_ctrl_get_interface(); /*SDP search client*/ extern btsdp_interface_t *btif_sdp_get_interface(); @@ -143,6 +151,20 @@ static bool is_profile(const char *p1, const char *p2) { return strlen(p1) == strlen(p2) && strncmp(p1, p2, strlen(p2)) == 0; } +void get_logger_config_value() +{ + bool hci_ext_dump_enabled = false; + bool btsnoop_conf_from_file = false; + stack_config_get_interface()->get_btsnoop_ext_options(&hci_ext_dump_enabled, &btsnoop_conf_from_file); + + /* ToDo: Chnage dependency to work on one config option*/ + if(!btsnoop_conf_from_file) + hci_ext_dump_enabled = true; + + if(hci_ext_dump_enabled) + bt_logger_enabled = true; +} + /***************************************************************************** ** ** BLUETOOTH HAL INTERFACE FUNCTIONS @@ -161,6 +183,10 @@ static int init(bt_callbacks_t *callbacks) { bt_hal_cbacks = callbacks; stack_manager_get_interface()->init_stack(); + get_logger_config_value(); + + if(bt_logger_enabled) + property_set("bluetooth.startbtlogger", "true"); btif_debug_init(); return BT_STATUS_SUCCESS; } @@ -187,6 +213,9 @@ static int disable(void) { static void cleanup(void) { stack_manager_get_interface()->clean_up_stack(); + + if(bt_logger_enabled) + property_set("bluetooth.startbtlogger", "false"); } bool is_restricted_mode() { @@ -434,6 +463,11 @@ static const void* get_profile_interface (const char *profile_id) if (is_profile(profile_id, BT_PROFILE_AV_RC_ID)) return btif_rc_get_interface(); +#ifdef WIPOWER_SUPPORTED + if (is_profile(profile_id, BT_PROFILE_WIPOWER_VENDOR_ID)) + return get_wipower_interface(); +#endif + if (is_profile(profile_id, BT_PROFILE_AV_RC_CTRL_ID)) return btif_rc_ctrl_get_interface(); diff --git a/btif/src/btif_av.c b/btif/src/btif_av.c index 8048ec5cc..4ed235d0c 100644 --- a/btif/src/btif_av.c +++ b/btif/src/btif_av.c @@ -1602,7 +1602,9 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data if (enable_multicast == FALSE) { APPL_TRACE_WARNING("other Idx is connected, move to SUSPENDED"); - btif_rc_send_pause_command(); + if (!bt_split_a2dp_enabled) { + btif_rc_send_pause_command(); + } btif_a2dp_on_stopped(&p_av->suspend); } } @@ -1619,6 +1621,23 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data if (p_av->suspend.status == BTA_AV_SUCCESS) btif_sm_change_state(btif_av_cb[index].sm_handle, BTIF_AV_STATE_OPENED); + if (bt_split_a2dp_enabled && + btif_av_is_connected_on_other_idx(index)) + { + /*Fake handoff state to switch streaming to other coddeced + device */ + btif_av_cb[index].dual_handoff = TRUE; + BTIF_TRACE_DEBUG("%s: Notify framework to reconfig",__func__); + int idx = btif_av_get_other_connected_idx(index); + /* Fix for below Klockwork Issue + * Array 'btif_av_cb' of size 2 may use index value(s) -1 */ + if (idx != INVALID_INDEX) + { + HAL_CBACK(bt_av_src_callbacks, reconfig_a2dp_trigger_cb, 1, + &(btif_av_cb[idx].peer_bda)); + } + } + break; case BTA_AV_CLOSE_EVT: diff --git a/btif/src/btif_media_task.c b/btif/src/btif_media_task.c index ce39d2280..6761bed70 100644 --- a/btif/src/btif_media_task.c +++ b/btif/src/btif_media_task.c @@ -407,6 +407,7 @@ typedef struct BOOLEAN tx_started; BOOLEAN tx_stop_initiated; BOOLEAN tx_start_initiated; + BOOLEAN tx_enc_update_initiated; //#endif #endif @@ -865,11 +866,11 @@ static void btif_recv_ctrl_data(void) case A2DP_CTRL_GET_CODEC_CONFIG: { UINT16 min_mtu; - uint8_t param[20],idx,bta_hdl,codec_id = 0; + uint8_t param[MAX_CODEC_CFG_SIZE],idx,bta_hdl,codec_id = 0; uint32_t bitrate = 0; uint8_t i = 0; UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &idx, 1); - memset(param,0,20); + memset(param,0,MAX_CODEC_CFG_SIZE); if (btif_av_stream_started_ready() == FALSE) { @@ -905,7 +906,17 @@ static void btif_recv_ctrl_data(void) a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); BTIF_TRACE_DEBUG("codec_id = %x",codec_id); - if (codec_id == BTIF_AV_CODEC_SBC) + + if (get_soc_type() == BT_SOC_SMD) + { + //For Pronto PLs Audio pumps raw PCM data for others its encoded data to SOC + param[1] = 4; //RAW PCM + param[2] = AVDT_MEDIA_AUDIO; + param[3] = BTIF_AV_CODEC_PCM; + param[4] = btif_media_cb.media_feeding.cfg.pcm.sampling_freq; + param[5] = btif_media_cb.media_feeding.cfg.pcm.num_channel; + } + else if (codec_id == BTIF_AV_CODEC_SBC) { tA2D_SBC_CIE codec_cfg; bta_av_co_audio_get_sbc_config(&codec_cfg, &min_mtu); @@ -934,7 +945,7 @@ static void btif_recv_ctrl_data(void) { tA2D_APTX_CIE* codecInfo = 0; codecInfo = (tA2D_APTX_CIE*) &ptr[BTA_AV_CFG_START_IDX]; - if (codecInfo && codecInfo->vendorId == A2D_APTX_VENDOR_ID + if (codecInfo && codecInfo->vendorId == A2D_APTX_VENDOR_ID && codecInfo->codecId == A2D_APTX_CODEC_ID_BLUETOOTH) { tA2D_APTX_CIE aptx_config; @@ -948,10 +959,33 @@ static void btif_recv_ctrl_data(void) BTIF_TRACE_DEBUG("sample rate = %x",aptx_config.sampleRate); BTIF_TRACE_DEBUG("ch mode = %x",aptx_config.channelMode); A2D_BldAptxInfo(AVDT_MEDIA_AUDIO,&aptx_config,¶m[1]); - } + + /* For aptxClassic BR = (Sampl_Rate * PCM_DEPTH * CHNL)/Compression_Ratio */ + bitrate = ((btif_media_cb.media_feeding.cfg.pcm.sampling_freq * 16 * 2)/4); + } else { + tA2D_APTX_HD_CIE* cI = 0; + cI = (tA2D_APTX_HD_CIE*) &ptr[BTA_AV_CFG_START_IDX]; + if (cI && cI->vendorId == A2D_APTX_HD_VENDOR_ID + && cI->codecId == A2D_APTX_HD_CODEC_ID_BLUETOOTH) + { + tA2D_APTX_HD_CIE aptxhd_config; + memset(&aptxhd_config,0,sizeof(tA2D_APTX_HD_CIE)); + aptxhd_config.vendorId = codecInfo->vendorId; + aptxhd_config.codecId = codecInfo->codecId; + aptxhd_config.sampleRate = codecInfo->sampleRate; + aptxhd_config.channelMode = codecInfo->channelMode; + BTIF_TRACE_DEBUG("vendor id = %x",aptxhd_config.vendorId); + BTIF_TRACE_DEBUG("codec id = %x",aptxhd_config.codecId); + BTIF_TRACE_DEBUG("sample rate = %x",aptxhd_config.sampleRate); + BTIF_TRACE_DEBUG("ch mode = %x",aptxhd_config.channelMode); + A2D_BldAptx_hdInfo(AVDT_MEDIA_AUDIO,&aptxhd_config,¶m[1]); + + /* For aptxHD BR = (Sampl_Rate * PCM_DEPTH * CHNL)/Compression_Ratio, + derived from classic */ + bitrate = ((btif_media_cb.media_feeding.cfg.pcm.sampling_freq * 16 * 2)/4); + } + } } - /* For aptxClassic BR = (Sampl_Rate * PCM_DEPTH * CHNL)/Compression_Ratio */ - bitrate = ((btif_media_cb.media_feeding.cfg.pcm.sampling_freq * 16 * 2)/4); } param[0] = btif_get_latest_playing_device_idx(); i = param[1] + 2; //LOSC @@ -1258,6 +1292,7 @@ static void btif_a2dp_encoder_update(void) tA2D_APTX_CIE* codecInfo = 0; APPL_TRACE_DEBUG("btif_a2dp_encoder_update"); + btif_media_cb.tx_enc_update_initiated = TRUE; UINT8 codectype = 0; codectype = bta_av_co_get_current_codec(); @@ -2129,9 +2164,11 @@ static void btif_media_thread_handle_cmd(fixed_queue_t *queue, UNUSED_ATTR void btif_media_cb.tx_stop_initiated = FALSE; btif_media_cb.vs_configs_exchanged = FALSE; btif_media_cb.tx_start_initiated = FALSE; + btif_media_cb.tx_enc_update_initiated = FALSE; break; case BTIF_MEDIA_START_VS_CMD: - if (!btif_media_cb.tx_started && !btif_media_cb.tx_start_initiated) + if (!btif_media_cb.tx_started + && (!btif_media_cb.tx_start_initiated || btif_media_cb.tx_enc_update_initiated)) { btif_a2dp_encoder_update(); btif_media_start_vendor_command(); @@ -2142,7 +2179,8 @@ static void btif_media_thread_handle_cmd(fixed_queue_t *queue, UNUSED_ATTR void case BTIF_MEDIA_STOP_VS_CMD: if (btif_media_cb.tx_started && !btif_media_cb.tx_stop_initiated) btif_media_send_vendor_stop(); - else if(btif_media_cb.tx_start_initiated && !btif_media_cb.tx_started) + else if((btif_media_cb.tx_start_initiated || btif_media_cb.tx_enc_update_initiated) + && !btif_media_cb.tx_started) { APPL_TRACE_IMP("Suspend Req when VSC exchange in progress,reset VSC"); btif_media_send_reset_vendor_state(); @@ -4351,17 +4389,21 @@ void btif_media_start_vendor_command() APPL_TRACE_IMP("btif_media_start_vendor_command_exchange:\ vs_configs_exchanged:%u", btif_media_cb.vs_configs_exchanged); btif_media_cb.tx_start_initiated = TRUE; + btif_media_cb.tx_enc_update_initiated = FALSE; if(btif_media_cb.vs_configs_exchanged) { btif_media_send_vendor_start(); } else { -#if 0 - btif_media_send_vendor_write_sbc_cfg(); -#else - btif_media_send_vendor_selected_codec(); -#endif + if (get_soc_type() == BT_SOC_SMD) + { + btif_media_send_vendor_write_sbc_cfg(); + } + else + { + btif_media_send_vendor_selected_codec(); + } } } diff --git a/btif/src/btif_sock_sdp.c b/btif/src/btif_sock_sdp.c index 35721e569..6980c7a3c 100644 --- a/btif/src/btif_sock_sdp.c +++ b/btif/src/btif_sock_sdp.c @@ -98,6 +98,7 @@ static const tBTA_OP_FMT bta_ops_obj_fmt[OBEX_PUSH_NUM_FORMATS] = { #define UUID_MAX_LENGTH 16 #define UUID_MATCHES(u1, u2) !memcmp(u1, u2, UUID_MAX_LENGTH) +#define SPP_PROFILE_VERSION 0x0102 // Adds a protocol list and service name (if provided) to an SDP record given by // |sdp_handle|, and marks it as browseable. This is a shortcut for defining a @@ -351,6 +352,11 @@ static int add_spp_sdp(const char *name, const int channel) { if (!SDP_AddServiceClassIdList(handle, 1, &service)) goto error; + // Add the FTP profile descriptor. + stage = "profile_descriptor_list"; + if (!SDP_AddProfileDescriptorList(handle, UUID_SERVCLASS_SERIAL_PORT, + SPP_PROFILE_VERSION)) + goto error; APPL_TRACE_DEBUG("add_spp_sdp: service registered successfully, " "service_name: %s, handle 0x%08x)", name, handle); diff --git a/btif/src/stack_manager.c b/btif/src/stack_manager.c index 288f69751..6a1e3897e 100644 --- a/btif/src/stack_manager.c +++ b/btif/src/stack_manager.c @@ -139,6 +139,7 @@ static void event_start_up_stack(UNUSED_ATTR void *context) { ensure_stack_is_initialized(); + init_vnd_Logger(); LOG_INFO(LOG_TAG, "%s is bringing up the stack", __func__); future_t *local_hack_future = future_new(); hack_future = local_hack_future; @@ -181,6 +182,7 @@ static void event_shut_down_stack(UNUSED_ATTR void *context) { hack_future = future_new(); btif_thread_post(event_signal_stack_down, NULL); future_await(hack_future); + clean_vnd_logger(); } static void ensure_stack_is_not_running(void) { @@ -200,8 +202,6 @@ static void event_clean_up_stack(void *context) { ensure_stack_is_not_running(); LOG_INFO(LOG_TAG, "%s is cleaning up the stack", __func__); - future_t *local_hack_future = future_new(); - hack_future = local_hack_future; stack_is_initialized = false; btif_cleanup_bluetooth(); diff --git a/device/include/interop.h b/device/include/interop.h index a0d9a06aa..8dfd3f74d 100644 --- a/device/include/interop.h +++ b/device/include/interop.h @@ -101,6 +101,10 @@ typedef enum { // to preferred conn params immediately post connection. Disable automatic switching to // preferred conn params for such devices and allow them to explicity ask for it. INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS, + + // Few remote devices do not understand AVRCP version greater than 1.3. For these + // devices, we would like to blacklist them and advertise AVRCP version as 1.3 + INTEROP_ADV_AVRCP_VER_1_3, } interop_feature_t; // Check if a given |addr| matches a known interoperability workaround as identified diff --git a/device/include/interop_database.h b/device/include/interop_database.h index 78f9e7581..c941d89b4 100644 --- a/device/include/interop_database.h +++ b/device/include/interop_database.h @@ -118,6 +118,13 @@ static const interop_addr_entry_t interop_addr_database[] = { // Dialog Keyboard and mouse {{{0x80, 0xea, 0xca, 0,0,0}}, 3, INTEROP_DISABLE_LE_SECURE_CONNECTIONS}, + // Marvel CK used in Mercedes C300/BMW 640i + // For a more specific black listing(e.g. just for Mercedes), both BD addr + // and device name has to be added for AVRCP 1.3 blacklisting + {{{0xa0, 0x56, 0xb2, 0,0,0}}, 3, INTEROP_ADV_AVRCP_VER_1_3}, + + // Mazda Atenza + {{{0x04, 0xf8, 0xc2, 0,0,0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME}, }; typedef struct { @@ -157,6 +164,7 @@ static const interop_name_entry_t interop_name_database[] = { // HID Moto KZ500 Keyboard - Problematic SDP digitizer descriptor {"Motorola Keyboard KZ500", 23, INTEROP_REMOVE_HID_DIG_DESCRIPTOR}, {"Motorola Keyboard KZ500 v122", 28, INTEROP_REMOVE_HID_DIG_DESCRIPTOR}, + {"MB Bluetooth", 12, INTEROP_ADV_AVRCP_VER_1_3}, }; typedef struct { diff --git a/device/src/controller.c b/device/src/controller.c index fad947e2c..c67af84b2 100644 --- a/device/src/controller.c +++ b/device/src/controller.c @@ -88,15 +88,22 @@ static bool secure_connections_supported; void send_soc_log_command(bool value) { int soc_type = get_soc_type(); - UINT8 param[5] = {0x10,0x03,0x00,0x00,0x01}; - if (!value) + UINT8 param[5] = {0x10, 0x03, 0x00, 0x00, 0x01}; + UINT8 param_cherokee[2] = {0x14, 0x01}; + if (!value) { // Disable SoC logging param[1] = 0x02; + param_cherokee[1] = 0x00; + } if (soc_type == BT_SOC_SMD) { LOG_INFO(LOG_TAG, "%s for BT_SOC_SMD.", __func__); - BTM_VendorSpecificCommand(HCI_VS_HOST_LOG_OPCODE,5,param,NULL); + BTM_VendorSpecificCommand(HCI_VS_HOST_LOG_OPCODE, 5, param, NULL); + } else if (soc_type == BT_SOC_CHEROKEE) { + LOG_INFO(LOG_TAG, "%s for BT_SOC_CHEROKEE.", __func__); + BTM_VendorSpecificCommand(HCI_VS_HOST_LOG_OPCODE, 2, param_cherokee, NULL); } + } static future_t *start_up(void) { diff --git a/device/src/interop.c b/device/src/interop.c index 59c3290da..49fb3252b 100644 --- a/device/src/interop.c +++ b/device/src/interop.c @@ -155,6 +155,7 @@ static const char* interop_feature_string_(const interop_feature_t feature) { CASE_RETURN_STR(INTEROP_DISABLE_SNIFF_DURING_SCO) CASE_RETURN_STR(INTEROP_INCREASE_AG_CONN_TIMEOUT) CASE_RETURN_STR(INTEROP_DISABLE_LE_CONN_PREFERRED_PARAMS) + CASE_RETURN_STR(INTEROP_ADV_AVRCP_VER_1_3) } return "UNKNOWN"; diff --git a/hci/Android.mk b/hci/Android.mk index 5e477326d..827bbdd28 100644 --- a/hci/Android.mk +++ b/hci/Android.mk @@ -37,6 +37,10 @@ ifeq ($(TARGET_BUILD_VARIANT),userdebug) LOCAL_CFLAGS += -DBTSNOOP_DEFAULT=TRUE endif +ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT))) +LOCAL_CFLAGS += -DENABLE_DBG_FLAGS +endif + LOCAL_CFLAGS += $(bluetooth_CFLAGS) LOCAL_CONLYFLAGS += $(bluetooth_CONLYFLAGS) LOCAL_CPPFLAGS += $(bluetooth_CPPFLAGS) diff --git a/hci/src/btsnoop.c b/hci/src/btsnoop.c index edffa2022..a6a532d3c 100644 --- a/hci/src/btsnoop.c +++ b/hci/src/btsnoop.c @@ -93,11 +93,9 @@ static future_t *start_up(void) { module_started = true; stack_config->get_btsnoop_ext_options(&hci_ext_dump_enabled, &btsnoop_conf_from_file); -#if (BTSNOOP_DEFAULT == TRUE) if (btsnoop_conf_from_file == false) { hci_ext_dump_enabled = true; } -#endif update_logging(); return NULL; @@ -106,7 +104,7 @@ static future_t *start_up(void) { static future_t *shut_down(void) { module_started = false; if (hci_ext_dump_enabled == true) { - property_set("bluetooth.startbtsnoop", "false"); + STOP_SNOOP_LOGGING(); } update_logging(); @@ -194,7 +192,7 @@ static void update_logging() { btsnoop_net_open(); if (hci_ext_dump_enabled == true) { - property_set("bluetooth.startbtsnoop", "true"); + START_SNOOP_LOGGING(); } const char *log_path = stack_config->get_btsnoop_log_path(); diff --git a/hci/src/hci_hal_h4.c b/hci/src/hci_hal_h4.c index 78674f1c5..d0483f06f 100644 --- a/hci/src/hci_hal_h4.c +++ b/hci/src/hci_hal_h4.c @@ -157,10 +157,11 @@ static size_t read_data(serial_data_type_t type, uint8_t *buffer, size_t max_siz } static void packet_finished(serial_data_type_t type) { - if (!stream_has_interpretation) + if (!stream_has_interpretation) { LOG_ERROR(LOG_TAG, "%s with no existing stream interpretation.", __func__); - else if (current_data_type != type) + } else if (current_data_type != type) { LOG_ERROR(LOG_TAG, "%s with different type than existing interpretation.", __func__); + } #if (defined(REMOVE_EAGER_THREADS) && (REMOVE_EAGER_THREADS == TRUE)) if (uart_stream->rd_ptr == uart_stream->wr_ptr) { diff --git a/hci/src/hci_layer.c b/hci/src/hci_layer.c index 52170159b..bc49172ee 100644 --- a/hci/src/hci_layer.c +++ b/hci/src/hci_layer.c @@ -127,7 +127,6 @@ static const uint32_t EPILOG_TIMEOUT_MS = 3000; static const uint32_t COMMAND_PENDING_TIMEOUT_MS = 8000; extern int soc_type; -static uint32_t HARDWARE_ERROR_TIMEOUT_MS = 2000; // Our interface static bool interface_created; @@ -640,18 +639,23 @@ static void command_timed_out(UNUSED_ATTR void *context) { if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE) { char value[PROPERTY_VALUE_MAX] = {0}; - if( property_get("wc_transport.force_special_byte", value, "false") && !strcmp(value,"true")) { + uint32_t hardware_error_timeout_ms = 2000; + bool enabled = false; +#ifdef ENABLE_DBG_FLAGS + enabled = true; +#endif + if (property_get("wc_transport.force_special_byte", value, NULL)) + enabled = (strcmp(value, "false") == 0) ? false : true; + if (enabled) { hardware_error_timer = alarm_new("hci.hardware_error_timer"); if (!hardware_error_timer) { LOG_ERROR("%s unable to create hardware error timer.", __func__); usleep(2000000); kill(getpid(), SIGKILL); } - if(soc_type == BT_SOC_ROME) - HARDWARE_ERROR_TIMEOUT_MS = 2000000; - else if(soc_type == BT_SOC_CHEROKEE) - HARDWARE_ERROR_TIMEOUT_MS = 5000000; - alarm_set(hardware_error_timer, HARDWARE_ERROR_TIMEOUT_MS, hardware_error_timer_expired, NULL); + if(soc_type == BT_SOC_CHEROKEE) + hardware_error_timeout_ms = 5000; + alarm_set(hardware_error_timer, hardware_error_timeout_ms, hardware_error_timer_expired, NULL); return; } } @@ -847,9 +851,9 @@ static bool filter_incoming_event(BT_HDR *packet) { // If a command generates a command status event, it won't be getting a command complete event wait_entry = get_waiting_command(opcode); - if (!wait_entry) + if (!wait_entry) { LOG_WARN(LOG_TAG, "%s command status event with no matching command. opcode: 0x%x", __func__, opcode); - else if (wait_entry->status_callback) + } else if (wait_entry->status_callback) wait_entry->status_callback(status, wait_entry->command, wait_entry->context); goto intercepted; @@ -888,7 +892,6 @@ void ssr_cleanup (int reason) { } if (vendor != NULL) { vendor->ssr_cleanup(reason); - hal->close(); //clean up the UART stream } else { LOG_ERROR("%s: vendor is NULL", __func__); } diff --git a/hci/src/low_power_manager.c b/hci/src/low_power_manager.c index 4ed12d0ed..a79836fcb 100644 --- a/hci/src/low_power_manager.c +++ b/hci/src/low_power_manager.c @@ -137,15 +137,17 @@ static void transmit_done() { static void enable(bool enable) { if (state == LPM_DISABLING) { - if (enable) + if (enable) { LOG_ERROR(LOG_TAG, "%s still processing prior disable request, cannot enable.", __func__); - else + } else { LOG_WARN(LOG_TAG, "%s still processing prior disable request, ignoring new request to disable.", __func__); + } } else if (state == LPM_ENABLING) { - if (enable) + if (enable) { LOG_ERROR(LOG_TAG, "%s still processing prior enable request, ignoring new request to enable.", __func__); - else + } else { LOG_WARN(LOG_TAG, "%s still processing prior enable request, cannot disable.", __func__); + } } else if (state == LPM_ENABLED && enable) { LOG_INFO(LOG_TAG, "%s already enabled.", __func__); } else if (state == LPM_DISABLED && !enable) { diff --git a/include/bt_logger_lib.h b/include/bt_logger_lib.h new file mode 100644 index 000000000..30467af6e --- /dev/null +++ b/include/bt_logger_lib.h @@ -0,0 +1,78 @@ +/********************************************************************* +* +* Copyright (c) 2016, The Linux Foundation. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions +* are met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +************************************************************************/ + +#include +#include + +/** + * Commands + */ +typedef enum { + VENDOR_LOGGER_LOGS = 201, // Signifies Packet containing Logger Log + GENERATE_VND_LOG_SIGNAL, // Signifies command to generate logs + START_SNOOP_SIGNAL, + STOP_SNOOP_SIGNAL, + STOP_LOGGING_SIGNAL, +} CommandTypes; + +void init_vnd_Logger(void); +void clean_vnd_logger(void); + +typedef struct { + /** Set to sizeof(bt_vndor_interface_t) */ + size_t size; + + /* + * Functions need to be implemented in Logger libray (libbt-logClient.so). + */ + + /* + * Initialize logging by conneting client socket + * to Logger process + */ + int (*init)(void); + + /** Sending Logs of Logger process */ + void (*send_log_msg)(const char *tag, const char *fmt_str, va_list ap); + void (*send_log_data)(const char *tag, const char *fmt_str, ...); + + /** Sending Logs of Logger process */ + void (*send_event)(char evt); + + /** Closes the socket connection to logger process */ + int (*cleanup)(void); + +} bt_logger_interface_t; + +#define GENERATE_VND_LOGS() if(logger_interface)logger_interface->send_event(GENERATE_VND_LOG_SIGNAL) +#define START_SNOOP_LOGGING() if(logger_interface)logger_interface->send_event(START_SNOOP_SIGNAL) +#define STOP_SNOOP_LOGGING() if(logger_interface)logger_interface->send_event(STOP_SNOOP_SIGNAL) diff --git a/include/bt_target.h b/include/bt_target.h index 158f9a562..5abcd8d80 100644 --- a/include/bt_target.h +++ b/include/bt_target.h @@ -575,18 +575,18 @@ ** ******************************************************************************/ -/* The maximum number of simultaneous links that L2CAP can support. */ -#ifndef MAX_ACL_CONNECTIONS -#define MAX_L2CAP_LINKS 7 -#else -#define MAX_L2CAP_LINKS MAX_ACL_CONNECTIONS -#endif - /* The maximum number of simultaneous channels that L2CAP can support. */ #ifndef MAX_L2CAP_CHANNELS #define MAX_L2CAP_CHANNELS 16 #endif +/* The maximum number of simultaneous links that L2CAP can support. */ +#ifndef MAX_L2CAP_CHANNELS +#define MAX_L2CAP_LINKS 7 +#else +#define MAX_L2CAP_LINKS MAX_L2CAP_CHANNELS +#endif + /* The maximum number of simultaneous applications that can register with L2CAP. */ #ifndef MAX_L2CAP_CLIENTS #define MAX_L2CAP_CLIENTS 15 @@ -825,7 +825,11 @@ #endif #ifndef GATT_MAX_PHY_CHANNEL +#ifndef MAX_L2CAP_CHANNELS #define GATT_MAX_PHY_CHANNEL 7 +#else +#define GATT_MAX_PHY_CHANNEL MAX_L2CAP_CHANNELS +#endif #endif /* Used for conformance testing ONLY */ @@ -1393,7 +1397,11 @@ #endif #ifndef HID_HOST_MAX_DEVICES +#ifndef MAX_L2CAP_CHANNELS #define HID_HOST_MAX_DEVICES 7 +#else +#define HID_HOST_MAX_DEVICES MAX_L2CAP_CHANNELS +#endif #endif #ifndef HID_HOST_MTU diff --git a/include/bt_trace.h b/include/bt_trace.h index aa93c932b..6e5429977 100644 --- a/include/bt_trace.h +++ b/include/bt_trace.h @@ -222,153 +222,155 @@ extern void BTA_setStackLog( const char* log_layer, int log_level); #define BT_TRACE(l,t,...) LogMsg((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)), ##__VA_ARGS__) #define BT_ERROR_TRACE(l,...) LogMsg(TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | TRACE_TYPE_ERROR, ##__VA_ARGS__) +#define VND_TRACE(l,t,...) vnd_LogMsg((TRACE_CTRL_GENERAL | (l) | TRACE_ORG_STACK | (t)), ##__VA_ARGS__) + /* Define tracing for the HCI unit */ -#define HCI_TRACE_ERROR(...) {if (btu_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define HCI_TRACE_WARNING(...) {if (btu_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define HCI_TRACE_EVENT(...) {if (btu_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define HCI_TRACE_DEBUG(...) {if (btu_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define HCI_TRACE_ERROR(...) {if (btu_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define HCI_TRACE_WARNING(...) {if (btu_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define HCI_TRACE_EVENT(...) {if (btu_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define HCI_TRACE_DEBUG(...) {if (btu_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HCI, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* Define tracing for BTM */ -#define BTM_TRACE_ERROR(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define BTM_TRACE_WARNING(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define BTM_TRACE_API(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_API, ##__VA_ARGS__);} -#define BTM_TRACE_EVENT(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define BTM_TRACE_DEBUG(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define BTM_TRACE_ERROR(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define BTM_TRACE_WARNING(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define BTM_TRACE_API(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_API, ##__VA_ARGS__);} +#define BTM_TRACE_EVENT(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define BTM_TRACE_DEBUG(...) {if (btm_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BTM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* Define tracing for the L2CAP unit */ -#define L2CAP_TRACE_ERROR(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define L2CAP_TRACE_WARNING(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define L2CAP_TRACE_API(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_API, ##__VA_ARGS__);} -#define L2CAP_TRACE_EVENT(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define L2CAP_TRACE_DEBUG(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define L2CAP_TRACE_ERROR(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define L2CAP_TRACE_WARNING(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define L2CAP_TRACE_API(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define L2CAP_TRACE_EVENT(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define L2CAP_TRACE_DEBUG(...) {if (l2cb.l2cap_trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_L2CAP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* Define tracing for the SDP unit */ -#define SDP_TRACE_ERROR(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define SDP_TRACE_WARNING(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define SDP_TRACE_API(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_API, ##__VA_ARGS__);} -#define SDP_TRACE_EVENT(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define SDP_TRACE_DEBUG(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define SDP_TRACE_ERROR(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define SDP_TRACE_WARNING(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define SDP_TRACE_API(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define SDP_TRACE_EVENT(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define SDP_TRACE_DEBUG(...) {if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SDP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* Define tracing for the RFCOMM unit */ -#define RFCOMM_TRACE_ERROR(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define RFCOMM_TRACE_WARNING(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define RFCOMM_TRACE_API(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, ##__VA_ARGS__);} -#define RFCOMM_TRACE_EVENT(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define RFCOMM_TRACE_DEBUG(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define RFCOMM_TRACE_ERROR(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define RFCOMM_TRACE_WARNING(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define RFCOMM_TRACE_API(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_API, ##__VA_ARGS__);} +#define RFCOMM_TRACE_EVENT(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define RFCOMM_TRACE_DEBUG(...) {if (rfc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_RFCOMM, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* Generic Access Profile traces */ -#define GAP_TRACE_ERROR(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define GAP_TRACE_EVENT(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define GAP_TRACE_API(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_API, ##__VA_ARGS__);} -#define GAP_TRACE_WARNING(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define GAP_TRACE_ERROR(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define GAP_TRACE_EVENT(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define GAP_TRACE_API(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define GAP_TRACE_WARNING(...) {if (gap_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_GAP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} /* define traces for HID Host */ -#define HIDH_TRACE_ERROR(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define HIDH_TRACE_WARNING(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define HIDH_TRACE_API(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_API, ##__VA_ARGS__);} -#define HIDH_TRACE_EVENT(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define HIDH_TRACE_DEBUG(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define HIDH_TRACE_ERROR(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HID, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define HIDH_TRACE_WARNING(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HID, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define HIDH_TRACE_API(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HID, TRACE_TYPE_API, ##__VA_ARGS__);} +#define HIDH_TRACE_EVENT(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HID, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define HIDH_TRACE_DEBUG(...) {if (hh_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_HID, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* define traces for BNEP */ -#define BNEP_TRACE_ERROR(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define BNEP_TRACE_WARNING(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define BNEP_TRACE_API(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_API, ##__VA_ARGS__);} -#define BNEP_TRACE_EVENT(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define BNEP_TRACE_DEBUG(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define BNEP_TRACE_ERROR(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define BNEP_TRACE_WARNING(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define BNEP_TRACE_API(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define BNEP_TRACE_EVENT(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define BNEP_TRACE_DEBUG(...) {if (bnep_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_BNEP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* define traces for PAN */ -#define PAN_TRACE_ERROR(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define PAN_TRACE_WARNING(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define PAN_TRACE_API(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_API, ##__VA_ARGS__);} -#define PAN_TRACE_EVENT(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define PAN_TRACE_DEBUG(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define PAN_TRACE_ERROR(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define PAN_TRACE_WARNING(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define PAN_TRACE_API(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_API, ##__VA_ARGS__);} +#define PAN_TRACE_EVENT(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define PAN_TRACE_DEBUG(...) {if (pan_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_PAN, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* Define tracing for the A2DP profile */ -#define A2D_TRACE_ERROR(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,##__VA_ARGS__);} -#define A2D_TRACE_WARNING(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,##__VA_ARGS__);} -#define A2D_TRACE_EVENT(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,##__VA_ARGS__);} -#define A2D_TRACE_DEBUG(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,##__VA_ARGS__);} -#define A2D_TRACE_API(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_API,##__VA_ARGS__);} +#define A2D_TRACE_ERROR(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_ERROR,##__VA_ARGS__);} +#define A2D_TRACE_WARNING(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_WARNING,##__VA_ARGS__);} +#define A2D_TRACE_EVENT(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_EVENT,##__VA_ARGS__);} +#define A2D_TRACE_DEBUG(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_DEBUG,##__VA_ARGS__);} +#define A2D_TRACE_API(...) {if (a2d_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_API,##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_A2D, TRACE_TYPE_API,##__VA_ARGS__);} /* AVDTP */ -#define AVDT_TRACE_ERROR(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define AVDT_TRACE_WARNING(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define AVDT_TRACE_EVENT(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define AVDT_TRACE_DEBUG(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} -#define AVDT_TRACE_API(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define AVDT_TRACE_ERROR(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define AVDT_TRACE_WARNING(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define AVDT_TRACE_EVENT(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define AVDT_TRACE_DEBUG(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define AVDT_TRACE_API(...) {if (avdt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);} /* Define tracing for the AVCTP protocol */ -#define AVCT_TRACE_ERROR(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define AVCT_TRACE_WARNING(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define AVCT_TRACE_EVENT(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define AVCT_TRACE_DEBUG(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} -#define AVCT_TRACE_API(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define AVCT_TRACE_ERROR(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define AVCT_TRACE_WARNING(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define AVCT_TRACE_EVENT(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define AVCT_TRACE_DEBUG(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define AVCT_TRACE_API(...) {if (avct_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);} /* Define tracing for the AVRCP profile */ -#define AVRC_TRACE_ERROR(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define AVRC_TRACE_WARNING(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define AVRC_TRACE_EVENT(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define AVRC_TRACE_DEBUG(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} -#define AVRC_TRACE_API(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define AVRC_TRACE_ERROR(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define AVRC_TRACE_WARNING(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define AVRC_TRACE_EVENT(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define AVRC_TRACE_DEBUG(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define AVRC_TRACE_API(...) {if (avrc_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_AVP, TRACE_TYPE_API, ##__VA_ARGS__);} /* MCAP */ -#define MCA_TRACE_ERROR(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define MCA_TRACE_WARNING(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define MCA_TRACE_EVENT(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define MCA_TRACE_DEBUG(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} -#define MCA_TRACE_API(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_API, ##__VA_ARGS__);} +#define MCA_TRACE_ERROR(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define MCA_TRACE_WARNING(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define MCA_TRACE_EVENT(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define MCA_TRACE_DEBUG(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define MCA_TRACE_API(...) {if (mca_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_MCA, TRACE_TYPE_API, ##__VA_ARGS__);} /* Define tracing for the ATT/GATT unit */ -#define GATT_TRACE_ERROR(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define GATT_TRACE_WARNING(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define GATT_TRACE_API(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_API, ##__VA_ARGS__);} -#define GATT_TRACE_EVENT(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define GATT_TRACE_DEBUG(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define GATT_TRACE_ERROR(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define GATT_TRACE_WARNING(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define GATT_TRACE_API(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_API, ##__VA_ARGS__);} +#define GATT_TRACE_EVENT(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define GATT_TRACE_DEBUG(...) {if (gatt_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_ATT, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* Define tracing for the SMP unit */ -#define SMP_TRACE_ERROR(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define SMP_TRACE_WARNING(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define SMP_TRACE_API(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_API, ##__VA_ARGS__);} -#define SMP_TRACE_EVENT(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define SMP_TRACE_DEBUG(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define SMP_TRACE_ERROR(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_ERROR) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define SMP_TRACE_WARNING(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_WARNING) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define SMP_TRACE_API(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_API) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_API, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_API, ##__VA_ARGS__);} +#define SMP_TRACE_EVENT(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_EVENT) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define SMP_TRACE_DEBUG(...) {if (smp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) BT_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, ##__VA_ARGS__); else VND_TRACE(TRACE_LAYER_SMP, TRACE_TYPE_DEBUG, ##__VA_ARGS__);} extern UINT8 btif_trace_level; extern UINT8 audio_latency_trace_level; /* define traces for application */ #define BTIF_TRACE_IMP(...) {LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} -#define BTIF_TRACE_ERROR(...) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define BTIF_TRACE_WARNING(...) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define BTIF_TRACE_API(...) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);} -#define BTIF_TRACE_EVENT(...) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define BTIF_TRACE_DEBUG(...) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define BTIF_TRACE_ERROR(...) {if (btif_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define BTIF_TRACE_WARNING(...) {if (btif_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__);} +#define BTIF_TRACE_API(...) {if (btif_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);} +#define BTIF_TRACE_EVENT(...) {if (btif_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define BTIF_TRACE_DEBUG(...) {if (btif_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} #define BTIF_TRACE_VERBOSE(...) {if (btif_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} /* define traces for application */ #define APPL_TRACE_IMP(...) {LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} -#define APPL_TRACE_ERROR(...) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);} -#define APPL_TRACE_WARNING(...) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__);} -#define APPL_TRACE_API(...) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);} -#define APPL_TRACE_EVENT(...) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);} -#define APPL_TRACE_DEBUG(...) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} +#define APPL_TRACE_ERROR(...) {if (appl_trace_level >= BT_TRACE_LEVEL_ERROR) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define APPL_TRACE_WARNING(...) {if (appl_trace_level >= BT_TRACE_LEVEL_WARNING) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_WARNING, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_ERROR, ##__VA_ARGS__);} +#define APPL_TRACE_API(...) {if (appl_trace_level >= BT_TRACE_LEVEL_API) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_API, ##__VA_ARGS__);} +#define APPL_TRACE_EVENT(...) {if (appl_trace_level >= BT_TRACE_LEVEL_EVENT) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_EVENT, ##__VA_ARGS__);} +#define APPL_TRACE_DEBUG(...) {if (appl_trace_level >= BT_TRACE_LEVEL_DEBUG) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__); else vnd_LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} #define APPL_TRACE_VERBOSE(...) {if (appl_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} #define APPL_TRACE_LATENCY_AUDIO(...) {if (audio_latency_trace_level >= BT_TRACE_LEVEL_VERBOSE) LogMsg(TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | TRACE_TYPE_DEBUG, ##__VA_ARGS__);} @@ -421,3 +423,4 @@ typedef struct { extern UINT8 appl_trace_level; void LogMsg (UINT32 trace_set_mask, const char *fmt_str, ...); +void vnd_LogMsg (UINT32 trace_set_mask, const char *fmt_str, ...); diff --git a/main/Android.mk b/main/Android.mk index 2286997e8..4ee80deba 100644 --- a/main/Android.mk +++ b/main/Android.mk @@ -26,6 +26,11 @@ LOCAL_SRC_FILES+= \ LOCAL_SRC_FILES+= \ ../udrv/ulinux/uipc.c +ifeq ($(BOARD_USES_WIPOWER),true) +LOCAL_SRC_FILES += \ + ../../../vendor/qcom/opensource/bluetooth/wipower-host/core/src/wipower.c +endif + LOCAL_C_INCLUDES+= . \ $(LOCAL_PATH)/../ \ $(LOCAL_PATH)/../bta/include \ @@ -56,6 +61,12 @@ LOCAL_C_INCLUDES+= . \ external/zlib \ $(call include-path-for, audio-utils) +ifeq ($(BOARD_USES_WIPOWER),true) +LOCAL_C_INCLUDES+= \ + vendor/qcom/opensource/bluetooth/hal/include \ + vendor/qcom/opensource/bluetooth/wipower-host/core/include +endif + LOCAL_SHARED_LIBRARIES := \ libcutils \ libdl \ diff --git a/main/bte_logmsg.c b/main/bte_logmsg.c index ca103574c..a4c3fd73b 100644 --- a/main/bte_logmsg.c +++ b/main/bte_logmsg.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "avrc_api.h" #include "bta_api.h" @@ -66,6 +67,10 @@ #define BTE_LOG_BUF_SIZE 1024 #endif +#define VND_PKT_SIZE_BLOCKS 4 +#define VND_PKT_HEADER_SIZE 5 //(VND_PKT_SIZE_BLOCKS + 1) +#define VND_PKT_BODY_SIZE 1021 + #define BTE_LOG_MAX_SIZE (BTE_LOG_BUF_SIZE - 12) #define MSG_BUFFER_OFFSET 0 @@ -198,6 +203,21 @@ void LogMsg(uint32_t trace_set_mask, const char *fmt_str, ...) { } } +void vnd_LogMsg(uint32_t trace_set_mask, const char *fmt_str, ...) { + int trace_layer = TRACE_GET_LAYER(trace_set_mask); + const char *tag; + if (trace_layer >= TRACE_LAYER_MAX_NUM) + trace_layer = 0; + + tag = bt_layer_tags[trace_layer]; + + va_list ap; + va_start(ap, fmt_str); + if(logger_interface) + logger_interface->send_log_msg(tag, fmt_str, ap); + va_end(ap); +} + /* this function should go into BTAPP_DM for example */ static uint8_t BTAPP_SetTraceLevel(uint8_t new_level) { if (new_level != 0xFF) diff --git a/osi/Android.mk b/osi/Android.mk index 4d372ec60..c9c327f3b 100644 --- a/osi/Android.mk +++ b/osi/Android.mk @@ -51,7 +51,8 @@ btosiCommonSrc := \ ./src/socket_utils/socket_local_server.c \ ./src/thread.c \ ./src/time.c \ - ./src/wakelock.c + ./src/wakelock.c \ + ./src/vnd_log.c btosiCommonTestSrc := \ ./test/AlarmTestHarness.cpp \ diff --git a/osi/include/log.h b/osi/include/log.h index 738462e74..a579ded8b 100644 --- a/osi/include/log.h +++ b/osi/include/log.h @@ -17,6 +17,12 @@ ******************************************************************************/ #pragma once +#include +#include +#include "include/bt_logger_lib.h" + +extern bt_logger_interface_t *logger_interface; +extern bool bt_logger_enabled; /* * TODO(armansito): Work-around until we figure out a way to generate logs in a @@ -39,14 +45,16 @@ #include +//#define VNDLOG(tag, fmt, ## args) if(logger_interface)logger_interface->send_log_data(tag, fmt, ## args) + #if LOG_NDEBUG #define LOG_VERBOSE(...) ((void)0) #else // LOG_NDEBUG #define LOG_VERBOSE(tag, fmt, args...) ALOG(LOG_VERBOSE, tag, fmt, ## args) #endif // !LOG_NDEBUG -#define LOG_DEBUG(tag, fmt, args...) ALOG(LOG_DEBUG, tag, fmt, ## args ) -#define LOG_INFO(tag, fmt, args...) ALOG(LOG_INFO, tag, fmt, ## args) -#define LOG_WARN(tag, fmt, args...) ALOG(LOG_WARN, tag, fmt, ## args) -#define LOG_ERROR(tag, fmt, args...) ALOG(LOG_ERROR, tag, fmt, ## args) +#define LOG_DEBUG(tag, fmt, args...) {if(logger_interface)logger_interface->send_log_data(tag, fmt, ## args);ALOG(LOG_DEBUG, tag, fmt, ## args);} +#define LOG_INFO(tag, fmt, args...) {if(logger_interface)logger_interface->send_log_data(tag, fmt, ## args);ALOG(LOG_INFO, tag, fmt, ## args);} +#define LOG_WARN(tag, fmt, args...) {if(logger_interface)logger_interface->send_log_data(tag, fmt, ## args);ALOG(LOG_WARN, tag, fmt, ## args);} +#define LOG_ERROR(tag, fmt, args...) {if(logger_interface)logger_interface->send_log_data(tag, fmt, ## args);ALOG(LOG_ERROR, tag, fmt, ## args);} #endif /* defined(OS_GENERIC) */ diff --git a/osi/src/eager_reader.c b/osi/src/eager_reader.c index 07a944cad..86fcecce7 100644 --- a/osi/src/eager_reader.c +++ b/osi/src/eager_reader.c @@ -259,9 +259,9 @@ static void inbound_data_waiting(void *context) { // the semaphore by the number of bytes we just read eventfd_write(reader->bytes_available_fd, bytes_read); } else { - if (bytes_read == 0) + if (bytes_read == 0){ LOG_WARN(LOG_TAG, "%s fd said bytes existed, but none were found.", __func__); - else + } else LOG_WARN(LOG_TAG, "%s unable to read from file descriptor: %s", __func__, strerror(errno)); reader->allocator->free(buffer); diff --git a/osi/src/vnd_log.c b/osi/src/vnd_log.c new file mode 100644 index 000000000..aeb1d40f0 --- /dev/null +++ b/osi/src/vnd_log.c @@ -0,0 +1,82 @@ +/****************************************************************************** +Copyright (c) 2016, The Linux Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of The Linux Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +******************************************************************************/ + +#define LOG_TAG "bt_vnd_log" + +#include +#include +#include +#include "osi/include/log.h" +#include "osi/include/osi.h" + +static const char *LOGGER_LIBRARY_NAME = "libbt-logClient.so"; +static const char *LOGGER_LIBRARY_SYMBOL_NAME = "BLUETOOTH_LOGGER_LIB_INTERFACE"; + +static void *lib_handle; +bt_logger_interface_t *logger_interface; +bool bt_logger_enabled = false; + +void init_vnd_Logger(void) +{ + if(!bt_logger_enabled) + { + LOG_ERROR(LOG_TAG, "%s, Logger Not enabled from config file", __func__); + return; + } + + lib_handle = dlopen(LOGGER_LIBRARY_NAME, RTLD_NOW); + + if (!lib_handle) { + LOG_ERROR(LOG_TAG, "%s unable to open %s: %s", __func__, LOGGER_LIBRARY_NAME, dlerror()); + return; + } + + logger_interface = (bt_logger_interface_t *)dlsym(lib_handle, LOGGER_LIBRARY_SYMBOL_NAME); + if (!logger_interface) { + LOG_ERROR(LOG_TAG, "%s unable to find symbol %s in %s: %s", __func__, LOGGER_LIBRARY_SYMBOL_NAME, LOGGER_LIBRARY_NAME, dlerror()); + return; + } + + logger_interface->init(); +} + +void clean_vnd_logger() +{ + if(!bt_logger_enabled) + return; + + if(logger_interface) + logger_interface->cleanup(); + + if(lib_handle) + dlclose(lib_handle); + + logger_interface = NULL; + lib_handle = NULL; +} diff --git a/service/gatt_server_old.cpp b/service/gatt_server_old.cpp index f775be960..9c535d0bc 100644 --- a/service/gatt_server_old.cpp +++ b/service/gatt_server_old.cpp @@ -44,6 +44,8 @@ extern "C" { #include "osi/include/osi.h" } // extern "C" +bt_logger_interface_t *logger_interface = NULL; + namespace { const size_t kMaxGattAttributeSize = 512; diff --git a/stack/avct/avct_api.c b/stack/avct/avct_api.c index 382622137..df5615d52 100644 --- a/stack/avct/avct_api.c +++ b/stack/avct/avct_api.c @@ -499,6 +499,29 @@ UINT16 AVCT_MsgReq(UINT8 handle, UINT8 label, UINT8 cr, BT_HDR *p_msg) return result; } +/******************************************************************************* +** +** Function AVCT_CheckIncomingConn +** +** Description Check for incoming connection in progress +** +** Return TRUE if incoming connection in progress, FALSE otherwise +******************************************************************************/ +BOOLEAN AVCT_CheckIncomingConn(BD_ADDR peer_addr) +{ + tAVCT_LCB *p_lcb; + + p_lcb = avct_lcb_by_bd(peer_addr); + if (p_lcb != NULL) + { + if (p_lcb->ch_state != AVCT_CH_IDLE) + { + AVCT_TRACE_ERROR("%s: Incoming AVCT connection in progress",__func__); + return TRUE; + } + } + return FALSE; +} /****************************************************************************** ** ** Function AVCT_SetTraceLevel diff --git a/stack/avct/avct_l2c.c b/stack/avct/avct_l2c.c index 231039013..4ae2f65e2 100644 --- a/stack/avct/avct_l2c.c +++ b/stack/avct/avct_l2c.c @@ -556,6 +556,11 @@ void avct_l2c_config_ind_cback(UINT16 lcid, tL2CAP_CFG_INFO *p_cfg) } AVCT_TRACE_DEBUG("ch_state cfi: %d ", p_lcb->ch_state); } + else + { + AVCT_TRACE_ERROR("%s: p_lcb is null",__func__); + L2CA_DisconnectReq(lcid); + } } #if (AVCT_BROWSE_INCLUDED == TRUE) diff --git a/stack/avrc/avrc_api.c b/stack/avrc/avrc_api.c index ade3b855a..f35b8fa26 100644 --- a/stack/avrc/avrc_api.c +++ b/stack/avrc/avrc_api.c @@ -1182,3 +1182,15 @@ UINT16 AVRC_PassRsp(UINT8 handle, UINT8 label, tAVRC_MSG_PASS *p_msg) return AVRC_NO_RESOURCES; } +/****************************************************************************** +** +** Function AVRC_CheckIncomfingConn +** +** Description Check for incoming connection in progress +** +** Returns TRUE if incoming ocnnection in progress, FALSE otherwise +******************************************************************************/ +BOOLEAN AVRC_CheckIncomingConn(BD_ADDR peer_addr) +{ + return AVCT_CheckIncomingConn(peer_addr); +} diff --git a/stack/btm/btm_acl.c b/stack/btm/btm_acl.c index 0ca7d6709..a0e12b338 100644 --- a/stack/btm/btm_acl.c +++ b/stack/btm/btm_acl.c @@ -63,6 +63,7 @@ static const UINT8 btm_role_switch_black_list_prefix1[][3] = {{0x00, 0x0d, 0xfd} ,{0x00, 0x1b, 0xdc} /* BSHSBE20 */ ,{0x00, 0x07, 0x04} /* Infiniti G37 2011 */ ,{0xa4, 0x15, 0x66} /* Motorola Whisper */ + ,{0x00, 0x54, 0xaf} /* Jeep Uconnect */ }; /* Black listed car kits/headsets for outgoing role switch */ static const UINT8 btm_role_switch_black_list_prefix2[][3] = {{0xfc, 0xc2, 0xde} /* Toyota Prius 2015 */ @@ -71,6 +72,7 @@ static const UINT8 btm_role_switch_black_list_prefix2[][3] = {{0xfc, 0xc2, 0xde} ,{0x00, 0x23, 0x01} /* Roman R9020 */ ,{0x00, 0x26, 0xb4} /* NAC FORD,2013 Lincoln */ ,{0x1c, 0x48, 0xf9} /* Jabra Storm */ + ,{0x00, 0x54, 0xaf} /* Jeep Uconnect */ }; /******************************************************************************* diff --git a/stack/btm/btm_ble_multi_adv.c b/stack/btm/btm_ble_multi_adv.c index e7d5efc7c..53b192d3b 100644 --- a/stack/btm/btm_ble_multi_adv.c +++ b/stack/btm/btm_ble_multi_adv.c @@ -43,6 +43,12 @@ #define BTM_BLE_MULTI_ADV_CB_EVT_MASK 0xF0 #define BTM_BLE_MULTI_ADV_SUBCODE_MASK 0x0F +#ifdef WIPOWER_SUPPORTED +#define WIPOWER_16_UUID_LSB 0xFE +#define WIPOWER_16_UUID_MSB 0xFF +static bool is_wipower_adv = false; +#endif + /************************************************************************************ ** Static variables ************************************************************************************/ @@ -50,6 +56,10 @@ tBTM_BLE_MULTI_ADV_CB btm_multi_adv_cb; tBTM_BLE_MULTI_ADV_INST_IDX_Q btm_multi_adv_idx_q; pthread_mutex_t btm_multi_adv_lock = PTHREAD_MUTEX_INITIALIZER; +#ifdef WIPOWER_SUPPORTED +UINT8 wipower_inst_id = BTM_BLE_MULTI_ADV_DEFAULT_STD; +#endif + /************************************************************************************ ** Externs ************************************************************************************/ @@ -714,6 +724,13 @@ tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, btm_ble_build_adv_data(&data_mask, &pp, p_data); *p_len = (UINT8)(pp - param - 2); UINT8_TO_STREAM(pp_temp, inst_id); +#ifdef WIPOWER_SUPPORTED + if (param[7] == WIPOWER_16_UUID_LSB && param[8] == WIPOWER_16_UUID_MSB) + { + is_wipower_adv = true; + wipower_inst_id = inst_id; + } +#endif if ((rt = BTM_VendorSpecificCommand (HCI_BLE_MULTI_ADV_OCF, (UINT8)BTM_BLE_MULTI_ADV_WRITE_DATA_LEN, @@ -807,7 +824,13 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p) adv_inst != BTM_BLE_MULTI_ADV_DEFAULT_STD) { BTM_TRACE_EVENT("btm_ble_multi_adv_reenable called"); - btm_ble_multi_adv_reenable(adv_inst); +#ifdef WIPOWER_SUPPORTED + if (!(is_wipower_adv && (adv_inst == wipower_inst_id))) { + btm_ble_multi_adv_reenable(adv_inst); + } +#else + btm_ble_multi_adv_reenable(adv_inst); +#endif } /* re-enable connectibility */ else if (adv_inst == BTM_BLE_MULTI_ADV_DEFAULT_STD) @@ -874,6 +897,11 @@ void btm_ble_multi_adv_init() *******************************************************************************/ void btm_ble_multi_adv_cleanup(void) { +#ifdef WIPOWER_SUPPORTED + is_wipower_adv = false; + wipower_inst_id = BTM_BLE_MULTI_ADV_DEFAULT_STD; +#endif + pthread_mutex_lock(&btm_multi_adv_lock); if (btm_multi_adv_cb.p_adv_inst) { for (size_t i = 0; i < btm_cb.cmn_ble_vsc_cb.adv_inst_max; i++) { diff --git a/stack/btm/btm_int.h b/stack/btm/btm_int.h index cfcc30a38..97e948d1d 100644 --- a/stack/btm/btm_int.h +++ b/stack/btm/btm_int.h @@ -551,6 +551,8 @@ typedef struct tBTM_BD_NAME sec_bd_name; /* User friendly name of the device. (may be truncated to save space in dev_rec table) */ BD_FEATURES features[HCI_EXT_FEATURES_PAGE_MAX + 1]; /* Features supported by the device */ UINT8 num_read_pages; + UINT8 rnr_retry_cnt; + UINT8 cc_retry_cnt; #define BTM_SEC_STATE_IDLE 0 #define BTM_SEC_STATE_AUTHENTICATING 1 @@ -860,6 +862,7 @@ typedef struct tBTM_SEC_DEV_REC *p_collided_dev_rec; alarm_t *sec_collision_timer; + tBTM_SEC_DEV_REC *p_cc_retry_dev_rec; UINT32 collision_start_time; UINT32 max_collision_delay; UINT32 dev_rec_count; /* Counter used for device record timestamp */ diff --git a/stack/btm/btm_sec.c b/stack/btm/btm_sec.c index aa5dbe5d7..d500e1451 100644 --- a/stack/btm/btm_sec.c +++ b/stack/btm/btm_sec.c @@ -55,6 +55,9 @@ extern fixed_queue_t *btu_general_alarm_queue; BOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr); #endif +#define RNR_MAX_RETRY_ATTEMPTS 1 +#define CC_MAX_RETRY_ATTEMPTS 1 + /******************************************************************************** ** L O C A L F U N C T I O N P R O T O T Y P E S * *********************************************************************************/ @@ -3190,6 +3193,22 @@ void btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT return; } + /* Handle RNR with retry mechanism */ + if((status == HCI_ERR_PAGE_TIMEOUT) && (p_dev_rec->rnr_retry_cnt < RNR_MAX_RETRY_ATTEMPTS)) + { + BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete() Retrying RNR due to page timeout"); + if ((BTM_ReadRemoteDeviceName(p_bd_addr, NULL, BT_TRANSPORT_BR_EDR)) == BTM_CMD_STARTED) + { + p_dev_rec->rnr_retry_cnt++; + return; + } + } + else + { + BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() reset RNR retry count "); + p_dev_rec->rnr_retry_cnt = 0; + } + if (status != HCI_SUCCESS) { btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); @@ -4397,6 +4416,38 @@ static void btm_sec_connect_after_reject_timeout(UNUSED_ATTR void *data) /******************************************************************************* ** +** Function btm_sec_connect_after_cc_page_tout +** +** Description This function is called to retry the connection if the +** create connection fails as part of pairing procedure. +** +** Returns Pointer to the TLE struct +** +*******************************************************************************/ +static void btm_sec_connect_after_cc_page_tout (UNUSED_ATTR void *data) +{ + tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_cc_retry_dev_rec; + + BTM_TRACE_EVENT("%s", __func__); + btm_cb.p_cc_retry_dev_rec = 0; + + if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && + (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) && + (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)) + { + BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_cc_page_tout: failed to start connection"); + + btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); + + if (btm_cb.api.p_auth_complete_callback) + (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, + p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); + btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE); + } +} + +/******************************************************************************* +** ** Function btm_sec_connected ** ** Description This function is when a connection to the peer device is @@ -4547,12 +4598,31 @@ void btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) return; } + /* retry again */ + else if((status == HCI_ERR_PAGE_TIMEOUT) && + (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) + { + /* Handle CC with retry mechanism */ + if(p_dev_rec->cc_retry_cnt < CC_MAX_RETRY_ATTEMPTS) + { + /* Start timer with 0 to initiate connection with new LCB */ + btm_cb.p_cc_retry_dev_rec = p_dev_rec; + + alarm_set_on_queue(btm_cb.sec_collision_timer, 0, + btm_sec_connect_after_cc_page_tout, + NULL, btu_general_alarm_queue); + + p_dev_rec->cc_retry_cnt++; + return; + } + } /* wait for incoming connection without resetting pairing state */ else if (status == HCI_ERR_CONNECTION_EXISTS) { BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection"); return; } + p_dev_rec->cc_retry_cnt = 0; is_pairing_device = TRUE; } diff --git a/stack/include/avct_api.h b/stack/include/avct_api.h index f8441e834..350afdd71 100644 --- a/stack/include/avct_api.h +++ b/stack/include/avct_api.h @@ -326,6 +326,18 @@ UINT8 AVCT_SetTraceLevel (UINT8 new_level); *******************************************************************************/ extern BOOLEAN avct_get_peer_addr_by_ccb (UINT8 idx, BD_ADDR addr); +/******************************************************************************* +** +** Function AVCT_CheckIncomingConn +** +** +** Description Check if remote AVCTP incoming connection in progress +** +** Returns TRUE if icoming connection is in progress, +** +*******************************************************************************/ +extern BOOLEAN AVCT_CheckIncomingConn(BD_ADDR peer_addr); + #ifdef __cplusplus } #endif diff --git a/stack/include/avrc_api.h b/stack/include/avrc_api.h index 15354b500..7245b6b50 100644 --- a/stack/include/avrc_api.h +++ b/stack/include/avrc_api.h @@ -679,6 +679,18 @@ extern BOOLEAN AVRC_IsValidAvcType(UINT8 pdu_id, UINT8 avc_type); *******************************************************************************/ extern BOOLEAN AVRC_IsValidPlayerAttr(UINT8 attr); +/******************************************************************************* +** +** Function AVRC_CheckIncomingConn +** +** Description Check if AVRC incoming connection in progress +** +** +** Returns returns TRUE if incoming connection in progress +** +*******************************************************************************/ +extern BOOLEAN AVRC_CheckIncomingConn(BD_ADDR peer_addr); + #ifdef __cplusplus } #endif diff --git a/stack/l2cap/l2c_main.c b/stack/l2cap/l2c_main.c index d549c2131..a8407ed71 100644 --- a/stack/l2cap/l2c_main.c +++ b/stack/l2cap/l2c_main.c @@ -112,7 +112,7 @@ void l2c_rcv_acl_data (BT_HDR *p_msg) } return; - } else { + } else if (handle != 0xedc) { /* Handle 0xedc used for SOC Logging */ L2CAP_TRACE_ERROR ("L2CAP - rcvd ACL for unknown handle:%d ls:%d cid:%d" " opcode:%d cur count:%d", handle, p_msg->layer_specific, rcv_cid, cmd_code, list_length(l2cb.rcv_pending_q)); diff --git a/stack/sdp/sdp_server.c b/stack/sdp/sdp_server.c index 3b3667733..27b5aafa6 100644 --- a/stack/sdp/sdp_server.c +++ b/stack/sdp/sdp_server.c @@ -40,8 +40,11 @@ #include "sdp_api.h" #include "sdpint.h" +#include "device/include/interop.h" +#include "btif/include/btif_storage.h" #include #include +#include #if SDP_SERVER_ENABLED == TRUE @@ -57,12 +60,6 @@ extern fixed_queue_t *btu_general_alarm_queue; #define AVRCP_BROWSE_SUPPORT_BITMASK 0x40 #define AVRCP_CA_SUPPORT_BITMASK 0x01 -/* Few remote device does not understand AVRCP version greater - * than 1.3 and falls back to 1.0, we would like to blacklist - * and send AVRCP versio as 1.3. - */ -static const UINT8 sdp_black_list_prefix[][3] = {}; - /********************************************************************************/ /* L O C A L F U N C T I O N P R O T O T Y P E S */ /********************************************************************************/ @@ -166,24 +163,30 @@ int sdp_get_stored_avrc_tg_version(BD_ADDR addr) *******************************************************************************/ BOOLEAN sdp_dev_blacklisted_for_avrcp15 (BD_ADDR addr) { - int blacklistsize = 0; - int i =0; + bt_bdaddr_t remote_bdaddr; + bdcpy(remote_bdaddr.address, addr); - if(sizeof(sdp_black_list_prefix) == 0) - { - SDP_TRACE_ERROR("No AVRCP Black Listed Device"); - return FALSE; - } + if (interop_match_addr(INTEROP_ADV_AVRCP_VER_1_3, &remote_bdaddr)) { + bt_property_t prop_name; + bt_bdname_t bdname; - blacklistsize = sizeof(sdp_black_list_prefix)/sizeof(sdp_black_list_prefix[0]); - for (i=0; i < blacklistsize; i++) - { - if (0 == memcmp(sdp_black_list_prefix[i], addr, 3)) + BTIF_STORAGE_FILL_PROPERTY(&prop_name, BT_PROPERTY_BDNAME, + sizeof(bt_bdname_t), &bdname); + if (btif_storage_get_remote_device_property(&remote_bdaddr, + &prop_name) != BT_STATUS_SUCCESS) { - SDP_TRACE_ERROR("SDP Avrcp Version Black List Device"); + SDP_TRACE_ERROR("%s: BT_PROPERTY_BDNAME failed, returning false", __func__); + return FALSE; + } + + if (strlen((const char *)bdname.name) != 0 && + interop_match_name(INTEROP_ADV_AVRCP_VER_1_3, (const char *)bdname.name)) + { + SDP_TRACE_DEBUG("%s: advertise AVRCP version 1.3 for device", __func__); return TRUE; } } + return FALSE; }