1 /****************************************************************************** 2 * 3 * Copyright (C) 1999-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 #ifndef BTM_BLE_INT_TYPES_H 20 #define BTM_BLE_INT_TYPES_H 21 22 #include "osi/include/alarm.h" 23 24 /* scanning enable status */ 25 #define BTM_BLE_SCAN_ENABLE 0x01 26 #define BTM_BLE_SCAN_DISABLE 0x00 27 28 /* advertising enable status */ 29 #define BTM_BLE_ADV_ENABLE 0x01 30 #define BTM_BLE_ADV_DISABLE 0x00 31 32 /* use the high 4 bits unused by inquiry mode */ 33 #define BTM_BLE_SELECT_SCAN 0x20 34 #define BTM_BLE_NAME_REQUEST 0x40 35 #define BTM_BLE_OBSERVE 0x80 36 37 #define BTM_BLE_MAX_WL_ENTRY 1 38 #define BTM_BLE_AD_DATA_LEN 31 39 40 #define BTM_BLE_ENC_MASK 0x03 41 42 #define BTM_BLE_DUPLICATE_ENABLE 1 43 #define BTM_BLE_DUPLICATE_DISABLE 0 44 45 /* Interval(scan_int) = 11.25 ms= 0x0010 * 0.625 ms */ 46 #define BTM_BLE_GAP_DISC_SCAN_INT 18 47 /* scan_window = 11.25 ms= 0x0010 * 0.625 ms */ 48 #define BTM_BLE_GAP_DISC_SCAN_WIN 18 49 /* Tgap(gen_disc) = 1.28 s= 512 * 0.625 ms */ 50 #define BTM_BLE_GAP_ADV_INT 512 51 /* Tgap(lim_timeout) = 180s max */ 52 #define BTM_BLE_GAP_LIM_TIMEOUT_MS (180 * 1000) 53 /* Interval(scan_int) = 5s= 8000 * 0.625 ms */ 54 #define BTM_BLE_LOW_LATENCY_SCAN_INT 8000 55 /* scan_window = 5s= 8000 * 0.625 ms */ 56 #define BTM_BLE_LOW_LATENCY_SCAN_WIN 8000 57 58 /* TGAP(adv_fast_interval1) = 30(used) ~ 60 ms = 48 *0.625 */ 59 #define BTM_BLE_GAP_ADV_FAST_INT_1 48 60 /* TGAP(adv_fast_interval2) = 100(used) ~ 150 ms = 160 * 0.625 ms */ 61 #define BTM_BLE_GAP_ADV_FAST_INT_2 160 62 /* Tgap(adv_slow_interval) = 1.28 s= 512 * 0.625 ms */ 63 #define BTM_BLE_GAP_ADV_SLOW_INT 2048 64 /* Tgap(dir_conn_adv_int_max) = 500 ms = 800 * 0.625 ms */ 65 #define BTM_BLE_GAP_ADV_DIR_MAX_INT 800 66 /* Tgap(dir_conn_adv_int_min) = 250 ms = 400 * 0.625 ms */ 67 #define BTM_BLE_GAP_ADV_DIR_MIN_INT 400 68 69 #define BTM_BLE_GAP_FAST_ADV_TIMEOUT_MS (30 * 1000) 70 71 #define BTM_BLE_SEC_REQ_ACT_NONE 0 72 /* encrypt the link using current key or key refresh */ 73 #define BTM_BLE_SEC_REQ_ACT_ENCRYPT 1 74 #define BTM_BLE_SEC_REQ_ACT_PAIR 2 75 /* discard the sec request while encryption is started but not completed */ 76 #define BTM_BLE_SEC_REQ_ACT_DISCARD 3 77 typedef uint8_t tBTM_BLE_SEC_REQ_ACT; 78 79 #define BLE_STATIC_PRIVATE_MSB_MASK 0x3f 80 /* most significant bit, bit7, bit6 is 01 to be resolvable random */ 81 #define BLE_RESOLVE_ADDR_MSB 0x40 82 /* bit 6, and bit7 */ 83 #define BLE_RESOLVE_ADDR_MASK 0xc0 84 #define BTM_BLE_IS_RESOLVE_BDA(x) \ 85 (((x)[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB) 86 87 #define BLE_PUBLIC_ADDR_MSB_MASK 0xC0 88 /* most significant bit, bit7, bit6 is 10 to be public address*/ 89 #define BLE_PUBLIC_ADDR_MSB 0x80 90 #define BTM_IS_PUBLIC_BDA(x) \ 91 (((x)[0] & BLE_PUBLIC_ADDR_MSB_MASK) == BLE_PUBLIC_ADDR_MSB) 92 93 /* LE scan activity bit mask, continue with LE inquiry bits */ 94 /* observe is in progress */ 95 #define BTM_LE_OBSERVE_ACTIVE 0x80 96 97 /* BLE scan activity mask checking */ 98 #define BTM_BLE_IS_SCAN_ACTIVE(x) ((x)&BTM_BLE_SCAN_ACTIVE_MASK) 99 #define BTM_BLE_IS_INQ_ACTIVE(x) ((x)&BTM_BLE_INQUIRY_MASK) 100 #define BTM_BLE_IS_OBS_ACTIVE(x) ((x)&BTM_LE_OBSERVE_ACTIVE) 101 102 /* BLE ADDR type ID bit */ 103 #define BLE_ADDR_TYPE_ID_BIT 0x02 104 105 #define BTM_VSC_CHIP_CAPABILITY_L_VERSION 55 106 #define BTM_VSC_CHIP_CAPABILITY_M_VERSION 95 107 108 typedef struct { 109 uint16_t data_mask; 110 uint8_t* p_flags; 111 uint8_t ad_data[BTM_BLE_AD_DATA_LEN]; 112 uint8_t* p_pad; 113 } tBTM_BLE_LOCAL_ADV_DATA; 114 115 typedef struct { 116 /* Used for determining if a response has already been received for the 117 * current inquiry operation. (We do not want to flood the caller with 118 * multiple responses from the same device. */ 119 uint32_t inq_count; 120 bool scan_rsp; 121 tBLE_BD_ADDR le_bda; 122 } tINQ_LE_BDADDR; 123 124 #define BTM_BLE_ISVALID_PARAM(x, min, max) \ 125 (((x) >= (min) && (x) <= (max)) || ((x) == BTM_BLE_CONN_PARAM_UNDEF)) 126 127 /* 15 minutes minimum for random address refreshing */ 128 #define BTM_BLE_PRIVATE_ADDR_INT_MS (15 * 60 * 1000) 129 130 typedef struct { 131 uint16_t discoverable_mode; 132 uint16_t connectable_mode; 133 uint32_t scan_window; 134 uint32_t scan_interval; 135 uint8_t scan_type; /* current scan type: active or passive */ 136 uint8_t scan_duplicate_filter; /* duplicate filter enabled for scan */ 137 uint16_t adv_interval_min; 138 uint16_t adv_interval_max; 139 tBTM_BLE_AFP afp; /* advertising filter policy */ 140 tBTM_BLE_SFP sfp; /* scanning filter policy */ 141 142 tBLE_ADDR_TYPE adv_addr_type; 143 uint8_t evt_type; 144 uint8_t adv_mode; 145 tBLE_BD_ADDR direct_bda; 146 tBTM_BLE_EVT directed_conn; 147 bool fast_adv_on; 148 alarm_t* fast_adv_timer; 149 150 /* inquiry BD addr database */ 151 uint8_t num_bd_entries; 152 uint8_t max_bd_entries; 153 tBTM_BLE_LOCAL_ADV_DATA adv_data; 154 tBTM_BLE_ADV_CHNL_MAP adv_chnl_map; 155 156 alarm_t* inquiry_timer; 157 bool scan_rsp; 158 uint8_t state; /* Current state that the inquiry process is in */ 159 int8_t tx_power; 160 } tBTM_BLE_INQ_CB; 161 162 /* random address resolving complete callback */ 163 typedef void(tBTM_BLE_RESOLVE_CBACK)(void* match_rec, void* p); 164 165 typedef void(tBTM_BLE_ADDR_CBACK)(BD_ADDR_PTR static_random, void* p); 166 167 /* random address management control block */ 168 typedef struct { 169 tBLE_ADDR_TYPE own_addr_type; /* local device LE address type */ 170 BD_ADDR private_addr; 171 BD_ADDR random_bda; 172 tBTM_BLE_ADDR_CBACK* p_generate_cback; 173 void* p; 174 alarm_t* refresh_raddr_timer; 175 } tBTM_LE_RANDOM_CB; 176 177 #define BTM_BLE_MAX_BG_CONN_DEV_NUM 10 178 179 typedef struct { 180 uint16_t min_conn_int; 181 uint16_t max_conn_int; 182 uint16_t slave_latency; 183 uint16_t supervision_tout; 184 185 } tBTM_LE_CONN_PRAMS; 186 187 typedef struct { 188 BD_ADDR bd_addr; 189 uint8_t attr; 190 bool is_connected; 191 bool in_use; 192 } tBTM_LE_BG_CONN_DEV; 193 194 /* white list using state as a bit mask */ 195 #define BTM_BLE_WL_IDLE 0 196 #define BTM_BLE_WL_INIT 1 197 #define BTM_BLE_WL_ADV 4 198 typedef uint8_t tBTM_BLE_WL_STATE; 199 200 /* resolving list using state as a bit mask */ 201 #define BTM_BLE_RL_IDLE 0 202 #define BTM_BLE_RL_INIT 1 203 #define BTM_BLE_RL_SCAN 2 204 #define BTM_BLE_RL_ADV 4 205 typedef uint8_t tBTM_BLE_RL_STATE; 206 207 /* BLE connection state */ 208 #define BLE_CONN_IDLE 0 209 #define BLE_DIR_CONN 1 210 #define BLE_BG_CONN 2 211 #define BLE_CONN_CANCEL 3 212 typedef uint8_t tBTM_BLE_CONN_ST; 213 214 typedef struct { void* p_param; } tBTM_BLE_CONN_REQ; 215 216 /* LE state request */ 217 #define BTM_BLE_STATE_INVALID 0 218 #define BTM_BLE_STATE_CONN_ADV 1 219 #define BTM_BLE_STATE_INIT 2 220 #define BTM_BLE_STATE_MASTER 3 221 #define BTM_BLE_STATE_SLAVE 4 222 #define BTM_BLE_STATE_LO_DUTY_DIR_ADV 5 223 #define BTM_BLE_STATE_HI_DUTY_DIR_ADV 6 224 #define BTM_BLE_STATE_NON_CONN_ADV 7 225 #define BTM_BLE_STATE_PASSIVE_SCAN 8 226 #define BTM_BLE_STATE_ACTIVE_SCAN 9 227 #define BTM_BLE_STATE_SCAN_ADV 10 228 #define BTM_BLE_STATE_MAX 11 229 typedef uint8_t tBTM_BLE_STATE; 230 231 #define BTM_BLE_STATE_CONN_ADV_BIT 0x0001 232 #define BTM_BLE_STATE_INIT_BIT 0x0002 233 #define BTM_BLE_STATE_MASTER_BIT 0x0004 234 #define BTM_BLE_STATE_SLAVE_BIT 0x0008 235 #define BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT 0x0010 236 #define BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT 0x0020 237 #define BTM_BLE_STATE_NON_CONN_ADV_BIT 0x0040 238 #define BTM_BLE_STATE_PASSIVE_SCAN_BIT 0x0080 239 #define BTM_BLE_STATE_ACTIVE_SCAN_BIT 0x0100 240 #define BTM_BLE_STATE_SCAN_ADV_BIT 0x0200 241 typedef uint16_t tBTM_BLE_STATE_MASK; 242 243 #define BTM_BLE_STATE_ALL_MASK 0x03ff 244 #define BTM_BLE_STATE_ALL_ADV_MASK \ 245 (BTM_BLE_STATE_CONN_ADV_BIT | BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT | \ 246 BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT | BTM_BLE_STATE_SCAN_ADV_BIT) 247 #define BTM_BLE_STATE_ALL_SCAN_MASK \ 248 (BTM_BLE_STATE_PASSIVE_SCAN_BIT | BTM_BLE_STATE_ACTIVE_SCAN_BIT) 249 #define BTM_BLE_STATE_ALL_CONN_MASK \ 250 (BTM_BLE_STATE_MASTER_BIT | BTM_BLE_STATE_SLAVE_BIT) 251 252 #ifndef BTM_LE_RESOLVING_LIST_MAX 253 #define BTM_LE_RESOLVING_LIST_MAX 0x20 254 #endif 255 256 typedef struct { 257 BD_ADDR* resolve_q_random_pseudo; 258 uint8_t* resolve_q_action; 259 uint8_t q_next; 260 uint8_t q_pending; 261 } tBTM_BLE_RESOLVE_Q; 262 263 typedef struct { 264 bool in_use; 265 bool to_add; 266 BD_ADDR bd_addr; 267 uint8_t attr; 268 } tBTM_BLE_WL_OP; 269 270 /* BLE privacy mode */ 271 #define BTM_PRIVACY_NONE 0 /* BLE no privacy */ 272 #define BTM_PRIVACY_1_1 1 /* BLE privacy 1.1, do not support privacy 1.0 */ 273 #define BTM_PRIVACY_1_2 2 /* BLE privacy 1.2 */ 274 #define BTM_PRIVACY_MIXED \ 275 3 /* BLE privacy mixed mode, broadcom propietary mode */ 276 typedef uint8_t tBTM_PRIVACY_MODE; 277 278 /* data length change event callback */ 279 typedef void(tBTM_DATA_LENGTH_CHANGE_CBACK)(uint16_t max_tx_length, 280 uint16_t max_rx_length); 281 282 /* Define BLE Device Management control structure 283 */ 284 typedef struct { 285 uint8_t scan_activity; /* LE scan activity mask */ 286 287 /***************************************************** 288 ** BLE Inquiry 289 *****************************************************/ 290 tBTM_BLE_INQ_CB inq_var; 291 292 /* observer callback and timer */ 293 tBTM_INQ_RESULTS_CB* p_obs_results_cb; 294 tBTM_CMPL_CB* p_obs_cmpl_cb; 295 alarm_t* observer_timer; 296 297 /* background connection procedure cb value */ 298 tBTM_BLE_CONN_TYPE bg_conn_type; 299 uint32_t scan_int; 300 uint32_t scan_win; 301 302 /* white list information */ 303 uint8_t white_list_avail_size; 304 tBTM_BLE_WL_STATE wl_state; 305 306 fixed_queue_t* conn_pending_q; 307 tBTM_BLE_CONN_ST conn_state; 308 309 /* random address management control block */ 310 tBTM_LE_RANDOM_CB addr_mgnt_cb; 311 312 bool enabled; 313 314 #if (BLE_PRIVACY_SPT == TRUE) 315 bool mixed_mode; /* privacy 1.2 mixed mode is on or not */ 316 tBTM_PRIVACY_MODE privacy_mode; /* privacy mode */ 317 uint8_t resolving_list_avail_size; /* resolving list available size */ 318 tBTM_BLE_RESOLVE_Q resolving_list_pend_q; /* Resolving list queue */ 319 tBTM_BLE_RL_STATE suspended_rl_state; /* Suspended resolving list state */ 320 uint8_t* irk_list_mask; /* IRK list availability mask, up to max entry bits */ 321 tBTM_BLE_RL_STATE rl_state; /* Resolving list state */ 322 #endif 323 324 tBTM_BLE_WL_OP wl_op_q[BTM_BLE_MAX_BG_CONN_DEV_NUM]; 325 326 /* current BLE link state */ 327 tBTM_BLE_STATE_MASK cur_states; /* bit mask of tBTM_BLE_STATE */ 328 uint8_t link_count[2]; /* total link count master and slave*/ 329 } tBTM_BLE_CB; 330 331 #endif // BTM_BLE_INT_TYPES_H 332