From 857d085e9817806fe3a1070789a983de095e41bd Mon Sep 17 00:00:00 2001 From: Chris Manton Date: Tue, 4 May 2021 15:24:20 -0700 Subject: [PATCH] Const-ify bta/gatt/:: Api data param Towards immutable code Bug: 187830698 Test: gd/cert/run Tag: #refactor Change-Id: I72f919a9e19e3f7ca05ad36f4a0ca267e8bd5dfc --- bta/gatt/bta_gattc_act.cc | 74 ++++++++++++++++++++++------------------- bta/gatt/bta_gattc_cache.cc | 12 +++---- bta/gatt/bta_gattc_int.h | 80 ++++++++++++++++++++++++++------------------- bta/gatt/bta_gattc_main.cc | 8 ++--- bta/gatt/bta_gattc_utils.cc | 2 +- bta/test/bta_gatt_test.cc | 33 +++++++++++++++++++ 6 files changed, 131 insertions(+), 78 deletions(-) diff --git a/bta/gatt/bta_gattc_act.cc b/bta/gatt/bta_gattc_act.cc index 5dfa5cd0d..e2b95ffb2 100644 --- a/bta/gatt/bta_gattc_act.cc +++ b/bta/gatt/bta_gattc_act.cc @@ -244,7 +244,7 @@ void bta_gattc_deregister(tBTA_GATTC_RCB* p_clreg) { } /** process connect API request */ -void bta_gattc_process_api_open(tBTA_GATTC_DATA* p_msg) { +void bta_gattc_process_api_open(const tBTA_GATTC_DATA* p_msg) { uint16_t event = ((BT_HDR_RIGID*)p_msg)->event; tBTA_GATTC_RCB* p_clreg = bta_gattc_cl_get_regcb(p_msg->api_conn.client_if); @@ -274,7 +274,7 @@ void bta_gattc_process_api_open(tBTA_GATTC_DATA* p_msg) { } /** process connect API request */ -void bta_gattc_process_api_open_cancel(tBTA_GATTC_DATA* p_msg) { +void bta_gattc_process_api_open_cancel(const tBTA_GATTC_DATA* p_msg) { CHECK(p_msg != nullptr); uint16_t event = ((BT_HDR_RIGID*)p_msg)->event; @@ -322,7 +322,7 @@ void bta_gattc_process_enc_cmpl(tGATT_IF client_if, const RawAddress& bda) { } void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { tBTA_GATTC cb_data; cb_data.status = GATT_ERROR; @@ -332,7 +332,7 @@ void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB* p_clcb, } void bta_gattc_open_error(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { LOG(ERROR) << "Connection already opened. wrong state"; bta_gattc_send_open_cback(p_clcb->p_rcb, GATT_SUCCESS, p_clcb->bda, @@ -340,7 +340,7 @@ void bta_gattc_open_error(tBTA_GATTC_CLCB* p_clcb, } void bta_gattc_open_fail(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { LOG(WARNING) << __func__ << ": Cannot establish Connection. conn_id=" << loghex(p_clcb->bta_conn_id) << ". Return GATT_ERROR(" << +GATT_ERROR << ")"; @@ -352,7 +352,7 @@ void bta_gattc_open_fail(tBTA_GATTC_CLCB* p_clcb, } /** Process API connection function */ -void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { tBTA_GATTC_DATA gattc_data; /* open/hold a connection */ @@ -377,7 +377,7 @@ void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** Process API Open for a background connection */ -void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN* p_data, +void bta_gattc_init_bk_conn(const tBTA_GATTC_API_OPEN* p_data, tBTA_GATTC_RCB* p_clreg) { if (!bta_gattc_mark_bg_conn(p_data->client_if, p_data->remote_bda, true)) { bta_gattc_send_open_cback(p_clreg, GATT_NO_RESOURCES, p_data->remote_bda, @@ -410,11 +410,12 @@ void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN* p_data, gattc_data.hdr.layer_specific = p_clcb->bta_conn_id = conn_id; /* open connection */ - bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, &gattc_data); + bta_gattc_sm_execute(p_clcb, BTA_GATTC_INT_CONN_EVT, + static_cast(&gattc_data)); } /** Process API Cancel Open for a background connection */ -void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN* p_data) { +void bta_gattc_cancel_bk_conn(const tBTA_GATTC_API_CANCEL_OPEN* p_data) { tBTA_GATTC_RCB* p_clreg; tBTA_GATTC cb_data; cb_data.status = GATT_ERROR; @@ -435,7 +436,7 @@ void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN* p_data) { } void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { tBTA_GATTC cb_data; if (p_clcb->p_rcb->p_cback) { @@ -446,7 +447,8 @@ void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB* p_clcb, bta_gattc_clcb_dealloc(p_clcb); } -void bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data) { tBTA_GATTC cb_data; if (GATT_CancelConnect(p_clcb->p_rcb->client_if, @@ -461,7 +463,7 @@ void bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** receive connection callback from stack */ -void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { tGATT_IF gatt_if; VLOG(1) << __func__ << ": server cache state=" << +p_clcb->p_srcb->state; @@ -521,7 +523,8 @@ void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** close a connection */ -void bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data) { tBTA_GATTC cb_data; if (p_clcb->p_rcb->p_cback) { @@ -539,7 +542,7 @@ void bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** close a GATTC connection */ -void bta_gattc_close(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_close(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { tBTA_GATTC_CBACK* p_cback = p_clcb->p_rcb->p_cback; tBTA_GATTC_RCB* p_clreg = p_clcb->p_rcb; tBTA_GATTC cb_data; @@ -590,7 +593,8 @@ void bta_gattc_reset_discover_st(tBTA_GATTC_SERV* p_srcb, tGATT_STATUS status) { } /** close a GATTC connection while in discovery state */ -void bta_gattc_disc_close(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_disc_close(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data) { VLOG(1) << __func__ << ": Discovery cancel conn_id=" << loghex(p_clcb->bta_conn_id); @@ -626,13 +630,13 @@ void bta_gattc_set_discover_st(tBTA_GATTC_SERV* p_srcb) { * set status to be discovery cancel for current discovery. */ void bta_gattc_restart_discover(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { p_clcb->status = GATT_CANCEL; p_clcb->auto_update = BTA_GATTC_DISC_WAITING; } /** Configure MTU size on the GATT connection */ -void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { if (!bta_gattc_enqueue(p_clcb, p_data)) return; tGATT_STATUS status = @@ -664,7 +668,7 @@ void bta_gattc_start_discover_internal(tBTA_GATTC_CLCB* p_clcb) { /** Start a discovery on server */ void bta_gattc_start_discover(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { VLOG(1) << __func__ << ": conn_id:" << loghex(p_clcb->bta_conn_id) << " p_clcb->p_srcb->state:" << +p_clcb->p_srcb->state; @@ -710,8 +714,8 @@ void bta_gattc_start_discover(tBTA_GATTC_CLCB* p_clcb, /** discovery on server is finished */ void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { - tBTA_GATTC_DATA* p_q_cmd = p_clcb->p_q_cmd; + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { + const tBTA_GATTC_DATA* p_q_cmd = p_clcb->p_q_cmd; VLOG(1) << __func__ << ": conn_id=" << loghex(p_clcb->bta_conn_id); @@ -761,7 +765,7 @@ void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB* p_clcb, } /** Read an attribute */ -void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { if (!bta_gattc_enqueue(p_clcb, p_data)) return; tGATT_STATUS status; @@ -793,7 +797,8 @@ void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** read multiple */ -void bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data) { if (!bta_gattc_enqueue(p_clcb, p_data)) return; tGATT_READ_PARAM read_param; @@ -817,7 +822,7 @@ void bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** Write an attribute */ -void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { if (!bta_gattc_enqueue(p_clcb, p_data)) return; tGATT_STATUS status = GATT_SUCCESS; @@ -846,7 +851,7 @@ void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** send execute write */ -void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { if (!bta_gattc_enqueue(p_clcb, p_data)) return; tGATT_STATUS status = @@ -861,7 +866,7 @@ void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** send handle value confirmation */ -void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { uint16_t cid = p_data->api_confirm.cid; if (GATTC_SendHandleValueConfirm(p_data->api_confirm.hdr.layer_specific, @@ -878,7 +883,7 @@ void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { /** read complete */ static void bta_gattc_read_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data) { + const tBTA_GATTC_OP_CMPL* p_data) { GATT_READ_OP_CB cb = p_clcb->p_q_cmd->api_read.read_cb; void* my_cb_data = p_clcb->p_q_cmd->api_read.read_cb_data; @@ -899,7 +904,7 @@ static void bta_gattc_read_cmpl(tBTA_GATTC_CLCB* p_clcb, /** write complete */ static void bta_gattc_write_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data) { + const tBTA_GATTC_OP_CMPL* p_data) { GATT_WRITE_OP_CB cb = p_clcb->p_q_cmd->api_write.write_cb; void* my_cb_data = p_clcb->p_q_cmd->api_write.write_cb_data; @@ -913,7 +918,7 @@ static void bta_gattc_write_cmpl(tBTA_GATTC_CLCB* p_clcb, /** execute write complete */ static void bta_gattc_exec_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data) { + const tBTA_GATTC_OP_CMPL* p_data) { tBTA_GATTC cb_data; osi_free_and_reset((void**)&p_clcb->p_q_cmd); @@ -928,7 +933,7 @@ static void bta_gattc_exec_cmpl(tBTA_GATTC_CLCB* p_clcb, /** configure MTU operation complete */ static void bta_gattc_cfg_mtu_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data) { + const tBTA_GATTC_OP_CMPL* p_data) { GATT_CONFIGURE_MTU_OP_CB cb = p_clcb->p_q_cmd->api_mtu.mtu_cb; void* my_cb_data = p_clcb->p_q_cmd->api_mtu.mtu_cb_data; tBTA_GATTC cb_data; @@ -952,7 +957,7 @@ static void bta_gattc_cfg_mtu_cmpl(tBTA_GATTC_CLCB* p_clcb, } /** operation completed */ -void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { uint8_t op = (uint8_t)p_data->op_cmpl.op_code; uint8_t mapped_op = 0; @@ -990,7 +995,8 @@ void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { p_clcb->p_srcb->srvc_hdl_chg && op != GATTC_OPTYPE_CONFIG) { VLOG(1) << "Discard all responses when service change indication is " "received."; - p_data->op_cmpl.status = GATT_ERROR; + // TODO Fix constness + const_cast(p_data)->op_cmpl.status = GATT_ERROR; } /* service handle change void the response, discard it */ @@ -1031,7 +1037,7 @@ void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { } /** start a search in the local server cache */ -void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { tGATT_STATUS status = GATT_INTERNAL_ERROR; tBTA_GATTC cb_data; VLOG(1) << __func__ << ": conn_id=" << loghex(p_clcb->bta_conn_id); @@ -1049,13 +1055,13 @@ void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { /** enqueue a command into control block, usually because discovery operation is * busy */ -void bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +void bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { bta_gattc_enqueue(p_clcb, p_data); } /** report API call failure back to apps */ void bta_gattc_fail(tBTA_GATTC_CLCB* p_clcb, - UNUSED_ATTR tBTA_GATTC_DATA* p_data) { + UNUSED_ATTR const tBTA_GATTC_DATA* p_data) { if (p_clcb->status == GATT_SUCCESS) { LOG(ERROR) << "operation not supported at current state " << +p_clcb->state; } diff --git a/bta/gatt/bta_gattc_cache.cc b/bta/gatt/bta_gattc_cache.cc index e85d6de4a..9e4d44324 100644 --- a/bta/gatt/bta_gattc_cache.cc +++ b/bta/gatt/bta_gattc_cache.cc @@ -61,10 +61,10 @@ static void bta_gattc_explore_srvc_finished(uint16_t conn_id, tBTA_GATTC_SERV* p_srvc_cb); static void bta_gattc_read_db_hash_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data); + const tBTA_GATTC_OP_CMPL* p_data); static void bta_gattc_read_ext_prop_desc_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data); + const tBTA_GATTC_OP_CMPL* p_data); // define the max retry count for DATABASE_OUT_OF_SYNC #define BTA_GATTC_DISCOVER_RETRY_COUNT 2 @@ -367,7 +367,7 @@ static tGATT_STATUS bta_gattc_sdp_service_disc(uint16_t conn_id, /** operation completed */ void bta_gattc_op_cmpl_during_discovery(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data) { + const tBTA_GATTC_DATA* p_data) { // Currently, there are two cases needed to be handled. // 1. Read ext prop descriptor value after service discovery // 2. Read db hash before starting service discovery @@ -643,7 +643,7 @@ bool bta_gattc_read_db_hash(tBTA_GATTC_CLCB* p_clcb) { /* handle response of reading database hash */ static void bta_gattc_read_db_hash_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data) { + const tBTA_GATTC_OP_CMPL* p_data) { uint8_t op = (uint8_t)p_data->op_code; if (op != GATTC_OPTYPE_READ) { VLOG(1) << __func__ << ": op = " << +p_data->hdr.layer_specific; @@ -680,8 +680,8 @@ static void bta_gattc_read_db_hash_cmpl(tBTA_GATTC_CLCB* p_clcb, } /* handle response of reading extended properties descriptor */ -static void bta_gattc_read_ext_prop_desc_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_OP_CMPL* p_data) { +static void bta_gattc_read_ext_prop_desc_cmpl( + tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_OP_CMPL* p_data) { uint8_t op = (uint8_t)p_data->op_code; if (op != GATTC_OPTYPE_READ) { VLOG(1) << __func__ << ": op = " << +p_data->hdr.layer_specific; diff --git a/bta/gatt/bta_gattc_int.h b/bta/gatt/bta_gattc_int.h index de767222d..108b0e84d 100644 --- a/bta/gatt/bta_gattc_int.h +++ b/bta/gatt/bta_gattc_int.h @@ -250,7 +250,7 @@ typedef struct { tBT_TRANSPORT transport; /* channel transport */ tBTA_GATTC_RCB* p_rcb; /* pointer to the registration CB */ tBTA_GATTC_SERV* p_srcb; /* server cache CB */ - tBTA_GATTC_DATA* p_q_cmd; /* command in queue waiting for execution */ + const tBTA_GATTC_DATA* p_q_cmd; /* command in queue waiting for execution */ // request during discover state #define BTA_GATTC_DISCOVER_REQ_NONE 0 @@ -321,71 +321,84 @@ extern tBTA_GATTC_CB bta_gattc_cb; ****************************************************************************/ extern bool bta_gattc_hdl_event(BT_HDR_RIGID* p_msg); extern bool bta_gattc_sm_execute(tBTA_GATTC_CLCB* p_clcb, uint16_t event, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); /* function processed outside SM */ extern void bta_gattc_disable(); extern void bta_gattc_register(const bluetooth::Uuid& app_uuid, tBTA_GATTC_CBACK* p_data, BtaAppRegisterCallback cb, bool eatt_support); -extern void bta_gattc_process_api_open(tBTA_GATTC_DATA* p_msg); -extern void bta_gattc_process_api_open_cancel(tBTA_GATTC_DATA* p_msg); +extern void bta_gattc_process_api_open(const tBTA_GATTC_DATA* p_msg); +extern void bta_gattc_process_api_open_cancel(const tBTA_GATTC_DATA* p_msg); extern void bta_gattc_deregister(tBTA_GATTC_RCB* p_clreg); /* function within state machine */ -extern void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); +extern void bta_gattc_open(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_open_fail(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_open_error(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_cancel_open(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_cancel_open_ok(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_cancel_open_error(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); -extern void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); +extern void bta_gattc_conn(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); -extern void bta_gattc_close(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); +extern void bta_gattc_close(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_close_fail(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_disc_close(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_start_discover(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_start_discover_internal(tBTA_GATTC_CLCB* p_clcb); extern void bta_gattc_disc_cmpl(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); -extern void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); -extern void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); -extern void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); -extern void bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); -extern void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); -extern void bta_gattc_fail(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); -extern void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); -extern void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_read(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_write(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_op_cmpl(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_q_cmd(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_search(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_fail(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_confirm(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_execute(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_read_multi(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); -extern void bta_gattc_ci_open(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); +extern void bta_gattc_ci_open(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_ci_close(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_op_cmpl_during_discovery(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_restart_discover(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_msg); -extern void bta_gattc_init_bk_conn(tBTA_GATTC_API_OPEN* p_data, + const tBTA_GATTC_DATA* p_msg); +extern void bta_gattc_init_bk_conn(const tBTA_GATTC_API_OPEN* p_data, tBTA_GATTC_RCB* p_clreg); -extern void bta_gattc_cancel_bk_conn(tBTA_GATTC_API_CANCEL_OPEN* p_data); +extern void bta_gattc_cancel_bk_conn(const tBTA_GATTC_API_CANCEL_OPEN* p_data); extern void bta_gattc_send_open_cback(tBTA_GATTC_RCB* p_clreg, tGATT_STATUS status, const RawAddress& remote_bda, uint16_t conn_id, tBT_TRANSPORT transport, uint16_t mtu); extern void bta_gattc_process_api_refresh(const RawAddress& remote_bda); -extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); +extern void bta_gattc_cfg_mtu(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); extern void bta_gattc_listen(tBTA_GATTC_DATA* p_msg); extern void bta_gattc_broadcast(tBTA_GATTC_DATA* p_msg); @@ -408,7 +421,8 @@ extern tBTA_GATTC_SERV* bta_gattc_find_scb_by_cid(uint16_t conn_id); extern tBTA_GATTC_CLCB* bta_gattc_find_int_conn_clcb(tBTA_GATTC_DATA* p_msg); extern tBTA_GATTC_CLCB* bta_gattc_find_int_disconn_clcb(tBTA_GATTC_DATA* p_msg); -extern bool bta_gattc_enqueue(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data); +extern bool bta_gattc_enqueue(tBTA_GATTC_CLCB* p_clcb, + const tBTA_GATTC_DATA* p_data); extern bool bta_gattc_check_notif_registry(tBTA_GATTC_RCB* p_clreg, tBTA_GATTC_SERV* p_srcb, diff --git a/bta/gatt/bta_gattc_main.cc b/bta/gatt/bta_gattc_main.cc index 0227ce32a..b93881e24 100644 --- a/bta/gatt/bta_gattc_main.cc +++ b/bta/gatt/bta_gattc_main.cc @@ -65,7 +65,7 @@ enum { }; /* type for action functions */ typedef void (*tBTA_GATTC_ACTION)(tBTA_GATTC_CLCB* p_clcb, - tBTA_GATTC_DATA* p_data); + const tBTA_GATTC_DATA* p_data); /* action function list */ const tBTA_GATTC_ACTION bta_gattc_action[] = { @@ -296,7 +296,7 @@ static const char* gattc_state_code(tBTA_GATTC_STATE state_code); * ******************************************************************************/ bool bta_gattc_sm_execute(tBTA_GATTC_CLCB* p_clcb, uint16_t event, - tBTA_GATTC_DATA* p_data) { + const tBTA_GATTC_DATA* p_data) { tBTA_GATTC_ST_TBL state_table; uint8_t action; int i; @@ -386,8 +386,8 @@ bool bta_gattc_hdl_event(BT_HDR_RIGID* p_msg) { p_clcb = bta_gattc_find_clcb_by_conn_id(p_msg->layer_specific); if (p_clcb != NULL) { - rt = - bta_gattc_sm_execute(p_clcb, p_msg->event, (tBTA_GATTC_DATA*)p_msg); + rt = bta_gattc_sm_execute(p_clcb, p_msg->event, + (const tBTA_GATTC_DATA*)p_msg); } else { VLOG(1) << "Ignore unknown conn ID: " << +p_msg->layer_specific; } diff --git a/bta/gatt/bta_gattc_utils.cc b/bta/gatt/bta_gattc_utils.cc index a2911437f..2da0739d9 100644 --- a/bta/gatt/bta_gattc_utils.cc +++ b/bta/gatt/bta_gattc_utils.cc @@ -322,7 +322,7 @@ tBTA_GATTC_SERV* bta_gattc_srcb_alloc(const RawAddress& bda) { * Returns success or failure. * ******************************************************************************/ -bool bta_gattc_enqueue(tBTA_GATTC_CLCB* p_clcb, tBTA_GATTC_DATA* p_data) { +bool bta_gattc_enqueue(tBTA_GATTC_CLCB* p_clcb, const tBTA_GATTC_DATA* p_data) { if (p_clcb->p_q_cmd == NULL) { p_clcb->p_q_cmd = p_data; return true; diff --git a/bta/test/bta_gatt_test.cc b/bta/test/bta_gatt_test.cc index 8e0552a79..a95ae46a5 100644 --- a/bta/test/bta_gatt_test.cc +++ b/bta/test/bta_gatt_test.cc @@ -260,3 +260,36 @@ TEST_F(BtaGattTest, bta_gattc_op_cmpl_execute) { ASSERT_EQ(BTA_GATTC_EXEC_EVT, param::bta_gattc_event_complete_callback.event); ASSERT_EQ(1, mock_function_count_map["osi_free_and_reset"]); } + +TEST_F(BtaGattTest, bta_gattc_op_cmpl_read_interrupted) { + command_queue = { + .api_read = // tBTA_GATTC_API_READ + { + .hdr = + { + .event = BTA_GATTC_API_READ_EVT, + }, + .handle = 123, + .read_cb = bta_gatt_read_complete_callback, + .read_cb_data = static_cast(this), + }, + }; + + client_channel_control_block.p_q_cmd = &command_queue; + + // Create interrupt condition + client_channel_control_block.auto_update = BTA_GATTC_DISC_WAITING; + client_channel_control_block.p_srcb->srvc_hdl_chg = 1; + + tBTA_GATTC_DATA data = { + .op_cmpl = + { + .op_code = GATTC_OPTYPE_READ, + .status = GATT_OUT_OF_RANGE, + .p_cmpl = &gatt_cl_complete, + }, + }; + + bta_gattc_op_cmpl(&client_channel_control_block, &data); + ASSERT_EQ(GATT_ERROR, param::bta_gatt_read_complete_callback.status); +} -- 2.11.0