aboutsummaryrefslogtreecommitdiff
path: root/stack/sdp/sdp_main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'stack/sdp/sdp_main.cc')
-rw-r--r--stack/sdp/sdp_main.cc326
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)