ll.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798
  1. // SPDX-License-Identifier: LGPL-2.1-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2011-2014 Intel Corporation
  7. * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
  8. *
  9. *
  10. */
  11. #ifdef HAVE_CONFIG_H
  12. #include <config.h>
  13. #endif
  14. #define _GNU_SOURCE
  15. #include <stdio.h>
  16. #include <inttypes.h>
  17. #include "src/shared/util.h"
  18. #include "display.h"
  19. #include "packet.h"
  20. #include "crc.h"
  21. #include "bt.h"
  22. #include "ll.h"
  23. #define COLOR_OPCODE COLOR_MAGENTA
  24. #define COLOR_OPCODE_UNKNOWN COLOR_WHITE_BG
  25. #define COLOR_UNKNOWN_OPTIONS_BIT COLOR_WHITE_BG
  26. #define MAX_CHANNEL 16
  27. struct channel_data {
  28. uint32_t access_addr;
  29. uint32_t crc_init;
  30. };
  31. static struct channel_data channel_list[MAX_CHANNEL];
  32. static void set_crc_init(uint32_t access_addr, uint32_t crc_init)
  33. {
  34. int i;
  35. for (i = 0; i < MAX_CHANNEL; i++) {
  36. if (channel_list[i].access_addr == 0x00000000 ||
  37. channel_list[i].access_addr == access_addr) {
  38. channel_list[i].access_addr = access_addr;
  39. channel_list[i].crc_init = crc_init;
  40. break;
  41. }
  42. }
  43. }
  44. static uint32_t get_crc_init(uint32_t access_addr)
  45. {
  46. int i;
  47. for (i = 0; i < MAX_CHANNEL; i++) {
  48. if (channel_list[i].access_addr == access_addr)
  49. return channel_list[i].crc_init;
  50. }
  51. return 0x00000000;
  52. }
  53. static void advertising_packet(const void *data, uint8_t size)
  54. {
  55. const uint8_t *ptr = data;
  56. uint8_t pdu_type, length, win_size, hop, sca;
  57. bool tx_add, rx_add;
  58. uint32_t access_addr, crc_init;
  59. uint16_t win_offset, interval, latency, timeout;
  60. const char *str;
  61. if (size < 2) {
  62. print_text(COLOR_ERROR, "packet too short");
  63. packet_hexdump(data, size);
  64. return;
  65. }
  66. pdu_type = ptr[0] & 0x0f;
  67. tx_add = !!(ptr[0] & 0x40);
  68. rx_add = !!(ptr[0] & 0x80);
  69. length = ptr[1] & 0x3f;
  70. switch (pdu_type) {
  71. case 0x00:
  72. str = "ADV_IND";
  73. break;
  74. case 0x01:
  75. str = "ADV_DIRECT_IND";
  76. break;
  77. case 0x02:
  78. str = "ADV_NONCONN_IND";
  79. break;
  80. case 0x03:
  81. str = "SCAN_REQ";
  82. break;
  83. case 0x04:
  84. str = "SCAN_RSP";
  85. break;
  86. case 0x05:
  87. str = "CONNECT_REQ";
  88. break;
  89. case 0x06:
  90. str = "ADV_SCAN_IND";
  91. break;
  92. default:
  93. str = "Reserved";
  94. break;
  95. }
  96. print_field("Type: %s (0x%2.2x)", str, pdu_type);
  97. print_field("TxAdd: %u", tx_add);
  98. print_field("RxAdd: %u", rx_add);
  99. print_field("Length: %u", length);
  100. if (length != size - 2) {
  101. print_text(COLOR_ERROR, "packet size mismatch");
  102. packet_hexdump(data + 2, size - 2);
  103. return;
  104. }
  105. switch (pdu_type) {
  106. case 0x00: /* ADV_IND */
  107. case 0x02: /* AVD_NONCONN_IND */
  108. case 0x06: /* ADV_SCAN_IND */
  109. case 0x04: /* SCAN_RSP */
  110. if (length < 6) {
  111. print_text(COLOR_ERROR, "payload too short");
  112. packet_hexdump(data + 2, length);
  113. return;
  114. }
  115. packet_print_addr("Advertiser address", data + 2, tx_add);
  116. packet_print_ad(data + 8, length - 6);
  117. break;
  118. case 0x01: /* ADV_DIRECT_IND */
  119. if (length < 12) {
  120. print_text(COLOR_ERROR, "payload too short");
  121. packet_hexdump(data + 2, length);
  122. return;
  123. }
  124. packet_print_addr("Advertiser address", data + 2, tx_add);
  125. packet_print_addr("Inititator address", data + 8, rx_add);
  126. break;
  127. case 0x03: /* SCAN_REQ */
  128. if (length < 12) {
  129. print_text(COLOR_ERROR, "payload too short");
  130. packet_hexdump(data + 2, length);
  131. return;
  132. }
  133. packet_print_addr("Scanner address", data + 2, tx_add);
  134. packet_print_addr("Advertiser address", data + 8, rx_add);
  135. break;
  136. case 0x05: /* CONNECT_REQ */
  137. if (length < 34) {
  138. print_text(COLOR_ERROR, "payload too short");
  139. packet_hexdump(data + 2, length);
  140. return;
  141. }
  142. packet_print_addr("Inititator address", data + 2, tx_add);
  143. packet_print_addr("Advertiser address", data + 8, rx_add);
  144. access_addr = ptr[14] | ptr[15] << 8 |
  145. ptr[16] << 16 | ptr[17] << 24;
  146. crc_init = ptr[18] | ptr[19] << 8 | ptr[20] << 16;
  147. print_field("Access address: 0x%8.8x", access_addr);
  148. print_field("CRC init: 0x%6.6x", crc_init);
  149. set_crc_init(access_addr, crc24_bit_reverse(crc_init));
  150. win_size = ptr[21];
  151. win_offset = ptr[22] | ptr[23] << 8;
  152. interval = ptr[24] | ptr[25] << 8;
  153. latency = ptr[26] | ptr[27] << 8;
  154. timeout = ptr[28] | ptr[29] << 8;
  155. print_field("Transmit window size: %u", win_size);
  156. print_field("Transmit window offset: %u", win_offset);
  157. print_field("Connection interval: %u", interval);
  158. print_field("Connection peripheral latency: %u", latency);
  159. print_field("Connection supervision timeout: %u", timeout);
  160. packet_print_channel_map_ll(ptr + 30);
  161. hop = ptr[35] & 0x1f;
  162. sca = (ptr[35] & 0xe0) >> 5;
  163. switch (sca) {
  164. case 0:
  165. str = "251 ppm to 500 ppm";
  166. break;
  167. case 1:
  168. str = "151 ppm to 250 ppm";
  169. break;
  170. case 2:
  171. str = "101 ppm to 150ppm";
  172. break;
  173. case 3:
  174. str = "76 ppm to 100 ppm";
  175. break;
  176. case 4:
  177. str = "51 ppm to 75 ppm";
  178. break;
  179. case 5:
  180. str = "31 ppm to 50 ppm";
  181. break;
  182. case 6:
  183. str = "21 ppm to 30 ppm";
  184. break;
  185. case 7:
  186. str = "0 ppm to 20 ppm";
  187. break;
  188. default:
  189. str = "Invalid";
  190. break;
  191. }
  192. print_field("Hop increment: %u", hop);
  193. print_field("Sleep clock accuracy: %s (%u)", str, sca);
  194. break;
  195. default:
  196. packet_hexdump(data + 2, length);
  197. break;
  198. }
  199. }
  200. static void data_packet(const void *data, uint8_t size, bool padded)
  201. {
  202. const uint8_t *ptr = data;
  203. uint8_t llid, length;
  204. bool nesn, sn, md;
  205. const char *str;
  206. if (size < 2) {
  207. print_text(COLOR_ERROR, "packet too short");
  208. packet_hexdump(data, size);
  209. return;
  210. }
  211. llid = ptr[0] & 0x03;
  212. nesn = !!(ptr[0] & 0x04);
  213. sn = !!(ptr[0] & 0x08);
  214. md = !!(ptr[0] & 0x10);
  215. length = ptr[1] & 0x1f;
  216. switch (llid) {
  217. case 0x01:
  218. if (length > 0)
  219. str = "Continuation fragement of L2CAP message";
  220. else
  221. str = "Empty message";
  222. break;
  223. case 0x02:
  224. str = "Start of L2CAP message";
  225. break;
  226. case 0x03:
  227. str = "Control";
  228. break;
  229. default:
  230. str = "Reserved";
  231. break;
  232. }
  233. print_field("LLID: %s (0x%2.2x)", str, llid);
  234. print_field("Next expected sequence number: %u", nesn);
  235. print_field("Sequence number: %u", sn);
  236. print_field("More data: %u", md);
  237. print_field("Length: %u", length);
  238. switch (llid) {
  239. case 0x03:
  240. llcp_packet(data + 2, size - 2, padded);
  241. break;
  242. default:
  243. packet_hexdump(data + 2, size - 2);
  244. break;
  245. }
  246. }
  247. void ll_packet(uint16_t frequency, const void *data, uint8_t size, bool padded)
  248. {
  249. const struct bt_ll_hdr *hdr = data;
  250. uint8_t channel = (frequency - 2402) / 2;
  251. uint32_t access_addr;
  252. char access_str[12];
  253. const char *channel_label, *channel_color;
  254. const uint8_t *pdu_data;
  255. uint8_t pdu_len;
  256. uint32_t pdu_crc, crc, crc_init;
  257. if (size < sizeof(*hdr)) {
  258. print_text(COLOR_ERROR, "packet missing header");
  259. packet_hexdump(data, size);
  260. return;
  261. }
  262. if (size < sizeof(*hdr) + 3) {
  263. print_text(COLOR_ERROR, "packet missing checksum");
  264. packet_hexdump(data, size);
  265. return;
  266. }
  267. if (hdr->preamble != 0xaa && hdr->preamble != 0x55) {
  268. print_text(COLOR_ERROR, "invalid preamble");
  269. packet_hexdump(data, size);
  270. return;
  271. }
  272. access_addr = le32_to_cpu(hdr->access_addr);
  273. pdu_data = data + sizeof(*hdr);
  274. pdu_len = size - sizeof(*hdr) - 3;
  275. pdu_crc = pdu_data[pdu_len + 0] | (pdu_data[pdu_len + 1] << 8) |
  276. (pdu_data[pdu_len + 2] << 16);
  277. if (access_addr == 0x8e89bed6) {
  278. channel_label = "Advertising channel: ";
  279. channel_color = COLOR_MAGENTA;
  280. } else {
  281. channel_label = "Data channel: ";
  282. channel_color = COLOR_CYAN;
  283. }
  284. sprintf(access_str, "0x%8.8x", access_addr);
  285. print_indent(6, channel_color, channel_label, access_str, COLOR_OFF,
  286. " (channel %d) len %d crc 0x%6.6x", channel, pdu_len, pdu_crc);
  287. if (access_addr == 0x8e89bed6)
  288. crc_init = 0xaaaaaa;
  289. else
  290. crc_init = get_crc_init(access_addr);
  291. if (crc_init) {
  292. crc = crc24_calculate(crc_init, pdu_data, pdu_len);
  293. if (crc != pdu_crc) {
  294. print_text(COLOR_ERROR, "invalid checksum");
  295. packet_hexdump(pdu_data, pdu_len);
  296. return;
  297. }
  298. } else
  299. print_text(COLOR_ERROR, "unknown access address");
  300. if (access_addr == 0x8e89bed6)
  301. advertising_packet(pdu_data, pdu_len);
  302. else
  303. data_packet(pdu_data, pdu_len, padded);
  304. }
  305. static void null_pdu(const void *data, uint8_t size)
  306. {
  307. }
  308. static void conn_update_req(const void *data, uint8_t size)
  309. {
  310. const struct bt_ll_conn_update_req *pdu = data;
  311. print_field("Transmit window size: %u", pdu->win_size);
  312. print_field("Transmit window offset: %u", le16_to_cpu(pdu->win_offset));
  313. print_field("Connection interval: %u", le16_to_cpu(pdu->interval));
  314. print_field("Connection peripheral latency: %u",
  315. le16_to_cpu(pdu->latency));
  316. print_field("Connection supervision timeout: %u",
  317. le16_to_cpu(pdu->timeout));
  318. print_field("Connection instant: %u", le16_to_cpu(pdu->instant));
  319. }
  320. static void channel_map_req(const void *data, uint8_t size)
  321. {
  322. const struct bt_ll_channel_map_req *pdu = data;
  323. packet_print_channel_map_ll(pdu->map);
  324. print_field("Connection instant: %u", le16_to_cpu(pdu->instant));
  325. }
  326. static void terminate_ind(const void *data, uint8_t size)
  327. {
  328. const struct bt_ll_terminate_ind *pdu = data;
  329. packet_print_error("Error code", pdu->error);
  330. }
  331. static void enc_req(const void *data, uint8_t size)
  332. {
  333. const struct bt_ll_enc_req *pdu = data;
  334. print_field("Rand: 0x%16.16" PRIx64, le64_to_cpu(pdu->rand));
  335. print_field("EDIV: 0x%4.4x", le16_to_cpu(pdu->ediv));
  336. print_field("SKD (central): 0x%16.16" PRIx64, le64_to_cpu(pdu->skd));
  337. print_field("IV (central): 0x%8.8x", le32_to_cpu(pdu->iv));
  338. }
  339. static void enc_rsp(const void *data, uint8_t size)
  340. {
  341. const struct bt_ll_enc_rsp *pdu = data;
  342. print_field("SKD (peripheral): 0x%16.16" PRIx64, le64_to_cpu(pdu->skd));
  343. print_field("IV (peripheral): 0x%8.8x", le32_to_cpu(pdu->iv));
  344. }
  345. static const char *opcode_to_string(uint8_t opcode);
  346. static void unknown_rsp(const void *data, uint8_t size)
  347. {
  348. const struct bt_ll_unknown_rsp *pdu = data;
  349. print_field("Unknown type: %s (0x%2.2x)",
  350. opcode_to_string(pdu->type), pdu->type);
  351. }
  352. static void feature_req(const void *data, uint8_t size)
  353. {
  354. const struct bt_ll_feature_req *pdu = data;
  355. packet_print_features_ll(pdu->features);
  356. }
  357. static void feature_rsp(const void *data, uint8_t size)
  358. {
  359. const struct bt_ll_feature_rsp *pdu = data;
  360. packet_print_features_ll(pdu->features);
  361. }
  362. static void version_ind(const void *data, uint8_t size)
  363. {
  364. const struct bt_ll_version_ind *pdu = data;
  365. packet_print_version("Version", pdu->version,
  366. "Subversion", le16_to_cpu(pdu->subversion));
  367. packet_print_company("Company", le16_to_cpu(pdu->company));
  368. }
  369. static void reject_ind(const void *data, uint8_t size)
  370. {
  371. const struct bt_ll_reject_ind *pdu = data;
  372. packet_print_error("Error code", pdu->error);
  373. }
  374. static void peripheral_feature_req(const void *data, uint8_t size)
  375. {
  376. const struct bt_ll_peripheral_feature_req *pdu = data;
  377. packet_print_features_ll(pdu->features);
  378. }
  379. static void reject_ind_ext(const void *data, uint8_t size)
  380. {
  381. const struct bt_ll_reject_ind_ext *pdu = data;
  382. print_field("Reject opcode: %u (0x%2.2x)", pdu->opcode, pdu->opcode);
  383. packet_print_error("Error code", pdu->error);
  384. }
  385. static void length_req_rsp(const void *data, uint8_t size)
  386. {
  387. const struct bt_ll_length *pdu = data;
  388. print_field("MaxRxOctets: %u", pdu->rx_len);
  389. print_field("MaxRxTime: %u", pdu->rx_time);
  390. print_field("MaxTxOctets: %u", pdu->tx_len);
  391. print_field("MaxtxTime: %u", pdu->tx_time);
  392. }
  393. static const struct bitfield_data le_phys[] = {
  394. { 0, "LE 1M" },
  395. { 1, "LE 2M" },
  396. { 2, "LE Coded"},
  397. { }
  398. };
  399. static void phy_req_rsp(const void *data, uint8_t size)
  400. {
  401. const struct bt_ll_phy *pdu = data;
  402. uint8_t mask;
  403. print_field("RX PHYs: 0x%2.2x", pdu->rx_phys);
  404. mask = print_bitfield(2, pdu->rx_phys, le_phys);
  405. if (mask)
  406. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  407. " (0x%2.2x)", mask);
  408. print_field("TX PHYs: 0x%2.2x", pdu->tx_phys);
  409. mask = print_bitfield(2, pdu->tx_phys, le_phys);
  410. if (mask)
  411. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  412. " (0x%2.2x)", mask);
  413. }
  414. static void phy_update_ind(const void *data, uint8_t size)
  415. {
  416. const struct bt_ll_phy_update_ind *pdu = data;
  417. uint8_t mask;
  418. print_field("C_TO_P_PHY: 0x%2.2x", pdu->c_phy);
  419. mask = print_bitfield(2, pdu->c_phy, le_phys);
  420. if (mask)
  421. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  422. " (0x%2.2x)", mask);
  423. print_field("P_TO_C_PHY: 0x%2.2x", pdu->p_phy);
  424. mask = print_bitfield(2, pdu->p_phy, le_phys);
  425. if (mask)
  426. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  427. " (0x%2.2x)", mask);
  428. print_field("Instant: 0x%4.4x", pdu->instant);
  429. }
  430. static void min_used_channels(const void *data, uint8_t size)
  431. {
  432. const struct bt_ll_min_used_channels *pdu = data;
  433. uint8_t mask;
  434. print_field("PHYS: 0x%2.2x", pdu->phys);
  435. mask = print_bitfield(2, pdu->phys, le_phys);
  436. if (mask)
  437. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  438. " (0x%2.2x)", mask);
  439. print_field("MinUsedChannels: 0x%2.2x", pdu->min_channels);
  440. }
  441. static void cte_req(const void *data, uint8_t size)
  442. {
  443. const struct bt_ll_cte_req *pdu = data;
  444. print_field("MinCTELenReq: 0x%2.2x", pdu->cte & 0xf8);
  445. print_field("CTETypeReq: 0x%2.2x", pdu->cte & 0x03);
  446. switch (pdu->cte & 0x03) {
  447. case 0x00:
  448. print_field(" AoA Constant Tone Extension");
  449. break;
  450. case 0x01:
  451. print_field(" AoD Constant Tone Extension with 1 μs slots");
  452. break;
  453. case 0x02:
  454. print_field(" AoD Constant Tone Extension with 2 μs slots");
  455. break;
  456. }
  457. }
  458. static void periodic_sync_ind(const void *data, uint8_t size)
  459. {
  460. const struct bt_ll_periodic_sync_ind *pdu = data;
  461. uint8_t mask;
  462. print_field("ID: 0x%4.4x", pdu->id);
  463. print_field("SyncInfo:");
  464. packet_hexdump(pdu->info, sizeof(pdu->info));
  465. print_field("connEventCount: 0x%4.4x", pdu->event_count);
  466. print_field("lastPaEventCounter: 0x%4.4x", pdu->last_counter);
  467. print_field("SID: 0x%2.2x", pdu->adv_info & 0xf0);
  468. print_field("AType: %s", pdu->adv_info & 0x08 ? "random" : "public");
  469. print_field("SCA: 0x%2.2x", pdu->adv_info & 0x07);
  470. print_field("PHY: 0x%2.2x", pdu->phy);
  471. mask = print_bitfield(2, pdu->phy, le_phys);
  472. if (mask)
  473. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  474. " (0x%2.2x)", mask);
  475. packet_print_addr("AdvA", pdu->adv_addr, pdu->adv_info & 0x08);
  476. print_field("syncConnEventCount: 0x%4.4x", pdu->sync_counter);
  477. }
  478. static void clock_acc_req_rsp(const void *data, uint8_t size)
  479. {
  480. const struct bt_ll_clock_acc *pdu = data;
  481. print_field("SCA: 0x%2.2x", pdu->sca);
  482. }
  483. static void cis_req(const void *data, uint8_t size)
  484. {
  485. const struct bt_ll_cis_req *cmd = data;
  486. uint32_t interval;
  487. uint8_t mask;
  488. print_field("CIG ID: 0x%2.2x", cmd->cig);
  489. print_field("CIS ID: 0x%2.2x", cmd->cis);
  490. print_field("Central to Peripheral PHY: 0x%2.2x", cmd->c_phy);
  491. mask = print_bitfield(2, cmd->c_phy, le_phys);
  492. if (mask)
  493. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  494. " (0x%2.2x)", mask);
  495. print_field("Peripheral To Central PHY: 0x%2.2x", cmd->p_phy);
  496. mask = print_bitfield(2, cmd->p_phy, le_phys);
  497. if (mask)
  498. print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
  499. " (0x%2.2x)", mask);
  500. print_field("Central to Peripheral Maximum SDU: %u", cmd->c_sdu);
  501. print_field("Peripheral to Central Maximum SDU: %u", cmd->p_sdu);
  502. memcpy(&interval, cmd->c_interval, sizeof(cmd->c_interval));
  503. print_field("Central to Peripheral Interval: 0x%6.6x",
  504. le32_to_cpu(interval));
  505. memcpy(&interval, cmd->p_interval, sizeof(cmd->p_interval));
  506. print_field("Peripheral to Central Interval: 0x%6.6x",
  507. le32_to_cpu(interval));
  508. print_field("Central to Peripheral Maximum PDU: %u", cmd->c_pdu);
  509. print_field("Peripheral to Central Maximum PDU: %u", cmd->p_pdu);
  510. print_field("Burst Number: %u us", cmd->bn);
  511. memcpy(&interval, cmd->sub_interval, sizeof(cmd->sub_interval));
  512. print_field("Sub-Interval: 0x%6.6x", le32_to_cpu(interval));
  513. print_field("Central to Peripheral Flush Timeout: %u", cmd->c_ft);
  514. print_field("Peripheral to Central Flush Timeout: %u", cmd->p_ft);
  515. print_field("ISO Interval: 0x%4.4x", le16_to_cpu(cmd->iso_interval));
  516. memcpy(&interval, cmd->offset_min, sizeof(cmd->offset_min));
  517. print_field("CIS Offset Minimum: 0x%6.6x", le32_to_cpu(interval));
  518. memcpy(&interval, cmd->offset_max, sizeof(cmd->offset_max));
  519. print_field("CIS Offset Maximum: 0x%6.6x", le32_to_cpu(interval));
  520. print_field("Connection Event Count: %u", cmd->conn_event_count);
  521. }
  522. static void cis_rsp(const void *data, uint8_t size)
  523. {
  524. const struct bt_ll_cis_rsp *rsp = data;
  525. uint32_t interval;
  526. memcpy(&interval, rsp->offset_min, sizeof(rsp->offset_min));
  527. print_field("CIS Offset Minimum: 0x%6.6x", le32_to_cpu(interval));
  528. memcpy(&interval, rsp->offset_max, sizeof(rsp->offset_max));
  529. print_field("CIS Offset Maximum: 0x%6.6x", le32_to_cpu(interval));
  530. print_field("Connection Event Count: %u", rsp->conn_event_count);
  531. }
  532. static void cis_ind(const void *data, uint8_t size)
  533. {
  534. const struct bt_ll_cis_ind *ind = data;
  535. uint32_t interval;
  536. print_field("CIS Access Address: 0x%4.4x", le32_to_cpu(ind->addr));
  537. memcpy(&interval, ind->cis_offset, sizeof(ind->cis_offset));
  538. print_field("CIS Offset: 0x%6.6x", le32_to_cpu(interval));
  539. memcpy(&interval, ind->cig_sync_delay, sizeof(ind->cig_sync_delay));
  540. print_field("CIG Synchronization Delay: 0x%6.6x",
  541. le32_to_cpu(interval));
  542. memcpy(&interval, ind->cis_sync_delay, sizeof(ind->cis_sync_delay));
  543. print_field("CIS Synchronization Delay: %u us",
  544. le32_to_cpu(interval));
  545. print_field("Connection Event Count: %u", ind->conn_event_count);
  546. }
  547. static void cis_term_ind(const void *data, uint8_t size)
  548. {
  549. const struct bt_ll_cis_term_ind *ind = data;
  550. print_field("CIG ID: 0x%2.2x", ind->cig);
  551. print_field("CIS ID: 0x%2.2x", ind->cis);
  552. packet_print_error("Reason", ind->reason);
  553. }
  554. struct llcp_data {
  555. uint8_t opcode;
  556. const char *str;
  557. void (*func) (const void *data, uint8_t size);
  558. uint8_t size;
  559. bool fixed;
  560. };
  561. static const struct llcp_data llcp_table[] = {
  562. { 0x00, "LL_CONNECTION_UPDATE_REQ", conn_update_req, 11, true },
  563. { 0x01, "LL_CHANNEL_MAP_REQ", channel_map_req, 7, true },
  564. { 0x02, "LL_TERMINATE_IND", terminate_ind, 1, true },
  565. { 0x03, "LL_ENC_REQ", enc_req, 22, true },
  566. { 0x04, "LL_ENC_RSP", enc_rsp, 12, true },
  567. { 0x05, "LL_START_ENC_REQ", null_pdu, 0, true },
  568. { 0x06, "LL_START_ENC_RSP", null_pdu, 0, true },
  569. { 0x07, "LL_UNKNOWN_RSP", unknown_rsp, 1, true },
  570. { 0x08, "LL_FEATURE_REQ", feature_req, 8, true },
  571. { 0x09, "LL_FEATURE_RSP", feature_rsp, 8, true },
  572. { 0x0a, "LL_PAUSE_ENC_REQ", null_pdu, 0, true },
  573. { 0x0b, "LL_PAUSE_ENC_RSP", null_pdu, 0, true },
  574. { 0x0c, "LL_VERSION_IND", version_ind, 5, true },
  575. { 0x0d, "LL_REJECT_IND", reject_ind, 1, true },
  576. { 0x0e, "LL_PERIPHERAL_FEATURE_REQ", peripheral_feature_req, 8, true },
  577. { 0x0f, "LL_CONNECTION_PARAM_REQ", NULL, 23, true },
  578. { 0x10, "LL_CONNECTION_PARAM_RSP", NULL, 23, true },
  579. { 0x11, "LL_REJECT_IND_EXT", reject_ind_ext, 2, true },
  580. { 0x12, "LL_PING_REQ", null_pdu, 0, true },
  581. { 0x13, "LL_PING_RSP", null_pdu, 0, true },
  582. { 0x14, "LL_LENGTH_REQ", length_req_rsp, 8, true },
  583. { 0x15, "LL_LENGTH_RSP", length_req_rsp, 8, true },
  584. { 0x16, "LL_PHY_REQ", phy_req_rsp, 2, true },
  585. { 0x17, "LL_PHY_RSP", phy_req_rsp, 2, true },
  586. { 0x18, "LL_PHY_UPDATE_IND", phy_update_ind, 4, true },
  587. { 0x19, "LL_MIN_USED_CHANNELS_IND", min_used_channels, 2, true },
  588. { 0x1a, "LL_CTE_REQ", cte_req, 1, true },
  589. { 0x1b, "LL_CTE_RSP", null_pdu, 0, true },
  590. { 0x1c, "LL_PERIODIC_SYNC_IND", periodic_sync_ind, 34, true },
  591. { 0x1d, "LL_CLOCK_ACCURACY_REQ", clock_acc_req_rsp, 1, true },
  592. { 0x1e, "LL_CLOCK_ACCURACY_RSP", clock_acc_req_rsp, 1, true },
  593. { BT_LL_CIS_REQ, "LL_CIS_REQ", cis_req,
  594. sizeof(struct bt_ll_cis_req), true },
  595. { BT_LL_CIS_RSP, "LL_CIS_RSP", cis_rsp,
  596. sizeof(struct bt_ll_cis_rsp), true },
  597. { BT_LL_CIS_IND, "LL_CIS_IND", cis_ind,
  598. sizeof(struct bt_ll_cis_ind), true },
  599. { BT_LL_CIS_TERMINATE_IND, "LL_CIS_TERMINATE_IND", cis_term_ind,
  600. sizeof(struct bt_ll_cis_term_ind),
  601. true },
  602. { }
  603. };
  604. static const char *opcode_to_string(uint8_t opcode)
  605. {
  606. int i;
  607. for (i = 0; llcp_table[i].str; i++) {
  608. if (llcp_table[i].opcode == opcode)
  609. return llcp_table[i].str;
  610. }
  611. return "Unknown";
  612. }
  613. void llcp_packet(const void *data, uint8_t size, bool padded)
  614. {
  615. uint8_t opcode = ((const uint8_t *) data)[0];
  616. const struct llcp_data *llcp_data = NULL;
  617. const char *opcode_color, *opcode_str;
  618. int i;
  619. for (i = 0; llcp_table[i].str; i++) {
  620. if (llcp_table[i].opcode == opcode) {
  621. llcp_data = &llcp_table[i];
  622. break;
  623. }
  624. }
  625. if (llcp_data) {
  626. if (llcp_data->func)
  627. opcode_color = COLOR_OPCODE;
  628. else
  629. opcode_color = COLOR_OPCODE_UNKNOWN;
  630. opcode_str = llcp_data->str;
  631. } else {
  632. opcode_color = COLOR_OPCODE_UNKNOWN;
  633. opcode_str = "Unknown";
  634. }
  635. print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,
  636. " (0x%2.2x)", opcode);
  637. if (!llcp_data || !llcp_data->func) {
  638. packet_hexdump(data + 1, size - 1);
  639. return;
  640. }
  641. if (llcp_data->fixed && !padded) {
  642. if (size - 1 != llcp_data->size) {
  643. print_text(COLOR_ERROR, "invalid packet size");
  644. packet_hexdump(data + 1, size - 1);
  645. return;
  646. }
  647. } else {
  648. if (size - 1 < llcp_data->size) {
  649. print_text(COLOR_ERROR, "too short packet");
  650. packet_hexdump(data + 1, size - 1);
  651. return;
  652. }
  653. }
  654. llcp_data->func(data + 1, size - 1);
  655. }