1 /*
2 * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include "btm_int.h"
8 #include "stack/hcimsgs.h"
9 #include "osi/allocator.h"
10 #include "device/controller.h"
11 #include <string.h>
12 #include "l2c_int.h"
13 #if (BLE_50_FEATURE_SUPPORT == TRUE)
14 #define SET_BIT(t, n) (t |= 1UL << (n))
15 tBTM_BLE_EXTENDED_CB extend_adv_cb;
16
17 tBTM_BLE_5_HCI_CBACK ble_5_hci_cb;
18
19 #define INVALID_VALUE 0XFF
20 extern BOOLEAN BTM_GetLocalResolvablePrivateAddr(BD_ADDR bda);
21 extern void BTM_UpdateAddrInfor(uint8_t addr_type, BD_ADDR bda);
22 extern void BTM_BleSetStaticAddr(BD_ADDR rand_addr);
23 extern uint32_t BTM_BleUpdateOwnType(uint8_t *own_bda_type, tBTM_START_ADV_CMPL_CBACK *cb);
24 static tBTM_STATUS btm_ble_ext_adv_params_validate(tBTM_BLE_GAP_EXT_ADV_PARAMS *params);
25 static tBTM_STATUS btm_ble_ext_adv_set_data_validate(UINT8 instance, UINT16 len, UINT8 *data);
26
27 typedef struct {
28 uint16_t ter_con_handle;
29 bool invalid;
30 bool enabled;
31 UINT8 instance;
32 int duration;
33 int max_events;
34 uint8_t retry_count;
35 } tBTM_EXT_ADV_RECORD;
36
37 tBTM_EXT_ADV_RECORD adv_record[MAX_BLE_ADV_INSTANCE] = {0};
38 extern void btm_ble_inter_set(bool extble_inter);
39
40 #if !UC_BT_STACK_NO_LOG
btm_ble_hci_status_to_str(tHCI_STATUS status)41 static const char *btm_ble_hci_status_to_str(tHCI_STATUS status)
42 {
43 switch(status) {
44 case HCI_SUCCESS:
45 return "HCI_SUCCESS";
46 case HCI_ERR_ILLEGAL_COMMAND:
47 return "HCI_ERR_ILLEGAL_COMMAND";
48 case HCI_ERR_NO_CONNECTION:
49 return "HCI_ERR_NO_CONNECTION";
50 case HCI_ERR_HW_FAILURE:
51 return "HCI_ERR_HW_FAILURE";
52 case HCI_ERR_PAGE_TIMEOUT:
53 return "HCI_ERR_PAGE_TIMEOUT";
54 case HCI_ERR_AUTH_FAILURE:
55 return "HCI_ERR_AUTH_FAILURE";
56 case HCI_ERR_KEY_MISSING:
57 return "HCI_ERR_KEY_MISSING";
58 case HCI_ERR_MEMORY_FULL:
59 return "HCI_ERR_MEMORY_FULL";
60 case HCI_ERR_CONNECTION_TOUT:
61 return "HCI_ERR_CONNECTION_TOUT";
62 case HCI_ERR_MAX_NUM_OF_CONNECTIONS:
63 return "HCI_ERR_MAX_NUM_OF_CONNECTIONS";
64 case HCI_ERR_MAX_NUM_OF_SCOS:
65 return "HCI_ERR_MAX_NUM_OF_SCOS";
66 case HCI_ERR_CONNECTION_EXISTS:
67 return "HCI_ERR_CONNECTION_EXISTS";
68 case HCI_ERR_COMMAND_DISALLOWED:
69 return "HCI_ERR_COMMAND_DISALLOWED";
70 case HCI_ERR_HOST_REJECT_RESOURCES:
71 return "HCI_ERR_HOST_REJECT_RESOURCES";
72 case HCI_ERR_HOST_REJECT_SECURITY:
73 return "HCI_ERR_HOST_REJECT_SECURITY";
74 case HCI_ERR_HOST_REJECT_DEVICE:
75 return "HCI_ERR_HOST_REJECT_DEVICE";
76 case HCI_ERR_HOST_TIMEOUT:
77 return "HCI_ERR_HOST_TIMEOUT";
78 case HCI_ERR_UNSUPPORTED_VALUE:
79 return "HCI_ERR_UNSUPPORTED_VALUE";
80 case HCI_ERR_ILLEGAL_PARAMETER_FMT:
81 return "HCI_ERR_ILLEGAL_PARAMETER_FMT";
82 case HCI_ERR_PEER_USER:
83 return "HCI_ERR_PEER_USER";
84 case HCI_ERR_PEER_LOW_RESOURCES:
85 return "HCI_ERR_PEER_LOW_RESOURCES";
86 case HCI_ERR_PEER_POWER_OFF:
87 return "HCI_ERR_PEER_POWER_OFF";
88 case HCI_ERR_CONN_CAUSE_LOCAL_HOST:
89 return "HCI_ERR_CONN_CAUSE_LOCAL_HOST";
90 case HCI_ERR_REPEATED_ATTEMPTS:
91 return "HCI_ERR_REPEATED_ATTEMPTS";
92 case HCI_ERR_PAIRING_NOT_ALLOWED:
93 return "HCI_ERR_PAIRING_NOT_ALLOWED";
94 case HCI_ERR_UNKNOWN_LMP_PDU:
95 return "HCI_ERR_UNKNOWN_LMP_PDU";
96 case HCI_ERR_UNSUPPORTED_REM_FEATURE:
97 return "HCI_ERR_UNSUPPORTED_REM_FEATURE";
98 case HCI_ERR_SCO_OFFSET_REJECTED:
99 return "HCI_ERR_SCO_OFFSET_REJECTED";
100 case HCI_ERR_SCO_INTERVAL_REJECTED:
101 return "HCI_ERR_SCO_INTERVAL_REJECTED";
102 case HCI_ERR_SCO_AIR_MODE:
103 return "HCI_ERR_SCO_AIR_MODE";
104 case HCI_ERR_INVALID_LMP_PARAM:
105 return "HCI_ERR_INVALID_LMP_PARAM";
106 case HCI_ERR_UNSPECIFIED:
107 return "HCI_ERR_UNSPECIFIED";
108 case HCI_ERR_UNSUPPORTED_LMP_PARAMETERS:
109 return "HCI_ERR_UNSUPPORTED_LMP_PARAMETERS";
110 case HCI_ERR_ROLE_CHANGE_NOT_ALLOWED:
111 return "HCI_ERR_ROLE_CHANGE_NOT_ALLOWED";
112 case HCI_ERR_LMP_RESPONSE_TIMEOUT:
113 return "HCI_ERR_LMP_RESPONSE_TIMEOUT";
114 case HCI_ERR_LMP_ERR_TRANS_COLLISION:
115 return "HCI_ERR_LMP_ERR_TRANS_COLLISION";
116 case HCI_ERR_LMP_PDU_NOT_ALLOWED:
117 return "HCI_ERR_LMP_PDU_NOT_ALLOWED";
118 case HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE:
119 return "HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE";
120 case HCI_ERR_UNIT_KEY_USED:
121 return "HCI_ERR_UNIT_KEY_USED";
122 case HCI_ERR_QOS_NOT_SUPPORTED:
123 return "HCI_ERR_QOS_NOT_SUPPORTED";
124 case HCI_ERR_INSTANT_PASSED:
125 return "HCI_ERR_INSTANT_PASSED";
126 case HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
127 return "HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED";
128 case HCI_ERR_DIFF_TRANSACTION_COLLISION:
129 return "HCI_ERR_DIFF_TRANSACTION_COLLISION";
130 case HCI_ERR_UNDEFINED_0x2B:
131 return "HCI_ERR_UNDEFINED_0x2B";
132 case HCI_ERR_QOS_UNACCEPTABLE_PARAM:
133 return "HCI_ERR_QOS_UNACCEPTABLE_PARAM";
134 case HCI_ERR_QOS_REJECTED:
135 return "HCI_ERR_QOS_REJECTED";
136 case HCI_ERR_CHAN_CLASSIF_NOT_SUPPORTED:
137 return "HCI_ERR_CHAN_CLASSIF_NOT_SUPPORTED";
138 case HCI_ERR_INSUFFCIENT_SECURITY:
139 return "HCI_ERR_INSUFFCIENT_SECURITY";
140 case HCI_ERR_PARAM_OUT_OF_RANGE:
141 return "HCI_ERR_PARAM_OUT_OF_RANGE";
142 case HCI_ERR_UNDEFINED_0x31:
143 return "HCI_ERR_UNDEFINED_0x31";
144 case HCI_ERR_ROLE_SWITCH_PENDING:
145 return "HCI_ERR_ROLE_SWITCH_PENDING";
146 case HCI_ERR_UNDEFINED_0x33:
147 return "HCI_ERR_UNDEFINED_0x33";
148 case HCI_ERR_RESERVED_SLOT_VIOLATION:
149 return "HCI_ERR_RESERVED_SLOT_VIOLATION";
150 case HCI_ERR_ROLE_SWITCH_FAILED:
151 return "HCI_ERR_ROLE_SWITCH_FAILED";
152 case HCI_ERR_INQ_RSP_DATA_TOO_LARGE:
153 return "HCI_ERR_INQ_RSP_DATA_TOO_LARGE";
154 case HCI_ERR_SIMPLE_PAIRING_NOT_SUPPORTED:
155 return "HCI_ERR_SIMPLE_PAIRING_NOT_SUPPORTED";
156 case HCI_ERR_HOST_BUSY_PAIRING:
157 return "HCI_ERR_HOST_BUSY_PAIRING";
158 case HCI_ERR_REJ_NO_SUITABLE_CHANNEL:
159 return "HCI_ERR_REJ_NO_SUITABLE_CHANNEL";
160 case HCI_ERR_CONTROLLER_BUSY:
161 return "HCI_ERR_CONTROLLER_BUSY";
162 case HCI_ERR_UNACCEPT_CONN_INTERVAL:
163 return "HCI_ERR_UNACCEPT_CONN_INTERVAL";
164 case HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT:
165 return "HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT";
166 case HCI_ERR_CONN_TOUT_DUE_TO_MIC_FAILURE:
167 return "HCI_ERR_CONN_TOUT_DUE_TO_MIC_FAILURE";
168 case HCI_ERR_CONN_FAILED_ESTABLISHMENT:
169 return "HCI_ERR_CONN_FAILED_ESTABLISHMENT";
170 case HCI_ERR_MAC_CONNECTION_FAILED:
171 return "HCI_ERR_MAC_CONNECTION_FAILED";
172 case HCI_ERR_LT_ADDR_ALREADY_IN_USE:
173 return "HCI_ERR_LT_ADDR_ALREADY_IN_USE";
174 case HCI_ERR_LT_ADDR_NOT_ALLOCATED:
175 return "HCI_ERR_LT_ADDR_NOT_ALLOCATED";
176 case HCI_ERR_CLB_NOT_ENABLED:
177 return "HCI_ERR_CLB_NOT_ENABLED";
178 case HCI_ERR_MAX_ERR:
179 return "HCI_ERR_MAX_ERR";
180 case HCI_ERR_ESP_VENDOR_FAIL:
181 return "HCI_ERR_ESP_VENDOR_FAIL";
182 case HCI_HINT_TO_RECREATE_AMP_PHYS_LINK:
183 return "HCI_HINT_TO_RECREATE_AMP_PHYS_LINK";
184 default:
185 return "Invalid HCI status code.";
186 }
187
188 return NULL;
189 }
190 #endif /* !UC_BT_STACK_NO_LOG */
191
btm_ble_extendadvcb_init(void)192 void btm_ble_extendadvcb_init(void)
193 {
194 memset(&extend_adv_cb, 0, sizeof(tBTM_BLE_EXTENDED_CB));
195 }
196
btm_ble_advrecod_init(void)197 void btm_ble_advrecod_init(void)
198 {
199 memset(&adv_record[0], 0, sizeof(tBTM_EXT_ADV_RECORD)*MAX_BLE_ADV_INSTANCE);
200 }
201
BTM_BleGapRegisterCallback(tBTM_BLE_5_HCI_CBACK cb)202 void BTM_BleGapRegisterCallback(tBTM_BLE_5_HCI_CBACK cb)
203 {
204 if (cb) {
205 ble_5_hci_cb = cb;
206 } else {
207 BTM_TRACE_ERROR("%s, register fail, the cb function is NULL.", __func__);
208 }
209 }
210
BTM_ExtBleCallbackTrigger(tBTM_BLE_5_GAP_EVENT event,tBTM_BLE_5_GAP_CB_PARAMS * params)211 void BTM_ExtBleCallbackTrigger(tBTM_BLE_5_GAP_EVENT event, tBTM_BLE_5_GAP_CB_PARAMS *params)
212 {
213 if(params && params->status == BTM_SUCCESS) {
214 btm_ble_inter_set(true);
215 }
216 if (ble_5_hci_cb) {
217 ble_5_hci_cb(event, params);
218 }
219 }
220
BTM_BleReadPhy(BD_ADDR bd_addr,UINT8 * tx_phy,UINT8 * rx_phy)221 tBTM_STATUS BTM_BleReadPhy(BD_ADDR bd_addr, UINT8 *tx_phy, UINT8 *rx_phy)
222 {
223 tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
224 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
225
226 if (!tx_phy || !rx_phy || !p_lcb) {
227 cb_params.read_phy.status = BTM_ILLEGAL_VALUE;
228 memcpy(cb_params.read_phy.addr, bd_addr, BD_ADDR_LEN);
229
230 if (ble_5_hci_cb) {
231 ble_5_hci_cb(BTM_BLE_5_GAP_READ_PHY_COMPLETE_EVT, &cb_params);
232 }
233 BTM_TRACE_ERROR("%s, invalid parameters", __func__);
234 return BTM_ILLEGAL_VALUE;
235 }
236
237 btsnd_hcic_ble_read_phy(p_lcb->handle);
238
239 return BTM_SUCCESS;
240 }
241
BTM_BleSetPreferDefaultPhy(UINT8 tx_phy_mask,UINT8 rx_phy_mask)242 tBTM_STATUS BTM_BleSetPreferDefaultPhy(UINT8 tx_phy_mask, UINT8 rx_phy_mask)
243 {
244 UINT8 all_phys = 0;
245 tBTM_STATUS status = BTM_SUCCESS;
246 tHCI_STATUS err = HCI_SUCCESS;
247 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
248
249 if ((err = btsnd_hcic_ble_set_prefered_default_phy(all_phys, tx_phy_mask, rx_phy_mask)) != HCI_SUCCESS) {
250 BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
251 __func__, btm_ble_hci_status_to_str(err), err);
252 status = BTM_HCI_ERROR | err;
253 }
254
255 cb_params.set_perf_def_phy.status = status;
256
257 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_DEFAULT_PHY_COMPLETE_EVT, &cb_params);
258
259 return status;
260
261 }
262
BTM_BleSetPreferPhy(BD_ADDR bd_addr,UINT8 all_phys,UINT8 tx_phy_mask,UINT8 rx_phy_mask,UINT16 phy_options)263 tBTM_STATUS BTM_BleSetPreferPhy(BD_ADDR bd_addr, UINT8 all_phys, UINT8 tx_phy_mask,
264 UINT8 rx_phy_mask, UINT16 phy_options)
265 {
266 tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
267 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
268
269 if (!p_lcb) {
270 cb_params.status = BTM_ILLEGAL_VALUE;
271 if (ble_5_hci_cb) {
272 ble_5_hci_cb(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
273 }
274 BTM_TRACE_ERROR("%s, invalid parameters", __func__);
275 return BTM_ILLEGAL_VALUE;
276 }
277
278
279
280 if (!btsnd_hcic_ble_set_phy(p_lcb->handle, all_phys, tx_phy_mask, rx_phy_mask, phy_options)) {
281 cb_params.status = BTM_ILLEGAL_VALUE;
282 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
283 }
284
285
286 return BTM_SUCCESS;
287 }
288
BTM_BleSetExtendedAdvRandaddr(UINT8 instance,BD_ADDR rand_addr)289 tBTM_STATUS BTM_BleSetExtendedAdvRandaddr(UINT8 instance, BD_ADDR rand_addr)
290 {
291 tBTM_STATUS status = BTM_SUCCESS;
292 tHCI_STATUS err = HCI_SUCCESS;
293 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
294
295 if (instance >= MAX_BLE_ADV_INSTANCE || rand_addr == NULL) {
296 status = BTM_ILLEGAL_VALUE;
297 goto end;
298 }
299
300 /*
301 A static address is a 48-bit randomly generated address and shall meet the following requirements:
302 • The two most significant bits of the address shall be equal to 1
303 • All bits of the random part of the address shall not be equal to 1
304 • All bits of the random part of the address shall not be equal to 0
305 */
306 BD_ADDR invalid_rand_addr_a, invalid_rand_addr_b;
307 memset(invalid_rand_addr_a, 0xff, sizeof(BD_ADDR));
308 memset(invalid_rand_addr_b, 0x00, sizeof(BD_ADDR));
309 if((rand_addr[0] & BT_STATIC_RAND_ADDR_MASK) == BT_STATIC_RAND_ADDR_MASK) {
310 invalid_rand_addr_b[0] = invalid_rand_addr_b[0] | BT_STATIC_RAND_ADDR_MASK;
311 if (memcmp(invalid_rand_addr_a, rand_addr, BD_ADDR_LEN) == 0
312 || memcmp(invalid_rand_addr_b, rand_addr, BD_ADDR_LEN) == 0) {
313 status = BTM_ILLEGAL_VALUE;
314 goto end;
315 }
316 } else if ((rand_addr[0] | BT_NON_RPA_MASK) == BT_NON_RPA_MASK) {
317 invalid_rand_addr_a[0] = invalid_rand_addr_a[0] & BT_NON_RPA_MASK;
318 if (memcmp(invalid_rand_addr_a, rand_addr, BD_ADDR_LEN) == 0
319 || memcmp(invalid_rand_addr_b, rand_addr, BD_ADDR_LEN) == 0) {
320 status = BTM_ILLEGAL_VALUE;
321 goto end;
322 }
323 } else {
324 BTM_TRACE_ERROR("%s invalid random address", __func__);
325 status = BTM_ILLEGAL_VALUE;
326 goto end;
327 }
328
329 // set random address
330 if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
331 BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
332 __func__, btm_ble_hci_status_to_str(err), err);
333 status = BTM_HCI_ERROR | err;
334 } else {
335 // set random address success, update address info
336 if(extend_adv_cb.inst[instance].configured && extend_adv_cb.inst[instance].connetable) {
337 BTM_BleSetStaticAddr(rand_addr);
338 BTM_UpdateAddrInfor(BLE_ADDR_RANDOM, rand_addr);
339 }
340 }
341
342 end:
343 cb_params.set_ext_rand_addr.status = status;
344 cb_params.set_ext_rand_addr.instance = instance;
345 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT, &cb_params);
346
347 return status;
348
349 }
BTM_BleSetExtendedAdvParams(UINT8 instance,tBTM_BLE_GAP_EXT_ADV_PARAMS * params)350 tBTM_STATUS BTM_BleSetExtendedAdvParams(UINT8 instance, tBTM_BLE_GAP_EXT_ADV_PARAMS *params)
351 {
352 tBTM_STATUS status = BTM_SUCCESS;
353 tHCI_STATUS err = HCI_SUCCESS;
354 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
355 bool use_rpa_addr = false;
356 BD_ADDR rand_addr;
357
358 if (instance >= MAX_BLE_ADV_INSTANCE) {
359 status = BTM_ILLEGAL_VALUE;
360 BTM_TRACE_ERROR("%s invalid instance %d", __func__, instance);
361 goto end;
362 }
363
364 if ((status = btm_ble_ext_adv_params_validate(params)) != BTM_SUCCESS) {
365 BTM_TRACE_ERROR("%s, invalid extend adv params.", __func__);
366 }
367
368 if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE) {
369 extend_adv_cb.inst[instance].connetable = true;
370 } else {
371 extend_adv_cb.inst[instance].connetable = false;
372 }
373
374 if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_SCANNABLE) {
375 extend_adv_cb.inst[instance].scannable = true;
376 } else {
377 extend_adv_cb.inst[instance].scannable = false;
378 }
379
380 if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_LEGACY) {
381 extend_adv_cb.inst[instance].legacy_pdu = true;
382 } else {
383 extend_adv_cb.inst[instance].legacy_pdu = false;
384 }
385
386 #if (CONTROLLER_RPA_LIST_ENABLE == FALSE)
387 // if own_addr_type == BLE_ADDR_PUBLIC_ID or BLE_ADDR_RANDOM_ID,
388 if((params->own_addr_type == BLE_ADDR_PUBLIC_ID || params->own_addr_type == BLE_ADDR_RANDOM_ID) && BTM_GetLocalResolvablePrivateAddr(rand_addr)) {
389 params->own_addr_type = BLE_ADDR_RANDOM;
390 use_rpa_addr = true;
391 } else if(params->own_addr_type == BLE_ADDR_PUBLIC_ID){
392 params->own_addr_type = BLE_ADDR_PUBLIC;
393 } else if (params->own_addr_type == BLE_ADDR_RANDOM_ID) {
394 params->own_addr_type = BLE_ADDR_RANDOM;
395 }
396 #else
397 btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = params->own_addr_type;
398 #endif
399
400 if ((err = btsnd_hcic_ble_set_ext_adv_params(instance, params->type, params->interval_min, params->interval_max,
401 params->channel_map, params->own_addr_type, params->peer_addr_type,
402 params->peer_addr, params->filter_policy, params->tx_power,
403 params->primary_phy, params->max_skip,
404 params->secondary_phy, params->sid, params->scan_req_notif)) != HCI_SUCCESS) {
405 BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
406 status = BTM_HCI_ERROR | err;
407 goto end;
408 }
409
410 extend_adv_cb.inst[instance].configured = true;
411
412 end:
413 if(use_rpa_addr) {
414 // update RPA address
415 if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
416 BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
417 status = BTM_HCI_ERROR | err;
418 } else {
419 // set addr success, update address info
420 BTM_UpdateAddrInfor(BLE_ADDR_RANDOM, rand_addr);
421 }
422 }
423 cb_params.set_params.status = status;
424 cb_params.set_params.instance = instance;
425 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_PARAMS_COMPLETE_EVT, &cb_params);
426
427 return status;
428 }
429
BTM_BleConfigExtendedAdvDataRaw(BOOLEAN is_scan_rsp,UINT8 instance,UINT16 len,UINT8 * data)430 tBTM_STATUS BTM_BleConfigExtendedAdvDataRaw(BOOLEAN is_scan_rsp, UINT8 instance, UINT16 len, UINT8 *data)
431 {
432 tBTM_STATUS status = BTM_SUCCESS;
433 tHCI_STATUS err = HCI_SUCCESS;
434 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
435 UINT16 rem_len = len;
436 UINT8 operation = 0;
437 UINT16 data_offset = 0;
438
439
440 if ((status = btm_ble_ext_adv_set_data_validate(instance, len, data)) != BTM_SUCCESS) {
441 BTM_TRACE_ERROR("%s, invalid extend adv data.", __func__);
442 goto end;
443 }
444
445 do {
446 UINT8 send_data_len = (rem_len > BTM_BLE_EXT_ADV_DATA_LEN_MAX) ? BTM_BLE_EXT_ADV_DATA_LEN_MAX : rem_len;
447 if (len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
448 operation = BTM_BLE_ADV_DATA_OP_COMPLETE;
449 } else {
450 if (rem_len == len) {
451 operation = BTM_BLE_ADV_DATA_OP_FIRST_FRAG;
452 } else if (rem_len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
453 operation = BTM_BLE_ADV_DATA_OP_LAST_FRAG;
454 } else {
455 operation = BTM_BLE_ADV_DATA_OP_INTERMEDIATE_FRAG;
456 }
457 }
458 if (!is_scan_rsp) {
459 if ((err = btsnd_hcic_ble_set_ext_adv_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
460 BTM_TRACE_ERROR("LE EA SetAdvData: cmd err=0x%x", err);
461 status = BTM_HCI_ERROR | err;
462 break;
463 }
464 } else {
465 if ((err = btsnd_hcic_ble_set_ext_adv_scan_rsp_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
466 BTM_TRACE_ERROR("LE EA SetScanRspData: cmd err=0x%x", err);
467 status = BTM_HCI_ERROR | err;
468 break;
469 }
470 }
471
472 rem_len -= send_data_len;
473 data_offset += send_data_len;
474 } while (rem_len);
475
476 end:
477 if (is_scan_rsp) {
478 cb_params.scan_rsp_data_set.status = status;
479 cb_params.scan_rsp_data_set.instance = instance;
480 } else {
481 cb_params.adv_data_set.status = status;
482 cb_params.adv_data_set.instance = instance;
483 }
484
485 BTM_ExtBleCallbackTrigger(is_scan_rsp ? BTM_BLE_5_GAP_EXT_SCAN_RSP_DATA_SET_COMPLETE_EVT : BTM_BLE_5_GAP_EXT_ADV_DATA_SET_COMPLETE_EVT, &cb_params);
486
487 return status;
488 }
489
BTM_BleStartExtAdv(BOOLEAN enable,UINT8 num,tBTM_BLE_EXT_ADV * ext_adv)490 tBTM_STATUS BTM_BleStartExtAdv(BOOLEAN enable, UINT8 num, tBTM_BLE_EXT_ADV *ext_adv)
491 {
492 tBTM_STATUS status = BTM_SUCCESS;
493 tHCI_STATUS err = HCI_SUCCESS;
494 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
495
496 UINT8 *instance = NULL;
497 UINT16 *duration = NULL;
498 UINT8 *max_events = NULL;
499
500 // when enable = true, ext_adv = NULL or num = 0, goto end
501 if ((!ext_adv || num == 0) && enable) {
502 status = BTM_ILLEGAL_VALUE;
503 BTM_TRACE_ERROR("%s invalid parameters", __func__);
504 goto end;
505 }
506
507 if (num != 0 && ext_adv != NULL) {
508 instance = osi_malloc(num);
509 duration = osi_malloc(num*sizeof(UINT16));
510 max_events = osi_malloc(num*sizeof(UINT8));
511
512 if (!instance || !duration || !max_events) {
513 status = BTM_NO_RESOURCES;
514 BTM_TRACE_ERROR("%s invalid parameters", __func__);
515 goto end;
516 }
517
518 for (int i = 0; i < num; i++) {
519 instance[i] = ext_adv[i].instance;
520 duration[i] = ext_adv[i].duration;
521 max_events[i] = ext_adv[i].max_events;
522 }
523
524 if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, instance,
525 duration, max_events)) != HCI_SUCCESS) {
526 BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
527 status = BTM_HCI_ERROR | err;
528 }
529
530 osi_free(instance);
531 osi_free(duration);
532 osi_free(max_events);
533 } else {
534 // enable = false, num == 0 or ext_adv = NULL
535
536 if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, NULL, NULL, NULL)) != HCI_SUCCESS) {
537 BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
538 status = BTM_HCI_ERROR | err;
539 }
540 goto end;
541 }
542
543
544
545 end:
546
547 if (!enable && status == BTM_SUCCESS) {
548 // disable all ext adv
549 if(num == 0) {
550
551 for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++)
552 {
553 adv_record[i].invalid = false;
554 adv_record[i].enabled = false;
555 adv_record[i].instance = INVALID_VALUE;
556 adv_record[i].duration = INVALID_VALUE;
557 adv_record[i].max_events = INVALID_VALUE;
558 adv_record[i].retry_count = 0;
559 }
560 } else {
561 for (uint8_t i = 0; i < num; i++)
562 {
563 uint8_t index = ext_adv[i].instance;
564 adv_record[index].invalid = false;
565 adv_record[index].enabled = false;
566 adv_record[index].instance = INVALID_VALUE;
567 adv_record[index].duration = INVALID_VALUE;
568 adv_record[index].max_events = INVALID_VALUE;
569 adv_record[index].retry_count = 0;
570 }
571 }
572 }
573 // start extend adv success, save the adv information
574 if(enable && status == BTM_SUCCESS) {
575 for (uint8_t i = 0; i < num; i++)
576 {
577 uint8_t index = ext_adv[i].instance;
578 adv_record[index].invalid = true;
579 adv_record[index].enabled = true;
580 adv_record[index].instance = ext_adv[i].instance;
581 adv_record[index].duration = ext_adv[i].duration;
582 adv_record[index].max_events = ext_adv[i].max_events;
583 adv_record[index].retry_count = 0;
584 }
585 }
586
587 cb_params.adv_start.status = status;
588 cb_params.adv_start.instance_num = num;
589 for (uint8_t i = 0; i < num; i++) {
590 cb_params.adv_start.instance[i] = ext_adv[i].instance;
591 }
592
593 BTM_ExtBleCallbackTrigger(enable ? BTM_BLE_5_GAP_EXT_ADV_START_COMPLETE_EVT : BTM_BLE_5_GAP_EXT_ADV_STOP_COMPLETE_EVT, &cb_params);
594
595 return status;
596 }
597
BTM_BleStartExtAdvRestart(uint8_t con_handle)598 tBTM_STATUS BTM_BleStartExtAdvRestart(uint8_t con_handle)
599 {
600 tBTM_BLE_EXT_ADV ext_adv;
601 uint8_t index = INVALID_VALUE;
602 for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++)
603 {
604 if(adv_record[i].ter_con_handle == con_handle) {
605 index = i;
606 break;
607 }
608 }
609
610 if((index >= MAX_BLE_ADV_INSTANCE) || (!adv_record[index].invalid)) {
611 return BTM_WRONG_MODE;
612 }
613
614 adv_record[index].retry_count ++;
615 BTM_TRACE_DEBUG("remote device did not receive aux connect response, retatrt the extend adv to reconnect, adv handle %d con_handle %d\n", index, con_handle);
616 ext_adv.instance = adv_record[index].instance;
617 ext_adv.duration = adv_record[index].duration;
618 ext_adv.max_events = adv_record[index].max_events;
619 return BTM_BleStartExtAdv(true, 1, &ext_adv);
620 }
621
BTM_BleExtAdvSetRemove(UINT8 instance)622 tBTM_STATUS BTM_BleExtAdvSetRemove(UINT8 instance)
623 {
624 tBTM_STATUS status = BTM_SUCCESS;
625 tHCI_STATUS err = HCI_SUCCESS;
626 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
627
628 if (instance >= MAX_BLE_ADV_INSTANCE) {
629 status = BTM_ILLEGAL_VALUE;
630 BTM_TRACE_ERROR("%s invalid instance %d", __func__, instance);
631 goto end;
632 }
633
634 if ((err = btsnd_hcic_ble_remove_adv_set(instance)) != HCI_SUCCESS) {
635 BTM_TRACE_ERROR("LE EAS Rm: cmd err=0x%x", err);
636 status = BTM_HCI_ERROR | err;
637 } else {
638 extend_adv_cb.inst[instance].configured = false;
639 extend_adv_cb.inst[instance].legacy_pdu = false;
640 extend_adv_cb.inst[instance].directed = false;
641 extend_adv_cb.inst[instance].scannable = false;
642 extend_adv_cb.inst[instance].connetable = false;
643 }
644
645 end:
646
647 cb_params.adv_start.status = status;
648 cb_params.adv_start.instance_num = 1;
649 cb_params.adv_start.instance[0] = instance;
650
651 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_REMOVE_COMPLETE_EVT, &cb_params);
652
653 return status;
654 }
655
BTM_BleExtAdvSetClear(void)656 tBTM_STATUS BTM_BleExtAdvSetClear(void)
657 {
658 tBTM_STATUS status = BTM_SUCCESS;
659 tHCI_STATUS err = HCI_SUCCESS;
660 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
661
662 if ((err = btsnd_hcic_ble_clear_adv_set()) != HCI_SUCCESS) {
663 BTM_TRACE_ERROR("LE EAS Clr: cmd err=0x%x", err);
664 status = BTM_HCI_ERROR | err;
665 } else {
666 for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++) {
667 extend_adv_cb.inst[i].configured = false;
668 extend_adv_cb.inst[i].legacy_pdu = false;
669 extend_adv_cb.inst[i].directed = false;
670 extend_adv_cb.inst[i].scannable = false;
671 extend_adv_cb.inst[i].connetable = false;
672 }
673 }
674
675 cb_params.adv_start.status = status;
676
677 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_CLEAR_COMPLETE_EVT, &cb_params);
678
679 return status;
680 }
681
BTM_BlePeriodicAdvSetParams(UINT8 instance,tBTM_BLE_Periodic_Adv_Params * params)682 tBTM_STATUS BTM_BlePeriodicAdvSetParams(UINT8 instance, tBTM_BLE_Periodic_Adv_Params *params)
683 {
684 tBTM_STATUS status = BTM_SUCCESS;
685 tHCI_STATUS err = HCI_SUCCESS;
686 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
687 //ext_adv_flag = true;
688
689 if (instance >= MAX_BLE_ADV_INSTANCE) {
690 status = BTM_ILLEGAL_VALUE;
691 BTM_TRACE_ERROR("%s invalid instance %d", __func__, instance);
692 goto end;
693 }
694
695 if (!extend_adv_cb.inst[instance].configured ||
696 extend_adv_cb.inst[instance].scannable ||
697 extend_adv_cb.inst[instance].connetable ||
698 extend_adv_cb.inst[instance].legacy_pdu) {
699 BTM_TRACE_ERROR("%s, instance = %d, Before set the periodic adv parameters, please configure the the \
700 extend adv to nonscannable and nonconnectable first, and it shouldn't include the legacy bit.", __func__, instance);
701 status = BTM_ILLEGAL_VALUE;
702 goto end;
703 }
704
705 if ((err= btsnd_hcic_ble_set_periodic_adv_params(instance, params->interval_min,
706 params->interval_max, params->properties)) != HCI_SUCCESS) {
707 BTM_TRACE_ERROR("LE PA SetParams: cmd err=0x%x", err);
708 status = BTM_HCI_ERROR | err;
709 }
710
711 end:
712
713 cb_params.per_adv_set_params.status = status;
714 cb_params.per_adv_set_params.instance = instance;
715
716 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SET_PARAMS_COMPLETE_EVT, &cb_params);
717
718 return status;
719 }
720
BTM_BlePeriodicAdvCfgDataRaw(UINT8 instance,UINT16 len,UINT8 * data,BOOLEAN only_update_did)721 tBTM_STATUS BTM_BlePeriodicAdvCfgDataRaw(UINT8 instance, UINT16 len, UINT8 *data,BOOLEAN only_update_did)
722 {
723 tBTM_STATUS status = BTM_SUCCESS;
724 tHCI_STATUS err = HCI_SUCCESS;
725 uint16_t rem_len = len;
726 UINT8 operation = 0;
727 UINT16 data_offset = 0;
728 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
729 if (only_update_did)
730 {
731 len = 0;
732 data = NULL;
733 rem_len = 0;
734 operation = BTM_BLE_ADV_DATA_OP_UNCHANGED_DATA;
735 }
736
737 if ((status = btm_ble_ext_adv_set_data_validate(instance, len, data)) != BTM_SUCCESS) {
738 BTM_TRACE_ERROR("%s, invalid extend adv data.", __func__);
739 goto end;
740 }
741
742 do {
743 UINT8 send_data_len = (rem_len > BTM_BLE_PERIODIC_ADV_DATA_LEN_MAX) ? BTM_BLE_PERIODIC_ADV_DATA_LEN_MAX : rem_len;
744
745 if (len <= BTM_BLE_PERIODIC_ADV_DATA_LEN_MAX) {
746 if (!only_update_did) {
747 operation = BTM_BLE_ADV_DATA_OP_COMPLETE;
748 }
749 } else {
750 if (rem_len == len) {
751 operation = BTM_BLE_ADV_DATA_OP_FIRST_FRAG;
752 } else if (rem_len <= BTM_BLE_PERIODIC_ADV_DATA_LEN_MAX) {
753 operation = BTM_BLE_ADV_DATA_OP_LAST_FRAG;
754 } else {
755 operation = BTM_BLE_ADV_DATA_OP_INTERMEDIATE_FRAG;
756 }
757 }
758
759 if ((err = btsnd_hcic_ble_set_periodic_adv_data(instance, operation, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
760 BTM_TRACE_ERROR("LE PA SetData: cmd err=0x%x", err);
761 status = BTM_HCI_ERROR | err;
762 break;
763 }
764
765 rem_len -= send_data_len;
766 data_offset += send_data_len;
767 } while(rem_len);
768
769 end:
770 cb_params.per_adv_data_set.status = status;
771 cb_params.per_adv_data_set.instance = instance;
772
773 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_DATA_SET_COMPLETE_EVT, &cb_params);
774
775 return status;
776 }
777
BTM_BlePeriodicAdvEnable(UINT8 instance,UINT8 enable)778 tBTM_STATUS BTM_BlePeriodicAdvEnable(UINT8 instance, UINT8 enable)
779 {
780 tBTM_STATUS status = BTM_SUCCESS;
781 tHCI_STATUS err = HCI_SUCCESS;
782 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
783
784 if (instance >= MAX_BLE_ADV_INSTANCE) {
785 BTM_TRACE_ERROR("%s, invalid instance %d", __func__, instance);
786 status = BTM_ILLEGAL_VALUE;
787 goto end;
788 }
789
790 if ((err = btsnd_hcic_ble_periodic_adv_enable(enable, instance)) != HCI_SUCCESS) {
791 BTM_TRACE_ERROR("LE PA En=%d: cmd err=0x%x", enable, err);
792 status = BTM_HCI_ERROR | err;
793 }
794
795 end:
796 if (enable) {
797 cb_params.per_adv_start.status = status;
798 cb_params.per_adv_start.instance = instance;
799 } else {
800 cb_params.per_adv_stop.status = status;
801 cb_params.per_adv_stop.instance = instance;
802 }
803
804 BTM_ExtBleCallbackTrigger(enable ? BTM_BLE_5_GAP_PERIODIC_ADV_START_COMPLETE_EVT : BTM_BLE_5_GAP_PERIODIC_ADV_STOP_COMPLETE_EVT, &cb_params);
805
806 return status;
807
808 }
809
BTM_BlePeriodicAdvCreateSync(tBTM_BLE_Periodic_Sync_Params * params)810 tBTM_STATUS BTM_BlePeriodicAdvCreateSync(tBTM_BLE_Periodic_Sync_Params *params)
811 {
812 //tHCI_STATUS err = HCI_SUCCESS;
813 tBTM_STATUS status = BTM_SUCCESS;
814 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
815
816 if (!params) {
817 status = BTM_ILLEGAL_VALUE;
818 BTM_TRACE_ERROR("%s, the parameter is NULL.", __func__);
819 goto end;
820 }
821
822 if ((params->sync_timeout < 0x0a || params->sync_timeout > 0x4000)
823 || (params->filter_policy > 0x01)
824 #if (CONFIG_BT_BLE_FEAT_CREATE_SYNC_ENH)
825 || (params->reports_disabled > 0x01)
826 || (params->filter_duplicates > 0x01)
827 #endif
828 /*If the Periodic Advertiser List is not used,
829 the Advertising_SID, Advertiser Address_Type, and Advertiser Address
830 parameters specify the periodic advertising device to listen to; otherwise they
831 shall be ignored.*/
832 || (params->filter_policy == 0 && params->addr_type > 0x01)
833 || (params->filter_policy == 0 && params->sid > 0xf)
834 || (params->skip > 0x01F3)) {
835 status = BTM_ILLEGAL_VALUE;
836 BTM_TRACE_ERROR("%s, The sync parameters is invalid.", __func__);
837 goto end;
838 }
839 uint8_t option = 0x00;
840 if (params->filter_policy) {
841 SET_BIT(option, 0);
842 }
843
844 #if (CONFIG_BT_BLE_FEAT_CREATE_SYNC_ENH)
845 if (params->reports_disabled) {
846 SET_BIT(option, 1);
847 }
848 if (params->filter_duplicates) {
849 SET_BIT(option, 2);
850 }
851 #endif
852
853 if (!btsnd_hcic_ble_periodic_adv_create_sync(option, params->sid, params->addr_type,
854 params->addr, params->sync_timeout, 0)) {
855 BTM_TRACE_ERROR("LE PA CreateSync cmd failed");
856 status = BTM_ILLEGAL_VALUE;
857 }
858
859 end:
860 if(status != BTM_SUCCESS) {
861 cb_params.status = status;
862 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_CREATE_SYNC_COMPLETE_EVT, &cb_params);
863 }
864
865 return status;
866 }
867
btm_set_phy_callback(UINT8 status)868 void btm_set_phy_callback(UINT8 status)
869 {
870 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
871 cb_params.status = status;
872
873 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
874
875 }
876
btm_create_sync_callback(UINT8 status)877 void btm_create_sync_callback(UINT8 status)
878 {
879 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
880 cb_params.status = status;
881
882 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_CREATE_SYNC_COMPLETE_EVT, &cb_params);
883 }
884
btm_read_phy_callback(uint8_t hci_status,uint16_t conn_handle,uint8_t tx_phy,uint8_t rx_phy)885 void btm_read_phy_callback(uint8_t hci_status, uint16_t conn_handle, uint8_t tx_phy, uint8_t rx_phy)
886 {
887 tBTM_STATUS status = BTM_SUCCESS;
888 tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(conn_handle);
889 if(hci_status != HCI_SUCCESS) {
890 status = BTM_ILLEGAL_VALUE;
891 BTM_TRACE_ERROR("%s error status %d", __func__, hci_status);
892 }
893 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
894 if(p_lcb) {
895 memcpy(cb_params.read_phy.addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
896 }
897 cb_params.read_phy.status = status;
898 cb_params.read_phy.tx_phy = tx_phy;
899 cb_params.read_phy.rx_phy = rx_phy;
900
901 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_READ_PHY_COMPLETE_EVT, &cb_params);
902 }
903
BTM_BlePeriodicAdvSyncCancel(void)904 tBTM_STATUS BTM_BlePeriodicAdvSyncCancel(void)
905 {
906 tHCI_STATUS err = HCI_SUCCESS;
907 tBTM_STATUS status = BTM_SUCCESS;
908 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
909
910 if ((err = btsnd_hcic_ble_periodic_adv_create_sync_cancel()) != HCI_SUCCESS) {
911 BTM_TRACE_ERROR("LE PA SyncCancel, cmd err=0x%x", err);
912 status = BTM_HCI_ERROR | err;
913 }
914
915 cb_params.status = status;
916
917 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_CANCEL_COMPLETE_EVT, &cb_params);
918
919 return status;
920 }
921
BTM_BlePeriodicAdvSyncTerm(UINT16 sync_handle)922 tBTM_STATUS BTM_BlePeriodicAdvSyncTerm(UINT16 sync_handle)
923 {
924 tHCI_STATUS err = HCI_SUCCESS;
925 tBTM_STATUS status = BTM_SUCCESS;
926 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
927
928 if (( err = btsnd_hcic_ble_periodic_adv_term_sync(sync_handle)) != HCI_SUCCESS) {
929 BTM_TRACE_ERROR("LE PA SyncTerm: cmd err=0x%x", err);
930 status = BTM_HCI_ERROR | err;
931 }
932
933 cb_params.status = status;
934
935 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_TERMINATE_COMPLETE_EVT, &cb_params);
936
937 return status;
938 }
939
BTM_BlePeriodicAdvAddDevToList(tBLE_ADDR_TYPE addr_type,BD_ADDR addr,UINT16 sid)940 tBTM_STATUS BTM_BlePeriodicAdvAddDevToList(tBLE_ADDR_TYPE addr_type, BD_ADDR addr, UINT16 sid)
941 {
942 tHCI_STATUS err = HCI_SUCCESS;
943 tBTM_STATUS status = BTM_SUCCESS;
944 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
945
946 if (addr_type > BLE_ADDR_TYPE_MAX) {
947 status = BTM_ILLEGAL_VALUE;
948 BTM_TRACE_ERROR("%s invalid addr_type %d", __func__, addr_type);
949 goto end;
950 }
951
952 if ((err = btsnd_hcic_ble_add_dev_to_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
953 BTM_TRACE_ERROR("LE PA AddDevToList: cmd err=0x%x", err);
954 status = BTM_HCI_ERROR | err;
955 }
956
957 end:
958 cb_params.status = status;
959 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_ADD_DEV_COMPLETE_EVT, &cb_params);
960
961 return status;
962 }
963
BTM_BlePeriodicAdvRemoveDevFromList(tBLE_ADDR_TYPE addr_type,BD_ADDR addr,UINT16 sid)964 tBTM_STATUS BTM_BlePeriodicAdvRemoveDevFromList(tBLE_ADDR_TYPE addr_type, BD_ADDR addr, UINT16 sid)
965 {
966 tHCI_STATUS err = HCI_SUCCESS;
967 tBTM_STATUS status = BTM_SUCCESS;
968 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
969
970 if (addr_type > BLE_ADDR_TYPE_MAX) {
971 status = BTM_ILLEGAL_VALUE;
972 BTM_TRACE_ERROR("%s invalid addr_type %d", __func__, addr_type);
973 goto end;
974 }
975
976 if ((err = btsnd_hcic_ble_rm_dev_from_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
977 BTM_TRACE_ERROR("LE PA RmDevFromList: cmd err=0x%x", err);
978 status = BTM_HCI_ERROR | err;
979 }
980
981 end:
982
983 cb_params.status = status;
984 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_REMOVE_DEV_COMPLETE_EVT, &cb_params);
985 return status;
986 }
987
BTM_BlePeriodicAdvClearDev(void)988 tBTM_STATUS BTM_BlePeriodicAdvClearDev(void)
989 {
990 tHCI_STATUS err = HCI_SUCCESS;
991 tBTM_STATUS status = BTM_SUCCESS;
992 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
993
994 if ((err = btsnd_hcic_ble_clear_periodic_adv_list()) != HCI_SUCCESS) {
995 BTM_TRACE_ERROR("LE PA ClrDev: cmd err=0x%x", err);
996 status = BTM_HCI_ERROR | err;
997 }
998
999 cb_params.status = status;
1000 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_CLEAR_DEV_COMPLETE_EVT, &cb_params);
1001
1002 return status;
1003 }
1004
BTM_BleSetExtendedScanParams(tBTM_BLE_EXT_SCAN_PARAMS * params)1005 tBTM_STATUS BTM_BleSetExtendedScanParams(tBTM_BLE_EXT_SCAN_PARAMS *params)
1006 {
1007 UINT8 phy_mask = 0;
1008 tHCI_STATUS err = HCI_SUCCESS;
1009 tBTM_STATUS status = BTM_SUCCESS;
1010 tHCI_EXT_SCAN_PARAMS hci_params[2];
1011 int phy_count = 0;
1012 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1013
1014 if (!params) {
1015 status = BTM_ILLEGAL_VALUE;
1016 BTM_TRACE_ERROR("%s invalid parameters", __func__);
1017 goto end;
1018 }
1019
1020 if (params->own_addr_type > BLE_ADDR_TYPE_MAX) {
1021 status = BTM_ILLEGAL_VALUE;
1022 goto end;
1023 }
1024
1025 if (params->cfg_mask & BTM_BLE_GAP_EXT_SCAN_UNCODE_MASK) {
1026 phy_mask |= 0x01;
1027 memcpy(&hci_params[phy_count], ¶ms->uncoded_cfg, sizeof(tHCI_EXT_SCAN_PARAMS));
1028 phy_count++;
1029 }
1030
1031 if (params->cfg_mask & BTM_BLE_GAP_EXT_SCAN_CODE_MASK) {
1032 phy_mask |= 0x04;
1033 memcpy(&hci_params[phy_count], ¶ms->coded_cfg, sizeof(tHCI_EXT_SCAN_PARAMS));
1034 phy_count++;
1035 }
1036
1037 if (BTM_BleUpdateOwnType(¶ms->own_addr_type, NULL) != 0 ) {
1038 status = BTM_ILLEGAL_VALUE;
1039 BTM_TRACE_ERROR("LE UpdateOwnType err");
1040 goto end;
1041 }
1042
1043 extend_adv_cb.scan_duplicate = params->scan_duplicate;
1044
1045 if ((err = btsnd_hcic_ble_set_ext_scan_params(params->own_addr_type, params->filter_policy, phy_mask, phy_count,
1046 hci_params)) != HCI_SUCCESS) {
1047 BTM_TRACE_ERROR("LE ES SetParams: cmd err=0x%x", err);
1048 status = BTM_HCI_ERROR | err;
1049 }
1050
1051 end:
1052
1053 cb_params.status = status;
1054
1055 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_EXT_SCAN_PARAMS_COMPLETE_EVT, &cb_params);
1056
1057 return cb_params.status;
1058 }
1059
BTM_BleExtendedScan(BOOLEAN enable,UINT16 duration,UINT16 period)1060 tBTM_STATUS BTM_BleExtendedScan(BOOLEAN enable, UINT16 duration, UINT16 period)
1061 {
1062 tHCI_STATUS err = HCI_SUCCESS;
1063 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1064 tBTM_STATUS status = BTM_SUCCESS;
1065
1066 if (extend_adv_cb.scan_duplicate > 0x03) {
1067 status = BTM_ILLEGAL_VALUE;
1068 BTM_TRACE_ERROR("%s invalid scan_duplicate %d", __func__, extend_adv_cb.scan_duplicate);
1069 goto end;
1070 }
1071
1072 if ((err = btsnd_hcic_ble_ext_scan_enable(enable, extend_adv_cb.scan_duplicate, duration, period)) != HCI_SUCCESS) {
1073 BTM_TRACE_ERROR("LE ES En=%d: cmd err=0x%x", enable, err);
1074 status = BTM_HCI_ERROR | err;
1075 }
1076
1077 end:
1078
1079 cb_params.status = status;
1080
1081 BTM_ExtBleCallbackTrigger(enable ? BTM_BLE_5_GAP_EXT_SCAN_START_COMPLETE_EVT : BTM_BLE_5_GAP_EXT_SCAN_STOP_COMPLETE_EVT, &cb_params);
1082
1083 return status;
1084 }
1085
BTM_BleSetPreferExtenedConnParams(BD_ADDR bd_addr,tBTM_EXT_CONN_PARAMS * params)1086 void BTM_BleSetPreferExtenedConnParams (BD_ADDR bd_addr, tBTM_EXT_CONN_PARAMS *params)
1087 {
1088 tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bd_addr);
1089 tBTM_STATUS status = BTM_SUCCESS;
1090 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1091
1092 if (p_dev_rec) {
1093 if (params) {
1094 memcpy(&p_dev_rec->ext_conn_params, params, sizeof(tBTM_EXT_CONN_PARAMS));
1095 } else {
1096 BTM_TRACE_ERROR("Invalid Extended connection parameters");
1097 status = BTM_ILLEGAL_VALUE;
1098 }
1099 } else {
1100 BTM_TRACE_ERROR("Unknown Device, setting rejected");
1101 status = BTM_UNKNOWN_ADDR;
1102 }
1103
1104 cb_params.status = status;
1105 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PREFER_EXT_CONN_PARAMS_SET_COMPLETE_EVT, &cb_params);
1106 }
1107
btm_ble_extended_init(void)1108 void btm_ble_extended_init(void)
1109 {
1110
1111 }
1112
btm_ble_extended_cleanup(void)1113 void btm_ble_extended_cleanup(void)
1114 {
1115
1116 }
1117
btm_ble_ext_adv_params_validate(tBTM_BLE_GAP_EXT_ADV_PARAMS * params)1118 static tBTM_STATUS btm_ble_ext_adv_params_validate(tBTM_BLE_GAP_EXT_ADV_PARAMS *params)
1119 {
1120 if (!params) {
1121 return BTM_ILLEGAL_VALUE;
1122 }
1123
1124 if (params->own_addr_type > BLE_ADDR_TYPE_MAX) {
1125 BTM_TRACE_ERROR("%s, invalid own address type, line %d, addr type %d", __func__, __LINE__, params->own_addr_type);
1126 return BTM_ILLEGAL_VALUE;
1127 }
1128
1129 if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_LEGACY) {
1130 /* Not allowed for legacy PDUs. */
1131 if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_INCLUDE_TX_PWR) {
1132 BTM_TRACE_ERROR("%s, The Legacy adv can't include tx power bit, line %d", __func__, __LINE__);
1133 return BTM_ILLEGAL_VALUE;
1134 }
1135 }
1136
1137 if (!(params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_LEGACY)) {
1138 /* Not allowed for extended advertising PDUs */
1139 if ((params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE) &&
1140 (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_SCANNABLE)) {
1141 BTM_TRACE_ERROR("%s, For the Extend adv, the properties can't be connectable and scannable at the same time, line %d", __func__, __LINE__);
1142 return BTM_ILLEGAL_VALUE;
1143 }
1144
1145 /* HD directed advertising allowed only for legacy PDUs */
1146 if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_HD_DIRECTED) {
1147 BTM_TRACE_ERROR("%s, HD directed advertising allowed only for legacy PDUs. line %d", __func__, __LINE__);
1148 return BTM_ILLEGAL_VALUE;
1149 }
1150 }
1151
1152 return BTM_SUCCESS;
1153 }
1154
btm_ble_ext_adv_set_data_validate(UINT8 instance,UINT16 len,UINT8 * data)1155 static tBTM_STATUS btm_ble_ext_adv_set_data_validate(UINT8 instance, UINT16 len, UINT8 *data)
1156 {
1157 if (data == NULL && len > 0) {
1158 BTM_TRACE_ERROR("%s, the extend adv data is NULL. line %d", __func__, __LINE__);
1159 return BTM_ILLEGAL_VALUE;
1160 }
1161
1162 if (instance >= MAX_BLE_ADV_INSTANCE) {
1163 BTM_TRACE_ERROR("%s, adv instance is %d, Exceeded the maximum. line %d", __func__, instance, __LINE__);
1164 return BTM_ILLEGAL_VALUE;
1165 }
1166
1167 if (!extend_adv_cb.inst[instance].configured) {
1168 BTM_TRACE_ERROR("%s, The extend adv hasn't configured, please use the set_ext_adv_params API to set the ext adv parameters first. line %d", __func__, __LINE__);
1169 return BTM_ILLEGAL_VALUE;
1170 }
1171
1172 /* Not allowed with the direted advertising for legacy */
1173 if (extend_adv_cb.inst[instance].legacy_pdu && extend_adv_cb.inst[instance].directed) {
1174 BTM_TRACE_ERROR("%s, Not allowed with the direted advertising for legacy. line %d", __func__, __LINE__);
1175 return BTM_ILLEGAL_VALUE;
1176 }
1177
1178 /* Always allowed with legacy PDU but limited to legacy length */
1179 if (extend_adv_cb.inst[instance].legacy_pdu) {
1180 if (len > 31) {
1181 BTM_TRACE_ERROR("%s, for the legacy adv, the adv data length can't exceed 31. line %d", __func__, __LINE__);
1182 return BTM_ILLEGAL_VALUE;
1183 }
1184 } else {
1185 if (len > controller_get_interface()->ble_get_ext_adv_data_max_len()) {
1186 BTM_TRACE_ERROR("%s, The adv data len(%d) is longer then the controller adv max len(%d)",
1187 __func__, len, controller_get_interface()->ble_get_ext_adv_data_max_len());
1188 return BTM_ILLEGAL_VALUE;
1189 }
1190 }
1191
1192 return BTM_SUCCESS;
1193 }
1194
btm_ble_update_phy_evt(tBTM_BLE_UPDATE_PHY * params)1195 void btm_ble_update_phy_evt(tBTM_BLE_UPDATE_PHY *params)
1196 {
1197 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1198
1199 if (!params) {
1200 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1201 return;
1202 }
1203 tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(params->conn_idx);
1204 if(!p_lcb) {
1205 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1206 return;
1207 }
1208
1209 cb_params.phy_update.status = params->status;
1210 cb_params.phy_update.tx_phy = params->tx_phy;
1211 cb_params.phy_update.rx_phy = params->rx_phy;
1212 memcpy(cb_params.phy_update.addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
1213
1214 // If the user has register the callback function, should callback it to the application.
1215
1216 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PHY_UPDATE_COMPLETE_EVT, &cb_params);
1217
1218 return;
1219 }
1220
btm_ble_scan_timeout_evt(void)1221 void btm_ble_scan_timeout_evt(void)
1222 {
1223 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SCAN_TIMEOUT_EVT, NULL);
1224 }
1225
btm_ble_adv_set_terminated_evt(tBTM_BLE_ADV_TERMINAT * params)1226 void btm_ble_adv_set_terminated_evt(tBTM_BLE_ADV_TERMINAT *params)
1227 {
1228 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1229
1230 if (!params) {
1231 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1232 return;
1233 }
1234
1235 // adv terminated due to connection, save the adv handle and connection handle
1236 if(params->completed_event == 0x00) {
1237 adv_record[params->adv_handle].ter_con_handle = params->conn_handle;
1238 } else {
1239 adv_record[params->adv_handle].ter_con_handle = INVALID_VALUE;
1240 adv_record[params->adv_handle].invalid = false;
1241 }
1242 adv_record[params->adv_handle].enabled = false;
1243
1244 memcpy(&cb_params.adv_term, params, sizeof(tBTM_BLE_ADV_TERMINAT));
1245
1246 // If the user has register the callback function, should callback it to the application.
1247 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_ADV_TERMINATED_EVT, &cb_params);
1248
1249 return;
1250 }
1251
btm_ble_ext_adv_report_evt(tBTM_BLE_EXT_ADV_REPORT * params)1252 void btm_ble_ext_adv_report_evt(tBTM_BLE_EXT_ADV_REPORT *params)
1253 {
1254 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1255
1256 if (!params) {
1257 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1258 return;
1259 }
1260
1261 memcpy(&cb_params.ext_adv_report, params, sizeof(tBTM_BLE_EXT_ADV_REPORT));
1262
1263 // If the user has register the callback function, should callback it to the application.
1264 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_REPORT_EVT, &cb_params);
1265
1266 return;
1267
1268 }
1269
btm_ble_scan_req_received_evt(tBTM_BLE_SCAN_REQ_RECEIVED * params)1270 void btm_ble_scan_req_received_evt(tBTM_BLE_SCAN_REQ_RECEIVED *params)
1271 {
1272 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1273
1274 if (!params) {
1275 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1276 return;
1277 }
1278
1279 memcpy(&cb_params.scan_req, params, sizeof(tBTM_BLE_SCAN_REQ_RECEIVED));
1280
1281 // If the user has register the callback function, should callback it to the application.
1282 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SCAN_REQ_RECEIVED_EVT, &cb_params);
1283
1284 return;
1285 }
1286
btm_ble_channel_select_algorithm_evt(tBTM_BLE_CHANNEL_SEL_ALG * params)1287 void btm_ble_channel_select_algorithm_evt(tBTM_BLE_CHANNEL_SEL_ALG *params)
1288 {
1289 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1290
1291 if (!params) {
1292 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1293 return;
1294 }
1295
1296 memcpy(&cb_params.channel_sel, params, sizeof(tBTM_BLE_CHANNEL_SEL_ALG));
1297
1298 // If the user has register the callback function, should callback it to the application.
1299 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_CHANNEL_SELETE_ALGORITHM_EVT, &cb_params);
1300
1301 return;
1302 }
1303
btm_ble_periodic_adv_report_evt(tBTM_PERIOD_ADV_REPORT * params)1304 void btm_ble_periodic_adv_report_evt(tBTM_PERIOD_ADV_REPORT *params)
1305 {
1306 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1307
1308 if (!params) {
1309 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1310 return;
1311 }
1312
1313 memcpy(&cb_params.period_adv_report, params, sizeof(tBTM_PERIOD_ADV_REPORT));
1314
1315 // If the user has register the callback function, should callback it to the application.
1316 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_REPORT_EVT, &cb_params);
1317
1318 return;
1319
1320 }
1321
btm_ble_periodic_adv_sync_lost_evt(tBTM_BLE_PERIOD_ADV_SYNC_LOST * params)1322 void btm_ble_periodic_adv_sync_lost_evt(tBTM_BLE_PERIOD_ADV_SYNC_LOST *params)
1323 {
1324 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1325
1326 if (!params) {
1327 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1328 return;
1329 }
1330
1331 memcpy(&cb_params.sync_lost, params, sizeof(tBTM_BLE_PERIOD_ADV_SYNC_LOST));
1332
1333 // If the user has register the callback function, should callback it to the application.
1334 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_LOST_EVT, &cb_params);
1335
1336 return;
1337
1338 }
1339
btm_ble_periodic_adv_sync_establish_evt(tBTM_BLE_PERIOD_ADV_SYNC_ESTAB * params)1340 void btm_ble_periodic_adv_sync_establish_evt(tBTM_BLE_PERIOD_ADV_SYNC_ESTAB *params)
1341 {
1342 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1343
1344 if (!params) {
1345 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1346 return;
1347 }
1348
1349 memcpy(&cb_params.sync_estab, params, sizeof(tBTM_BLE_PERIOD_ADV_SYNC_ESTAB));
1350
1351 // If the user has register the callback function, should callback it to the application.
1352 BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_ESTAB_EVT, &cb_params);
1353
1354 return;
1355
1356 }
1357
btm_ble_ext_adv_active_count(void)1358 uint8_t btm_ble_ext_adv_active_count(void)
1359 {
1360 uint8_t count = 0;
1361
1362 for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++) {
1363 if (adv_record[i].enabled == true) {
1364 count++;
1365 }
1366 }
1367
1368 return count;
1369 }
1370
1371 #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)
1372
1373 #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
btm_ble_periodic_adv_sync_trans_complete(UINT16 op_code,UINT8 hci_status,UINT16 conn_handle)1374 void btm_ble_periodic_adv_sync_trans_complete(UINT16 op_code, UINT8 hci_status, UINT16 conn_handle)
1375 {
1376 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1377 UINT8 evt = BTM_BLE_5_GAP_UNKNOWN_EVT;
1378 tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(conn_handle);
1379
1380 switch (op_code) {
1381 case HCI_BLE_PERIOD_ADV_SYNC_TRANS:
1382 evt = BTM_BLE_GAP_PERIODIC_ADV_SYNC_TRANS_COMPLETE_EVT;
1383 break;
1384 case HCI_BLE_PERIOD_ADV_SET_INFO_TRANS:
1385 evt = BTM_BLE_GAP_PERIODIC_ADV_SET_INFO_TRANS_COMPLETE_EVT;
1386 break;
1387 case HCI_BLE_SET_PAST_PARAMS:
1388 evt = BTM_BLE_GAP_SET_PAST_PARAMS_COMPLETE_EVT;
1389 break;
1390 default:
1391 return;
1392 }
1393
1394 cb_params.per_adv_sync_trans.status = BTM_SUCCESS;
1395 if(hci_status != HCI_SUCCESS) {
1396 cb_params.per_adv_sync_trans.status = BTM_ILLEGAL_VALUE;
1397 BTM_TRACE_ERROR("%s error status %d", __func__, hci_status);
1398 }
1399
1400 if(p_lcb) {
1401 memcpy(cb_params.per_adv_sync_trans.addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
1402 }
1403
1404 BTM_ExtBleCallbackTrigger(evt, &cb_params);
1405 }
1406
BTM_BlePeriodicAdvRecvEnable(UINT16 sync_handle,UINT8 enable)1407 void BTM_BlePeriodicAdvRecvEnable(UINT16 sync_handle, UINT8 enable)
1408 {
1409 tHCI_STATUS err = HCI_SUCCESS;
1410 tBTM_STATUS status = BTM_SUCCESS;
1411 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1412
1413 if ((err = btsnd_hcic_ble_set_periodic_adv_recv_enable(sync_handle, enable)) != HCI_SUCCESS) {
1414 BTM_TRACE_ERROR("%s cmd err=0x%x", __func__, err);
1415 status = BTM_HCI_ERROR | err;
1416 }
1417
1418 cb_params.status = status;
1419 BTM_ExtBleCallbackTrigger(BTM_BLE_GAP_PERIODIC_ADV_RECV_ENABLE_COMPLETE_EVT, &cb_params);
1420 }
1421
BTM_BlePeriodicAdvSyncTrans(BD_ADDR bd_addr,UINT16 service_data,UINT16 sync_handle)1422 void BTM_BlePeriodicAdvSyncTrans(BD_ADDR bd_addr, UINT16 service_data, UINT16 sync_handle)
1423 {
1424 tBTM_STATUS status = BTM_SUCCESS;
1425 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1426
1427 tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
1428 if (!p_lcb) {
1429 BTM_TRACE_ERROR("%s, invalid parameters", __func__);
1430 status = BTM_ILLEGAL_VALUE;
1431 }
1432
1433 if (status != BTM_SUCCESS) {
1434 cb_params.per_adv_sync_trans.status = status;
1435 memcpy(cb_params.per_adv_sync_trans.addr, bd_addr, sizeof(BD_ADDR));
1436 BTM_ExtBleCallbackTrigger(BTM_BLE_GAP_PERIODIC_ADV_SYNC_TRANS_COMPLETE_EVT, &cb_params);
1437 return;
1438 }
1439
1440 btsnd_hcic_ble_periodic_adv_sync_trans(p_lcb->handle, service_data, sync_handle);
1441 }
1442
BTM_BlePeriodicAdvSetInfoTrans(BD_ADDR bd_addr,UINT16 service_data,UINT8 adv_handle)1443 void BTM_BlePeriodicAdvSetInfoTrans(BD_ADDR bd_addr, UINT16 service_data, UINT8 adv_handle)
1444 {
1445 tBTM_STATUS status = BTM_SUCCESS;
1446 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1447 tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
1448
1449 if (!p_lcb) {
1450 BTM_TRACE_ERROR("%s, invalid parameters", __func__);
1451 status = BTM_ILLEGAL_VALUE;
1452 }
1453
1454 if (status != BTM_SUCCESS) {
1455 cb_params.per_adv_sync_trans.status = status;
1456 memcpy(cb_params.per_adv_sync_trans.addr, bd_addr, sizeof(BD_ADDR));
1457 BTM_ExtBleCallbackTrigger(BTM_BLE_GAP_PERIODIC_ADV_SET_INFO_TRANS_COMPLETE_EVT, &cb_params);
1458 return;
1459 }
1460
1461 btsnd_hcic_ble_periodic_adv_set_info_trans(p_lcb->handle, service_data, adv_handle);
1462 }
1463
BTM_BleSetPeriodicAdvSyncTransParams(BD_ADDR bd_addr,UINT8 mode,UINT16 skip,UINT16 sync_timeout,UINT8 cte_type)1464 void BTM_BleSetPeriodicAdvSyncTransParams(BD_ADDR bd_addr, UINT8 mode, UINT16 skip, UINT16 sync_timeout, UINT8 cte_type)
1465 {
1466 tBTM_STATUS status = BTM_SUCCESS;
1467 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1468
1469 // Set default past params
1470 if (bdaddr_is_empty((bt_bdaddr_t *)bd_addr)) {
1471 tHCI_STATUS err = HCI_SUCCESS;
1472 if ((err = btsnd_hcic_ble_set_default_periodic_adv_sync_trans_params(mode, skip, sync_timeout, cte_type)) != HCI_SUCCESS) {
1473 BTM_TRACE_ERROR("%s cmd err=0x%x", __func__, err);
1474 status = BTM_HCI_ERROR | err;
1475 }
1476
1477 cb_params.set_past_params.status = status;
1478 memset(cb_params.set_past_params.addr, 0, sizeof(BD_ADDR));
1479 BTM_ExtBleCallbackTrigger(BTM_BLE_GAP_SET_PAST_PARAMS_COMPLETE_EVT, &cb_params);
1480 return;
1481 }
1482
1483 tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
1484 if (!p_lcb) {
1485 BTM_TRACE_ERROR("%s, invalid parameters", __func__);
1486 status = BTM_ILLEGAL_VALUE;
1487 }
1488
1489 if (status != BTM_SUCCESS) {
1490 cb_params.set_past_params.status = status;
1491 memcpy(cb_params.set_past_params.addr, bd_addr, sizeof(BD_ADDR));
1492 BTM_ExtBleCallbackTrigger(BTM_BLE_GAP_SET_PAST_PARAMS_COMPLETE_EVT, &cb_params);
1493 return;
1494 }
1495
1496 btsnd_hcic_ble_set_periodic_adv_sync_trans_params(p_lcb->handle, mode, skip, sync_timeout, cte_type);
1497 }
1498
btm_ble_periodic_adv_sync_trans_recv_evt(tBTM_BLE_PERIOD_ADV_SYNC_TRANS_RECV * params)1499 void btm_ble_periodic_adv_sync_trans_recv_evt(tBTM_BLE_PERIOD_ADV_SYNC_TRANS_RECV *params)
1500 {
1501 tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
1502
1503 if (!params) {
1504 BTM_TRACE_ERROR("%s, Invalid params.", __func__);
1505 return;
1506 }
1507
1508 memcpy(&cb_params.past_recv, params, sizeof(tBTM_BLE_PERIOD_ADV_SYNC_TRANS_RECV));
1509
1510 BTM_ExtBleCallbackTrigger(BTM_BLE_GAP_PERIODIC_ADV_SYNC_TRANS_RECV_EVT, &cb_params);
1511 }
1512 #endif // #if (BLE_FEAT_PERIODIC_ADV_SYNC_TRANSFER == TRUE)
1513