diff options
-rw-r--r-- | system/bta/Android.bp | 3 | ||||
-rw-r--r-- | system/bta/BUILD.gn | 1 | ||||
-rw-r--r-- | system/bta/ag/bta_ag_rfc.cc | 8 | ||||
-rw-r--r-- | system/bta/ag/bta_ag_sdp.cc | 3 | ||||
-rw-r--r-- | system/bta/hf_client/bta_hf_client_rfc.cc | 18 | ||||
-rw-r--r-- | system/bta/hf_client/bta_hf_client_sdp.cc | 3 | ||||
-rw-r--r-- | system/bta/jv/bta_jv_act.cc | 36 | ||||
-rw-r--r-- | system/btif/Android.bp | 2 | ||||
-rw-r--r-- | system/btif/src/btif_sock_rfc.cc | 3 | ||||
-rw-r--r-- | system/test/Android.bp | 8 | ||||
-rw-r--r-- | system/test/mock/mock_bta_rfc_metrics.cc | 34 |
11 files changed, 105 insertions, 14 deletions
diff --git a/system/bta/Android.bp b/system/bta/Android.bp index f4685744ec..9eaf7c84b2 100644 --- a/system/bta/Android.bp +++ b/system/bta/Android.bp @@ -194,6 +194,7 @@ cc_library_static { "gatt/database_builder.cc", "jv/bta_jv_act.cc", "jv/bta_jv_api.cc", + "rfcomm/bta_rfcomm_metrics.cc", "rfcomm/bta_rfcomm_scn.cc", "sdp/bta_sdp.cc", "sdp/bta_sdp_act.cc", @@ -459,6 +460,7 @@ cc_test { srcs: [ ":TestCommonMockFunctions", ":TestFakeOsi", + ":TestMockBtaRfcMetrics", ":TestMockBtaSys", ":TestMockBtif", ":TestMockStackBtm", @@ -1462,6 +1464,7 @@ cc_test { ":TestFakeOsi", ":TestMockBtaGatt", ":TestMockBtaLeAudio", + ":TestMockBtaRfcMetrics", ":TestMockBtaScn", ":TestMockBtaSdp", ":TestMockBtaSys", diff --git a/system/bta/BUILD.gn b/system/bta/BUILD.gn index 425289338b..9c28016617 100644 --- a/system/bta/BUILD.gn +++ b/system/bta/BUILD.gn @@ -121,6 +121,7 @@ static_library("bta") { "ras/ras_client.cc", "ras/ras_server.cc", "ras/ras_utils.cc", + "rfcomm/bta_rfcomm_metrics.cc", "rfcomm/bta_rfcomm_scn.cc", "sdp/bta_sdp.cc", "sdp/bta_sdp_act.cc", diff --git a/system/bta/ag/bta_ag_rfc.cc b/system/bta/ag/bta_ag_rfc.cc index 58b7215a04..860709341c 100644 --- a/system/bta/ag/bta_ag_rfc.cc +++ b/system/bta/ag/bta_ag_rfc.cc @@ -29,6 +29,7 @@ #include <cstdint> #include "bta/ag/bta_ag_int.h" +#include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_sec_api.h" #include "bta_api.h" #include "stack/include/main_thread.h" @@ -257,6 +258,9 @@ void bta_ag_start_servers(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK services) { bta_ag_setup_port(p_scb, p_scb->serv_handle[i]); } else { /* TODO: CR#137125 to handle to error properly */ + bta_collect_rfc_metrics_after_port_fail(static_cast<tPORT_RESULT>(status), false, + tBTA_JV_STATUS::SUCCESS, p_scb->peer_addr, 0, + BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, true, 0); log::error( "RFCOMM_CreateConnectionWithSecurity ERROR {}, p_scb={}, " "services=0x{:x}, mgmt_cback_index={}", @@ -336,6 +340,10 @@ void bta_ag_rfc_do_open(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& data) { bta_ag_setup_port(p_scb, p_scb->conn_handle); } else { /* RFCOMM create connection failed; send ourselves RFCOMM close event */ + bta_collect_rfc_metrics_after_port_fail( + static_cast<tPORT_RESULT>(status), p_scb->sdp_metrics.sdp_initiated, + p_scb->sdp_metrics.status, p_scb->peer_addr, 0, BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, + true, p_scb->sdp_metrics.sdp_start_ms - p_scb->sdp_metrics.sdp_end_ms); log::error("RFCOMM_CreateConnection ERROR {} for {}", status, p_scb->peer_addr); bta_ag_sm_execute(p_scb, BTA_AG_RFC_CLOSE_EVT, data); } diff --git a/system/bta/ag/bta_ag_sdp.cc b/system/bta/ag/bta_ag_sdp.cc index 3172d8d45f..3870e01c4e 100644 --- a/system/bta/ag/bta_ag_sdp.cc +++ b/system/bta/ag/bta_ag_sdp.cc @@ -32,6 +32,7 @@ #include "bta/ag/bta_ag_int.h" #include "bta/include/bta_hfp_api.h" +#include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_rfcomm_scn.h" #include "bta_ag_api.h" #include "bta_api.h" @@ -540,6 +541,8 @@ void bta_ag_do_disc(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) { return; } else { log::error("failed to start SDP discovery for {}", p_scb->peer_addr); + bta_collect_rfc_metrics_after_sdp_fail(tBTA_JV_STATUS::FAILURE, p_scb->peer_addr, 0, + BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, false, 0); } } else { log::error("failed to init SDP discovery database for {}", p_scb->peer_addr); diff --git a/system/bta/hf_client/bta_hf_client_rfc.cc b/system/bta/hf_client/bta_hf_client_rfc.cc index 6e9655ac38..69d1525cfe 100644 --- a/system/bta/hf_client/bta_hf_client_rfc.cc +++ b/system/bta/hf_client/bta_hf_client_rfc.cc @@ -30,6 +30,7 @@ #include <cstdint> #include "bta/hf_client/bta_hf_client_int.h" +#include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_sec_api.h" #include "bta_sys.h" #include "osi/include/allocator.h" @@ -195,6 +196,9 @@ void bta_hf_client_start_server() { if (port_status == PORT_SUCCESS) { bta_hf_client_setup_port(bta_hf_client_cb_arr.serv_handle); } else { + bta_collect_rfc_metrics_after_port_fail(static_cast<tPORT_RESULT>(port_status), false, + tBTA_JV_STATUS::SUCCESS, RawAddress::kAny, 0, + BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, true, 0); log::verbose("RFCOMM_CreateConnection returned error:{}", port_status); } } @@ -240,14 +244,20 @@ void bta_hf_client_rfc_do_open(tBTA_HF_CLIENT_DATA* p_data) { return; } - if (RFCOMM_CreateConnectionWithSecurity( - UUID_SERVCLASS_HF_HANDSFREE, client_cb->peer_scn, false, BTA_HF_CLIENT_MTU, - client_cb->peer_addr, &(client_cb->conn_handle), bta_hf_client_mgmt_cback, - BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, RfcommCfgInfo{}) == PORT_SUCCESS) { + int status = RFCOMM_CreateConnectionWithSecurity( + UUID_SERVCLASS_HF_HANDSFREE, client_cb->peer_scn, false, BTA_HF_CLIENT_MTU, + client_cb->peer_addr, &(client_cb->conn_handle), bta_hf_client_mgmt_cback, + BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, RfcommCfgInfo{}); + if (status == PORT_SUCCESS) { bta_hf_client_setup_port(client_cb->conn_handle); log::verbose("bta_hf_client_rfc_do_open : conn_handle = {}", client_cb->conn_handle); } else { /* RFCOMM create connection failed; send ourselves RFCOMM close event */ + bta_collect_rfc_metrics_after_port_fail( + static_cast<tPORT_RESULT>(status), client_cb->sdp_metrics.sdp_initiated, + client_cb->sdp_metrics.status, client_cb->peer_addr, 0, + BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, true, + client_cb->sdp_metrics.sdp_start_ms - client_cb->sdp_metrics.sdp_end_ms); bta_hf_client_sm_execute(BTA_HF_CLIENT_RFC_CLOSE_EVT, p_data); } } diff --git a/system/bta/hf_client/bta_hf_client_sdp.cc b/system/bta/hf_client/bta_hf_client_sdp.cc index 02dfb37c85..c7b5ce7ceb 100644 --- a/system/bta/hf_client/bta_hf_client_sdp.cc +++ b/system/bta/hf_client/bta_hf_client_sdp.cc @@ -33,6 +33,7 @@ #include "bta/hf_client/bta_hf_client_int.h" #include "bta/include/bta_hf_client_api.h" +#include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_rfcomm_scn.h" #include "bta/sys/bta_sys.h" #include "bta_hfp_api.h" @@ -386,6 +387,8 @@ void bta_hf_client_do_disc(tBTA_HF_CLIENT_CB* client_cb) { if (!db_inited) { log::warn("Unable to start SDP service search request peer:{}", client_cb->peer_addr); + bta_collect_rfc_metrics_after_sdp_fail(tBTA_JV_STATUS::FAILURE, client_cb->peer_addr, 0, + BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT, false, 0); /*free discover db */ osi_free_and_reset((void**)&client_cb->p_disc_db); /* sent failed event */ diff --git a/system/bta/jv/bta_jv_act.cc b/system/bta/jv/bta_jv_act.cc index 1182411dd5..f0ccf28cf0 100644 --- a/system/bta/jv/bta_jv_act.cc +++ b/system/bta/jv/bta_jv_act.cc @@ -31,6 +31,7 @@ #include <unordered_set> #include "bta/include/bta_jv_co.h" +#include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_rfcomm_scn.h" #include "bta/jv/bta_jv_int.h" #include "bta/sys/bta_sys.h" @@ -1515,6 +1516,7 @@ void bta_jv_rfcomm_connect(tBTA_SEC sec_mask, uint8_t remote_scn, const RawAddre RfcommCfgInfo cfg, uint32_t app_uid, uint64_t sdp_duration_ms) { uint16_t handle = 0; uint32_t event_mask = BTA_JV_RFC_EV_MASK; + int port_status; PortSettings port_settings; tBTA_JV bta_jv = { @@ -1534,10 +1536,14 @@ void bta_jv_rfcomm_connect(tBTA_SEC sec_mask, uint8_t remote_scn, const RawAddre sec_mask, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0); - if (RFCOMM_CreateConnectionWithSecurity( - UUID_SERVCLASS_SERIAL_PORT, remote_scn, false, BTA_JV_DEF_RFC_MTU, peer_bd_addr, - &handle, bta_jv_port_mgmt_cl_cback, sec_mask, cfg) != PORT_SUCCESS) { + port_status = RFCOMM_CreateConnectionWithSecurity(UUID_SERVCLASS_SERIAL_PORT, remote_scn, false, + BTA_JV_DEF_RFC_MTU, peer_bd_addr, &handle, + bta_jv_port_mgmt_cl_cback, sec_mask, cfg); + if (port_status != PORT_SUCCESS) { log::error("RFCOMM_CreateConnection failed"); + bta_collect_rfc_metrics_after_port_fail( + static_cast<tPORT_RESULT>(port_status), sdp_duration_ms > 0, tBTA_JV_STATUS::SUCCESS, + peer_bd_addr, static_cast<int>(app_uid), sec_mask, false, sdp_duration_ms); bta_jv.rfc_cl_init.status = tBTA_JV_STATUS::FAILURE; } else { tBTA_JV_PCB* p_pcb; @@ -1765,6 +1771,7 @@ static void bta_jv_port_event_sr_cback(uint32_t code, uint16_t port_handle) { static tBTA_JV_PCB* bta_jv_add_rfc_port(tBTA_JV_RFC_CB* p_cb, tBTA_JV_PCB* p_pcb_open) { uint8_t used = 0, i, listen = 0; uint32_t si = 0; + int port_status; PortSettings port_settings; uint32_t event_mask = BTA_JV_RFC_EV_MASK; tBTA_JV_PCB* p_pcb = NULL; @@ -1802,10 +1809,10 @@ static tBTA_JV_PCB* bta_jv_add_rfc_port(tBTA_JV_RFC_CB* p_cb, tBTA_JV_PCB* p_pcb log::error("RFCOMM_CreateConnection failed: invalid port_handle"); } - if (RFCOMM_CreateConnectionWithSecurity(p_cb->sec_id, p_cb->scn, true, BTA_JV_DEF_RFC_MTU, - RawAddress::kAny, &(p_cb->rfc_hdl[si]), - bta_jv_port_mgmt_sr_cback, sec_mask, - RfcommCfgInfo{}) == PORT_SUCCESS) { + port_status = RFCOMM_CreateConnectionWithSecurity( + p_cb->sec_id, p_cb->scn, true, BTA_JV_DEF_RFC_MTU, RawAddress::kAny, + &(p_cb->rfc_hdl[si]), bta_jv_port_mgmt_sr_cback, sec_mask, RfcommCfgInfo{}); + if (port_status == PORT_SUCCESS) { p_cb->curr_sess++; p_pcb = &bta_jv_cb.port_cb[p_cb->rfc_hdl[si] - 1]; p_pcb->state = BTA_JV_ST_SR_LISTEN; @@ -1837,6 +1844,10 @@ static tBTA_JV_PCB* bta_jv_add_rfc_port(tBTA_JV_RFC_CB* p_cb, tBTA_JV_PCB* p_pcb log::verbose("p_pcb->handle=0x{:x}, curr_sess={}", p_pcb->handle, p_cb->curr_sess); } else { log::error("RFCOMM_CreateConnection failed"); + bta_collect_rfc_metrics_after_port_fail(static_cast<tPORT_RESULT>(port_status), false, + tBTA_JV_STATUS::SUCCESS, RawAddress::kAny, 0, + sec_mask, true, 0); + return NULL; } } else { @@ -1854,6 +1865,7 @@ void bta_jv_rfcomm_start_server(tBTA_SEC sec_mask, uint8_t local_scn, uint8_t ma RfcommCfgInfo cfg, uint32_t app_uid) { uint16_t handle = 0; uint32_t event_mask = BTA_JV_RFC_EV_MASK; + int port_status; PortSettings port_settings; tBTA_JV_RFC_CB* p_cb = NULL; tBTA_JV_PCB* p_pcb; @@ -1863,10 +1875,14 @@ void bta_jv_rfcomm_start_server(tBTA_SEC sec_mask, uint8_t local_scn, uint8_t ma evt_data.status = tBTA_JV_STATUS::FAILURE; do { - if (RFCOMM_CreateConnectionWithSecurity(0, local_scn, true, BTA_JV_DEF_RFC_MTU, - RawAddress::kAny, &handle, bta_jv_port_mgmt_sr_cback, - sec_mask, cfg) != PORT_SUCCESS) { + port_status = RFCOMM_CreateConnectionWithSecurity(0, local_scn, true, BTA_JV_DEF_RFC_MTU, + RawAddress::kAny, &handle, + bta_jv_port_mgmt_sr_cback, sec_mask, cfg); + if (port_status != PORT_SUCCESS) { log::error("RFCOMM_CreateConnection failed"); + bta_collect_rfc_metrics_after_port_fail(static_cast<tPORT_RESULT>(port_status), false, + tBTA_JV_STATUS::SUCCESS, RawAddress::kAny, + static_cast<int>(app_uid), sec_mask, true, 0); break; } diff --git a/system/btif/Android.bp b/system/btif/Android.bp index 5c82878a86..cbb42f1587 100644 --- a/system/btif/Android.bp +++ b/system/btif/Android.bp @@ -542,6 +542,7 @@ cc_test { ":TestMockBtaLeAudioHalVerifier", ":TestMockBtaPan", ":TestMockBtaRas", + ":TestMockBtaRfcMetrics", ":TestMockBtaScn", ":TestMockBtaSdp", ":TestMockBtaSys", @@ -661,6 +662,7 @@ cc_test { ":TestMockBtaLeAudioHalVerifier", ":TestMockBtaPan", ":TestMockBtaRas", + ":TestMockBtaRfcMetrics", ":TestMockBtaScn", ":TestMockBtaSdp", ":TestMockBtaSys", diff --git a/system/btif/src/btif_sock_rfc.cc b/system/btif/src/btif_sock_rfc.cc index 27db388700..1a115c4cac 100644 --- a/system/btif/src/btif_sock_rfc.cc +++ b/system/btif/src/btif_sock_rfc.cc @@ -28,6 +28,7 @@ #include <mutex> #include "bta/include/bta_jv_api.h" +#include "bta/include/bta_rfcomm_metrics.h" #include "bta/include/bta_rfcomm_scn.h" #include "btif/include/btif_metrics_logging.h" #include "btif/include/btif_sock.h" @@ -1134,6 +1135,8 @@ static void handle_discovery_comp(tBTA_JV_STATUS status, int scn, uint32_t id) { "SDP service discovery completed for slot_id: {} with the result " "status: {}, scn: {}", id, bta_jv_status_text(status), scn); + bta_collect_rfc_metrics_after_sdp_fail(status, slot->addr, slot->app_uid, slot->security, + static_cast<bool>(slot->f.server), sdp_duration_ms); cleanup_rfc_slot(slot); return; } diff --git a/system/test/Android.bp b/system/test/Android.bp index c965355dcc..9ed0a083b5 100644 --- a/system/test/Android.bp +++ b/system/test/Android.bp @@ -142,6 +142,13 @@ filegroup { } filegroup { + name: "TestMockBtaRfcMetrics", + srcs: [ + "mock/mock_bta_rfc_metrics.cc", + ], +} + +filegroup { name: "TestMockBtaScn", srcs: [ "mock/mock_bta_scn.cc", @@ -189,6 +196,7 @@ filegroup { ":TestMockBtaLeAudioHalVerifier", ":TestMockBtaPan", ":TestMockBtaRas", + ":TestMockBtaRfcMetrics", ":TestMockBtaSdp", ":TestMockBtaSys", ":TestMockBtaVc", diff --git a/system/test/mock/mock_bta_rfc_metrics.cc b/system/test/mock/mock_bta_rfc_metrics.cc new file mode 100644 index 0000000000..9c1c0cced2 --- /dev/null +++ b/system/test/mock/mock_bta_rfc_metrics.cc @@ -0,0 +1,34 @@ +/* + * Copyright 2025 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "bta/include/bta_jv_api.h" +#include "bta/include/bta_rfcomm_metrics.h" +#include "test/common/mock_functions.h" +#include "types/raw_address.h" + +void bta_collect_rfc_metrics_after_sdp_fail(tBTA_JV_STATUS /* sdp_status */, RawAddress /* addr */, + int /* app_uid */, int /* security */, + bool /* is_server */, uint64_t /* sdp_duration */) { + inc_func_call_count(__func__); +} + +void bta_collect_rfc_metrics_after_port_fail(tPORT_RESULT /* port_result */, + bool /* sdp_initiated */, + tBTA_JV_STATUS /* sdp_status */, RawAddress /* addr */, + int /* app_uid */, int /* security */, + bool /* is_server */, uint64_t /* sdp_duration_ms */) { + inc_func_call_count(__func__); +} |