1 /* Copyright 2020 The Android Open Source Project 2 * 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #pragma once 17 18 #include <cstdint> 19 20 #include "stack/btm/btm_int_types.h" 21 #include "stack/include/acl_api_types.h" 22 #include "stack/include/bt_types.h" 23 #include "stack/include/btm_status.h" 24 #include "stack/include/hci_error_code.h" 25 #include "types/raw_address.h" 26 27 // Note: From stack/include/btm_api.h 28 29 /***************************************************************************** 30 * ACL CHANNEL MANAGEMENT FUNCTIONS 31 ****************************************************************************/ 32 bool BTM_is_sniff_allowed_for(const RawAddress& peer_addr); 33 34 void BTM_unblock_sniff_mode_for(const RawAddress& peer_addr); 35 void BTM_block_sniff_mode_for(const RawAddress& peer_addr); 36 void BTM_unblock_role_switch_for(const RawAddress& peer_addr); 37 void BTM_block_role_switch_for(const RawAddress& peer_addr); 38 39 void BTM_default_unblock_role_switch(); 40 void BTM_default_block_role_switch(); 41 42 void BTM_acl_after_controller_started(const controller_t* controller); 43 44 /******************************************************************************* 45 * 46 * Function BTM_SetLinkSuperTout 47 * 48 * Description Create and send HCI "Write Link Supervision Timeout" command 49 * 50 * Returns BTM_CMD_STARTED if successfully initiated, otherwise error 51 * 52 ******************************************************************************/ 53 tBTM_STATUS BTM_SetLinkSuperTout(const RawAddress& remote_bda, 54 uint16_t timeout); 55 /******************************************************************************* 56 * 57 * Function BTM_GetLinkSuperTout 58 * 59 * Description Read the link supervision timeout value of the connection 60 * 61 * Returns status of the operation 62 * 63 ******************************************************************************/ 64 tBTM_STATUS BTM_GetLinkSuperTout(const RawAddress& remote_bda, 65 uint16_t* p_timeout); 66 67 /******************************************************************************* 68 * 69 * Function BTM_IsAclConnectionUp 70 * 71 * Description This function is called to check if an ACL connection exists 72 * to a specific remote BD Address. The second version ensures 73 * the hci handle is valid (Unsure if needed) 74 * 75 * Returns true if connection is up, else false. 76 * 77 ******************************************************************************/ 78 bool BTM_IsAclConnectionUp(const RawAddress& remote_bda, 79 tBT_TRANSPORT transport); 80 81 bool BTM_IsAclConnectionUpAndHandleValid(const RawAddress& remote_bda, 82 tBT_TRANSPORT transport); 83 84 bool BTM_IsAclConnectionUpFromHandle(uint16_t hci_handle); 85 86 /******************************************************************************* 87 * 88 * Function BTM_GetRole 89 * 90 * Description This function is called to get the role of the local device 91 * for the ACL connection with the specified remote device 92 * 93 * Returns BTM_SUCCESS if connection exists. 94 * BTM_UNKNOWN_ADDR if no active link with bd addr specified 95 * 96 ******************************************************************************/ 97 tBTM_STATUS BTM_GetRole(const RawAddress& remote_bd_addr, tHCI_ROLE* p_role); 98 99 /******************************************************************************* 100 * 101 * Function BTM_SwitchRoleToCentral 102 * 103 * Description This function is called to switch role between central and 104 * peripheral. If role is already set it will do nothing. 105 * 106 * Returns BTM_SUCCESS if already in specified role. 107 * BTM_CMD_STARTED if command issued to controller. 108 * BTM_NO_RESOURCES if memory couldn't be allocated to issue 109 * the command 110 * BTM_UNKNOWN_ADDR if no active link with bd addr specified 111 * BTM_MODE_UNSUPPORTED if the local device does not support 112 * role switching 113 * 114 ******************************************************************************/ 115 tBTM_STATUS BTM_SwitchRoleToCentral(const RawAddress& remote_bd_addr); 116 117 /******************************************************************************* 118 * 119 * Function BTM_ReadRSSI 120 * 121 * Description This function is called to read the link policy settings. 122 * The address of link policy results are returned in the 123 * callback. (tBTM_RSSI_RESULT) 124 * 125 * Returns BTM_CMD_STARTED if command issued to controller. 126 * BTM_NO_RESOURCES if memory couldn't be allocated to issue 127 * the command 128 * BTM_UNKNOWN_ADDR if no active link with bd addr specified 129 * BTM_BUSY if command is already in progress 130 * 131 ******************************************************************************/ 132 tBTM_STATUS BTM_ReadRSSI(const RawAddress& remote_bda, tBTM_CMPL_CB* p_cb); 133 134 /******************************************************************************* 135 * 136 * Function BTM_ReadFailedContactCounter 137 * 138 * Description This function is called to read the failed contact counter. 139 * The result is returned in the callback. 140 * (tBTM_FAILED_CONTACT_COUNTER_RESULT) 141 * 142 * Returns BTM_CMD_STARTED if command issued to controller. 143 * BTM_NO_RESOURCES if memory couldn't be allocated to issue 144 * the command 145 * BTM_UNKNOWN_ADDR if no active link with bd addr specified 146 * BTM_BUSY if command is already in progress 147 * 148 ******************************************************************************/ 149 tBTM_STATUS BTM_ReadFailedContactCounter(const RawAddress& remote_bda, 150 tBTM_CMPL_CB* p_cb); 151 152 /******************************************************************************* 153 * 154 * Function BTM_ReadTxPower 155 * 156 * Description This function is called to read the current connection 157 * TX power of the connection. The TX power level results 158 * are returned in the callback. 159 * (tBTM_RSSI_RESULT) 160 * 161 * Returns BTM_CMD_STARTED if command issued to controller. 162 * BTM_NO_RESOURCES if memory couldn't be allocated to issue 163 * the command 164 * BTM_UNKNOWN_ADDR if no active link with bd addr specified 165 * BTM_BUSY if command is already in progress 166 * 167 ******************************************************************************/ 168 tBTM_STATUS BTM_ReadTxPower(const RawAddress& remote_bda, 169 tBT_TRANSPORT transport, tBTM_CMPL_CB* p_cb); 170 171 /******************************************************************************* 172 * 173 * Function BTM_GetNumAclLinks 174 * 175 * Description This function is called to count the number of 176 * ACL links that are active. 177 * 178 * Returns uint16_t Number of active ACL links 179 * 180 ******************************************************************************/ 181 uint16_t BTM_GetNumAclLinks(void); 182 183 void btm_set_packet_types_from_address(const RawAddress& bda, 184 uint16_t pkt_types); 185 186 #define BLE_RESOLVE_ADDR_MASK 0xc0 187 #define BLE_RESOLVE_ADDR_MSB 0x40 188 189 bool BTM_BLE_IS_RESOLVE_BDA(const RawAddress& x); 190 191 bool acl_refresh_remote_address(const RawAddress& identity_address, 192 tBLE_ADDR_TYPE identity_address_type, 193 const RawAddress& remote_bda, uint8_t rra_type, 194 const RawAddress& rpa); 195 196 void btm_establish_continue_from_address(const RawAddress& remote_bda, 197 tBT_TRANSPORT transport); 198 199 bool acl_peer_supports_ble_connection_parameters_request( 200 const RawAddress& remote_bda); 201 202 bool sco_peer_supports_esco_2m_phy(const RawAddress& remote_bda); 203 bool sco_peer_supports_esco_3m_phy(const RawAddress& remote_bda); 204 205 bool acl_peer_supports_ble_packet_extension(uint16_t hci_handle); 206 bool acl_peer_supports_ble_2m_phy(uint16_t hci_handle); 207 bool acl_peer_supports_ble_coded_phy(uint16_t hci_handle); 208 209 bool acl_is_switch_role_idle(const RawAddress& bd_addr, 210 tBT_TRANSPORT transport); 211 212 bool acl_peer_supports_ble_packet_extension(uint16_t hci_handle); 213 214 /******************************************************************************* 215 * 216 * Function BTM_ReadConnectionAddr 217 * 218 * Description Read the local device random address. 219 * 220 * Returns void 221 * 222 ******************************************************************************/ 223 void BTM_ReadConnectionAddr(const RawAddress& remote_bda, 224 RawAddress& local_conn_addr, 225 tBLE_ADDR_TYPE* p_addr_type); 226 227 /******************************************************************************* 228 * 229 * Function BTM_IsBleConnection 230 * 231 * Description This function is called to check if the connection handle 232 * for an LE link 233 * 234 * Returns true if connection is LE link, otherwise false. 235 * 236 ******************************************************************************/ 237 bool BTM_IsBleConnection(uint16_t hci_handle); 238 239 const RawAddress acl_address_from_handle(uint16_t hci_handle); 240 241 void btm_ble_refresh_local_resolvable_private_addr( 242 const RawAddress& pseudo_addr, const RawAddress& local_rpa); 243 244 void btm_cont_rswitch_from_handle(uint16_t hci_handle); 245 246 uint8_t acl_link_role_from_handle(uint16_t handle); 247 248 void acl_set_disconnect_reason(tHCI_STATUS acl_disc_reason); 249 250 bool acl_is_role_switch_allowed(); 251 252 uint16_t acl_get_supported_packet_types(); 253 254 bool acl_set_peer_le_features_from_handle(uint16_t hci_handle, 255 const uint8_t* p); 256 257 tBTM_STATUS btm_read_power_mode_state(const RawAddress& remote_bda, 258 tBTM_PM_STATE* pmState); 259 260 void btm_acl_notif_conn_collision(const RawAddress& bda); 261 262 void btm_acl_update_conn_addr(uint16_t conn_handle, const RawAddress& address); 263 264 /******************************************************************************* 265 * 266 * Function BTM_ReadPowerMode 267 * 268 * Description This returns the current mode for a specific 269 * ACL connection. 270 * 271 * Input Param remote_bda - device address of desired ACL connection 272 * 273 * Output Param p_mode - address where the current mode is copied into. 274 * BTM_ACL_MODE_NORMAL 275 * BTM_ACL_MODE_HOLD 276 * BTM_ACL_MODE_SNIFF 277 * BTM_ACL_MODE_PARK 278 * (valid only if return code is BTM_SUCCESS) 279 * 280 * Returns true if successful, false otherwise. 281 * 282 ******************************************************************************/ 283 bool BTM_ReadPowerMode(const RawAddress& remote_bda, tBTM_PM_MODE* p_mode); 284 285 void btm_acl_created(const RawAddress& bda, uint16_t hci_handle, 286 tHCI_ROLE link_role, tBT_TRANSPORT transport); 287 288 void btm_acl_removed(uint16_t handle); 289 290 void acl_disconnect_from_handle(uint16_t handle, tHCI_STATUS reason); 291 void acl_disconnect_after_role_switch(uint16_t conn_handle, tHCI_STATUS reason); 292 293 bool acl_peer_supports_sniff_subrating(const RawAddress& remote_bda); 294 295 void btm_acl_set_paging(bool value); 296 297 void btm_process_cancel_complete(uint8_t status, uint8_t mode); 298 299 uint8_t btm_handle_to_acl_index(uint16_t hci_handle); 300 301 tHCI_REASON btm_get_acl_disc_reason_code(void); 302 303 extern tBTM_STATUS btm_remove_acl(const RawAddress& bd_addr, 304 tBT_TRANSPORT transport); 305 306 void btm_acl_device_down(void); 307 void btm_acl_update_inquiry_status(uint8_t status); 308 309 void ACL_RegisterClient(struct acl_client_callback_s* callbacks); 310 void ACL_UnregisterClient(struct acl_client_callback_s* callbacks); 311 bool ACL_SupportTransparentSynchronousData(const RawAddress& bd_addr); 312 313 void acl_add_to_ignore_auto_connect_after_disconnect(const RawAddress& bd_addr); 314 bool acl_check_and_clear_ignore_auto_connect_after_disconnect( 315 const RawAddress& bd_addr); 316 void acl_clear_all_ignore_auto_connect_after_disconnect(); 317