summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-01-14 14:49:50 -0800
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2025-01-14 14:49:50 -0800
commit3f9c5e8cc4e4e82e7ed4a2b739b90565d5d024dc (patch)
tree2023d2d9884c326d08542f04df787998f81a43ec
parent8dd614bab1cbf60064d929e6c0a6de0cf9c29f60 (diff)
parentbf27d6d0e706655a7e76bc179c83a8473e0584fa (diff)
Merge "gatt: Fix gatt_sr_is_cback_cnt_zero" into main
-rw-r--r--system/stack/gatt/gatt_int.h2
-rw-r--r--system/stack/gatt/gatt_sr.cc4
-rw-r--r--system/stack/gatt/gatt_utils.cc29
3 files changed, 24 insertions, 11 deletions
diff --git a/system/stack/gatt/gatt_int.h b/system/stack/gatt/gatt_int.h
index 906c99eb2f..4ba6d7d127 100644
--- a/system/stack/gatt/gatt_int.h
+++ b/system/stack/gatt/gatt_int.h
@@ -611,7 +611,7 @@ bool gatt_is_pending_mtu_exchange(tGATT_TCB* p_tcb);
void gatt_set_conn_id_waiting_for_mtu_exchange(tGATT_TCB* p_tcb, tCONN_ID conn_id);
void gatt_sr_copy_prep_cnt_to_cback_cnt(tGATT_TCB& p_tcb);
-bool gatt_sr_is_cback_cnt_zero(tGATT_TCB& p_tcb);
+bool gatt_sr_is_cback_cnt_zero(tGATT_TCB& p_tcb, uint16_t cid);
bool gatt_sr_is_prep_cnt_zero(tGATT_TCB& p_tcb);
void gatt_sr_reset_cback_cnt(tGATT_TCB& p_tcb, uint16_t cid);
void gatt_sr_reset_prep_cnt(tGATT_TCB& tcb);
diff --git a/system/stack/gatt/gatt_sr.cc b/system/stack/gatt/gatt_sr.cc
index 49c1ae452d..133080c1db 100644
--- a/system/stack/gatt/gatt_sr.cc
+++ b/system/stack/gatt/gatt_sr.cc
@@ -338,7 +338,7 @@ tGATT_STATUS gatt_sr_process_app_rsp(tGATT_TCB& tcb, tGATT_IF gatt_if, uint32_t
sr_res_p->status = status;
- if (gatt_sr_is_cback_cnt_zero(tcb) && status == GATT_SUCCESS) {
+ if (gatt_sr_is_cback_cnt_zero(tcb, sr_res_p->cid) && status == GATT_SUCCESS) {
if (sr_res_p->p_rsp_msg == NULL) {
sr_res_p->p_rsp_msg =
attp_build_sr_msg(tcb, (uint8_t)(op_code + 1), (tGATT_SR_MSG*)p_msg, payload_size);
@@ -347,7 +347,7 @@ tGATT_STATUS gatt_sr_process_app_rsp(tGATT_TCB& tcb, tGATT_IF gatt_if, uint32_t
}
}
}
- if (gatt_sr_is_cback_cnt_zero(tcb)) {
+ if (gatt_sr_is_cback_cnt_zero(tcb, sr_res_p->cid)) {
if ((sr_res_p->status == GATT_SUCCESS) && (sr_res_p->p_rsp_msg)) {
ret_code = attp_send_sr_msg(tcb, sr_res_p->cid, sr_res_p->p_rsp_msg);
sr_res_p->p_rsp_msg = NULL;
diff --git a/system/stack/gatt/gatt_utils.cc b/system/stack/gatt/gatt_utils.cc
index 57f781db3f..7a2dec07db 100644
--- a/system/stack/gatt/gatt_utils.cc
+++ b/system/stack/gatt/gatt_utils.cc
@@ -1362,17 +1362,30 @@ tGATT_SR_CMD* gatt_sr_get_cmd_by_trans_id(tGATT_TCB* p_tcb, uint32_t trans_id) {
* Returns True if thetotal application callback count is zero
*
******************************************************************************/
-bool gatt_sr_is_cback_cnt_zero(tGATT_TCB& tcb) {
- if (com::android::bluetooth::flags::gatt_client_dynamic_allocation()) {
- return tcb.sr_cmd.cback_cnt_map.empty();
+bool gatt_sr_is_cback_cnt_zero(tGATT_TCB& tcb, uint16_t cid) {
+ tGATT_SR_CMD* sr_cmd_p;
+ if (cid == tcb.att_lcid) {
+ sr_cmd_p = &tcb.sr_cmd;
} else {
- for (uint8_t i = 0; i < GATT_MAX_APPS; i++) {
- if (tcb.sr_cmd.cback_cnt[i]) {
- return false;
- }
+ EattChannel* channel = EattExtension::GetInstance()->FindEattChannelByCid(tcb.peer_bda, cid);
+ if (channel == nullptr) {
+ log::warn("{}, cid 0x{:02x} already disconnected", tcb.peer_bda, cid);
+ return true;
}
- return true;
+ sr_cmd_p = &channel->server_outstanding_cmd_;
+ }
+
+ if (com::android::bluetooth::flags::gatt_client_dynamic_allocation()) {
+ return sr_cmd_p->cback_cnt_map.empty();
}
+
+ for (uint8_t i = 0; i < GATT_MAX_APPS; i++) {
+ if (sr_cmd_p->cback_cnt[i] != 0) {
+ return false;
+ }
+ }
+
+ return true;
}
/*******************************************************************************