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 #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