summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubramanian Srinivasan <quic_subrsrin@quicinc.com>2023-04-20 06:18:25 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2023-05-05 10:30:38 -0700
commitabccc25fd6c24207129d39cbfeb40014548e0c31 (patch)
treeed0ff8d0f8573b0438f5e9c3fe8f872ce6ef9bd2
parent618aa2cb8e484407365f947910bafdda86fbdd04 (diff)
Move Attribute channel operations when EATT is not supported
Local and remote devices have exchanged capabilities and support EATT during initial connection. When remote device rejects the first EATT credit based connection request from local device during reconnection, EATT supported is set to false. But, pending GATT operations of Attribute channel on EATT BCB are not moved to non-EATT structure. This change moves pending GATT operations of Attribute channel on EATT BCB to non-EATT structure and deallocates EATT blocks for Attribute channel. CRs-Fixed: 3469729 Change-Id: I6aa3eb526acca9559b1a9941e2ef212806faf170
-rw-r--r--stack/gatt/eatt_int.h1
-rw-r--r--stack/gatt/eatt_utils.cc29
-rw-r--r--stack/gatt/gatt_main.cc7
3 files changed, 36 insertions, 1 deletions
diff --git a/stack/gatt/eatt_int.h b/stack/gatt/eatt_int.h
index 593cbb9a9..99cf78384 100644
--- a/stack/gatt/eatt_int.h
+++ b/stack/gatt/eatt_int.h
@@ -79,5 +79,6 @@ extern void eatt_disc_rsp_enq(tGATT_TCB* p_tcb, uint16_t cid, BT_HDR *p_msg);
extern bool eatt_congest_notify_apps(tGATT_TCB* p_tcb, uint16_t cid, bool congested);
extern tGATT_EBCB* gatt_find_eatt_bcb_using_all_cids(uint16_t lcid);
extern void gatt_send_conn_cb_after_enc_failure(tGATT_TCB* p_tcb);
+extern void gatt_move_att_ops_from_eatt_bcb(tGATT_TCB* p_tcb);
#endif
diff --git a/stack/gatt/eatt_utils.cc b/stack/gatt/eatt_utils.cc
index 4a89c0b2f..919d615e9 100644
--- a/stack/gatt/eatt_utils.cc
+++ b/stack/gatt/eatt_utils.cc
@@ -1457,3 +1457,32 @@ void gatt_send_conn_cb_after_enc_failure(tGATT_TCB* p_tcb) {
}
}
}
+
+/*******************************************************************************
+ *
+ * Function gatt_move_att_ops_from_eatt_bcb
+ *
+ * Description The function moves ATT channel ops from EATT bcb to p_tcb
+ *
+ * Returns void
+ *
+ ******************************************************************************/
+void gatt_move_att_ops_from_eatt_bcb(tGATT_TCB* p_tcb) {
+ tGATT_EBCB* p_eatt_bcb = NULL;
+
+ VLOG(1) << __func__;
+ p_eatt_bcb = gatt_find_eatt_bcb_by_cid(p_tcb, L2CAP_ATT_CID);
+ if (!p_eatt_bcb) {
+ VLOG(1) << __func__ << " p_eatt_bcb not available for ATT CID: ";
+ return;
+ }
+
+ p_tcb->payload_size = p_eatt_bcb->payload_size;
+ p_tcb->ind_ack_timer = p_eatt_bcb->ind_ack_timer;
+ p_tcb->conf_timer = p_eatt_bcb->conf_timer;
+ p_tcb->cl_cmd_q = p_eatt_bcb->cl_cmd_q;
+ p_tcb->pending_ind_q = p_eatt_bcb->pending_ind_q;
+ p_tcb->indicate_handle = p_eatt_bcb->indicate_handle;
+ p_tcb->sr_cmd = p_eatt_bcb->sr_cmd;
+ p_tcb->sr_cmd.multi_rsp_q = p_eatt_bcb->sr_cmd.multi_rsp_q;
+}
diff --git a/stack/gatt/gatt_main.cc b/stack/gatt/gatt_main.cc
index 71880b787..0486f9404 100644
--- a/stack/gatt/gatt_main.cc
+++ b/stack/gatt/gatt_main.cc
@@ -1369,6 +1369,8 @@ static void gatt_l2cif_eatt_connect_cfm_cback(RawAddress &p_bd_addr,
gatt_eatt_bcb_in_progress_dealloc(p_bd_addr);
p_tcb->apps_needing_eatt.clear();
p_tcb->is_eatt_supported = false;
+ gatt_move_att_ops_from_eatt_bcb(p_tcb);
+ gatt_eatt_bcb_dealloc(p_tcb, L2CAP_ATT_CID);
gatt_send_conn_cb_after_enc_failure(p_tcb);
return;
@@ -1401,6 +1403,8 @@ static void gatt_l2cif_eatt_connect_cfm_cback(RawAddress &p_bd_addr,
if (gatt_num_eatt_bcbs(p_tcb) == 0) {
VLOG(1) << " First EATT conn attempt rejected, set eatt as not supported";
p_tcb->is_eatt_supported = false;
+ gatt_move_att_ops_from_eatt_bcb(p_tcb);
+ gatt_eatt_bcb_dealloc(p_tcb, L2CAP_ATT_CID);
}
}
@@ -1714,7 +1718,8 @@ void gatt_data_process(tGATT_TCB& tcb, uint16_t lcid, BT_HDR* p_buf) {
STREAM_TO_UINT8(op_code, p);
LOG(INFO) << __func__ << " op_code = " << +op_code
- << ", msg_len = " << +msg_len;
+ << ", msg_len = " << +msg_len
+ << ", lcid = " << +lcid;
/* remove the two MSBs associated with sign write and write cmd */
pseudo_op_code = op_code & (~GATT_WRITE_CMD_MASK);