tL2CAP_CFG_INFO cfg_info{};
do_in_main_thread(
FROM_HERE,
- base::Bind(classic_.Callbacks(CidToPsm(cid)).pL2CA_ConfigInd_Cb, cid,
- base::Unretained(&cfg_info)));
- do_in_main_thread(
- FROM_HERE,
base::Bind(classic_.Callbacks(CidToPsm(cid)).pL2CA_ConfigCfm_Cb, cid,
- L2CAP_CFG_OK));
+ L2CAP_INITIATOR_LOCAL, base::Unretained(&cfg_info)));
} else {
LOG_DEBUG("Connection Closed before presentation to upper layer");
tL2CAP_CFG_INFO cfg_info{};
do_in_main_thread(
FROM_HERE,
- base::Bind(classic_.Callbacks(CidToPsm(cid)).pL2CA_ConfigInd_Cb, cid,
- base::Unretained(&cfg_info)));
- do_in_main_thread(
- FROM_HERE,
base::Bind(classic_.Callbacks(CidToPsm(cid)).pL2CA_ConfigCfm_Cb, cid,
- L2CAP_CFG_OK));
+ L2CAP_INITIATOR_REMOTE, base::Unretained(&cfg_info)));
}
bool bluetooth::shim::legacy::L2cap::Write(uint16_t cid, BT_HDR* bt_hdr) {
void avct_l2c_connect_ind_cback(const RawAddress& bd_addr, uint16_t lcid,
uint16_t psm, uint8_t id);
void avct_l2c_connect_cfm_cback(uint16_t lcid, uint16_t result);
-void avct_l2c_config_cfm_cback(uint16_t lcid, uint16_t result);
+void avct_l2c_config_cfm_cback(uint16_t lcid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
void avct_l2c_config_ind_cback(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg);
void avct_l2c_disconnect_ind_cback(uint16_t lcid, bool ack_needed);
void avct_l2c_congestion_ind_cback(uint16_t lcid, bool is_congested);
* Returns void
*
******************************************************************************/
-void avct_l2c_config_cfm_cback(uint16_t lcid, uint16_t initiator) {
+void avct_l2c_config_cfm_cback(uint16_t lcid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ avct_l2c_config_ind_cback(lcid, p_cfg);
+
tAVCT_LCB* p_lcb;
/* look up lcb for this channel */
void avct_l2c_br_connect_ind_cback(const RawAddress& bd_addr, uint16_t lcid,
uint16_t psm, uint8_t id);
void avct_l2c_br_connect_cfm_cback(uint16_t lcid, uint16_t result);
-void avct_l2c_br_config_cfm_cback(uint16_t lcid, uint16_t result);
+void avct_l2c_br_config_cfm_cback(uint16_t lcid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
void avct_l2c_br_config_ind_cback(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg);
void avct_l2c_br_disconnect_ind_cback(uint16_t lcid, bool ack_needed);
void avct_l2c_br_congestion_ind_cback(uint16_t lcid, bool is_congested);
* Returns void
*
******************************************************************************/
-void avct_l2c_br_config_cfm_cback(uint16_t lcid, uint16_t initiator) {
+void avct_l2c_br_config_cfm_cback(uint16_t lcid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ avct_l2c_br_config_ind_cback(lcid, p_cfg);
+
tAVCT_BCB* p_lcb;
/* look up lcb for this channel */
void avdt_l2c_connect_ind_cback(const RawAddress& bd_addr, uint16_t lcid,
uint16_t psm, uint8_t id);
void avdt_l2c_connect_cfm_cback(uint16_t lcid, uint16_t result);
-void avdt_l2c_config_cfm_cback(uint16_t lcid, uint16_t result);
+void avdt_l2c_config_cfm_cback(uint16_t lcid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
void avdt_l2c_config_ind_cback(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg);
void avdt_l2c_disconnect_ind_cback(uint16_t lcid, bool ack_needed);
void avdt_l2c_congestion_ind_cback(uint16_t lcid, bool is_congested);
* Returns void
*
******************************************************************************/
-void avdt_l2c_config_cfm_cback(uint16_t lcid, uint16_t initiator) {
+void avdt_l2c_config_cfm_cback(uint16_t lcid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ avdt_l2c_config_ind_cback(lcid, p_cfg);
+
AvdtpTransportChannel* p_tbl;
AVDT_TRACE_DEBUG("%s: lcid: %d", __func__, lcid);
static void bnep_connect_ind(const RawAddress& bd_addr, uint16_t l2cap_cid,
uint16_t psm, uint8_t l2cap_id);
static void bnep_connect_cfm(uint16_t l2cap_cid, uint16_t result);
-static void bnep_config_ind(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg);
-static void bnep_config_cfm(uint16_t l2cap_cid, uint16_t result);
+static void bnep_config_cfm(uint16_t l2cap_cid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
static void bnep_disconnect_ind(uint16_t l2cap_cid, bool ack_needed);
static void bnep_data_ind(uint16_t l2cap_cid, BT_HDR* p_msg);
static void bnep_congestion_ind(uint16_t lcid, bool is_congested);
bnep_cb.reg_info.pL2CA_ConnectInd_Cb = bnep_connect_ind;
bnep_cb.reg_info.pL2CA_ConnectCfm_Cb = bnep_connect_cfm;
- bnep_cb.reg_info.pL2CA_ConfigInd_Cb = bnep_config_ind;
+ bnep_cb.reg_info.pL2CA_ConfigInd_Cb = nullptr;
bnep_cb.reg_info.pL2CA_ConfigCfm_Cb = bnep_config_cfm;
bnep_cb.reg_info.pL2CA_DisconnectInd_Cb = bnep_disconnect_ind;
bnep_cb.reg_info.pL2CA_DataInd_Cb = bnep_data_ind;
/*******************************************************************************
*
- * Function bnep_config_ind
- *
- * Description This function processes the L2CAP configuration indication
- * event.
- *
- * Returns void
- *
- ******************************************************************************/
-static void bnep_config_ind(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg) {
- // No-op here. We are not interested in their MTU.
-}
-
-/*******************************************************************************
- *
* Function bnep_config_cfm
*
* Description This function processes the L2CAP configuration confirmation
* Returns void
*
******************************************************************************/
-static void bnep_config_cfm(uint16_t l2cap_cid, uint16_t initiator) {
+static void bnep_config_cfm(uint16_t l2cap_cid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
tBNEP_CONN* p_bcb;
BNEP_TRACE_EVENT("BNEP - Rcvd cfg cfm, CID: 0x%x", l2cap_cid);
uint16_t psm, uint8_t l2cap_id);
static void gap_connect_cfm(uint16_t l2cap_cid, uint16_t result);
static void gap_config_ind(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg);
-static void gap_config_cfm(uint16_t l2cap_cid, uint16_t result);
+static void gap_config_cfm(uint16_t l2cap_cid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
static void gap_disconnect_ind(uint16_t l2cap_cid, bool ack_needed);
static void gap_data_ind(uint16_t l2cap_cid, BT_HDR* p_msg);
static void gap_congestion_ind(uint16_t lcid, bool is_congested);
* Returns void
*
******************************************************************************/
-static void gap_config_cfm(uint16_t l2cap_cid, uint16_t initiator) {
+static void gap_config_cfm(uint16_t l2cap_cid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ gap_config_ind(l2cap_cid, p_cfg);
+
tGAP_CCB* p_ccb;
/* Find CCB based on CID */
static void gatt_l2cif_connect_cfm_cback(uint16_t l2cap_cid, uint16_t result);
static void gatt_l2cif_config_ind_cback(uint16_t l2cap_cid,
tL2CAP_CFG_INFO* p_cfg);
-static void gatt_l2cif_config_cfm_cback(uint16_t lcid, uint16_t result);
+static void gatt_l2cif_config_cfm_cback(uint16_t lcid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
static void gatt_l2cif_disconnect_ind_cback(uint16_t l2cap_cid,
bool ack_needed);
static void gatt_l2cif_disconnect(uint16_t l2cap_cid);
}
/** This is the L2CAP config confirm callback function */
-void gatt_l2cif_config_cfm_cback(uint16_t lcid, uint16_t initiator) {
+void gatt_l2cif_config_cfm_cback(uint16_t lcid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ gatt_l2cif_config_ind_cback(lcid, p_cfg);
+
/* look up clcb for this channel */
tGATT_TCB* p_tcb = gatt_find_tcb_by_cid(lcid);
if (!p_tcb) return;
uint16_t psm, uint8_t id);
static void hidd_l2cif_connect_cfm(uint16_t cid, uint16_t result);
static void hidd_l2cif_config_ind(uint16_t cid, tL2CAP_CFG_INFO* p_cfg);
-static void hidd_l2cif_config_cfm(uint16_t cid, uint16_t result);
+static void hidd_l2cif_config_cfm(uint16_t cid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
static void hidd_l2cif_disconnect_ind(uint16_t cid, bool ack_needed);
static void hidd_l2cif_disconnect(uint16_t cid);
static void hidd_l2cif_data_ind(uint16_t cid, BT_HDR* p_msg);
* Returns void
*
******************************************************************************/
-static void hidd_l2cif_config_cfm(uint16_t cid, uint16_t initiator) {
+static void hidd_l2cif_config_cfm(uint16_t cid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ hidd_l2cif_config_ind(cid, p_cfg);
+
tHID_CONN* p_hcon;
HIDD_TRACE_EVENT("%s: cid=%04x", __func__, cid);
uint8_t l2cap_id);
static void hidh_l2cif_connect_cfm(uint16_t l2cap_cid, uint16_t result);
static void hidh_l2cif_config_ind(uint16_t l2cap_cid, tL2CAP_CFG_INFO* p_cfg);
-static void hidh_l2cif_config_cfm(uint16_t l2cap_cid, uint16_t result);
+static void hidh_l2cif_config_cfm(uint16_t l2cap_cid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
static void hidh_l2cif_disconnect_ind(uint16_t l2cap_cid, bool ack_needed);
static void hidh_l2cif_data_ind(uint16_t l2cap_cid, BT_HDR* p_msg);
static void hidh_l2cif_disconnect(uint16_t l2cap_cid);
* Returns void
*
******************************************************************************/
-static void hidh_l2cif_config_cfm(uint16_t l2cap_cid, uint16_t initiator) {
+static void hidh_l2cif_config_cfm(uint16_t l2cap_cid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ hidh_l2cif_config_ind(l2cap_cid, p_cfg);
+
uint8_t dhandle;
tHID_CONN* p_hcon = NULL;
uint32_t reason;
/* Configuration confirm callback prototype. Parameters are
* Local CID assigned to the connection
* Initiator (1 for local, 0 for remote)
+ * Initial config from remote
* If there is an error, tL2CA_ERROR_CB is invoked
*/
-typedef void(tL2CA_CONFIG_CFM_CB)(uint16_t, uint16_t);
+typedef void(tL2CA_CONFIG_CFM_CB)(uint16_t, uint16_t, tL2CAP_CFG_INFO*);
/* Disconnect indication callback prototype. Parameters are
* Local CID
p_ccb->remote_id);
}
if (p_ccb->chnl_state == CST_OPEN) {
- (*p_ccb->p_rcb->api.pL2CA_ConfigInd_Cb)(p_ccb->local_cid, &p_ccb->peer_cfg);
- (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(p_ccb->local_cid,
- p_ccb->connection_initiator);
+ (*p_ccb->p_rcb->api.pL2CA_ConfigCfm_Cb)(
+ p_ccb->local_cid, p_ccb->connection_initiator, &p_ccb->peer_cfg);
}
}
uint16_t psm, uint8_t id);
static void RFCOMM_ConnectCnf(uint16_t lcid, uint16_t err);
static void RFCOMM_ConfigInd(uint16_t lcid, tL2CAP_CFG_INFO* p_cfg);
-static void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t result);
+static void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t result,
+ tL2CAP_CFG_INFO* p_cfg);
static void RFCOMM_DisconnectInd(uint16_t lcid, bool is_clear);
static void RFCOMM_BufDataInd(uint16_t lcid, BT_HDR* p_buf);
static void RFCOMM_CongestionStatusInd(uint16_t lcid, bool is_congested);
* event to the FSM.
*
******************************************************************************/
-void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t initiator) {
+void RFCOMM_ConfigCnf(uint16_t lcid, uint16_t initiator,
+ tL2CAP_CFG_INFO* p_cfg) {
+ RFCOMM_ConfigInd(lcid, p_cfg);
+
tRFC_MCB* p_mcb = rfc_find_lcid_mcb(lcid);
if (!p_mcb) {
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, uint16_t result);
+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);
* Returns void
*
******************************************************************************/
-static void sdp_config_cfm(uint16_t l2cap_cid, uint16_t initiator) {
+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", l2cap_cid);
VLOG(1) << "Step 2";
// MTU configuration is done
cfg_req.mtu_present = false;
- l2cap_appl_info_.pL2CA_ConfigCfm_Cb(lcid, L2CAP_CFG_OK);
+ l2cap_appl_info_.pL2CA_ConfigCfm_Cb(lcid, L2CAP_CFG_OK, {});
VLOG(1) << "Step 3";
// Remote device also ask to configure MTU size
VLOG(1) << "Step 2";
// Remote device confirms our configuration request
cfg_req.mtu_present = false;
- l2cap_appl_info_.pL2CA_ConfigCfm_Cb(lcid, L2CAP_CFG_OK);
+ l2cap_appl_info_.pL2CA_ConfigCfm_Cb(lcid, L2CAP_CFG_OK, {});
VLOG(1) << "Step 3";
// Remote device also asks to configure MTU
VLOG(1) << "Step 6";
// Remote device accepted our MTU size
- l2cap_appl_info_.pL2CA_ConfigCfm_Cb(new_lcid, L2CAP_CFG_OK);
+ l2cap_appl_info_.pL2CA_ConfigCfm_Cb(new_lcid, L2CAP_CFG_OK, {});
// L2CAP collision and connection setup done