diff options
Diffstat (limited to 'stack/sdp/sdp_main.cc')
-rw-r--r-- | stack/sdp/sdp_main.cc | 326 |
1 files changed, 40 insertions, 286 deletions
diff --git a/stack/sdp/sdp_main.cc b/stack/sdp/sdp_main.cc index 93a4f0639..b2b048671 100644 --- a/stack/sdp/sdp_main.cc +++ b/stack/sdp/sdp_main.cc @@ -32,10 +32,9 @@ #include "l2cdefs.h" #include "osi/include/osi.h" -#include "btm_api.h" - #include "sdp_api.h" #include "sdpint.h" +#include "stack/btm/btm_sec.h" /******************************************************************************/ /* G L O B A L S D P D A T A */ @@ -48,12 +47,13 @@ tSDP_CB sdp_cb; static void sdp_connect_ind(const RawAddress& bd_addr, uint16_t l2cap_cid, UNUSED_ATTR uint16_t psm, uint8_t l2cap_id); static void sdp_config_ind(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg); -static void sdp_config_cfm(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg); +static void sdp_config_cfm(uint16_t l2cap_cid, uint16_t result, + tL2CAP_CFG_INFO* p_cfg); static void sdp_disconnect_ind(uint16_t l2cap_cid, bool ack_needed); static void sdp_data_ind(uint16_t l2cap_cid, BT_HDR* p_msg); static void sdp_connect_cfm(uint16_t l2cap_cid, uint16_t result); -static void sdp_disconnect_cfm(uint16_t l2cap_cid, uint16_t result); +static void sdp_on_l2cap_error(uint16_t l2cap_cid, uint16_t result); /******************************************************************************* * @@ -72,52 +72,26 @@ void sdp_init(void) { sdp_cb.ccb[i].sdp_conn_timer = alarm_new("sdp.sdp_conn_timer"); } - /* Initialize the L2CAP configuration. We only care about MTU and flush */ + /* Initialize the L2CAP configuration. We only care about MTU */ sdp_cb.l2cap_my_cfg.mtu_present = true; sdp_cb.l2cap_my_cfg.mtu = SDP_MTU_SIZE; - sdp_cb.l2cap_my_cfg.flush_to_present = true; - sdp_cb.l2cap_my_cfg.flush_to = SDP_FLUSH_TO; sdp_cb.max_attr_list_size = SDP_MTU_SIZE - 16; sdp_cb.max_recs_per_search = SDP_MAX_DISC_SERVER_RECS; -#if (SDP_SERVER_ENABLED == TRUE) - /* Register with Security Manager for the specific security level */ - if (!BTM_SetSecurityLevel(false, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER, - BTM_SEC_NONE, SDP_PSM, 0, 0)) { - SDP_TRACE_ERROR("Security Registration Server failed"); - return; - } -#endif - - /* Register with Security Manager for the specific security level */ - if (!BTM_SetSecurityLevel(true, SDP_SERVICE_NAME, BTM_SEC_SERVICE_SDP_SERVER, - BTM_SEC_NONE, SDP_PSM, 0, 0)) { - SDP_TRACE_ERROR("Security Registration for Client failed"); - return; - } - -#if defined(SDP_INITIAL_TRACE_LEVEL) - sdp_cb.trace_level = SDP_INITIAL_TRACE_LEVEL; -#else - sdp_cb.trace_level = BT_TRACE_LEVEL_NONE; /* No traces */ -#endif + sdp_cb.trace_level = BT_TRACE_LEVEL_WARNING; sdp_cb.reg_info.pL2CA_ConnectInd_Cb = sdp_connect_ind; sdp_cb.reg_info.pL2CA_ConnectCfm_Cb = sdp_connect_cfm; - sdp_cb.reg_info.pL2CA_ConnectPnd_Cb = NULL; sdp_cb.reg_info.pL2CA_ConfigInd_Cb = sdp_config_ind; sdp_cb.reg_info.pL2CA_ConfigCfm_Cb = sdp_config_cfm; sdp_cb.reg_info.pL2CA_DisconnectInd_Cb = sdp_disconnect_ind; - sdp_cb.reg_info.pL2CA_DisconnectCfm_Cb = sdp_disconnect_cfm; - sdp_cb.reg_info.pL2CA_QoSViolationInd_Cb = NULL; sdp_cb.reg_info.pL2CA_DataInd_Cb = sdp_data_ind; - sdp_cb.reg_info.pL2CA_CongestionStatus_Cb = NULL; - sdp_cb.reg_info.pL2CA_TxComplete_Cb = NULL; + sdp_cb.reg_info.pL2CA_Error_Cb = sdp_on_l2cap_error; /* Now, register with L2CAP */ - if (!L2CA_Register(SDP_PSM, &sdp_cb.reg_info, true /* enable_snoop */, - nullptr)) { + if (!L2CA_Register2(BT_PSM_SDP, sdp_cb.reg_info, true /* enable_snoop */, + nullptr, SDP_MTU_SIZE, 0, BTM_SEC_NONE)) { SDP_TRACE_ERROR("SDP Registration failed"); } } @@ -142,11 +116,7 @@ void sdp_free(void) { ******************************************************************************/ static void sdp_connect_ind(const RawAddress& bd_addr, uint16_t l2cap_cid, UNUSED_ATTR uint16_t psm, uint8_t l2cap_id) { -#if (SDP_SERVER_ENABLED == TRUE) - tCONN_CB* p_ccb; - - /* Allocate a new CCB. Return if none available. */ - p_ccb = sdpu_allocate_ccb(); + tCONN_CB* p_ccb = sdpu_allocate_ccb(); if (p_ccb == NULL) return; /* Transition to the next appropriate state, waiting for config setup. */ @@ -155,35 +125,12 @@ static void sdp_connect_ind(const RawAddress& bd_addr, uint16_t l2cap_cid, /* Save the BD Address and Channel ID. */ p_ccb->device_address = bd_addr; p_ccb->connection_id = l2cap_cid; +} - /* Send response to the L2CAP layer. */ - L2CA_ConnectRsp(bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK); - { - tL2CAP_CFG_INFO cfg = sdp_cb.l2cap_my_cfg; - - if (cfg.fcr_present) { - SDP_TRACE_DEBUG( - "sdp_connect_ind: mode %u, txwinsz %u, max_trans %u, rtrans_tout " - "%u, mon_tout %u, mps %u", - cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit, - cfg.fcr.rtrans_tout, cfg.fcr.mon_tout, cfg.fcr.mps); - } - - if ((!L2CA_ConfigReq(l2cap_cid, &cfg)) && cfg.fcr_present && - cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { - /* FCR not desired; try again in basic mode */ - cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; - cfg.fcr_present = false; - L2CA_ConfigReq(l2cap_cid, &cfg); - } - } - - SDP_TRACE_EVENT("SDP - Rcvd L2CAP conn ind, sent config req, CID 0x%x", - p_ccb->connection_id); -#else /* No server */ - /* Reject the connection */ - L2CA_ConnectRsp(bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_NO_PSM, 0); -#endif +static void sdp_on_l2cap_error(uint16_t l2cap_cid, uint16_t result) { + tCONN_CB* p_ccb = sdpu_find_ccb_by_cid(l2cap_cid); + if (p_ccb == nullptr) return; + sdp_disconnect(p_ccb, SDP_CFG_FAILED); } /******************************************************************************* @@ -199,7 +146,6 @@ static void sdp_connect_ind(const RawAddress& bd_addr, uint16_t l2cap_cid, ******************************************************************************/ static void sdp_connect_cfm(uint16_t l2cap_cid, uint16_t result) { tCONN_CB* p_ccb; - tL2CAP_CFG_INFO cfg; /* Find CCB based on CID */ p_ccb = sdpu_find_ccb_by_cid(l2cap_cid); @@ -212,50 +158,8 @@ static void sdp_connect_cfm(uint16_t l2cap_cid, uint16_t result) { /* Transition to the next state and startup the timer. */ if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == SDP_STATE_CONN_SETUP)) { p_ccb->con_state = SDP_STATE_CFG_SETUP; - - cfg = sdp_cb.l2cap_my_cfg; - - if (cfg.fcr_present) { - SDP_TRACE_DEBUG( - "sdp_connect_cfm: mode %u, txwinsz %u, max_trans %u, rtrans_tout " - "%u, mon_tout %u, mps %u", - cfg.fcr.mode, cfg.fcr.tx_win_sz, cfg.fcr.max_transmit, - cfg.fcr.rtrans_tout, cfg.fcr.mon_tout, cfg.fcr.mps); - } - - if ((!L2CA_ConfigReq(l2cap_cid, &cfg)) && cfg.fcr_present && - cfg.fcr.mode != L2CAP_FCR_BASIC_MODE) { - /* FCR not desired; try again in basic mode */ - cfg.fcr_present = false; - cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; - L2CA_ConfigReq(l2cap_cid, &cfg); - } - - SDP_TRACE_EVENT("SDP - got conn cnf, sent cfg req, CID: 0x%x", - p_ccb->connection_id); } else { - SDP_TRACE_WARNING("SDP - Rcvd conn cnf with error: 0x%x CID 0x%x", result, - p_ccb->connection_id); - - /* Tell the user if he has a callback */ - if (p_ccb->p_cb || p_ccb->p_cb2) { - uint16_t err = -1; - if ((result == HCI_ERR_HOST_REJECT_SECURITY) || - (result == HCI_ERR_AUTH_FAILURE) || - (result == HCI_ERR_PAIRING_NOT_ALLOWED) || - (result == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || - (result == HCI_ERR_KEY_MISSING)) - err = SDP_SECURITY_ERR; - else if (result == HCI_ERR_HOST_REJECT_DEVICE) - err = SDP_CONN_REJECTED; - else - err = SDP_CONN_FAILED; - if (p_ccb->p_cb) - (*p_ccb->p_cb)(err); - else if (p_ccb->p_cb2) - (*p_ccb->p_cb2)(err, p_ccb->user_data); - } - sdpu_release_ccb(p_ccb); + LOG(ERROR) << __func__ << ": invoked with non OK status"; } } @@ -291,63 +195,7 @@ static void sdp_config_ind(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg) { p_ccb->rem_mtu_size = p_cfg->mtu; } - /* For now, always accept configuration from the other side */ - p_cfg->flush_to_present = false; - p_cfg->mtu_present = false; - p_cfg->result = L2CAP_CFG_OK; - - /* Check peer config request against our rfcomm configuration */ - if (p_cfg->fcr_present) { - /* Reject the window size if it is bigger than we want it to be */ - if (p_cfg->fcr.mode != L2CAP_FCR_BASIC_MODE) { - if (sdp_cb.l2cap_my_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE && - p_cfg->fcr.tx_win_sz > sdp_cb.l2cap_my_cfg.fcr.tx_win_sz) { - p_cfg->fcr.tx_win_sz = sdp_cb.l2cap_my_cfg.fcr.tx_win_sz; - p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS; - SDP_TRACE_DEBUG( - "sdp_config_ind(CONFIG) -> Please try again with SMALLER TX " - "WINDOW"); - } - - /* Reject if locally we want basic and they don't */ - if (sdp_cb.l2cap_my_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE) { - /* Ask for a new setup */ - p_cfg->fcr.mode = L2CAP_FCR_BASIC_MODE; - p_cfg->result = L2CAP_CFG_UNACCEPTABLE_PARAMS; - SDP_TRACE_DEBUG( - "sdp_config_ind(CONFIG) -> Please try again with BASIC mode"); - } - /* Remain in configure state and give the peer our desired configuration - */ - if (p_cfg->result != L2CAP_CFG_OK) { - SDP_TRACE_WARNING( - "SDP - Rcvd cfg ind, Unacceptable Parameters sent cfg cfm, CID: " - "0x%x", - l2cap_cid); - L2CA_ConfigRsp(l2cap_cid, p_cfg); - return; - } - } else /* We agree with peer's request */ - p_cfg->fcr_present = false; - } - - L2CA_ConfigRsp(l2cap_cid, p_cfg); - SDP_TRACE_EVENT("SDP - Rcvd cfg ind, sent cfg cfm, CID: 0x%x", l2cap_cid); - - p_ccb->con_flags |= SDP_FLAGS_HIS_CFG_DONE; - - if (p_ccb->con_flags & SDP_FLAGS_MY_CFG_DONE) { - p_ccb->con_state = SDP_STATE_CONNECTED; - - if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) { - sdp_disc_connected(p_ccb); - } else { - /* Start inactivity timer */ - alarm_set_on_mloop(p_ccb->sdp_conn_timer, SDP_INACT_TIMEOUT_MS, - sdp_conn_timer_timeout, p_ccb); - } - } } /******************************************************************************* @@ -360,11 +208,13 @@ static void sdp_config_ind(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg) { * Returns void * ******************************************************************************/ -static void sdp_config_cfm(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg) { +static void sdp_config_cfm(uint16_t l2cap_cid, uint16_t initiator, + tL2CAP_CFG_INFO* p_cfg) { + sdp_config_ind(l2cap_cid, p_cfg); + tCONN_CB* p_ccb; - SDP_TRACE_EVENT("SDP - Rcvd cfg cfm, CID: 0x%x Result: %d", l2cap_cid, - p_cfg->result); + SDP_TRACE_EVENT("SDP - Rcvd cfg cfm, CID: 0x%x", l2cap_cid); /* Find CCB based on CID */ p_ccb = sdpu_find_ccb_by_cid(l2cap_cid); @@ -374,32 +224,14 @@ static void sdp_config_cfm(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg) { } /* For now, always accept configuration from the other side */ - if (p_cfg->result == L2CAP_CFG_OK) { - p_ccb->con_flags |= SDP_FLAGS_MY_CFG_DONE; - - if (p_ccb->con_flags & SDP_FLAGS_HIS_CFG_DONE) { - p_ccb->con_state = SDP_STATE_CONNECTED; - - if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) { - sdp_disc_connected(p_ccb); - } else { - /* Start inactivity timer */ - alarm_set_on_mloop(p_ccb->sdp_conn_timer, SDP_INACT_TIMEOUT_MS, - sdp_conn_timer_timeout, p_ccb); - } - } - } else { - /* If peer has rejected FCR and suggested basic then try basic */ - if (p_cfg->fcr_present) { - tL2CAP_CFG_INFO cfg = sdp_cb.l2cap_my_cfg; - cfg.fcr_present = false; - L2CA_ConfigReq(l2cap_cid, &cfg); - - /* Remain in configure state */ - return; - } + p_ccb->con_state = SDP_STATE_CONNECTED; - sdp_disconnect(p_ccb, SDP_CFG_FAILED); + if (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) { + sdp_disc_connected(p_ccb); + } else { + /* Start inactivity timer */ + alarm_set_on_mloop(p_ccb->sdp_conn_timer, SDP_INACT_TIMEOUT_MS, + sdp_conn_timer_timeout, p_ccb); } } @@ -423,18 +255,16 @@ static void sdp_disconnect_ind(uint16_t l2cap_cid, bool ack_needed) { return; } - if (ack_needed) L2CA_DisconnectRsp(l2cap_cid); - SDP_TRACE_EVENT("SDP - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid); - /* Tell the user if he has a callback */ + /* Tell the user if there is a callback */ if (p_ccb->p_cb) - (*p_ccb->p_cb)((uint16_t)((p_ccb->con_state == SDP_STATE_CONNECTED) - ? SDP_SUCCESS - : SDP_CONN_FAILED)); + (*p_ccb->p_cb)(((p_ccb->con_state == SDP_STATE_CONNECTED) + ? SDP_SUCCESS + : SDP_CONN_FAILED)); else if (p_ccb->p_cb2) (*p_ccb->p_cb2)( - (uint16_t)((p_ccb->con_state == SDP_STATE_CONNECTED) ? SDP_SUCCESS - : SDP_CONN_FAILED), + ((p_ccb->con_state == SDP_STATE_CONNECTED) ? SDP_SUCCESS + : SDP_CONN_FAILED), p_ccb->user_data); sdpu_release_ccb(p_ccb); @@ -513,7 +343,7 @@ tCONN_CB* sdp_conn_originate(const RawAddress& p_bd_addr) { */ p_ccb->con_state = SDP_STATE_CONN_SETUP; - cid = L2CA_ConnectReq(SDP_PSM, p_bd_addr); + cid = L2CA_ConnectReq2(BT_PSM_SDP, p_bd_addr, BTM_SEC_NONE); /* Check if L2CAP started the connection process */ if (cid == 0) { @@ -535,46 +365,7 @@ tCONN_CB* sdp_conn_originate(const RawAddress& p_bd_addr) { * Returns void * ******************************************************************************/ -void sdp_disconnect(tCONN_CB* p_ccb, uint16_t reason) { -#if (SDP_BROWSE_PLUS == TRUE) - - /* If we are browsing for multiple UUIDs ... */ - if ((p_ccb->con_state == SDP_STATE_CONNECTED) && - (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) && - ((reason == SDP_SUCCESS) || (reason == SDP_NO_RECS_MATCH))) { - /* If the browse found something, do no more searching */ - if ((p_ccb->cur_uuid_idx == 0) && (p_ccb->p_db->p_first_rec)) - p_ccb->cur_uuid_idx = p_ccb->p_db->num_uuid_filters; - - while (++p_ccb->cur_uuid_idx < p_ccb->p_db->num_uuid_filters) { - /* Check we have not already found the UUID (maybe through browse) */ - if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len == 2) && - (SDP_FindServiceInDb( - p_ccb->p_db, - p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].uu.uuid16, NULL))) - continue; - - if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len > 2) && - (SDP_FindServiceUUIDInDb( - p_ccb->p_db, &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], - NULL))) - continue; - - p_ccb->cur_handle = 0; - - SDP_TRACE_EVENT("SDP - looking for for more, CID: 0x%x", - p_ccb->connection_id); - - sdp_disc_connected(p_ccb); - return; - } - } - - if ((reason == SDP_NO_RECS_MATCH) && (p_ccb->p_db->p_first_rec)) - reason = SDP_SUCCESS; - -#endif - +void sdp_disconnect(tCONN_CB* p_ccb, tSDP_REASON reason) { SDP_TRACE_EVENT("SDP - disconnect CID: 0x%x", p_ccb->connection_id); /* Check if we have a connection ID */ @@ -583,52 +374,15 @@ void sdp_disconnect(tCONN_CB* p_ccb, uint16_t reason) { p_ccb->disconnect_reason = reason; } - /* If at setup state, we may not get callback ind from L2CAP */ - /* Call user callback immediately */ - if (p_ccb->con_state == SDP_STATE_CONN_SETUP) { - /* Tell the user if he has a callback */ - if (p_ccb->p_cb) - (*p_ccb->p_cb)(reason); - else if (p_ccb->p_cb2) - (*p_ccb->p_cb2)(reason, p_ccb->user_data); - - sdpu_release_ccb(p_ccb); - } -} - -/******************************************************************************* - * - * Function sdp_disconnect_cfm - * - * Description This function handles a disconnect confirm event from L2CAP. - * - * Returns void - * - ******************************************************************************/ -static void sdp_disconnect_cfm(uint16_t l2cap_cid, - UNUSED_ATTR uint16_t result) { - tCONN_CB* p_ccb; - - /* Find CCB based on CID */ - p_ccb = sdpu_find_ccb_by_cid(l2cap_cid); - if (p_ccb == NULL) { - SDP_TRACE_WARNING("SDP - Rcvd L2CAP disc cfm, unknown CID: 0x%x", - l2cap_cid); - return; - } - - SDP_TRACE_EVENT("SDP - Rcvd L2CAP disc cfm, CID: 0x%x", l2cap_cid); - - /* Tell the user if he has a callback */ + /* Tell the user if there is a callback */ if (p_ccb->p_cb) - (*p_ccb->p_cb)(p_ccb->disconnect_reason); + (*p_ccb->p_cb)(reason); else if (p_ccb->p_cb2) - (*p_ccb->p_cb2)(p_ccb->disconnect_reason, p_ccb->user_data); + (*p_ccb->p_cb2)(reason, p_ccb->user_data); sdpu_release_ccb(p_ccb); } - /******************************************************************************* * * Function sdp_conn_timer_timeout @@ -646,7 +400,7 @@ void sdp_conn_timer_timeout(void* data) { p_ccb->connection_id); L2CA_DisconnectReq(p_ccb->connection_id); - /* Tell the user if he has a callback */ + /* Tell the user if there is a callback */ if (p_ccb->p_cb) (*p_ccb->p_cb)(SDP_CONN_FAILED); else if (p_ccb->p_cb2) |