Loading system/stack/acl/acl.h 0 → 100644 +95 −0 Original line number Diff line number Diff line /* * Copyright 2020 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. */ #pragma once #include <stdint.h> #include "stack/include/bt_types.h" #include "types/raw_address.h" #define BTM_MAX_SCN_ 31 // PORT_MAX_RFC_PORTS packages/modules/Bluetooth/system/stack/include/rfcdefs.h /* Define the ACL Management control structure */ typedef struct { uint16_t hci_handle; uint16_t pkt_types_mask; uint16_t clock_offset; RawAddress remote_addr; DEV_CLASS remote_dc; BD_NAME remote_name; uint16_t manufacturer; uint16_t lmp_subversion; uint16_t link_super_tout; BD_FEATURES peer_lmp_feature_pages[HCI_EXT_FEATURES_PAGE_MAX + 1]; /* Peer LMP Extended features mask table for the device */ uint8_t num_read_pages; uint8_t lmp_version; bool in_use; uint8_t link_role; bool link_up_issued; /* True if busy_level link up has been issued */ #define BTM_ACL_SWKEY_STATE_IDLE 0 #define BTM_ACL_SWKEY_STATE_MODE_CHANGE 1 #define BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF 2 #define BTM_ACL_SWKEY_STATE_SWITCHING 3 #define BTM_ACL_SWKEY_STATE_ENCRYPTION_ON 4 #define BTM_ACL_SWKEY_STATE_IN_PROGRESS 5 uint8_t switch_role_state; #define BTM_MAX_SW_ROLE_FAILED_ATTEMPTS 3 uint8_t switch_role_failed_attempts; #define BTM_ACL_ENCRYPT_STATE_IDLE 0 #define BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF 1 /* encryption turning off */ #define BTM_ACL_ENCRYPT_STATE_TEMP_FUNC \ 2 /* temporarily off for change link key or role switch */ #define BTM_ACL_ENCRYPT_STATE_ENCRYPT_ON 3 /* encryption turning on */ uint8_t encrypt_state; /* overall BTM encryption state */ tBT_TRANSPORT transport; RawAddress conn_addr; /* local device address used for this connection */ uint8_t conn_addr_type; /* local device address type for this connection */ RawAddress active_remote_addr; /* remote address used on this connection */ uint8_t active_remote_addr_type; /* local device address type for this connection */ BD_FEATURES peer_le_features; /* Peer LE Used features mask for the device */ } tACL_CONN; typedef struct { /**************************************************** ** ACL Management ****************************************************/ tACL_CONN acl_db[MAX_L2CAP_LINKS]; uint8_t btm_scn[BTM_MAX_SCN_]; /* current SCNs: true if SCN is in use */ uint16_t btm_def_link_policy; uint16_t btm_def_link_super_tout; tBTM_BL_EVENT_MASK bl_evt_mask; tBTM_BL_CHANGE_CB* p_bl_changed_cb; /* Callback for when Busy Level changed */ uint8_t pm_pend_link; /* the index of acl_db, which has a pending PM cmd */ /* Packet types supported by the local device */ uint16_t btm_acl_pkt_types_supported; uint8_t acl_disc_reason; } tACL_CB; // NEW system/stack/avdt/avdt_l2c.cc +4 −3 Original line number Diff line number Diff line Loading @@ -198,8 +198,9 @@ void avdt_l2c_connect_ind_cback(const RawAddress& bd_addr, uint16_t lcid, tACL_CONN* p_acl_cb = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR); btm_set_packet_types( p_acl_cb, (btm_cb.btm_acl_pkt_types_supported | HCI_PKT_TYPES_MASK_NO_3_DH1 | HCI_PKT_TYPES_MASK_NO_3_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH5)); (btm_cb.acl_cb_.btm_acl_pkt_types_supported | HCI_PKT_TYPES_MASK_NO_3_DH1 | HCI_PKT_TYPES_MASK_NO_3_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH5)); } /* Check the security */ Loading Loading @@ -317,7 +318,7 @@ void avdt_l2c_connect_cfm_cback(uint16_t lcid, uint16_t result) { btm_bda_to_acl(p_ccb->peer_addr, BT_TRANSPORT_BR_EDR); btm_set_packet_types( p_acl_cb, (btm_cb.btm_acl_pkt_types_supported | (btm_cb.acl_cb_.btm_acl_pkt_types_supported | HCI_PKT_TYPES_MASK_NO_3_DH1 | HCI_PKT_TYPES_MASK_NO_3_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH5)); } Loading system/stack/btm/btm_acl.cc +58 −53 Original line number Diff line number Diff line Loading @@ -73,8 +73,8 @@ static void btm_process_remote_ext_features(tACL_CONN* p_acl_cb, void btm_acl_init(void) { BTM_TRACE_DEBUG("btm_acl_init"); /* Initialize nonzero defaults */ btm_cb.btm_def_link_super_tout = HCI_DEFAULT_INACT_TOUT; btm_cb.acl_disc_reason = 0xff; btm_cb.acl_cb_.btm_def_link_super_tout = HCI_DEFAULT_INACT_TOUT; btm_cb.acl_cb_.acl_disc_reason = 0xff; } /******************************************************************************* Loading @@ -93,7 +93,7 @@ void btm_acl_init(void) { * ******************************************************************************/ tACL_CONN* btm_bda_to_acl(const RawAddress& bda, tBT_TRANSPORT transport) { tACL_CONN* p = &btm_cb.acl_db[0]; tACL_CONN* p = &btm_cb.acl_cb_.acl_db[0]; uint16_t xx; for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { if ((p->in_use) && p->remote_addr == bda && p->transport == transport) { Loading @@ -117,7 +117,7 @@ tACL_CONN* btm_bda_to_acl(const RawAddress& bda, tBT_TRANSPORT transport) { * ******************************************************************************/ uint8_t btm_handle_to_acl_index(uint16_t hci_handle) { tACL_CONN* p = &btm_cb.acl_db[0]; tACL_CONN* p = &btm_cb.acl_cb_.acl_db[0]; uint8_t xx; BTM_TRACE_DEBUG("btm_handle_to_acl_index"); for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { Loading Loading @@ -204,12 +204,12 @@ void btm_acl_created(const RawAddress& bda, DEV_CLASS dc, BD_NAME bdn, p->link_role = link_role; p->transport = transport; VLOG(1) << "Duplicate btm_acl_created: RemBdAddr: " << bda; BTM_SetLinkPolicy(p->remote_addr, &btm_cb.btm_def_link_policy); BTM_SetLinkPolicy(p->remote_addr, &btm_cb.acl_cb_.btm_def_link_policy); return; } /* Allocate acl_db entry */ for (xx = 0, p = &btm_cb.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++) { for (xx = 0, p = &btm_cb.acl_cb_.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++) { if (!p->in_use) { p->in_use = true; p->hci_handle = hci_handle; Loading Loading @@ -297,7 +297,7 @@ void btm_acl_created(const RawAddress& bda, DEV_CLASS dc, BD_NAME bdn, void btm_acl_update_conn_addr(uint16_t conn_handle, const RawAddress& address) { uint8_t idx = btm_handle_to_acl_index(conn_handle); if (idx != MAX_L2CAP_LINKS) { btm_cb.acl_db[idx].conn_addr = address; btm_cb.acl_cb_.acl_db[idx].conn_addr = address; } } Loading Loading @@ -353,13 +353,13 @@ void btm_acl_removed(const RawAddress& bda, tBT_TRANSPORT transport) { p->link_up_issued = false; /* If anyone cares, indicate the database changed */ if (btm_cb.p_bl_changed_cb) { if (btm_cb.acl_cb_.p_bl_changed_cb) { tBTM_BL_EVENT_DATA evt_data; evt_data.event = BTM_BL_DISCN_EVT; evt_data.discn.p_bda = &bda; evt_data.discn.handle = p->hci_handle; evt_data.discn.transport = p->transport; (*btm_cb.p_bl_changed_cb)(&evt_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&evt_data); } btm_acl_update_busy_level(BTM_BLI_ACL_DOWN_EVT); Loading Loading @@ -411,7 +411,7 @@ void btm_acl_removed(const RawAddress& bda, tBT_TRANSPORT transport) { * ******************************************************************************/ void btm_acl_device_down(void) { tACL_CONN* p = &btm_cb.acl_db[0]; tACL_CONN* p = &btm_cb.acl_cb_.acl_db[0]; uint16_t xx; BTM_TRACE_DEBUG("btm_acl_device_down"); for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { Loading Loading @@ -481,10 +481,11 @@ void btm_acl_update_busy_level(tBTM_BLI_EVENT event) { evt.event = BTM_BL_UPDATE_EVT; evt.busy_level = busy_level; btm_cb.busy_level = busy_level; if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_UPDATE_MASK)) { if (btm_cb.acl_cb_.p_bl_changed_cb && (btm_cb.acl_cb_.bl_evt_mask & BTM_BL_UPDATE_MASK)) { tBTM_BL_EVENT_DATA btm_bl_event_data; btm_bl_event_data.update = evt; (*btm_cb.p_bl_changed_cb)(&btm_bl_event_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&btm_bl_event_data); } } } Loading Loading @@ -651,7 +652,7 @@ void btm_acl_encrypt_change(uint16_t handle, uint8_t status, xx = btm_handle_to_acl_index(handle); /* don't assume that we can never get a bad hci_handle */ if (xx < MAX_L2CAP_LINKS) p = &btm_cb.acl_db[xx]; p = &btm_cb.acl_cb_.acl_db[xx]; else return; Loading Loading @@ -681,7 +682,8 @@ void btm_acl_encrypt_change(uint16_t handle, uint8_t status, &p->remote_addr); /* if role change event is registered, report it now */ if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { if (btm_cb.acl_cb_.p_bl_changed_cb && (btm_cb.acl_cb_.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { tBTM_BL_ROLE_CHG_DATA evt; evt.event = BTM_BL_ROLE_CHG_EVT; evt.new_role = btm_cb.devcb.switch_role_ref_data.role; Loading @@ -689,7 +691,7 @@ void btm_acl_encrypt_change(uint16_t handle, uint8_t status, evt.hci_status = btm_cb.devcb.switch_role_ref_data.hci_status; tBTM_BL_EVENT_DATA btm_bl_event_data; btm_bl_event_data.role_chg = evt; (*btm_cb.p_bl_changed_cb)(&btm_bl_event_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&btm_bl_event_data); BTM_TRACE_DEBUG( "%s: Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d", Loading Loading @@ -782,7 +784,7 @@ void BTM_SetDefaultLinkPolicy(uint16_t settings) { BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy setting:0x%04x", settings); check_link_policy(&settings); btm_cb.btm_def_link_policy = settings; btm_cb.acl_cb_.btm_def_link_policy = settings; BTM_TRACE_DEBUG("Set DefaultLinkPolicy:0x%04x", settings); /* Set the default Link Policy of the controller */ Loading Loading @@ -839,7 +841,7 @@ void btm_use_preferred_conn_params(const RawAddress& bda) { * ******************************************************************************/ void btm_read_remote_version_complete(uint8_t* p) { tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; uint8_t status; uint16_t handle; int xx; Loading Loading @@ -957,7 +959,7 @@ void btm_read_remote_features(uint16_t handle) { return; } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; p_acl_cb->num_read_pages = 0; memset(p_acl_cb->peer_lmp_feature_pages, 0, sizeof(p_acl_cb->peer_lmp_feature_pages)); Loading Loading @@ -1019,7 +1021,7 @@ void btm_read_remote_features_complete(uint8_t* p) { return; } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; /* Copy the received features page */ STREAM_TO_ARRAY(p_acl_cb->peer_lmp_feature_pages[0], p, Loading Loading @@ -1102,7 +1104,7 @@ void btm_read_remote_ext_features_complete(uint8_t* p, uint8_t evt_len) { "invalid", page_num, max_page); } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; /* Copy the received features page */ STREAM_TO_ARRAY(p_acl_cb->peer_lmp_feature_pages[page_num], p, Loading Loading @@ -1154,7 +1156,7 @@ void btm_read_remote_ext_features_failed(uint8_t status, uint16_t handle) { return; } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; /* Process supported features only */ btm_process_remote_ext_features(p_acl_cb, 1); Loading Loading @@ -1182,10 +1184,11 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { /* For now there are a some devices that do not like sending */ /* commands events and data at the same time. */ /* Set the packet types to the default allowed by the device */ btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported); btm_set_packet_types(p_acl_cb, btm_cb.acl_cb_.btm_acl_pkt_types_supported); if (btm_cb.btm_def_link_policy) BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); if (btm_cb.acl_cb_.btm_def_link_policy) BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.acl_cb_.btm_def_link_policy); } #endif if (p_acl_cb->link_up_issued) { Loading @@ -1195,7 +1198,7 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { p_acl_cb->link_up_issued = true; /* If anyone cares, tell them that the database changed */ if (btm_cb.p_bl_changed_cb) { if (btm_cb.acl_cb_.p_bl_changed_cb) { evt_data.event = BTM_BL_CONN_EVT; evt_data.conn.p_bda = &p_acl_cb->remote_addr; evt_data.conn.p_bdn = p_acl_cb->remote_name; Loading @@ -1204,7 +1207,7 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { evt_data.conn.handle = p_acl_cb->hci_handle; evt_data.conn.transport = p_acl_cb->transport; (*btm_cb.p_bl_changed_cb)(&evt_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&evt_data); } btm_acl_update_busy_level(BTM_BLI_ACL_UP_EVT); } Loading @@ -1222,7 +1225,7 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { ******************************************************************************/ void BTM_SetDefaultLinkSuperTout(uint16_t timeout) { BTM_TRACE_DEBUG("BTM_SetDefaultLinkSuperTout"); btm_cb.btm_def_link_super_tout = timeout; btm_cb.acl_cb_.btm_def_link_super_tout = timeout; } /******************************************************************************* Loading Loading @@ -1317,7 +1320,7 @@ uint16_t BTM_GetNumAclLinks(void) { uint16_t num_acl = 0; for (uint16_t i = 0; i < MAX_L2CAP_LINKS; ++i) { if (btm_cb.acl_db[i].in_use) ++num_acl; if (btm_cb.acl_cb_.acl_db[i].in_use) ++num_acl; } return num_acl; Loading @@ -1334,7 +1337,7 @@ uint16_t BTM_GetNumAclLinks(void) { * ******************************************************************************/ uint16_t btm_get_acl_disc_reason_code(void) { uint8_t res = btm_cb.acl_disc_reason; uint8_t res = btm_cb.acl_cb_.acl_disc_reason; BTM_TRACE_DEBUG("btm_get_acl_disc_reason_code"); return (res); } Loading Loading @@ -1383,7 +1386,8 @@ void btm_process_clk_off_comp_evt(uint16_t hci_handle, uint16_t clock_offset) { BTM_TRACE_DEBUG("btm_process_clk_off_comp_evt"); /* Look up the connection by handle and set the current mode */ xx = btm_handle_to_acl_index(hci_handle); if (xx < MAX_L2CAP_LINKS) btm_cb.acl_db[xx].clock_offset = clock_offset; if (xx < MAX_L2CAP_LINKS) btm_cb.acl_cb_.acl_db[xx].clock_offset = clock_offset; } /******************************************************************************* Loading Loading @@ -1509,7 +1513,8 @@ void btm_acl_role_changed(uint8_t hci_status, const RawAddress* bd_addr, btm_acl_report_role_change(hci_status, bd_addr); /* if role change event is registered, report it now */ if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { if (btm_cb.acl_cb_.p_bl_changed_cb && (btm_cb.acl_cb_.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { tBTM_BL_ROLE_CHG_DATA evt; evt.event = BTM_BL_ROLE_CHG_EVT; evt.new_role = new_role; Loading @@ -1517,7 +1522,7 @@ void btm_acl_role_changed(uint8_t hci_status, const RawAddress* bd_addr, evt.hci_status = hci_status; tBTM_BL_EVENT_DATA btm_bl_event_data; btm_bl_event_data.role_chg = evt; (*btm_cb.p_bl_changed_cb)(&btm_bl_event_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&btm_bl_event_data); } BTM_TRACE_DEBUG( Loading Loading @@ -1562,8 +1567,8 @@ uint8_t BTM_AllocateSCN(void) { // stack reserves scn 1 for HFP, HSP we still do the correct way for (x = 1; x < BTM_MAX_SCN; x++) { if (!btm_cb.btm_scn[x]) { btm_cb.btm_scn[x] = true; if (!btm_cb.acl_cb_.btm_scn[x]) { btm_cb.acl_cb_.btm_scn[x] = true; return (x + 1); } } Loading @@ -1588,8 +1593,8 @@ bool BTM_TryAllocateSCN(uint8_t scn) { if ((scn >= BTM_MAX_SCN) || (scn == 1)) return false; /* check if this port is available */ if (!btm_cb.btm_scn[scn - 1]) { btm_cb.btm_scn[scn - 1] = true; if (!btm_cb.acl_cb_.btm_scn[scn - 1]) { btm_cb.acl_cb_.btm_scn[scn - 1] = true; return true; } Loading @@ -1608,7 +1613,7 @@ bool BTM_TryAllocateSCN(uint8_t scn) { bool BTM_FreeSCN(uint8_t scn) { BTM_TRACE_DEBUG("BTM_FreeSCN "); if (scn <= BTM_MAX_SCN) { btm_cb.btm_scn[scn - 1] = false; btm_cb.acl_cb_.btm_scn[scn - 1] = false; return (true); } else { return (false); /* Illegal SCN passed in */ Loading @@ -1631,12 +1636,12 @@ tBTM_STATUS btm_set_packet_types(tACL_CONN* p, uint16_t pkt_types) { BTM_TRACE_DEBUG("btm_set_packet_types"); /* Save in the ACL control blocks, types that we support */ temp_pkt_types = (pkt_types & BTM_ACL_SUPPORTED_PKTS_MASK & btm_cb.btm_acl_pkt_types_supported); btm_cb.acl_cb_.btm_acl_pkt_types_supported); /* OR in any exception packet types if at least 2.0 version of spec */ temp_pkt_types |= ((pkt_types & BTM_ACL_EXCEPTION_PKTS_MASK) | (btm_cb.btm_acl_pkt_types_supported & BTM_ACL_EXCEPTION_PKTS_MASK)); temp_pkt_types |= ((pkt_types & BTM_ACL_EXCEPTION_PKTS_MASK) | (btm_cb.acl_cb_.btm_acl_pkt_types_supported & BTM_ACL_EXCEPTION_PKTS_MASK)); /* Exclude packet types not supported by the peer */ btm_acl_chk_peer_pkt_type_support(p, &temp_pkt_types); Loading Loading @@ -1667,7 +1672,7 @@ uint16_t btm_get_max_packet_size(const RawAddress& addr) { } else { /* Special case for when info for the local device is requested */ if (addr == *controller_get_interface()->get_address()) { pkt_types = btm_cb.btm_acl_pkt_types_supported; pkt_types = btm_cb.acl_cb_.btm_acl_pkt_types_supported; } } Loading Loading @@ -1756,14 +1761,14 @@ tBTM_STATUS BTM_RegBusyLevelNotif(tBTM_BL_CHANGE_CB* p_cb, uint8_t* p_level, BTM_TRACE_DEBUG("BTM_RegBusyLevelNotif"); if (p_level) *p_level = btm_cb.busy_level; btm_cb.bl_evt_mask = evt_mask; btm_cb.acl_cb_.bl_evt_mask = evt_mask; if (!p_cb) btm_cb.p_bl_changed_cb = NULL; else if (btm_cb.p_bl_changed_cb) btm_cb.acl_cb_.p_bl_changed_cb = NULL; else if (btm_cb.acl_cb_.p_bl_changed_cb) return (BTM_BUSY); else btm_cb.p_bl_changed_cb = p_cb; btm_cb.acl_cb_.p_bl_changed_cb = p_cb; return (BTM_SUCCESS); } Loading Loading @@ -1958,7 +1963,7 @@ void btm_read_tx_power_timeout(UNUSED_ATTR void* data) { void btm_read_tx_power_complete(uint8_t* p, bool is_ble) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_tx_power_cmpl_cb; tBTM_TX_POWER_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_tx_power_timer); Loading Loading @@ -2027,7 +2032,7 @@ void btm_read_rssi_timeout(UNUSED_ATTR void* data) { void btm_read_rssi_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_rssi_cmpl_cb; tBTM_RSSI_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_rssi_timer); Loading Loading @@ -2093,7 +2098,7 @@ void btm_read_failed_contact_counter_timeout(UNUSED_ATTR void* data) { void btm_read_failed_contact_counter_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_failed_contact_counter_cmpl_cb; tBTM_FAILED_CONTACT_COUNTER_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_failed_contact_counter_timer); Loading Loading @@ -2160,7 +2165,7 @@ void btm_read_automatic_flush_timeout_timeout(UNUSED_ATTR void* data) { void btm_read_automatic_flush_timeout_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_automatic_flush_timeout_cmpl_cb; tBTM_AUTOMATIC_FLUSH_TIMEOUT_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_automatic_flush_timeout_timer); Loading Loading @@ -2224,7 +2229,7 @@ void btm_read_link_quality_timeout(UNUSED_ATTR void* data) { void btm_read_link_quality_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_link_qual_cmpl_cb; tBTM_LINK_QUALITY_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_link_quality_timer); Loading Loading @@ -2453,7 +2458,7 @@ void btm_acl_paging(BT_HDR* p, const RawAddress& bda) { ******************************************************************************/ bool btm_acl_notif_conn_collision(const RawAddress& bda) { /* Report possible collision to the upper layer. */ if (btm_cb.p_bl_changed_cb) { if (btm_cb.acl_cb_.p_bl_changed_cb) { VLOG(1) << __func__ << " RemBdAddr: " << bda; tBTM_BL_EVENT_DATA evt_data; Loading @@ -2461,7 +2466,7 @@ bool btm_acl_notif_conn_collision(const RawAddress& bda) { evt_data.conn.p_bda = &bda; evt_data.conn.transport = BT_TRANSPORT_BR_EDR; evt_data.conn.handle = BTM_INVALID_HCI_HANDLE; (*btm_cb.p_bl_changed_cb)(&evt_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&evt_data); return true; } else { return false; Loading system/stack/btm/btm_ble.cc +1 −1 Original line number Diff line number Diff line Loading @@ -281,7 +281,7 @@ bool BTM_IsBleConnection(uint16_t conn_handle) { xx = btm_handle_to_acl_index(conn_handle); if (xx >= MAX_L2CAP_LINKS) return false; p = &btm_cb.acl_db[xx]; p = &btm_cb.acl_cb_.acl_db[xx]; return (p->transport == BT_TRANSPORT_LE); } Loading system/stack/btm/btm_ble_gap.cc +2 −1 Original line number Diff line number Diff line Loading @@ -2270,7 +2270,8 @@ void btm_ble_read_remote_features_complete(uint8_t* p) { } if (status == HCI_SUCCESS) { STREAM_TO_ARRAY(btm_cb.acl_db[idx].peer_le_features, p, BD_FEATURES_LEN); STREAM_TO_ARRAY(btm_cb.acl_cb_.acl_db[idx].peer_le_features, p, BD_FEATURES_LEN); } btsnd_hcic_rmt_ver_req(handle); Loading Loading
system/stack/acl/acl.h 0 → 100644 +95 −0 Original line number Diff line number Diff line /* * Copyright 2020 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. */ #pragma once #include <stdint.h> #include "stack/include/bt_types.h" #include "types/raw_address.h" #define BTM_MAX_SCN_ 31 // PORT_MAX_RFC_PORTS packages/modules/Bluetooth/system/stack/include/rfcdefs.h /* Define the ACL Management control structure */ typedef struct { uint16_t hci_handle; uint16_t pkt_types_mask; uint16_t clock_offset; RawAddress remote_addr; DEV_CLASS remote_dc; BD_NAME remote_name; uint16_t manufacturer; uint16_t lmp_subversion; uint16_t link_super_tout; BD_FEATURES peer_lmp_feature_pages[HCI_EXT_FEATURES_PAGE_MAX + 1]; /* Peer LMP Extended features mask table for the device */ uint8_t num_read_pages; uint8_t lmp_version; bool in_use; uint8_t link_role; bool link_up_issued; /* True if busy_level link up has been issued */ #define BTM_ACL_SWKEY_STATE_IDLE 0 #define BTM_ACL_SWKEY_STATE_MODE_CHANGE 1 #define BTM_ACL_SWKEY_STATE_ENCRYPTION_OFF 2 #define BTM_ACL_SWKEY_STATE_SWITCHING 3 #define BTM_ACL_SWKEY_STATE_ENCRYPTION_ON 4 #define BTM_ACL_SWKEY_STATE_IN_PROGRESS 5 uint8_t switch_role_state; #define BTM_MAX_SW_ROLE_FAILED_ATTEMPTS 3 uint8_t switch_role_failed_attempts; #define BTM_ACL_ENCRYPT_STATE_IDLE 0 #define BTM_ACL_ENCRYPT_STATE_ENCRYPT_OFF 1 /* encryption turning off */ #define BTM_ACL_ENCRYPT_STATE_TEMP_FUNC \ 2 /* temporarily off for change link key or role switch */ #define BTM_ACL_ENCRYPT_STATE_ENCRYPT_ON 3 /* encryption turning on */ uint8_t encrypt_state; /* overall BTM encryption state */ tBT_TRANSPORT transport; RawAddress conn_addr; /* local device address used for this connection */ uint8_t conn_addr_type; /* local device address type for this connection */ RawAddress active_remote_addr; /* remote address used on this connection */ uint8_t active_remote_addr_type; /* local device address type for this connection */ BD_FEATURES peer_le_features; /* Peer LE Used features mask for the device */ } tACL_CONN; typedef struct { /**************************************************** ** ACL Management ****************************************************/ tACL_CONN acl_db[MAX_L2CAP_LINKS]; uint8_t btm_scn[BTM_MAX_SCN_]; /* current SCNs: true if SCN is in use */ uint16_t btm_def_link_policy; uint16_t btm_def_link_super_tout; tBTM_BL_EVENT_MASK bl_evt_mask; tBTM_BL_CHANGE_CB* p_bl_changed_cb; /* Callback for when Busy Level changed */ uint8_t pm_pend_link; /* the index of acl_db, which has a pending PM cmd */ /* Packet types supported by the local device */ uint16_t btm_acl_pkt_types_supported; uint8_t acl_disc_reason; } tACL_CB; // NEW
system/stack/avdt/avdt_l2c.cc +4 −3 Original line number Diff line number Diff line Loading @@ -198,8 +198,9 @@ void avdt_l2c_connect_ind_cback(const RawAddress& bd_addr, uint16_t lcid, tACL_CONN* p_acl_cb = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR); btm_set_packet_types( p_acl_cb, (btm_cb.btm_acl_pkt_types_supported | HCI_PKT_TYPES_MASK_NO_3_DH1 | HCI_PKT_TYPES_MASK_NO_3_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH5)); (btm_cb.acl_cb_.btm_acl_pkt_types_supported | HCI_PKT_TYPES_MASK_NO_3_DH1 | HCI_PKT_TYPES_MASK_NO_3_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH5)); } /* Check the security */ Loading Loading @@ -317,7 +318,7 @@ void avdt_l2c_connect_cfm_cback(uint16_t lcid, uint16_t result) { btm_bda_to_acl(p_ccb->peer_addr, BT_TRANSPORT_BR_EDR); btm_set_packet_types( p_acl_cb, (btm_cb.btm_acl_pkt_types_supported | (btm_cb.acl_cb_.btm_acl_pkt_types_supported | HCI_PKT_TYPES_MASK_NO_3_DH1 | HCI_PKT_TYPES_MASK_NO_3_DH3 | HCI_PKT_TYPES_MASK_NO_3_DH5)); } Loading
system/stack/btm/btm_acl.cc +58 −53 Original line number Diff line number Diff line Loading @@ -73,8 +73,8 @@ static void btm_process_remote_ext_features(tACL_CONN* p_acl_cb, void btm_acl_init(void) { BTM_TRACE_DEBUG("btm_acl_init"); /* Initialize nonzero defaults */ btm_cb.btm_def_link_super_tout = HCI_DEFAULT_INACT_TOUT; btm_cb.acl_disc_reason = 0xff; btm_cb.acl_cb_.btm_def_link_super_tout = HCI_DEFAULT_INACT_TOUT; btm_cb.acl_cb_.acl_disc_reason = 0xff; } /******************************************************************************* Loading @@ -93,7 +93,7 @@ void btm_acl_init(void) { * ******************************************************************************/ tACL_CONN* btm_bda_to_acl(const RawAddress& bda, tBT_TRANSPORT transport) { tACL_CONN* p = &btm_cb.acl_db[0]; tACL_CONN* p = &btm_cb.acl_cb_.acl_db[0]; uint16_t xx; for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { if ((p->in_use) && p->remote_addr == bda && p->transport == transport) { Loading @@ -117,7 +117,7 @@ tACL_CONN* btm_bda_to_acl(const RawAddress& bda, tBT_TRANSPORT transport) { * ******************************************************************************/ uint8_t btm_handle_to_acl_index(uint16_t hci_handle) { tACL_CONN* p = &btm_cb.acl_db[0]; tACL_CONN* p = &btm_cb.acl_cb_.acl_db[0]; uint8_t xx; BTM_TRACE_DEBUG("btm_handle_to_acl_index"); for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { Loading Loading @@ -204,12 +204,12 @@ void btm_acl_created(const RawAddress& bda, DEV_CLASS dc, BD_NAME bdn, p->link_role = link_role; p->transport = transport; VLOG(1) << "Duplicate btm_acl_created: RemBdAddr: " << bda; BTM_SetLinkPolicy(p->remote_addr, &btm_cb.btm_def_link_policy); BTM_SetLinkPolicy(p->remote_addr, &btm_cb.acl_cb_.btm_def_link_policy); return; } /* Allocate acl_db entry */ for (xx = 0, p = &btm_cb.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++) { for (xx = 0, p = &btm_cb.acl_cb_.acl_db[0]; xx < MAX_L2CAP_LINKS; xx++, p++) { if (!p->in_use) { p->in_use = true; p->hci_handle = hci_handle; Loading Loading @@ -297,7 +297,7 @@ void btm_acl_created(const RawAddress& bda, DEV_CLASS dc, BD_NAME bdn, void btm_acl_update_conn_addr(uint16_t conn_handle, const RawAddress& address) { uint8_t idx = btm_handle_to_acl_index(conn_handle); if (idx != MAX_L2CAP_LINKS) { btm_cb.acl_db[idx].conn_addr = address; btm_cb.acl_cb_.acl_db[idx].conn_addr = address; } } Loading Loading @@ -353,13 +353,13 @@ void btm_acl_removed(const RawAddress& bda, tBT_TRANSPORT transport) { p->link_up_issued = false; /* If anyone cares, indicate the database changed */ if (btm_cb.p_bl_changed_cb) { if (btm_cb.acl_cb_.p_bl_changed_cb) { tBTM_BL_EVENT_DATA evt_data; evt_data.event = BTM_BL_DISCN_EVT; evt_data.discn.p_bda = &bda; evt_data.discn.handle = p->hci_handle; evt_data.discn.transport = p->transport; (*btm_cb.p_bl_changed_cb)(&evt_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&evt_data); } btm_acl_update_busy_level(BTM_BLI_ACL_DOWN_EVT); Loading Loading @@ -411,7 +411,7 @@ void btm_acl_removed(const RawAddress& bda, tBT_TRANSPORT transport) { * ******************************************************************************/ void btm_acl_device_down(void) { tACL_CONN* p = &btm_cb.acl_db[0]; tACL_CONN* p = &btm_cb.acl_cb_.acl_db[0]; uint16_t xx; BTM_TRACE_DEBUG("btm_acl_device_down"); for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p++) { Loading Loading @@ -481,10 +481,11 @@ void btm_acl_update_busy_level(tBTM_BLI_EVENT event) { evt.event = BTM_BL_UPDATE_EVT; evt.busy_level = busy_level; btm_cb.busy_level = busy_level; if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_UPDATE_MASK)) { if (btm_cb.acl_cb_.p_bl_changed_cb && (btm_cb.acl_cb_.bl_evt_mask & BTM_BL_UPDATE_MASK)) { tBTM_BL_EVENT_DATA btm_bl_event_data; btm_bl_event_data.update = evt; (*btm_cb.p_bl_changed_cb)(&btm_bl_event_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&btm_bl_event_data); } } } Loading Loading @@ -651,7 +652,7 @@ void btm_acl_encrypt_change(uint16_t handle, uint8_t status, xx = btm_handle_to_acl_index(handle); /* don't assume that we can never get a bad hci_handle */ if (xx < MAX_L2CAP_LINKS) p = &btm_cb.acl_db[xx]; p = &btm_cb.acl_cb_.acl_db[xx]; else return; Loading Loading @@ -681,7 +682,8 @@ void btm_acl_encrypt_change(uint16_t handle, uint8_t status, &p->remote_addr); /* if role change event is registered, report it now */ if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { if (btm_cb.acl_cb_.p_bl_changed_cb && (btm_cb.acl_cb_.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { tBTM_BL_ROLE_CHG_DATA evt; evt.event = BTM_BL_ROLE_CHG_EVT; evt.new_role = btm_cb.devcb.switch_role_ref_data.role; Loading @@ -689,7 +691,7 @@ void btm_acl_encrypt_change(uint16_t handle, uint8_t status, evt.hci_status = btm_cb.devcb.switch_role_ref_data.hci_status; tBTM_BL_EVENT_DATA btm_bl_event_data; btm_bl_event_data.role_chg = evt; (*btm_cb.p_bl_changed_cb)(&btm_bl_event_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&btm_bl_event_data); BTM_TRACE_DEBUG( "%s: Role Switch Event: new_role 0x%02x, HCI Status 0x%02x, rs_st:%d", Loading Loading @@ -782,7 +784,7 @@ void BTM_SetDefaultLinkPolicy(uint16_t settings) { BTM_TRACE_DEBUG("BTM_SetDefaultLinkPolicy setting:0x%04x", settings); check_link_policy(&settings); btm_cb.btm_def_link_policy = settings; btm_cb.acl_cb_.btm_def_link_policy = settings; BTM_TRACE_DEBUG("Set DefaultLinkPolicy:0x%04x", settings); /* Set the default Link Policy of the controller */ Loading Loading @@ -839,7 +841,7 @@ void btm_use_preferred_conn_params(const RawAddress& bda) { * ******************************************************************************/ void btm_read_remote_version_complete(uint8_t* p) { tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; uint8_t status; uint16_t handle; int xx; Loading Loading @@ -957,7 +959,7 @@ void btm_read_remote_features(uint16_t handle) { return; } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; p_acl_cb->num_read_pages = 0; memset(p_acl_cb->peer_lmp_feature_pages, 0, sizeof(p_acl_cb->peer_lmp_feature_pages)); Loading Loading @@ -1019,7 +1021,7 @@ void btm_read_remote_features_complete(uint8_t* p) { return; } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; /* Copy the received features page */ STREAM_TO_ARRAY(p_acl_cb->peer_lmp_feature_pages[0], p, Loading Loading @@ -1102,7 +1104,7 @@ void btm_read_remote_ext_features_complete(uint8_t* p, uint8_t evt_len) { "invalid", page_num, max_page); } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; /* Copy the received features page */ STREAM_TO_ARRAY(p_acl_cb->peer_lmp_feature_pages[page_num], p, Loading Loading @@ -1154,7 +1156,7 @@ void btm_read_remote_ext_features_failed(uint8_t status, uint16_t handle) { return; } p_acl_cb = &btm_cb.acl_db[acl_idx]; p_acl_cb = &btm_cb.acl_cb_.acl_db[acl_idx]; /* Process supported features only */ btm_process_remote_ext_features(p_acl_cb, 1); Loading Loading @@ -1182,10 +1184,11 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { /* For now there are a some devices that do not like sending */ /* commands events and data at the same time. */ /* Set the packet types to the default allowed by the device */ btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported); btm_set_packet_types(p_acl_cb, btm_cb.acl_cb_.btm_acl_pkt_types_supported); if (btm_cb.btm_def_link_policy) BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); if (btm_cb.acl_cb_.btm_def_link_policy) BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.acl_cb_.btm_def_link_policy); } #endif if (p_acl_cb->link_up_issued) { Loading @@ -1195,7 +1198,7 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { p_acl_cb->link_up_issued = true; /* If anyone cares, tell them that the database changed */ if (btm_cb.p_bl_changed_cb) { if (btm_cb.acl_cb_.p_bl_changed_cb) { evt_data.event = BTM_BL_CONN_EVT; evt_data.conn.p_bda = &p_acl_cb->remote_addr; evt_data.conn.p_bdn = p_acl_cb->remote_name; Loading @@ -1204,7 +1207,7 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { evt_data.conn.handle = p_acl_cb->hci_handle; evt_data.conn.transport = p_acl_cb->transport; (*btm_cb.p_bl_changed_cb)(&evt_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&evt_data); } btm_acl_update_busy_level(BTM_BLI_ACL_UP_EVT); } Loading @@ -1222,7 +1225,7 @@ void btm_establish_continue(tACL_CONN* p_acl_cb) { ******************************************************************************/ void BTM_SetDefaultLinkSuperTout(uint16_t timeout) { BTM_TRACE_DEBUG("BTM_SetDefaultLinkSuperTout"); btm_cb.btm_def_link_super_tout = timeout; btm_cb.acl_cb_.btm_def_link_super_tout = timeout; } /******************************************************************************* Loading Loading @@ -1317,7 +1320,7 @@ uint16_t BTM_GetNumAclLinks(void) { uint16_t num_acl = 0; for (uint16_t i = 0; i < MAX_L2CAP_LINKS; ++i) { if (btm_cb.acl_db[i].in_use) ++num_acl; if (btm_cb.acl_cb_.acl_db[i].in_use) ++num_acl; } return num_acl; Loading @@ -1334,7 +1337,7 @@ uint16_t BTM_GetNumAclLinks(void) { * ******************************************************************************/ uint16_t btm_get_acl_disc_reason_code(void) { uint8_t res = btm_cb.acl_disc_reason; uint8_t res = btm_cb.acl_cb_.acl_disc_reason; BTM_TRACE_DEBUG("btm_get_acl_disc_reason_code"); return (res); } Loading Loading @@ -1383,7 +1386,8 @@ void btm_process_clk_off_comp_evt(uint16_t hci_handle, uint16_t clock_offset) { BTM_TRACE_DEBUG("btm_process_clk_off_comp_evt"); /* Look up the connection by handle and set the current mode */ xx = btm_handle_to_acl_index(hci_handle); if (xx < MAX_L2CAP_LINKS) btm_cb.acl_db[xx].clock_offset = clock_offset; if (xx < MAX_L2CAP_LINKS) btm_cb.acl_cb_.acl_db[xx].clock_offset = clock_offset; } /******************************************************************************* Loading Loading @@ -1509,7 +1513,8 @@ void btm_acl_role_changed(uint8_t hci_status, const RawAddress* bd_addr, btm_acl_report_role_change(hci_status, bd_addr); /* if role change event is registered, report it now */ if (btm_cb.p_bl_changed_cb && (btm_cb.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { if (btm_cb.acl_cb_.p_bl_changed_cb && (btm_cb.acl_cb_.bl_evt_mask & BTM_BL_ROLE_CHG_MASK)) { tBTM_BL_ROLE_CHG_DATA evt; evt.event = BTM_BL_ROLE_CHG_EVT; evt.new_role = new_role; Loading @@ -1517,7 +1522,7 @@ void btm_acl_role_changed(uint8_t hci_status, const RawAddress* bd_addr, evt.hci_status = hci_status; tBTM_BL_EVENT_DATA btm_bl_event_data; btm_bl_event_data.role_chg = evt; (*btm_cb.p_bl_changed_cb)(&btm_bl_event_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&btm_bl_event_data); } BTM_TRACE_DEBUG( Loading Loading @@ -1562,8 +1567,8 @@ uint8_t BTM_AllocateSCN(void) { // stack reserves scn 1 for HFP, HSP we still do the correct way for (x = 1; x < BTM_MAX_SCN; x++) { if (!btm_cb.btm_scn[x]) { btm_cb.btm_scn[x] = true; if (!btm_cb.acl_cb_.btm_scn[x]) { btm_cb.acl_cb_.btm_scn[x] = true; return (x + 1); } } Loading @@ -1588,8 +1593,8 @@ bool BTM_TryAllocateSCN(uint8_t scn) { if ((scn >= BTM_MAX_SCN) || (scn == 1)) return false; /* check if this port is available */ if (!btm_cb.btm_scn[scn - 1]) { btm_cb.btm_scn[scn - 1] = true; if (!btm_cb.acl_cb_.btm_scn[scn - 1]) { btm_cb.acl_cb_.btm_scn[scn - 1] = true; return true; } Loading @@ -1608,7 +1613,7 @@ bool BTM_TryAllocateSCN(uint8_t scn) { bool BTM_FreeSCN(uint8_t scn) { BTM_TRACE_DEBUG("BTM_FreeSCN "); if (scn <= BTM_MAX_SCN) { btm_cb.btm_scn[scn - 1] = false; btm_cb.acl_cb_.btm_scn[scn - 1] = false; return (true); } else { return (false); /* Illegal SCN passed in */ Loading @@ -1631,12 +1636,12 @@ tBTM_STATUS btm_set_packet_types(tACL_CONN* p, uint16_t pkt_types) { BTM_TRACE_DEBUG("btm_set_packet_types"); /* Save in the ACL control blocks, types that we support */ temp_pkt_types = (pkt_types & BTM_ACL_SUPPORTED_PKTS_MASK & btm_cb.btm_acl_pkt_types_supported); btm_cb.acl_cb_.btm_acl_pkt_types_supported); /* OR in any exception packet types if at least 2.0 version of spec */ temp_pkt_types |= ((pkt_types & BTM_ACL_EXCEPTION_PKTS_MASK) | (btm_cb.btm_acl_pkt_types_supported & BTM_ACL_EXCEPTION_PKTS_MASK)); temp_pkt_types |= ((pkt_types & BTM_ACL_EXCEPTION_PKTS_MASK) | (btm_cb.acl_cb_.btm_acl_pkt_types_supported & BTM_ACL_EXCEPTION_PKTS_MASK)); /* Exclude packet types not supported by the peer */ btm_acl_chk_peer_pkt_type_support(p, &temp_pkt_types); Loading Loading @@ -1667,7 +1672,7 @@ uint16_t btm_get_max_packet_size(const RawAddress& addr) { } else { /* Special case for when info for the local device is requested */ if (addr == *controller_get_interface()->get_address()) { pkt_types = btm_cb.btm_acl_pkt_types_supported; pkt_types = btm_cb.acl_cb_.btm_acl_pkt_types_supported; } } Loading Loading @@ -1756,14 +1761,14 @@ tBTM_STATUS BTM_RegBusyLevelNotif(tBTM_BL_CHANGE_CB* p_cb, uint8_t* p_level, BTM_TRACE_DEBUG("BTM_RegBusyLevelNotif"); if (p_level) *p_level = btm_cb.busy_level; btm_cb.bl_evt_mask = evt_mask; btm_cb.acl_cb_.bl_evt_mask = evt_mask; if (!p_cb) btm_cb.p_bl_changed_cb = NULL; else if (btm_cb.p_bl_changed_cb) btm_cb.acl_cb_.p_bl_changed_cb = NULL; else if (btm_cb.acl_cb_.p_bl_changed_cb) return (BTM_BUSY); else btm_cb.p_bl_changed_cb = p_cb; btm_cb.acl_cb_.p_bl_changed_cb = p_cb; return (BTM_SUCCESS); } Loading Loading @@ -1958,7 +1963,7 @@ void btm_read_tx_power_timeout(UNUSED_ATTR void* data) { void btm_read_tx_power_complete(uint8_t* p, bool is_ble) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_tx_power_cmpl_cb; tBTM_TX_POWER_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_tx_power_timer); Loading Loading @@ -2027,7 +2032,7 @@ void btm_read_rssi_timeout(UNUSED_ATTR void* data) { void btm_read_rssi_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_rssi_cmpl_cb; tBTM_RSSI_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_rssi_timer); Loading Loading @@ -2093,7 +2098,7 @@ void btm_read_failed_contact_counter_timeout(UNUSED_ATTR void* data) { void btm_read_failed_contact_counter_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_failed_contact_counter_cmpl_cb; tBTM_FAILED_CONTACT_COUNTER_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_failed_contact_counter_timer); Loading Loading @@ -2160,7 +2165,7 @@ void btm_read_automatic_flush_timeout_timeout(UNUSED_ATTR void* data) { void btm_read_automatic_flush_timeout_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_automatic_flush_timeout_cmpl_cb; tBTM_AUTOMATIC_FLUSH_TIMEOUT_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_automatic_flush_timeout_timer); Loading Loading @@ -2224,7 +2229,7 @@ void btm_read_link_quality_timeout(UNUSED_ATTR void* data) { void btm_read_link_quality_complete(uint8_t* p) { tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_link_qual_cmpl_cb; tBTM_LINK_QUALITY_RESULT result; tACL_CONN* p_acl_cb = &btm_cb.acl_db[0]; tACL_CONN* p_acl_cb = &btm_cb.acl_cb_.acl_db[0]; BTM_TRACE_DEBUG("%s", __func__); alarm_cancel(btm_cb.devcb.read_link_quality_timer); Loading Loading @@ -2453,7 +2458,7 @@ void btm_acl_paging(BT_HDR* p, const RawAddress& bda) { ******************************************************************************/ bool btm_acl_notif_conn_collision(const RawAddress& bda) { /* Report possible collision to the upper layer. */ if (btm_cb.p_bl_changed_cb) { if (btm_cb.acl_cb_.p_bl_changed_cb) { VLOG(1) << __func__ << " RemBdAddr: " << bda; tBTM_BL_EVENT_DATA evt_data; Loading @@ -2461,7 +2466,7 @@ bool btm_acl_notif_conn_collision(const RawAddress& bda) { evt_data.conn.p_bda = &bda; evt_data.conn.transport = BT_TRANSPORT_BR_EDR; evt_data.conn.handle = BTM_INVALID_HCI_HANDLE; (*btm_cb.p_bl_changed_cb)(&evt_data); (*btm_cb.acl_cb_.p_bl_changed_cb)(&evt_data); return true; } else { return false; Loading
system/stack/btm/btm_ble.cc +1 −1 Original line number Diff line number Diff line Loading @@ -281,7 +281,7 @@ bool BTM_IsBleConnection(uint16_t conn_handle) { xx = btm_handle_to_acl_index(conn_handle); if (xx >= MAX_L2CAP_LINKS) return false; p = &btm_cb.acl_db[xx]; p = &btm_cb.acl_cb_.acl_db[xx]; return (p->transport == BT_TRANSPORT_LE); } Loading
system/stack/btm/btm_ble_gap.cc +2 −1 Original line number Diff line number Diff line Loading @@ -2270,7 +2270,8 @@ void btm_ble_read_remote_features_complete(uint8_t* p) { } if (status == HCI_SUCCESS) { STREAM_TO_ARRAY(btm_cb.acl_db[idx].peer_le_features, p, BD_FEATURES_LEN); STREAM_TO_ARRAY(btm_cb.acl_cb_.acl_db[idx].peer_le_features, p, BD_FEATURES_LEN); } btsnd_hcic_rmt_ver_req(handle); Loading