Home | History | Annotate | Download | only in btm
      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 inline bool BTM_BLE_IS_RESOLVE_BDA(const RawAddress& x) {
     85   return ((x.address)[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB;
     86 }
     87 
     88 #define BLE_PUBLIC_ADDR_MSB_MASK 0xC0
     89 /*  most significant bit, bit7, bit6 is 10 to be public address*/
     90 #define BLE_PUBLIC_ADDR_MSB 0x80
     91 inline bool BTM_IS_PUBLIC_BDA(const RawAddress& x) {
     92   return ((x.address)[0] & BLE_PUBLIC_ADDR_MSB_MASK) == BLE_PUBLIC_ADDR_MSB;
     93 }
     94 
     95 /* LE scan activity bit mask, continue with LE inquiry bits */
     96 /* observe is in progress */
     97 #define BTM_LE_OBSERVE_ACTIVE 0x80
     98 
     99 /* BLE scan activity mask checking */
    100 #define BTM_BLE_IS_SCAN_ACTIVE(x) ((x)&BTM_BLE_SCAN_ACTIVE_MASK)
    101 #define BTM_BLE_IS_INQ_ACTIVE(x) ((x)&BTM_BLE_INQUIRY_MASK)
    102 #define BTM_BLE_IS_OBS_ACTIVE(x) ((x)&BTM_LE_OBSERVE_ACTIVE)
    103 
    104 /* BLE ADDR type ID bit */
    105 #define BLE_ADDR_TYPE_ID_BIT 0x02
    106 
    107 #define BTM_VSC_CHIP_CAPABILITY_L_VERSION 55
    108 #define BTM_VSC_CHIP_CAPABILITY_M_VERSION 95
    109 
    110 typedef struct {
    111   uint16_t data_mask;
    112   uint8_t* p_flags;
    113   uint8_t ad_data[BTM_BLE_AD_DATA_LEN];
    114   uint8_t* p_pad;
    115 } tBTM_BLE_LOCAL_ADV_DATA;
    116 
    117 typedef struct {
    118   /* Used for determining if a response has already been received for the
    119    * current inquiry operation. (We do not want to flood the caller with
    120    * multiple responses from the same device. */
    121   uint32_t inq_count;
    122   bool scan_rsp;
    123   tBLE_BD_ADDR le_bda;
    124 } tINQ_LE_BDADDR;
    125 
    126 #define BTM_BLE_ISVALID_PARAM(x, min, max) \
    127   (((x) >= (min) && (x) <= (max)) || ((x) == BTM_BLE_CONN_PARAM_UNDEF))
    128 
    129 /* 15 minutes minimum for random address refreshing */
    130 #define BTM_BLE_PRIVATE_ADDR_INT_MS (15 * 60 * 1000)
    131 
    132 typedef struct {
    133   uint16_t discoverable_mode;
    134   uint16_t connectable_mode;
    135   uint32_t scan_window;
    136   uint32_t scan_interval;
    137   uint8_t scan_type;             /* current scan type: active or passive */
    138   uint8_t scan_duplicate_filter; /* duplicate filter enabled for scan */
    139   uint16_t adv_interval_min;
    140   uint16_t adv_interval_max;
    141   tBTM_BLE_AFP afp; /* advertising filter policy */
    142   tBTM_BLE_SFP sfp; /* scanning filter policy */
    143 
    144   tBLE_ADDR_TYPE adv_addr_type;
    145   uint8_t evt_type;
    146   uint8_t adv_mode;
    147   tBLE_BD_ADDR direct_bda;
    148   tBTM_BLE_EVT directed_conn;
    149   bool fast_adv_on;
    150   alarm_t* fast_adv_timer;
    151 
    152   /* inquiry BD addr database */
    153   uint8_t num_bd_entries;
    154   uint8_t max_bd_entries;
    155   tBTM_BLE_LOCAL_ADV_DATA adv_data;
    156   tBTM_BLE_ADV_CHNL_MAP adv_chnl_map;
    157 
    158   alarm_t* inquiry_timer;
    159   bool scan_rsp;
    160   uint8_t state; /* Current state that the inquiry process is in */
    161   int8_t tx_power;
    162 } tBTM_BLE_INQ_CB;
    163 
    164 /* random address resolving complete callback */
    165 typedef void(tBTM_BLE_RESOLVE_CBACK)(void* match_rec, void* p);
    166 
    167 typedef void(tBTM_BLE_ADDR_CBACK)(const RawAddress& static_random, void* p);
    168 
    169 /* random address management control block */
    170 typedef struct {
    171   tBLE_ADDR_TYPE own_addr_type; /* local device LE address type */
    172   RawAddress private_addr;
    173   RawAddress random_bda;
    174   tBTM_BLE_ADDR_CBACK* p_generate_cback;
    175   void* p;
    176   alarm_t* refresh_raddr_timer;
    177 } tBTM_LE_RANDOM_CB;
    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   RawAddress 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 typedef uint8_t tBTM_BLE_WL_STATE;
    198 
    199 /* resolving list using state as a bit mask */
    200 #define BTM_BLE_RL_IDLE 0
    201 #define BTM_BLE_RL_INIT 1
    202 #define BTM_BLE_RL_SCAN 2
    203 #define BTM_BLE_RL_ADV 4
    204 typedef uint8_t tBTM_BLE_RL_STATE;
    205 
    206 /* BLE connection state */
    207 #define BLE_CONN_IDLE 0
    208 #define BLE_DIR_CONN 1
    209 #define BLE_BG_CONN 2
    210 #define BLE_CONN_CANCEL 3
    211 typedef uint8_t tBTM_BLE_CONN_ST;
    212 
    213 typedef struct { void* p_param; } tBTM_BLE_CONN_REQ;
    214 
    215 /* LE state request */
    216 #define BTM_BLE_STATE_INVALID 0
    217 #define BTM_BLE_STATE_CONN_ADV 1
    218 #define BTM_BLE_STATE_INIT 2
    219 #define BTM_BLE_STATE_MASTER 3
    220 #define BTM_BLE_STATE_SLAVE 4
    221 #define BTM_BLE_STATE_LO_DUTY_DIR_ADV 5
    222 #define BTM_BLE_STATE_HI_DUTY_DIR_ADV 6
    223 #define BTM_BLE_STATE_NON_CONN_ADV 7
    224 #define BTM_BLE_STATE_PASSIVE_SCAN 8
    225 #define BTM_BLE_STATE_ACTIVE_SCAN 9
    226 #define BTM_BLE_STATE_SCAN_ADV 10
    227 #define BTM_BLE_STATE_MAX 11
    228 typedef uint8_t tBTM_BLE_STATE;
    229 
    230 #define BTM_BLE_STATE_CONN_ADV_BIT 0x0001
    231 #define BTM_BLE_STATE_INIT_BIT 0x0002
    232 #define BTM_BLE_STATE_MASTER_BIT 0x0004
    233 #define BTM_BLE_STATE_SLAVE_BIT 0x0008
    234 #define BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT 0x0010
    235 #define BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT 0x0020
    236 #define BTM_BLE_STATE_NON_CONN_ADV_BIT 0x0040
    237 #define BTM_BLE_STATE_PASSIVE_SCAN_BIT 0x0080
    238 #define BTM_BLE_STATE_ACTIVE_SCAN_BIT 0x0100
    239 #define BTM_BLE_STATE_SCAN_ADV_BIT 0x0200
    240 typedef uint16_t tBTM_BLE_STATE_MASK;
    241 
    242 #define BTM_BLE_STATE_ALL_MASK 0x03ff
    243 #define BTM_BLE_STATE_ALL_ADV_MASK                                  \
    244   (BTM_BLE_STATE_CONN_ADV_BIT | BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT | \
    245    BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT | BTM_BLE_STATE_SCAN_ADV_BIT)
    246 #define BTM_BLE_STATE_ALL_SCAN_MASK \
    247   (BTM_BLE_STATE_PASSIVE_SCAN_BIT | BTM_BLE_STATE_ACTIVE_SCAN_BIT)
    248 #define BTM_BLE_STATE_ALL_CONN_MASK \
    249   (BTM_BLE_STATE_MASTER_BIT | BTM_BLE_STATE_SLAVE_BIT)
    250 
    251 #ifndef BTM_LE_RESOLVING_LIST_MAX
    252 #define BTM_LE_RESOLVING_LIST_MAX 0x20
    253 #endif
    254 
    255 typedef struct {
    256   RawAddress* resolve_q_random_pseudo;
    257   uint8_t* resolve_q_action;
    258   uint8_t q_next;
    259   uint8_t q_pending;
    260 } tBTM_BLE_RESOLVE_Q;
    261 
    262 typedef struct {
    263   bool in_use;
    264   bool to_add;
    265   RawAddress bd_addr;
    266   uint8_t attr;
    267 } tBTM_BLE_WL_OP;
    268 
    269 /* BLE privacy mode */
    270 #define BTM_PRIVACY_NONE 0 /* BLE no privacy */
    271 #define BTM_PRIVACY_1_1 1  /* BLE privacy 1.1, do not support privacy 1.0 */
    272 #define BTM_PRIVACY_1_2 2  /* BLE privacy 1.2 */
    273 #define BTM_PRIVACY_MIXED \
    274   3 /* BLE privacy mixed mode, broadcom propietary mode */
    275 typedef uint8_t tBTM_PRIVACY_MODE;
    276 
    277 /* data length change event callback */
    278 typedef void(tBTM_DATA_LENGTH_CHANGE_CBACK)(uint16_t max_tx_length,
    279                                             uint16_t max_rx_length);
    280 
    281 /* Define BLE Device Management control structure
    282 */
    283 typedef struct {
    284   uint8_t scan_activity; /* LE scan activity mask */
    285 
    286   /*****************************************************
    287   **      BLE Inquiry
    288   *****************************************************/
    289   tBTM_BLE_INQ_CB inq_var;
    290 
    291   /* observer callback and timer */
    292   tBTM_INQ_RESULTS_CB* p_obs_results_cb;
    293   tBTM_CMPL_CB* p_obs_cmpl_cb;
    294   alarm_t* observer_timer;
    295 
    296   /* background connection procedure cb value */
    297   tBTM_BLE_CONN_TYPE bg_conn_type;
    298   uint32_t scan_int;
    299   uint32_t scan_win;
    300 
    301   /* white list information */
    302   tBTM_BLE_WL_STATE wl_state;
    303 
    304   fixed_queue_t* conn_pending_q;
    305   tBTM_BLE_CONN_ST conn_state;
    306 
    307   /* random address management control block */
    308   tBTM_LE_RANDOM_CB addr_mgnt_cb;
    309 
    310   bool enabled;
    311 
    312 #if (BLE_PRIVACY_SPT == TRUE)
    313   bool mixed_mode;                   /* privacy 1.2 mixed mode is on or not */
    314   tBTM_PRIVACY_MODE privacy_mode;    /* privacy mode */
    315   uint8_t resolving_list_avail_size; /* resolving list available size */
    316   tBTM_BLE_RESOLVE_Q resolving_list_pend_q; /* Resolving list queue */
    317   tBTM_BLE_RL_STATE suspended_rl_state;     /* Suspended resolving list state */
    318   uint8_t* irk_list_mask; /* IRK list availability mask, up to max entry bits */
    319   tBTM_BLE_RL_STATE rl_state; /* Resolving list state */
    320 #endif
    321 
    322   /* current BLE link state */
    323   tBTM_BLE_STATE_MASK cur_states; /* bit mask of tBTM_BLE_STATE */
    324   uint8_t link_count[2];          /* total link count master and slave*/
    325 } tBTM_BLE_CB;
    326 
    327 #endif  // BTM_BLE_INT_TYPES_H
    328