btm_ble_5_gap.c 48 KB

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