lmp.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. *
  4. * BlueZ - Bluetooth protocol stack for Linux
  5. *
  6. * Copyright (C) 2004-2011 Marcel Holtmann <marcel@holtmann.org>
  7. *
  8. *
  9. */
  10. #ifdef HAVE_CONFIG_H
  11. #include <config.h>
  12. #endif
  13. #define _GNU_SOURCE
  14. #include <stdio.h>
  15. #include <errno.h>
  16. #include <ctype.h>
  17. #include <sys/socket.h>
  18. #include "parser.h"
  19. #include "lib/hci.h"
  20. #include "lib/hci_lib.h"
  21. #define LMP_U8(frm) (p_get_u8(frm))
  22. #define LMP_U16(frm) (btohs(htons(p_get_u16(frm))))
  23. #define LMP_U32(frm) (btohl(htonl(p_get_u32(frm))))
  24. static enum {
  25. IN_RAND,
  26. COMB_KEY_C,
  27. COMB_KEY_P,
  28. AU_RAND_C,
  29. AU_RAND_P,
  30. SRES_C,
  31. SRES_P,
  32. } pairing_state = IN_RAND;
  33. static struct {
  34. uint8_t in_rand[16];
  35. uint8_t comb_key_c[16];
  36. uint8_t comb_key_p[16];
  37. uint8_t au_rand_c[16];
  38. uint8_t au_rand_p[16];
  39. uint8_t sres_c[4];
  40. uint8_t sres_p[4];
  41. } pairing_data;
  42. static inline void pairing_data_dump(void)
  43. {
  44. int i;
  45. p_indent(6, NULL);
  46. printf("IN_RAND ");
  47. for (i = 0; i < 16; i++)
  48. printf("%2.2x", pairing_data.in_rand[i]);
  49. printf("\n");
  50. p_indent(6, NULL);
  51. printf("COMB_KEY ");
  52. for (i = 0; i < 16; i++)
  53. printf("%2.2x", pairing_data.comb_key_c[i]);
  54. printf(" (M)\n");
  55. p_indent(6, NULL);
  56. printf("COMB_KEY ");
  57. for (i = 0; i < 16; i++)
  58. printf("%2.2x", pairing_data.comb_key_p[i]);
  59. printf(" (S)\n");
  60. p_indent(6, NULL);
  61. printf("AU_RAND ");
  62. for (i = 0; i < 16; i++)
  63. printf("%2.2x", pairing_data.au_rand_c[i]);
  64. printf(" SRES ");
  65. for (i = 0; i < 4; i++)
  66. printf("%2.2x", pairing_data.sres_c[i]);
  67. printf(" (M)\n");
  68. p_indent(6, NULL);
  69. printf("AU_RAND ");
  70. for (i = 0; i < 16; i++)
  71. printf("%2.2x", pairing_data.au_rand_p[i]);
  72. printf(" SRES ");
  73. for (i = 0; i < 4; i++)
  74. printf("%2.2x", pairing_data.sres_p[i]);
  75. printf(" (S)\n");
  76. }
  77. static inline void in_rand(struct frame *frm)
  78. {
  79. uint8_t *val = frm->ptr;
  80. memcpy(pairing_data.in_rand, val, 16);
  81. pairing_state = COMB_KEY_C;
  82. }
  83. static inline void comb_key(struct frame *frm)
  84. {
  85. uint8_t *val = frm->ptr;
  86. switch (pairing_state) {
  87. case COMB_KEY_C:
  88. memcpy(pairing_data.comb_key_c, val, 16);
  89. pairing_state = COMB_KEY_P;
  90. break;
  91. case COMB_KEY_P:
  92. memcpy(pairing_data.comb_key_p, val, 16);
  93. pairing_state = AU_RAND_C;
  94. break;
  95. case IN_RAND:
  96. case AU_RAND_C:
  97. case AU_RAND_P:
  98. case SRES_C:
  99. case SRES_P:
  100. default:
  101. pairing_state = IN_RAND;
  102. break;
  103. }
  104. }
  105. static inline void au_rand(struct frame *frm)
  106. {
  107. uint8_t *val = frm->ptr;
  108. switch (pairing_state) {
  109. case AU_RAND_C:
  110. memcpy(pairing_data.au_rand_c, val, 16);
  111. pairing_state = SRES_C;
  112. break;
  113. case AU_RAND_P:
  114. memcpy(pairing_data.au_rand_p, val, 16);
  115. pairing_state = SRES_P;
  116. break;
  117. case COMB_KEY_C:
  118. case COMB_KEY_P:
  119. case IN_RAND:
  120. case SRES_C:
  121. case SRES_P:
  122. default:
  123. pairing_state = IN_RAND;
  124. break;
  125. }
  126. }
  127. static inline void sres(struct frame *frm)
  128. {
  129. uint8_t *val = frm->ptr;
  130. switch (pairing_state) {
  131. case SRES_C:
  132. memcpy(pairing_data.sres_c, val, 4);
  133. pairing_state = AU_RAND_P;
  134. break;
  135. case SRES_P:
  136. memcpy(pairing_data.sres_p, val, 4);
  137. pairing_state = IN_RAND;
  138. pairing_data_dump();
  139. break;
  140. case COMB_KEY_C:
  141. case COMB_KEY_P:
  142. case IN_RAND:
  143. case AU_RAND_C:
  144. case AU_RAND_P:
  145. default:
  146. pairing_state = IN_RAND;
  147. break;
  148. }
  149. }
  150. static char *opcode2str(uint16_t opcode)
  151. {
  152. switch (opcode) {
  153. case 1:
  154. return "name_req";
  155. case 2:
  156. return "name_res";
  157. case 3:
  158. return "accepted";
  159. case 4:
  160. return "not_accepted";
  161. case 5:
  162. return "clkoffset_req";
  163. case 6:
  164. return "clkoffset_res";
  165. case 7:
  166. return "detach";
  167. case 8:
  168. return "in_rand";
  169. case 9:
  170. return "comb_key";
  171. case 10:
  172. return "unit_key";
  173. case 11:
  174. return "au_rand";
  175. case 12:
  176. return "sres";
  177. case 13:
  178. return "temp_rand";
  179. case 14:
  180. return "temp_key";
  181. case 15:
  182. return "encryption_mode_req";
  183. case 16:
  184. return "encryption_key_size_req";
  185. case 17:
  186. return "start_encryption_req";
  187. case 18:
  188. return "stop_encryption_req";
  189. case 19:
  190. return "switch_req";
  191. case 20:
  192. return "hold";
  193. case 21:
  194. return "hold_req";
  195. case 22:
  196. return "sniff";
  197. case 23:
  198. return "sniff_req";
  199. case 24:
  200. return "unsniff_req";
  201. case 25:
  202. return "park_req";
  203. case 26:
  204. return "park";
  205. case 27:
  206. return "set_broadcast_scan_window";
  207. case 28:
  208. return "modify_beacon";
  209. case 29:
  210. return "unpark_BD_ADDR_req";
  211. case 30:
  212. return "unpark_PM_ADDR_req";
  213. case 31:
  214. return "incr_power_req";
  215. case 32:
  216. return "decr_power_req";
  217. case 33:
  218. return "max_power";
  219. case 34:
  220. return "min_power";
  221. case 35:
  222. return "auto_rate";
  223. case 36:
  224. return "preferred_rate";
  225. case 37:
  226. return "version_req";
  227. case 38:
  228. return "version_res";
  229. case 39:
  230. return "feature_req";
  231. case 40:
  232. return "feature_res";
  233. case 41:
  234. return "quality_of_service";
  235. case 42:
  236. return "quality_of_service_req";
  237. case 43:
  238. return "SCO_link_req";
  239. case 44:
  240. return "remove_SCO_link_req";
  241. case 45:
  242. return "max_slot";
  243. case 46:
  244. return "max_slot_req";
  245. case 47:
  246. return "timing_accuracy_req";
  247. case 48:
  248. return "timing_accuracy_res";
  249. case 49:
  250. return "setup_complete";
  251. case 50:
  252. return "use_semi_permanent_key";
  253. case 51:
  254. return "host_connection_req";
  255. case 52:
  256. return "slot_offset";
  257. case 53:
  258. return "page_mode_req";
  259. case 54:
  260. return "page_scan_mode_req";
  261. case 55:
  262. return "supervision_timeout";
  263. case 56:
  264. return "test_activate";
  265. case 57:
  266. return "test_control";
  267. case 58:
  268. return "encryption_key_size_mask_req";
  269. case 59:
  270. return "encryption_key_size_mask_res";
  271. case 60:
  272. return "set_AFH";
  273. case 61:
  274. return "encapsulated_header";
  275. case 62:
  276. return "encapsulated_payload";
  277. case 63:
  278. return "simple_pairing_confirm";
  279. case 64:
  280. return "simple_pairing_number";
  281. case 65:
  282. return "DHkey_check";
  283. case 127 + (1 << 7):
  284. return "accepted_ext";
  285. case 127 + (2 << 7):
  286. return "not_accepted_ext";
  287. case 127 + (3 << 7):
  288. return "features_req_ext";
  289. case 127 + (4 << 7):
  290. return "features_res_ext";
  291. case 127 + (11 << 7):
  292. return "packet_type_table_req";
  293. case 127 + (12 << 7):
  294. return "eSCO_link_req";
  295. case 127 + (13 << 7):
  296. return "remove_eSCO_link_req";
  297. case 127 + (16 << 7):
  298. return "channel_classification_req";
  299. case 127 + (17 << 7):
  300. return "channel_classification";
  301. case 127 + (21 << 7):
  302. return "sniff_subrating_req";
  303. case 127 + (22 << 7):
  304. return "sniff_subrating_res";
  305. case 127 + (23 << 7):
  306. return "pause_encryption_req";
  307. case 127 + (24 << 7):
  308. return "resume_encryption_req";
  309. case 127 + (25 << 7):
  310. return "IO_capability_req";
  311. case 127 + (26 << 7):
  312. return "IO_capability_res";
  313. case 127 + (27 << 7):
  314. return "numeric_comparison_failed";
  315. case 127 + (28 << 7):
  316. return "passkey_failed";
  317. case 127 + (29 << 7):
  318. return "oob_failed";
  319. case 127 + (30 << 7):
  320. return "keypress_notification";
  321. default:
  322. return "unknown";
  323. }
  324. }
  325. static inline void name_req_dump(int level, struct frame *frm)
  326. {
  327. uint8_t offset = LMP_U8(frm);
  328. p_indent(level, frm);
  329. printf("name offset %d\n", offset);
  330. }
  331. static inline void name_res_dump(int level, struct frame *frm)
  332. {
  333. uint8_t offset = LMP_U8(frm);
  334. uint8_t length = LMP_U8(frm);
  335. uint8_t *name = frm->ptr;
  336. int i, size;
  337. frm->ptr += 14;
  338. frm->len -= 14;
  339. p_indent(level, frm);
  340. printf("name offset %d\n", offset);
  341. p_indent(level, frm);
  342. printf("name length %d\n", length);
  343. size = length - offset;
  344. if (size > 14)
  345. size = 14;
  346. p_indent(level, frm);
  347. printf("name fragment '");
  348. for (i = 0; i < size; i++)
  349. if (isprint(name[i]))
  350. printf("%c", name[i]);
  351. else
  352. printf(".");
  353. printf("'\n");
  354. }
  355. static inline void accepted_dump(int level, struct frame *frm)
  356. {
  357. uint8_t opcode = LMP_U8(frm);
  358. p_indent(level, frm);
  359. printf("op code %d (%s)\n", opcode, opcode2str(opcode));
  360. }
  361. static inline void not_accepted_dump(int level, struct frame *frm)
  362. {
  363. uint8_t opcode = LMP_U8(frm);
  364. uint8_t error = LMP_U8(frm);
  365. p_indent(level, frm);
  366. printf("op code %d (%s)\n", opcode, opcode2str(opcode));
  367. p_indent(level, frm);
  368. printf("error code 0x%2.2x\n", error);
  369. }
  370. static inline void clkoffset_dump(int level, struct frame *frm)
  371. {
  372. uint16_t clkoffset = LMP_U16(frm);
  373. p_indent(level, frm);
  374. printf("clock offset 0x%4.4x\n", clkoffset);
  375. }
  376. static inline void detach_dump(int level, struct frame *frm)
  377. {
  378. uint8_t error = LMP_U8(frm);
  379. p_indent(level, frm);
  380. printf("error code 0x%2.2x\n", error);
  381. }
  382. static inline void random_number_dump(int level, struct frame *frm)
  383. {
  384. uint8_t *number = frm->ptr;
  385. int i;
  386. frm->ptr += 16;
  387. frm->len -= 16;
  388. p_indent(level, frm);
  389. printf("random number ");
  390. for (i = 0; i < 16; i++)
  391. printf("%2.2x", number[i]);
  392. printf("\n");
  393. }
  394. static inline void key_dump(int level, struct frame *frm)
  395. {
  396. uint8_t *key = frm->ptr;
  397. int i;
  398. frm->ptr += 16;
  399. frm->len -= 16;
  400. p_indent(level, frm);
  401. printf("key ");
  402. for (i = 0; i < 16; i++)
  403. printf("%2.2x", key[i]);
  404. printf("\n");
  405. }
  406. static inline void auth_resp_dump(int level, struct frame *frm)
  407. {
  408. uint8_t *resp = frm->ptr;
  409. int i;
  410. frm->ptr += 4;
  411. frm->ptr -= 4;
  412. p_indent(level, frm);
  413. printf("authentication response ");
  414. for (i = 0; i < 4; i++)
  415. printf("%2.2x", resp[i]);
  416. printf("\n");
  417. }
  418. static inline void encryption_mode_req_dump(int level, struct frame *frm)
  419. {
  420. uint8_t mode = LMP_U8(frm);
  421. p_indent(level, frm);
  422. printf("encryption mode %d\n", mode);
  423. }
  424. static inline void encryption_key_size_req_dump(int level, struct frame *frm)
  425. {
  426. uint8_t keysize = LMP_U8(frm);
  427. p_indent(level, frm);
  428. printf("key size %d\n", keysize);
  429. }
  430. static inline void switch_req_dump(int level, struct frame *frm)
  431. {
  432. uint32_t instant = LMP_U32(frm);
  433. p_indent(level, frm);
  434. printf("switch instant 0x%4.4x\n", instant);
  435. }
  436. static inline void hold_dump(int level, struct frame *frm)
  437. {
  438. uint16_t time = LMP_U16(frm);
  439. uint32_t instant = LMP_U32(frm);
  440. p_indent(level, frm);
  441. printf("hold time 0x%4.4x\n", time);
  442. p_indent(level, frm);
  443. printf("hold instant 0x%4.4x\n", instant);
  444. }
  445. static inline void sniff_req_dump(int level, struct frame *frm)
  446. {
  447. uint8_t timing = LMP_U8(frm);
  448. uint16_t dsniff = LMP_U16(frm);
  449. uint16_t tsniff = LMP_U16(frm);
  450. uint16_t attempt = LMP_U16(frm);
  451. uint16_t timeout = LMP_U16(frm);
  452. p_indent(level, frm);
  453. printf("timing control flags 0x%2.2x\n", timing);
  454. p_indent(level, frm);
  455. printf("D_sniff %d T_sniff %d\n", dsniff, tsniff);
  456. p_indent(level, frm);
  457. printf("sniff attempt %d\n", attempt);
  458. p_indent(level, frm);
  459. printf("sniff timeout %d\n", timeout);
  460. }
  461. static inline void park_req_dump(int level, struct frame *frm)
  462. {
  463. uint8_t timing = LMP_U8(frm);
  464. uint16_t db = LMP_U16(frm);
  465. uint16_t tb = LMP_U16(frm);
  466. uint8_t nb = LMP_U8(frm);
  467. uint8_t xb = LMP_U8(frm);
  468. uint8_t pmaddr = LMP_U8(frm);
  469. uint8_t araddr = LMP_U8(frm);
  470. uint8_t nbsleep = LMP_U8(frm);
  471. uint8_t dbsleep = LMP_U8(frm);
  472. uint8_t daccess = LMP_U8(frm);
  473. uint8_t taccess = LMP_U8(frm);
  474. uint8_t nslots = LMP_U8(frm);
  475. uint8_t npoll = LMP_U8(frm);
  476. uint8_t access = LMP_U8(frm);
  477. p_indent(level, frm);
  478. printf("timing control flags 0x%2.2x\n", timing);
  479. p_indent(level, frm);
  480. printf("D_B %d T_B %d N_B %d X_B %d\n", db, tb, nb, xb);
  481. p_indent(level, frm);
  482. printf("PM_ADDR %d AR_ADDR %d\n", pmaddr, araddr);
  483. p_indent(level, frm);
  484. printf("N_Bsleep %d D_Bsleep %d\n", nbsleep, dbsleep);
  485. p_indent(level, frm);
  486. printf("D_access %d T_access %d\n", daccess, taccess);
  487. p_indent(level, frm);
  488. printf("N_acc-slots %d N_poll %d\n", nslots, npoll);
  489. p_indent(level, frm);
  490. printf("M_access %d\n", access & 0x0f);
  491. p_indent(level, frm);
  492. printf("access scheme 0x%2.2x\n", access >> 4);
  493. }
  494. static inline void modify_beacon_dump(int level, struct frame *frm)
  495. {
  496. uint8_t timing = LMP_U8(frm);
  497. uint16_t db = LMP_U16(frm);
  498. uint16_t tb = LMP_U16(frm);
  499. uint8_t nb = LMP_U8(frm);
  500. uint8_t xb = LMP_U8(frm);
  501. uint8_t daccess = LMP_U8(frm);
  502. uint8_t taccess = LMP_U8(frm);
  503. uint8_t nslots = LMP_U8(frm);
  504. uint8_t npoll = LMP_U8(frm);
  505. uint8_t access = LMP_U8(frm);
  506. p_indent(level, frm);
  507. printf("timing control flags 0x%2.2x\n", timing);
  508. p_indent(level, frm);
  509. printf("D_B %d T_B %d N_B %d X_B %d\n", db, tb, nb, xb);
  510. p_indent(level, frm);
  511. printf("D_access %d T_access %d\n", daccess, taccess);
  512. p_indent(level, frm);
  513. printf("N_acc-slots %d N_poll %d\n", nslots, npoll);
  514. p_indent(level, frm);
  515. printf("M_access %d\n", access & 0x0f);
  516. p_indent(level, frm);
  517. printf("access scheme 0x%2.2x\n", access >> 4);
  518. }
  519. static inline void power_req_dump(int level, struct frame *frm)
  520. {
  521. uint8_t val = LMP_U8(frm);
  522. p_indent(level, frm);
  523. printf("future use 0x%2.2x\n", val);
  524. }
  525. static inline void preferred_rate_dump(int level, struct frame *frm)
  526. {
  527. uint8_t rate = LMP_U8(frm);
  528. p_indent(level, frm);
  529. printf("data rate 0x%2.2x\n", rate);
  530. p_indent(level, frm);
  531. printf("Basic: ");
  532. printf("%suse FEC, ", rate & 0x01 ? "do not " : "");
  533. switch ((rate >> 1) & 0x03) {
  534. case 0x00:
  535. printf("no packet-size preference\n");
  536. break;
  537. case 0x01:
  538. printf("use 1-slot packets\n");
  539. break;
  540. case 0x02:
  541. printf("use 3-slot packets\n");
  542. break;
  543. case 0x03:
  544. printf("use 5-slot packets\n");
  545. break;
  546. }
  547. p_indent(level, frm);
  548. printf("EDR: ");
  549. switch ((rate >> 3) & 0x03) {
  550. case 0x00:
  551. printf("use DM1 packets, ");
  552. break;
  553. case 0x01:
  554. printf("use 2 Mbps packets, ");
  555. break;
  556. case 0x02:
  557. printf("use 3 Mbps packets, ");
  558. break;
  559. case 0x03:
  560. printf("reserved, \n");
  561. break;
  562. }
  563. switch ((rate >> 5) & 0x03) {
  564. case 0x00:
  565. printf("no packet-size preference\n");
  566. break;
  567. case 0x01:
  568. printf("use 1-slot packets\n");
  569. break;
  570. case 0x02:
  571. printf("use 3-slot packets\n");
  572. break;
  573. case 0x03:
  574. printf("use 5-slot packets\n");
  575. break;
  576. }
  577. }
  578. static inline void version_dump(int level, struct frame *frm)
  579. {
  580. uint8_t ver = LMP_U8(frm);
  581. uint16_t compid = LMP_U16(frm);
  582. uint16_t subver = LMP_U16(frm);
  583. char *tmp;
  584. p_indent(level, frm);
  585. tmp = lmp_vertostr(ver);
  586. printf("VersNr %d (%s)\n", ver, tmp);
  587. bt_free(tmp);
  588. p_indent(level, frm);
  589. printf("CompId %d (%s)\n", compid, bt_compidtostr(compid));
  590. p_indent(level, frm);
  591. printf("SubVersNr %d\n", subver);
  592. }
  593. static inline void features_dump(int level, struct frame *frm)
  594. {
  595. uint8_t *features = frm->ptr;
  596. int i;
  597. frm->ptr += 8;
  598. frm->len -= 8;
  599. p_indent(level, frm);
  600. printf("features");
  601. for (i = 0; i < 8; i++)
  602. printf(" 0x%2.2x", features[i]);
  603. printf("\n");
  604. }
  605. static inline void set_afh_dump(int level, struct frame *frm)
  606. {
  607. uint32_t instant = LMP_U32(frm);
  608. uint8_t mode = LMP_U8(frm);
  609. uint8_t *map = frm->ptr;
  610. int i;
  611. frm->ptr += 10;
  612. frm->len -= 10;
  613. p_indent(level, frm);
  614. printf("AFH_instant 0x%04x\n", instant);
  615. p_indent(level, frm);
  616. printf("AFH_mode %d\n", mode);
  617. p_indent(level, frm);
  618. printf("AFH_channel_map 0x");
  619. for (i = 0; i < 10; i++)
  620. printf("%2.2x", map[i]);
  621. printf("\n");
  622. }
  623. static inline void encapsulated_header_dump(int level, struct frame *frm)
  624. {
  625. uint8_t major = LMP_U8(frm);
  626. uint8_t minor = LMP_U8(frm);
  627. uint8_t length = LMP_U8(frm);
  628. p_indent(level, frm);
  629. printf("major type %d minor type %d payload length %d\n",
  630. major, minor, length);
  631. if (major == 1 && minor == 1) {
  632. p_indent(level, frm);
  633. printf("P-192 Public Key\n");
  634. }
  635. }
  636. static inline void encapsulated_payload_dump(int level, struct frame *frm)
  637. {
  638. uint8_t *value = frm->ptr;
  639. int i;
  640. frm->ptr += 16;
  641. frm->len -= 16;
  642. p_indent(level, frm);
  643. printf("data ");
  644. for (i = 0; i < 16; i++)
  645. printf("%2.2x", value[i]);
  646. printf("\n");
  647. }
  648. static inline void simple_pairing_confirm_dump(int level, struct frame *frm)
  649. {
  650. uint8_t *value = frm->ptr;
  651. int i;
  652. frm->ptr += 16;
  653. frm->len -= 16;
  654. p_indent(level, frm);
  655. printf("commitment value ");
  656. for (i = 0; i < 16; i++)
  657. printf("%2.2x", value[i]);
  658. printf("\n");
  659. }
  660. static inline void simple_pairing_number_dump(int level, struct frame *frm)
  661. {
  662. uint8_t *value = frm->ptr;
  663. int i;
  664. frm->ptr += 16;
  665. frm->len -= 16;
  666. p_indent(level, frm);
  667. printf("nounce value ");
  668. for (i = 0; i < 16; i++)
  669. printf("%2.2x", value[i]);
  670. printf("\n");
  671. }
  672. static inline void dhkey_check_dump(int level, struct frame *frm)
  673. {
  674. uint8_t *value = frm->ptr;
  675. int i;
  676. frm->ptr += 16;
  677. frm->len -= 16;
  678. p_indent(level, frm);
  679. printf("confirmation value ");
  680. for (i = 0; i < 16; i++)
  681. printf("%2.2x", value[i]);
  682. printf("\n");
  683. }
  684. static inline void accepted_ext_dump(int level, struct frame *frm)
  685. {
  686. uint16_t opcode = LMP_U8(frm) + (LMP_U8(frm) << 7);
  687. p_indent(level, frm);
  688. printf("op code %d/%d (%s)\n", opcode & 0x7f, opcode >> 7, opcode2str(opcode));
  689. }
  690. static inline void not_accepted_ext_dump(int level, struct frame *frm)
  691. {
  692. uint16_t opcode = LMP_U8(frm) + (LMP_U8(frm) << 7);
  693. uint8_t error = LMP_U8(frm);
  694. p_indent(level, frm);
  695. printf("op code %d/%d (%s)\n", opcode & 0x7f, opcode >> 7, opcode2str(opcode));
  696. p_indent(level, frm);
  697. printf("error code 0x%2.2x\n", error);
  698. }
  699. static inline void features_ext_dump(int level, struct frame *frm)
  700. {
  701. uint8_t page = LMP_U8(frm);
  702. uint8_t max = LMP_U8(frm);
  703. uint8_t *features = frm->ptr;
  704. int i;
  705. frm->ptr += 8;
  706. frm->len -= 8;
  707. p_indent(level, frm);
  708. printf("features page %d\n", page);
  709. p_indent(level, frm);
  710. printf("max supported page %d\n", max);
  711. p_indent(level, frm);
  712. printf("extended features");
  713. for (i = 0; i < 8; i++)
  714. printf(" 0x%2.2x", features[i]);
  715. printf("\n");
  716. }
  717. static inline void quality_of_service_dump(int level, struct frame *frm)
  718. {
  719. uint16_t interval = LMP_U16(frm);
  720. uint8_t nbc = LMP_U8(frm);
  721. p_indent(level, frm);
  722. printf("poll interval %d\n", interval);
  723. p_indent(level, frm);
  724. printf("N_BC %d\n", nbc);
  725. }
  726. static inline void sco_link_req_dump(int level, struct frame *frm)
  727. {
  728. uint8_t handle = LMP_U8(frm);
  729. uint8_t timing = LMP_U8(frm);
  730. uint8_t dsco = LMP_U8(frm);
  731. uint8_t tsco = LMP_U8(frm);
  732. uint8_t packet = LMP_U8(frm);
  733. uint8_t airmode = LMP_U8(frm);
  734. p_indent(level, frm);
  735. printf("SCO handle %d\n", handle);
  736. p_indent(level, frm);
  737. printf("timing control flags 0x%2.2x\n", timing);
  738. p_indent(level, frm);
  739. printf("D_SCO %d T_SCO %d\n", dsco, tsco);
  740. p_indent(level, frm);
  741. printf("SCO packet 0x%2.2x\n", packet);
  742. p_indent(level, frm);
  743. printf("air mode 0x%2.2x\n", airmode);
  744. }
  745. static inline void remove_sco_link_req_dump(int level, struct frame *frm)
  746. {
  747. uint8_t handle = LMP_U8(frm);
  748. uint8_t error = LMP_U8(frm);
  749. p_indent(level, frm);
  750. printf("SCO handle %d\n", handle);
  751. p_indent(level, frm);
  752. printf("error code 0x%2.2x\n", error);
  753. }
  754. static inline void max_slots_dump(int level, struct frame *frm)
  755. {
  756. uint8_t slots = LMP_U8(frm);
  757. p_indent(level, frm);
  758. printf("max slots %d\n", slots);
  759. }
  760. static inline void timing_accuracy_dump(int level, struct frame *frm)
  761. {
  762. uint8_t drift = LMP_U8(frm);
  763. uint8_t jitter = LMP_U8(frm);
  764. p_indent(level, frm);
  765. printf("drift %d\n", drift);
  766. p_indent(level, frm);
  767. printf("jitter %d\n", jitter);
  768. }
  769. static inline void slot_offset_dump(int level, struct frame *frm)
  770. {
  771. uint16_t offset = LMP_U16(frm);
  772. char addr[18];
  773. p_ba2str((bdaddr_t *) frm->ptr, addr);
  774. p_indent(level, frm);
  775. printf("slot offset %d\n", offset);
  776. p_indent(level, frm);
  777. printf("BD_ADDR %s\n", addr);
  778. }
  779. static inline void page_mode_dump(int level, struct frame *frm)
  780. {
  781. uint8_t scheme = LMP_U8(frm);
  782. uint8_t settings = LMP_U8(frm);
  783. p_indent(level, frm);
  784. printf("page scheme %d\n", scheme);
  785. p_indent(level, frm);
  786. printf("page scheme settings %d\n", settings);
  787. }
  788. static inline void supervision_timeout_dump(int level, struct frame *frm)
  789. {
  790. uint16_t timeout = LMP_U16(frm);
  791. p_indent(level, frm);
  792. printf("supervision timeout %d\n", timeout);
  793. }
  794. static inline void test_control_dump(int level, struct frame *frm)
  795. {
  796. uint8_t scenario = LMP_U8(frm);
  797. uint8_t hopping = LMP_U8(frm);
  798. uint8_t txfreq = LMP_U8(frm);
  799. uint8_t rxfreq = LMP_U8(frm);
  800. uint8_t power = LMP_U8(frm);
  801. uint8_t poll = LMP_U8(frm);
  802. uint8_t packet = LMP_U8(frm);
  803. uint16_t length = LMP_U16(frm);
  804. p_indent(level, frm);
  805. printf("test scenario %d\n", scenario);
  806. p_indent(level, frm);
  807. printf("hopping mode %d\n", hopping);
  808. p_indent(level, frm);
  809. printf("TX frequency %d\n", txfreq);
  810. p_indent(level, frm);
  811. printf("RX frequency %d\n", rxfreq);
  812. p_indent(level, frm);
  813. printf("power control mode %d\n", power);
  814. p_indent(level, frm);
  815. printf("poll period %d\n", poll);
  816. p_indent(level, frm);
  817. printf("poll period %d\n", poll);
  818. p_indent(level, frm);
  819. printf("packet type 0x%2.2x\n", packet);
  820. p_indent(level, frm);
  821. printf("length of test data %d\n", length);
  822. }
  823. static inline void encryption_key_size_mask_res_dump(int level, struct frame *frm)
  824. {
  825. uint16_t mask = LMP_U16(frm);
  826. p_indent(level, frm);
  827. printf("key size mask 0x%4.4x\n", mask);
  828. }
  829. static inline void packet_type_table_dump(int level, struct frame *frm)
  830. {
  831. uint8_t type = LMP_U8(frm);
  832. p_indent(level, frm);
  833. printf("packet type table %d ", type);
  834. switch (type) {
  835. case 0:
  836. printf("(1Mbps only)\n");
  837. break;
  838. case 1:
  839. printf("(2/3Mbps)\n");
  840. break;
  841. default:
  842. printf("(Reserved)\n");
  843. break;
  844. }
  845. }
  846. static inline void esco_link_req_dump(int level, struct frame *frm)
  847. {
  848. uint8_t handle = LMP_U8(frm);
  849. uint8_t ltaddr = LMP_U8(frm);
  850. uint8_t timing = LMP_U8(frm);
  851. uint8_t desco = LMP_U8(frm);
  852. uint8_t tesco = LMP_U8(frm);
  853. uint8_t wesco = LMP_U8(frm);
  854. uint8_t cppkt = LMP_U8(frm);
  855. uint8_t pcpkt = LMP_U8(frm);
  856. uint16_t cplen = LMP_U16(frm);
  857. uint16_t pclen = LMP_U16(frm);
  858. uint8_t airmode = LMP_U8(frm);
  859. uint8_t negstate = LMP_U8(frm);
  860. p_indent(level, frm);
  861. printf("eSCO handle %d\n", handle);
  862. p_indent(level, frm);
  863. printf("eSCO LT_ADDR %d\n", ltaddr);
  864. p_indent(level, frm);
  865. printf("timing control flags 0x%2.2x\n", timing);
  866. p_indent(level, frm);
  867. printf("D_eSCO %d T_eSCO %d W_eSCO %d\n", desco, tesco, wesco);
  868. p_indent(level, frm);
  869. printf("eSCO C->P packet type 0x%2.2x length %d\n", cppkt, cplen);
  870. p_indent(level, frm);
  871. printf("eSCO P->C packet type 0x%2.2x length %d\n", pcpkt, pclen);
  872. p_indent(level, frm);
  873. printf("air mode 0x%2.2x\n", airmode);
  874. p_indent(level, frm);
  875. printf("negotiation state 0x%2.2x\n", negstate);
  876. }
  877. static inline void remove_esco_link_req_dump(int level, struct frame *frm)
  878. {
  879. uint8_t handle = LMP_U8(frm);
  880. uint8_t error = LMP_U8(frm);
  881. p_indent(level, frm);
  882. printf("eSCO handle %d\n", handle);
  883. p_indent(level, frm);
  884. printf("error code 0x%2.2x\n", error);
  885. }
  886. static inline void channel_classification_req_dump(int level, struct frame *frm)
  887. {
  888. uint8_t mode = LMP_U8(frm);
  889. uint16_t min = LMP_U16(frm);
  890. uint16_t max = LMP_U16(frm);
  891. p_indent(level, frm);
  892. printf("AFH reporting mode %d\n", mode);
  893. p_indent(level, frm);
  894. printf("AFH min interval 0x%4.4x\n", min);
  895. p_indent(level, frm);
  896. printf("AFH max interval 0x%4.4x\n", max);
  897. }
  898. static inline void channel_classification_dump(int level, struct frame *frm)
  899. {
  900. uint8_t *map = frm->ptr;
  901. int i;
  902. frm->ptr += 10;
  903. frm->len -= 10;
  904. p_indent(level, frm);
  905. printf("AFH channel classification 0x");
  906. for (i = 0; i < 10; i++)
  907. printf("%2.2x", map[i]);
  908. printf("\n");
  909. }
  910. static inline void sniff_subrating_dump(int level, struct frame *frm)
  911. {
  912. uint8_t subrate = LMP_U8(frm);
  913. uint16_t timeout = LMP_U16(frm);
  914. uint32_t instant = LMP_U32(frm);
  915. p_indent(level, frm);
  916. printf("max subrate %d\n", subrate);
  917. p_indent(level, frm);
  918. printf("min sniff timeout %d\n", timeout);
  919. p_indent(level, frm);
  920. printf("subrate instant 0x%4.4x\n", instant);
  921. }
  922. static inline void io_capability_dump(int level, struct frame *frm)
  923. {
  924. uint8_t capability = LMP_U8(frm);
  925. uint8_t oob_data = LMP_U8(frm);
  926. uint8_t authentication = LMP_U8(frm);
  927. p_indent(level, frm);
  928. printf("capability 0x%2.2x oob 0x%2.2x auth 0x%2.2x\n",
  929. capability, oob_data, authentication);
  930. }
  931. static inline void keypress_notification_dump(int level, struct frame *frm)
  932. {
  933. uint8_t value = LMP_U8(frm);
  934. p_indent(level, frm);
  935. printf("notification value %d\n", value);
  936. }
  937. void lmp_dump(int level, struct frame *frm)
  938. {
  939. uint8_t tmp, tid;
  940. uint16_t opcode;
  941. p_indent(level, frm);
  942. tmp = LMP_U8(frm);
  943. tid = tmp & 0x01;
  944. opcode = (tmp & 0xfe) >> 1;
  945. if (opcode > 123) {
  946. tmp = LMP_U8(frm);
  947. opcode += tmp << 7;
  948. }
  949. printf("LMP(%c): %s(%c): ", frm->central ? 's' : 'r',
  950. opcode2str(opcode), tid ? 'p' : 'c');
  951. if (opcode > 123)
  952. printf("op code %d/%d", opcode & 0x7f, opcode >> 7);
  953. else
  954. printf("op code %d", opcode);
  955. if (frm->handle > 17)
  956. printf(" handle %d\n", frm->handle);
  957. else
  958. printf("\n");
  959. if (!(parser.flags & DUMP_VERBOSE)) {
  960. raw_dump(level, frm);
  961. return;
  962. }
  963. switch (opcode) {
  964. case 1:
  965. name_req_dump(level + 1, frm);
  966. return;
  967. case 2:
  968. name_res_dump(level + 1, frm);
  969. return;
  970. case 3:
  971. accepted_dump(level + 1, frm);
  972. return;
  973. case 4:
  974. not_accepted_dump(level + 1, frm);
  975. return;
  976. case 6:
  977. clkoffset_dump(level + 1, frm);
  978. return;
  979. case 7:
  980. detach_dump(level + 1, frm);
  981. return;
  982. case 8:
  983. in_rand(frm);
  984. random_number_dump(level + 1, frm);
  985. return;
  986. case 9:
  987. comb_key(frm);
  988. random_number_dump(level + 1, frm);
  989. return;
  990. case 11:
  991. au_rand(frm);
  992. random_number_dump(level + 1, frm);
  993. return;
  994. case 12:
  995. sres(frm);
  996. auth_resp_dump(level + 1, frm);
  997. return;
  998. case 13:
  999. case 17:
  1000. random_number_dump(level + 1, frm);
  1001. return;
  1002. case 10:
  1003. case 14:
  1004. key_dump(level + 1, frm);
  1005. return;
  1006. case 15:
  1007. encryption_mode_req_dump(level + 1, frm);
  1008. return;
  1009. case 16:
  1010. encryption_key_size_req_dump(level + 1, frm);
  1011. return;
  1012. case 19:
  1013. switch_req_dump(level + 1, frm);
  1014. return;
  1015. case 20:
  1016. case 21:
  1017. hold_dump(level + 1, frm);
  1018. return;
  1019. case 23:
  1020. sniff_req_dump(level + 1, frm);
  1021. return;
  1022. case 25:
  1023. park_req_dump(level + 1, frm);
  1024. return;
  1025. case 28:
  1026. modify_beacon_dump(level + 1, frm);
  1027. return;
  1028. case 31:
  1029. case 32:
  1030. power_req_dump(level + 1, frm);
  1031. return;
  1032. case 36:
  1033. preferred_rate_dump(level + 1, frm);
  1034. return;
  1035. case 37:
  1036. case 38:
  1037. version_dump(level + 1, frm);
  1038. return;
  1039. case 39:
  1040. case 40:
  1041. features_dump(level + 1, frm);
  1042. return;
  1043. case 41:
  1044. case 42:
  1045. quality_of_service_dump(level + 1, frm);
  1046. return;
  1047. case 43:
  1048. sco_link_req_dump(level + 1, frm);
  1049. return;
  1050. case 44:
  1051. remove_sco_link_req_dump(level + 1, frm);
  1052. return;
  1053. case 45:
  1054. case 46:
  1055. max_slots_dump(level + 1, frm);
  1056. return;
  1057. case 48:
  1058. timing_accuracy_dump(level + 1, frm);
  1059. return;
  1060. case 52:
  1061. slot_offset_dump(level + 1, frm);
  1062. return;
  1063. case 53:
  1064. case 54:
  1065. page_mode_dump(level + 1, frm);
  1066. return;
  1067. case 55:
  1068. supervision_timeout_dump(level + 1, frm);
  1069. return;
  1070. case 57:
  1071. test_control_dump(level + 1, frm);
  1072. return;
  1073. case 59:
  1074. encryption_key_size_mask_res_dump(level + 1, frm);
  1075. return;
  1076. case 60:
  1077. set_afh_dump(level + 1, frm);
  1078. return;
  1079. case 61:
  1080. encapsulated_header_dump(level + 1, frm);
  1081. return;
  1082. case 62:
  1083. encapsulated_payload_dump(level + 1, frm);
  1084. return;
  1085. case 63:
  1086. simple_pairing_confirm_dump(level + 1, frm);
  1087. return;
  1088. case 64:
  1089. simple_pairing_number_dump(level + 1, frm);
  1090. return;
  1091. case 65:
  1092. dhkey_check_dump(level + 1, frm);
  1093. return;
  1094. case 5:
  1095. case 18:
  1096. case 24:
  1097. case 33:
  1098. case 34:
  1099. case 35:
  1100. case 47:
  1101. case 49:
  1102. case 50:
  1103. case 51:
  1104. case 56:
  1105. case 58:
  1106. case 127 + (23 << 7):
  1107. case 127 + (24 << 7):
  1108. case 127 + (27 << 7):
  1109. case 127 + (28 << 7):
  1110. case 127 + (29 << 7):
  1111. return;
  1112. case 127 + (1 << 7):
  1113. accepted_ext_dump(level + 1, frm);
  1114. return;
  1115. case 127 + (2 << 7):
  1116. not_accepted_ext_dump(level + 1, frm);
  1117. return;
  1118. case 127 + (3 << 7):
  1119. case 127 + (4 << 7):
  1120. features_ext_dump(level + 1, frm);
  1121. return;
  1122. case 127 + (11 << 7):
  1123. packet_type_table_dump(level + 1, frm);
  1124. return;
  1125. case 127 + (12 << 7):
  1126. esco_link_req_dump(level + 1, frm);
  1127. return;
  1128. case 127 + (13 << 7):
  1129. remove_esco_link_req_dump(level + 1, frm);
  1130. return;
  1131. case 127 + (16 << 7):
  1132. channel_classification_req_dump(level + 1, frm);
  1133. return;
  1134. case 127 + (17 << 7):
  1135. channel_classification_dump(level + 1, frm);
  1136. return;
  1137. case 127 + (21 << 7):
  1138. case 127 + (22 << 7):
  1139. sniff_subrating_dump(level + 1, frm);
  1140. return;
  1141. case 127 + (25 << 7):
  1142. case 127 + (26 << 7):
  1143. io_capability_dump(level + 1, frm);
  1144. return;
  1145. case 127 + (30 << 7):
  1146. keypress_notification_dump(level + 1, frm);
  1147. return;
  1148. }
  1149. raw_dump(level, frm);
  1150. }