3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2004-2011 Marcel Holtmann <marcel@holtmann.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
31 #include <sys/socket.h>
35 #include "lib/hci_lib.h"
37 #define LMP_U8(frm) (p_get_u8(frm))
38 #define LMP_U16(frm) (btohs(htons(p_get_u16(frm))))
39 #define LMP_U32(frm) (btohl(htonl(p_get_u32(frm))))
49 } pairing_state = IN_RAND;
53 uint8_t comb_key_m[16];
54 uint8_t comb_key_s[16];
55 uint8_t au_rand_m[16];
56 uint8_t au_rand_s[16];
61 static inline void pairing_data_dump(void)
67 for (i = 0; i < 16; i++)
68 printf("%2.2x", pairing_data.in_rand[i]);
73 for (i = 0; i < 16; i++)
74 printf("%2.2x", pairing_data.comb_key_m[i]);
79 for (i = 0; i < 16; i++)
80 printf("%2.2x", pairing_data.comb_key_s[i]);
85 for (i = 0; i < 16; i++)
86 printf("%2.2x", pairing_data.au_rand_m[i]);
88 for (i = 0; i < 4; i++)
89 printf("%2.2x", pairing_data.sres_m[i]);
94 for (i = 0; i < 16; i++)
95 printf("%2.2x", pairing_data.au_rand_s[i]);
97 for (i = 0; i < 4; i++)
98 printf("%2.2x", pairing_data.sres_s[i]);
102 static inline void in_rand(struct frame *frm)
104 uint8_t *val = frm->ptr;
106 memcpy(pairing_data.in_rand, val, 16);
107 pairing_state = COMB_KEY_M;
110 static inline void comb_key(struct frame *frm)
112 uint8_t *val = frm->ptr;
114 switch (pairing_state) {
116 memcpy(pairing_data.comb_key_m, val, 16);
117 pairing_state = COMB_KEY_S;
120 memcpy(pairing_data.comb_key_s, val, 16);
121 pairing_state = AU_RAND_M;
129 pairing_state = IN_RAND;
134 static inline void au_rand(struct frame *frm)
136 uint8_t *val = frm->ptr;
138 switch (pairing_state) {
140 memcpy(pairing_data.au_rand_m, val, 16);
141 pairing_state = SRES_M;
144 memcpy(pairing_data.au_rand_s, val, 16);
145 pairing_state = SRES_S;
153 pairing_state = IN_RAND;
158 static inline void sres(struct frame *frm)
160 uint8_t *val = frm->ptr;
162 switch (pairing_state) {
164 memcpy(pairing_data.sres_m, val, 4);
165 pairing_state = AU_RAND_S;
168 memcpy(pairing_data.sres_s, val, 4);
169 pairing_state = IN_RAND;
178 pairing_state = IN_RAND;
183 static char *opcode2str(uint16_t opcode)
193 return "not_accepted";
195 return "clkoffset_req";
197 return "clkoffset_res";
215 return "encryption_mode_req";
217 return "encryption_key_size_req";
219 return "start_encryption_req";
221 return "stop_encryption_req";
233 return "unsniff_req";
239 return "set_broadcast_scan_window";
241 return "modify_beacon";
243 return "unpark_BD_ADDR_req";
245 return "unpark_PM_ADDR_req";
247 return "incr_power_req";
249 return "decr_power_req";
257 return "preferred_rate";
259 return "version_req";
261 return "version_res";
263 return "feature_req";
265 return "feature_res";
267 return "quality_of_service";
269 return "quality_of_service_req";
271 return "SCO_link_req";
273 return "remove_SCO_link_req";
277 return "max_slot_req";
279 return "timing_accuracy_req";
281 return "timing_accuracy_res";
283 return "setup_complete";
285 return "use_semi_permanent_key";
287 return "host_connection_req";
289 return "slot_offset";
291 return "page_mode_req";
293 return "page_scan_mode_req";
295 return "supervision_timeout";
297 return "test_activate";
299 return "test_control";
301 return "encryption_key_size_mask_req";
303 return "encryption_key_size_mask_res";
307 return "encapsulated_header";
309 return "encapsulated_payload";
311 return "simple_pairing_confirm";
313 return "simple_pairing_number";
315 return "DHkey_check";
317 return "accepted_ext";
319 return "not_accepted_ext";
321 return "features_req_ext";
323 return "features_res_ext";
324 case 127 + (11 << 7):
325 return "packet_type_table_req";
326 case 127 + (12 << 7):
327 return "eSCO_link_req";
328 case 127 + (13 << 7):
329 return "remove_eSCO_link_req";
330 case 127 + (16 << 7):
331 return "channel_classification_req";
332 case 127 + (17 << 7):
333 return "channel_classification";
334 case 127 + (21 << 7):
335 return "sniff_subrating_req";
336 case 127 + (22 << 7):
337 return "sniff_subrating_res";
338 case 127 + (23 << 7):
339 return "pause_encryption_req";
340 case 127 + (24 << 7):
341 return "resume_encryption_req";
342 case 127 + (25 << 7):
343 return "IO_capability_req";
344 case 127 + (26 << 7):
345 return "IO_capability_res";
346 case 127 + (27 << 7):
347 return "numeric_comparison_failed";
348 case 127 + (28 << 7):
349 return "passkey_failed";
350 case 127 + (29 << 7):
352 case 127 + (30 << 7):
353 return "keypress_notification";
359 static inline void name_req_dump(int level, struct frame *frm)
361 uint8_t offset = LMP_U8(frm);
363 p_indent(level, frm);
364 printf("name offset %d\n", offset);
367 static inline void name_res_dump(int level, struct frame *frm)
369 uint8_t offset = LMP_U8(frm);
370 uint8_t length = LMP_U8(frm);
371 uint8_t *name = frm->ptr;
377 p_indent(level, frm);
378 printf("name offset %d\n", offset);
380 p_indent(level, frm);
381 printf("name length %d\n", length);
383 size = length - offset;
387 p_indent(level, frm);
388 printf("name fragment '");
389 for (i = 0; i < size; i++)
390 if (isprint(name[i]))
391 printf("%c", name[i]);
397 static inline void accepted_dump(int level, struct frame *frm)
399 uint8_t opcode = LMP_U8(frm);
401 p_indent(level, frm);
402 printf("op code %d (%s)\n", opcode, opcode2str(opcode));
405 static inline void not_accepted_dump(int level, struct frame *frm)
407 uint8_t opcode = LMP_U8(frm);
408 uint8_t error = LMP_U8(frm);
410 p_indent(level, frm);
411 printf("op code %d (%s)\n", opcode, opcode2str(opcode));
413 p_indent(level, frm);
414 printf("error code 0x%2.2x\n", error);
417 static inline void clkoffset_dump(int level, struct frame *frm)
419 uint16_t clkoffset = LMP_U16(frm);
421 p_indent(level, frm);
422 printf("clock offset 0x%4.4x\n", clkoffset);
425 static inline void detach_dump(int level, struct frame *frm)
427 uint8_t error = LMP_U8(frm);
429 p_indent(level, frm);
430 printf("error code 0x%2.2x\n", error);
433 static inline void random_number_dump(int level, struct frame *frm)
435 uint8_t *number = frm->ptr;
441 p_indent(level, frm);
442 printf("random number ");
443 for (i = 0; i < 16; i++)
444 printf("%2.2x", number[i]);
448 static inline void key_dump(int level, struct frame *frm)
450 uint8_t *key = frm->ptr;
456 p_indent(level, frm);
458 for (i = 0; i < 16; i++)
459 printf("%2.2x", key[i]);
463 static inline void auth_resp_dump(int level, struct frame *frm)
465 uint8_t *resp = frm->ptr;
471 p_indent(level, frm);
472 printf("authentication response ");
473 for (i = 0; i < 4; i++)
474 printf("%2.2x", resp[i]);
478 static inline void encryption_mode_req_dump(int level, struct frame *frm)
480 uint8_t mode = LMP_U8(frm);
482 p_indent(level, frm);
483 printf("encryption mode %d\n", mode);
486 static inline void encryption_key_size_req_dump(int level, struct frame *frm)
488 uint8_t keysize = LMP_U8(frm);
490 p_indent(level, frm);
491 printf("key size %d\n", keysize);
494 static inline void switch_req_dump(int level, struct frame *frm)
496 uint32_t instant = LMP_U32(frm);
498 p_indent(level, frm);
499 printf("switch instant 0x%4.4x\n", instant);
502 static inline void hold_dump(int level, struct frame *frm)
504 uint16_t time = LMP_U16(frm);
505 uint32_t instant = LMP_U32(frm);
507 p_indent(level, frm);
508 printf("hold time 0x%4.4x\n", time);
510 p_indent(level, frm);
511 printf("hold instant 0x%4.4x\n", instant);
514 static inline void sniff_req_dump(int level, struct frame *frm)
516 uint8_t timing = LMP_U8(frm);
517 uint16_t dsniff = LMP_U16(frm);
518 uint16_t tsniff = LMP_U16(frm);
519 uint16_t attempt = LMP_U16(frm);
520 uint16_t timeout = LMP_U16(frm);
522 p_indent(level, frm);
523 printf("timing control flags 0x%2.2x\n", timing);
525 p_indent(level, frm);
526 printf("D_sniff %d T_sniff %d\n", dsniff, tsniff);
528 p_indent(level, frm);
529 printf("sniff attempt %d\n", attempt);
531 p_indent(level, frm);
532 printf("sniff timeout %d\n", timeout);
535 static inline void park_req_dump(int level, struct frame *frm)
537 uint8_t timing = LMP_U8(frm);
538 uint16_t db = LMP_U16(frm);
539 uint16_t tb = LMP_U16(frm);
540 uint8_t nb = LMP_U8(frm);
541 uint8_t xb = LMP_U8(frm);
542 uint8_t pmaddr = LMP_U8(frm);
543 uint8_t araddr = LMP_U8(frm);
544 uint8_t nbsleep = LMP_U8(frm);
545 uint8_t dbsleep = LMP_U8(frm);
546 uint8_t daccess = LMP_U8(frm);
547 uint8_t taccess = LMP_U8(frm);
548 uint8_t nslots = LMP_U8(frm);
549 uint8_t npoll = LMP_U8(frm);
550 uint8_t access = LMP_U8(frm);
552 p_indent(level, frm);
553 printf("timing control flags 0x%2.2x\n", timing);
555 p_indent(level, frm);
556 printf("D_B %d T_B %d N_B %d X_B %d\n", db, tb, nb, xb);
558 p_indent(level, frm);
559 printf("PM_ADDR %d AR_ADDR %d\n", pmaddr, araddr);
561 p_indent(level, frm);
562 printf("N_Bsleep %d D_Bsleep %d\n", nbsleep, dbsleep);
564 p_indent(level, frm);
565 printf("D_access %d T_access %d\n", daccess, taccess);
567 p_indent(level, frm);
568 printf("N_acc-slots %d N_poll %d\n", nslots, npoll);
570 p_indent(level, frm);
571 printf("M_access %d\n", access & 0x0f);
573 p_indent(level, frm);
574 printf("access scheme 0x%2.2x\n", access >> 4);
577 static inline void modify_beacon_dump(int level, struct frame *frm)
579 uint8_t timing = LMP_U8(frm);
580 uint16_t db = LMP_U16(frm);
581 uint16_t tb = LMP_U16(frm);
582 uint8_t nb = LMP_U8(frm);
583 uint8_t xb = LMP_U8(frm);
584 uint8_t daccess = LMP_U8(frm);
585 uint8_t taccess = LMP_U8(frm);
586 uint8_t nslots = LMP_U8(frm);
587 uint8_t npoll = LMP_U8(frm);
588 uint8_t access = LMP_U8(frm);
590 p_indent(level, frm);
591 printf("timing control flags 0x%2.2x\n", timing);
593 p_indent(level, frm);
594 printf("D_B %d T_B %d N_B %d X_B %d\n", db, tb, nb, xb);
596 p_indent(level, frm);
597 printf("D_access %d T_access %d\n", daccess, taccess);
599 p_indent(level, frm);
600 printf("N_acc-slots %d N_poll %d\n", nslots, npoll);
602 p_indent(level, frm);
603 printf("M_access %d\n", access & 0x0f);
605 p_indent(level, frm);
606 printf("access scheme 0x%2.2x\n", access >> 4);
609 static inline void power_req_dump(int level, struct frame *frm)
611 uint8_t val = LMP_U8(frm);
613 p_indent(level, frm);
614 printf("future use 0x%2.2x\n", val);
617 static inline void preferred_rate_dump(int level, struct frame *frm)
619 uint8_t rate = LMP_U8(frm);
621 p_indent(level, frm);
622 printf("data rate 0x%2.2x\n", rate);
624 p_indent(level, frm);
627 printf("%suse FEC, ", rate & 0x01 ? "do not " : "");
629 switch ((rate >> 1) & 0x03) {
631 printf("no packet-size preference\n");
634 printf("use 1-slot packets\n");
637 printf("use 3-slot packets\n");
640 printf("use 5-slot packets\n");
644 p_indent(level, frm);
647 switch ((rate >> 3) & 0x03) {
649 printf("use DM1 packets, ");
652 printf("use 2 Mbps packets, ");
655 printf("use 3 Mbps packets, ");
658 printf("reserved, \n");
662 switch ((rate >> 5) & 0x03) {
664 printf("no packet-size preference\n");
667 printf("use 1-slot packets\n");
670 printf("use 3-slot packets\n");
673 printf("use 5-slot packets\n");
678 static inline void version_dump(int level, struct frame *frm)
680 uint8_t ver = LMP_U8(frm);
681 uint16_t compid = LMP_U16(frm);
682 uint16_t subver = LMP_U16(frm);
685 p_indent(level, frm);
686 tmp = lmp_vertostr(ver);
687 printf("VersNr %d (%s)\n", ver, tmp);
690 p_indent(level, frm);
691 printf("CompId %d (%s)\n", compid, bt_compidtostr(compid));
693 p_indent(level, frm);
694 printf("SubVersNr %d\n", subver);
697 static inline void features_dump(int level, struct frame *frm)
699 uint8_t *features = frm->ptr;
705 p_indent(level, frm);
707 for (i = 0; i < 8; i++)
708 printf(" 0x%2.2x", features[i]);
712 static inline void set_afh_dump(int level, struct frame *frm)
714 uint32_t instant = LMP_U32(frm);
715 uint8_t mode = LMP_U8(frm);
716 uint8_t *map = frm->ptr;
722 p_indent(level, frm);
723 printf("AFH_instant 0x%04x\n", instant);
725 p_indent(level, frm);
726 printf("AFH_mode %d\n", mode);
728 p_indent(level, frm);
729 printf("AFH_channel_map 0x");
730 for (i = 0; i < 10; i++)
731 printf("%2.2x", map[i]);
735 static inline void encapsulated_header_dump(int level, struct frame *frm)
737 uint8_t major = LMP_U8(frm);
738 uint8_t minor = LMP_U8(frm);
739 uint8_t length = LMP_U8(frm);
741 p_indent(level, frm);
742 printf("major type %d minor type %d payload length %d\n",
743 major, minor, length);
745 if (major == 1 && minor == 1) {
746 p_indent(level, frm);
747 printf("P-192 Public Key\n");
751 static inline void encapsulated_payload_dump(int level, struct frame *frm)
753 uint8_t *value = frm->ptr;
759 p_indent(level, frm);
761 for (i = 0; i < 16; i++)
762 printf("%2.2x", value[i]);
766 static inline void simple_pairing_confirm_dump(int level, struct frame *frm)
768 uint8_t *value = frm->ptr;
774 p_indent(level, frm);
775 printf("commitment value ");
776 for (i = 0; i < 16; i++)
777 printf("%2.2x", value[i]);
781 static inline void simple_pairing_number_dump(int level, struct frame *frm)
783 uint8_t *value = frm->ptr;
789 p_indent(level, frm);
790 printf("nounce value ");
791 for (i = 0; i < 16; i++)
792 printf("%2.2x", value[i]);
796 static inline void dhkey_check_dump(int level, struct frame *frm)
798 uint8_t *value = frm->ptr;
804 p_indent(level, frm);
805 printf("confirmation value ");
806 for (i = 0; i < 16; i++)
807 printf("%2.2x", value[i]);
811 static inline void accepted_ext_dump(int level, struct frame *frm)
813 uint16_t opcode = LMP_U8(frm) + (LMP_U8(frm) << 7);
815 p_indent(level, frm);
816 printf("op code %d/%d (%s)\n", opcode & 0x7f, opcode >> 7, opcode2str(opcode));
819 static inline void not_accepted_ext_dump(int level, struct frame *frm)
821 uint16_t opcode = LMP_U8(frm) + (LMP_U8(frm) << 7);
822 uint8_t error = LMP_U8(frm);
824 p_indent(level, frm);
825 printf("op code %d/%d (%s)\n", opcode & 0x7f, opcode >> 7, opcode2str(opcode));
827 p_indent(level, frm);
828 printf("error code 0x%2.2x\n", error);
831 static inline void features_ext_dump(int level, struct frame *frm)
833 uint8_t page = LMP_U8(frm);
834 uint8_t max = LMP_U8(frm);
835 uint8_t *features = frm->ptr;
841 p_indent(level, frm);
842 printf("features page %d\n", page);
844 p_indent(level, frm);
845 printf("max supported page %d\n", max);
847 p_indent(level, frm);
848 printf("extended features");
849 for (i = 0; i < 8; i++)
850 printf(" 0x%2.2x", features[i]);
854 static inline void quality_of_service_dump(int level, struct frame *frm)
856 uint16_t interval = LMP_U16(frm);
857 uint8_t nbc = LMP_U8(frm);
859 p_indent(level, frm);
860 printf("poll interval %d\n", interval);
862 p_indent(level, frm);
863 printf("N_BC %d\n", nbc);
866 static inline void sco_link_req_dump(int level, struct frame *frm)
868 uint8_t handle = LMP_U8(frm);
869 uint8_t timing = LMP_U8(frm);
870 uint8_t dsco = LMP_U8(frm);
871 uint8_t tsco = LMP_U8(frm);
872 uint8_t packet = LMP_U8(frm);
873 uint8_t airmode = LMP_U8(frm);
875 p_indent(level, frm);
876 printf("SCO handle %d\n", handle);
878 p_indent(level, frm);
879 printf("timing control flags 0x%2.2x\n", timing);
881 p_indent(level, frm);
882 printf("D_SCO %d T_SCO %d\n", dsco, tsco);
884 p_indent(level, frm);
885 printf("SCO packet 0x%2.2x\n", packet);
887 p_indent(level, frm);
888 printf("air mode 0x%2.2x\n", airmode);
891 static inline void remove_sco_link_req_dump(int level, struct frame *frm)
893 uint8_t handle = LMP_U8(frm);
894 uint8_t error = LMP_U8(frm);
896 p_indent(level, frm);
897 printf("SCO handle %d\n", handle);
899 p_indent(level, frm);
900 printf("error code 0x%2.2x\n", error);
903 static inline void max_slots_dump(int level, struct frame *frm)
905 uint8_t slots = LMP_U8(frm);
907 p_indent(level, frm);
908 printf("max slots %d\n", slots);
911 static inline void timing_accuracy_dump(int level, struct frame *frm)
913 uint8_t drift = LMP_U8(frm);
914 uint8_t jitter = LMP_U8(frm);
916 p_indent(level, frm);
917 printf("drift %d\n", drift);
919 p_indent(level, frm);
920 printf("jitter %d\n", jitter);
923 static inline void slot_offset_dump(int level, struct frame *frm)
925 uint16_t offset = LMP_U16(frm);
928 p_ba2str((bdaddr_t *) frm->ptr, addr);
930 p_indent(level, frm);
931 printf("slot offset %d\n", offset);
933 p_indent(level, frm);
934 printf("BD_ADDR %s\n", addr);
937 static inline void page_mode_dump(int level, struct frame *frm)
939 uint8_t scheme = LMP_U8(frm);
940 uint8_t settings = LMP_U8(frm);
942 p_indent(level, frm);
943 printf("page scheme %d\n", scheme);
945 p_indent(level, frm);
946 printf("page scheme settings %d\n", settings);
949 static inline void supervision_timeout_dump(int level, struct frame *frm)
951 uint16_t timeout = LMP_U16(frm);
953 p_indent(level, frm);
954 printf("supervision timeout %d\n", timeout);
957 static inline void test_control_dump(int level, struct frame *frm)
959 uint8_t scenario = LMP_U8(frm);
960 uint8_t hopping = LMP_U8(frm);
961 uint8_t txfreq = LMP_U8(frm);
962 uint8_t rxfreq = LMP_U8(frm);
963 uint8_t power = LMP_U8(frm);
964 uint8_t poll = LMP_U8(frm);
965 uint8_t packet = LMP_U8(frm);
966 uint16_t length = LMP_U16(frm);
968 p_indent(level, frm);
969 printf("test scenario %d\n", scenario);
971 p_indent(level, frm);
972 printf("hopping mode %d\n", hopping);
974 p_indent(level, frm);
975 printf("TX frequency %d\n", txfreq);
977 p_indent(level, frm);
978 printf("RX frequency %d\n", rxfreq);
980 p_indent(level, frm);
981 printf("power control mode %d\n", power);
983 p_indent(level, frm);
984 printf("poll period %d\n", poll);
986 p_indent(level, frm);
987 printf("poll period %d\n", poll);
989 p_indent(level, frm);
990 printf("packet type 0x%2.2x\n", packet);
992 p_indent(level, frm);
993 printf("length of test data %d\n", length);
996 static inline void encryption_key_size_mask_res_dump(int level, struct frame *frm)
998 uint16_t mask = LMP_U16(frm);
1000 p_indent(level, frm);
1001 printf("key size mask 0x%4.4x\n", mask);
1004 static inline void packet_type_table_dump(int level, struct frame *frm)
1006 uint8_t type = LMP_U8(frm);
1008 p_indent(level, frm);
1009 printf("packet type table %d ", type);
1012 printf("(1Mbps only)\n");
1015 printf("(2/3Mbps)\n");
1018 printf("(Reserved)\n");
1023 static inline void esco_link_req_dump(int level, struct frame *frm)
1025 uint8_t handle = LMP_U8(frm);
1026 uint8_t ltaddr = LMP_U8(frm);
1027 uint8_t timing = LMP_U8(frm);
1028 uint8_t desco = LMP_U8(frm);
1029 uint8_t tesco = LMP_U8(frm);
1030 uint8_t wesco = LMP_U8(frm);
1031 uint8_t mspkt = LMP_U8(frm);
1032 uint8_t smpkt = LMP_U8(frm);
1033 uint16_t mslen = LMP_U16(frm);
1034 uint16_t smlen = LMP_U16(frm);
1035 uint8_t airmode = LMP_U8(frm);
1036 uint8_t negstate = LMP_U8(frm);
1038 p_indent(level, frm);
1039 printf("eSCO handle %d\n", handle);
1041 p_indent(level, frm);
1042 printf("eSCO LT_ADDR %d\n", ltaddr);
1044 p_indent(level, frm);
1045 printf("timing control flags 0x%2.2x\n", timing);
1047 p_indent(level, frm);
1048 printf("D_eSCO %d T_eSCO %d W_eSCO %d\n", desco, tesco, wesco);
1050 p_indent(level, frm);
1051 printf("eSCO M->S packet type 0x%2.2x length %d\n", mspkt, mslen);
1053 p_indent(level, frm);
1054 printf("eSCO S->M packet type 0x%2.2x length %d\n", smpkt, smlen);
1056 p_indent(level, frm);
1057 printf("air mode 0x%2.2x\n", airmode);
1059 p_indent(level, frm);
1060 printf("negotiation state 0x%2.2x\n", negstate);
1063 static inline void remove_esco_link_req_dump(int level, struct frame *frm)
1065 uint8_t handle = LMP_U8(frm);
1066 uint8_t error = LMP_U8(frm);
1068 p_indent(level, frm);
1069 printf("eSCO handle %d\n", handle);
1071 p_indent(level, frm);
1072 printf("error code 0x%2.2x\n", error);
1075 static inline void channel_classification_req_dump(int level, struct frame *frm)
1077 uint8_t mode = LMP_U8(frm);
1078 uint16_t min = LMP_U16(frm);
1079 uint16_t max = LMP_U16(frm);
1081 p_indent(level, frm);
1082 printf("AFH reporting mode %d\n", mode);
1084 p_indent(level, frm);
1085 printf("AFH min interval 0x%4.4x\n", min);
1087 p_indent(level, frm);
1088 printf("AFH max interval 0x%4.4x\n", max);
1091 static inline void channel_classification_dump(int level, struct frame *frm)
1093 uint8_t *map = frm->ptr;
1099 p_indent(level, frm);
1100 printf("AFH channel classification 0x");
1101 for (i = 0; i < 10; i++)
1102 printf("%2.2x", map[i]);
1106 static inline void sniff_subrating_dump(int level, struct frame *frm)
1108 uint8_t subrate = LMP_U8(frm);
1109 uint16_t timeout = LMP_U16(frm);
1110 uint32_t instant = LMP_U32(frm);
1112 p_indent(level, frm);
1113 printf("max subrate %d\n", subrate);
1115 p_indent(level, frm);
1116 printf("min sniff timeout %d\n", timeout);
1118 p_indent(level, frm);
1119 printf("subrate instant 0x%4.4x\n", instant);
1122 static inline void io_capability_dump(int level, struct frame *frm)
1124 uint8_t capability = LMP_U8(frm);
1125 uint8_t oob_data = LMP_U8(frm);
1126 uint8_t authentication = LMP_U8(frm);
1128 p_indent(level, frm);
1129 printf("capability 0x%2.2x oob 0x%2.2x auth 0x%2.2x\n",
1130 capability, oob_data, authentication);
1133 static inline void keypress_notification_dump(int level, struct frame *frm)
1135 uint8_t value = LMP_U8(frm);
1137 p_indent(level, frm);
1138 printf("notification value %d\n", value);
1141 void lmp_dump(int level, struct frame *frm)
1146 p_indent(level, frm);
1150 opcode = (tmp & 0xfe) >> 1;
1156 printf("LMP(%c): %s(%c): ", frm->master ? 's' : 'r',
1157 opcode2str(opcode), tid ? 's' : 'm');
1160 printf("op code %d/%d", opcode & 0x7f, opcode >> 7);
1162 printf("op code %d", opcode);
1164 if (frm->handle > 17)
1165 printf(" handle %d\n", frm->handle);
1169 if (!(parser.flags & DUMP_VERBOSE)) {
1170 raw_dump(level, frm);
1176 name_req_dump(level + 1, frm);
1179 name_res_dump(level + 1, frm);
1182 accepted_dump(level + 1, frm);
1185 not_accepted_dump(level + 1, frm);
1188 clkoffset_dump(level + 1, frm);
1191 detach_dump(level + 1, frm);
1195 random_number_dump(level + 1, frm);
1199 random_number_dump(level + 1, frm);
1203 random_number_dump(level + 1, frm);
1207 auth_resp_dump(level + 1, frm);
1211 random_number_dump(level + 1, frm);
1215 key_dump(level + 1, frm);
1218 encryption_mode_req_dump(level + 1, frm);
1221 encryption_key_size_req_dump(level + 1, frm);
1224 switch_req_dump(level + 1, frm);
1228 hold_dump(level + 1, frm);
1231 sniff_req_dump(level + 1, frm);
1234 park_req_dump(level + 1, frm);
1237 modify_beacon_dump(level + 1, frm);
1241 power_req_dump(level + 1, frm);
1244 preferred_rate_dump(level + 1, frm);
1248 version_dump(level + 1, frm);
1252 features_dump(level + 1, frm);
1256 quality_of_service_dump(level + 1, frm);
1259 sco_link_req_dump(level + 1, frm);
1262 remove_sco_link_req_dump(level + 1, frm);
1266 max_slots_dump(level + 1, frm);
1269 timing_accuracy_dump(level + 1, frm);
1272 slot_offset_dump(level + 1, frm);
1276 page_mode_dump(level + 1, frm);
1279 supervision_timeout_dump(level + 1, frm);
1282 test_control_dump(level + 1, frm);
1285 encryption_key_size_mask_res_dump(level + 1, frm);
1288 set_afh_dump(level + 1, frm);
1291 encapsulated_header_dump(level + 1, frm);
1294 encapsulated_payload_dump(level + 1, frm);
1297 simple_pairing_confirm_dump(level + 1, frm);
1300 simple_pairing_number_dump(level + 1, frm);
1303 dhkey_check_dump(level + 1, frm);
1317 case 127 + (23 << 7):
1318 case 127 + (24 << 7):
1319 case 127 + (27 << 7):
1320 case 127 + (28 << 7):
1321 case 127 + (29 << 7):
1323 case 127 + (1 << 7):
1324 accepted_ext_dump(level + 1, frm);
1326 case 127 + (2 << 7):
1327 not_accepted_ext_dump(level + 1, frm);
1329 case 127 + (3 << 7):
1330 case 127 + (4 << 7):
1331 features_ext_dump(level + 1, frm);
1333 case 127 + (11 << 7):
1334 packet_type_table_dump(level + 1, frm);
1336 case 127 + (12 << 7):
1337 esco_link_req_dump(level + 1, frm);
1339 case 127 + (13 << 7):
1340 remove_esco_link_req_dump(level + 1, frm);
1342 case 127 + (16 << 7):
1343 channel_classification_req_dump(level + 1, frm);
1345 case 127 + (17 << 7):
1346 channel_classification_dump(level + 1, frm);
1348 case 127 + (21 << 7):
1349 case 127 + (22 << 7):
1350 sniff_subrating_dump(level + 1, frm);
1352 case 127 + (25 << 7):
1353 case 127 + (26 << 7):
1354 io_capability_dump(level + 1, frm);
1356 case 127 + (30 << 7):
1357 keypress_notification_dump(level + 1, frm);
1361 raw_dump(level, frm);