ble_advdata.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. /* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
  2. *
  3. * The information contained herein is property of Nordic Semiconductor ASA.
  4. * Terms and conditions of usage are described in detail in NORDIC
  5. * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
  6. *
  7. * Licensees are granted free, non-transferable use of the information. NO
  8. * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
  9. * the file.
  10. *
  11. */
  12. #include "ble_advdata.h"
  13. #include "ble_gap.h"
  14. #include "ble_srv_common.h"
  15. #include "sdk_common.h"
  16. // NOTE: For now, Security Manager Out of Band Flags (OOB) are omitted from the advertising data.
  17. // Types of LE Bluetooth Device Address AD type
  18. #define AD_TYPE_BLE_DEVICE_ADDR_TYPE_PUBLIC 0UL
  19. #define AD_TYPE_BLE_DEVICE_ADDR_TYPE_RANDOM 1UL
  20. static uint32_t tk_value_encode(ble_advdata_tk_value_t * p_tk_value,
  21. uint8_t * p_encoded_data,
  22. uint16_t * p_offset,
  23. uint16_t max_size)
  24. {
  25. int8_t i;
  26. // Check for buffer overflow.
  27. if (((*p_offset) + AD_TYPE_TK_VALUE_SIZE) > max_size)
  28. {
  29. return NRF_ERROR_DATA_SIZE;
  30. }
  31. // Encode LE Role.
  32. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + AD_TYPE_TK_VALUE_DATA_SIZE);
  33. *p_offset += ADV_LENGTH_FIELD_SIZE;
  34. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE;
  35. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  36. for (i = AD_TYPE_TK_VALUE_DATA_SIZE - 1; i >= 0; i--, (*p_offset)++)
  37. {
  38. p_encoded_data[*p_offset] = p_tk_value->tk[i];
  39. }
  40. return NRF_SUCCESS;
  41. }
  42. static uint32_t le_role_encode(ble_advdata_le_role_t le_role,
  43. uint8_t * p_encoded_data,
  44. uint16_t * p_offset,
  45. uint16_t max_size)
  46. {
  47. // Check for buffer overflow.
  48. if (((*p_offset) + AD_TYPE_LE_ROLE_SIZE) > max_size)
  49. {
  50. return NRF_ERROR_DATA_SIZE;
  51. }
  52. // Encode LE Role.
  53. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + AD_TYPE_LE_ROLE_DATA_SIZE);
  54. *p_offset += ADV_LENGTH_FIELD_SIZE;
  55. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_LE_ROLE;
  56. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  57. switch(le_role)
  58. {
  59. case BLE_ADVDATA_ROLE_ONLY_PERIPH:
  60. p_encoded_data[*p_offset] = 0;
  61. break;
  62. case BLE_ADVDATA_ROLE_ONLY_CENTRAL:
  63. p_encoded_data[*p_offset] = 1;
  64. break;
  65. case BLE_ADVDATA_ROLE_BOTH_PERIPH_PREFERRED:
  66. p_encoded_data[*p_offset] = 2;
  67. break;
  68. case BLE_ADVDATA_ROLE_BOTH_CENTRAL_PREFERRED:
  69. p_encoded_data[*p_offset] = 3;
  70. break;
  71. default:
  72. return NRF_ERROR_INVALID_PARAM;
  73. }
  74. *p_offset += AD_TYPE_LE_ROLE_DATA_SIZE;
  75. return NRF_SUCCESS;
  76. }
  77. static uint32_t ble_device_addr_encode(uint8_t * p_encoded_data,
  78. uint16_t * p_offset,
  79. uint16_t max_size)
  80. {
  81. uint32_t err_code;
  82. ble_gap_addr_t device_addr;
  83. // Check for buffer overflow.
  84. if (((*p_offset) + AD_TYPE_BLE_DEVICE_ADDR_SIZE) > max_size)
  85. {
  86. return NRF_ERROR_DATA_SIZE;
  87. }
  88. // Get BLE address
  89. err_code = sd_ble_gap_address_get(&device_addr);
  90. VERIFY_SUCCESS(err_code);
  91. // Encode LE Bluetooth Device Address
  92. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE +
  93. AD_TYPE_BLE_DEVICE_ADDR_DATA_SIZE);
  94. *p_offset += ADV_LENGTH_FIELD_SIZE;
  95. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS;
  96. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  97. memcpy(&p_encoded_data[*p_offset], &device_addr.addr[0], BLE_GAP_ADDR_LEN);
  98. *p_offset += BLE_GAP_ADDR_LEN;
  99. if(BLE_GAP_ADDR_TYPE_PUBLIC == device_addr.addr_type)
  100. {
  101. p_encoded_data[*p_offset] = AD_TYPE_BLE_DEVICE_ADDR_TYPE_PUBLIC;
  102. }
  103. else
  104. {
  105. p_encoded_data[*p_offset] = AD_TYPE_BLE_DEVICE_ADDR_TYPE_RANDOM;
  106. }
  107. *p_offset += AD_TYPE_BLE_DEVICE_ADDR_TYPE_SIZE;
  108. return NRF_SUCCESS;
  109. }
  110. static uint32_t name_encode(const ble_advdata_t * p_advdata,
  111. uint8_t * p_encoded_data,
  112. uint16_t * p_offset,
  113. uint16_t max_size)
  114. {
  115. uint32_t err_code;
  116. uint16_t rem_adv_data_len;
  117. uint16_t actual_length;
  118. uint8_t adv_data_format;
  119. // Validate parameters
  120. if((BLE_ADVDATA_SHORT_NAME == p_advdata->name_type) && (0 == p_advdata->short_name_len))
  121. {
  122. return NRF_ERROR_INVALID_PARAM;
  123. }
  124. // Check for buffer overflow.
  125. if ( (((*p_offset) + ADV_AD_DATA_OFFSET) > max_size) ||
  126. ( (BLE_ADVDATA_SHORT_NAME == p_advdata->name_type) &&
  127. (((*p_offset) + ADV_AD_DATA_OFFSET + p_advdata->short_name_len) > max_size)))
  128. {
  129. return NRF_ERROR_DATA_SIZE;
  130. }
  131. rem_adv_data_len = max_size - (*p_offset) - ADV_AD_DATA_OFFSET;
  132. actual_length = rem_adv_data_len;
  133. // Get GAP device name and length
  134. err_code = sd_ble_gap_device_name_get(&p_encoded_data[(*p_offset) + ADV_AD_DATA_OFFSET],
  135. &actual_length);
  136. VERIFY_SUCCESS(err_code);
  137. // Check if device intend to use short name and it can fit available data size.
  138. if ((p_advdata->name_type == BLE_ADVDATA_FULL_NAME) && (actual_length <= rem_adv_data_len))
  139. {
  140. // Complete device name can fit, setting Complete Name in Adv Data.
  141. adv_data_format = BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME;
  142. }
  143. else
  144. {
  145. // Else short name needs to be used. Or application has requested use of short name.
  146. adv_data_format = BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME;
  147. // If application has set a preference on the short name size, it needs to be considered,
  148. // else fit what can be fit.
  149. if ((BLE_ADVDATA_SHORT_NAME == p_advdata->name_type) &&
  150. (p_advdata->short_name_len <= rem_adv_data_len))
  151. {
  152. // Short name fits available size.
  153. actual_length = p_advdata->short_name_len;
  154. }
  155. // Else whatever can fit the data buffer will be packed.
  156. else
  157. {
  158. actual_length = rem_adv_data_len;
  159. }
  160. }
  161. // There is only 1 byte intended to encode length which is (actual_length + ADV_AD_TYPE_FIELD_SIZE)
  162. if(actual_length > (0x00FF - ADV_AD_TYPE_FIELD_SIZE))
  163. {
  164. return NRF_ERROR_DATA_SIZE;
  165. }
  166. // Complete name field in encoded data.
  167. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + actual_length);
  168. *p_offset += ADV_LENGTH_FIELD_SIZE;
  169. p_encoded_data[*p_offset] = adv_data_format;
  170. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  171. *p_offset += actual_length;
  172. return NRF_SUCCESS;
  173. }
  174. static uint32_t appearance_encode(uint8_t * p_encoded_data,
  175. uint16_t * p_offset,
  176. uint16_t max_size)
  177. {
  178. uint32_t err_code;
  179. uint16_t appearance;
  180. // Check for buffer overflow.
  181. if (((*p_offset) + AD_TYPE_APPEARANCE_SIZE) > max_size)
  182. {
  183. return NRF_ERROR_DATA_SIZE;
  184. }
  185. // Get GAP appearance field.
  186. err_code = sd_ble_gap_appearance_get(&appearance);
  187. VERIFY_SUCCESS(err_code);
  188. // Encode Length, AD Type and Appearance.
  189. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + AD_TYPE_APPEARANCE_DATA_SIZE);
  190. *p_offset += ADV_LENGTH_FIELD_SIZE;
  191. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_APPEARANCE;
  192. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  193. *p_offset += uint16_encode(appearance, &p_encoded_data[*p_offset]);
  194. return NRF_SUCCESS;
  195. }
  196. static uint32_t flags_encode(int8_t flags,
  197. uint8_t * p_encoded_data,
  198. uint16_t * p_offset,
  199. uint16_t max_size)
  200. {
  201. // Check for buffer overflow.
  202. if (((*p_offset) + AD_TYPE_FLAGS_SIZE) > max_size)
  203. {
  204. return NRF_ERROR_DATA_SIZE;
  205. }
  206. // Encode flags.
  207. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + AD_TYPE_FLAGS_DATA_SIZE);
  208. *p_offset += ADV_LENGTH_FIELD_SIZE;
  209. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_FLAGS;
  210. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  211. p_encoded_data[*p_offset] = flags;
  212. *p_offset += AD_TYPE_FLAGS_DATA_SIZE;
  213. return NRF_SUCCESS;
  214. }
  215. static uint32_t sec_mgr_oob_flags_encode(uint8_t oob_flags,
  216. uint8_t * p_encoded_data,
  217. uint16_t * p_offset,
  218. uint16_t max_size)
  219. {
  220. // Check for buffer overflow.
  221. if (((*p_offset) + AD_TYPE_OOB_FLAGS_SIZE) > max_size)
  222. {
  223. return NRF_ERROR_DATA_SIZE;
  224. }
  225. // Encode flags.
  226. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + AD_TYPE_OOB_FLAGS_DATA_SIZE);
  227. *p_offset += ADV_LENGTH_FIELD_SIZE;
  228. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS;
  229. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  230. p_encoded_data[*p_offset] = oob_flags;
  231. *p_offset += AD_TYPE_OOB_FLAGS_DATA_SIZE;
  232. return NRF_SUCCESS;
  233. }
  234. static uint32_t tx_power_level_encode(int8_t tx_power_level,
  235. uint8_t * p_encoded_data,
  236. uint16_t * p_offset,
  237. uint16_t max_size)
  238. {
  239. // Check for buffer overflow.
  240. if (((*p_offset) + AD_TYPE_TX_POWER_LEVEL_SIZE) > max_size)
  241. {
  242. return NRF_ERROR_DATA_SIZE;
  243. }
  244. // Encode TX Power Level.
  245. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE +
  246. AD_TYPE_TX_POWER_LEVEL_DATA_SIZE);
  247. *p_offset += ADV_LENGTH_FIELD_SIZE;
  248. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_TX_POWER_LEVEL;
  249. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  250. p_encoded_data[*p_offset] = tx_power_level;
  251. *p_offset += AD_TYPE_TX_POWER_LEVEL_DATA_SIZE;
  252. return NRF_SUCCESS;
  253. }
  254. static uint32_t uuid_list_sized_encode(const ble_advdata_uuid_list_t * p_uuid_list,
  255. uint8_t adv_type,
  256. uint8_t uuid_size,
  257. uint8_t * p_encoded_data,
  258. uint16_t * p_offset,
  259. uint16_t max_size)
  260. {
  261. int i;
  262. bool is_heading_written = false;
  263. uint16_t start_pos = *p_offset;
  264. uint16_t length;
  265. for (i = 0; i < p_uuid_list->uuid_cnt; i++)
  266. {
  267. uint32_t err_code;
  268. uint8_t encoded_size;
  269. ble_uuid_t uuid = p_uuid_list->p_uuids[i];
  270. // Find encoded uuid size.
  271. err_code = sd_ble_uuid_encode(&uuid, &encoded_size, NULL);
  272. VERIFY_SUCCESS(err_code);
  273. // Check size.
  274. if (encoded_size == uuid_size)
  275. {
  276. uint8_t heading_bytes = (is_heading_written) ? 0 : ADV_AD_DATA_OFFSET;
  277. // Check for buffer overflow
  278. if (((*p_offset) + encoded_size + heading_bytes) > max_size)
  279. {
  280. return NRF_ERROR_DATA_SIZE;
  281. }
  282. if (!is_heading_written)
  283. {
  284. // Write AD structure heading.
  285. *p_offset += ADV_LENGTH_FIELD_SIZE;
  286. p_encoded_data[*p_offset] = adv_type;
  287. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  288. is_heading_written = true;
  289. }
  290. // Write UUID.
  291. err_code = sd_ble_uuid_encode(&uuid, &encoded_size, &p_encoded_data[*p_offset]);
  292. VERIFY_SUCCESS(err_code);
  293. *p_offset += encoded_size;
  294. }
  295. }
  296. if (is_heading_written)
  297. {
  298. // Write length.
  299. length = (*p_offset) - (start_pos + ADV_LENGTH_FIELD_SIZE);
  300. // There is only 1 byte intended to encode length
  301. if(length > 0x00FF)
  302. {
  303. return NRF_ERROR_DATA_SIZE;
  304. }
  305. p_encoded_data[start_pos] = (uint8_t)length;
  306. }
  307. return NRF_SUCCESS;
  308. }
  309. static uint32_t uuid_list_encode(const ble_advdata_uuid_list_t * p_uuid_list,
  310. uint8_t adv_type_16,
  311. uint8_t adv_type_128,
  312. uint8_t * p_encoded_data,
  313. uint16_t * p_offset,
  314. uint16_t max_size)
  315. {
  316. uint32_t err_code;
  317. // Encode 16 bit UUIDs.
  318. err_code = uuid_list_sized_encode(p_uuid_list,
  319. adv_type_16,
  320. sizeof(uint16_le_t),
  321. p_encoded_data,
  322. p_offset,
  323. max_size);
  324. VERIFY_SUCCESS(err_code);
  325. // Encode 128 bit UUIDs.
  326. err_code = uuid_list_sized_encode(p_uuid_list,
  327. adv_type_128,
  328. sizeof(ble_uuid128_t),
  329. p_encoded_data,
  330. p_offset,
  331. max_size);
  332. VERIFY_SUCCESS(err_code);
  333. return NRF_SUCCESS;
  334. }
  335. static uint32_t conn_int_check(const ble_advdata_conn_int_t *p_conn_int)
  336. {
  337. // Check Minimum Connection Interval.
  338. if ((p_conn_int->min_conn_interval < 0x0006) ||
  339. (
  340. (p_conn_int->min_conn_interval > 0x0c80) &&
  341. (p_conn_int->min_conn_interval != 0xffff)
  342. )
  343. )
  344. {
  345. return NRF_ERROR_INVALID_PARAM;
  346. }
  347. // Check Maximum Connection Interval.
  348. if ((p_conn_int->max_conn_interval < 0x0006) ||
  349. (
  350. (p_conn_int->max_conn_interval > 0x0c80) &&
  351. (p_conn_int->max_conn_interval != 0xffff)
  352. )
  353. )
  354. {
  355. return NRF_ERROR_INVALID_PARAM;
  356. }
  357. // Make sure Minimum Connection Interval is not bigger than Maximum Connection Interval.
  358. if ((p_conn_int->min_conn_interval != 0xffff) &&
  359. (p_conn_int->max_conn_interval != 0xffff) &&
  360. (p_conn_int->min_conn_interval > p_conn_int->max_conn_interval)
  361. )
  362. {
  363. return NRF_ERROR_INVALID_PARAM;
  364. }
  365. return NRF_SUCCESS;
  366. }
  367. static uint32_t conn_int_encode(const ble_advdata_conn_int_t * p_conn_int,
  368. uint8_t * p_encoded_data,
  369. uint16_t * p_offset,
  370. uint16_t max_size)
  371. {
  372. uint32_t err_code;
  373. // Check for buffer overflow.
  374. if (((*p_offset) + AD_TYPE_CONN_INT_SIZE) > max_size)
  375. {
  376. return NRF_ERROR_DATA_SIZE;
  377. }
  378. // Check parameters.
  379. err_code = conn_int_check(p_conn_int);
  380. VERIFY_SUCCESS(err_code);
  381. // Encode Length and AD Type.
  382. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + AD_TYPE_CONN_INT_DATA_SIZE);
  383. *p_offset += ADV_LENGTH_FIELD_SIZE;
  384. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE;
  385. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  386. // Encode Minimum and Maximum Connection Intervals.
  387. *p_offset += uint16_encode(p_conn_int->min_conn_interval, &p_encoded_data[*p_offset]);
  388. *p_offset += uint16_encode(p_conn_int->max_conn_interval, &p_encoded_data[*p_offset]);
  389. return NRF_SUCCESS;
  390. }
  391. static uint32_t manuf_specific_data_encode(const ble_advdata_manuf_data_t * p_manuf_sp_data,
  392. uint8_t * p_encoded_data,
  393. uint16_t * p_offset,
  394. uint16_t max_size)
  395. {
  396. uint32_t data_size = AD_TYPE_MANUF_SPEC_DATA_ID_SIZE + p_manuf_sp_data->data.size;
  397. // Check for buffer overflow.
  398. if (((*p_offset) + ADV_AD_DATA_OFFSET + data_size) > max_size)
  399. {
  400. return NRF_ERROR_DATA_SIZE;
  401. }
  402. // There is only 1 byte intended to encode length which is (data_size + ADV_AD_TYPE_FIELD_SIZE)
  403. if(data_size > (0x00FF - ADV_AD_TYPE_FIELD_SIZE))
  404. {
  405. return NRF_ERROR_DATA_SIZE;
  406. }
  407. // Encode Length and AD Type.
  408. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + data_size);
  409. *p_offset += ADV_LENGTH_FIELD_SIZE;
  410. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA;
  411. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  412. // Encode Company Identifier.
  413. *p_offset += uint16_encode(p_manuf_sp_data->company_identifier, &p_encoded_data[*p_offset]);
  414. // Encode additional manufacturer specific data.
  415. if (p_manuf_sp_data->data.size > 0)
  416. {
  417. if (p_manuf_sp_data->data.p_data == NULL)
  418. {
  419. return NRF_ERROR_INVALID_PARAM;
  420. }
  421. memcpy(&p_encoded_data[*p_offset], p_manuf_sp_data->data.p_data, p_manuf_sp_data->data.size);
  422. *p_offset += p_manuf_sp_data->data.size;
  423. }
  424. return NRF_SUCCESS;
  425. }
  426. // Implemented only for 16-bit UUIDs
  427. static uint32_t service_data_encode(const ble_advdata_t * p_advdata,
  428. uint8_t * p_encoded_data,
  429. uint16_t * p_offset,
  430. uint16_t max_size)
  431. {
  432. uint8_t i;
  433. // Check parameter consistency.
  434. if (p_advdata->p_service_data_array == NULL)
  435. {
  436. return NRF_ERROR_INVALID_PARAM;
  437. }
  438. for (i = 0; i < p_advdata->service_data_count; i++)
  439. {
  440. ble_advdata_service_data_t * p_service_data;
  441. uint32_t data_size;
  442. p_service_data = &p_advdata->p_service_data_array[i];
  443. // For now implemented only for 16-bit UUIDs
  444. data_size = AD_TYPE_SERV_DATA_16BIT_UUID_SIZE + p_service_data->data.size;
  445. // There is only 1 byte intended to encode length which is (data_size + ADV_AD_TYPE_FIELD_SIZE)
  446. if(data_size > (0x00FF - ADV_AD_TYPE_FIELD_SIZE))
  447. {
  448. return NRF_ERROR_DATA_SIZE;
  449. }
  450. // Encode Length and AD Type.
  451. p_encoded_data[*p_offset] = (uint8_t)(ADV_AD_TYPE_FIELD_SIZE + data_size);
  452. *p_offset += ADV_LENGTH_FIELD_SIZE;
  453. p_encoded_data[*p_offset] = BLE_GAP_AD_TYPE_SERVICE_DATA;
  454. *p_offset += ADV_AD_TYPE_FIELD_SIZE;
  455. // Encode service 16-bit UUID.
  456. *p_offset += uint16_encode(p_service_data->service_uuid, &p_encoded_data[*p_offset]);
  457. // Encode additional service data.
  458. if (p_service_data->data.size > 0)
  459. {
  460. if (p_service_data->data.p_data == NULL)
  461. {
  462. return NRF_ERROR_INVALID_PARAM;
  463. }
  464. memcpy(&p_encoded_data[*p_offset], p_service_data->data.p_data, p_service_data->data.size);
  465. *p_offset += p_service_data->data.size;
  466. }
  467. }
  468. return NRF_SUCCESS;
  469. }
  470. uint32_t adv_data_encode(ble_advdata_t const * const p_advdata,
  471. uint8_t * const p_encoded_data,
  472. uint16_t * const p_len)
  473. {
  474. uint32_t err_code = NRF_SUCCESS;
  475. uint16_t max_size = *p_len;
  476. *p_len = 0;
  477. //Encode Security Manager OOB Flags
  478. if (p_advdata->p_sec_mgr_oob_flags != NULL)
  479. {
  480. err_code = sec_mgr_oob_flags_encode(*p_advdata->p_sec_mgr_oob_flags,
  481. p_encoded_data,
  482. p_len,
  483. max_size);
  484. VERIFY_SUCCESS(err_code);
  485. }
  486. // Encode Security Manager TK value
  487. if (NULL != p_advdata->p_tk_value)
  488. {
  489. err_code = tk_value_encode(p_advdata->p_tk_value, p_encoded_data, p_len, max_size);
  490. VERIFY_SUCCESS(err_code);
  491. }
  492. // Encode LE Role
  493. if (BLE_ADVDATA_ROLE_NOT_PRESENT != p_advdata->le_role)
  494. {
  495. err_code = le_role_encode(p_advdata->le_role, p_encoded_data, p_len, max_size);
  496. VERIFY_SUCCESS(err_code);
  497. }
  498. // Encode LE Bluetooth Device Address
  499. if (p_advdata->include_ble_device_addr)
  500. {
  501. err_code = ble_device_addr_encode(p_encoded_data, p_len, max_size);
  502. VERIFY_SUCCESS(err_code);
  503. }
  504. // Encode appearance.
  505. if (p_advdata->include_appearance)
  506. {
  507. err_code = appearance_encode(p_encoded_data, p_len, max_size);
  508. VERIFY_SUCCESS(err_code);
  509. }
  510. //Encode Flags
  511. if(p_advdata->flags != 0 )
  512. {
  513. err_code = flags_encode(p_advdata->flags, p_encoded_data, p_len, max_size);
  514. VERIFY_SUCCESS(err_code);
  515. }
  516. // Encode TX power level.
  517. if (p_advdata->p_tx_power_level != NULL)
  518. {
  519. err_code = tx_power_level_encode(*p_advdata->p_tx_power_level,
  520. p_encoded_data,
  521. p_len,
  522. max_size);
  523. VERIFY_SUCCESS(err_code);
  524. }
  525. // Encode 'more available' uuid list.
  526. if (p_advdata->uuids_more_available.uuid_cnt > 0)
  527. {
  528. err_code = uuid_list_encode(&p_advdata->uuids_more_available,
  529. BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE,
  530. BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE,
  531. p_encoded_data,
  532. p_len,
  533. max_size);
  534. VERIFY_SUCCESS(err_code);
  535. }
  536. // Encode 'complete' uuid list.
  537. if (p_advdata->uuids_complete.uuid_cnt > 0)
  538. {
  539. err_code = uuid_list_encode(&p_advdata->uuids_complete,
  540. BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE,
  541. BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE,
  542. p_encoded_data,
  543. p_len,
  544. max_size);
  545. VERIFY_SUCCESS(err_code);
  546. }
  547. // Encode 'solicited service' uuid list.
  548. if (p_advdata->uuids_solicited.uuid_cnt > 0)
  549. {
  550. err_code = uuid_list_encode(&p_advdata->uuids_solicited,
  551. BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT,
  552. BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT,
  553. p_encoded_data,
  554. p_len,
  555. max_size);
  556. VERIFY_SUCCESS(err_code);
  557. }
  558. // Encode Slave Connection Interval Range.
  559. if (p_advdata->p_slave_conn_int != NULL)
  560. {
  561. err_code = conn_int_encode(p_advdata->p_slave_conn_int, p_encoded_data, p_len, max_size);
  562. VERIFY_SUCCESS(err_code);
  563. }
  564. // Encode Manufacturer Specific Data.
  565. if (p_advdata->p_manuf_specific_data != NULL)
  566. {
  567. err_code = manuf_specific_data_encode(p_advdata->p_manuf_specific_data,
  568. p_encoded_data,
  569. p_len,
  570. max_size);
  571. VERIFY_SUCCESS(err_code);
  572. }
  573. // Encode Service Data.
  574. if (p_advdata->service_data_count > 0)
  575. {
  576. err_code = service_data_encode(p_advdata, p_encoded_data, p_len, max_size);
  577. VERIFY_SUCCESS(err_code);
  578. }
  579. // Encode name. WARNING: it is encoded last on purpose since too long device name is truncated.
  580. if (p_advdata->name_type != BLE_ADVDATA_NO_NAME)
  581. {
  582. err_code = name_encode(p_advdata, p_encoded_data, p_len, max_size);
  583. VERIFY_SUCCESS(err_code);
  584. }
  585. return err_code;
  586. }
  587. static uint32_t advdata_check(const ble_advdata_t * p_advdata)
  588. {
  589. // Flags must be included in advertising data, and the BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED flag must be set.
  590. if (
  591. ((p_advdata->flags & BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) == 0)
  592. )
  593. {
  594. return NRF_ERROR_INVALID_PARAM;
  595. }
  596. return NRF_SUCCESS;
  597. }
  598. static uint32_t srdata_check(const ble_advdata_t * p_srdata)
  599. {
  600. // Flags shall not be included in the scan response data.
  601. if (p_srdata->flags)
  602. {
  603. return NRF_ERROR_INVALID_PARAM;
  604. }
  605. return NRF_SUCCESS;
  606. }
  607. uint32_t ble_advdata_set(const ble_advdata_t * p_advdata, const ble_advdata_t * p_srdata)
  608. {
  609. uint32_t err_code;
  610. uint16_t len_advdata = BLE_GAP_ADV_MAX_SIZE;
  611. uint16_t len_srdata = BLE_GAP_ADV_MAX_SIZE;
  612. uint8_t encoded_advdata[BLE_GAP_ADV_MAX_SIZE];
  613. uint8_t encoded_srdata[BLE_GAP_ADV_MAX_SIZE];
  614. uint8_t * p_encoded_advdata;
  615. uint8_t * p_encoded_srdata;
  616. // Encode advertising data (if supplied).
  617. if (p_advdata != NULL)
  618. {
  619. err_code = advdata_check(p_advdata);
  620. VERIFY_SUCCESS(err_code);
  621. err_code = adv_data_encode(p_advdata, encoded_advdata, &len_advdata);
  622. VERIFY_SUCCESS(err_code);
  623. p_encoded_advdata = encoded_advdata;
  624. }
  625. else
  626. {
  627. p_encoded_advdata = NULL;
  628. len_advdata = 0;
  629. }
  630. // Encode scan response data (if supplied).
  631. if (p_srdata != NULL)
  632. {
  633. err_code = srdata_check(p_srdata);
  634. VERIFY_SUCCESS(err_code);
  635. err_code = adv_data_encode(p_srdata, encoded_srdata, &len_srdata);
  636. VERIFY_SUCCESS(err_code);
  637. p_encoded_srdata = encoded_srdata;
  638. }
  639. else
  640. {
  641. p_encoded_srdata = NULL;
  642. len_srdata = 0;
  643. }
  644. // Pass encoded advertising data and/or scan response data to the stack.
  645. return sd_ble_gap_adv_data_set(p_encoded_advdata, len_advdata, p_encoded_srdata, len_srdata);
  646. }