summaryrefslogtreecommitdiff
path: root/system
diff options
context:
space:
mode:
author Pomai Ahlo <poahlo@google.com> 2025-02-03 15:14:03 -0800
committer Pomai Ahlo <poahlo@google.com> 2025-02-20 13:27:50 -0800
commit86d90eee9dd37eccdd19449b9d72b883df060f9b (patch)
tree38f05153ea151343762279bc1e16ff82d93ae889 /system
parent0503ef80d9d1f90c6ed28cda7dae07ec62706a9b (diff)
RFCOMM metrics V2: Collect metrics in bta
Collect RFCOMM metrics in bta layer: These are cases where the port never opened Bug: 374989690 Test: m com.android.bt && manual with Atom Tester Flag: EXEMPT metrics Change-Id: Ie109fab66cf0166cd1ccbb933fa44b1864dd760e
Diffstat (limited to 'system')
-rw-r--r--system/bta/Android.bp3
-rw-r--r--system/bta/BUILD.gn1
-rw-r--r--system/bta/ag/bta_ag_rfc.cc8
-rw-r--r--system/bta/ag/bta_ag_sdp.cc3
-rw-r--r--system/bta/hf_client/bta_hf_client_rfc.cc18
-rw-r--r--system/bta/hf_client/bta_hf_client_sdp.cc3
-rw-r--r--system/bta/jv/bta_jv_act.cc36
-rw-r--r--system/btif/Android.bp2
-rw-r--r--system/btif/src/btif_sock_rfc.cc3
-rw-r--r--system/test/Android.bp8
-rw-r--r--system/test/mock/mock_bta_rfc_metrics.cc34
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__);
+}