btm_ble_5_gap.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "btm_int.h"
  7. #include "stack/hcimsgs.h"
  8. #include "osi/allocator.h"
  9. #include "device/controller.h"
  10. #include <string.h>
  11. #include "l2c_int.h"
  12. #if (BLE_50_FEATURE_SUPPORT == TRUE)
  13. tBTM_BLE_EXTENDED_CB extend_adv_cb;
  14. tBTM_BLE_5_HCI_CBACK ble_5_hci_cb;
  15. #define INVALID_VALUE 0XFF
  16. extern BOOLEAN BTM_GetLocalResolvablePrivateAddr(BD_ADDR bda);
  17. extern void BTM_UpdateAddrInfor(uint8_t addr_type, BD_ADDR bda);
  18. extern void BTM_BleSetStaticAddr(BD_ADDR rand_addr);
  19. extern uint32_t BTM_BleUpdateOwnType(uint8_t *own_bda_type, tBTM_START_ADV_CMPL_CBACK *cb);
  20. static tBTM_STATUS btm_ble_ext_adv_params_validate(tBTM_BLE_GAP_EXT_ADV_PARAMS *params);
  21. static tBTM_STATUS btm_ble_ext_adv_set_data_validate(UINT8 instance, UINT16 len, UINT8 *data);
  22. typedef struct {
  23. uint16_t ter_con_handle;
  24. bool invalid;
  25. UINT8 instance;
  26. int duration;
  27. int max_events;
  28. uint8_t retry_count;
  29. } tBTM_EXT_ADV_RECORD;
  30. tBTM_EXT_ADV_RECORD adv_record[MAX_BLE_ADV_INSTANCE] = {0};
  31. extern void btm_ble_inter_set(bool extble_inter);
  32. static char *btm_ble_hci_status_to_str(tHCI_STATUS status)
  33. {
  34. switch(status) {
  35. case HCI_SUCCESS:
  36. return "HCI_SUCCESS";
  37. case HCI_ERR_ILLEGAL_COMMAND:
  38. return "HCI_ERR_ILLEGAL_COMMAND";
  39. case HCI_ERR_NO_CONNECTION:
  40. return "HCI_ERR_NO_CONNECTION";
  41. case HCI_ERR_HW_FAILURE:
  42. return "HCI_ERR_HW_FAILURE";
  43. case HCI_ERR_PAGE_TIMEOUT:
  44. return "HCI_ERR_PAGE_TIMEOUT";
  45. case HCI_ERR_AUTH_FAILURE:
  46. return "HCI_ERR_AUTH_FAILURE";
  47. case HCI_ERR_KEY_MISSING:
  48. return "HCI_ERR_KEY_MISSING";
  49. case HCI_ERR_MEMORY_FULL:
  50. return "HCI_ERR_MEMORY_FULL";
  51. case HCI_ERR_CONNECTION_TOUT:
  52. return "HCI_ERR_CONNECTION_TOUT";
  53. case HCI_ERR_MAX_NUM_OF_CONNECTIONS:
  54. return "HCI_ERR_MAX_NUM_OF_CONNECTIONS";
  55. case HCI_ERR_MAX_NUM_OF_SCOS:
  56. return "HCI_ERR_MAX_NUM_OF_SCOS";
  57. case HCI_ERR_CONNECTION_EXISTS:
  58. return "HCI_ERR_CONNECTION_EXISTS";
  59. case HCI_ERR_COMMAND_DISALLOWED:
  60. return "HCI_ERR_COMMAND_DISALLOWED";
  61. case HCI_ERR_HOST_REJECT_RESOURCES:
  62. return "HCI_ERR_HOST_REJECT_RESOURCES";
  63. case HCI_ERR_HOST_REJECT_SECURITY:
  64. return "HCI_ERR_HOST_REJECT_SECURITY";
  65. case HCI_ERR_HOST_REJECT_DEVICE:
  66. return "HCI_ERR_HOST_REJECT_DEVICE";
  67. case HCI_ERR_HOST_TIMEOUT:
  68. return "HCI_ERR_HOST_TIMEOUT";
  69. case HCI_ERR_UNSUPPORTED_VALUE:
  70. return "HCI_ERR_UNSUPPORTED_VALUE";
  71. case HCI_ERR_ILLEGAL_PARAMETER_FMT:
  72. return "HCI_ERR_ILLEGAL_PARAMETER_FMT";
  73. case HCI_ERR_PEER_USER:
  74. return "HCI_ERR_PEER_USER";
  75. case HCI_ERR_PEER_LOW_RESOURCES:
  76. return "HCI_ERR_PEER_LOW_RESOURCES";
  77. case HCI_ERR_PEER_POWER_OFF:
  78. return "HCI_ERR_PEER_POWER_OFF";
  79. case HCI_ERR_CONN_CAUSE_LOCAL_HOST:
  80. return "HCI_ERR_CONN_CAUSE_LOCAL_HOST";
  81. case HCI_ERR_REPEATED_ATTEMPTS:
  82. return "HCI_ERR_REPEATED_ATTEMPTS";
  83. case HCI_ERR_PAIRING_NOT_ALLOWED:
  84. return "HCI_ERR_PAIRING_NOT_ALLOWED";
  85. case HCI_ERR_UNKNOWN_LMP_PDU:
  86. return "HCI_ERR_UNKNOWN_LMP_PDU";
  87. case HCI_ERR_UNSUPPORTED_REM_FEATURE:
  88. return "HCI_ERR_UNSUPPORTED_REM_FEATURE";
  89. case HCI_ERR_SCO_OFFSET_REJECTED:
  90. return "HCI_ERR_SCO_OFFSET_REJECTED";
  91. case HCI_ERR_SCO_INTERVAL_REJECTED:
  92. return "HCI_ERR_SCO_INTERVAL_REJECTED";
  93. case HCI_ERR_SCO_AIR_MODE:
  94. return "HCI_ERR_SCO_AIR_MODE";
  95. case HCI_ERR_INVALID_LMP_PARAM:
  96. return "HCI_ERR_INVALID_LMP_PARAM";
  97. case HCI_ERR_UNSPECIFIED:
  98. return "HCI_ERR_UNSPECIFIED";
  99. case HCI_ERR_UNSUPPORTED_LMP_PARAMETERS:
  100. return "HCI_ERR_UNSUPPORTED_LMP_PARAMETERS";
  101. case HCI_ERR_ROLE_CHANGE_NOT_ALLOWED:
  102. return "HCI_ERR_ROLE_CHANGE_NOT_ALLOWED";
  103. case HCI_ERR_LMP_RESPONSE_TIMEOUT:
  104. return "HCI_ERR_LMP_RESPONSE_TIMEOUT";
  105. case HCI_ERR_LMP_ERR_TRANS_COLLISION:
  106. return "HCI_ERR_LMP_ERR_TRANS_COLLISION";
  107. case HCI_ERR_LMP_PDU_NOT_ALLOWED:
  108. return "HCI_ERR_LMP_PDU_NOT_ALLOWED";
  109. case HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE:
  110. return "HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE";
  111. case HCI_ERR_UNIT_KEY_USED:
  112. return "HCI_ERR_UNIT_KEY_USED";
  113. case HCI_ERR_QOS_NOT_SUPPORTED:
  114. return "HCI_ERR_QOS_NOT_SUPPORTED";
  115. case HCI_ERR_INSTANT_PASSED:
  116. return "HCI_ERR_INSTANT_PASSED";
  117. case HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
  118. return "HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED";
  119. case HCI_ERR_DIFF_TRANSACTION_COLLISION:
  120. return "HCI_ERR_DIFF_TRANSACTION_COLLISION";
  121. case HCI_ERR_UNDEFINED_0x2B:
  122. return "HCI_ERR_UNDEFINED_0x2B";
  123. case HCI_ERR_QOS_UNACCEPTABLE_PARAM:
  124. return "HCI_ERR_QOS_UNACCEPTABLE_PARAM";
  125. case HCI_ERR_QOS_REJECTED:
  126. return "HCI_ERR_QOS_REJECTED";
  127. case HCI_ERR_CHAN_CLASSIF_NOT_SUPPORTED:
  128. return "HCI_ERR_CHAN_CLASSIF_NOT_SUPPORTED";
  129. case HCI_ERR_INSUFFCIENT_SECURITY:
  130. return "HCI_ERR_INSUFFCIENT_SECURITY";
  131. case HCI_ERR_PARAM_OUT_OF_RANGE:
  132. return "HCI_ERR_PARAM_OUT_OF_RANGE";
  133. case HCI_ERR_UNDEFINED_0x31:
  134. return "HCI_ERR_UNDEFINED_0x31";
  135. case HCI_ERR_ROLE_SWITCH_PENDING:
  136. return "HCI_ERR_ROLE_SWITCH_PENDING";
  137. case HCI_ERR_UNDEFINED_0x33:
  138. return "HCI_ERR_UNDEFINED_0x33";
  139. case HCI_ERR_RESERVED_SLOT_VIOLATION:
  140. return "HCI_ERR_RESERVED_SLOT_VIOLATION";
  141. case HCI_ERR_ROLE_SWITCH_FAILED:
  142. return "HCI_ERR_ROLE_SWITCH_FAILED";
  143. case HCI_ERR_INQ_RSP_DATA_TOO_LARGE:
  144. return "HCI_ERR_INQ_RSP_DATA_TOO_LARGE";
  145. case HCI_ERR_SIMPLE_PAIRING_NOT_SUPPORTED:
  146. return "HCI_ERR_SIMPLE_PAIRING_NOT_SUPPORTED";
  147. case HCI_ERR_HOST_BUSY_PAIRING:
  148. return "HCI_ERR_HOST_BUSY_PAIRING";
  149. case HCI_ERR_REJ_NO_SUITABLE_CHANNEL:
  150. return "HCI_ERR_REJ_NO_SUITABLE_CHANNEL";
  151. case HCI_ERR_CONTROLLER_BUSY:
  152. return "HCI_ERR_CONTROLLER_BUSY";
  153. case HCI_ERR_UNACCEPT_CONN_INTERVAL:
  154. return "HCI_ERR_UNACCEPT_CONN_INTERVAL";
  155. case HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT:
  156. return "HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT";
  157. case HCI_ERR_CONN_TOUT_DUE_TO_MIC_FAILURE:
  158. return "HCI_ERR_CONN_TOUT_DUE_TO_MIC_FAILURE";
  159. case HCI_ERR_CONN_FAILED_ESTABLISHMENT:
  160. return "HCI_ERR_CONN_FAILED_ESTABLISHMENT";
  161. case HCI_ERR_MAC_CONNECTION_FAILED:
  162. return "HCI_ERR_MAC_CONNECTION_FAILED";
  163. case HCI_ERR_LT_ADDR_ALREADY_IN_USE:
  164. return "HCI_ERR_LT_ADDR_ALREADY_IN_USE";
  165. case HCI_ERR_LT_ADDR_NOT_ALLOCATED:
  166. return "HCI_ERR_LT_ADDR_NOT_ALLOCATED";
  167. case HCI_ERR_CLB_NOT_ENABLED:
  168. return "HCI_ERR_CLB_NOT_ENABLED";
  169. case HCI_ERR_MAX_ERR:
  170. return "HCI_ERR_MAX_ERR";
  171. case HCI_ERR_ESP_VENDOR_FAIL:
  172. return "HCI_ERR_ESP_VENDOR_FAIL";
  173. case HCI_HINT_TO_RECREATE_AMP_PHYS_LINK:
  174. return "HCI_HINT_TO_RECREATE_AMP_PHYS_LINK";
  175. default:
  176. return "Invalid HCI status code.";
  177. }
  178. return NULL;
  179. }
  180. void btm_ble_extendadvcb_init(void)
  181. {
  182. memset(&extend_adv_cb, 0, sizeof(tBTM_BLE_EXTENDED_CB));
  183. }
  184. void btm_ble_advrecod_init(void)
  185. {
  186. memset(&adv_record[0], 0, sizeof(tBTM_EXT_ADV_RECORD)*MAX_BLE_ADV_INSTANCE);
  187. }
  188. void BTM_BleGapRegisterCallback(tBTM_BLE_5_HCI_CBACK cb)
  189. {
  190. if (cb) {
  191. ble_5_hci_cb = cb;
  192. } else {
  193. BTM_TRACE_ERROR("%s, register fail, the cb function is NULL.", __func__);
  194. }
  195. }
  196. void BTM_ExtBleCallbackTrigger(tBTM_BLE_5_GAP_EVENT event, tBTM_BLE_5_GAP_CB_PARAMS *params)
  197. {
  198. if(params && params->status == BTM_SUCCESS) {
  199. btm_ble_inter_set(true);
  200. }
  201. if (ble_5_hci_cb) {
  202. ble_5_hci_cb(event, params);
  203. }
  204. }
  205. tBTM_STATUS BTM_BleReadPhy(BD_ADDR bd_addr, UINT8 *tx_phy, UINT8 *rx_phy)
  206. {
  207. tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
  208. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  209. if (!tx_phy || !rx_phy || !p_lcb) {
  210. cb_params.read_phy.status = BTM_ILLEGAL_VALUE;
  211. memcpy(cb_params.read_phy.addr, bd_addr, BD_ADDR_LEN);
  212. if (ble_5_hci_cb) {
  213. ble_5_hci_cb(BTM_BLE_5_GAP_READ_PHY_COMPLETE_EVT, &cb_params);
  214. }
  215. BTM_TRACE_ERROR("%s, invalid parameters", __func__);
  216. return BTM_ILLEGAL_VALUE;
  217. }
  218. btsnd_hcic_ble_read_phy(p_lcb->handle);
  219. return BTM_SUCCESS;
  220. }
  221. tBTM_STATUS BTM_BleSetPreferDefaultPhy(UINT8 tx_phy_mask, UINT8 rx_phy_mask)
  222. {
  223. UINT8 all_phys = 0;
  224. tBTM_STATUS status = BTM_SUCCESS;
  225. tHCI_STATUS err = HCI_SUCCESS;
  226. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  227. if ((err = btsnd_hcic_ble_set_prefered_default_phy(all_phys, tx_phy_mask, rx_phy_mask)) != HCI_SUCCESS) {
  228. BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
  229. __func__, btm_ble_hci_status_to_str(err), err);
  230. status = BTM_ILLEGAL_VALUE;
  231. }
  232. cb_params.set_perf_def_phy.status = err;
  233. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_DEFAULT_PHY_COMPLETE_EVT, &cb_params);
  234. return status;
  235. }
  236. tBTM_STATUS BTM_BleSetPreferPhy(BD_ADDR bd_addr, UINT8 all_phys, UINT8 tx_phy_mask,
  237. UINT8 rx_phy_mask, UINT16 phy_options)
  238. {
  239. tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE);
  240. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  241. if (!p_lcb) {
  242. cb_params.status = BTM_ILLEGAL_VALUE;
  243. if (ble_5_hci_cb) {
  244. ble_5_hci_cb(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
  245. }
  246. BTM_TRACE_ERROR("%s, invalid parameters", __func__);
  247. return BTM_ILLEGAL_VALUE;
  248. }
  249. if (!btsnd_hcic_ble_set_phy(p_lcb->handle, all_phys, tx_phy_mask, rx_phy_mask, phy_options)) {
  250. cb_params.status = BTM_ILLEGAL_VALUE;
  251. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
  252. }
  253. return BTM_SUCCESS;
  254. }
  255. tBTM_STATUS BTM_BleSetExtendedAdvRandaddr(UINT8 instance, BD_ADDR rand_addr)
  256. {
  257. tBTM_STATUS status = BTM_SUCCESS;
  258. tHCI_STATUS err = HCI_SUCCESS;
  259. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  260. if (instance >= MAX_BLE_ADV_INSTANCE || rand_addr == NULL) {
  261. status = BTM_ILLEGAL_VALUE;
  262. goto end;
  263. }
  264. /*
  265. A static address is a 48-bit randomly generated address and shall meet the following requirements:
  266. • The two most significant bits of the address shall be equal to 1
  267. • All bits of the random part of the address shall not be equal to 1
  268. • All bits of the random part of the address shall not be equal to 0
  269. */
  270. BD_ADDR invalid_rand_addr_a, invalid_rand_addr_b;
  271. memset(invalid_rand_addr_a, 0xff, sizeof(BD_ADDR));
  272. memset(invalid_rand_addr_b, 0x00, sizeof(BD_ADDR));
  273. invalid_rand_addr_b[0] = invalid_rand_addr_b[0] | BT_STATIC_RAND_ADDR_MASK;
  274. if((rand_addr[0] & BT_STATIC_RAND_ADDR_MASK) == BT_STATIC_RAND_ADDR_MASK
  275. && memcmp(invalid_rand_addr_a, rand_addr, BD_ADDR_LEN) != 0
  276. && memcmp(invalid_rand_addr_b, rand_addr, BD_ADDR_LEN) != 0){
  277. // set random address
  278. if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
  279. BTM_TRACE_ERROR("%s, fail to send the hci command, the error code = %s(0x%x)",
  280. __func__, btm_ble_hci_status_to_str(err), err);
  281. status = BTM_ILLEGAL_VALUE;
  282. } else {
  283. // set random address success, update address infor
  284. if(extend_adv_cb.inst[instance].configured && extend_adv_cb.inst[instance].connetable) {
  285. BTM_BleSetStaticAddr(rand_addr);
  286. BTM_UpdateAddrInfor(BLE_ADDR_RANDOM, rand_addr);
  287. }
  288. }
  289. } else {
  290. BTM_TRACE_ERROR("%s invalid random address", __func__);
  291. status = BTM_ILLEGAL_VALUE;
  292. goto end;
  293. }
  294. end:
  295. cb_params.status = status;
  296. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_RAND_ADDR_COMPLETE_EVT, &cb_params);
  297. return status;
  298. }
  299. tBTM_STATUS BTM_BleSetExtendedAdvParams(UINT8 instance, tBTM_BLE_GAP_EXT_ADV_PARAMS *params)
  300. {
  301. tBTM_STATUS status = BTM_SUCCESS;
  302. tHCI_STATUS err = HCI_SUCCESS;
  303. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  304. bool use_rpa_addr = false;
  305. BD_ADDR rand_addr;
  306. if (instance >= MAX_BLE_ADV_INSTANCE) {
  307. status = BTM_ILLEGAL_VALUE;
  308. BTM_TRACE_ERROR("%s invalid instance %d", __func__, instance);
  309. goto end;
  310. }
  311. if ((status = btm_ble_ext_adv_params_validate(params)) != BTM_SUCCESS) {
  312. BTM_TRACE_ERROR("%s, invalid extend adv params.", __func__);
  313. }
  314. if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE) {
  315. extend_adv_cb.inst[instance].connetable = true;
  316. } else {
  317. extend_adv_cb.inst[instance].connetable = false;
  318. }
  319. if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_SCANNABLE) {
  320. extend_adv_cb.inst[instance].scannable = true;
  321. } else {
  322. extend_adv_cb.inst[instance].scannable = false;
  323. }
  324. if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_LEGACY) {
  325. extend_adv_cb.inst[instance].legacy_pdu = true;
  326. } else {
  327. extend_adv_cb.inst[instance].legacy_pdu = false;
  328. }
  329. // if own_addr_type == BLE_ADDR_PUBLIC_ID or BLE_ADDR_RANDOM_ID,
  330. if((params->own_addr_type == BLE_ADDR_PUBLIC_ID || params->own_addr_type == BLE_ADDR_RANDOM_ID) && BTM_GetLocalResolvablePrivateAddr(rand_addr)) {
  331. params->own_addr_type = BLE_ADDR_RANDOM;
  332. use_rpa_addr = true;
  333. } else if(params->own_addr_type == BLE_ADDR_PUBLIC_ID){
  334. params->own_addr_type = BLE_ADDR_PUBLIC;
  335. } else if (params->own_addr_type == BLE_ADDR_RANDOM_ID) {
  336. params->own_addr_type = BLE_ADDR_RANDOM;
  337. }
  338. if ((err = btsnd_hcic_ble_set_ext_adv_params(instance, params->type, params->interval_min, params->interval_max,
  339. params->channel_map, params->own_addr_type, params->peer_addr_type,
  340. params->peer_addr, params->filter_policy, params->tx_power,
  341. params->primary_phy, params->max_skip,
  342. params->secondary_phy, params->sid, params->scan_req_notif)) != HCI_SUCCESS) {
  343. BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
  344. status = BTM_ILLEGAL_VALUE;
  345. goto end;
  346. }
  347. extend_adv_cb.inst[instance].configured = true;
  348. end:
  349. if(use_rpa_addr) {
  350. // update RPA address
  351. if((err = btsnd_hcic_ble_set_extend_rand_address(instance, rand_addr)) != HCI_SUCCESS) {
  352. BTM_TRACE_ERROR("LE EA SetParams: cmd err=0x%x", err);
  353. status = BTM_ILLEGAL_VALUE;
  354. } else {
  355. // set addr success, update address infor
  356. BTM_UpdateAddrInfor(BLE_ADDR_RANDOM, rand_addr);
  357. }
  358. }
  359. cb_params.status = status;
  360. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_PARAMS_COMPLETE_EVT, &cb_params);
  361. return status;
  362. }
  363. tBTM_STATUS BTM_BleConfigExtendedAdvDataRaw(BOOLEAN is_scan_rsp, UINT8 instance, UINT16 len, UINT8 *data)
  364. {
  365. tBTM_STATUS status = BTM_SUCCESS;
  366. tHCI_STATUS err = HCI_SUCCESS;
  367. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  368. UINT16 rem_len = len;
  369. UINT8 operation = 0;
  370. UINT16 data_offset = 0;
  371. if ((status = btm_ble_ext_adv_set_data_validate(instance, len, data)) != BTM_SUCCESS) {
  372. BTM_TRACE_ERROR("%s, invalid extend adv data.", __func__);
  373. goto end;
  374. }
  375. do {
  376. UINT8 send_data_len = (rem_len > BTM_BLE_EXT_ADV_DATA_LEN_MAX) ? BTM_BLE_EXT_ADV_DATA_LEN_MAX : rem_len;
  377. if (len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
  378. operation = BTM_BLE_ADV_DATA_OP_COMPLETE;
  379. } else {
  380. if (rem_len == len) {
  381. operation = BTM_BLE_ADV_DATA_OP_FIRST_FRAG;
  382. } else if (rem_len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
  383. operation = BTM_BLE_ADV_DATA_OP_LAST_FRAG;
  384. } else {
  385. operation = BTM_BLE_ADV_DATA_OP_INTERMEDIATE_FRAG;
  386. }
  387. }
  388. if (!is_scan_rsp) {
  389. if ((err = btsnd_hcic_ble_set_ext_adv_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
  390. BTM_TRACE_ERROR("LE EA SetAdvData: cmd err=0x%x", err);
  391. status = BTM_ILLEGAL_VALUE;
  392. }
  393. } else {
  394. if ((err = btsnd_hcic_ble_set_ext_adv_scan_rsp_data(instance, operation, 0, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
  395. BTM_TRACE_ERROR("LE EA SetScanRspData: cmd err=0x%x", err);
  396. status = BTM_ILLEGAL_VALUE;
  397. }
  398. }
  399. rem_len -= send_data_len;
  400. data_offset += send_data_len;
  401. } while (rem_len);
  402. end:
  403. cb_params.status = status;
  404. 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);
  405. return status;
  406. }
  407. tBTM_STATUS BTM_BleStartExtAdv(BOOLEAN enable, UINT8 num, tBTM_BLE_EXT_ADV *ext_adv)
  408. {
  409. tBTM_STATUS status = BTM_SUCCESS;
  410. tHCI_STATUS err = HCI_SUCCESS;
  411. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  412. UINT8 *instance = NULL;
  413. UINT16 *duration = NULL;
  414. UINT8 *max_events = NULL;
  415. // when enable = true, ext_adv = NULL or num = 0, goto end
  416. if ((!ext_adv || num == 0) && enable) {
  417. status = BTM_ILLEGAL_VALUE;
  418. BTM_TRACE_ERROR("%s invalid parameters", __func__);
  419. goto end;
  420. }
  421. if (num != 0 && ext_adv != NULL) {
  422. instance = osi_malloc(num);
  423. duration = osi_malloc(num*sizeof(UINT16));
  424. max_events = osi_malloc(num*sizeof(UINT8));
  425. if (!instance || !duration || !max_events) {
  426. status = BTM_NO_RESOURCES;
  427. BTM_TRACE_ERROR("%s invalid parameters", __func__);
  428. goto end;
  429. }
  430. for (int i = 0; i < num; i++) {
  431. instance[i] = ext_adv[i].instance;
  432. duration[i] = ext_adv[i].duration;
  433. max_events[i] = ext_adv[i].max_events;
  434. }
  435. if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, instance,
  436. duration, max_events)) != HCI_SUCCESS) {
  437. BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
  438. status = BTM_ILLEGAL_VALUE;
  439. }
  440. osi_free(instance);
  441. osi_free(duration);
  442. osi_free(max_events);
  443. } else {
  444. // enable = false, num == 0 or ext_adv = NULL
  445. if ((err = btsnd_hcic_ble_ext_adv_enable(enable, num, NULL, NULL, NULL)) != HCI_SUCCESS) {
  446. BTM_TRACE_ERROR("LE EA En=%d: cmd err=0x%x", enable, err);
  447. status = BTM_ILLEGAL_VALUE;
  448. }
  449. goto end;
  450. }
  451. end:
  452. if (!enable && status == BTM_SUCCESS) {
  453. // disable all ext adv
  454. if(num == 0) {
  455. for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++)
  456. {
  457. adv_record[i].invalid = false;
  458. adv_record[i].instance = INVALID_VALUE;
  459. adv_record[i].duration = INVALID_VALUE;
  460. adv_record[i].max_events = INVALID_VALUE;
  461. adv_record[i].retry_count = 0;
  462. }
  463. } else {
  464. for (uint8_t i = 0; i < num; i++)
  465. {
  466. uint8_t index = ext_adv[i].instance;
  467. adv_record[index].invalid = false;
  468. adv_record[index].instance = INVALID_VALUE;
  469. adv_record[index].duration = INVALID_VALUE;
  470. adv_record[index].max_events = INVALID_VALUE;
  471. adv_record[index].retry_count = 0;
  472. }
  473. }
  474. }
  475. // start extend adv success, save the adv information
  476. if(enable && status == BTM_SUCCESS) {
  477. for (uint8_t i = 0; i < num; i++)
  478. {
  479. uint8_t index = ext_adv[i].instance;
  480. adv_record[index].invalid = true;
  481. adv_record[index].instance = ext_adv[i].instance;
  482. adv_record[index].duration = ext_adv[i].duration;
  483. adv_record[index].max_events = ext_adv[i].max_events;
  484. adv_record[index].retry_count = 0;
  485. }
  486. }
  487. cb_params.status = status;
  488. BTM_ExtBleCallbackTrigger(enable ? BTM_BLE_5_GAP_EXT_ADV_START_COMPLETE_EVT : BTM_BLE_5_GAP_EXT_ADV_STOP_COMPLETE_EVT, &cb_params);
  489. return status;
  490. }
  491. tBTM_STATUS BTM_BleStartExtAdvRestart(uint8_t con_handle)
  492. {
  493. tBTM_BLE_EXT_ADV ext_adv;
  494. uint8_t index = INVALID_VALUE;
  495. for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++)
  496. {
  497. if(adv_record[i].ter_con_handle == con_handle) {
  498. index = i;
  499. break;
  500. }
  501. }
  502. if((index >= MAX_BLE_ADV_INSTANCE) || (!adv_record[index].invalid) || (adv_record[index].retry_count > GATTC_CONNECT_RETRY_COUNT)) {
  503. return BTM_WRONG_MODE;
  504. }
  505. adv_record[index].retry_count ++;
  506. BTM_TRACE_DEBUG("remote device did not reveive aux connect response, retatrt the extend adv to reconnect, adv handle %d con_handle %d\n", index, con_handle);
  507. ext_adv.instance = adv_record[index].instance;
  508. ext_adv.duration = adv_record[index].duration;
  509. ext_adv.max_events = adv_record[index].max_events;
  510. return BTM_BleStartExtAdv(true, 1, &ext_adv);
  511. }
  512. tBTM_STATUS BTM_BleExtAdvSetRemove(UINT8 instance)
  513. {
  514. tBTM_STATUS status = BTM_SUCCESS;
  515. tHCI_STATUS err = HCI_SUCCESS;
  516. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  517. if (instance >= MAX_BLE_ADV_INSTANCE) {
  518. status = BTM_ILLEGAL_VALUE;
  519. BTM_TRACE_ERROR("%s invalid instance %d", __func__, instance);
  520. goto end;
  521. }
  522. if ((err = btsnd_hcic_ble_remove_adv_set(instance)) != HCI_SUCCESS) {
  523. BTM_TRACE_ERROR("LE EAS Rm: cmd err=0x%x", err);
  524. status = BTM_ILLEGAL_VALUE;
  525. } else {
  526. extend_adv_cb.inst[instance].configured = false;
  527. extend_adv_cb.inst[instance].legacy_pdu = false;
  528. extend_adv_cb.inst[instance].directed = false;
  529. extend_adv_cb.inst[instance].scannable = false;
  530. extend_adv_cb.inst[instance].connetable = false;
  531. }
  532. end:
  533. cb_params.status = status;
  534. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_REMOVE_COMPLETE_EVT, &cb_params);
  535. return status;
  536. }
  537. tBTM_STATUS BTM_BleExtAdvSetClear(void)
  538. {
  539. tBTM_STATUS status = BTM_SUCCESS;
  540. tHCI_STATUS err = HCI_SUCCESS;
  541. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  542. if ((err = btsnd_hcic_ble_clear_adv_set()) != HCI_SUCCESS) {
  543. BTM_TRACE_ERROR("LE EAS Clr: cmd err=0x%x", err);
  544. status = BTM_ILLEGAL_VALUE;
  545. } else {
  546. for (uint8_t i = 0; i < MAX_BLE_ADV_INSTANCE; i++) {
  547. extend_adv_cb.inst[i].configured = false;
  548. extend_adv_cb.inst[i].legacy_pdu = false;
  549. extend_adv_cb.inst[i].directed = false;
  550. extend_adv_cb.inst[i].scannable = false;
  551. extend_adv_cb.inst[i].connetable = false;
  552. }
  553. }
  554. cb_params.status = status;
  555. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_SET_CLEAR_COMPLETE_EVT, &cb_params);
  556. return status;
  557. }
  558. tBTM_STATUS BTM_BlePeriodicAdvSetParams(UINT8 instance, tBTM_BLE_Periodic_Adv_Params *params)
  559. {
  560. tBTM_STATUS status = BTM_SUCCESS;
  561. tHCI_STATUS err = HCI_SUCCESS;
  562. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  563. //ext_adv_flag = true;
  564. if (instance >= MAX_BLE_ADV_INSTANCE) {
  565. status = BTM_ILLEGAL_VALUE;
  566. BTM_TRACE_ERROR("%s invalid instance %d", __func__, instance);
  567. goto end;
  568. }
  569. if (!extend_adv_cb.inst[instance].configured ||
  570. extend_adv_cb.inst[instance].scannable ||
  571. extend_adv_cb.inst[instance].connetable ||
  572. extend_adv_cb.inst[instance].legacy_pdu) {
  573. BTM_TRACE_ERROR("%s, instance = %d, Before set the periodic adv parameters, please configure the the \
  574. extend adv to nonscannable and nonconnectable first, and it shouldn't include the legacy bit.", __func__, instance);
  575. status = BTM_ILLEGAL_VALUE;
  576. goto end;
  577. }
  578. if ((err= btsnd_hcic_ble_set_periodic_adv_params(instance, params->interval_min,
  579. params->interval_max, params->properties)) != HCI_SUCCESS) {
  580. BTM_TRACE_ERROR("LE PA SetParams: cmd err=0x%x", err);
  581. status = BTM_ILLEGAL_VALUE;
  582. }
  583. end:
  584. cb_params.status = status;
  585. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SET_PARAMS_COMPLETE_EVT, &cb_params);
  586. return status;
  587. }
  588. tBTM_STATUS BTM_BlePeriodicAdvCfgDataRaw(UINT8 instance, UINT16 len, UINT8 *data)
  589. {
  590. tBTM_STATUS status = BTM_SUCCESS;
  591. tHCI_STATUS err = HCI_SUCCESS;
  592. uint16_t rem_len = len;
  593. UINT8 operation = 0;
  594. UINT16 data_offset = 0;
  595. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  596. if ((status = btm_ble_ext_adv_set_data_validate(instance, len, data)) != BTM_SUCCESS) {
  597. BTM_TRACE_ERROR("%s, invalid extend adv data.", __func__);
  598. goto end;
  599. }
  600. do {
  601. UINT8 send_data_len = (rem_len > BTM_BLE_PERIODIC_ADV_DATA_LEN_MAX) ? BTM_BLE_PERIODIC_ADV_DATA_LEN_MAX : rem_len;
  602. if (len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
  603. operation = BTM_BLE_ADV_DATA_OP_COMPLETE;
  604. } else {
  605. if (rem_len == len) {
  606. operation = BTM_BLE_ADV_DATA_OP_FIRST_FRAG;
  607. } else if (rem_len <= BTM_BLE_EXT_ADV_DATA_LEN_MAX) {
  608. operation = BTM_BLE_ADV_DATA_OP_LAST_FRAG;
  609. } else {
  610. operation = BTM_BLE_ADV_DATA_OP_INTERMEDIATE_FRAG;
  611. }
  612. }
  613. if ((err = btsnd_hcic_ble_set_periodic_adv_data(instance, operation, send_data_len, &data[data_offset])) != HCI_SUCCESS) {
  614. BTM_TRACE_ERROR("LE PA SetData: cmd err=0x%x", err);
  615. status = BTM_ILLEGAL_VALUE;
  616. }
  617. rem_len -= send_data_len;
  618. data_offset += send_data_len;
  619. } while(rem_len);
  620. end:
  621. cb_params.status = status;
  622. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_DATA_SET_COMPLETE_EVT, &cb_params);
  623. return status;
  624. }
  625. tBTM_STATUS BTM_BlePeriodicAdvEnable(UINT8 instance, BOOLEAN enable)
  626. {
  627. tBTM_STATUS status = BTM_SUCCESS;
  628. tHCI_STATUS err = HCI_SUCCESS;
  629. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  630. if (instance >= MAX_BLE_ADV_INSTANCE) {
  631. BTM_TRACE_ERROR("%s, invalid instance %d", __func__, instance);
  632. status = BTM_ILLEGAL_VALUE;
  633. goto end;
  634. }
  635. if ((err = btsnd_hcic_ble_periodic_adv_enable(enable, instance)) != HCI_SUCCESS) {
  636. BTM_TRACE_ERROR("LE PA En=%d: cmd err=0x%x", enable, err);
  637. status = BTM_ILLEGAL_VALUE;
  638. }
  639. end:
  640. cb_params.status = status;
  641. BTM_ExtBleCallbackTrigger(enable ? BTM_BLE_5_GAP_PERIODIC_ADV_START_COMPLETE_EVT : BTM_BLE_5_GAP_PERIODIC_ADV_STOP_COMPLETE_EVT, &cb_params);
  642. return status;
  643. }
  644. tBTM_STATUS BTM_BlePeriodicAdvCreateSync(tBTM_BLE_Periodic_Sync_Params *params)
  645. {
  646. //tHCI_STATUS err = HCI_SUCCESS;
  647. tBTM_STATUS status = BTM_SUCCESS;
  648. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  649. if (!params) {
  650. status = BTM_ILLEGAL_VALUE;
  651. BTM_TRACE_ERROR("%s, the parameter is NULL.", __func__);
  652. goto end;
  653. }
  654. if ((params->sync_timeout < 0x0a || params->sync_timeout > 0x4000)
  655. || (params->filter_policy > 0x01) || (params->addr_type > 0x01) ||
  656. (params->sid > 0xf) || (params->skip > 0x01F3)) {
  657. status = BTM_ILLEGAL_VALUE;
  658. BTM_TRACE_ERROR("%s, The sync parameters is invalid.", __func__);
  659. goto end;
  660. }
  661. if (!btsnd_hcic_ble_periodic_adv_create_sync(params->filter_policy, params->sid, params->addr_type,
  662. params->addr, params->sync_timeout, 0)) {
  663. BTM_TRACE_ERROR("LE PA CreateSync cmd failed");
  664. status = BTM_ILLEGAL_VALUE;
  665. }
  666. end:
  667. if(status != BTM_SUCCESS) {
  668. cb_params.status = status;
  669. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_CREATE_SYNC_COMPLETE_EVT, &cb_params);
  670. }
  671. return status;
  672. }
  673. void btm_set_phy_callback(UINT8 status)
  674. {
  675. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  676. cb_params.status = status;
  677. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_PREFERED_PHY_COMPLETE_EVT, &cb_params);
  678. }
  679. void btm_create_sync_callback(UINT8 status)
  680. {
  681. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  682. cb_params.status = status;
  683. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_CREATE_SYNC_COMPLETE_EVT, &cb_params);
  684. }
  685. void btm_read_phy_callback(uint8_t hci_status, uint16_t conn_handle, uint8_t tx_phy, uint8_t rx_phy)
  686. {
  687. tBTM_STATUS status = BTM_SUCCESS;
  688. tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(conn_handle);
  689. if(hci_status != HCI_SUCCESS) {
  690. status = BTM_ILLEGAL_VALUE;
  691. BTM_TRACE_ERROR("%s error status %d", __func__, hci_status);
  692. }
  693. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  694. if(p_lcb) {
  695. memcpy(cb_params.read_phy.addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
  696. }
  697. cb_params.read_phy.status = status;
  698. cb_params.read_phy.tx_phy = tx_phy;
  699. cb_params.read_phy.rx_phy = rx_phy;
  700. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_READ_PHY_COMPLETE_EVT, &cb_params);
  701. }
  702. tBTM_STATUS BTM_BlePeriodicAdvSyncCancel(void)
  703. {
  704. tHCI_STATUS err = HCI_SUCCESS;
  705. tBTM_STATUS status = BTM_SUCCESS;
  706. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  707. if ((err = btsnd_hcic_ble_periodic_adv_create_sync_cancel()) != HCI_SUCCESS) {
  708. BTM_TRACE_ERROR("LE PA SyncCancel, cmd err=0x%x", err);
  709. status = BTM_ILLEGAL_VALUE;
  710. }
  711. cb_params.status = status;
  712. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_CANCEL_COMPLETE_EVT, &cb_params);
  713. return status;
  714. }
  715. tBTM_STATUS BTM_BlePeriodicAdvSyncTerm(UINT16 sync_handle)
  716. {
  717. tHCI_STATUS err = HCI_SUCCESS;
  718. tBTM_STATUS status = BTM_SUCCESS;
  719. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  720. if (( err = btsnd_hcic_ble_periodic_adv_term_sync(sync_handle)) != HCI_SUCCESS) {
  721. BTM_TRACE_ERROR("LE PA SyncTerm: cmd err=0x%x", err);
  722. status = BTM_ILLEGAL_VALUE;
  723. }
  724. cb_params.status = status;
  725. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_TERMINATE_COMPLETE_EVT, &cb_params);
  726. return status;
  727. }
  728. tBTM_STATUS BTM_BlePeriodicAdvAddDevToList(tBLE_ADDR_TYPE addr_type, BD_ADDR addr, UINT16 sid)
  729. {
  730. tHCI_STATUS err = HCI_SUCCESS;
  731. tBTM_STATUS status = BTM_SUCCESS;
  732. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  733. if (addr_type > BLE_ADDR_TYPE_MAX) {
  734. status = BTM_ILLEGAL_VALUE;
  735. BTM_TRACE_ERROR("%s invalid addr_type %d", __func__, addr_type);
  736. goto end;
  737. }
  738. if ((err = btsnd_hcic_ble_add_dev_to_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
  739. BTM_TRACE_ERROR("LE PA AddDevToList: cmd err=0x%x", err);
  740. status = BTM_ILLEGAL_VALUE;
  741. }
  742. end:
  743. cb_params.status = status;
  744. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_ADD_DEV_COMPLETE_EVT, &cb_params);
  745. return status;
  746. }
  747. tBTM_STATUS BTM_BlePeriodicAdvRemoveDevFromList(tBLE_ADDR_TYPE addr_type, BD_ADDR addr, UINT16 sid)
  748. {
  749. tHCI_STATUS err = HCI_SUCCESS;
  750. tBTM_STATUS status = BTM_SUCCESS;
  751. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  752. if (addr_type > BLE_ADDR_TYPE_MAX) {
  753. status = BTM_ILLEGAL_VALUE;
  754. BTM_TRACE_ERROR("%s invalid addr_type %d", __func__, addr_type);
  755. goto end;
  756. }
  757. if ((err = btsnd_hcic_ble_rm_dev_from_periodic_adv_list(addr_type, addr, sid)) != HCI_SUCCESS) {
  758. BTM_TRACE_ERROR("LE PA RmDevFromList: cmd err=0x%x", err);
  759. status = BTM_ILLEGAL_VALUE;
  760. }
  761. end:
  762. cb_params.status = status;
  763. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_REMOVE_DEV_COMPLETE_EVT, &cb_params);
  764. return status;
  765. }
  766. tBTM_STATUS BTM_BlePeriodicAdvClearDev(void)
  767. {
  768. tHCI_STATUS err = HCI_SUCCESS;
  769. tBTM_STATUS status = BTM_SUCCESS;
  770. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  771. if ((err = btsnd_hcic_ble_clear_periodic_adv_list()) != HCI_SUCCESS) {
  772. BTM_TRACE_ERROR("LE PA ClrDev: cmd err=0x%x", err);
  773. status = BTM_ILLEGAL_VALUE;
  774. }
  775. cb_params.status = status;
  776. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_CLEAR_DEV_COMPLETE_EVT, &cb_params);
  777. return status;
  778. }
  779. tBTM_STATUS BTM_BleSetExtendedScanParams(tBTM_BLE_EXT_SCAN_PARAMS *params)
  780. {
  781. UINT8 phy_mask = 0;
  782. tHCI_STATUS err = HCI_SUCCESS;
  783. tBTM_STATUS status = BTM_SUCCESS;
  784. tHCI_EXT_SCAN_PARAMS hci_params[2];
  785. int phy_count = 0;
  786. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  787. if (!params) {
  788. status = BTM_ILLEGAL_VALUE;
  789. BTM_TRACE_ERROR("%s invalid parameters", __func__);
  790. goto end;
  791. }
  792. if (params->own_addr_type > BLE_ADDR_TYPE_MAX) {
  793. status = BTM_ILLEGAL_VALUE;
  794. goto end;
  795. }
  796. if (params->cfg_mask & BTM_BLE_GAP_EXT_SCAN_UNCODE_MASK) {
  797. phy_mask |= 0x01;
  798. memcpy(&hci_params[phy_count], &params->uncoded_cfg, sizeof(tHCI_EXT_SCAN_PARAMS));
  799. phy_count++;
  800. }
  801. if (params->cfg_mask & BTM_BLE_GAP_EXT_SCAN_CODE_MASK) {
  802. phy_mask |= 0x04;
  803. memcpy(&hci_params[phy_count], &params->coded_cfg, sizeof(tHCI_EXT_SCAN_PARAMS));
  804. phy_count++;
  805. }
  806. if (BTM_BleUpdateOwnType(&params->own_addr_type, NULL) != 0 ) {
  807. status = BTM_ILLEGAL_VALUE;
  808. BTM_TRACE_ERROR("LE UpdateOwnType err");
  809. goto end;
  810. }
  811. extend_adv_cb.scan_duplicate = params->scan_duplicate;
  812. if ((err = btsnd_hcic_ble_set_ext_scan_params(params->own_addr_type, params->filter_policy, phy_mask, phy_count,
  813. hci_params)) != HCI_SUCCESS) {
  814. BTM_TRACE_ERROR("LE ES SetParams: cmd err=0x%x", err);
  815. status = BTM_ILLEGAL_VALUE;
  816. }
  817. end:
  818. cb_params.status = status;
  819. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SET_EXT_SCAN_PARAMS_COMPLETE_EVT, &cb_params);
  820. return cb_params.status;
  821. }
  822. tBTM_STATUS BTM_BleExtendedScan(BOOLEAN enable, UINT16 duration, UINT16 period)
  823. {
  824. tHCI_STATUS err = HCI_SUCCESS;
  825. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  826. tBTM_STATUS status = BTM_SUCCESS;
  827. if (extend_adv_cb.scan_duplicate > 0x03) {
  828. status = BTM_ILLEGAL_VALUE;
  829. BTM_TRACE_ERROR("%s invalid scan_duplicate %d", __func__, extend_adv_cb.scan_duplicate);
  830. goto end;
  831. }
  832. if ((err = btsnd_hcic_ble_ext_scan_enable(enable, extend_adv_cb.scan_duplicate, duration, period)) != HCI_SUCCESS) {
  833. BTM_TRACE_ERROR("LE ES En=%d: cmd err=0x%x", enable, err);
  834. status = BTM_ILLEGAL_VALUE;
  835. }
  836. end:
  837. cb_params.status = status;
  838. BTM_ExtBleCallbackTrigger(enable ? BTM_BLE_5_GAP_EXT_SCAN_START_COMPLETE_EVT : BTM_BLE_5_GAP_EXT_SCAN_STOP_COMPLETE_EVT, &cb_params);
  839. return status;
  840. }
  841. void BTM_BleSetPreferExtenedConnParams (BD_ADDR bd_addr, tBTM_EXT_CONN_PARAMS *params)
  842. {
  843. tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bd_addr);
  844. if (p_dev_rec) {
  845. if (params) {
  846. memcpy(&p_dev_rec->ext_conn_params, params, sizeof(tBTM_EXT_CONN_PARAMS));
  847. } else {
  848. BTM_TRACE_ERROR("Invalid Extand connection parameters");
  849. }
  850. } else {
  851. BTM_TRACE_ERROR("Unknown Device, setting rejected");
  852. }
  853. return;
  854. }
  855. void btm_ble_extended_init(void)
  856. {
  857. }
  858. void btm_ble_extended_cleanup(void)
  859. {
  860. }
  861. static tBTM_STATUS btm_ble_ext_adv_params_validate(tBTM_BLE_GAP_EXT_ADV_PARAMS *params)
  862. {
  863. if (!params) {
  864. return BTM_ILLEGAL_VALUE;
  865. }
  866. if (params->own_addr_type > BLE_ADDR_TYPE_MAX) {
  867. BTM_TRACE_ERROR("%s, invalid own address type, line %d, addr type %d", __func__, __LINE__, params->own_addr_type);
  868. return BTM_ILLEGAL_VALUE;
  869. }
  870. if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_LEGACY) {
  871. /* Not allowed for legacy PDUs. */
  872. if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_INCLUDE_TX_PWR) {
  873. BTM_TRACE_ERROR("%s, The Legacy adv can't include tx power bit, line %d", __func__, __LINE__);
  874. return BTM_ILLEGAL_VALUE;
  875. }
  876. }
  877. if (!(params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_LEGACY)) {
  878. /* Not allowed for extended advertising PDUs */
  879. if ((params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_CONNECTABLE) &&
  880. (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_SCANNABLE)) {
  881. BTM_TRACE_ERROR("%s, For the Extend adv, the properties can't be connectable and scannable at the same time, line %d", __func__, __LINE__);
  882. return BTM_ILLEGAL_VALUE;
  883. }
  884. /* HD directed advertising allowed only for legacy PDUs */
  885. if (params->type & BTM_BLE_GAP_SET_EXT_ADV_PROP_HD_DIRECTED) {
  886. BTM_TRACE_ERROR("%s, HD directed advertising allowed only for legacy PDUs. line %d", __func__, __LINE__);
  887. return BTM_ILLEGAL_VALUE;
  888. }
  889. }
  890. return BTM_SUCCESS;
  891. }
  892. static tBTM_STATUS btm_ble_ext_adv_set_data_validate(UINT8 instance, UINT16 len, UINT8 *data)
  893. {
  894. if (!data) {
  895. BTM_TRACE_ERROR("%s, the extend adv data is NULL. line %d", __func__, __LINE__);
  896. return BTM_ILLEGAL_VALUE;
  897. }
  898. if (instance >= MAX_BLE_ADV_INSTANCE) {
  899. BTM_TRACE_ERROR("%s, adv instance is %d, Exceeded the maximum. line %d", __func__, instance, __LINE__);
  900. return BTM_ILLEGAL_VALUE;
  901. }
  902. if (!extend_adv_cb.inst[instance].configured) {
  903. 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__);
  904. return BTM_ILLEGAL_VALUE;
  905. }
  906. /* Not allowed with the direted advertising for legacy */
  907. if (extend_adv_cb.inst[instance].legacy_pdu && extend_adv_cb.inst[instance].directed) {
  908. BTM_TRACE_ERROR("%s, Not allowed with the direted advertising for legacy. line %d", __func__, __LINE__);
  909. return BTM_ILLEGAL_VALUE;
  910. }
  911. /* Always allowed with legacy PDU but limited to legacy length */
  912. if (extend_adv_cb.inst[instance].legacy_pdu) {
  913. if (len > 31) {
  914. BTM_TRACE_ERROR("%s, for the legacy adv, the adv data length can't exceed 31. line %d", __func__, __LINE__);
  915. return BTM_ILLEGAL_VALUE;
  916. }
  917. } else {
  918. if (len > controller_get_interface()->ble_get_ext_adv_data_max_len()) {
  919. BTM_TRACE_ERROR("%s, The adv data len(%d) is longer then the controller adv max len(%d)",
  920. __func__, len, controller_get_interface()->ble_get_ext_adv_data_max_len());
  921. return BTM_ILLEGAL_VALUE;
  922. }
  923. }
  924. return BTM_SUCCESS;
  925. }
  926. void btm_ble_update_phy_evt(tBTM_BLE_UPDATE_PHY *params)
  927. {
  928. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  929. if (!params) {
  930. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  931. return;
  932. }
  933. tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(params->conn_idx);
  934. if(!p_lcb) {
  935. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  936. return;
  937. }
  938. cb_params.phy_update.status = params->status;
  939. cb_params.phy_update.tx_phy = params->tx_phy;
  940. cb_params.phy_update.rx_phy = params->rx_phy;
  941. memcpy(cb_params.phy_update.addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
  942. // If the user has register the callback function, should callback it to the application.
  943. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PHY_UPDATE_COMPLETE_EVT, &cb_params);
  944. return;
  945. }
  946. void btm_ble_scan_timeout_evt(void)
  947. {
  948. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SCAN_TIMEOUT_EVT, NULL);
  949. }
  950. void btm_ble_adv_set_terminated_evt(tBTM_BLE_ADV_TERMINAT *params)
  951. {
  952. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  953. if (!params) {
  954. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  955. return;
  956. }
  957. // adv terminated due to connection, save the adv handle and connection handle
  958. if(params->completed_event == 0x00) {
  959. adv_record[params->adv_handle].ter_con_handle = params->conn_handle;
  960. } else {
  961. adv_record[params->adv_handle].ter_con_handle = INVALID_VALUE;
  962. adv_record[params->adv_handle].invalid = false;
  963. }
  964. memcpy(&cb_params.adv_term, params, sizeof(tBTM_BLE_ADV_TERMINAT));
  965. // If the user has register the callback function, should callback it to the application.
  966. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_ADV_TERMINATED_EVT, &cb_params);
  967. return;
  968. }
  969. void btm_ble_ext_adv_report_evt(tBTM_BLE_EXT_ADV_REPORT *params)
  970. {
  971. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  972. if (!params) {
  973. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  974. return;
  975. }
  976. memcpy(&cb_params.ext_adv_report, params, sizeof(tBTM_BLE_EXT_ADV_REPORT));
  977. // If the user has register the callback function, should callback it to the application.
  978. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_EXT_ADV_REPORT_EVT, &cb_params);
  979. return;
  980. }
  981. void btm_ble_scan_req_received_evt(tBTM_BLE_SCAN_REQ_RECEIVED *params)
  982. {
  983. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  984. if (!params) {
  985. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  986. return;
  987. }
  988. memcpy(&cb_params.scan_req, params, sizeof(tBTM_BLE_SCAN_REQ_RECEIVED));
  989. // If the user has register the callback function, should callback it to the application.
  990. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_SCAN_REQ_RECEIVED_EVT, &cb_params);
  991. return;
  992. }
  993. void btm_ble_channel_select_algorithm_evt(tBTM_BLE_CHANNEL_SEL_ALG *params)
  994. {
  995. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  996. if (!params) {
  997. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  998. return;
  999. }
  1000. memcpy(&cb_params.channel_sel, params, sizeof(tBTM_BLE_CHANNEL_SEL_ALG));
  1001. // If the user has register the callback function, should callback it to the application.
  1002. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_CHANNEL_SELETE_ALGORITHM_EVT, &cb_params);
  1003. return;
  1004. }
  1005. void btm_ble_periodic_adv_report_evt(tBTM_PERIOD_ADV_REPORT *params)
  1006. {
  1007. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  1008. if (!params) {
  1009. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  1010. return;
  1011. }
  1012. memcpy(&cb_params.period_adv_report, params, sizeof(tBTM_PERIOD_ADV_REPORT));
  1013. // If the user has register the callback function, should callback it to the application.
  1014. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_REPORT_EVT, &cb_params);
  1015. return;
  1016. }
  1017. void btm_ble_periodic_adv_sync_lost_evt(tBTM_BLE_PERIOD_ADV_SYNC_LOST *params)
  1018. {
  1019. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  1020. if (!params) {
  1021. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  1022. return;
  1023. }
  1024. memcpy(&cb_params.sync_lost, params, sizeof(tBTM_BLE_PERIOD_ADV_SYNC_LOST));
  1025. // If the user has register the callback function, should callback it to the application.
  1026. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_LOST_EVT, &cb_params);
  1027. return;
  1028. }
  1029. void btm_ble_periodic_adv_sync_establish_evt(tBTM_BLE_PERIOD_ADV_SYNC_ESTAB *params)
  1030. {
  1031. tBTM_BLE_5_GAP_CB_PARAMS cb_params = {0};
  1032. if (!params) {
  1033. BTM_TRACE_ERROR("%s, Invalid params.", __func__);
  1034. return;
  1035. }
  1036. memcpy(&cb_params.sync_estab, params, sizeof(tBTM_BLE_PERIOD_ADV_SYNC_ESTAB));
  1037. // If the user has register the callback function, should callback it to the application.
  1038. BTM_ExtBleCallbackTrigger(BTM_BLE_5_GAP_PERIODIC_ADV_SYNC_ESTAB_EVT, &cb_params);
  1039. return;
  1040. }
  1041. #endif // #if (BLE_50_FEATURE_SUPPORT == TRUE)