Implement interface to set advertise Tx power level
[platform/upstream/bluez.git] / src / adapter_le_vsc_features.h
1 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2
3 typedef enum {
4         BLE_ADV_TX_POWER_MIN = 0x00,
5         BLE_ADV_TX_POWER_LOW = 0x01,
6         BLE_ADV_TX_POWER_MID = 0x02,
7         BLE_ADV_TX_POWER_UPPER = 0x03,
8         BLE_ADV_TX_POWER_MAX = 0x04,
9 } adapter_le_tx_power_t;
10
11 typedef struct {
12         uint8_t inst_id;
13         uint8_t bdaddr_type;
14         bdaddr_t bdaddr;
15 } adapter_le_adv_inst_info_t;
16
17 typedef struct {
18         uint16_t adv_int_min;         /* minimum adv interval */
19         uint16_t adv_int_max;         /* maximum adv interval */
20         uint8_t adv_type;             /* adv event type (0x00 ~ 0x04) */
21         uint8_t channel_map;          /* adv channel map (all channel = 0x07)  */
22         uint8_t adv_filter_policy;    /* advertising filter policy (0x00 ~ 0x04) */
23         adapter_le_tx_power_t tx_power;    /* adv tx power */
24 } adapter_le_adv_param_t;
25
26 typedef enum {
27         ADD,
28         DELETE,
29         CLEAR,
30 } adapter_le_scan_filter_action_type;
31
32 typedef enum {
33         ADDR_LE_PUBLIC,
34         ADDR_LE_RANDOM,
35 } adapter_vsc_le_addr_type;
36
37 typedef enum {
38         TYPE_DEVICE_ADDRESS = 0x01,
39         TYPE_SERVICE_DATA_CHANGED = 0x02,
40         TYPE_SERVICE_UUID = 0x04,
41         TYPE_SOLICIT_UUID = 0x08,
42         TYPE_LOCAL_NAME = 0x10,
43         TYPE_MANUFACTURER_DATA = 0x20,
44         TYPE_SERVICE_DATA = 0x40,
45 } adapter_le_scan_filter_type;
46
47 #define BDADDR_BREDR           0x00
48 #define BDADDR_LE_PUBLIC       0x01
49
50 #define BROADCAST_ADDR_FILTER   0x01
51 #define SERVICE_DATA_CHANGE_FILTER      0x02
52 #define SERVICE_UUID_CHECK              0x04
53 #define SERVICE_SOLICITATION_UUID_CHECK 0x08
54 #define LOCAL_NAME_CHECK                        0x10
55 #define MANUFACTURE_DATA_CHECK          0x20
56 #define SERVICE_DATA_CHECK                      0x40
57
58 typedef uint16_t adapter_le_scan_filter_feature_t;
59
60 typedef enum {
61         OR,
62         AND,
63 } adapter_le_scan_filter_logic_type;
64
65 typedef enum {
66         IMMEDIATE,
67         ON_FOUND,
68         BATCHED,
69 } adapter_le_scan_filter_delivery_mode;
70
71 typedef enum {
72         UUID_16_LEN=2,
73         UUID_32_LEN=4,
74         UUID_128_LEN =16,
75 } adapter_le_uuid_len;
76
77 typedef struct {
78         adapter_le_scan_filter_action_type action;
79         uint8_t index;
80         adapter_le_scan_filter_feature_t feature;
81         adapter_le_scan_filter_logic_type list_logic_type;
82         adapter_le_scan_filter_logic_type filter_logic_type;
83         uint8_t rssi_high_threshold;
84         adapter_le_scan_filter_delivery_mode delivery_mode;
85         uint16_t onfound_timeout;
86         uint8_t onfound_timeout_cnt;
87         uint8_t rssi_low_threshold;
88         uint16_t onlost_timeout;
89 }adapter_le_scan_filter_param_t;
90
91 typedef struct {
92         adapter_le_scan_filter_action_type action;
93         uint8_t filter_index;
94         bdaddr_t broadcaster_addr;
95         adapter_vsc_le_addr_type bdaddr_type;
96 } adapter_le_address_filter_params_t;
97
98 typedef struct {
99         adapter_le_scan_filter_action_type action;
100         uint8_t filter_index;
101         uint8_t *uuid;
102         uint8_t *uuid_mask;
103         adapter_le_uuid_len     uuid_len;
104 }adapter_le_uuid_params_t;
105
106 typedef struct {
107         adapter_le_scan_filter_action_type action;
108         uint8_t filter_index;
109         const char *local_name;
110         uint8_t name_len;
111 }adapter_le_local_name_params_t;
112
113 typedef struct {
114         adapter_le_scan_filter_action_type action;
115         uint8_t filter_index;
116         uint16_t company_id;
117         uint16_t company_id_mask;
118         uint8_t *man_data;
119         uint8_t *man_data_mask;
120         uint8_t man_data_len;
121 }adapter_le_manf_data_params_t;
122
123 typedef struct {
124         adapter_le_scan_filter_action_type action;
125         uint8_t filter_index;
126         uint8_t *service_data;
127         uint8_t *service_data_mask;
128         uint8_t service_data_len;
129 }adapter_le_service_data_params_t;
130
131 /*****************************************************************************
132 **  Defentions for HCI Error Codes that are past in the events
133 */
134 #define HCI_SUCCESS                                     0x00
135
136
137
138 /*****************************************************************************
139 **                          Vendor Specific Commands
140 **
141 */
142
143 #define OCF_BCM_LE_GET_VENDOR_CAP    0x0153     /* LE Get Vendor Capabilities */
144
145 #define OCF_BCM_LE_MULTI_ADV     0x0154     /* Multi adv OCF */
146
147 /* subcode for multi adv feature */
148 #define SUB_CMD_LE_MULTI_ADV_SET_PARAM                     0x01
149 #define SUB_CMD_LE_MULTI_ADV_WRITE_ADV_DATA                0x02
150 #define SUB_CMD_LE_MULTI_ADV_WRITE_SCAN_RSP_DATA           0x03
151 #define SUB_CMD_LE_MULTI_ADV_SET_RANDOM_ADDR               0x04
152 #define SUB_CMD_LE_MULTI_ADV_ENB                           0x05
153
154 /* APCF : Advertising Packet Content Filter feature */
155 #define OCF_BCM_LE_SCAN_FILTER     0x0157     /* Advertising filter OCF */
156
157 /* Sub codes for APCF */
158 #define SUB_CMD_LE_META_PF_ENABLE          0x00
159 #define SUB_CMD_LE_META_PF_FEAT_SEL        0x01
160 #define SUB_CMD_LE_META_PF_ADDR            0x02
161 #define SUB_CMD_LE_META_PF_UUID            0x03
162 #define SUB_CMD_LE_META_PF_SOL_UUID        0x04
163 #define SUB_CMD_LE_META_PF_LOCAL_NAME      0x05
164 #define SUB_CMD_LE_META_PF_MANU_DATA       0x06
165 #define SUB_CMD_LE_META_PF_SRVC_DATA       0x07
166 #define SUB_CMD_LE_META_PF_ALL             0x08
167
168 /* Offloaded resolution of private address */
169 #define OCF_BCM_LE_RPA_OFFLOAD     0x0155     /* RPA Offload OCF */
170
171 /* subcode for rpa offloading feature */
172 #define SUB_CMD_LE_ENABLE_OFFLOADING       0x01
173 #define SUB_CMD_LE_ADD_IRK_TO_LIST         0x02
174 #define SUB_CMD_LE_REMOVE_IRK_TO_LIST      0x03
175 #define SUB_CMD_LE_CLEAR_IRK_TO_LIST       0x04
176 #define SUB_CMD_LE_READ_IRK_TO_LIST        0x05
177
178 /*****************************************************************************
179 **                          CP & RP for OCF_BCM_LE_GET_VENDOR_CAP
180 **
181 */
182
183 /**
184 *
185 * RP
186 *
187 * (1 octet) status        : Command complete status
188 * (1 octet) adv_inst_max  : Num of advertisement instances supported
189 * (1 octet) rpa_offloading: BT chip capability of RPA
190 *                           (value 0 not capable, value 1 capable)
191 *                           If supported by chip, it needs enablement by host
192 * (2 octet) tot_scan_results_strg : Storage for scan results in bytes
193 * (1 octet) max_irk_list_sz : Num of IRK entries supported in f/w
194 * (1 octet) filter_support  : Support Filtering in controller.
195 *                             0 = Not supported / 1 = supported
196 * (1 octet) max_filter      : Number of filters supported
197 * (1 octet) energy_support  : Supports reporting of activity and energy info
198 *                             0 = not capable, 1 = capable
199 * (1 octet) onlost_follow   : Number of advertisers that can be analysed
200 *                             for onlost per filter
201 */
202 typedef struct {
203         uint8_t status;
204         uint8_t adv_inst_max;
205         uint8_t rpa_offloading;
206         uint16_t tot_scan_results_strg;
207         uint8_t max_irk_list_sz;
208         uint8_t filter_support;
209         uint8_t max_filter;
210         uint8_t energy_support;
211         uint8_t onlost_follow;
212 } __attribute__ ((packed)) apater_le_vsc_rp_get_vendor_cap;
213
214
215
216 /*****************************************************************************
217 **                          CP & RP for OCF_BCM_LE_MULTI_ADV
218 **
219 */
220
221 /**
222 *
223 * CP for  OCF_BCM_LE_MULTI_ADV & SUB_CMD_LE_MULTI_ADV_SET_PARAM
224 *
225 * (1 octet) subcode            : SUB_CMD_LE_MULTI_ADV_SET_PARAM
226 * (2 octet) adv_int_min        : per spec
227 * (2 octet) adv_int_max        : per spec
228 * (1 octet) adv_type           : per spec
229 * (1 octet) bdaddr_type        : per spec
230 * (6 octet) bdaddr             : per spec
231 * (1 octet) direct_bdaddr_type : per spec
232 * (6 octet) direct_bdaddr      : per spec
233 * (1 octet) channel_map        : per spec
234 * (1 octet) adv_filter_policy  : per spec
235 * (1 octet) inst_id            : Specifies the applicability of the above parameters to an instance
236 * (1 octet) tx_power           : Transmit_Power Unit - in dBm (signed integer) Range (70 to +20)
237 */
238 typedef struct {
239         uint8_t subcode;
240         uint16_t adv_int_min;
241         uint16_t adv_int_max;
242         uint8_t adv_type;
243         uint8_t bdaddr_type;
244         bdaddr_t bdaddr;
245         uint8_t direct_bdaddr_type;
246         bdaddr_t direct_bdaddr;
247         uint8_t channel_map;
248         uint8_t adv_filter_policy;
249         uint8_t inst_id;
250         int8_t tx_power;
251 } __attribute__ ((packed)) adapter_le_vsc_cp_set_multi_adv_params;
252
253 /**
254 *
255 * CP for SUB_CMD_LE_MULTI_ADV_WRITE_ADV_DATA
256 * CP for SUB_CMD_LE_MULTI_ADV_WRITE_SCAN_RSP_DATA
257 *
258 * ( 1 octet) subcode     : SUB_CMD_LE_MULTI_ADV_WRITE_ADV_DATA
259 *                          or SUB_CMD_LE_MULTI_ADV_WRITE_SCAN_RSP_DATA
260 * ( 1 octet) data_len    : per spec
261 * (31 octet) data        : per spec
262 * ( 1 octet) inst_id     : Specifies the applicability of the above parameters to an instance.
263 */
264 typedef struct {
265         uint8_t subcode;
266         uint8_t data_len;
267         uint8_t data[31];
268         uint8_t inst_id;
269 } __attribute__ ((packed)) adapter_le_vsc_cp_set_multi_adv_data;
270
271 /**
272 *
273 * CP for SUB_CMD_LE_MULTI_ADV_SET_RANDOM_ADDR
274 *
275 * (6 octet) b     :  Random address
276 * (1 octet) inst_id     : Specifies the applicability of the above parameters
277 *                         to an instance. Instance 0 has special meaning this
278 *                         refers to std HCI instance.
279 */
280 typedef struct {
281         uint8_t subcode;
282         bdaddr_t bdaddr;
283         uint8_t inst_id;
284 } __attribute__ ((packed)) adapter_le_vsc_cp_set_random_address;
285
286 /**
287 *
288 * RP
289 *
290 * (1 octet) status      : Command complete status
291 * (1 octet) subcode     : subcode of SUB_CMD_LE_MULTI_ADV_SET_RANDOM_ADDR
292 */
293 typedef struct {
294         uint8_t status;
295         uint8_t subcode;
296 } __attribute__ ((packed)) apater_le_vsc_rp_set_random_address;
297
298 /**
299 *
300 * CP for SUB_CMD_LE_MULTI_ADV_ENB
301 *
302 * (1 octet) subcode     : SUB_CMD_LE_MULTI_ADV_ENB
303 * (1 octet) enable      : When set to 1, it means enable, otherwise disable.
304 * (1 octet) inst_id     : Specifies the applicability of the above parameters
305 *                         to an instance. Instance 0 has special meaning this
306 *                         refers to std HCI instance.
307 */
308 typedef struct {
309         uint8_t subcode;
310         uint8_t enable;
311         uint8_t inst_id;
312 } __attribute__ ((packed)) adapter_le_vsc_cp_enable_multi_adv;
313
314 /**
315 *
316 * RP
317 *
318 * (1 octet) status      : Command complete status
319 * (1 octet) subcode     : subcode of OCF_BCM_LE_MULTI_ADV
320 */
321 typedef struct {
322         uint8_t status;
323         uint8_t subcode;
324 } __attribute__ ((packed)) apater_le_vsc_rp_multi_adv;
325
326
327
328 /*****************************************************************************
329 **                          CP & RP for OCF_BCM_LE_SCAN_FILTER
330 **
331 */
332
333
334 /* CP for SUB_CMD_LE_META_PF_ENABLE */
335 typedef struct {
336         uint8_t subcode;
337         uint8_t enable;
338 } __attribute__ ((packed)) adapter_le_vsc_cp_enable_scan_filter;
339
340 /* RP for SUB_CMD_LE_META_PF_ENABLE */
341 typedef struct {
342         uint8_t status;
343         uint8_t subcode;
344         uint8_t enable;
345 } __attribute__ ((packed)) apater_le_vsc_rp_enable_scan_filter;
346
347 /* CP for SUB_CMD_LE_META_PF_FEAT_SEL */
348 typedef struct {
349         uint8_t  subcode;
350         uint8_t  action;
351         uint8_t  filter_index;
352         uint16_t feature;
353         uint16_t feature_list_logic;
354         uint8_t  filter_logic;
355         int8_t   rssi_high_threshold;
356         uint8_t  delivery_mode;
357         uint16_t onfound_timeout;
358         uint8_t  onfound_timeout_cnt;
359         uint8_t  rssi_low_thresh;
360         uint16_t onlost_timeout;
361 } __attribute__ ((packed)) adapter_le_vsc_cp_apcf_set_filter_params;
362
363 /* CP for SUB_CMD_LE_META_PF_ADDR */
364 typedef struct {
365         uint8_t subcode;
366         uint8_t action;
367         uint8_t filter_index;
368         bdaddr_t bdaddr;
369         uint8_t bdaddr_type;
370 } __attribute__ ((packed))adapter_le_vsc_cp_address_scan_filter;
371
372 /* CP for SUB_CMD_LE_META_PF_UUID & SUB_CMD_LE_META_PF_SOL_UUID */
373 typedef struct {
374         uint8_t subcode;
375         uint8_t action;
376         uint8_t filter_index;
377         uint8_t data[40];               /* UUID + UUID_MASK */
378 } __attribute__ ((packed))adapter_le_vsc_cp_service_uuid_scan_filter;
379 #define UUID_SCAN_FILTER_HEADER_SIZE 3
380
381 #define SCAN_FILTER_DATA_MAX_LEN 29
382
383 /* CP for SUB_CMD_LE_META_PF_LOCAL_NAME*/
384 typedef struct {
385         uint8_t subcode;
386         uint8_t action;
387         uint8_t filter_index;
388         uint8_t name[SCAN_FILTER_DATA_MAX_LEN];
389 } __attribute__ ((packed)) adapter_le_vsc_cp_local_name_scan_filter;
390 #define NAME_SCAN_FILTER_HEADER_SIZE 3
391
392 /* CP for SUB_CMD_LE_META_PF_MANU_DATA*/
393 typedef struct {
394         uint8_t subcode;
395         uint8_t action;
396         uint8_t filter_index;
397         uint8_t data[SCAN_FILTER_DATA_MAX_LEN * 2];     /* data + mask filed */
398 } __attribute__ ((packed)) adapter_le_vsc_cp_manf_data_scan_filter;
399 #define MANF_DATA_SCAN_FILTER_HEADER_SIZE 3
400
401 /* CP for SUB_CMD_LE_META_PF_SRVC_DATA*/
402 typedef struct {
403         uint8_t subcode;
404         uint8_t action;
405         uint8_t filter_index;
406         uint8_t data[SCAN_FILTER_DATA_MAX_LEN * 2];     /* data + mask filed */
407 } __attribute__ ((packed)) adapter_le_vsc_cp_service_data_scan_filter;
408 #define SERVICE_DATA_SCAN_FILTER_HEADER_SIZE 3
409
410 /* RP for SUB_CMD_LE_META_PF_ADDR & SUB_CMD_LE_META_PF_FEAT_SEL &
411                 SUB_CMD_LE_META_PF_UUID & SUB_CMD_LE_META_PF_SOL_UUID &
412                 SUB_CMD_LE_META_PF_LOCAL_NAME & SUB_CMD_LE_META_PF_MANU_DATA &
413                 SUB_CMD_LE_META_PF_SRVC_DATA */
414 typedef struct {
415         uint8_t status;
416         uint8_t subcode;
417         uint8_t         action;
418         uint8_t         available_space;
419 } __attribute__ ((packed)) adapter_le_vsc_rp_apcf_set_scan_filter;
420
421
422 /*****************************************************************************
423 **                          CP & RP for OCF_BCM_LE_RPA_OFFLOAD
424 **
425 */
426
427 /**
428 *
429 * CP for  SUB_CMD_ENABLE_RPA_OFFLOAD
430 *
431 * (1 octet) subcode    : SUB_CMD_ENABLE_RPA_OFFLOAD (0x01)
432 * (2 octet) enable      : When set to 1, it means enable, otherwise disable.
433 */
434 typedef struct {
435         uint8_t subcode;
436         uint8_t enable;
437 } __attribute__ ((packed)) adapter_le_vsc_cp_enable_rpa_offload;
438
439 /* RP for SUB_CMD_ENABLE_RPA_OFFLOAD */
440 typedef struct {
441         uint8_t status;
442         uint8_t subcode;
443 } __attribute__ ((packed)) adapter_le_vsc_rp_enable_rpa_offload;
444
445 /**
446 *
447 * CP for  SUB_CMD_ADD_IRK_TO_LIST
448 *
449 * (1 octet) subcode    : SUB_CMD_ADD_IRK_TO_LIST (0x02)
450 * (16 octet) le_irk      : LE IRK (1st byte LSB)
451 * (1 octet) bdaddr_type : per spec
452 * (6 octet) bdaddr : per spec
453 */
454 typedef struct {
455         uint8_t subcode;
456         uint8_t le_irk[16];
457         uint8_t bdaddr_type;
458         bdaddr_t bdaddr;
459 } __attribute__ ((packed)) adapter_le_vsc_cp_add_irk_to_list;
460
461 /**
462 *
463 * CP for  SUB_CMD_REMOVE_IRK_TO_LIST
464 *
465 * (1 octet) subcode    : SUB_CMD_REMOVE_IRK_TO_LIST (0x03)
466 * (16 octet) le_irk      : LE IRK (1st byte LSB)
467 * (1 octet) bdaddr_type : per spec
468 * (6 octet) bdaddr : per spec
469 */
470 typedef struct {
471         uint8_t subcode;
472         uint8_t bdaddr_type;
473         bdaddr_t bdaddr;
474 } __attribute__ ((packed)) adapter_le_vsc_cp_remove_irk_to_list;
475
476 /* RP for SUB_CMD_ADD_IRK_TO_LIST & SUB_CMD_REMOVE_IRK_TO_LIST */
477 typedef struct {
478         uint8_t status;
479         uint8_t subcode;
480         uint8_t available_space;
481 } __attribute__ ((packed)) adapter_le_vsc_rp_irk_to_list;
482
483
484 /*****************************************************************************
485 **                          Functions
486 **
487 */
488
489 /* Read supported BLE feature info from chipset */
490 gboolean adapter_le_read_ble_feature_info(void);
491
492 gboolean adapter_le_is_supported_multi_advertising(void);
493
494 gboolean adapter_le_is_supported_offloading(void);
495
496 int adapter_le_get_max_adv_instance(void);
497
498 int adapter_le_get_scan_filter_size(void);
499
500 gboolean adapter_le_set_multi_adv_params (adapter_le_adv_inst_info_t *p_inst,
501                                         adapter_le_adv_param_t *p_params);
502
503 gboolean adapter_le_set_multi_adv_data(uint8_t inst_id, gboolean is_scan_rsp,
504                                         uint8_t data_len, uint8_t *p_data);
505
506 gboolean adapter_le_set_random_address (struct btd_adapter *adapter,
507                                         const bdaddr_t *addr, uint8_t inst_id);
508
509 gboolean adapter_le_enable_multi_adv (struct btd_adapter *adapter,
510                                         gboolean enable, uint8_t inst_id);
511
512 gboolean adapter_le_enable_scan_filtering (gboolean enable);
513
514 gboolean adapter_le_set_scan_filter_params(adapter_le_scan_filter_param_t *params);
515
516 gboolean adapter_le_set_scan_filter_data(int client_if, int action,
517                                                         int filt_type, int filter_index,
518                                                         int company_id,
519                                                         int company_id_mask,
520                                                         int uuid_len, uint8_t *p_uuid,
521                                                         int uuid_mask_len, uint8_t *p_uuid_mask,
522                                                         gchar *string, int addr_type,
523                                                         int data_len, uint8_t *p_data,
524                                                         int mask_len, uint8_t *p_mask);
525 gboolean adapter_le_clear_scan_filter_data(int client_if, int filter_index);
526
527 gboolean adapter_le_enable_offloading(gboolean enable);
528
529 gboolean adapter_le_add_irk_to_list(const uint8_t *le_irk, const bdaddr_t *bdaddr, uint8_t bdaddr_type);
530
531 gboolean adapter_le_remove_irk_to_list(const bdaddr_t *bdaddr, uint8_t bdaddr_type);
532
533 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */