1 // SPDX-License-Identifier: LGPL-2.1-or-later
4 * BlueZ - Bluetooth protocol stack for Linux
6 * Copyright (C) 2011-2014 Intel Corporation
7 * Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
27 #include <sys/socket.h>
29 #include "lib/bluetooth.h"
32 #include "lib/hci_lib.h"
34 #include "src/shared/util.h"
35 #include "src/shared/btsnoop.h"
36 #include "src/shared/queue.h"
50 #define COLOR_CHANNEL_LABEL COLOR_WHITE
51 #define COLOR_FRAME_LABEL COLOR_WHITE
52 #define COLOR_INDEX_LABEL COLOR_WHITE
53 #define COLOR_TIMESTAMP COLOR_YELLOW
55 #define COLOR_NEW_INDEX COLOR_GREEN
56 #define COLOR_DEL_INDEX COLOR_RED
57 #define COLOR_OPEN_INDEX COLOR_GREEN
58 #define COLOR_CLOSE_INDEX COLOR_RED
59 #define COLOR_INDEX_INFO COLOR_GREEN
60 #define COLOR_VENDOR_DIAG COLOR_YELLOW
61 #define COLOR_SYSTEM_NOTE COLOR_OFF
63 #define COLOR_HCI_COMMAND COLOR_BLUE
64 #define COLOR_HCI_COMMAND_UNKNOWN COLOR_WHITE_BG
65 #define COLOR_HCI_EVENT COLOR_MAGENTA
66 #define COLOR_HCI_EVENT_UNKNOWN COLOR_WHITE_BG
67 #define COLOR_HCI_ACLDATA COLOR_CYAN
68 #define COLOR_HCI_SCODATA COLOR_YELLOW
69 #define COLOR_HCI_ISODATA COLOR_YELLOW
71 #define COLOR_UNKNOWN_ERROR COLOR_WHITE_BG
72 #define COLOR_UNKNOWN_FEATURE_BIT COLOR_WHITE_BG
73 #define COLOR_UNKNOWN_COMMAND_BIT COLOR_WHITE_BG
74 #define COLOR_UNKNOWN_EVENT_MASK COLOR_WHITE_BG
75 #define COLOR_UNKNOWN_LE_STATES COLOR_WHITE_BG
76 #define COLOR_UNKNOWN_SERVICE_CLASS COLOR_WHITE_BG
77 #define COLOR_UNKNOWN_PKT_TYPE_BIT COLOR_WHITE_BG
79 #define COLOR_CTRL_OPEN COLOR_GREEN_BOLD
80 #define COLOR_CTRL_CLOSE COLOR_RED_BOLD
81 #define COLOR_CTRL_COMMAND COLOR_BLUE_BOLD
82 #define COLOR_CTRL_COMMAND_UNKNOWN COLOR_WHITE_BG
83 #define COLOR_CTRL_EVENT COLOR_MAGENTA_BOLD
84 #define COLOR_CTRL_EVENT_UNKNOWN COLOR_WHITE_BG
86 #define COLOR_UNKNOWN_OPTIONS_BIT COLOR_WHITE_BG
87 #define COLOR_UNKNOWN_SETTINGS_BIT COLOR_WHITE_BG
88 #define COLOR_UNKNOWN_ADDRESS_TYPE COLOR_WHITE_BG
89 #define COLOR_UNKNOWN_DEVICE_FLAG COLOR_WHITE_BG
90 #define COLOR_UNKNOWN_EXP_FEATURE_FLAG COLOR_WHITE_BG
91 #define COLOR_UNKNOWN_ADV_FLAG COLOR_WHITE_BG
92 #define COLOR_UNKNOWN_PHY COLOR_WHITE_BG
93 #define COLOR_UNKNOWN_ADDED_DEVICE_FLAG COLOR_WHITE_BG
94 #define COLOR_UNKNOWN_ADVMON_FEATURES COLOR_WHITE_BG
96 #define COLOR_PHY_PACKET COLOR_BLUE
98 #define UNKNOWN_MANUFACTURER 0xffff
100 static time_t time_offset = ((time_t) -1);
101 static int priority_level = BTSNOOP_PRIORITY_INFO;
102 static unsigned long filter_mask = 0;
103 static bool index_filter = false;
104 static uint16_t index_current = 0;
105 static uint16_t fallback_manufacturer = UNKNOWN_MANUFACTURER;
107 #define CTRL_RAW 0x0000
108 #define CTRL_USER 0x0001
109 #define CTRL_MGMT 0x0002
120 static struct ctrl_data ctrl_list[MAX_CTRL];
122 static void assign_ctrl(uint32_t cookie, uint16_t format, const char *name)
126 for (i = 0; i < MAX_CTRL; i++) {
127 if (!ctrl_list[i].used) {
128 ctrl_list[i].used = true;
129 ctrl_list[i].cookie = cookie;
130 ctrl_list[i].format = format;
132 strncpy(ctrl_list[i].name, name, 19);
133 ctrl_list[i].name[19] = '\0';
135 strcpy(ctrl_list[i].name, "null");
141 static void release_ctrl(uint32_t cookie, uint16_t *format, char *name)
148 for (i = 0; i < MAX_CTRL; i++) {
149 if (ctrl_list[i].used && ctrl_list[i].cookie == cookie) {
150 ctrl_list[i].used = false;
152 *format = ctrl_list[i].format;
154 strncpy(name, ctrl_list[i].name, 20);
160 static uint16_t get_format(uint32_t cookie)
164 for (i = 0; i < MAX_CTRL; i++) {
165 if (ctrl_list[i].used && ctrl_list[i].cookie == cookie)
166 return ctrl_list[i].format;
174 static struct packet_conn_data conn_list[MAX_CONN];
176 static void assign_handle(uint16_t index, uint16_t handle, uint8_t type,
177 uint8_t *dst, uint8_t dst_type)
181 for (i = 0; i < MAX_CONN; i++) {
182 if (conn_list[i].handle == 0x0000) {
183 if (hci_devba(index, (bdaddr_t *)conn_list[i].src) < 0)
186 conn_list[i].index = index;
187 conn_list[i].handle = handle;
188 conn_list[i].type = type;
193 memcpy(conn_list[i].dst, dst, sizeof(conn_list[i].dst));
194 conn_list[i].dst_type = dst_type;
200 static void release_handle(uint16_t handle)
204 for (i = 0; i < MAX_CONN; i++) {
205 struct packet_conn_data *conn = &conn_list[i];
207 if (conn->handle == handle) {
209 conn->destroy(conn->data);
211 queue_destroy(conn->tx_q, free);
212 queue_destroy(conn->chan_q, free);
213 memset(conn, 0, sizeof(*conn));
219 struct packet_conn_data *packet_get_conn_data(uint16_t handle)
223 for (i = 0; i < MAX_CONN; i++) {
224 if (conn_list[i].handle == handle)
225 return &conn_list[i];
231 static uint8_t get_type(uint16_t handle)
233 struct packet_conn_data *conn;
235 conn = packet_get_conn_data(handle);
242 bool packet_has_filter(unsigned long filter)
244 return filter_mask & filter;
247 void packet_set_filter(unsigned long filter)
249 filter_mask = filter;
252 void packet_add_filter(unsigned long filter)
255 filter &= ~PACKET_FILTER_SHOW_INDEX;
257 filter_mask |= filter;
260 void packet_del_filter(unsigned long filter)
262 filter_mask &= ~filter;
265 void packet_set_priority(const char *priority)
270 if (!strcasecmp(priority, "debug"))
271 priority_level = BTSNOOP_PRIORITY_DEBUG;
273 priority_level = atoi(priority);
276 void packet_select_index(uint16_t index)
278 filter_mask &= ~PACKET_FILTER_SHOW_INDEX;
280 control_filter_index(index);
285 #define print_space(x) printf("%*c", (x), ' ');
292 uint16_t manufacturer;
293 uint16_t msft_opcode;
294 uint8_t msft_evt_prefix[8];
295 uint8_t msft_evt_len;
299 static struct index_data index_list[MAX_INDEX];
301 void packet_set_fallback_manufacturer(uint16_t manufacturer)
305 for (i = 0; i < MAX_INDEX; i++)
306 index_list[i].manufacturer = manufacturer;
308 fallback_manufacturer = manufacturer;
311 void packet_set_msft_evt_prefix(const uint8_t *prefix, uint8_t len)
313 if (index_current < MAX_INDEX && len < 8)
314 memcpy(index_list[index_current].msft_evt_prefix, prefix, len);
317 static void cred_pid(struct ucred *cred, char *str, size_t len)
319 char *path = alloca(24);
323 snprintf(path, 23, "/proc/%u/comm", cred->pid);
325 fp = fopen(path, "re");
327 if (fgets(line, sizeof(line), fp)) {
328 line[strcspn(line, "\r\n")] = '\0';
329 snprintf(str, len, "%s[%u]", line, cred->pid);
331 snprintf(str, len, "[%u]", cred->pid);
334 snprintf(str, len, "[%u]", cred->pid);
337 static void print_packet(struct timeval *tv, struct ucred *cred, char ident,
338 uint16_t index, const char *channel,
339 const char *color, const char *label,
340 const char *text, const char *extra)
342 int col = num_columns();
343 char line[256], ts_str[96], pid_str[140];
344 int n, ts_len = 0, ts_pos = 0, len = 0, pos = 0;
345 static size_t last_frame;
349 n = sprintf(ts_str + ts_pos, "%s", COLOR_CHANNEL_LABEL);
354 n = sprintf(ts_str + ts_pos, " {%s}", channel);
359 } else if (index != HCI_DEV_NONE && index < MAX_INDEX &&
360 index_list[index].frame != last_frame) {
362 n = sprintf(ts_str + ts_pos, "%s", COLOR_FRAME_LABEL);
367 n = sprintf(ts_str + ts_pos, " #%zu", index_list[index].frame);
372 last_frame = index_list[index].frame;
375 if ((filter_mask & PACKET_FILTER_SHOW_INDEX) &&
376 index != HCI_DEV_NONE) {
378 n = snprintf(ts_str + ts_pos, sizeof(ts_str) - ts_pos,
379 "%s", COLOR_INDEX_LABEL);
384 n = sprintf(ts_str + ts_pos, " [hci%d]", index);
392 time_t t = tv->tv_sec;
395 localtime_r(&t, &tm);
398 n = sprintf(ts_str + ts_pos, "%s", COLOR_TIMESTAMP);
403 if (filter_mask & PACKET_FILTER_SHOW_DATE) {
404 n = sprintf(ts_str + ts_pos, " %04d-%02d-%02d",
405 tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
412 if (filter_mask & PACKET_FILTER_SHOW_TIME) {
413 n = sprintf(ts_str + ts_pos, " %02d:%02d:%02d.%06llu",
414 tm.tm_hour, tm.tm_min, tm.tm_sec,
415 (long long)tv->tv_usec);
422 if (filter_mask & PACKET_FILTER_SHOW_TIME_OFFSET) {
423 n = sprintf(ts_str + ts_pos, " %llu.%06llu",
424 (long long)(tv->tv_sec - time_offset),
425 (long long)tv->tv_usec);
434 sprintf(ts_str + ts_pos, "%s", COLOR_OFF);
435 n = sprintf(line + pos, "%s", color);
440 if (cred && cred->pid) {
441 cred_pid(cred, pid_str, sizeof(pid_str));
442 n = sprintf(line + pos, "%s: %c %s", pid_str, ident,
445 n = sprintf(line + pos, "%c %s", ident, label ? label : "");
453 int extra_len = extra ? strlen(extra) : 0;
454 int max_len = col - len - extra_len - ts_len - 3;
456 n = snprintf(line + pos, max_len + 1, "%s%s",
457 label ? ": " : "", text);
459 line[pos + max_len - 1] = '.';
460 line[pos + max_len - 2] = '.';
461 if (line[pos + max_len - 3] == ' ')
462 line[pos + max_len - 3] = '.';
474 n = sprintf(line + pos, "%s", COLOR_OFF);
480 n = sprintf(line + pos, " %s", extra);
488 print_space(col - len - ts_len - 1);
489 printf("%s%s\n", use_color() ? COLOR_TIMESTAMP : "", ts_str);
491 printf("%s\n", line);
494 static const struct {
497 } error2str_table[] = {
499 { 0x01, "Unknown HCI Command" },
500 { 0x02, "Unknown Connection Identifier" },
501 { 0x03, "Hardware Failure" },
502 { 0x04, "Page Timeout" },
503 { 0x05, "Authentication Failure" },
504 { 0x06, "PIN or Key Missing" },
505 { 0x07, "Memory Capacity Exceeded" },
506 { 0x08, "Connection Timeout" },
507 { 0x09, "Connection Limit Exceeded" },
508 { 0x0a, "Synchronous Connection Limit to a Device Exceeded" },
509 { 0x0b, "ACL Connection Already Exists" },
510 { 0x0c, "Command Disallowed" },
511 { 0x0d, "Connection Rejected due to Limited Resources" },
512 { 0x0e, "Connection Rejected due to Security Reasons" },
513 { 0x0f, "Connection Rejected due to Unacceptable BD_ADDR" },
514 { 0x10, "Connection Accept Timeout Exceeded" },
515 { 0x11, "Unsupported Feature or Parameter Value" },
516 { 0x12, "Invalid HCI Command Parameters" },
517 { 0x13, "Remote User Terminated Connection" },
518 { 0x14, "Remote Device Terminated due to Low Resources" },
519 { 0x15, "Remote Device Terminated due to Power Off" },
520 { 0x16, "Connection Terminated By Local Host" },
521 { 0x17, "Repeated Attempts" },
522 { 0x18, "Pairing Not Allowed" },
523 { 0x19, "Unknown LMP PDU" },
524 { 0x1a, "Unsupported Remote Feature / Unsupported LMP Feature" },
525 { 0x1b, "SCO Offset Rejected" },
526 { 0x1c, "SCO Interval Rejected" },
527 { 0x1d, "SCO Air Mode Rejected" },
528 { 0x1e, "Invalid LMP Parameters / Invalid LL Parameters" },
529 { 0x1f, "Unspecified Error" },
530 { 0x20, "Unsupported LMP Parameter Value / "
531 "Unsupported LL Parameter Value" },
532 { 0x21, "Role Change Not Allowed" },
533 { 0x22, "LMP Response Timeout / LL Response Timeout" },
534 { 0x23, "LMP Error Transaction Collision" },
535 { 0x24, "LMP PDU Not Allowed" },
536 { 0x25, "Encryption Mode Not Acceptable" },
537 { 0x26, "Link Key cannot be Changed" },
538 { 0x27, "Requested QoS Not Supported" },
539 { 0x28, "Instant Passed" },
540 { 0x29, "Pairing With Unit Key Not Supported" },
541 { 0x2a, "Different Transaction Collision" },
542 { 0x2b, "Reserved" },
543 { 0x2c, "QoS Unacceptable Parameter" },
544 { 0x2d, "QoS Rejected" },
545 { 0x2e, "Channel Classification Not Supported" },
546 { 0x2f, "Insufficient Security" },
547 { 0x30, "Parameter Out Of Manadatory Range" },
548 { 0x31, "Reserved" },
549 { 0x32, "Role Switch Pending" },
550 { 0x33, "Reserved" },
551 { 0x34, "Reserved Slot Violation" },
552 { 0x35, "Role Switch Failed" },
553 { 0x36, "Extended Inquiry Response Too Large" },
554 { 0x37, "Secure Simple Pairing Not Supported By Host" },
555 { 0x38, "Host Busy - Pairing" },
556 { 0x39, "Connection Rejected due to No Suitable Channel Found" },
557 { 0x3a, "Controller Busy" },
558 { 0x3b, "Unacceptable Connection Parameters" },
559 { 0x3c, "Advertising Timeout" },
560 { 0x3d, "Connection Terminated due to MIC Failure" },
561 { 0x3e, "Connection Failed to be Established" },
562 { 0x3f, "MAC Connection Failed" },
563 { 0x40, "Coarse Clock Adjustment Rejected "
564 "but Will Try to Adjust Using Clock Dragging" },
565 { 0x41, "Type0 Submap Not Defined" },
566 { 0x42, "Unknown Advertising Identifier" },
567 { 0x43, "Limit Reached" },
568 { 0x44, "Operation Cancelled by Host" },
569 { 0x45, "Packet Too Long" },
573 static void print_error(const char *label, uint8_t error)
575 const char *str = "Unknown";
576 const char *color_on, *color_off;
580 for (i = 0; error2str_table[i].str; i++) {
581 if (error2str_table[i].error == error) {
582 str = error2str_table[i].str;
591 color_on = COLOR_UNKNOWN_ERROR;
593 color_on = COLOR_RED;
595 color_on = COLOR_GREEN;
596 color_off = COLOR_OFF;
602 print_field("%s: %s%s%s (0x%2.2x)", label,
603 color_on, str, color_off, error);
606 static void print_status(uint8_t status)
608 print_error("Status", status);
611 static void print_reason(uint8_t reason)
613 print_error("Reason", reason);
616 void packet_print_error(const char *label, uint8_t error)
618 print_error(label, error);
621 static void print_enable(const char *label, uint8_t enable)
637 print_field("%s: %s (0x%2.2x)", label, str, enable);
640 static void print_addr_type(const char *label, uint8_t addr_type)
656 print_field("%s: %s (0x%2.2x)", label, str, addr_type);
659 static void print_own_addr_type(uint8_t addr_type)
677 print_field("Own address type: %s (0x%2.2x)", str, addr_type);
680 static void print_peer_addr_type(const char *label, uint8_t addr_type)
692 str = "Resolved Public";
695 str = "Resolved Random";
702 print_field("%s: %s (0x%2.2x)", label, str, addr_type);
705 static void print_addr_resolve(const char *label, const uint8_t *addr,
706 uint8_t addr_type, bool resolve)
714 if (!hwdb_get_company(addr, &company))
718 print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
719 " (%s)", label, addr[5], addr[4],
725 print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
726 " (OUI %2.2X-%2.2X-%2.2X)", label,
727 addr[5], addr[4], addr[3],
728 addr[2], addr[1], addr[0],
729 addr[5], addr[4], addr[3]);
734 switch ((addr[5] & 0xc0) >> 6) {
736 str = "Non-Resolvable";
749 print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X (%s)",
750 label, addr[5], addr[4], addr[3],
751 addr[2], addr[1], addr[0], str);
753 if (resolve && (addr[5] & 0xc0) == 0x40) {
754 uint8_t ident[6], ident_type;
756 if (keys_resolve_identity(addr, ident, &ident_type)) {
757 print_addr_type(" Identity type", ident_type);
758 print_addr_resolve(" Identity", ident,
764 print_field("%s: %2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X",
765 label, addr[5], addr[4], addr[3],
766 addr[2], addr[1], addr[0]);
771 static void print_addr(const char *label, const uint8_t *addr, uint8_t type)
773 print_addr_resolve(label, addr, type, true);
776 static void print_bdaddr(const uint8_t *bdaddr)
778 print_addr("Address", bdaddr, 0x00);
781 static void print_lt_addr(uint8_t lt_addr)
783 print_field("LT address: %d", lt_addr);
786 static void print_handle_native(uint16_t handle)
788 struct packet_conn_data *conn;
791 conn = packet_get_conn_data(handle);
793 print_field("Handle: %d", handle);
797 sprintf(label, "Handle: %d Address", handle);
798 print_addr(label, conn->dst, conn->dst_type);
801 static void print_handle(uint16_t handle)
803 print_handle_native(le16_to_cpu(handle));
806 static void print_phy_handle(uint8_t phy_handle)
808 print_field("Physical handle: %d", phy_handle);
811 static const struct bitfield_data pkt_type_table[] = {
812 { 1, "2-DH1 may not be used" },
813 { 2, "3-DH1 may not be used" },
814 { 3, "DM1 may be used" },
815 { 4, "DH1 may be used" },
816 { 8, "2-DH3 may not be used" },
817 { 9, "3-DH3 may not be used" },
818 { 10, "DM3 may be used" },
819 { 11, "DH3 may be used" },
820 { 12, "2-DH5 may not be used" },
821 { 13, "3-DH5 may not be used" },
822 { 14, "DM5 may be used" },
823 { 15, "DH5 may be used" },
827 static void print_pkt_type(uint16_t pkt_type)
829 uint16_t mask = le16_to_cpu(pkt_type);
831 print_field("Packet type: 0x%4.4x", mask);
833 mask = print_bitfield(2, mask, pkt_type_table);
835 print_text(COLOR_UNKNOWN_PKT_TYPE_BIT,
836 " Unknown packet types (0x%4.4x)", mask);
839 static const struct bitfield_data pkt_type_sco_table[] = {
840 { 0, "HV1 may be used" },
841 { 1, "HV2 may be used" },
842 { 2, "HV3 may be used" },
843 { 3, "EV3 may be used" },
844 { 4, "EV4 may be used" },
845 { 5, "EV5 may be used" },
846 { 6, "2-EV3 may not be used" },
847 { 7, "3-EV3 may not be used" },
848 { 8, "2-EV5 may not be used" },
849 { 9, "3-EV5 may not be used" },
853 static void print_pkt_type_sco(uint16_t pkt_type)
855 uint16_t mask = le16_to_cpu(pkt_type);
857 print_field("Packet type: 0x%4.4x", mask);
859 mask = print_bitfield(2, mask, pkt_type_sco_table);
861 print_text(COLOR_UNKNOWN_PKT_TYPE_BIT,
862 " Unknown packet types (0x%4.4x)", mask);
865 static void print_iac(const uint8_t *lap)
867 const char *str = "";
869 if (lap[2] == 0x9e && lap[1] == 0x8b) {
872 str = " (General Inquiry)";
875 str = " (Limited Inquiry)";
880 print_field("Access code: 0x%2.2x%2.2x%2.2x%s",
881 lap[2], lap[1], lap[0], str);
884 static void print_auth_enable(uint8_t enable)
890 str = "Authentication not required";
893 str = "Authentication required for all connections";
900 print_field("Enable: %s (0x%2.2x)", str, enable);
903 static void print_encrypt_mode(uint8_t mode)
909 str = "Encryption not required";
912 str = "Encryption required for all connections";
919 print_field("Mode: %s (0x%2.2x)", str, mode);
922 static const struct bitfield_data svc_class_table[] = {
923 { 0, "Positioning (Location identification)" },
924 { 1, "Networking (LAN, Ad hoc)" },
925 { 2, "Rendering (Printing, Speaker)" },
926 { 3, "Capturing (Scanner, Microphone)" },
927 { 4, "Object Transfer (v-Inbox, v-Folder)" },
928 { 5, "Audio (Speaker, Microphone, Headset)" },
929 { 6, "Telephony (Cordless telephony, Modem, Headset)" },
930 { 7, "Information (WEB-server, WAP-server)" },
934 static const struct {
937 } major_class_computer_table[] = {
938 { 0x00, "Uncategorized, code for device not assigned" },
939 { 0x01, "Desktop workstation" },
940 { 0x02, "Server-class computer" },
942 { 0x04, "Handheld PC/PDA (clam shell)" },
943 { 0x05, "Palm sized PC/PDA" },
944 { 0x06, "Wearable computer (Watch sized)" },
949 static const char *major_class_computer(uint8_t minor)
953 for (i = 0; major_class_computer_table[i].str; i++) {
954 if (major_class_computer_table[i].val == minor)
955 return major_class_computer_table[i].str;
961 static const struct {
964 } major_class_phone_table[] = {
965 { 0x00, "Uncategorized, code for device not assigned" },
966 { 0x01, "Cellular" },
967 { 0x02, "Cordless" },
968 { 0x03, "Smart phone" },
969 { 0x04, "Wired modem or voice gateway" },
970 { 0x05, "Common ISDN Access" },
974 static const char *major_class_phone(uint8_t minor)
978 for (i = 0; major_class_phone_table[i].str; i++) {
979 if (major_class_phone_table[i].val == minor)
980 return major_class_phone_table[i].str;
986 static const struct {
989 } major_class_av_table[] = {
990 { 0x00, "Uncategorized, code for device not assigned" },
991 { 0x01, "Wearable Headset Device" },
992 { 0x02, "Hands-free Device" },
993 { 0x04, "Microphone" },
994 { 0x05, "Loudspeaker" },
995 { 0x06, "Headphones" },
996 { 0x07, "Portable Audio" },
997 { 0x08, "Car audio" },
998 { 0x09, "Set-top box" },
999 { 0x0a, "HiFi Audio Device" },
1001 { 0x0c, "Video Camera" },
1002 { 0x0d, "Camcorder" },
1003 { 0x0e, "Video Monitor" },
1004 { 0x0f, "Video Display and Loudspeaker" },
1005 { 0x10, "Video Conferencing" },
1006 { 0x12, "Gaming/Toy" },
1010 static const char *major_class_av(uint8_t minor)
1014 for (i = 0; major_class_av_table[i].str; i++) {
1015 if (major_class_av_table[i].val == minor)
1016 return major_class_av_table[i].str;
1022 static const struct {
1025 } major_class_wearable_table[] = {
1026 { 0x01, "Wrist Watch" },
1030 { 0x05, "Glasses" },
1034 static const char *major_class_wearable(uint8_t minor)
1038 for (i = 0; major_class_wearable_table[i].str; i++) {
1039 if (major_class_wearable_table[i].val == minor)
1040 return major_class_wearable_table[i].str;
1046 static const struct {
1049 const char *(*func)(uint8_t minor);
1050 } major_class_table[] = {
1051 { 0x00, "Miscellaneous" },
1052 { 0x01, "Computer (desktop, notebook, PDA, organizers)",
1053 major_class_computer },
1054 { 0x02, "Phone (cellular, cordless, payphone, modem)",
1055 major_class_phone },
1056 { 0x03, "LAN /Network Access point" },
1057 { 0x04, "Audio/Video (headset, speaker, stereo, video, vcr)",
1059 { 0x05, "Peripheral (mouse, joystick, keyboards)" },
1060 { 0x06, "Imaging (printing, scanner, camera, display)" },
1061 { 0x07, "Wearable", major_class_wearable },
1064 { 0x1f, "Uncategorized, specific device code not specified" },
1068 static void print_dev_class(const uint8_t *dev_class)
1070 uint8_t mask, major_cls, minor_cls;
1071 const char *major_str = NULL;
1072 const char *minor_str = NULL;
1075 print_field("Class: 0x%2.2x%2.2x%2.2x",
1076 dev_class[2], dev_class[1], dev_class[0]);
1078 if ((dev_class[0] & 0x03) != 0x00) {
1079 print_field(" Format type: 0x%2.2x", dev_class[0] & 0x03);
1080 print_text(COLOR_ERROR, " invalid format type");
1084 major_cls = dev_class[1] & 0x1f;
1085 minor_cls = (dev_class[0] & 0xfc) >> 2;
1087 for (i = 0; major_class_table[i].str; i++) {
1088 if (major_class_table[i].val == major_cls) {
1089 major_str = major_class_table[i].str;
1091 if (!major_class_table[i].func)
1094 minor_str = major_class_table[i].func(minor_cls);
1100 print_field(" Major class: %s", major_str);
1102 print_field(" Minor class: %s", minor_str);
1104 print_field(" Minor class: 0x%2.2x", minor_cls);
1106 print_field(" Major class: 0x%2.2x", major_cls);
1107 print_field(" Minor class: 0x%2.2x", minor_cls);
1110 if (dev_class[1] & 0x20)
1111 print_field(" Limited Discoverable Mode");
1113 if ((dev_class[1] & 0xc0) != 0x00) {
1114 print_text(COLOR_ERROR, " invalid service class");
1118 mask = print_bitfield(2, dev_class[2], svc_class_table);
1120 print_text(COLOR_UNKNOWN_SERVICE_CLASS,
1121 " Unknown service class (0x%2.2x)", mask);
1124 static void print_appearance(uint16_t appearance)
1126 print_field("Appearance: %s (0x%4.4x)", bt_appear_to_str(appearance),
1130 static void print_num_broadcast_retrans(uint8_t num_retrans)
1132 print_field("Number of broadcast retransmissions: %u", num_retrans);
1135 static void print_hold_mode_activity(uint8_t activity)
1137 print_field("Activity: 0x%2.2x", activity);
1139 if (activity == 0x00) {
1140 print_field(" Maintain current Power State");
1144 if (activity & 0x01)
1145 print_field(" Suspend Page Scan");
1146 if (activity & 0x02)
1147 print_field(" Suspend Inquiry Scan");
1148 if (activity & 0x04)
1149 print_field(" Suspend Periodic Inquiries");
1152 static void print_power_type(uint8_t type)
1158 str = "Current Transmit Power Level";
1161 str = "Maximum Transmit Power Level";
1168 print_field("Type: %s (0x%2.2x)", str, type);
1171 static void print_power_level(int8_t level, const char *type)
1173 print_field("TX power%s%s%s: %d dbm (0x%2.2x)",
1174 type ? " (" : "", type ? type : "", type ? ")" : "",
1175 level, (uint8_t) level);
1178 static void print_host_flow_control(uint8_t enable)
1187 str = "ACL Data Packets";
1190 str = "Synchronous Data Packets";
1193 str = "ACL and Synchronous Data Packets";
1200 print_field("Flow control: %s (0x%2.2x)", str, enable);
1203 static void print_voice_setting(uint16_t setting)
1205 uint8_t input_coding = (le16_to_cpu(setting) & 0x0300) >> 8;
1206 uint8_t input_data_format = (le16_to_cpu(setting) & 0xc0) >> 6;
1207 uint8_t air_coding_format = le16_to_cpu(setting) & 0x0003;
1210 print_field("Setting: 0x%4.4x", le16_to_cpu(setting));
1212 switch (input_coding) {
1227 print_field(" Input Coding: %s", str);
1229 switch (input_data_format) {
1231 str = "1's complement";
1234 str = "2's complement";
1237 str = "Sign-Magnitude";
1247 print_field(" Input Data Format: %s", str);
1249 if (input_coding == 0x00) {
1250 print_field(" Input Sample Size: %s",
1251 le16_to_cpu(setting) & 0x20 ? "16-bit" : "8-bit");
1252 print_field(" # of bits padding at MSB: %d",
1253 (le16_to_cpu(setting) & 0x1c) >> 2);
1256 switch (air_coding_format) {
1267 str = "Transparent Data";
1274 print_field(" Air Coding Format: %s", str);
1277 static void print_retransmission_effort(uint8_t effort)
1283 str = "No retransmissions";
1286 str = "Optimize for power consumption";
1289 str = "Optimize for link quality";
1299 print_field("Retransmission effort: %s (0x%2.2x)", str, effort);
1302 static void print_scan_enable(uint8_t scan_enable)
1306 switch (scan_enable) {
1311 str = "Inquiry Scan";
1317 str = "Inquiry Scan + Page Scan";
1324 print_field("Scan enable: %s (0x%2.2x)", str, scan_enable);
1327 static void print_link_policy(uint16_t link_policy)
1329 uint16_t policy = le16_to_cpu(link_policy);
1331 print_field("Link policy: 0x%4.4x", policy);
1333 if (policy == 0x0000) {
1334 print_field(" Disable All Modes");
1338 if (policy & 0x0001)
1339 print_field(" Enable Role Switch");
1340 if (policy & 0x0002)
1341 print_field(" Enable Hold Mode");
1342 if (policy & 0x0004)
1343 print_field(" Enable Sniff Mode");
1344 if (policy & 0x0008)
1345 print_field(" Enable Park State");
1348 static void print_air_mode(uint8_t mode)
1363 str = "Transparent";
1370 print_field("Air mode: %s (0x%2.2x)", str, mode);
1373 static void print_codec_id(const char *label, uint8_t codec)
1388 str = "Transparent";
1400 str = "Vendor specific";
1407 print_field("%s: %s (0x%2.2x)", label, str, codec);
1410 void packet_print_codec_id(const char *label, uint8_t codec)
1412 print_codec_id(label, codec);
1415 static const struct bitfield_data codec_transport_table[] = {
1416 { 0, "Codec supported over BR/EDR ACL" },
1417 { 1, "Codec supported over BR/EDR SCO and eSCO"},
1418 { 2, "Codec supported over LE CIS" },
1419 { 3, "Codec supported over LE BIS" },
1423 static void print_codec(const char *label, const struct bt_hci_codec *codec)
1427 print_codec_id(label, codec->id);
1428 print_field(" Logical Transport Type: 0x%02x", codec->transport);
1429 mask = print_bitfield(4, codec->transport, codec_transport_table);
1431 print_text(COLOR_UNKNOWN_SERVICE_CLASS,
1432 " Unknown transport (0x%2.2x)", mask);
1435 static void print_inquiry_mode(uint8_t mode)
1441 str = "Standard Inquiry Result";
1444 str = "Inquiry Result with RSSI";
1447 str = "Inquiry Result with RSSI or Extended Inquiry Result";
1454 print_field("Mode: %s (0x%2.2x)", str, mode);
1457 static void print_inquiry_scan_type(uint8_t type)
1463 str = "Standard Scan";
1466 str = "Interlaced Scan";
1473 print_field("Type: %s (0x%2.2x)", str, type);
1476 static void print_pscan_type(uint8_t type)
1482 str = "Standard Scan";
1485 str = "Interlaced Scan";
1492 print_field("Type: %s (0x%2.2x)", str, type);
1495 static void print_loopback_mode(uint8_t mode)
1501 str = "No Loopback";
1504 str = "Local Loopback";
1507 str = "Remote Loopback";
1514 print_field("Mode: %s (0x%2.2x)", str, mode);
1517 static void print_auth_payload_timeout(uint16_t timeout)
1519 print_field("Timeout: %d msec (0x%4.4x)",
1520 le16_to_cpu(timeout) * 10, le16_to_cpu(timeout));
1523 static void print_pscan_rep_mode(uint8_t pscan_rep_mode)
1527 switch (pscan_rep_mode) {
1542 print_field("Page scan repetition mode: %s (0x%2.2x)",
1543 str, pscan_rep_mode);
1546 static void print_pscan_period_mode(uint8_t pscan_period_mode)
1550 switch (pscan_period_mode) {
1565 print_field("Page period mode: %s (0x%2.2x)", str, pscan_period_mode);
1568 static void print_pscan_mode(uint8_t pscan_mode)
1572 switch (pscan_mode) {
1580 str = "Optional II";
1583 str = "Optional III";
1590 print_field("Page scan mode: %s (0x%2.2x)", str, pscan_mode);
1593 static void print_clock_offset(uint16_t clock_offset)
1595 print_field("Clock offset: 0x%4.4x", le16_to_cpu(clock_offset));
1598 static void print_clock(uint32_t clock)
1600 print_field("Clock: 0x%8.8x", le32_to_cpu(clock));
1603 static void print_clock_type(uint8_t type)
1609 str = "Local clock";
1612 str = "Piconet clock";
1619 print_field("Type: %s (0x%2.2x)", str, type);
1622 static void print_clock_accuracy(uint16_t accuracy)
1624 if (le16_to_cpu(accuracy) == 0xffff)
1625 print_field("Accuracy: Unknown (0x%4.4x)",
1626 le16_to_cpu(accuracy));
1628 print_field("Accuracy: %.4f msec (0x%4.4x)",
1629 le16_to_cpu(accuracy) * 0.3125,
1630 le16_to_cpu(accuracy));
1633 static void print_lpo_allowed(uint8_t lpo_allowed)
1635 print_field("LPO allowed: 0x%2.2x", lpo_allowed);
1638 static void print_broadcast_fragment(uint8_t fragment)
1644 str = "Continuation fragment";
1647 str = "Starting fragment";
1650 str = "Ending fragment";
1653 str = "No fragmentation";
1660 print_field("Fragment: %s (0x%2.2x)", str, fragment);
1663 static void print_link_type(uint8_t link_type)
1667 switch (link_type) {
1682 print_field("Link type: %s (0x%2.2x)", str, link_type);
1685 static void print_encr_mode_change(uint8_t encr_mode, uint16_t handle)
1690 conn_type = get_type(le16_to_cpu(handle));
1692 switch (encr_mode) {
1697 switch (conn_type) {
1699 str = "Enabled with E0";
1702 str = "Enabled with AES-CCM";
1710 str = "Enabled with AES-CCM";
1717 print_field("Encryption: %s (0x%2.2x)", str, encr_mode);
1720 static void print_pin_type(uint8_t pin_type)
1736 print_field("PIN type: %s (0x%2.2x)", str, pin_type);
1739 static void print_key_flag(uint8_t key_flag)
1745 str = "Semi-permanent";
1755 print_field("Key flag: %s (0x%2.2x)", str, key_flag);
1758 static void print_key_len(uint8_t key_len)
1771 print_field("Key length: %s (%d)", str, key_len);
1774 static void print_key_type(uint8_t key_type)
1780 str = "Combination key";
1783 str = "Local Unit key";
1786 str = "Remote Unit key";
1789 str = "Debug Combination key";
1792 str = "Unauthenticated Combination key from P-192";
1795 str = "Authenticated Combination key from P-192";
1798 str = "Changed Combination key";
1801 str = "Unauthenticated Combination key from P-256";
1804 str = "Authenticated Combination key from P-256";
1811 print_field("Key type: %s (0x%2.2x)", str, key_type);
1814 static void print_key_size(uint8_t key_size)
1816 print_field("Key size: %d", key_size);
1819 static void print_key(const char *label, const uint8_t *link_key)
1821 print_hex_field(label, link_key, 16);
1824 static void print_link_key(const uint8_t *link_key)
1826 print_key("Link key", link_key);
1829 static void print_pin_code(const uint8_t *pin_code, uint8_t pin_len)
1831 char str[pin_len + 1];
1834 for (i = 0; i < pin_len; i++)
1835 sprintf(str + i, "%c", (const char) pin_code[i]);
1837 print_field("PIN code: %s", str);
1840 static void print_hash_p192(const uint8_t *hash)
1842 print_key("Hash C from P-192", hash);
1845 static void print_hash_p256(const uint8_t *hash)
1847 print_key("Hash C from P-256", hash);
1850 static void print_randomizer_p192(const uint8_t *randomizer)
1852 print_key("Randomizer R with P-192", randomizer);
1855 static void print_randomizer_p256(const uint8_t *randomizer)
1857 print_key("Randomizer R with P-256", randomizer);
1860 static void print_pk256(const char *label, const uint8_t *key)
1862 print_field("%s:", label);
1863 print_hex_field(" X", &key[0], 32);
1864 print_hex_field(" Y", &key[32], 32);
1867 static void print_dhkey(const uint8_t *dhkey)
1869 print_hex_field("Diffie-Hellman key", dhkey, 32);
1872 static void print_passkey(uint32_t passkey)
1874 print_field("Passkey: %06d", le32_to_cpu(passkey));
1877 static void print_io_capability(uint8_t capability)
1881 switch (capability) {
1883 str = "DisplayOnly";
1886 str = "DisplayYesNo";
1889 str = "KeyboardOnly";
1892 str = "NoInputNoOutput";
1899 print_field("IO capability: %s (0x%2.2x)", str, capability);
1902 static void print_oob_data(uint8_t oob_data)
1908 str = "Authentication data not present";
1911 str = "P-192 authentication data present";
1914 str = "P-256 authentication data present";
1917 str = "P-192 and P-256 authentication data present";
1924 print_field("OOB data: %s (0x%2.2x)", str, oob_data);
1927 static void print_oob_data_response(uint8_t oob_data)
1933 str = "Authentication data not present";
1936 str = "Authentication data present";
1943 print_field("OOB data: %s (0x%2.2x)", str, oob_data);
1946 static void print_authentication(uint8_t authentication)
1950 switch (authentication) {
1952 str = "No Bonding - MITM not required";
1955 str = "No Bonding - MITM required";
1958 str = "Dedicated Bonding - MITM not required";
1961 str = "Dedicated Bonding - MITM required";
1964 str = "General Bonding - MITM not required";
1967 str = "General Bonding - MITM required";
1974 print_field("Authentication: %s (0x%2.2x)", str, authentication);
1977 void packet_print_io_capability(uint8_t capability)
1979 print_io_capability(capability);
1982 void packet_print_io_authentication(uint8_t authentication)
1984 print_authentication(authentication);
1987 static void print_location_domain_aware(uint8_t aware)
1993 str = "Regulatory domain unknown";
1996 str = "Regulatory domain known";
2003 print_field("Domain aware: %s (0x%2.2x)", str, aware);
2006 static void print_location_domain(const uint8_t *domain)
2008 print_field("Domain: %c%c (0x%2.2x%2.2x)",
2009 (char) domain[0], (char) domain[1], domain[0], domain[1]);
2012 static void print_location_domain_options(uint8_t options)
2014 print_field("Domain options: %c (0x%2.2x)", (char) options, options);
2017 static void print_location_options(uint8_t options)
2019 print_field("Options: 0x%2.2x", options);
2022 static void print_flow_control_mode(uint8_t mode)
2028 str = "Packet based";
2031 str = "Data block based";
2038 print_field("Flow control mode: %s (0x%2.2x)", str, mode);
2041 static void print_flow_direction(uint8_t direction)
2045 switch (direction) {
2057 print_field("Flow direction: %s (0x%2.2x)", str, direction);
2060 static void print_service_type(uint8_t service_type)
2064 switch (service_type) {
2069 str = "Best Effort";
2079 print_field("Service type: %s (0x%2.2x)", str, service_type);
2082 static void print_flow_spec(const char *label, const uint8_t *data)
2091 str = "Best effort";
2101 print_field("%s flow spec: 0x%2.2x", label, data[0]);
2102 print_field(" Service type: %s (0x%2.2x)", str, data[1]);
2103 print_field(" Maximum SDU size: 0x%4.4x", get_le16(data + 2));
2104 print_field(" SDU inter-arrival time: 0x%8.8x", get_le32(data + 4));
2105 print_field(" Access latency: 0x%8.8x", get_le32(data + 8));
2106 print_field(" Flush timeout: 0x%8.8x", get_le32(data + 12));
2109 static void print_amp_status(uint8_t amp_status)
2113 switch (amp_status) {
2118 str = "Bluetooth only";
2121 str = "No capacity";
2124 str = "Low capacity";
2127 str = "Medium capacity";
2130 str = "High capacity";
2133 str = "Full capacity";
2140 print_field("AMP status: %s (0x%2.2x)", str, amp_status);
2143 static void print_num_resp(uint8_t num_resp)
2145 print_field("Num responses: %d", num_resp);
2148 static void print_num_reports(uint8_t num_reports)
2150 print_field("Num reports: %d", num_reports);
2153 static void print_adv_event_type(const char *label, uint8_t type)
2159 str = "Connectable undirected - ADV_IND";
2162 str = "Connectable directed - ADV_DIRECT_IND";
2165 str = "Scannable undirected - ADV_SCAN_IND";
2168 str = "Non connectable undirected - ADV_NONCONN_IND";
2171 str = "Scan response - SCAN_RSP";
2178 print_field("%s: %s (0x%2.2x)", label, str, type);
2181 static void print_adv_channel_map(const char *label, uint8_t value)
2212 print_field("%s: %s (0x%2.2x)", label, str, value);
2215 static void print_adv_filter_policy(const char *label, uint8_t value)
2221 str = "Allow Scan Request from Any, "
2222 "Allow Connect Request from Any";
2225 str = "Allow Scan Request from Accept List Only, "
2226 "Allow Connect Request from Any";
2229 str = "Allow Scan Request from Any, "
2230 "Allow Connect Request from Accept List Only";
2233 str = "Allow Scan Request from Accept List Only, "
2234 "Allow Connect Request from Accept List Only";
2241 print_field("%s: %s (0x%2.2x)", label, str, value);
2244 static void print_rssi(int8_t rssi)
2246 packet_print_rssi("RSSI", rssi);
2249 static void print_slot_625(const char *label, uint16_t value)
2251 print_field("%s: %.3f msec (0x%4.4x)", label,
2252 le16_to_cpu(value) * 0.625, le16_to_cpu(value));
2255 static void print_slot_125(const char *label, uint16_t value)
2257 print_field("%s: %.2f msec (0x%4.4x)", label,
2258 le16_to_cpu(value) * 1.25, le16_to_cpu(value));
2261 static void print_timeout(uint16_t timeout)
2263 print_slot_625("Timeout", timeout);
2266 static void print_interval(uint16_t interval)
2268 print_slot_625("Interval", interval);
2271 static void print_window(uint16_t window)
2273 print_slot_625("Window", window);
2276 static void print_conn_latency(const char *label, uint16_t value)
2278 print_field("%s: %u (0x%4.4x)", label, le16_to_cpu(value),
2279 le16_to_cpu(value));
2282 static void print_role(uint8_t role)
2298 print_field("Role: %s (0x%2.2x)", str, role);
2301 static void print_mode(uint8_t mode)
2323 print_field("Mode: %s (0x%2.2x)", str, mode);
2326 static void print_name(const uint8_t *name)
2330 memcpy(str, name, 248);
2333 print_field("Name: %s", str);
2336 static void print_channel_map(const uint8_t *map)
2338 unsigned int count = 0, start = 0;
2342 for (i = 0; i < 10; i++)
2343 sprintf(str + (i * 2), "%2.2x", map[i]);
2345 print_field("Channel map: 0x%s", str);
2347 for (i = 0; i < 10; i++) {
2348 for (n = 0; n < 8; n++) {
2349 if (map[i] & (1 << n)) {
2351 start = (i * 8) + n;
2357 print_field(" Channel %u-%u",
2358 start, start + count - 1);
2360 } else if (count > 0) {
2361 print_field(" Channel %u", start);
2368 void packet_print_channel_map_lmp(const uint8_t *map)
2370 print_channel_map(map);
2373 static void print_flush_timeout(uint16_t timeout)
2376 print_timeout(timeout);
2378 print_field("Timeout: No Automatic Flush");
2381 void packet_print_version(const char *label, uint8_t version,
2382 const char *sublabel, uint16_t subversion)
2388 str = "Bluetooth 1.0b";
2391 str = "Bluetooth 1.1";
2394 str = "Bluetooth 1.2";
2397 str = "Bluetooth 2.0";
2400 str = "Bluetooth 2.1";
2403 str = "Bluetooth 3.0";
2406 str = "Bluetooth 4.0";
2409 str = "Bluetooth 4.1";
2412 str = "Bluetooth 4.2";
2415 str = "Bluetooth 5.0";
2418 str = "Bluetooth 5.1";
2421 str = "Bluetooth 5.2";
2424 str = "Bluetooth 5.3";
2432 print_field("%s: %s (0x%2.2x) - %s %d (0x%4.4x)",
2433 label, str, version,
2434 sublabel, subversion, subversion);
2436 print_field("%s: %s (0x%2.2x)", label, str, version);
2439 static void print_hci_version(uint8_t version, uint16_t revision)
2441 packet_print_version("HCI version", version,
2442 "Revision", le16_to_cpu(revision));
2445 static void print_lmp_version(uint8_t version, uint16_t subversion)
2447 packet_print_version("LMP version", version,
2448 "Subversion", le16_to_cpu(subversion));
2451 static void print_pal_version(uint8_t version, uint16_t subversion)
2457 str = "Bluetooth 3.0";
2464 print_field("PAL version: %s (0x%2.2x) - Subversion %d (0x%4.4x)",
2466 le16_to_cpu(subversion),
2467 le16_to_cpu(subversion));
2470 void packet_print_company(const char *label, uint16_t company)
2472 print_field("%s: %s (%d)", label, bt_compidtostr(company), company);
2475 static void print_manufacturer(uint16_t manufacturer)
2477 packet_print_company("Manufacturer", le16_to_cpu(manufacturer));
2480 static const struct {
2483 } broadcom_uart_subversion_table[] = {
2484 { 0x210b, "BCM43142A0" }, /* 001.001.011 */
2485 { 0x410e, "BCM43341B0" }, /* 002.001.014 */
2486 { 0x4406, "BCM4324B3" }, /* 002.004.006 */
2490 static const struct {
2493 } broadcom_usb_subversion_table[] = {
2494 { 0x210b, "BCM43142A0" }, /* 001.001.011 */
2495 { 0x2112, "BCM4314A0" }, /* 001.001.018 */
2496 { 0x2118, "BCM20702A0" }, /* 001.001.024 */
2497 { 0x2126, "BCM4335A0" }, /* 001.001.038 */
2498 { 0x220e, "BCM20702A1" }, /* 001.002.014 */
2499 { 0x230f, "BCM4354A2" }, /* 001.003.015 */
2500 { 0x4106, "BCM4335B0" }, /* 002.001.006 */
2501 { 0x410e, "BCM20702B0" }, /* 002.001.014 */
2502 { 0x6109, "BCM4335C0" }, /* 003.001.009 */
2503 { 0x610c, "BCM4354" }, /* 003.001.012 */
2507 static void print_manufacturer_broadcom(uint16_t subversion, uint16_t revision)
2509 uint16_t ver = le16_to_cpu(subversion);
2510 uint16_t rev = le16_to_cpu(revision);
2511 const char *str = NULL;
2514 switch ((rev & 0xf000) >> 12) {
2517 for (i = 0; broadcom_uart_subversion_table[i].str; i++) {
2518 if (broadcom_uart_subversion_table[i].ver == ver) {
2519 str = broadcom_uart_subversion_table[i].str;
2526 for (i = 0; broadcom_usb_subversion_table[i].str; i++) {
2527 if (broadcom_usb_subversion_table[i].ver == ver) {
2528 str = broadcom_usb_subversion_table[i].str;
2536 print_field(" Firmware: %3.3u.%3.3u.%3.3u (%s)",
2537 (ver & 0xe000) >> 13,
2538 (ver & 0x1f00) >> 8, ver & 0x00ff, str);
2540 print_field(" Firmware: %3.3u.%3.3u.%3.3u",
2541 (ver & 0xe000) >> 13,
2542 (ver & 0x1f00) >> 8, ver & 0x00ff);
2545 print_field(" Build: %4.4u", rev & 0x0fff);
2548 static const char *get_supported_command(int bit);
2550 static void print_commands(const uint8_t *commands)
2552 unsigned int count = 0;
2555 for (i = 0; i < 64; i++) {
2556 for (n = 0; n < 8; n++) {
2557 if (commands[i] & (1 << n))
2562 print_field("Commands: %u entr%s", count, count == 1 ? "y" : "ies");
2564 for (i = 0; i < 64; i++) {
2565 for (n = 0; n < 8; n++) {
2568 if (!(commands[i] & (1 << n)))
2571 cmd = get_supported_command((i * 8) + n);
2573 print_field(" %s (Octet %d - Bit %d)",
2576 print_text(COLOR_UNKNOWN_COMMAND_BIT,
2577 " Octet %d - Bit %d ", i, n);
2582 static const struct bitfield_data features_page0[] = {
2583 { 0, "3 slot packets" },
2584 { 1, "5 slot packets" },
2585 { 2, "Encryption" },
2586 { 3, "Slot offset" },
2587 { 4, "Timing accuracy" },
2588 { 5, "Role switch" },
2590 { 7, "Sniff mode" },
2591 { 8, "Park state" },
2592 { 9, "Power control requests" },
2593 { 10, "Channel quality driven data rate (CQDDR)"},
2595 { 12, "HV2 packets" },
2596 { 13, "HV3 packets" },
2597 { 14, "u-law log synchronous data" },
2598 { 15, "A-law log synchronous data" },
2599 { 16, "CVSD synchronous data" },
2600 { 17, "Paging parameter negotiation" },
2601 { 18, "Power control" },
2602 { 19, "Transparent synchronous data" },
2603 { 20, "Flow control lag (least significant bit)"},
2604 { 21, "Flow control lag (middle bit)" },
2605 { 22, "Flow control lag (most significant bit)" },
2606 { 23, "Broadcast Encryption" },
2607 { 25, "Enhanced Data Rate ACL 2 Mbps mode" },
2608 { 26, "Enhanced Data Rate ACL 3 Mbps mode" },
2609 { 27, "Enhanced inquiry scan" },
2610 { 28, "Interlaced inquiry scan" },
2611 { 29, "Interlaced page scan" },
2612 { 30, "RSSI with inquiry results" },
2613 { 31, "Extended SCO link (EV3 packets)" },
2614 { 32, "EV4 packets" },
2615 { 33, "EV5 packets" },
2616 { 35, "AFH capable peripheral" },
2617 { 36, "AFH classification peripheral" },
2618 { 37, "BR/EDR Not Supported" },
2619 { 38, "LE Supported (Controller)" },
2620 { 39, "3-slot Enhanced Data Rate ACL packets" },
2621 { 40, "5-slot Enhanced Data Rate ACL packets" },
2622 { 41, "Sniff subrating" },
2623 { 42, "Pause encryption" },
2624 { 43, "AFH capable central" },
2625 { 44, "AFH classification central" },
2626 { 45, "Enhanced Data Rate eSCO 2 Mbps mode" },
2627 { 46, "Enhanced Data Rate eSCO 3 Mbps mode" },
2628 { 47, "3-slot Enhanced Data Rate eSCO packets" },
2629 { 48, "Extended Inquiry Response" },
2630 { 49, "Simultaneous LE and BR/EDR (Controller)" },
2631 { 51, "Secure Simple Pairing" },
2632 { 52, "Encapsulated PDU" },
2633 { 53, "Erroneous Data Reporting" },
2634 { 54, "Non-flushable Packet Boundary Flag" },
2635 { 56, "Link Supervision Timeout Changed Event" },
2636 { 57, "Inquiry TX Power Level" },
2637 { 58, "Enhanced Power Control" },
2638 { 63, "Extended features" },
2642 static const struct bitfield_data features_page1[] = {
2643 { 0, "Secure Simple Pairing (Host Support)" },
2644 { 1, "LE Supported (Host)" },
2645 { 2, "Simultaneous LE and BR/EDR (Host)" },
2646 { 3, "Secure Connections (Host Support)" },
2650 static const struct bitfield_data features_page2[] = {
2651 { 0, "Connectionless Peripheral Broadcast - Central" },
2652 { 1, "Connectionless Peripheral Broadcast - Peripheral"},
2653 { 2, "Synchronization Train" },
2654 { 3, "Synchronization Scan" },
2655 { 4, "Inquiry Response Notification Event" },
2656 { 5, "Generalized interlaced scan" },
2657 { 6, "Coarse Clock Adjustment" },
2658 { 8, "Secure Connections (Controller Support)" },
2660 { 10, "Slot Availability Mask" },
2661 { 11, "Train nudging" },
2665 static const struct bitfield_data features_le[] = {
2666 { 0, "LE Encryption" },
2667 { 1, "Connection Parameter Request Procedure" },
2668 { 2, "Extended Reject Indication" },
2669 { 3, "Peripheral-initiated Features Exchange" },
2671 { 5, "LE Data Packet Length Extension" },
2672 { 6, "LL Privacy" },
2673 { 7, "Extended Scanner Filter Policies" },
2675 { 9, "Stable Modulation Index - Transmitter" },
2676 { 10, "Stable Modulation Index - Receiver" },
2677 { 11, "LE Coded PHY" },
2678 { 12, "LE Extended Advertising" },
2679 { 13, "LE Periodic Advertising" },
2680 { 14, "Channel Selection Algorithm #2" },
2681 { 15, "LE Power Class 1" },
2682 { 16, "Minimum Number of Used Channels Procedure" },
2683 { 17, "Connection CTE Request" },
2684 { 18, "Connection CTE Response" },
2685 { 19, "Connectionless CTE Transmitter" },
2686 { 20, "Connectionless CTE Receiver" },
2687 { 21, "Antenna Switching During CTE Transmission (AoD)" },
2688 { 22, "Antenna Switching During CTE Reception (AoA)" },
2689 { 23, "Receiving Constant Tone Extensions" },
2690 { 24, "Periodic Advertising Sync Transfer - Sender" },
2691 { 25, "Periodic Advertising Sync Transfer - Recipient" },
2692 { 26, "Sleep Clock Accuracy Updates" },
2693 { 27, "Remote Public Key Validation" },
2694 { 28, "Connected Isochronous Stream - Central" },
2695 { 29, "Connected Isochronous Stream - Peripheral" },
2696 { 30, "Isochronous Broadcaster" },
2697 { 31, "Synchronized Receiver" },
2698 { 32, "Isochronous Channels (Host Support)" },
2699 { 33, "LE Power Control Request" },
2700 { 34, "LE Power Control Request" },
2701 { 35, "LE Path Loss Monitoring" },
2702 { 36, "Periodic Advertising ADI support" },
2703 { 37, "Connection Subrating" },
2704 { 38, "Connection Subrating (Host Support)" },
2705 { 39, "Channel Classification" },
2709 static const struct bitfield_data features_msft[] = {
2710 { 0, "RSSI Monitoring feature for BR/EDR" },
2711 { 1, "RSSI Monitoring feature for LE connections" },
2712 { 2, "RSSI Monitoring of LE advertisements" },
2713 { 3, "Advertising Monitoring of LE advertisements" },
2714 { 4, "Verifying the validity of P-192 and P-256 keys" },
2715 { 5, "Continuous Advertising Monitoring" },
2719 static void print_features(uint8_t page, const uint8_t *features_array,
2722 const struct bitfield_data *features_table = NULL;
2723 uint64_t mask, features = 0;
2727 for (i = 0; i < 8; i++) {
2728 sprintf(str + (i * 5), " 0x%2.2x", features_array[i]);
2729 features |= ((uint64_t) features_array[i]) << (i * 8);
2732 print_field("Features:%s", str);
2738 features_table = features_page0;
2741 features_table = features_page1;
2744 features_table = features_page2;
2751 features_table = features_le;
2758 features_table = features_msft;
2764 if (!features_table)
2767 mask = print_bitfield(2, features, features_table);
2769 print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features "
2770 "(0x%16.16" PRIx64 ")", mask);
2773 void packet_print_features_lmp(const uint8_t *features, uint8_t page)
2775 print_features(page, features, 0x00);
2778 void packet_print_features_ll(const uint8_t *features)
2780 print_features(0, features, 0x01);
2783 void packet_print_features_msft(const uint8_t *features)
2785 print_features(0, features, 0xf0);
2788 #define LE_STATE_SCAN_ADV 0x0001
2789 #define LE_STATE_CONN_ADV 0x0002
2790 #define LE_STATE_NONCONN_ADV 0x0004
2791 #define LE_STATE_HIGH_DIRECT_ADV 0x0008
2792 #define LE_STATE_LOW_DIRECT_ADV 0x0010
2793 #define LE_STATE_ACTIVE_SCAN 0x0020
2794 #define LE_STATE_PASSIVE_SCAN 0x0040
2795 #define LE_STATE_INITIATING 0x0080
2796 #define LE_STATE_CONN_CENTRAL 0x0100
2797 #define LE_STATE_CONN_PERIPHERAL 0x0200
2798 #define LE_STATE_CENTRAL_CENTRAL 0x0400
2799 #define LE_STATE_PERIPHERAL_PERIPHERAL 0x0800
2800 #define LE_STATE_CENTRAL_PERIPHERAL 0x1000
2802 static const struct bitfield_data le_states_desc_table[] = {
2803 { 0, "Scannable Advertising State" },
2804 { 1, "Connectable Advertising State" },
2805 { 2, "Non-connectable Advertising State" },
2806 { 3, "High Duty Cycle Directed Advertising State" },
2807 { 4, "Low Duty Cycle Directed Advertising State" },
2808 { 5, "Active Scanning State" },
2809 { 6, "Passive Scanning State" },
2810 { 7, "Initiating State" },
2811 { 8, "Connection State (Central Role)" },
2812 { 9, "Connection State (Peripheral Role)" },
2813 { 10, "Central Role & Central Role" },
2814 { 11, "Peripheral Role & Peripheral Role" },
2815 { 12, "Central Role & Peripheral Role" },
2819 static const struct {
2822 } le_states_comb_table[] = {
2823 { 0, LE_STATE_NONCONN_ADV },
2824 { 1, LE_STATE_SCAN_ADV },
2825 { 2, LE_STATE_CONN_ADV },
2826 { 3, LE_STATE_HIGH_DIRECT_ADV },
2827 { 4, LE_STATE_PASSIVE_SCAN },
2828 { 5, LE_STATE_ACTIVE_SCAN },
2829 { 6, LE_STATE_INITIATING | LE_STATE_CONN_CENTRAL },
2830 { 7, LE_STATE_CONN_PERIPHERAL },
2831 { 8, LE_STATE_PASSIVE_SCAN | LE_STATE_NONCONN_ADV },
2832 { 9, LE_STATE_PASSIVE_SCAN | LE_STATE_SCAN_ADV },
2833 { 10, LE_STATE_PASSIVE_SCAN | LE_STATE_CONN_ADV },
2834 { 11, LE_STATE_PASSIVE_SCAN | LE_STATE_HIGH_DIRECT_ADV },
2835 { 12, LE_STATE_ACTIVE_SCAN | LE_STATE_NONCONN_ADV },
2836 { 13, LE_STATE_ACTIVE_SCAN | LE_STATE_SCAN_ADV },
2837 { 14, LE_STATE_ACTIVE_SCAN | LE_STATE_CONN_ADV },
2838 { 15, LE_STATE_ACTIVE_SCAN | LE_STATE_HIGH_DIRECT_ADV },
2839 { 16, LE_STATE_INITIATING | LE_STATE_NONCONN_ADV },
2840 { 17, LE_STATE_INITIATING | LE_STATE_SCAN_ADV },
2841 { 18, LE_STATE_CONN_CENTRAL | LE_STATE_NONCONN_ADV },
2842 { 19, LE_STATE_CONN_CENTRAL | LE_STATE_SCAN_ADV },
2843 { 20, LE_STATE_CONN_PERIPHERAL | LE_STATE_NONCONN_ADV },
2844 { 21, LE_STATE_CONN_PERIPHERAL | LE_STATE_SCAN_ADV },
2845 { 22, LE_STATE_INITIATING | LE_STATE_PASSIVE_SCAN },
2846 { 23, LE_STATE_INITIATING | LE_STATE_ACTIVE_SCAN },
2847 { 24, LE_STATE_CONN_CENTRAL | LE_STATE_PASSIVE_SCAN },
2848 { 25, LE_STATE_CONN_CENTRAL | LE_STATE_ACTIVE_SCAN },
2849 { 26, LE_STATE_CONN_PERIPHERAL | LE_STATE_PASSIVE_SCAN },
2850 { 27, LE_STATE_CONN_PERIPHERAL | LE_STATE_ACTIVE_SCAN },
2851 { 28, LE_STATE_INITIATING | LE_STATE_CONN_CENTRAL |
2852 LE_STATE_CENTRAL_CENTRAL },
2853 { 29, LE_STATE_LOW_DIRECT_ADV },
2854 { 30, LE_STATE_LOW_DIRECT_ADV | LE_STATE_PASSIVE_SCAN },
2855 { 31, LE_STATE_LOW_DIRECT_ADV | LE_STATE_ACTIVE_SCAN },
2856 { 32, LE_STATE_INITIATING | LE_STATE_CONN_ADV |
2857 LE_STATE_CENTRAL_PERIPHERAL },
2858 { 33, LE_STATE_INITIATING | LE_STATE_HIGH_DIRECT_ADV |
2859 LE_STATE_CENTRAL_PERIPHERAL },
2860 { 34, LE_STATE_INITIATING | LE_STATE_LOW_DIRECT_ADV |
2861 LE_STATE_CENTRAL_PERIPHERAL },
2862 { 35, LE_STATE_CONN_CENTRAL | LE_STATE_CONN_ADV |
2863 LE_STATE_CENTRAL_PERIPHERAL },
2864 { 36, LE_STATE_CONN_CENTRAL | LE_STATE_HIGH_DIRECT_ADV |
2865 LE_STATE_CENTRAL_PERIPHERAL },
2866 { 37, LE_STATE_CONN_CENTRAL | LE_STATE_LOW_DIRECT_ADV |
2867 LE_STATE_CENTRAL_PERIPHERAL },
2868 { 38, LE_STATE_CONN_PERIPHERAL | LE_STATE_CONN_ADV |
2869 LE_STATE_CENTRAL_PERIPHERAL },
2870 { 39, LE_STATE_CONN_PERIPHERAL | LE_STATE_HIGH_DIRECT_ADV |
2871 LE_STATE_PERIPHERAL_PERIPHERAL },
2872 { 40, LE_STATE_CONN_PERIPHERAL | LE_STATE_LOW_DIRECT_ADV |
2873 LE_STATE_PERIPHERAL_PERIPHERAL },
2874 { 41, LE_STATE_INITIATING | LE_STATE_CONN_PERIPHERAL |
2875 LE_STATE_CENTRAL_PERIPHERAL },
2879 static void print_le_states(const uint8_t *states_array)
2881 uint64_t mask, states = 0;
2885 for (i = 0; i < 8; i++)
2886 states |= ((uint64_t) states_array[i]) << (i * 8);
2888 print_field("States: 0x%16.16" PRIx64, states);
2892 for (i = 0; le_states_comb_table[i].states; i++) {
2893 uint64_t val = (((uint64_t) 1) << le_states_comb_table[i].bit);
2894 const char *str[3] = { NULL, };
2897 if (!(states & val))
2900 for (n = 0; n < ARRAY_SIZE(le_states_desc_table); n++) {
2901 if (le_states_comb_table[i].states & (1 << n))
2902 str[num++] = le_states_desc_table[n].str;
2906 print_field(" %s", str[0]);
2907 for (n = 1; n < num; n++)
2908 print_field(" and %s", str[n]);
2915 print_text(COLOR_UNKNOWN_LE_STATES, " Unknown states "
2916 "(0x%16.16" PRIx64 ")", mask);
2919 static void print_le_channel_map(const uint8_t *map)
2921 unsigned int count = 0, start = 0;
2925 for (i = 0; i < 5; i++)
2926 sprintf(str + (i * 2), "%2.2x", map[i]);
2928 print_field("Channel map: 0x%s", str);
2930 for (i = 0; i < 5; i++) {
2931 for (n = 0; n < 8; n++) {
2932 if (map[i] & (1 << n)) {
2934 start = (i * 8) + n;
2940 print_field(" Channel %u-%u",
2941 start, start + count - 1);
2943 } else if (count > 0) {
2944 print_field(" Channel %u", start);
2951 void packet_print_channel_map_ll(const uint8_t *map)
2953 print_le_channel_map(map);
2956 static void print_random_number(uint64_t rand)
2958 print_field("Random number: 0x%16.16" PRIx64, le64_to_cpu(rand));
2961 static void print_encrypted_diversifier(uint16_t ediv)
2963 print_field("Encrypted diversifier: 0x%4.4x", le16_to_cpu(ediv));
2966 static const struct bitfield_data events_table[] = {
2967 { 0, "Inquiry Complete" },
2968 { 1, "Inquiry Result" },
2969 { 2, "Connection Complete" },
2970 { 3, "Connection Request" },
2971 { 4, "Disconnection Complete" },
2972 { 5, "Authentication Complete" },
2973 { 6, "Remote Name Request Complete" },
2974 { 7, "Encryption Change" },
2975 { 8, "Change Connection Link Key Complete" },
2976 { 9, "Link Key Type Changed" },
2977 { 10, "Read Remote Supported Features Complete" },
2978 { 11, "Read Remote Version Information Complete" },
2979 { 12, "QoS Setup Complete" },
2980 { 13, "Command Complete" },
2981 { 14, "Command Status" },
2982 { 15, "Hardware Error" },
2983 { 16, "Flush Occurred" },
2984 { 17, "Role Change" },
2985 { 18, "Number of Completed Packets" },
2986 { 19, "Mode Change" },
2987 { 20, "Return Link Keys" },
2988 { 21, "PIN Code Request" },
2989 { 22, "Link Key Request" },
2990 { 23, "Link Key Notification" },
2991 { 24, "Loopback Command" },
2992 { 25, "Data Buffer Overflow" },
2993 { 26, "Max Slots Change" },
2994 { 27, "Read Clock Offset Complete" },
2995 { 28, "Connection Packet Type Changed" },
2996 { 29, "QoS Violation" },
2997 { 30, "Page Scan Mode Change" },
2998 { 31, "Page Scan Repetition Mode Change" },
2999 { 32, "Flow Specification Complete" },
3000 { 33, "Inquiry Result with RSSI" },
3001 { 34, "Read Remote Extended Features Complete" },
3002 { 43, "Synchronous Connection Complete" },
3003 { 44, "Synchronous Connection Changed" },
3004 { 45, "Sniff Subrating" },
3005 { 46, "Extended Inquiry Result" },
3006 { 47, "Encryption Key Refresh Complete" },
3007 { 48, "IO Capability Request" },
3008 { 49, "IO Capability Request Reply" },
3009 { 50, "User Confirmation Request" },
3010 { 51, "User Passkey Request" },
3011 { 52, "Remote OOB Data Request" },
3012 { 53, "Simple Pairing Complete" },
3013 { 55, "Link Supervision Timeout Changed" },
3014 { 56, "Enhanced Flush Complete" },
3015 { 58, "User Passkey Notification" },
3016 { 59, "Keypress Notification" },
3017 { 60, "Remote Host Supported Features Notification" },
3022 static void print_event_mask(const uint8_t *events_array,
3023 const struct bitfield_data *table)
3025 uint64_t mask, events = 0;
3028 for (i = 0; i < 8; i++)
3029 events |= ((uint64_t) events_array[i]) << (i * 8);
3031 print_field("Mask: 0x%16.16" PRIx64, events);
3033 mask = print_bitfield(2, events, table);
3035 print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "
3036 "(0x%16.16" PRIx64 ")", mask);
3039 static const struct bitfield_data events_page2_table[] = {
3040 { 0, "Physical Link Complete" },
3041 { 1, "Channel Selected" },
3042 { 2, "Disconnection Physical Link Complete" },
3043 { 3, "Physical Link Loss Early Warning" },
3044 { 4, "Physical Link Recovery" },
3045 { 5, "Logical Link Complete" },
3046 { 6, "Disconnection Logical Link Complete" },
3047 { 7, "Flow Specification Modify Complete" },
3048 { 8, "Number of Completed Data Blocks" },
3049 { 9, "AMP Start Test" },
3050 { 10, "AMP Test End" },
3051 { 11, "AMP Receiver Report" },
3052 { 12, "Short Range Mode Change Complete" },
3053 { 13, "AMP Status Change" },
3054 { 14, "Triggered Clock Capture" },
3055 { 15, "Synchronization Train Complete" },
3056 { 16, "Synchronization Train Received" },
3057 { 17, "Connectionless Peripheral Broadcast Receive" },
3058 { 18, "Connectionless Peripheral Broadcast Timeout" },
3059 { 19, "Truncated Page Complete" },
3060 { 20, "Peripheral Page Response Timeout" },
3061 { 21, "Connectionless Peripheral Broadcast Channel Map Change" },
3062 { 22, "Inquiry Response Notification" },
3063 { 23, "Authenticated Payload Timeout Expired" },
3064 { 24, "SAM Status Change" },
3068 static const struct bitfield_data events_le_table[] = {
3069 { 0, "LE Connection Complete" },
3070 { 1, "LE Advertising Report" },
3071 { 2, "LE Connection Update Complete" },
3072 { 3, "LE Read Remote Used Features Complete" },
3073 { 4, "LE Long Term Key Request" },
3074 { 5, "LE Remote Connection Parameter Request" },
3075 { 6, "LE Data Length Change" },
3076 { 7, "LE Read Local P-256 Public Key Complete" },
3077 { 8, "LE Generate DHKey Complete" },
3078 { 9, "LE Enhanced Connection Complete" },
3079 { 10, "LE Direct Advertising Report" },
3080 { 11, "LE PHY Update Complete" },
3081 { 12, "LE Extended Advertising Report" },
3082 { 13, "LE Periodic Advertising Sync Established"},
3083 { 14, "LE Periodic Advertising Report" },
3084 { 15, "LE Periodic Advertising Sync Lost" },
3085 { 16, "LE Extended Scan Timeout" },
3086 { 17, "LE Extended Advertising Set Terminated" },
3087 { 18, "LE Scan Request Received" },
3088 { 19, "LE Channel Selection Algorithm" },
3089 { 24, "LE CIS Established" },
3090 { 25, "LE CIS Request" },
3091 { 26, "LE Create BIG Complete" },
3092 { 27, "LE Terminate BIG Complete" },
3093 { 28, "LE BIG Sync Estabilished Complete" },
3094 { 29, "LE BIG Sync Lost" },
3095 { 30, "LE Request Peer SCA Complete"},
3096 { 31, "LE Path Loss Threshold" },
3097 { 32, "LE Transmit Power Reporting" },
3098 { 33, "LE BIG Info Advertising Report" },
3099 { 34, "LE Subrate Change" },
3103 static void print_fec(uint8_t fec)
3109 str = "Not required";
3119 print_field("FEC: %s (0x%02x)", str, fec);
3122 #define BT_EIR_FLAGS 0x01
3123 #define BT_EIR_UUID16_SOME 0x02
3124 #define BT_EIR_UUID16_ALL 0x03
3125 #define BT_EIR_UUID32_SOME 0x04
3126 #define BT_EIR_UUID32_ALL 0x05
3127 #define BT_EIR_UUID128_SOME 0x06
3128 #define BT_EIR_UUID128_ALL 0x07
3129 #define BT_EIR_NAME_SHORT 0x08
3130 #define BT_EIR_NAME_COMPLETE 0x09
3131 #define BT_EIR_TX_POWER 0x0a
3132 #define BT_EIR_CLASS_OF_DEV 0x0d
3133 #define BT_EIR_SSP_HASH_P192 0x0e
3134 #define BT_EIR_SSP_RANDOMIZER_P192 0x0f
3135 #define BT_EIR_DEVICE_ID 0x10
3136 #define BT_EIR_SMP_TK 0x10
3137 #define BT_EIR_SMP_OOB_FLAGS 0x11
3138 #define BT_EIR_PERIPHERAL_CONN_INTERVAL 0x12
3139 #define BT_EIR_SERVICE_UUID16 0x14
3140 #define BT_EIR_SERVICE_UUID128 0x15
3141 #define BT_EIR_SERVICE_DATA 0x16
3142 #define BT_EIR_PUBLIC_ADDRESS 0x17
3143 #define BT_EIR_RANDOM_ADDRESS 0x18
3144 #define BT_EIR_GAP_APPEARANCE 0x19
3145 #define BT_EIR_ADVERTISING_INTERVAL 0x1a
3146 #define BT_EIR_LE_DEVICE_ADDRESS 0x1b
3147 #define BT_EIR_LE_ROLE 0x1c
3148 #define BT_EIR_SSP_HASH_P256 0x1d
3149 #define BT_EIR_SSP_RANDOMIZER_P256 0x1e
3150 #define BT_EIR_SERVICE_UUID32 0x1f
3151 #define BT_EIR_SERVICE_DATA32 0x20
3152 #define BT_EIR_SERVICE_DATA128 0x21
3153 #define BT_EIR_LE_SC_CONFIRM_VALUE 0x22
3154 #define BT_EIR_LE_SC_RANDOM_VALUE 0x23
3155 #define BT_EIR_URI 0x24
3156 #define BT_EIR_INDOOR_POSITIONING 0x25
3157 #define BT_EIR_TRANSPORT_DISCOVERY 0x26
3158 #define BT_EIR_LE_SUPPORTED_FEATURES 0x27
3159 #define BT_EIR_CHANNEL_MAP_UPDATE_IND 0x28
3160 #define BT_EIR_MESH_PROV 0x29
3161 #define BT_EIR_MESH_DATA 0x2a
3162 #define BT_EIR_MESH_BEACON 0x2b
3163 #define BT_EIR_CSIP_RSI 0x2e
3164 #define BT_EIR_3D_INFO_DATA 0x3d
3165 #define BT_EIR_MANUFACTURER_DATA 0xff
3167 static void print_manufacturer_apple(const void *data, uint8_t data_len)
3169 uint8_t type = *((uint8_t *) data);
3175 char identifier[100];
3177 snprintf(identifier, sizeof(identifier) - 1, "%s",
3178 (const char *) (data + 1));
3180 print_field(" Identifier: %s", identifier);
3184 while (data_len > 0) {
3188 type = *((uint8_t *) data);
3213 print_field(" Type: %s (%u)", str, type);
3215 len = *((uint8_t *) data);
3225 if (type == 0x02 && len == 0x15) {
3226 const uint8_t *uuid;
3227 uint16_t minor, major;
3231 print_field(" UUID: %8.8x-%4.4x-%4.4x-%4.4x-%8.8x%4.4x",
3232 get_le32(&uuid[12]), get_le16(&uuid[10]),
3233 get_le16(&uuid[8]), get_le16(&uuid[6]),
3234 get_le32(&uuid[2]), get_le16(&uuid[0]));
3236 major = get_le16(data + 16);
3237 minor = get_le16(data + 18);
3238 print_field(" Version: %u.%u", major, minor);
3240 tx_power = *(int8_t *) (data + 20);
3241 print_field(" TX power: %d dB", tx_power);
3243 print_hex_field(" Data", data, len);
3249 packet_hexdump(data, data_len);
3252 static void print_manufacturer_data(const void *data, uint8_t data_len)
3254 uint16_t company = get_le16(data);
3256 packet_print_company("Company", company);
3261 print_manufacturer_apple(data + 2, data_len - 2);
3264 print_hex_field(" Data", data + 2, data_len - 2);
3269 static void print_device_id(const void *data, uint8_t data_len)
3271 uint16_t source, vendor, product, version;
3272 char modalias[26], *vendor_str, *product_str;
3278 source = get_le16(data);
3279 vendor = get_le16(data + 2);
3280 product = get_le16(data + 4);
3281 version = get_le16(data + 6);
3285 str = "Bluetooth SIG assigned";
3286 sprintf(modalias, "bluetooth:v%04Xp%04Xd%04X",
3287 vendor, product, version);
3290 str = "USB Implementer's Forum assigned";
3291 sprintf(modalias, "usb:v%04Xp%04Xd%04X",
3292 vendor, product, version);
3300 print_field("Device ID: %s (0x%4.4x)", str, source);
3302 if (!hwdb_get_vendor_model(modalias, &vendor_str, &product_str)) {
3307 if (source != 0x0001) {
3309 print_field(" Vendor: %s (0x%4.4x)",
3310 vendor_str, vendor);
3312 print_field(" Vendor: 0x%4.4x", vendor);
3314 packet_print_company(" Vendor", vendor);
3317 print_field(" Product: %s (0x%4.4x)", product_str, product);
3319 print_field(" Product: 0x%4.4x", product);
3321 print_field(" Version: %u.%u.%u (0x%4.4x)",
3322 (version & 0xff00) >> 8,
3323 (version & 0x00f0) >> 4,
3324 (version & 0x000f), version);
3330 static void print_uuid16_list(const char *label, const void *data,
3333 uint8_t count = data_len / sizeof(uint16_t);
3336 print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
3338 for (i = 0; i < count; i++) {
3339 uint16_t uuid = get_le16(data + (i * 2));
3340 print_field(" %s (0x%4.4x)", bt_uuid16_to_str(uuid), uuid);
3344 static void print_uuid32_list(const char *label, const void *data,
3347 uint8_t count = data_len / sizeof(uint32_t);
3350 print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
3352 for (i = 0; i < count; i++) {
3353 uint32_t uuid = get_le32(data + (i * 4));
3354 print_field(" %s (0x%8.8x)", bt_uuid32_to_str(uuid), uuid);
3358 static void print_uuid128_list(const char *label, const void *data,
3361 uint8_t count = data_len / 16;
3364 print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
3366 for (i = 0; i < count; i++) {
3367 const uint8_t *uuid = data + (i * 16);
3369 print_field(" %s", bt_uuid128_to_str(uuid));
3373 static void *iov_pull(struct iovec *iov, size_t len)
3377 if (iov->iov_len < len)
3380 data = iov->iov_base;
3381 iov->iov_base += len;
3382 iov->iov_len -= len;
3387 static struct packet_ltv_decoder*
3388 get_ltv_decoder(struct packet_ltv_decoder *decoder, size_t num, uint8_t type)
3392 if (!decoder || !num)
3395 for (i = 0; i < num; i++) {
3396 struct packet_ltv_decoder *dec = &decoder[i];
3398 if (dec->type == type)
3405 static void print_ltv(const char *label, const uint8_t *data, uint8_t len,
3406 struct packet_ltv_decoder *decoder, size_t num)
3411 iov.iov_base = (void *) data;
3414 for (i = 0; iov.iov_len; i++) {
3416 struct packet_ltv_decoder *dec;
3418 l = get_u8(iov_pull(&iov, sizeof(l)));
3420 print_field("%s #%d: len 0x%02x", label, i, l);
3424 v = iov_pull(&iov, sizeof(*v));
3430 print_field("%s #%d: len 0x%02x type 0x%02x", label, i, l, t);
3434 v = iov_pull(&iov, l);
3438 dec = get_ltv_decoder(decoder, num, t);
3442 print_hex_field(label, v, l);
3446 print_hex_field(label, iov.iov_base, iov.iov_len);
3449 void packet_print_ltv(const char *label, const uint8_t *data, uint8_t len,
3450 struct packet_ltv_decoder *decoder, size_t decoder_len)
3452 print_ltv(label, data, len, decoder, decoder_len);
3455 static void print_base_annoucement(const uint8_t *data, uint8_t data_len)
3458 struct bt_hci_le_pa_base_data *base_data;
3461 iov.iov_base = (void *) data;
3462 iov.iov_len = data_len;
3464 base_data = iov_pull(&iov, sizeof(*base_data));
3468 /* Level 1 - BASE */
3469 print_field(" Presetation Delay: %u", get_le24(base_data->pd));
3470 print_field(" Number of Subgroups: %u", base_data->num_subgroups);
3472 /* Level 2 - Subgroups*/
3473 for (i = 0; i < base_data->num_subgroups; i++) {
3474 struct bt_hci_le_pa_base_subgroup *subgroup;
3475 struct bt_hci_lv_data *codec_cfg;
3476 struct bt_hci_lv_data *metadata;
3479 print_field(" Subgroup #%u:", i);
3481 subgroup = iov_pull(&iov, sizeof(*subgroup));
3485 print_field(" Number of BIS(s): %u", subgroup->num_bis);
3486 print_codec_id(" Codec", subgroup->codec.id);
3488 if (subgroup->codec.id == 0xff) {
3491 id = le16_to_cpu(subgroup->codec.vid);
3492 print_field(" Codec Company ID: %s (0x%04x)",
3493 bt_compidtostr(id), id);
3494 print_field(" Codec Vendor ID: 0x%04x",
3495 subgroup->codec.vid);
3498 codec_cfg = iov_pull(&iov, sizeof(*codec_cfg));
3502 if (!iov_pull(&iov, codec_cfg->len))
3505 print_ltv(" Codec Specific Configuration",
3506 codec_cfg->data, codec_cfg->len,
3509 metadata = iov_pull(&iov, sizeof(*metadata));
3513 if (!iov_pull(&iov, metadata->len))
3516 print_ltv(" Metadata", metadata->data, metadata->len,
3519 /* Level 3 - BIS(s)*/
3520 for (j = 0; j < subgroup->num_bis; j++) {
3521 struct bt_hci_le_pa_base_bis *bis;
3523 print_field(" BIS #%u:", j);
3525 bis = iov_pull(&iov, sizeof(*bis));
3529 print_field(" Index: %u", bis->index);
3531 codec_cfg = iov_pull(&iov, sizeof(*codec_cfg));
3535 if (!iov_pull(&iov, codec_cfg->len))
3538 print_hex_field(" Codec Specific Configuration",
3539 codec_cfg->data, codec_cfg->len);
3545 print_hex_field(" Data", iov.iov_base, iov.iov_len);
3548 static void print_broadcast_annoucement(const uint8_t *data, uint8_t data_len)
3553 print_hex_field(" Data", data, data_len);
3557 bid = get_le24(data);
3558 print_field("Broadcast ID: %u (0x%06x)", bid, bid);
3561 static const struct service_data_decoder {
3563 void (*func)(const uint8_t *data, uint8_t data_len);
3564 } service_data_decoders[] = {
3565 { 0x1851, print_base_annoucement },
3566 { 0x1852, print_broadcast_annoucement }
3569 static void print_service_data(const uint8_t *data, uint8_t data_len)
3571 uint16_t uuid = get_le16(&data[0]);
3574 print_field("Service Data: %s (0x%4.4x)", bt_uuid16_to_str(uuid), uuid);
3576 for (i = 0; i < ARRAY_SIZE(service_data_decoders); i++) {
3577 const struct service_data_decoder *decoder;
3579 decoder = &service_data_decoders[i];
3581 if (decoder->uuid == uuid) {
3582 decoder->func(&data[2], data_len - 2);
3587 print_hex_field(" Data", &data[2], data_len - 2);
3590 static const struct bitfield_data eir_flags_table[] = {
3591 { 0, "LE Limited Discoverable Mode" },
3592 { 1, "LE General Discoverable Mode" },
3593 { 2, "BR/EDR Not Supported" },
3594 { 3, "Simultaneous LE and BR/EDR (Controller)" },
3595 { 4, "Simultaneous LE and BR/EDR (Host)" },
3599 static const struct bitfield_data eir_3d_table[] = {
3600 { 0, "Association Notification" },
3601 { 1, "Battery Level Reporting" },
3602 { 2, "Send Battery Level Report on Start-up Synchronization" },
3603 { 7, "Factory Test Mode" },
3607 static const struct bitfield_data mesh_oob_table[] = {
3609 { 1, "Electronic / URI" },
3610 { 2, "2D machine-readable code" },
3612 { 4, "Near Field Communication (NFC)" },
3616 { 12, "Inside box" },
3617 { 13, "On piece of paper" },
3618 { 14, "Inside manual" },
3619 { 15, "On device" },
3623 static void print_mesh_beacon(const uint8_t *data, uint8_t len)
3627 print_hex_field("Mesh Beacon", data, len);
3634 print_field(" Unprovisioned Device Beacon (0x00)");
3636 packet_hexdump(data + 1, len - 1);
3640 print_hex_field(" Device UUID", data + 1, 16);
3642 oob = get_be16(data + 17);
3643 print_field(" OOB Information: 0x%4.4x", oob);
3645 print_bitfield(4, oob, mesh_oob_table);
3648 packet_hexdump(data + 18, len - 18);
3652 print_field(" URI Hash: 0x%8.8x", get_be32(data + 19));
3653 packet_hexdump(data + 23, len - 23);
3656 print_field(" Secure Network Beacon (0x01)");
3658 packet_hexdump(data + 1, len - 1);
3662 print_field(" Flags: 0x%2.2x", data[0]);
3665 print_field(" Key Refresh");
3668 print_field(" IV Update");
3670 print_hex_field(" Network Id", data + 2, 8);
3671 print_field(" IV Index: 0x%08x", get_be32(data + 10));
3672 print_hex_field(" Authentication Value", data + 14, 8);
3673 packet_hexdump(data + 22, len - 22);
3676 print_field(" Invalid Beacon (0x%02x)", data[0]);
3677 packet_hexdump(data, len);
3682 static void print_mesh_prov(const uint8_t *data, uint8_t len)
3684 print_hex_field("Mesh Provisioning", data, len);
3687 packet_hexdump(data, len);
3691 print_field(" Link ID: 0x%08x", get_be32(data));
3692 print_field(" Transaction Number: %u", data[4]);
3697 switch (data[0] & 0x03) {
3699 print_field(" Transaction Start (0x00)");
3701 packet_hexdump(data + 1, len - 1);
3704 print_field(" SeqN: %u", data[0] & 0xfc >> 2);
3705 print_field(" TotalLength: %u", get_be16(data + 1));
3706 print_field(" FCS: 0x%2.2x", data[3]);
3707 print_hex_field(" Data", data + 4, len - 4);
3708 packet_hexdump(data + 5, len - 5);
3711 print_field(" Transaction Acknowledgment (0x01)");
3712 packet_hexdump(data + 1, len - 1);
3715 print_field(" Transaction Continuation (0x02)");
3716 print_field(" SegmentIndex: %u", data[0] >> 2);
3718 packet_hexdump(data + 1, len - 1);
3721 print_hex_field(" Data", data + 1, len - 1);
3722 packet_hexdump(data + 2, len - 2);
3725 print_field(" Provisioning Bearer Control (0x03)");
3726 switch (data[0] >> 2) {
3728 print_field(" Link Open (0x00)");
3730 packet_hexdump(data + 1, len - 1);
3733 print_hex_field(" Device UUID", data, 16);
3736 print_field(" Link Ack (0x01)");
3739 print_field(" Link Close (0x02)");
3741 packet_hexdump(data + 1, len - 1);
3747 print_field(" Reason: Success (0x00)");
3750 print_field(" Reason: Timeout (0x01)");
3753 print_field(" Reason: Fail (0x02)");
3756 print_field(" Reason: Unrecognized (0x%2.2x)",
3759 packet_hexdump(data + 2, len - 2);
3762 packet_hexdump(data + 1, len - 1);
3767 print_field(" Invalid Command (0x%02x)", data[0]);
3768 packet_hexdump(data, len);
3773 static void print_mesh_data(const uint8_t *data, uint8_t len)
3775 print_hex_field("Mesh Data", data, len);
3780 print_field(" IVI: %u", data[0] >> 7);
3781 print_field(" NID: 0x%2.2x", data[0] & 0x7f);
3782 packet_hexdump(data + 1, len - 1);
3785 static void print_transport_data(const uint8_t *data, uint8_t len)
3787 print_field("Transport Discovery Data");
3792 print_field(" Organization: %s (0x%02x)",
3793 data[0] == 0x01 ? "Bluetooth SIG" : "RFU", data[0]);
3794 print_field(" Flags: 0x%2.2x", data[1]);
3795 print_field(" Role: 0x%2.2x", data[1] & 0x03);
3797 switch (data[1] & 0x03) {
3799 print_field(" Not Specified");
3802 print_field(" Seeker Only");
3805 print_field(" Provider Only");
3808 print_field(" Both Seeker an Provider");
3812 print_field(" Transport Data Incomplete: %s (0x%2.2x)",
3813 data[1] & 0x04 ? "True" : "False", data[1] & 0x04);
3815 print_field(" Transport State: 0x%2.2x", data[1] & 0x18);
3817 switch (data[1] & 0x18) {
3819 print_field(" Off");
3825 print_field(" Temporary Unavailable");
3828 print_field(" RFU");
3832 print_field(" Length: %u", data[2]);
3833 print_hex_field(" Data", data + 3, len - 3);
3836 static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
3843 while (len < eir_len - 1) {
3844 uint8_t field_len = eir[0];
3845 const uint8_t *data = &eir[2];
3847 char name[239], label[100];
3848 uint8_t flags, mask;
3850 /* Check for the end of EIR */
3854 len += field_len + 1;
3856 /* Do not continue EIR Data parsing if got incorrect length */
3857 if (len > eir_len) {
3858 len -= field_len + 1;
3862 data_len = field_len - 1;
3868 print_field("Flags: 0x%2.2x", flags);
3870 mask = print_bitfield(2, flags, eir_flags_table);
3872 print_text(COLOR_UNKNOWN_SERVICE_CLASS,
3873 " Unknown flags (0x%2.2x)", mask);
3876 case BT_EIR_UUID16_SOME:
3877 if (data_len < sizeof(uint16_t))
3879 print_uuid16_list("16-bit Service UUIDs (partial)",
3883 case BT_EIR_UUID16_ALL:
3884 if (data_len < sizeof(uint16_t))
3886 print_uuid16_list("16-bit Service UUIDs (complete)",
3890 case BT_EIR_UUID32_SOME:
3891 if (data_len < sizeof(uint32_t))
3893 print_uuid32_list("32-bit Service UUIDs (partial)",
3897 case BT_EIR_UUID32_ALL:
3898 if (data_len < sizeof(uint32_t))
3900 print_uuid32_list("32-bit Service UUIDs (complete)",
3904 case BT_EIR_UUID128_SOME:
3907 print_uuid128_list("128-bit Service UUIDs (partial)",
3911 case BT_EIR_UUID128_ALL:
3914 print_uuid128_list("128-bit Service UUIDs (complete)",
3918 case BT_EIR_NAME_SHORT:
3919 memset(name, 0, sizeof(name));
3920 memcpy(name, data, data_len);
3921 print_field("Name (short): %s", name);
3924 case BT_EIR_NAME_COMPLETE:
3925 memset(name, 0, sizeof(name));
3926 memcpy(name, data, data_len);
3927 print_field("Name (complete): %s", name);
3930 case BT_EIR_TX_POWER:
3933 print_field("TX power: %d dBm", (int8_t) *data);
3936 case BT_EIR_CLASS_OF_DEV:
3939 print_dev_class(data);
3942 case BT_EIR_SSP_HASH_P192:
3945 print_hash_p192(data);
3948 case BT_EIR_SSP_RANDOMIZER_P192:
3951 print_randomizer_p192(data);
3954 case BT_EIR_DEVICE_ID:
3955 /* SMP TK has the same value as Device ID */
3957 print_hex_field("SMP TK", data, data_len);
3958 else if (data_len >= 8)
3959 print_device_id(data, data_len);
3962 case BT_EIR_SMP_OOB_FLAGS:
3963 print_field("SMP OOB Flags: 0x%2.2x", *data);
3966 case BT_EIR_PERIPHERAL_CONN_INTERVAL:
3969 print_field("Peripheral Conn. Interval: "
3970 "0x%4.4x - 0x%4.4x",
3972 get_le16(&data[2]));
3975 case BT_EIR_SERVICE_UUID16:
3976 if (data_len < sizeof(uint16_t))
3978 print_uuid16_list("16-bit Service UUIDs",
3982 case BT_EIR_SERVICE_UUID128:
3985 print_uuid128_list("128-bit Service UUIDs",
3989 case BT_EIR_SERVICE_DATA:
3992 print_service_data(data, data_len);
3995 case BT_EIR_RANDOM_ADDRESS:
3998 print_addr("Random Address", data, 0x01);
4001 case BT_EIR_PUBLIC_ADDRESS:
4004 print_addr("Public Address", data, 0x00);
4007 case BT_EIR_GAP_APPEARANCE:
4010 print_appearance(get_le16(data));
4013 case BT_EIR_SSP_HASH_P256:
4016 print_hash_p256(data);
4019 case BT_EIR_SSP_RANDOMIZER_P256:
4022 print_randomizer_p256(data);
4025 case BT_EIR_TRANSPORT_DISCOVERY:
4026 print_transport_data(data, data_len);
4029 case BT_EIR_3D_INFO_DATA:
4030 print_hex_field("3D Information Data", data, data_len);
4036 print_field(" Features: 0x%2.2x", flags);
4038 mask = print_bitfield(4, flags, eir_3d_table);
4040 print_text(COLOR_UNKNOWN_FEATURE_BIT,
4041 " Unknown features (0x%2.2x)", mask);
4043 print_field(" Path Loss Threshold: %d", data[1]);
4046 case BT_EIR_MESH_DATA:
4047 print_mesh_data(data, data_len);
4050 case BT_EIR_MESH_PROV:
4051 print_mesh_prov(data, data_len);
4054 case BT_EIR_MESH_BEACON:
4055 print_mesh_beacon(data, data_len);
4058 case BT_EIR_CSIP_RSI:
4061 print_addr("Resolvable Set Identifier", data, 0xff);
4062 print_field(" Hash: 0x%6x", get_le24(data));
4063 print_field(" Random: 0x%6x", get_le24(data + 3));
4066 case BT_EIR_MANUFACTURER_DATA:
4069 print_manufacturer_data(data, data_len);
4073 sprintf(label, "Unknown EIR field 0x%2.2x", eir[1]);
4074 print_hex_field(label, data, data_len);
4078 eir += field_len + 1;
4081 if (len < eir_len && eir[0] != 0)
4082 packet_hexdump(eir, eir_len - len);
4085 void packet_print_addr(const char *label, const void *data, uint8_t type)
4087 print_addr(label ? : "Address", data, type);
4090 void packet_print_handle(uint16_t handle)
4092 print_handle_native(handle);
4095 void packet_print_rssi(const char *label, int8_t rssi)
4097 if ((uint8_t) rssi == 0x99 || rssi == 127)
4098 print_field("%s: invalid (0x%2.2x)", label, (uint8_t) rssi);
4100 print_field("%s: %d dBm (0x%2.2x)", label, rssi,
4104 void packet_print_ad(const void *data, uint8_t size)
4106 print_eir(data, size, true);
4109 struct broadcast_message {
4110 uint32_t frame_sync_instant;
4111 uint16_t bluetooth_clock_phase;
4112 uint16_t left_open_offset;
4113 uint16_t left_close_offset;
4114 uint16_t right_open_offset;
4115 uint16_t right_close_offset;
4116 uint16_t frame_sync_period;
4117 uint8_t frame_sync_period_fraction;
4118 } __attribute__ ((packed));
4120 static void print_3d_broadcast(const void *data, uint8_t size)
4122 const struct broadcast_message *msg = data;
4124 uint16_t left_open, left_close, right_open, right_close;
4125 uint16_t phase, period;
4126 uint8_t period_frac;
4129 instant = le32_to_cpu(msg->frame_sync_instant);
4130 mode = !!(instant & 0x40000000);
4131 phase = le16_to_cpu(msg->bluetooth_clock_phase);
4132 left_open = le16_to_cpu(msg->left_open_offset);
4133 left_close = le16_to_cpu(msg->left_close_offset);
4134 right_open = le16_to_cpu(msg->right_open_offset);
4135 right_close = le16_to_cpu(msg->right_close_offset);
4136 period = le16_to_cpu(msg->frame_sync_period);
4137 period_frac = msg->frame_sync_period_fraction;
4139 print_field(" Frame sync instant: 0x%8.8x", instant & 0x7fffffff);
4140 print_field(" Video mode: %s (%d)", mode ? "Dual View" : "3D", mode);
4141 print_field(" Bluetooth clock phase: %d usec (0x%4.4x)",
4143 print_field(" Left lense shutter open offset: %d usec (0x%4.4x)",
4144 left_open, left_open);
4145 print_field(" Left lense shutter close offset: %d usec (0x%4.4x)",
4146 left_close, left_close);
4147 print_field(" Right lense shutter open offset: %d usec (0x%4.4x)",
4148 right_open, right_open);
4149 print_field(" Right lense shutter close offset: %d usec (0x%4.4x)",
4150 right_close, right_close);
4151 print_field(" Frame sync period: %d.%d usec (0x%4.4x 0x%2.2x)",
4152 period, period_frac * 256,
4153 period, period_frac);
4156 void packet_hexdump(const unsigned char *buf, uint16_t len)
4158 static const char hexdigits[] = "0123456789abcdef";
4165 for (i = 0; i < len; i++) {
4166 str[((i % 16) * 3) + 0] = hexdigits[buf[i] >> 4];
4167 str[((i % 16) * 3) + 1] = hexdigits[buf[i] & 0xf];
4168 str[((i % 16) * 3) + 2] = ' ';
4169 str[(i % 16) + 49] = isprint(buf[i]) ? buf[i] : '.';
4171 if ((i + 1) % 16 == 0) {
4175 print_text(COLOR_WHITE, "%s", str);
4182 for (j = (i % 16); j < 16; j++) {
4183 str[(j * 3) + 0] = ' ';
4184 str[(j * 3) + 1] = ' ';
4185 str[(j * 3) + 2] = ' ';
4191 print_text(COLOR_WHITE, "%s", str);
4195 void packet_control(struct timeval *tv, struct ucred *cred,
4196 uint16_t index, uint16_t opcode,
4197 const void *data, uint16_t size)
4199 control_message(opcode, data, size);
4202 static int addr2str(const uint8_t *addr, char *str)
4204 return sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
4205 addr[5], addr[4], addr[3], addr[2], addr[1], addr[0]);
4208 void packet_monitor(struct timeval *tv, struct ucred *cred,
4209 uint16_t index, uint16_t opcode,
4210 const void *data, uint16_t size)
4212 const struct btsnoop_opcode_new_index *ni;
4213 const struct btsnoop_opcode_index_info *ii;
4214 const struct btsnoop_opcode_user_logging *ul;
4215 char str[18], extra_str[24];
4216 uint16_t manufacturer;
4219 if (index != HCI_DEV_NONE) {
4220 index_current = index;
4223 if (tv && time_offset == ((time_t) -1))
4224 time_offset = tv->tv_sec;
4227 case BTSNOOP_OPCODE_NEW_INDEX:
4230 if (index < MAX_INDEX) {
4231 index_list[index].type = ni->type;
4232 memcpy(index_list[index].bdaddr, ni->bdaddr, 6);
4233 index_list[index].manufacturer = fallback_manufacturer;
4234 index_list[index].msft_opcode = BT_HCI_CMD_NOP;
4237 addr2str(ni->bdaddr, str);
4238 packet_new_index(tv, index, str, ni->type, ni->bus, ni->name);
4240 case BTSNOOP_OPCODE_DEL_INDEX:
4241 if (index < MAX_INDEX)
4242 addr2str(index_list[index].bdaddr, str);
4244 sprintf(str, "00:00:00:00:00:00");
4246 packet_del_index(tv, index, str);
4248 case BTSNOOP_OPCODE_COMMAND_PKT:
4249 packet_hci_command(tv, cred, index, data, size);
4251 case BTSNOOP_OPCODE_EVENT_PKT:
4252 packet_hci_event(tv, cred, index, data, size);
4254 case BTSNOOP_OPCODE_ACL_TX_PKT:
4255 packet_hci_acldata(tv, cred, index, false, data, size);
4257 case BTSNOOP_OPCODE_ACL_RX_PKT:
4258 packet_hci_acldata(tv, cred, index, true, data, size);
4260 case BTSNOOP_OPCODE_SCO_TX_PKT:
4261 packet_hci_scodata(tv, cred, index, false, data, size);
4263 case BTSNOOP_OPCODE_SCO_RX_PKT:
4264 packet_hci_scodata(tv, cred, index, true, data, size);
4266 case BTSNOOP_OPCODE_ISO_TX_PKT:
4267 packet_hci_isodata(tv, cred, index, false, data, size);
4269 case BTSNOOP_OPCODE_ISO_RX_PKT:
4270 packet_hci_isodata(tv, cred, index, true, data, size);
4272 case BTSNOOP_OPCODE_OPEN_INDEX:
4273 if (index < MAX_INDEX)
4274 addr2str(index_list[index].bdaddr, str);
4276 sprintf(str, "00:00:00:00:00:00");
4278 packet_open_index(tv, index, str);
4280 case BTSNOOP_OPCODE_CLOSE_INDEX:
4281 if (index < MAX_INDEX)
4282 addr2str(index_list[index].bdaddr, str);
4284 sprintf(str, "00:00:00:00:00:00");
4286 packet_close_index(tv, index, str);
4288 case BTSNOOP_OPCODE_INDEX_INFO:
4290 manufacturer = le16_to_cpu(ii->manufacturer);
4292 if (index < MAX_INDEX) {
4293 memcpy(index_list[index].bdaddr, ii->bdaddr, 6);
4294 index_list[index].manufacturer = manufacturer;
4296 switch (manufacturer) {
4299 * Intel controllers that support the
4300 * Microsoft vendor extension are using
4301 * 0xFC1E for VsMsftOpCode.
4303 index_list[index].msft_opcode = 0xFC1E;
4307 * Realtek controllers that support the
4308 * Microsoft vendor extenions are using
4309 * 0xFCF0 for VsMsftOpCode.
4311 index_list[index].msft_opcode = 0xFCF0;
4315 * Emulator controllers use Linux Foundation as
4316 * manufacturer and support the
4317 * Microsoft vendor extenions using
4318 * 0xFC1E for VsMsftOpCode.
4320 index_list[index].msft_opcode = 0xFC1E;
4325 addr2str(ii->bdaddr, str);
4326 packet_index_info(tv, index, str, manufacturer);
4328 case BTSNOOP_OPCODE_VENDOR_DIAG:
4329 if (index < MAX_INDEX)
4330 manufacturer = index_list[index].manufacturer;
4332 manufacturer = fallback_manufacturer;
4334 packet_vendor_diag(tv, index, manufacturer, data, size);
4336 case BTSNOOP_OPCODE_SYSTEM_NOTE:
4337 packet_system_note(tv, cred, index, data);
4339 case BTSNOOP_OPCODE_USER_LOGGING:
4341 ident = ul->ident_len ? data + sizeof(*ul) : NULL;
4343 packet_user_logging(tv, cred, index, ul->priority, ident,
4344 data + sizeof(*ul) + ul->ident_len,
4345 size - (sizeof(*ul) + ul->ident_len));
4347 case BTSNOOP_OPCODE_CTRL_OPEN:
4348 control_disable_decoding();
4349 packet_ctrl_open(tv, cred, index, data, size);
4351 case BTSNOOP_OPCODE_CTRL_CLOSE:
4352 packet_ctrl_close(tv, cred, index, data, size);
4354 case BTSNOOP_OPCODE_CTRL_COMMAND:
4355 packet_ctrl_command(tv, cred, index, data, size);
4357 case BTSNOOP_OPCODE_CTRL_EVENT:
4358 packet_ctrl_event(tv, cred, index, data, size);
4361 sprintf(extra_str, "(code %d len %d)", opcode, size);
4362 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
4363 "Unknown packet", NULL, extra_str);
4364 packet_hexdump(data, size);
4369 void packet_simulator(struct timeval *tv, uint16_t frequency,
4370 const void *data, uint16_t size)
4374 if (tv && time_offset == ((time_t) -1))
4375 time_offset = tv->tv_sec;
4377 sprintf(str, "%u MHz", frequency);
4379 print_packet(tv, NULL, '*', 0, NULL, COLOR_PHY_PACKET,
4380 "Physical packet:", NULL, str);
4382 ll_packet(frequency, data, size, false);
4385 static void null_cmd(uint16_t index, const void *data, uint8_t size)
4389 static void status_rsp(uint16_t index, const void *data, uint8_t size)
4391 uint8_t status = *((const uint8_t *) data);
4393 print_status(status);
4396 static void status_handle_rsp(uint16_t index, const void *data, uint8_t size)
4398 uint8_t status = *((const uint8_t *) data);
4400 print_status(status);
4401 print_field("Connection handle: %d", get_u8(data + 1));
4404 static void status_bdaddr_rsp(uint16_t index, const void *data, uint8_t size)
4406 uint8_t status = *((const uint8_t *) data);
4408 print_status(status);
4409 print_bdaddr(data + 1);
4412 static void inquiry_cmd(uint16_t index, const void *data, uint8_t size)
4414 const struct bt_hci_cmd_inquiry *cmd = data;
4416 print_iac(cmd->lap);
4417 print_field("Length: %.2fs (0x%2.2x)",
4418 cmd->length * 1.28, cmd->length);
4419 print_num_resp(cmd->num_resp);
4422 static void periodic_inquiry_cmd(uint16_t index, const void *data, uint8_t size)
4424 const struct bt_hci_cmd_periodic_inquiry *cmd = data;
4426 print_field("Max period: %.2fs (0x%2.2x)",
4427 cmd->max_period * 1.28, cmd->max_period);
4428 print_field("Min period: %.2fs (0x%2.2x)",
4429 cmd->min_period * 1.28, cmd->min_period);
4430 print_iac(cmd->lap);
4431 print_field("Length: %.2fs (0x%2.2x)",
4432 cmd->length * 1.28, cmd->length);
4433 print_num_resp(cmd->num_resp);
4436 static void create_conn_cmd(uint16_t index, const void *data, uint8_t size)
4438 const struct bt_hci_cmd_create_conn *cmd = data;
4441 print_bdaddr(cmd->bdaddr);
4442 print_pkt_type(cmd->pkt_type);
4443 print_pscan_rep_mode(cmd->pscan_rep_mode);
4444 print_pscan_mode(cmd->pscan_mode);
4445 print_clock_offset(cmd->clock_offset);
4447 switch (cmd->role_switch) {
4449 str = "Stay central";
4452 str = "Allow peripheral";
4459 print_field("Role switch: %s (0x%2.2x)", str, cmd->role_switch);
4462 static void disconnect_cmd(uint16_t index, const void *data, uint8_t size)
4464 const struct bt_hci_cmd_disconnect *cmd = data;
4466 print_handle(cmd->handle);
4467 print_reason(cmd->reason);
4470 static void add_sco_conn_cmd(uint16_t index, const void *data, uint8_t size)
4472 const struct bt_hci_cmd_add_sco_conn *cmd = data;
4474 print_handle(cmd->handle);
4475 print_pkt_type_sco(cmd->pkt_type);
4478 static void create_conn_cancel_cmd(uint16_t index, const void *data,
4481 const struct bt_hci_cmd_create_conn_cancel *cmd = data;
4483 print_bdaddr(cmd->bdaddr);
4486 static void accept_conn_request_cmd(uint16_t index, const void *data,
4489 const struct bt_hci_cmd_accept_conn_request *cmd = data;
4491 print_bdaddr(cmd->bdaddr);
4492 print_role(cmd->role);
4495 static void reject_conn_request_cmd(uint16_t index, const void *data,
4498 const struct bt_hci_cmd_reject_conn_request *cmd = data;
4500 print_bdaddr(cmd->bdaddr);
4501 print_reason(cmd->reason);
4504 static void link_key_request_reply_cmd(uint16_t index, const void *data,
4507 const struct bt_hci_cmd_link_key_request_reply *cmd = data;
4509 print_bdaddr(cmd->bdaddr);
4510 print_link_key(cmd->link_key);
4513 static void link_key_request_neg_reply_cmd(uint16_t index, const void *data,
4516 const struct bt_hci_cmd_link_key_request_neg_reply *cmd = data;
4518 print_bdaddr(cmd->bdaddr);
4521 static void pin_code_request_reply_cmd(uint16_t index, const void *data,
4524 const struct bt_hci_cmd_pin_code_request_reply *cmd = data;
4526 print_bdaddr(cmd->bdaddr);
4527 print_field("PIN length: %d", cmd->pin_len);
4528 print_pin_code(cmd->pin_code, cmd->pin_len);
4531 static void pin_code_request_neg_reply_cmd(uint16_t index, const void *data,
4534 const struct bt_hci_cmd_pin_code_request_neg_reply *cmd = data;
4536 print_bdaddr(cmd->bdaddr);
4539 static void change_conn_pkt_type_cmd(uint16_t index, const void *data,
4542 const struct bt_hci_cmd_change_conn_pkt_type *cmd = data;
4544 print_handle(cmd->handle);
4545 print_pkt_type(cmd->pkt_type);
4548 static void auth_requested_cmd(uint16_t index, const void *data, uint8_t size)
4550 const struct bt_hci_cmd_auth_requested *cmd = data;
4552 print_handle(cmd->handle);
4555 static void set_conn_encrypt_cmd(uint16_t index, const void *data, uint8_t size)
4557 const struct bt_hci_cmd_set_conn_encrypt *cmd = data;
4559 print_handle(cmd->handle);
4560 print_enable("Encryption", cmd->encr_mode);
4563 static void change_conn_link_key_cmd(uint16_t index, const void *data,
4566 const struct bt_hci_cmd_change_conn_link_key *cmd = data;
4568 print_handle(cmd->handle);
4571 static void link_key_selection_cmd(uint16_t index, const void *data,
4574 const struct bt_hci_cmd_link_key_selection *cmd = data;
4576 print_key_flag(cmd->key_flag);
4579 static void remote_name_request_cmd(uint16_t index, const void *data,
4582 const struct bt_hci_cmd_remote_name_request *cmd = data;
4584 print_bdaddr(cmd->bdaddr);
4585 print_pscan_rep_mode(cmd->pscan_rep_mode);
4586 print_pscan_mode(cmd->pscan_mode);
4587 print_clock_offset(cmd->clock_offset);
4590 static void remote_name_request_cancel_cmd(uint16_t index, const void *data,
4593 const struct bt_hci_cmd_remote_name_request_cancel *cmd = data;
4595 print_bdaddr(cmd->bdaddr);
4598 static void read_remote_features_cmd(uint16_t index, const void *data,
4601 const struct bt_hci_cmd_read_remote_features *cmd = data;
4603 print_handle(cmd->handle);
4606 static void read_remote_ext_features_cmd(uint16_t index, const void *data,
4609 const struct bt_hci_cmd_read_remote_ext_features *cmd = data;
4611 print_handle(cmd->handle);
4612 print_field("Page: %d", cmd->page);
4615 static void read_remote_version_cmd(uint16_t index, const void *data,
4618 const struct bt_hci_cmd_read_remote_version *cmd = data;
4620 print_handle(cmd->handle);
4623 static void read_clock_offset_cmd(uint16_t index, const void *data,
4626 const struct bt_hci_cmd_read_clock_offset *cmd = data;
4628 print_handle(cmd->handle);
4631 static void read_lmp_handle_cmd(uint16_t index, const void *data, uint8_t size)
4633 const struct bt_hci_cmd_read_lmp_handle *cmd = data;
4635 print_handle(cmd->handle);
4638 static void read_lmp_handle_rsp(uint16_t index, const void *data, uint8_t size)
4640 const struct bt_hci_rsp_read_lmp_handle *rsp = data;
4642 print_status(rsp->status);
4643 print_handle(rsp->handle);
4644 print_field("LMP handle: %d", rsp->lmp_handle);
4645 print_field("Reserved: %d", le32_to_cpu(rsp->reserved));
4648 static void setup_sync_conn_cmd(uint16_t index, const void *data, uint8_t size)
4650 const struct bt_hci_cmd_setup_sync_conn *cmd = data;
4652 print_handle(cmd->handle);
4653 print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
4654 print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
4655 print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
4656 print_voice_setting(cmd->voice_setting);
4657 print_retransmission_effort(cmd->retrans_effort);
4658 print_pkt_type_sco(cmd->pkt_type);
4661 static void accept_sync_conn_request_cmd(uint16_t index, const void *data,
4664 const struct bt_hci_cmd_accept_sync_conn_request *cmd = data;
4666 print_bdaddr(cmd->bdaddr);
4667 print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
4668 print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
4669 print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
4670 print_voice_setting(cmd->voice_setting);
4671 print_retransmission_effort(cmd->retrans_effort);
4672 print_pkt_type_sco(cmd->pkt_type);
4675 static void reject_sync_conn_request_cmd(uint16_t index, const void *data,
4678 const struct bt_hci_cmd_reject_sync_conn_request *cmd = data;
4680 print_bdaddr(cmd->bdaddr);
4681 print_reason(cmd->reason);
4684 static void io_capability_request_reply_cmd(uint16_t index, const void *data,
4687 const struct bt_hci_cmd_io_capability_request_reply *cmd = data;
4689 print_bdaddr(cmd->bdaddr);
4690 print_io_capability(cmd->capability);
4691 print_oob_data(cmd->oob_data);
4692 print_authentication(cmd->authentication);
4695 static void user_confirm_request_reply_cmd(uint16_t index, const void *data,
4698 const struct bt_hci_cmd_user_confirm_request_reply *cmd = data;
4700 print_bdaddr(cmd->bdaddr);
4703 static void user_confirm_request_neg_reply_cmd(uint16_t index, const void *data,
4706 const struct bt_hci_cmd_user_confirm_request_neg_reply *cmd = data;
4708 print_bdaddr(cmd->bdaddr);
4711 static void user_passkey_request_reply_cmd(uint16_t index, const void *data,
4714 const struct bt_hci_cmd_user_passkey_request_reply *cmd = data;
4716 print_bdaddr(cmd->bdaddr);
4717 print_passkey(cmd->passkey);
4720 static void user_passkey_request_neg_reply_cmd(uint16_t index, const void *data,
4723 const struct bt_hci_cmd_user_passkey_request_neg_reply *cmd = data;
4725 print_bdaddr(cmd->bdaddr);
4728 static void remote_oob_data_request_reply_cmd(uint16_t index, const void *data,
4731 const struct bt_hci_cmd_remote_oob_data_request_reply *cmd = data;
4733 print_bdaddr(cmd->bdaddr);
4734 print_hash_p192(cmd->hash);
4735 print_randomizer_p192(cmd->randomizer);
4738 static void remote_oob_data_request_neg_reply_cmd(uint16_t index,
4739 const void *data, uint8_t size)
4741 const struct bt_hci_cmd_remote_oob_data_request_neg_reply *cmd = data;
4743 print_bdaddr(cmd->bdaddr);
4746 static void io_capability_request_neg_reply_cmd(uint16_t index,
4747 const void *data, uint8_t size)
4749 const struct bt_hci_cmd_io_capability_request_neg_reply *cmd = data;
4751 print_bdaddr(cmd->bdaddr);
4752 print_reason(cmd->reason);
4755 static void create_phy_link_cmd(uint16_t index, const void *data, uint8_t size)
4757 const struct bt_hci_cmd_create_phy_link *cmd = data;
4759 print_phy_handle(cmd->phy_handle);
4760 print_key_len(cmd->key_len);
4761 print_key_type(cmd->key_type);
4763 packet_hexdump(data + 3, size - 3);
4766 static void accept_phy_link_cmd(uint16_t index, const void *data, uint8_t size)
4768 const struct bt_hci_cmd_accept_phy_link *cmd = data;
4770 print_phy_handle(cmd->phy_handle);
4771 print_key_len(cmd->key_len);
4772 print_key_type(cmd->key_type);
4774 packet_hexdump(data + 3, size - 3);
4777 static void disconn_phy_link_cmd(uint16_t index, const void *data, uint8_t size)
4779 const struct bt_hci_cmd_disconn_phy_link *cmd = data;
4781 print_phy_handle(cmd->phy_handle);
4782 print_reason(cmd->reason);
4785 static void create_logic_link_cmd(uint16_t index, const void *data,
4788 const struct bt_hci_cmd_create_logic_link *cmd = data;
4790 print_phy_handle(cmd->phy_handle);
4791 print_flow_spec("TX", cmd->tx_flow_spec);
4792 print_flow_spec("RX", cmd->rx_flow_spec);
4795 static void accept_logic_link_cmd(uint16_t index, const void *data,
4798 const struct bt_hci_cmd_accept_logic_link *cmd = data;
4800 print_phy_handle(cmd->phy_handle);
4801 print_flow_spec("TX", cmd->tx_flow_spec);
4802 print_flow_spec("RX", cmd->rx_flow_spec);
4805 static void disconn_logic_link_cmd(uint16_t index, const void *data,
4808 const struct bt_hci_cmd_disconn_logic_link *cmd = data;
4810 print_handle(cmd->handle);
4813 static void logic_link_cancel_cmd(uint16_t index, const void *data,
4816 const struct bt_hci_cmd_logic_link_cancel *cmd = data;
4818 print_phy_handle(cmd->phy_handle);
4819 print_field("TX flow spec: 0x%2.2x", cmd->flow_spec);
4822 static void logic_link_cancel_rsp(uint16_t index, const void *data,
4825 const struct bt_hci_rsp_logic_link_cancel *rsp = data;
4827 print_status(rsp->status);
4828 print_phy_handle(rsp->phy_handle);
4829 print_field("TX flow spec: 0x%2.2x", rsp->flow_spec);
4832 static void flow_spec_modify_cmd(uint16_t index, const void *data, uint8_t size)
4834 const struct bt_hci_cmd_flow_spec_modify *cmd = data;
4836 print_handle(cmd->handle);
4837 print_flow_spec("TX", cmd->tx_flow_spec);
4838 print_flow_spec("RX", cmd->rx_flow_spec);
4841 static void enhanced_setup_sync_conn_cmd(uint16_t index, const void *data,
4844 const struct bt_hci_cmd_enhanced_setup_sync_conn *cmd = data;
4846 print_handle(cmd->handle);
4847 print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
4848 print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
4852 print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
4853 print_pkt_type_sco(cmd->pkt_type);
4854 print_retransmission_effort(cmd->retrans_effort);
4857 static void enhanced_accept_sync_conn_request_cmd(uint16_t index,
4861 const struct bt_hci_cmd_enhanced_accept_sync_conn_request *cmd = data;
4863 print_bdaddr(cmd->bdaddr);
4864 print_field("Transmit bandwidth: %d", le32_to_cpu(cmd->tx_bandwidth));
4865 print_field("Receive bandwidth: %d", le32_to_cpu(cmd->rx_bandwidth));
4869 print_field("Max latency: %d", le16_to_cpu(cmd->max_latency));
4870 print_pkt_type_sco(cmd->pkt_type);
4871 print_retransmission_effort(cmd->retrans_effort);
4874 static void truncated_page_cmd(uint16_t index, const void *data, uint8_t size)
4876 const struct bt_hci_cmd_truncated_page *cmd = data;
4878 print_bdaddr(cmd->bdaddr);
4879 print_pscan_rep_mode(cmd->pscan_rep_mode);
4880 print_clock_offset(cmd->clock_offset);
4883 static void truncated_page_cancel_cmd(uint16_t index, const void *data,
4886 const struct bt_hci_cmd_truncated_page_cancel *cmd = data;
4888 print_bdaddr(cmd->bdaddr);
4891 static void set_peripheral_broadcast_cmd(uint16_t index, const void *data,
4894 const struct bt_hci_cmd_set_peripheral_broadcast *cmd = data;
4896 print_field("Enable: 0x%2.2x", cmd->enable);
4897 print_lt_addr(cmd->lt_addr);
4898 print_lpo_allowed(cmd->lpo_allowed);
4899 print_pkt_type(cmd->pkt_type);
4900 print_slot_625("Min interval", cmd->min_interval);
4901 print_slot_625("Max interval", cmd->max_interval);
4902 print_slot_625("Supervision timeout", cmd->timeout);
4905 static void set_peripheral_broadcast_rsp(uint16_t index, const void *data,
4908 const struct bt_hci_rsp_set_peripheral_broadcast *rsp = data;
4910 print_status(rsp->status);
4911 print_lt_addr(rsp->lt_addr);
4912 print_interval(rsp->interval);
4915 static void set_peripheral_broadcast_receive_cmd(uint16_t index,
4916 const void *data, uint8_t size)
4918 const struct bt_hci_cmd_set_peripheral_broadcast_receive *cmd = data;
4920 print_field("Enable: 0x%2.2x", cmd->enable);
4921 print_bdaddr(cmd->bdaddr);
4922 print_lt_addr(cmd->lt_addr);
4923 print_interval(cmd->interval);
4924 print_field("Offset: 0x%8.8x", le32_to_cpu(cmd->offset));
4925 print_field("Next broadcast instant: 0x%4.4x",
4926 le16_to_cpu(cmd->instant));
4927 print_slot_625("Supervision timeout", cmd->timeout);
4928 print_field("Remote timing accuracy: %d ppm", cmd->accuracy);
4929 print_field("Skip: 0x%2.2x", cmd->skip);
4930 print_pkt_type(cmd->pkt_type);
4931 print_channel_map(cmd->map);
4934 static void set_peripheral_broadcast_receive_rsp(uint16_t index,
4935 const void *data, uint8_t size)
4937 const struct bt_hci_rsp_set_peripheral_broadcast_receive *rsp = data;
4939 print_status(rsp->status);
4940 print_bdaddr(rsp->bdaddr);
4941 print_lt_addr(rsp->lt_addr);
4944 static void receive_sync_train_cmd(uint16_t index, const void *data,
4947 const struct bt_hci_cmd_receive_sync_train *cmd = data;
4949 print_bdaddr(cmd->bdaddr);
4950 print_timeout(cmd->timeout);
4951 print_window(cmd->window);
4952 print_interval(cmd->interval);
4955 static void remote_oob_ext_data_request_reply_cmd(uint16_t index,
4956 const void *data, uint8_t size)
4958 const struct bt_hci_cmd_remote_oob_ext_data_request_reply *cmd = data;
4960 print_bdaddr(cmd->bdaddr);
4961 print_hash_p192(cmd->hash192);
4962 print_randomizer_p192(cmd->randomizer192);
4963 print_hash_p256(cmd->hash256);
4964 print_randomizer_p256(cmd->randomizer256);
4967 static void hold_mode_cmd(uint16_t index, const void *data, uint8_t size)
4969 const struct bt_hci_cmd_hold_mode *cmd = data;
4971 print_handle(cmd->handle);
4972 print_slot_625("Hold max interval", cmd->max_interval);
4973 print_slot_625("Hold min interval", cmd->min_interval);
4976 static void sniff_mode_cmd(uint16_t index, const void *data, uint8_t size)
4978 const struct bt_hci_cmd_sniff_mode *cmd = data;
4980 print_handle(cmd->handle);
4981 print_slot_625("Sniff max interval", cmd->max_interval);
4982 print_slot_625("Sniff min interval", cmd->min_interval);
4983 print_slot_125("Sniff attempt", cmd->attempt);
4984 print_slot_125("Sniff timeout", cmd->timeout);
4987 static void exit_sniff_mode_cmd(uint16_t index, const void *data, uint8_t size)
4989 const struct bt_hci_cmd_exit_sniff_mode *cmd = data;
4991 print_handle(cmd->handle);
4994 static void park_state_cmd(uint16_t index, const void *data, uint8_t size)
4996 const struct bt_hci_cmd_park_state *cmd = data;
4998 print_handle(cmd->handle);
4999 print_slot_625("Beacon max interval", cmd->max_interval);
5000 print_slot_625("Beacon min interval", cmd->min_interval);
5003 static void exit_park_state_cmd(uint16_t index, const void *data, uint8_t size)
5005 const struct bt_hci_cmd_exit_park_state *cmd = data;
5007 print_handle(cmd->handle);
5010 static void qos_setup_cmd(uint16_t index, const void *data, uint8_t size)
5012 const struct bt_hci_cmd_qos_setup *cmd = data;
5014 print_handle(cmd->handle);
5015 print_field("Flags: 0x%2.2x", cmd->flags);
5017 print_service_type(cmd->service_type);
5019 print_field("Token rate: %d", le32_to_cpu(cmd->token_rate));
5020 print_field("Peak bandwidth: %d", le32_to_cpu(cmd->peak_bandwidth));
5021 print_field("Latency: %d", le32_to_cpu(cmd->latency));
5022 print_field("Delay variation: %d", le32_to_cpu(cmd->delay_variation));
5025 static void role_discovery_cmd(uint16_t index, const void *data, uint8_t size)
5027 const struct bt_hci_cmd_role_discovery *cmd = data;
5029 print_handle(cmd->handle);
5032 static void role_discovery_rsp(uint16_t index, const void *data, uint8_t size)
5034 const struct bt_hci_rsp_role_discovery *rsp = data;
5036 print_status(rsp->status);
5037 print_handle(rsp->handle);
5038 print_role(rsp->role);
5041 static void switch_role_cmd(uint16_t index, const void *data, uint8_t size)
5043 const struct bt_hci_cmd_switch_role *cmd = data;
5045 print_bdaddr(cmd->bdaddr);
5046 print_role(cmd->role);
5049 static void read_link_policy_cmd(uint16_t index, const void *data, uint8_t size)
5051 const struct bt_hci_cmd_read_link_policy *cmd = data;
5053 print_handle(cmd->handle);
5056 static void read_link_policy_rsp(uint16_t index, const void *data, uint8_t size)
5058 const struct bt_hci_rsp_read_link_policy *rsp = data;
5060 print_status(rsp->status);
5061 print_handle(rsp->handle);
5062 print_link_policy(rsp->policy);
5065 static void write_link_policy_cmd(uint16_t index, const void *data,
5068 const struct bt_hci_cmd_write_link_policy *cmd = data;
5070 print_handle(cmd->handle);
5071 print_link_policy(cmd->policy);
5074 static void write_link_policy_rsp(uint16_t index, const void *data,
5077 const struct bt_hci_rsp_write_link_policy *rsp = data;
5079 print_status(rsp->status);
5080 print_handle(rsp->handle);
5083 static void read_default_link_policy_rsp(uint16_t index, const void *data,
5086 const struct bt_hci_rsp_read_default_link_policy *rsp = data;
5088 print_status(rsp->status);
5089 print_link_policy(rsp->policy);
5092 static void write_default_link_policy_cmd(uint16_t index, const void *data,
5095 const struct bt_hci_cmd_write_default_link_policy *cmd = data;
5097 print_link_policy(cmd->policy);
5100 static void flow_spec_cmd(uint16_t index, const void *data, uint8_t size)
5102 const struct bt_hci_cmd_flow_spec *cmd = data;
5104 print_handle(cmd->handle);
5105 print_field("Flags: 0x%2.2x", cmd->flags);
5107 print_flow_direction(cmd->direction);
5108 print_service_type(cmd->service_type);
5110 print_field("Token rate: %d", le32_to_cpu(cmd->token_rate));
5111 print_field("Token bucket size: %d",
5112 le32_to_cpu(cmd->token_bucket_size));
5113 print_field("Peak bandwidth: %d", le32_to_cpu(cmd->peak_bandwidth));
5114 print_field("Access latency: %d", le32_to_cpu(cmd->access_latency));
5117 static void sniff_subrating_cmd(uint16_t index, const void *data, uint8_t size)
5119 const struct bt_hci_cmd_sniff_subrating *cmd = data;
5121 print_handle(cmd->handle);
5122 print_slot_625("Max latency", cmd->max_latency);
5123 print_slot_625("Min remote timeout", cmd->min_remote_timeout);
5124 print_slot_625("Min local timeout", cmd->min_local_timeout);
5127 static void sniff_subrating_rsp(uint16_t index, const void *data, uint8_t size)
5129 const struct bt_hci_rsp_sniff_subrating *rsp = data;
5131 print_status(rsp->status);
5132 print_handle(rsp->handle);
5135 static void set_event_mask_cmd(uint16_t index, const void *data, uint8_t size)
5137 const struct bt_hci_cmd_set_event_mask *cmd = data;
5139 print_event_mask(cmd->mask, events_table);
5142 static void set_event_filter_cmd(uint16_t index, const void *data, uint8_t size)
5144 uint8_t type = *((const uint8_t *) data);
5150 str = "Clear All Filters";
5153 str = "Inquiry Result";
5156 str = "Connection Setup";
5163 print_field("Type: %s (0x%2.2x)", str, type);
5168 print_text(COLOR_ERROR, " invalid parameter size");
5169 packet_hexdump(data + 1, size - 1);
5175 print_text(COLOR_ERROR, " invalid parameter size");
5178 filter = *((const uint8_t *) (data + 1));
5182 str = "Return responses from all devices";
5185 str = "Device with specific Class of Device";
5188 str = "Device with specific BD_ADDR";
5195 print_field("Filter: %s (0x%2.2x)", str, filter);
5196 packet_hexdump(data + 2, size - 2);
5200 filter = *((const uint8_t *) (data + 1));
5204 str = "Allow connections all devices";
5207 str = "Allow connections with specific Class of Device";
5210 str = "Allow connections with specific BD_ADDR";
5218 print_text(COLOR_ERROR, " invalid parameter size");
5222 print_field("Filter: %s (0x%2.2x)", str, filter);
5223 packet_hexdump(data + 2, size - 2);
5228 print_text(COLOR_ERROR, " invalid parameter size");
5232 filter = *((const uint8_t *) (data + 1));
5234 print_field("Filter: Reserved (0x%2.2x)", filter);
5235 packet_hexdump(data + 2, size - 2);
5240 static void flush_cmd(uint16_t index, const void *data, uint8_t size)
5242 const struct bt_hci_cmd_flush *cmd = data;
5244 print_handle(cmd->handle);
5247 static void flush_rsp(uint16_t index, const void *data, uint8_t size)
5249 const struct bt_hci_rsp_flush *rsp = data;
5251 print_status(rsp->status);
5252 print_handle(rsp->handle);
5255 static void read_pin_type_rsp(uint16_t index, const void *data, uint8_t size)
5257 const struct bt_hci_rsp_read_pin_type *rsp = data;
5259 print_status(rsp->status);
5260 print_pin_type(rsp->pin_type);
5263 static void write_pin_type_cmd(uint16_t index, const void *data, uint8_t size)
5265 const struct bt_hci_cmd_write_pin_type *cmd = data;
5267 print_pin_type(cmd->pin_type);
5270 static void read_stored_link_key_cmd(uint16_t index, const void *data,
5273 const struct bt_hci_cmd_read_stored_link_key *cmd = data;
5275 print_bdaddr(cmd->bdaddr);
5276 print_field("Read all: 0x%2.2x", cmd->read_all);
5279 static void read_stored_link_key_rsp(uint16_t index, const void *data,
5282 const struct bt_hci_rsp_read_stored_link_key *rsp = data;
5284 print_status(rsp->status);
5285 print_field("Max num keys: %d", le16_to_cpu(rsp->max_num_keys));
5286 print_field("Num keys: %d", le16_to_cpu(rsp->num_keys));
5289 static void write_stored_link_key_cmd(uint16_t index, const void *data,
5292 const struct bt_hci_cmd_write_stored_link_key *cmd = data;
5294 print_field("Num keys: %d", cmd->num_keys);
5296 packet_hexdump(data + 1, size - 1);
5299 static void write_stored_link_key_rsp(uint16_t index, const void *data,
5302 const struct bt_hci_rsp_write_stored_link_key *rsp = data;
5304 print_status(rsp->status);
5305 print_field("Num keys: %d", rsp->num_keys);
5308 static void delete_stored_link_key_cmd(uint16_t index, const void *data,
5311 const struct bt_hci_cmd_delete_stored_link_key *cmd = data;
5313 print_bdaddr(cmd->bdaddr);
5314 print_field("Delete all: 0x%2.2x", cmd->delete_all);
5317 static void delete_stored_link_key_rsp(uint16_t index, const void *data,
5320 const struct bt_hci_rsp_delete_stored_link_key *rsp = data;
5322 print_status(rsp->status);
5323 print_field("Num keys: %d", le16_to_cpu(rsp->num_keys));
5326 static void write_local_name_cmd(uint16_t index, const void *data, uint8_t size)
5328 const struct bt_hci_cmd_write_local_name *cmd = data;
5330 print_name(cmd->name);
5333 static void read_local_name_rsp(uint16_t index, const void *data, uint8_t size)
5335 const struct bt_hci_rsp_read_local_name *rsp = data;
5337 print_status(rsp->status);
5338 print_name(rsp->name);
5341 static void read_conn_accept_timeout_rsp(uint16_t index, const void *data,
5344 const struct bt_hci_rsp_read_conn_accept_timeout *rsp = data;
5346 print_status(rsp->status);
5347 print_timeout(rsp->timeout);
5350 static void write_conn_accept_timeout_cmd(uint16_t index, const void *data,
5353 const struct bt_hci_cmd_write_conn_accept_timeout *cmd = data;
5355 print_timeout(cmd->timeout);
5358 static void read_page_timeout_rsp(uint16_t index, const void *data,
5361 const struct bt_hci_rsp_read_page_timeout *rsp = data;
5363 print_status(rsp->status);
5364 print_timeout(rsp->timeout);
5367 static void write_page_timeout_cmd(uint16_t index, const void *data,
5370 const struct bt_hci_cmd_write_page_timeout *cmd = data;
5372 print_timeout(cmd->timeout);
5375 static void read_scan_enable_rsp(uint16_t index, const void *data, uint8_t size)
5377 const struct bt_hci_rsp_read_scan_enable *rsp = data;
5379 print_status(rsp->status);
5380 print_scan_enable(rsp->enable);
5383 static void write_scan_enable_cmd(uint16_t index, const void *data,
5386 const struct bt_hci_cmd_write_scan_enable *cmd = data;
5388 print_scan_enable(cmd->enable);
5391 static void read_page_scan_activity_rsp(uint16_t index, const void *data,
5394 const struct bt_hci_rsp_read_page_scan_activity *rsp = data;
5396 print_status(rsp->status);
5397 print_interval(rsp->interval);
5398 print_window(rsp->window);
5401 static void write_page_scan_activity_cmd(uint16_t index, const void *data,
5404 const struct bt_hci_cmd_write_page_scan_activity *cmd = data;
5406 print_interval(cmd->interval);
5407 print_window(cmd->window);
5410 static void read_inquiry_scan_activity_rsp(uint16_t index, const void *data,
5413 const struct bt_hci_rsp_read_inquiry_scan_activity *rsp = data;
5415 print_status(rsp->status);
5416 print_interval(rsp->interval);
5417 print_window(rsp->window);
5420 static void write_inquiry_scan_activity_cmd(uint16_t index, const void *data,
5423 const struct bt_hci_cmd_write_inquiry_scan_activity *cmd = data;
5425 print_interval(cmd->interval);
5426 print_window(cmd->window);
5429 static void read_auth_enable_rsp(uint16_t index, const void *data, uint8_t size)
5431 const struct bt_hci_rsp_read_auth_enable *rsp = data;
5433 print_status(rsp->status);
5434 print_auth_enable(rsp->enable);
5437 static void write_auth_enable_cmd(uint16_t index, const void *data,
5440 const struct bt_hci_cmd_write_auth_enable *cmd = data;
5442 print_auth_enable(cmd->enable);
5445 static void read_encrypt_mode_rsp(uint16_t index, const void *data,
5448 const struct bt_hci_rsp_read_encrypt_mode *rsp = data;
5450 print_status(rsp->status);
5451 print_encrypt_mode(rsp->mode);
5454 static void write_encrypt_mode_cmd(uint16_t index, const void *data,
5457 const struct bt_hci_cmd_write_encrypt_mode *cmd = data;
5459 print_encrypt_mode(cmd->mode);
5462 static void read_class_of_dev_rsp(uint16_t index, const void *data,
5465 const struct bt_hci_rsp_read_class_of_dev *rsp = data;
5467 print_status(rsp->status);
5468 print_dev_class(rsp->dev_class);
5471 static void write_class_of_dev_cmd(uint16_t index, const void *data,
5474 const struct bt_hci_cmd_write_class_of_dev *cmd = data;
5476 print_dev_class(cmd->dev_class);
5479 static void read_voice_setting_rsp(uint16_t index, const void *data,
5482 const struct bt_hci_rsp_read_voice_setting *rsp = data;
5484 print_status(rsp->status);
5485 print_voice_setting(rsp->setting);
5488 static void write_voice_setting_cmd(uint16_t index, const void *data,
5491 const struct bt_hci_cmd_write_voice_setting *cmd = data;
5493 print_voice_setting(cmd->setting);
5496 static void read_auto_flush_timeout_cmd(uint16_t index, const void *data,
5499 const struct bt_hci_cmd_read_auto_flush_timeout *cmd = data;
5501 print_handle(cmd->handle);
5504 static void read_auto_flush_timeout_rsp(uint16_t index, const void *data,
5507 const struct bt_hci_rsp_read_auto_flush_timeout *rsp = data;
5509 print_status(rsp->status);
5510 print_handle(rsp->handle);
5511 print_flush_timeout(rsp->timeout);
5514 static void write_auto_flush_timeout_cmd(uint16_t index, const void *data,
5517 const struct bt_hci_cmd_write_auto_flush_timeout *cmd = data;
5519 print_handle(cmd->handle);
5520 print_flush_timeout(cmd->timeout);
5523 static void write_auto_flush_timeout_rsp(uint16_t index, const void *data,
5526 const struct bt_hci_rsp_write_auto_flush_timeout *rsp = data;
5528 print_status(rsp->status);
5529 print_handle(rsp->handle);
5532 static void read_num_broadcast_retrans_rsp(uint16_t index, const void *data,
5535 const struct bt_hci_rsp_read_num_broadcast_retrans *rsp = data;
5537 print_status(rsp->status);
5538 print_num_broadcast_retrans(rsp->num_retrans);
5541 static void write_num_broadcast_retrans_cmd(uint16_t index, const void *data,
5544 const struct bt_hci_cmd_write_num_broadcast_retrans *cmd = data;
5546 print_num_broadcast_retrans(cmd->num_retrans);
5549 static void read_hold_mode_activity_rsp(uint16_t index, const void *data,
5552 const struct bt_hci_rsp_read_hold_mode_activity *rsp = data;
5554 print_status(rsp->status);
5555 print_hold_mode_activity(rsp->activity);
5558 static void write_hold_mode_activity_cmd(uint16_t index, const void *data,
5561 const struct bt_hci_cmd_write_hold_mode_activity *cmd = data;
5563 print_hold_mode_activity(cmd->activity);
5566 static void read_tx_power_cmd(uint16_t index, const void *data, uint8_t size)
5568 const struct bt_hci_cmd_read_tx_power *cmd = data;
5570 print_handle(cmd->handle);
5571 print_power_type(cmd->type);
5574 static void read_tx_power_rsp(uint16_t index, const void *data, uint8_t size)
5576 const struct bt_hci_rsp_read_tx_power *rsp = data;
5578 print_status(rsp->status);
5579 print_handle(rsp->handle);
5580 print_power_level(rsp->level, NULL);
5583 static void read_sync_flow_control_rsp(uint16_t index, const void *data,
5586 const struct bt_hci_rsp_read_sync_flow_control *rsp = data;
5588 print_status(rsp->status);
5589 print_enable("Flow control", rsp->enable);
5592 static void write_sync_flow_control_cmd(uint16_t index, const void *data,
5595 const struct bt_hci_cmd_write_sync_flow_control *cmd = data;
5597 print_enable("Flow control", cmd->enable);
5600 static void set_host_flow_control_cmd(uint16_t index, const void *data,
5603 const struct bt_hci_cmd_set_host_flow_control *cmd = data;
5605 print_host_flow_control(cmd->enable);
5608 static void host_buffer_size_cmd(uint16_t index, const void *data, uint8_t size)
5610 const struct bt_hci_cmd_host_buffer_size *cmd = data;
5612 print_field("ACL MTU: %-4d ACL max packet: %d",
5613 le16_to_cpu(cmd->acl_mtu),
5614 le16_to_cpu(cmd->acl_max_pkt));
5615 print_field("SCO MTU: %-4d SCO max packet: %d",
5617 le16_to_cpu(cmd->sco_max_pkt));
5620 static void host_num_completed_packets_cmd(uint16_t index, const void *data,
5623 const struct bt_hci_cmd_host_num_completed_packets *cmd = data;
5625 print_field("Num handles: %d", cmd->num_handles);
5626 print_handle(cmd->handle);
5627 print_field("Count: %d", le16_to_cpu(cmd->count));
5629 if (size > sizeof(*cmd))
5630 packet_hexdump(data + sizeof(*cmd), size - sizeof(*cmd));
5633 static void read_link_supv_timeout_cmd(uint16_t index, const void *data,
5636 const struct bt_hci_cmd_read_link_supv_timeout *cmd = data;
5638 print_handle(cmd->handle);
5641 static void read_link_supv_timeout_rsp(uint16_t index, const void *data,
5644 const struct bt_hci_rsp_read_link_supv_timeout *rsp = data;
5646 print_status(rsp->status);
5647 print_handle(rsp->handle);
5648 print_timeout(rsp->timeout);
5651 static void write_link_supv_timeout_cmd(uint16_t index, const void *data,
5654 const struct bt_hci_cmd_write_link_supv_timeout *cmd = data;
5656 print_handle(cmd->handle);
5657 print_timeout(cmd->timeout);
5660 static void write_link_supv_timeout_rsp(uint16_t index, const void *data,
5663 const struct bt_hci_rsp_write_link_supv_timeout *rsp = data;
5665 print_status(rsp->status);
5666 print_handle(rsp->handle);
5669 static void read_num_supported_iac_rsp(uint16_t index, const void *data,
5672 const struct bt_hci_rsp_read_num_supported_iac *rsp = data;
5674 print_status(rsp->status);
5675 print_field("Number of IAC: %d", rsp->num_iac);
5678 static void read_current_iac_lap_rsp(uint16_t index, const void *data,
5681 const struct bt_hci_rsp_read_current_iac_lap *rsp = data;
5684 print_status(rsp->status);
5685 print_field("Number of IAC: %d", rsp->num_iac);
5687 for (i = 0; i < rsp->num_iac; i++)
5688 print_iac(rsp->iac_lap + (i * 3));
5691 static void write_current_iac_lap_cmd(uint16_t index, const void *data,
5694 const struct bt_hci_cmd_write_current_iac_lap *cmd = data;
5697 print_field("Number of IAC: %d", cmd->num_iac);
5699 for (i = 0; i < cmd->num_iac; i++)
5700 print_iac(cmd->iac_lap + (i * 3));
5703 static void read_page_scan_period_mode_rsp(uint16_t index, const void *data,
5706 const struct bt_hci_rsp_read_page_scan_period_mode *rsp = data;
5708 print_status(rsp->status);
5709 print_pscan_period_mode(rsp->mode);
5712 static void write_page_scan_period_mode_cmd(uint16_t index, const void *data,
5715 const struct bt_hci_cmd_write_page_scan_period_mode *cmd = data;
5717 print_pscan_period_mode(cmd->mode);
5720 static void read_page_scan_mode_rsp(uint16_t index, const void *data,
5723 const struct bt_hci_rsp_read_page_scan_mode *rsp = data;
5725 print_status(rsp->status);
5726 print_pscan_mode(rsp->mode);
5729 static void write_page_scan_mode_cmd(uint16_t index, const void *data,
5732 const struct bt_hci_cmd_write_page_scan_mode *cmd = data;
5734 print_pscan_mode(cmd->mode);
5737 static void set_afh_host_classification_cmd(uint16_t index, const void *data,
5740 const struct bt_hci_cmd_set_afh_host_classification *cmd = data;
5742 print_channel_map(cmd->map);
5745 static void read_inquiry_scan_type_rsp(uint16_t index, const void *data,
5748 const struct bt_hci_rsp_read_inquiry_scan_type *rsp = data;
5750 print_status(rsp->status);
5751 print_inquiry_scan_type(rsp->type);
5754 static void write_inquiry_scan_type_cmd(uint16_t index, const void *data,
5757 const struct bt_hci_cmd_write_inquiry_scan_type *cmd = data;
5759 print_inquiry_scan_type(cmd->type);
5762 static void read_inquiry_mode_rsp(uint16_t index, const void *data,
5765 const struct bt_hci_rsp_read_inquiry_mode *rsp = data;
5767 print_status(rsp->status);
5768 print_inquiry_mode(rsp->mode);
5771 static void write_inquiry_mode_cmd(uint16_t index, const void *data,
5774 const struct bt_hci_cmd_write_inquiry_mode *cmd = data;
5776 print_inquiry_mode(cmd->mode);
5779 static void read_page_scan_type_rsp(uint16_t index, const void *data,
5782 const struct bt_hci_rsp_read_page_scan_type *rsp = data;
5784 print_status(rsp->status);
5785 print_pscan_type(rsp->type);
5788 static void write_page_scan_type_cmd(uint16_t index, const void *data,
5791 const struct bt_hci_cmd_write_page_scan_type *cmd = data;
5793 print_pscan_type(cmd->type);
5796 static void read_afh_assessment_mode_rsp(uint16_t index, const void *data,
5799 const struct bt_hci_rsp_read_afh_assessment_mode *rsp = data;
5801 print_status(rsp->status);
5802 print_enable("Mode", rsp->mode);
5805 static void write_afh_assessment_mode_cmd(uint16_t index, const void *data,
5808 const struct bt_hci_cmd_write_afh_assessment_mode *cmd = data;
5810 print_enable("Mode", cmd->mode);
5813 static void read_ext_inquiry_response_rsp(uint16_t index, const void *data,
5816 const struct bt_hci_rsp_read_ext_inquiry_response *rsp = data;
5818 print_status(rsp->status);
5819 print_fec(rsp->fec);
5820 print_eir(rsp->data, sizeof(rsp->data), false);
5823 static void write_ext_inquiry_response_cmd(uint16_t index, const void *data,
5826 const struct bt_hci_cmd_write_ext_inquiry_response *cmd = data;
5828 print_fec(cmd->fec);
5829 print_eir(cmd->data, sizeof(cmd->data), false);
5832 static void refresh_encrypt_key_cmd(uint16_t index, const void *data,
5835 const struct bt_hci_cmd_refresh_encrypt_key *cmd = data;
5837 print_handle(cmd->handle);
5840 static void read_simple_pairing_mode_rsp(uint16_t index, const void *data,
5843 const struct bt_hci_rsp_read_simple_pairing_mode *rsp = data;
5845 print_status(rsp->status);
5846 print_enable("Mode", rsp->mode);
5849 static void write_simple_pairing_mode_cmd(uint16_t index, const void *data,
5852 const struct bt_hci_cmd_write_simple_pairing_mode *cmd = data;
5854 print_enable("Mode", cmd->mode);
5857 static void read_local_oob_data_rsp(uint16_t index, const void *data,
5860 const struct bt_hci_rsp_read_local_oob_data *rsp = data;
5862 print_status(rsp->status);
5863 print_hash_p192(rsp->hash);
5864 print_randomizer_p192(rsp->randomizer);
5867 static void read_inquiry_resp_tx_power_rsp(uint16_t index, const void *data,
5870 const struct bt_hci_rsp_read_inquiry_resp_tx_power *rsp = data;
5872 print_status(rsp->status);
5873 print_power_level(rsp->level, NULL);
5876 static void write_inquiry_tx_power_cmd(uint16_t index, const void *data,
5879 const struct bt_hci_cmd_write_inquiry_tx_power *cmd = data;
5881 print_power_level(cmd->level, NULL);
5884 static void read_erroneous_reporting_rsp(uint16_t index, const void *data,
5887 const struct bt_hci_rsp_read_erroneous_reporting *rsp = data;
5889 print_status(rsp->status);
5890 print_enable("Mode", rsp->mode);
5893 static void write_erroneous_reporting_cmd(uint16_t index, const void *data,
5896 const struct bt_hci_cmd_write_erroneous_reporting *cmd = data;
5898 print_enable("Mode", cmd->mode);
5901 static void enhanced_flush_cmd(uint16_t index, const void *data, uint8_t size)
5903 const struct bt_hci_cmd_enhanced_flush *cmd = data;
5906 print_handle(cmd->handle);
5908 switch (cmd->type) {
5910 str = "Automatic flushable only";
5917 print_field("Type: %s (0x%2.2x)", str, cmd->type);
5920 static void send_keypress_notify_cmd(uint16_t index, const void *data,
5923 const struct bt_hci_cmd_send_keypress_notify *cmd = data;
5926 print_bdaddr(cmd->bdaddr);
5928 switch (cmd->type) {
5930 str = "Passkey entry started";
5933 str = "Passkey digit entered";
5936 str = "Passkey digit erased";
5939 str = "Passkey cleared";
5942 str = "Passkey entry completed";
5949 print_field("Type: %s (0x%2.2x)", str, cmd->type);
5952 static void send_keypress_notify_rsp(uint16_t index, const void *data,
5955 const struct bt_hci_rsp_send_keypress_notify *rsp = data;
5957 print_status(rsp->status);
5958 print_bdaddr(rsp->bdaddr);
5961 static void set_event_mask_page2_cmd(uint16_t index, const void *data,
5964 const struct bt_hci_cmd_set_event_mask_page2 *cmd = data;
5966 print_event_mask(cmd->mask, events_page2_table);
5969 static void read_location_data_rsp(uint16_t index, const void *data,
5972 const struct bt_hci_rsp_read_location_data *rsp = data;
5974 print_status(rsp->status);
5975 print_location_domain_aware(rsp->domain_aware);
5976 print_location_domain(rsp->domain);
5977 print_location_domain_options(rsp->domain_options);
5978 print_location_options(rsp->options);
5981 static void write_location_data_cmd(uint16_t index, const void *data,
5984 const struct bt_hci_cmd_write_location_data *cmd = data;
5986 print_location_domain_aware(cmd->domain_aware);
5987 print_location_domain(cmd->domain);
5988 print_location_domain_options(cmd->domain_options);
5989 print_location_options(cmd->options);
5992 static void read_flow_control_mode_rsp(uint16_t index, const void *data,
5995 const struct bt_hci_rsp_read_flow_control_mode *rsp = data;
5997 print_status(rsp->status);
5998 print_flow_control_mode(rsp->mode);
6001 static void write_flow_control_mode_cmd(uint16_t index, const void *data,
6004 const struct bt_hci_cmd_write_flow_control_mode *cmd = data;
6006 print_flow_control_mode(cmd->mode);
6009 static void read_enhanced_tx_power_cmd(uint16_t index, const void *data,
6012 const struct bt_hci_cmd_read_enhanced_tx_power *cmd = data;
6014 print_handle(cmd->handle);
6015 print_power_type(cmd->type);
6018 static void read_enhanced_tx_power_rsp(uint16_t index, const void *data,
6021 const struct bt_hci_rsp_read_enhanced_tx_power *rsp = data;
6023 print_status(rsp->status);
6024 print_handle(rsp->handle);
6025 print_power_level(rsp->level_gfsk, "GFSK");
6026 print_power_level(rsp->level_dqpsk, "DQPSK");
6027 print_power_level(rsp->level_8dpsk, "8DPSK");
6030 static void short_range_mode_cmd(uint16_t index, const void *data, uint8_t size)
6032 const struct bt_hci_cmd_short_range_mode *cmd = data;
6034 print_phy_handle(cmd->phy_handle);
6035 print_enable("Short range mode", cmd->mode);
6038 static void read_le_host_supported_rsp(uint16_t index, const void *data,
6041 const struct bt_hci_rsp_read_le_host_supported *rsp = data;
6043 print_status(rsp->status);
6044 print_field("Supported: 0x%2.2x", rsp->supported);
6045 print_field("Simultaneous: 0x%2.2x", rsp->simultaneous);
6048 static void write_le_host_supported_cmd(uint16_t index, const void *data,
6051 const struct bt_hci_cmd_write_le_host_supported *cmd = data;
6053 print_field("Supported: 0x%2.2x", cmd->supported);
6054 print_field("Simultaneous: 0x%2.2x", cmd->simultaneous);
6057 static void set_reserved_lt_addr_cmd(uint16_t index, const void *data,
6060 const struct bt_hci_cmd_set_reserved_lt_addr *cmd = data;
6062 print_lt_addr(cmd->lt_addr);
6065 static void set_reserved_lt_addr_rsp(uint16_t index, const void *data,
6068 const struct bt_hci_rsp_set_reserved_lt_addr *rsp = data;
6070 print_status(rsp->status);
6071 print_lt_addr(rsp->lt_addr);
6074 static void delete_reserved_lt_addr_cmd(uint16_t index, const void *data,
6077 const struct bt_hci_cmd_delete_reserved_lt_addr *cmd = data;
6079 print_lt_addr(cmd->lt_addr);
6082 static void delete_reserved_lt_addr_rsp(uint16_t index, const void *data,
6085 const struct bt_hci_rsp_delete_reserved_lt_addr *rsp = data;
6087 print_status(rsp->status);
6088 print_lt_addr(rsp->lt_addr);
6091 static void set_peripheral_broadcast_data_cmd(uint16_t index, const void *data,
6094 const struct bt_hci_cmd_set_peripheral_broadcast_data *cmd = data;
6096 print_lt_addr(cmd->lt_addr);
6097 print_broadcast_fragment(cmd->fragment);
6098 print_field("Length: %d", cmd->length);
6100 if (size - 3 != cmd->length)
6101 print_text(COLOR_ERROR, "invalid data size (%d != %d)",
6102 size - 3, cmd->length);
6104 packet_hexdump(data + 3, size - 3);
6107 static void set_peripheral_broadcast_data_rsp(uint16_t index, const void *data,
6110 const struct bt_hci_rsp_set_peripheral_broadcast_data *rsp = data;
6112 print_status(rsp->status);
6113 print_lt_addr(rsp->lt_addr);
6116 static void read_sync_train_params_rsp(uint16_t index, const void *data,
6119 const struct bt_hci_rsp_read_sync_train_params *rsp = data;
6121 print_status(rsp->status);
6122 print_interval(rsp->interval);
6123 print_field("Timeout: %.3f msec (0x%8.8x)",
6124 le32_to_cpu(rsp->timeout) * 0.625,
6125 le32_to_cpu(rsp->timeout));
6126 print_field("Service data: 0x%2.2x", rsp->service_data);
6129 static void write_sync_train_params_cmd(uint16_t index, const void *data,
6132 const struct bt_hci_cmd_write_sync_train_params *cmd = data;
6134 print_slot_625("Min interval", cmd->min_interval);
6135 print_slot_625("Max interval", cmd->max_interval);
6136 print_field("Timeout: %.3f msec (0x%8.8x)",
6137 le32_to_cpu(cmd->timeout) * 0.625,
6138 le32_to_cpu(cmd->timeout));
6139 print_field("Service data: 0x%2.2x", cmd->service_data);
6142 static void write_sync_train_params_rsp(uint16_t index, const void *data,
6145 const struct bt_hci_rsp_write_sync_train_params *rsp = data;
6147 print_status(rsp->status);
6148 print_interval(rsp->interval);
6151 static void read_secure_conn_support_rsp(uint16_t index, const void *data,
6154 const struct bt_hci_rsp_read_secure_conn_support *rsp = data;
6156 print_status(rsp->status);
6157 print_enable("Support", rsp->support);
6160 static void write_secure_conn_support_cmd(uint16_t index, const void *data,
6163 const struct bt_hci_cmd_write_secure_conn_support *cmd = data;
6165 print_enable("Support", cmd->support);
6168 static void read_auth_payload_timeout_cmd(uint16_t index, const void *data,
6171 const struct bt_hci_cmd_read_auth_payload_timeout *cmd = data;
6173 print_handle(cmd->handle);
6176 static void read_auth_payload_timeout_rsp(uint16_t index, const void *data,
6179 const struct bt_hci_rsp_read_auth_payload_timeout *rsp = data;
6181 print_status(rsp->status);
6182 print_handle(rsp->handle);
6183 print_auth_payload_timeout(rsp->timeout);
6186 static void write_auth_payload_timeout_cmd(uint16_t index, const void *data,
6189 const struct bt_hci_cmd_write_auth_payload_timeout *cmd = data;
6191 print_handle(cmd->handle);
6192 print_auth_payload_timeout(cmd->timeout);
6195 static void write_auth_payload_timeout_rsp(uint16_t index, const void *data,
6198 const struct bt_hci_rsp_write_auth_payload_timeout *rsp = data;
6200 print_status(rsp->status);
6201 print_handle(rsp->handle);
6204 static void read_local_oob_ext_data_rsp(uint16_t index, const void *data,
6207 const struct bt_hci_rsp_read_local_oob_ext_data *rsp = data;
6209 print_status(rsp->status);
6210 print_hash_p192(rsp->hash192);
6211 print_randomizer_p192(rsp->randomizer192);
6212 print_hash_p256(rsp->hash256);
6213 print_randomizer_p256(rsp->randomizer256);
6216 static void read_ext_page_timeout_rsp(uint16_t index, const void *data,
6219 const struct bt_hci_rsp_read_ext_page_timeout *rsp = data;
6221 print_status(rsp->status);
6222 print_timeout(rsp->timeout);
6225 static void write_ext_page_timeout_cmd(uint16_t index, const void *data,
6228 const struct bt_hci_cmd_write_ext_page_timeout *cmd = data;
6230 print_timeout(cmd->timeout);
6233 static void read_ext_inquiry_length_rsp(uint16_t index, const void *data,
6236 const struct bt_hci_rsp_read_ext_inquiry_length *rsp = data;
6238 print_status(rsp->status);
6239 print_interval(rsp->interval);
6242 static void write_ext_inquiry_length_cmd(uint16_t index, const void *data,
6245 const struct bt_hci_cmd_write_ext_inquiry_length *cmd = data;
6247 print_interval(cmd->interval);
6250 static void read_local_version_rsp(uint16_t index, const void *data,
6253 const struct bt_hci_rsp_read_local_version *rsp = data;
6254 uint16_t manufacturer;
6256 print_status(rsp->status);
6257 print_hci_version(rsp->hci_ver, rsp->hci_rev);
6259 manufacturer = le16_to_cpu(rsp->manufacturer);
6261 if (index_current < MAX_INDEX) {
6262 switch (index_list[index_current].type) {
6264 print_lmp_version(rsp->lmp_ver, rsp->lmp_subver);
6267 print_pal_version(rsp->lmp_ver, rsp->lmp_subver);
6271 index_list[index_current].manufacturer = manufacturer;
6274 print_manufacturer(rsp->manufacturer);
6276 switch (manufacturer) {
6278 print_manufacturer_broadcom(rsp->lmp_subver, rsp->hci_rev);
6283 static void read_local_commands_rsp(uint16_t index, const void *data,
6286 const struct bt_hci_rsp_read_local_commands *rsp = data;
6288 print_status(rsp->status);
6289 print_commands(rsp->commands);
6292 static void read_local_features_rsp(uint16_t index, const void *data,
6295 const struct bt_hci_rsp_read_local_features *rsp = data;
6297 print_status(rsp->status);
6298 print_features(0, rsp->features, 0x00);
6301 static void read_local_ext_features_cmd(uint16_t index, const void *data,
6304 const struct bt_hci_cmd_read_local_ext_features *cmd = data;
6306 print_field("Page: %d", cmd->page);
6309 static void read_local_ext_features_rsp(uint16_t index, const void *data,
6312 const struct bt_hci_rsp_read_local_ext_features *rsp = data;
6314 print_status(rsp->status);
6315 print_field("Page: %d/%d", rsp->page, rsp->max_page);
6316 print_features(rsp->page, rsp->features, 0x00);
6319 static void read_buffer_size_rsp(uint16_t index, const void *data, uint8_t size)
6321 const struct bt_hci_rsp_read_buffer_size *rsp = data;
6323 print_status(rsp->status);
6324 print_field("ACL MTU: %-4d ACL max packet: %d",
6325 le16_to_cpu(rsp->acl_mtu),
6326 le16_to_cpu(rsp->acl_max_pkt));
6327 print_field("SCO MTU: %-4d SCO max packet: %d",
6329 le16_to_cpu(rsp->sco_max_pkt));
6332 static void read_country_code_rsp(uint16_t index, const void *data,
6335 const struct bt_hci_rsp_read_country_code *rsp = data;
6338 print_status(rsp->status);
6340 switch (rsp->code) {
6342 str = "North America, Europe*, Japan";
6352 print_field("Country code: %s (0x%2.2x)", str, rsp->code);
6355 static void read_bd_addr_rsp(uint16_t index, const void *data, uint8_t size)
6357 const struct bt_hci_rsp_read_bd_addr *rsp = data;
6359 print_status(rsp->status);
6360 print_bdaddr(rsp->bdaddr);
6362 if (index_current < MAX_INDEX)
6363 memcpy(index_list[index_current].bdaddr, rsp->bdaddr, 6);
6366 static void read_data_block_size_rsp(uint16_t index, const void *data,
6369 const struct bt_hci_rsp_read_data_block_size *rsp = data;
6371 print_status(rsp->status);
6372 print_field("Max ACL length: %d", le16_to_cpu(rsp->max_acl_len));
6373 print_field("Block length: %d", le16_to_cpu(rsp->block_len));
6374 print_field("Num blocks: %d", le16_to_cpu(rsp->num_blocks));
6377 static void read_local_codecs_rsp(uint16_t index, const void *data,
6380 const struct bt_hci_rsp_read_local_codecs *rsp = data;
6381 uint8_t i, num_vnd_codecs;
6383 if (rsp->num_codecs + 3 > size) {
6384 print_field("Invalid number of codecs.");
6388 print_status(rsp->status);
6389 print_field("Number of supported codecs: %d", rsp->num_codecs);
6391 for (i = 0; i < rsp->num_codecs; i++)
6392 print_codec_id(" Codec", rsp->codec[i]);
6394 num_vnd_codecs = rsp->codec[rsp->num_codecs];
6396 print_field("Number of vendor codecs: %d", num_vnd_codecs);
6398 packet_hexdump(data + rsp->num_codecs + 3,
6399 size - rsp->num_codecs - 3);
6402 static void print_codecs(const void *data, int i)
6404 const struct bt_hci_codec *codec = data;
6406 print_codec(" Codec", codec);
6409 typedef void (*print_list_func_t)(const void *data, int i);
6411 static void print_list(const void *data, uint8_t size, int num_items,
6412 size_t item_size, print_list_func_t func)
6416 for (i = 0; size >= item_size && num_items; i++) {
6425 print_hex_field("", data, size);
6428 static void print_vnd_codecs_v2(const void *data, int i)
6430 const struct bt_hci_vnd_codec_v2 *codec = data;
6433 packet_print_company(" Company ID", le16_to_cpu(codec->cid));
6434 print_field(" Vendor Codec ID: 0x%4.4x", le16_to_cpu(codec->vid));
6435 print_field(" Logical Transport Type: 0x%02x", codec->transport);
6436 mask = print_bitfield(4, codec->transport, codec_transport_table);
6438 print_text(COLOR_UNKNOWN_SERVICE_CLASS,
6439 " Unknown transport (0x%2.2x)", mask);
6442 static void read_local_codecs_rsp_v2(uint16_t index, const void *data,
6445 const struct bt_hci_rsp_read_local_codecs_v2 *rsp = data;
6446 uint8_t num_vnd_codecs;
6448 if (rsp->num_codecs + 3 > size) {
6449 print_field("Invalid number of codecs.");
6453 print_status(rsp->status);
6454 print_field("Number of supported codecs: %d", rsp->num_codecs);
6456 size -= sizeof(*rsp);
6458 if (size < rsp->num_codecs * sizeof(*rsp->codec)) {
6459 print_field("Invalid number of codecs.");
6463 print_list(rsp->codec, size, rsp->num_codecs, sizeof(*rsp->codec),
6466 size -= rsp->num_codecs * sizeof(*rsp->codec);
6468 if (size < sizeof(uint8_t)) {
6469 print_field("Invalid number of vendor codecs.");
6473 num_vnd_codecs = rsp->codec[rsp->num_codecs].id;
6477 print_field("Number of vendor codecs: %d", num_vnd_codecs);
6479 if (size < num_vnd_codecs * sizeof(*rsp->codec)) {
6480 print_field("Invalid number of vendor codecs.");
6484 print_list(&rsp->codec[rsp->num_codecs] + 1, size, num_vnd_codecs,
6485 sizeof(struct bt_hci_vnd_codec_v2),
6486 print_vnd_codecs_v2);
6489 static void print_path_direction(const char *prefix, uint8_t dir)
6495 str = "Input (Host to Controller)";
6498 str = "Output (Controller to Host)";
6505 print_field("%s: %s (0x%2.2x)", prefix, str, dir);
6508 static void print_vnd_codec(const char *label,
6509 const struct bt_hci_vnd_codec *codec)
6513 print_codec_id(label, codec->id);
6515 if (codec->id == 0xff) {
6516 packet_print_company("Company Codec ID",
6517 le16_to_cpu(codec->cid));
6518 print_field("Vendor Codec ID: %d", le16_to_cpu(codec->vid));
6521 print_field("Logical Transport Type: 0x%02x", codec->transport);
6522 mask = print_bitfield(2, codec->transport, codec_transport_table);
6524 print_text(COLOR_UNKNOWN_SERVICE_CLASS,
6525 " Unknown transport (0x%2.2x)", mask);
6528 static void read_local_codec_caps_cmd(uint16_t index, const void *data,
6531 const struct bt_hci_cmd_read_local_codec_caps *cmd = data;
6533 print_vnd_codec("Codec", &cmd->codec);
6534 print_path_direction("Direction", cmd->dir);
6537 static void read_local_codec_caps_rsp(uint16_t index, const void *data,
6540 const struct bt_hci_rsp_read_local_codec_caps *rsp = data;
6543 print_status(rsp->status);
6544 print_field("Number of codec capabilities: %d", rsp->num);
6546 data += sizeof(*rsp);
6547 size -= sizeof(*rsp);
6549 for (i = 0; i < rsp->num; i++) {
6550 const struct bt_hci_codec_caps *caps = data;
6552 if (size < sizeof(*caps)) {
6553 print_field("Invalid capabilities: %u < %zu",
6554 size, sizeof(*caps));
6558 print_field(" Capabilities #%u:", i);
6559 packet_hexdump(caps->data, caps->len);
6561 data += 1 + caps->len;
6562 size -= 1 + caps->len;
6566 static void read_local_ctrl_delay_cmd(uint16_t index, const void *data,
6569 const struct bt_hci_cmd_read_local_ctrl_delay *cmd = data;
6571 print_vnd_codec("Codec", &cmd->codec);
6572 print_path_direction("Direction", cmd->dir);
6573 print_field("Length Codec Configuration: %u", cmd->codec_cfg_len);
6576 static void config_data_path_cmd(uint16_t index, const void *data, uint8_t size)
6578 const struct bt_hci_cmd_config_data_path *cmd = data;
6580 print_path_direction("Direction", cmd->dir);
6581 print_field("ID: %u", cmd->id);
6582 print_field("Vendor Specific Config Length: %u", cmd->vnd_config_len);
6583 print_hex_field("Vendor Specific Config", cmd->vnd_config,
6584 cmd->vnd_config_len);
6587 static void print_usec_interval(const char *prefix, const uint8_t interval[3])
6589 uint32_t value = get_le24(interval);
6591 print_field("%s: %u us (0x%6.6x)", prefix, value, value);
6594 static void read_local_ctrl_delay_rsp(uint16_t index, const void *data,
6597 const struct bt_hci_rsp_read_local_ctrl_delay *rsp = data;
6599 print_status(rsp->status);
6600 print_usec_interval("Minimum Controller delay", rsp->min_delay);
6601 print_usec_interval("Maximum Controller delay", rsp->max_delay);
6604 static void read_local_pairing_options_rsp(uint16_t index, const void *data,
6607 const struct bt_hci_rsp_read_local_pairing_options *rsp = data;
6609 print_status(rsp->status);
6610 print_field("Pairing options: 0x%2.2x", rsp->pairing_options);
6611 print_field("Max encryption key size: %u octets", rsp->max_key_size);
6614 static void read_failed_contact_counter_cmd(uint16_t index, const void *data,
6617 const struct bt_hci_cmd_read_failed_contact_counter *cmd = data;
6619 print_handle(cmd->handle);
6622 static void read_failed_contact_counter_rsp(uint16_t index, const void *data,
6625 const struct bt_hci_rsp_read_failed_contact_counter *rsp = data;
6627 print_status(rsp->status);
6628 print_handle(rsp->handle);
6629 print_field("Counter: %u", le16_to_cpu(rsp->counter));
6632 static void reset_failed_contact_counter_cmd(uint16_t index, const void *data,
6635 const struct bt_hci_cmd_reset_failed_contact_counter *cmd = data;
6637 print_handle(cmd->handle);
6640 static void reset_failed_contact_counter_rsp(uint16_t index, const void *data,
6643 const struct bt_hci_rsp_reset_failed_contact_counter *rsp = data;
6645 print_status(rsp->status);
6646 print_handle(rsp->handle);
6649 static void read_link_quality_cmd(uint16_t index, const void *data,
6652 const struct bt_hci_cmd_read_link_quality *cmd = data;
6654 print_handle(cmd->handle);
6657 static void read_link_quality_rsp(uint16_t index, const void *data,
6660 const struct bt_hci_rsp_read_link_quality *rsp = data;
6662 print_status(rsp->status);
6663 print_handle(rsp->handle);
6664 print_field("Link quality: 0x%2.2x", rsp->link_quality);
6667 static void read_rssi_cmd(uint16_t index, const void *data, uint8_t size)
6669 const struct bt_hci_cmd_read_rssi *cmd = data;
6671 print_handle(cmd->handle);
6674 static void read_rssi_rsp(uint16_t index, const void *data, uint8_t size)
6676 const struct bt_hci_rsp_read_rssi *rsp = data;
6678 print_status(rsp->status);
6679 print_handle(rsp->handle);
6680 print_rssi(rsp->rssi);
6683 static void read_afh_channel_map_cmd(uint16_t index, const void *data,
6686 const struct bt_hci_cmd_read_afh_channel_map *cmd = data;
6688 print_handle(cmd->handle);
6691 static void read_afh_channel_map_rsp(uint16_t index, const void *data,
6694 const struct bt_hci_rsp_read_afh_channel_map *rsp = data;
6696 print_status(rsp->status);
6697 print_handle(rsp->handle);
6698 print_enable("Mode", rsp->mode);
6699 print_channel_map(rsp->map);
6702 static void read_clock_cmd(uint16_t index, const void *data, uint8_t size)
6704 const struct bt_hci_cmd_read_clock *cmd = data;
6706 print_handle(cmd->handle);
6707 print_clock_type(cmd->type);
6710 static void read_clock_rsp(uint16_t index, const void *data, uint8_t size)
6712 const struct bt_hci_rsp_read_clock *rsp = data;
6714 print_status(rsp->status);
6715 print_handle(rsp->handle);
6716 print_clock(rsp->clock);
6717 print_clock_accuracy(rsp->accuracy);
6720 static void read_encrypt_key_size_cmd(uint16_t index, const void *data,
6723 const struct bt_hci_cmd_read_encrypt_key_size *cmd = data;
6725 print_handle(cmd->handle);
6728 static void read_encrypt_key_size_rsp(uint16_t index, const void *data,
6731 const struct bt_hci_rsp_read_encrypt_key_size *rsp = data;
6733 print_status(rsp->status);
6734 print_handle(rsp->handle);
6735 print_key_size(rsp->key_size);
6738 static void read_local_amp_info_rsp(uint16_t index, const void *data,
6741 const struct bt_hci_rsp_read_local_amp_info *rsp = data;
6744 print_status(rsp->status);
6745 print_amp_status(rsp->amp_status);
6747 print_field("Total bandwidth: %d kbps", le32_to_cpu(rsp->total_bw));
6748 print_field("Max guaranteed bandwidth: %d kbps",
6749 le32_to_cpu(rsp->max_bw));
6750 print_field("Min latency: %d", le32_to_cpu(rsp->min_latency));
6751 print_field("Max PDU size: %d", le32_to_cpu(rsp->max_pdu));
6753 switch (rsp->amp_type) {
6755 str = "Primary BR/EDR Controller";
6758 str = "802.11 AMP Controller";
6765 print_field("Controller type: %s (0x%2.2x)", str, rsp->amp_type);
6767 print_field("PAL capabilities: 0x%4.4x", le16_to_cpu(rsp->pal_cap));
6768 print_field("Max ASSOC length: %d", le16_to_cpu(rsp->max_assoc_len));
6769 print_field("Max flush timeout: %d", le32_to_cpu(rsp->max_flush_to));
6770 print_field("Best effort flush timeout: %d",
6771 le32_to_cpu(rsp->be_flush_to));
6774 static void read_local_amp_assoc_cmd(uint16_t index, const void *data,
6777 const struct bt_hci_cmd_read_local_amp_assoc *cmd = data;
6779 print_phy_handle(cmd->phy_handle);
6780 print_field("Length so far: %d", le16_to_cpu(cmd->len_so_far));
6781 print_field("Max ASSOC length: %d", le16_to_cpu(cmd->max_assoc_len));
6784 static void read_local_amp_assoc_rsp(uint16_t index, const void *data,
6787 const struct bt_hci_rsp_read_local_amp_assoc *rsp = data;
6789 print_status(rsp->status);
6790 print_phy_handle(rsp->phy_handle);
6791 print_field("Remaining ASSOC length: %d",
6792 le16_to_cpu(rsp->remain_assoc_len));
6794 packet_hexdump(data + 4, size - 4);
6797 static void write_remote_amp_assoc_cmd(uint16_t index, const void *data,
6800 const struct bt_hci_cmd_write_remote_amp_assoc *cmd = data;
6802 print_phy_handle(cmd->phy_handle);
6803 print_field("Length so far: %d", le16_to_cpu(cmd->len_so_far));
6804 print_field("Remaining ASSOC length: %d",
6805 le16_to_cpu(cmd->remain_assoc_len));
6807 packet_hexdump(data + 5, size - 5);
6810 static void write_remote_amp_assoc_rsp(uint16_t index, const void *data,
6813 const struct bt_hci_rsp_write_remote_amp_assoc *rsp = data;
6815 print_status(rsp->status);
6816 print_phy_handle(rsp->phy_handle);
6819 static void get_mws_transport_config_rsp(uint16_t index, const void *data,
6822 const struct bt_hci_rsp_get_mws_transport_config *rsp = data;
6823 uint8_t sum_baud_rates = 0;
6826 print_status(rsp->status);
6827 print_field("Number of transports: %d", rsp->num_transports);
6829 for (i = 0; i < rsp->num_transports; i++) {
6830 uint8_t transport = rsp->transport[0];
6831 uint8_t num_baud_rates = rsp->transport[1];
6834 switch (transport) {
6849 print_field(" Transport layer: %s (0x%2.2x)", str, transport);
6850 print_field(" Number of baud rates: %d", num_baud_rates);
6852 sum_baud_rates += num_baud_rates;
6855 print_field("Baud rate list: %u entr%s", sum_baud_rates,
6856 sum_baud_rates == 1 ? "y" : "ies");
6858 for (i = 0; i < sum_baud_rates; i++) {
6859 uint32_t to_baud_rate, from_baud_rate;
6861 to_baud_rate = get_le32(data + 2 +
6862 rsp->num_transports * 2 + i * 4);
6863 from_baud_rate = get_le32(data + 2 +
6864 rsp->num_transports * 2 +
6865 sum_baud_rates * 4 + i * 4);
6867 print_field(" Bluetooth to MWS: %d", to_baud_rate);
6868 print_field(" MWS to Bluetooth: %d", from_baud_rate);
6871 packet_hexdump(data + 2 + rsp->num_transports * 2 + sum_baud_rates * 8,
6872 size - 2 - rsp->num_transports * 2 - sum_baud_rates * 8);
6875 static void set_triggered_clock_capture_cmd(uint16_t index, const void *data,
6878 const struct bt_hci_cmd_set_triggered_clock_capture *cmd = data;
6880 print_handle(cmd->handle);
6881 print_enable("Capture", cmd->enable);
6882 print_clock_type(cmd->type);
6883 print_lpo_allowed(cmd->lpo_allowed);
6884 print_field("Clock captures to filter: %u", cmd->num_filter);
6887 static void read_loopback_mode_rsp(uint16_t index, const void *data,
6890 const struct bt_hci_rsp_read_loopback_mode *rsp = data;
6892 print_status(rsp->status);
6893 print_loopback_mode(rsp->mode);
6896 static void write_loopback_mode_cmd(uint16_t index, const void *data,
6899 const struct bt_hci_cmd_write_loopback_mode *cmd = data;
6901 print_loopback_mode(cmd->mode);
6904 static void write_ssp_debug_mode_cmd(uint16_t index, const void *data,
6907 const struct bt_hci_cmd_write_ssp_debug_mode *cmd = data;
6909 print_enable("Debug Mode", cmd->mode);
6912 static void le_set_event_mask_cmd(uint16_t index, const void *data,
6915 const struct bt_hci_cmd_le_set_event_mask *cmd = data;
6917 print_event_mask(cmd->mask, events_le_table);
6920 static void le_read_buffer_size_rsp(uint16_t index, const void *data,
6923 const struct bt_hci_rsp_le_read_buffer_size *rsp = data;
6925 print_status(rsp->status);
6926 print_field("Data packet length: %d", le16_to_cpu(rsp->le_mtu));
6927 print_field("Num data packets: %d", rsp->le_max_pkt);
6930 static void le_read_local_features_rsp(uint16_t index, const void *data,
6933 const struct bt_hci_rsp_le_read_local_features *rsp = data;
6935 print_status(rsp->status);
6936 print_features(0, rsp->features, 0x01);
6939 static void le_set_random_address_cmd(uint16_t index, const void *data,
6942 const struct bt_hci_cmd_le_set_random_address *cmd = data;
6944 print_addr("Address", cmd->addr, 0x01);
6947 static void le_set_adv_parameters_cmd(uint16_t index, const void *data,
6950 const struct bt_hci_cmd_le_set_adv_parameters *cmd = data;
6953 print_slot_625("Min advertising interval", cmd->min_interval);
6954 print_slot_625("Max advertising interval", cmd->max_interval);
6956 switch (cmd->type) {
6958 str = "Connectable undirected - ADV_IND";
6961 str = "Connectable directed - ADV_DIRECT_IND (high duty cycle)";
6964 str = "Scannable undirected - ADV_SCAN_IND";
6967 str = "Non connectable undirected - ADV_NONCONN_IND";
6970 str = "Connectable directed - ADV_DIRECT_IND (low duty cycle)";
6977 print_field("Type: %s (0x%2.2x)", str, cmd->type);
6979 print_own_addr_type(cmd->own_addr_type);
6980 print_addr_type("Direct address type", cmd->direct_addr_type);
6981 print_addr("Direct address", cmd->direct_addr, cmd->direct_addr_type);
6982 print_adv_channel_map("Channel map", cmd->channel_map);
6983 print_adv_filter_policy("Filter policy", cmd->filter_policy);
6986 static void le_read_adv_tx_power_rsp(uint16_t index, const void *data,
6989 const struct bt_hci_rsp_le_read_adv_tx_power *rsp = data;
6991 print_status(rsp->status);
6992 print_power_level(rsp->level, NULL);
6995 static void le_set_adv_data_cmd(uint16_t index, const void *data, uint8_t size)
6997 const struct bt_hci_cmd_le_set_adv_data *cmd = data;
6999 print_field("Length: %d", cmd->len);
7000 print_eir(cmd->data, cmd->len, true);
7003 static void le_set_scan_rsp_data_cmd(uint16_t index, const void *data,
7006 const struct bt_hci_cmd_le_set_scan_rsp_data *cmd = data;
7008 print_field("Length: %d", cmd->len);
7009 print_eir(cmd->data, cmd->len, true);
7012 static void le_set_adv_enable_cmd(uint16_t index, const void *data,
7015 const struct bt_hci_cmd_le_set_adv_enable *cmd = data;
7017 print_enable("Advertising", cmd->enable);
7020 static void print_scan_type(const char *label, uint8_t type)
7036 print_field("%s: %s (0x%2.2x)", label, str, type);
7039 static void print_scan_filter_policy(uint8_t policy)
7045 str = "Accept all advertisement";
7048 str = "Ignore not in accept list";
7051 str = "Accept all advertisement, inc. directed unresolved RPA";
7054 str = "Ignore not in accept list, exc. directed unresolved RPA";
7061 print_field("Filter policy: %s (0x%2.2x)", str, policy);
7064 static void le_set_scan_parameters_cmd(uint16_t index, const void *data,
7067 const struct bt_hci_cmd_le_set_scan_parameters *cmd = data;
7069 print_scan_type("Type", cmd->type);
7070 print_interval(cmd->interval);
7071 print_window(cmd->window);
7072 print_own_addr_type(cmd->own_addr_type);
7073 print_scan_filter_policy(cmd->filter_policy);
7076 static void le_set_scan_enable_cmd(uint16_t index, const void *data,
7079 const struct bt_hci_cmd_le_set_scan_enable *cmd = data;
7081 print_enable("Scanning", cmd->enable);
7082 print_enable("Filter duplicates", cmd->filter_dup);
7085 static void le_create_conn_cmd(uint16_t index, const void *data, uint8_t size)
7087 const struct bt_hci_cmd_le_create_conn *cmd = data;
7090 print_slot_625("Scan interval", cmd->scan_interval);
7091 print_slot_625("Scan window", cmd->scan_window);
7093 switch (cmd->filter_policy) {
7095 str = "Accept list is not used";
7098 str = "Accept list is used";
7105 print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
7107 print_peer_addr_type("Peer address type", cmd->peer_addr_type);
7108 print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);
7109 print_own_addr_type(cmd->own_addr_type);
7111 print_slot_125("Min connection interval", cmd->min_interval);
7112 print_slot_125("Max connection interval", cmd->max_interval);
7113 print_conn_latency("Connection latency", cmd->latency);
7114 print_field("Supervision timeout: %d msec (0x%4.4x)",
7115 le16_to_cpu(cmd->supv_timeout) * 10,
7116 le16_to_cpu(cmd->supv_timeout));
7117 print_slot_625("Min connection length", cmd->min_length);
7118 print_slot_625("Max connection length", cmd->max_length);
7121 static void le_read_accept_list_size_rsp(uint16_t index, const void *data,
7124 const struct bt_hci_rsp_le_read_accept_list_size *rsp = data;
7126 print_status(rsp->status);
7127 print_field("Size: %u", rsp->size);
7130 static void le_add_to_accept_list_cmd(uint16_t index, const void *data,
7133 const struct bt_hci_cmd_le_add_to_accept_list *cmd = data;
7135 print_addr_type("Address type", cmd->addr_type);
7136 print_addr("Address", cmd->addr, cmd->addr_type);
7139 static void le_remove_from_accept_list_cmd(uint16_t index, const void *data,
7142 const struct bt_hci_cmd_le_remove_from_accept_list *cmd = data;
7144 print_addr_type("Address type", cmd->addr_type);
7145 print_addr("Address", cmd->addr, cmd->addr_type);
7148 static void le_conn_update_cmd(uint16_t index, const void *data, uint8_t size)
7150 const struct bt_hci_cmd_le_conn_update *cmd = data;
7152 print_handle(cmd->handle);
7153 print_slot_125("Min connection interval", cmd->min_interval);
7154 print_slot_125("Max connection interval", cmd->max_interval);
7155 print_conn_latency("Connection latency", cmd->latency);
7156 print_field("Supervision timeout: %d msec (0x%4.4x)",
7157 le16_to_cpu(cmd->supv_timeout) * 10,
7158 le16_to_cpu(cmd->supv_timeout));
7159 print_slot_625("Min connection length", cmd->min_length);
7160 print_slot_625("Max connection length", cmd->max_length);
7163 static void le_set_host_classification_cmd(uint16_t index, const void *data,
7166 const struct bt_hci_cmd_le_set_host_classification *cmd = data;
7168 print_le_channel_map(cmd->map);
7171 static void le_read_channel_map_cmd(uint16_t index, const void *data,
7174 const struct bt_hci_cmd_le_read_channel_map *cmd = data;
7176 print_handle(cmd->handle);
7179 static void le_read_channel_map_rsp(uint16_t index, const void *data,
7182 const struct bt_hci_rsp_le_read_channel_map *rsp = data;
7184 print_status(rsp->status);
7185 print_handle(rsp->handle);
7186 print_le_channel_map(rsp->map);
7189 static void le_read_remote_features_cmd(uint16_t index, const void *data,
7192 const struct bt_hci_cmd_le_read_remote_features *cmd = data;
7194 print_handle(cmd->handle);
7197 static void le_encrypt_cmd(uint16_t index, const void *data, uint8_t size)
7199 const struct bt_hci_cmd_le_encrypt *cmd = data;
7201 print_key("Key", cmd->key);
7202 print_key("Plaintext data", cmd->plaintext);
7205 static void le_encrypt_rsp(uint16_t index, const void *data, uint8_t size)
7207 const struct bt_hci_rsp_le_encrypt *rsp = data;
7209 print_status(rsp->status);
7210 print_key("Encrypted data", rsp->data);
7213 static void le_rand_rsp(uint16_t index, const void *data, uint8_t size)
7215 const struct bt_hci_rsp_le_rand *rsp = data;
7217 print_status(rsp->status);
7218 print_random_number(rsp->number);
7221 static void le_start_encrypt_cmd(uint16_t index, const void *data, uint8_t size)
7223 const struct bt_hci_cmd_le_start_encrypt *cmd = data;
7225 print_handle(cmd->handle);
7226 print_random_number(cmd->rand);
7227 print_encrypted_diversifier(cmd->ediv);
7228 print_key("Long term key", cmd->ltk);
7231 static void le_ltk_req_reply_cmd(uint16_t index, const void *data, uint8_t size)
7233 const struct bt_hci_cmd_le_ltk_req_reply *cmd = data;
7235 print_handle(cmd->handle);
7236 print_key("Long term key", cmd->ltk);
7239 static void le_ltk_req_reply_rsp(uint16_t index, const void *data, uint8_t size)
7241 const struct bt_hci_rsp_le_ltk_req_reply *rsp = data;
7243 print_status(rsp->status);
7244 print_handle(rsp->handle);
7247 static void le_ltk_req_neg_reply_cmd(uint16_t index, const void *data,
7250 const struct bt_hci_cmd_le_ltk_req_neg_reply *cmd = data;
7252 print_handle(cmd->handle);
7255 static void le_ltk_req_neg_reply_rsp(uint16_t index, const void *data,
7258 const struct bt_hci_rsp_le_ltk_req_neg_reply *rsp = data;
7260 print_status(rsp->status);
7261 print_handle(rsp->handle);
7264 static void le_read_supported_states_rsp(uint16_t index, const void *data,
7267 const struct bt_hci_rsp_le_read_supported_states *rsp = data;
7269 print_status(rsp->status);
7270 print_le_states(rsp->states);
7273 static void le_receiver_test_cmd(uint16_t index, const void *data, uint8_t size)
7275 const struct bt_hci_cmd_le_receiver_test *cmd = data;
7277 print_field("RX frequency: %d MHz (0x%2.2x)",
7278 (cmd->frequency * 2) + 2402, cmd->frequency);
7281 static void le_transmitter_test_cmd(uint16_t index, const void *data,
7284 const struct bt_hci_cmd_le_transmitter_test *cmd = data;
7286 print_field("TX frequency: %d MHz (0x%2.2x)",
7287 (cmd->frequency * 2) + 2402, cmd->frequency);
7288 print_field("Test data length: %d bytes", cmd->data_len);
7289 print_field("Packet payload: 0x%2.2x", cmd->payload);
7292 static void le_test_end_rsp(uint16_t index, const void *data, uint8_t size)
7294 const struct bt_hci_rsp_le_test_end *rsp = data;
7296 print_status(rsp->status);
7297 print_field("Number of packets: %d", le16_to_cpu(rsp->num_packets));
7300 static void le_conn_param_req_reply_cmd(uint16_t index, const void *data,
7303 const struct bt_hci_cmd_le_conn_param_req_reply *cmd = data;
7305 print_handle(cmd->handle);
7306 print_slot_125("Min connection interval", cmd->min_interval);
7307 print_slot_125("Max connection interval", cmd->max_interval);
7308 print_conn_latency("Connection latency", cmd->latency);
7309 print_field("Supervision timeout: %d msec (0x%4.4x)",
7310 le16_to_cpu(cmd->supv_timeout) * 10,
7311 le16_to_cpu(cmd->supv_timeout));
7312 print_slot_625("Min connection length", cmd->min_length);
7313 print_slot_625("Max connection length", cmd->max_length);
7316 static void le_conn_param_req_reply_rsp(uint16_t index, const void *data,
7319 const struct bt_hci_rsp_le_conn_param_req_reply *rsp = data;
7321 print_status(rsp->status);
7322 print_handle(rsp->handle);
7325 static void le_conn_param_req_neg_reply_cmd(uint16_t index, const void *data,
7328 const struct bt_hci_cmd_le_conn_param_req_neg_reply *cmd = data;
7330 print_handle(cmd->handle);
7331 print_reason(cmd->reason);
7334 static void le_conn_param_req_neg_reply_rsp(uint16_t index, const void *data,
7337 const struct bt_hci_rsp_le_conn_param_req_neg_reply *rsp = data;
7339 print_status(rsp->status);
7340 print_handle(rsp->handle);
7343 static void le_set_data_length_cmd(uint16_t index, const void *data,
7346 const struct bt_hci_cmd_le_set_data_length *cmd = data;
7348 print_handle(cmd->handle);
7349 print_field("TX octets: %d", le16_to_cpu(cmd->tx_len));
7350 print_field("TX time: %d", le16_to_cpu(cmd->tx_time));
7353 static void le_set_data_length_rsp(uint16_t index, const void *data,
7356 const struct bt_hci_rsp_le_set_data_length *rsp = data;
7358 print_status(rsp->status);
7359 print_handle(rsp->handle);
7362 static void le_read_default_data_length_rsp(uint16_t index, const void *data,
7365 const struct bt_hci_rsp_le_read_default_data_length *rsp = data;
7367 print_status(rsp->status);
7368 print_field("TX octets: %d", le16_to_cpu(rsp->tx_len));
7369 print_field("TX time: %d", le16_to_cpu(rsp->tx_time));
7372 static void le_write_default_data_length_cmd(uint16_t index, const void *data,
7375 const struct bt_hci_cmd_le_write_default_data_length *cmd = data;
7377 print_field("TX octets: %d", le16_to_cpu(cmd->tx_len));
7378 print_field("TX time: %d", le16_to_cpu(cmd->tx_time));
7381 static void le_generate_dhkey_cmd(uint16_t index, const void *data,
7384 const struct bt_hci_cmd_le_generate_dhkey *cmd = data;
7386 print_pk256("Remote P-256 public key", cmd->remote_pk256);
7389 static void le_add_to_resolv_list_cmd(uint16_t index, const void *data,
7392 const struct bt_hci_cmd_le_add_to_resolv_list *cmd = data;
7394 print_addr_type("Address type", cmd->addr_type);
7395 print_addr("Address", cmd->addr, cmd->addr_type);
7396 print_key("Peer identity resolving key", cmd->peer_irk);
7397 print_key("Local identity resolving key", cmd->local_irk);
7400 static void le_remove_from_resolv_list_cmd(uint16_t index, const void *data,
7403 const struct bt_hci_cmd_le_remove_from_resolv_list *cmd = data;
7405 print_addr_type("Address type", cmd->addr_type);
7406 print_addr("Address", cmd->addr, cmd->addr_type);
7409 static void le_read_resolv_list_size_rsp(uint16_t index, const void *data,
7412 const struct bt_hci_rsp_le_read_resolv_list_size *rsp = data;
7414 print_status(rsp->status);
7415 print_field("Size: %u", rsp->size);
7418 static void le_read_peer_resolv_addr_cmd(uint16_t index, const void *data,
7421 const struct bt_hci_cmd_le_read_peer_resolv_addr *cmd = data;
7423 print_addr_type("Address type", cmd->addr_type);
7424 print_addr("Address", cmd->addr, cmd->addr_type);
7427 static void le_read_peer_resolv_addr_rsp(uint16_t index, const void *data,
7430 const struct bt_hci_rsp_le_read_peer_resolv_addr *rsp = data;
7432 print_status(rsp->status);
7433 print_addr("Address", rsp->addr, 0x01);
7436 static void le_read_local_resolv_addr_cmd(uint16_t index, const void *data,
7439 const struct bt_hci_cmd_le_read_local_resolv_addr *cmd = data;
7441 print_addr_type("Address type", cmd->addr_type);
7442 print_addr("Address", cmd->addr, cmd->addr_type);
7445 static void le_read_local_resolv_addr_rsp(uint16_t index, const void *data,
7448 const struct bt_hci_rsp_le_read_local_resolv_addr *rsp = data;
7450 print_status(rsp->status);
7451 print_addr("Address", rsp->addr, 0x01);
7454 static void le_set_resolv_enable_cmd(uint16_t index, const void *data,
7457 const struct bt_hci_cmd_le_set_resolv_enable *cmd = data;
7459 print_enable("Address resolution", cmd->enable);
7462 static void le_set_resolv_timeout_cmd(uint16_t index, const void *data,
7465 const struct bt_hci_cmd_le_set_resolv_timeout *cmd = data;
7467 print_field("Timeout: %u seconds", le16_to_cpu(cmd->timeout));
7470 static void le_read_max_data_length_rsp(uint16_t index, const void *data,
7473 const struct bt_hci_rsp_le_read_max_data_length *rsp = data;
7475 print_status(rsp->status);
7476 print_field("Max TX octets: %d", le16_to_cpu(rsp->max_tx_len));
7477 print_field("Max TX time: %d", le16_to_cpu(rsp->max_tx_time));
7478 print_field("Max RX octets: %d", le16_to_cpu(rsp->max_rx_len));
7479 print_field("Max RX time: %d", le16_to_cpu(rsp->max_rx_time));
7482 static void le_read_phy_cmd(uint16_t index, const void *data, uint8_t size)
7484 const struct bt_hci_cmd_le_read_phy *cmd = data;
7486 print_handle(cmd->handle);
7489 static void print_le_phy(const char *prefix, uint8_t phy)
7508 print_field("%s: %s (0x%2.2x)", prefix, str, phy);
7511 static void le_read_phy_rsp(uint16_t index, const void *data, uint8_t size)
7513 const struct bt_hci_rsp_le_read_phy *rsp = data;
7515 print_status(rsp->status);
7516 print_handle(rsp->handle);
7517 print_le_phy("TX PHY", rsp->tx_phy);
7518 print_le_phy("RX PHY", rsp->rx_phy);
7521 static const struct bitfield_data le_phys[] = {
7528 static const struct bitfield_data le_phy_preference[] = {
7529 { 0, "No TX PHY preference" },
7530 { 1, "No RX PHY preference" },
7534 static void print_le_phys_preference(uint8_t all_phys, uint8_t tx_phys,
7539 print_field("All PHYs preference: 0x%2.2x", all_phys);
7541 mask = print_bitfield(2, all_phys, le_phy_preference);
7543 print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
7544 " (0x%2.2x)", mask);
7546 print_field("TX PHYs preference: 0x%2.2x", tx_phys);
7548 mask = print_bitfield(2, tx_phys, le_phys);
7550 print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
7551 " (0x%2.2x)", mask);
7553 print_field("RX PHYs preference: 0x%2.2x", rx_phys);
7555 mask = print_bitfield(2, rx_phys, le_phys);
7557 print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Reserved"
7558 " (0x%2.2x)", mask);
7561 static void le_set_default_phy_cmd(uint16_t index, const void *data,
7564 const struct bt_hci_cmd_le_set_default_phy *cmd = data;
7566 print_le_phys_preference(cmd->all_phys, cmd->tx_phys, cmd->rx_phys);
7569 static void le_set_phy_cmd(uint16_t index, const void *data, uint8_t size)
7571 const struct bt_hci_cmd_le_set_phy *cmd = data;
7574 print_handle(cmd->handle);
7575 print_le_phys_preference(cmd->all_phys, cmd->tx_phys, cmd->rx_phys);
7576 switch (le16_to_cpu(cmd->phy_opts)) {
7588 print_field("PHY options preference: %s (0x%4.4x)", str, cmd->phy_opts);
7591 static void le_enhanced_receiver_test_cmd(uint16_t index, const void *data,
7594 const struct bt_hci_cmd_le_enhanced_receiver_test *cmd = data;
7597 print_field("RX channel frequency: %d MHz (0x%2.2x)",
7598 (cmd->rx_channel * 2) + 2402, cmd->rx_channel);
7599 print_le_phy("PHY", cmd->phy);
7601 switch (cmd->modulation_index) {
7613 print_field("Modulation index: %s (0x%2.2x)", str,
7614 cmd->modulation_index);
7617 static void le_enhanced_transmitter_test_cmd(uint16_t index, const void *data,
7620 const struct bt_hci_cmd_le_enhanced_transmitter_test *cmd = data;
7623 print_field("TX channel frequency: %d MHz (0x%2.2x)",
7624 (cmd->tx_channel * 2) + 2402, cmd->tx_channel);
7625 print_field("Test data length: %d bytes", cmd->data_len);
7626 print_field("Packet payload: 0x%2.2x", cmd->payload);
7636 str = "LE Coded with S=8";
7639 str = "LE Coded with S=2";
7646 print_field("PHY: %s (0x%2.2x)", str, cmd->phy);
7649 static void le_set_adv_set_rand_addr(uint16_t index, const void *data,
7652 const struct bt_hci_cmd_le_set_adv_set_rand_addr *cmd = data;
7654 print_field("Advertising handle: 0x%2.2x", cmd->handle);
7655 print_addr("Advertising random address", cmd->bdaddr, 0x01);
7658 static const struct bitfield_data ext_adv_properties_table[] = {
7659 { 0, "Connectable" },
7662 { 3, "High Duty Cycle Directed Connectable" },
7663 { 4, "Use legacy advertising PDUs" },
7664 { 5, "Anonymous advertising" },
7665 { 6, "Include TxPower" },
7669 static const char *get_adv_pdu_desc(uint16_t flags)
7675 str = "ADV_NONCONN_IND";
7678 str = "ADV_SCAN_IND";
7684 str = "ADV_DIRECT_IND (low duty cycle)";
7687 str = "ADV_DIRECT_IND (high duty cycle)";
7697 static void print_ext_adv_properties(uint16_t flags)
7699 uint16_t mask = flags;
7700 const char *property;
7703 print_field("Properties: 0x%4.4x", flags);
7705 for (i = 0; ext_adv_properties_table[i].str; i++) {
7706 if (flags & (1 << ext_adv_properties_table[i].bit)) {
7707 property = ext_adv_properties_table[i].str;
7709 if (ext_adv_properties_table[i].bit == 4) {
7710 print_field(" %s: %s", property,
7711 get_adv_pdu_desc(flags));
7713 print_field(" %s", property);
7715 mask &= ~(1 << ext_adv_properties_table[i].bit);
7720 print_text(COLOR_UNKNOWN_ADV_FLAG,
7721 " Unknown advertising properties (0x%4.4x)",
7725 static void print_ext_slot_625(const char *label, const uint8_t value[3])
7727 uint32_t value_cpu = value[0];
7729 value_cpu |= value[1] << 8;
7730 value_cpu |= value[2] << 16;
7732 print_field("%s: %.3f msec (0x%4.4x)", label,
7733 value_cpu * 0.625, value_cpu);
7736 static void le_set_ext_adv_params_cmd(uint16_t index, const void *data,
7739 const struct bt_hci_cmd_le_set_ext_adv_params *cmd = data;
7742 print_field("Handle: 0x%2.2x", cmd->handle);
7743 print_ext_adv_properties(le16_to_cpu(cmd->evt_properties));
7745 print_ext_slot_625("Min advertising interval", cmd->min_interval);
7746 print_ext_slot_625("Max advertising interval", cmd->max_interval);
7747 print_adv_channel_map("Channel map", cmd->channel_map);
7748 print_own_addr_type(cmd->own_addr_type);
7749 print_peer_addr_type("Peer address type", cmd->peer_addr_type);
7750 print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);
7751 print_adv_filter_policy("Filter policy", cmd->filter_policy);
7752 if (cmd->tx_power == 0x7f)
7753 print_field("TX power: Host has no preference (0x7f)");
7755 print_power_level(cmd->tx_power, NULL);
7757 switch (cmd->primary_phy) {
7769 print_field("Primary PHY: %s (0x%2.2x)", str, cmd->primary_phy);
7770 print_field("Secondary max skip: 0x%2.2x", cmd->secondary_max_skip);
7771 print_le_phy("Secondary PHY", cmd->secondary_phy);
7772 print_field("SID: 0x%2.2x", cmd->sid);
7773 print_enable("Scan request notifications", cmd->notif_enable);
7776 static void le_set_ext_adv_params_rsp(uint16_t index, const void *data,
7779 const struct bt_hci_rsp_le_set_ext_adv_params *rsp = data;
7781 print_status(rsp->status);
7782 print_power_level(rsp->tx_power, "selected");
7785 static void le_set_ext_adv_data_cmd(uint16_t index, const void *data,
7788 const struct bt_hci_cmd_le_set_ext_adv_data *cmd = data;
7791 print_field("Handle: 0x%2.2x", cmd->handle);
7793 switch (cmd->operation) {
7795 str = "Immediate fragment";
7798 str = "First fragment";
7801 str = "Last fragment";
7804 str = "Complete extended advertising data";
7807 str = "Unchanged data";
7814 print_field("Operation: %s (0x%2.2x)", str, cmd->operation);
7816 switch (cmd->fragment_preference) {
7818 str = "Fragment all";
7821 str = "Minimize fragmentation";
7828 print_field("Fragment preference: %s (0x%2.2x)", str,
7829 cmd->fragment_preference);
7830 print_field("Data length: 0x%2.2x", cmd->data_len);
7831 packet_print_ad(cmd->data, size - sizeof(*cmd));
7834 static void le_set_ext_scan_rsp_data_cmd(uint16_t index, const void *data,
7837 const struct bt_hci_cmd_le_set_ext_scan_rsp_data *cmd = data;
7840 print_field("Handle: 0x%2.2x", cmd->handle);
7842 switch (cmd->operation) {
7844 str = "Immediate fragment";
7847 str = "First fragment";
7850 str = "Last fragment";
7853 str = "Complete scan response data";
7856 str = "Unchanged data";
7863 print_field("Operation: %s (0x%2.2x)", str, cmd->operation);
7865 switch (cmd->fragment_preference) {
7867 str = "Fragment all";
7870 str = "Minimize fragmentation";
7877 print_field("Fragment preference: %s (0x%2.2x)", str,
7878 cmd->fragment_preference);
7879 print_field("Data length: 0x%2.2x", cmd->data_len);
7880 packet_print_ad(cmd->data, size - sizeof(*cmd));
7883 static void le_set_ext_adv_enable_cmd(uint16_t index, const void *data,
7886 const struct bt_hci_cmd_le_set_ext_adv_enable *cmd = data;
7887 const struct bt_hci_cmd_ext_adv_set *adv_set;
7890 print_enable("Extended advertising", cmd->enable);
7892 if (cmd->num_of_sets == 0)
7893 print_field("Number of sets: Disable all sets (0x%2.2x)",
7895 else if (cmd->num_of_sets > 0x3f)
7896 print_field("Number of sets: Reserved (0x%2.2x)",
7899 print_field("Number of sets: %u (0x%2.2x)", cmd->num_of_sets,
7902 for (i = 0; i < cmd->num_of_sets; ++i) {
7903 adv_set = data + 2 + i * sizeof(struct bt_hci_cmd_ext_adv_set);
7904 print_field("Entry %d", i);
7905 print_field(" Handle: 0x%2.2x", adv_set->handle);
7906 print_field(" Duration: %d ms (0x%2.2x)",
7907 adv_set->duration * 10, adv_set->duration);
7908 print_field(" Max ext adv events: %d", adv_set->max_events);
7912 static void le_read_max_adv_data_len_rsp(uint16_t index, const void *data,
7915 const struct bt_hci_rsp_le_read_max_adv_data_len *rsp = data;
7917 print_status(rsp->status);
7918 print_field("Max length: %d", rsp->max_len);
7921 static void le_read_num_supported_adv_sets_rsp(uint16_t index, const void *data,
7924 const struct bt_hci_rsp_le_read_num_supported_adv_sets *rsp = data;
7926 print_status(rsp->status);
7927 print_field("Num supported adv sets: %d", rsp->num_of_sets);
7930 static void le_remove_adv_set_cmd(uint16_t index, const void *data,
7933 const struct bt_hci_cmd_le_remove_adv_set *cmd = data;
7935 print_handle(cmd->handle);
7938 static const struct bitfield_data pa_properties_table[] = {
7939 { 6, "Include TxPower" },
7943 static void print_pa_properties(uint16_t flags)
7947 print_field("Properties: 0x%4.4x", flags);
7949 mask = print_bitfield(2, flags, pa_properties_table);
7951 print_text(COLOR_UNKNOWN_ADV_FLAG,
7952 " Unknown advertising properties (0x%4.4x)",
7956 static void le_set_pa_params_cmd(uint16_t index, const void *data, uint8_t size)
7958 const struct bt_hci_cmd_le_set_pa_params *cmd = data;
7960 print_handle(cmd->handle);
7961 print_slot_125("Min interval", cmd->min_interval);
7962 print_slot_125("Max interval", cmd->max_interval);
7963 print_pa_properties(cmd->properties);
7966 static void le_set_pa_data_cmd(uint16_t index, const void *data, uint8_t size)
7968 const struct bt_hci_cmd_le_set_pa_data *cmd = data;
7971 print_handle(cmd->handle);
7973 switch (cmd->operation) {
7975 str = "Immediate fragment";
7978 str = "First fragment";
7981 str = "Last fragment";
7984 str = "Complete ext advertising data";
7991 print_field("Operation: %s (0x%2.2x)", str, cmd->operation);
7992 print_field("Data length: 0x%2.2x", cmd->data_len);
7993 print_eir(cmd->data, cmd->data_len, true);
7996 static void le_set_pa_enable_cmd(uint16_t index, const void *data, uint8_t size)
7998 const struct bt_hci_cmd_le_set_pa_enable *cmd = data;
8000 print_enable("Periodic advertising", cmd->enable);
8001 print_handle(cmd->handle);
8004 static const struct bitfield_data ext_scan_phys_table[] = {
8010 static void print_ext_scan_phys(const void *data, uint8_t flags)
8012 const struct bt_hci_le_scan_phy *scan_phy;
8013 uint8_t mask = flags;
8017 print_field("PHYs: 0x%2.2x", flags);
8019 for (i = 0; ext_scan_phys_table[i].str; i++) {
8020 if (flags & (1 << ext_scan_phys_table[i].bit)) {
8021 scan_phy = data + bits_set * sizeof(*scan_phy);
8022 mask &= ~(1 << ext_scan_phys_table[i].bit);
8024 print_field("Entry %d: %s", bits_set,
8025 ext_scan_phys_table[i].str);
8026 print_scan_type(" Type", scan_phy->type);
8027 print_slot_625(" Interval", scan_phy->interval);
8028 print_slot_625(" Window", scan_phy->window);
8035 print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown scanning PHYs"
8036 " (0x%2.2x)", mask);
8039 static void le_set_ext_scan_params_cmd(uint16_t index, const void *data,
8042 const struct bt_hci_cmd_le_set_ext_scan_params *cmd = data;
8044 print_own_addr_type(cmd->own_addr_type);
8045 print_scan_filter_policy(cmd->filter_policy);
8046 print_ext_scan_phys(cmd->data, cmd->num_phys);
8049 static void le_set_ext_scan_enable_cmd(uint16_t index, const void *data,
8052 const struct bt_hci_cmd_le_set_ext_scan_enable *cmd = data;
8054 print_enable("Extended scan", cmd->enable);
8055 print_enable("Filter duplicates", cmd->filter_dup);
8057 print_field("Duration: %d msec (0x%4.4x)",
8058 le16_to_cpu(cmd->duration) * 10,
8059 le16_to_cpu(cmd->duration));
8060 print_field("Period: %.2f sec (0x%4.4x)",
8061 le16_to_cpu(cmd->period) * 1.28,
8062 le16_to_cpu(cmd->period));
8065 static const struct bitfield_data ext_conn_phys_table[] = {
8072 static void print_ext_conn_phys(const void *data, uint8_t flags)
8074 const struct bt_hci_le_ext_create_conn *entry;
8075 uint8_t mask = flags;
8079 print_field("Initiating PHYs: 0x%2.2x", flags);
8081 for (i = 0; ext_conn_phys_table[i].str; i++) {
8082 if (flags & (1 << ext_conn_phys_table[i].bit)) {
8083 entry = data + bits_set * sizeof(*entry);
8084 mask &= ~(1 << ext_conn_phys_table[i].bit);
8086 print_field("Entry %d: %s", bits_set,
8087 ext_conn_phys_table[i].str);
8088 print_slot_625(" Scan interval", entry->scan_interval);
8089 print_slot_625(" Scan window", entry->scan_window);
8090 print_slot_125(" Min connection interval",
8091 entry->min_interval);
8092 print_slot_125(" Max connection interval",
8093 entry->max_interval);
8094 print_conn_latency(" Connection latency",
8096 print_field(" Supervision timeout: %d msec (0x%4.4x)",
8097 le16_to_cpu(entry->supv_timeout) * 10,
8098 le16_to_cpu(entry->supv_timeout));
8099 print_slot_625(" Min connection length",
8101 print_slot_625(" Max connection length",
8109 print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown scanning PHYs"
8110 " (0x%2.2x)", mask);
8113 static void le_ext_create_conn_cmd(uint16_t index, const void *data,
8116 const struct bt_hci_cmd_le_ext_create_conn *cmd = data;
8119 switch (cmd->filter_policy) {
8121 str = "Accept list is not used";
8124 str = "Accept list is used";
8131 print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
8133 print_own_addr_type(cmd->own_addr_type);
8134 print_peer_addr_type("Peer address type", cmd->peer_addr_type);
8135 print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);
8136 print_ext_conn_phys(cmd->data, cmd->phys);
8139 static const struct bitfield_data create_sync_cte_type[] = {
8140 { 0, "Do not sync to packets with AoA CTE" },
8141 { 1, "Do not sync to packets with AoD CTE 1us" },
8142 { 2, "Do not sync to packets with AoD CTE 2us" },
8143 { 3, "Do not sync to packets with type 3 AoD" },
8144 { 4, "Do not sync to packets without CTE" },
8148 static const struct bitfield_data create_sync_options[] = {
8149 { 0, "Use Periodic Advertiser List" },
8150 { 1, "Reporting initially disabled" },
8154 static const struct bitfield_data create_sync_options_alt[] = {
8155 { 0, "Use advertising SID, Advertiser Address Type and address"},
8156 { 1, "Reporting initially enabled" },
8160 static void print_create_sync_cte_type(uint8_t flags)
8162 uint8_t mask = flags;
8164 print_field("Sync CTE type: 0x%4.4x", flags);
8166 mask = print_bitfield(2, flags, create_sync_cte_type);
8169 print_text(COLOR_UNKNOWN_ADV_FLAG,
8170 "Unknown sync CTE type properties (0x%4.4x)",
8175 static void print_create_sync_options(uint8_t flags)
8177 uint8_t mask = flags;
8180 print_field("Options: 0x%4.4x", flags);
8182 for (i = 0; create_sync_options[i].str; i++) {
8183 if (flags & (1 << create_sync_options[i].bit)) {
8184 print_field("%s", create_sync_options[i].str);
8185 mask &= ~(1 << create_sync_options[i].bit);
8187 print_field("%s", create_sync_options_alt[i].str);
8188 mask &= ~(1 << create_sync_options_alt[i].bit);
8193 print_text(COLOR_UNKNOWN_ADV_FLAG,
8194 " Unknown options (0x%4.4x)", mask);
8198 static void le_pa_create_sync_cmd(uint16_t index, const void *data,
8201 const struct bt_hci_cmd_le_pa_create_sync *cmd = data;
8203 print_create_sync_options(cmd->options);
8204 print_field("SID: 0x%2.2x", cmd->sid);
8205 print_addr_type("Adv address type", cmd->addr_type);
8206 print_addr("Adv address", cmd->addr, cmd->addr_type);
8207 print_field("Skip: 0x%4.4x", cmd->skip);
8208 print_field("Sync timeout: %d msec (0x%4.4x)",
8209 le16_to_cpu(cmd->sync_timeout) * 10,
8210 le16_to_cpu(cmd->sync_timeout));
8211 print_create_sync_cte_type(cmd->sync_cte_type);
8214 static void le_pa_term_sync_cmd(uint16_t index, const void *data, uint8_t size)
8216 const struct bt_hci_cmd_le_pa_term_sync *cmd = data;
8218 print_field("Sync handle: 0x%4.4x", cmd->sync_handle);
8221 static void le_add_dev_pa_list_cmd(uint16_t index, const void *data,
8224 const struct bt_hci_cmd_le_add_dev_pa_list *cmd = data;
8226 print_addr_type("Adv address type", cmd->addr_type);
8227 print_addr("Adv address", cmd->addr, cmd->addr_type);
8228 print_field("SID: 0x%2.2x", cmd->sid);
8231 static void le_remove_dev_pa_list_cmd(uint16_t index, const void *data,
8234 const struct bt_hci_cmd_le_remove_dev_pa_list *cmd = data;
8236 print_addr_type("Adv address type", cmd->addr_type);
8237 print_addr("Adv address", cmd->addr, cmd->addr_type);
8238 print_field("SID: 0x%2.2x", cmd->sid);
8241 static void le_read_pa_list_size_rsp(uint16_t index, const void *data,
8244 const struct bt_hci_rsp_le_read_dev_pa_list_size *rsp = data;
8246 print_status(rsp->status);
8247 print_field("List size: 0x%2.2x", rsp->list_size);
8250 static void le_read_tx_power_rsp(uint16_t index, const void *data,
8253 const struct bt_hci_rsp_le_read_tx_power *rsp = data;
8255 print_status(rsp->status);
8256 print_field("Min Tx power: %d dBm", rsp->min_tx_power);
8257 print_field("Max Tx power: %d dBm", rsp->max_tx_power);
8260 static void le_read_rf_path_comp_rsp(uint16_t index, const void *data,
8263 const struct bt_hci_rsp_le_read_rf_path_comp *rsp = data;
8265 print_status(rsp->status);
8266 print_field("RF Tx Path Compensation Value: 0x%4.4x",
8267 rsp->rf_tx_path_comp);
8268 print_field("RF Rx Path Compensation Value: 0x%4.4x",
8269 rsp->rf_rx_path_comp);
8272 static void le_write_rf_path_comp_cmd(uint16_t index, const void *data,
8275 const struct bt_hci_cmd_le_write_rf_path_comp *cmd = data;
8277 print_field("RF Tx Path Compensation Value: 0x%4.4x",
8278 cmd->rf_tx_path_comp);
8279 print_field("RF Rx Path Compensation Value: 0x%4.4x",
8280 cmd->rf_rx_path_comp);
8283 static void le_set_priv_mode_cmd(uint16_t index, const void *data, uint8_t size)
8285 const struct bt_hci_cmd_le_set_priv_mode *cmd = data;
8288 print_addr_type("Peer Identity address type", cmd->peer_id_addr_type);
8289 print_addr("Peer Identity address", cmd->peer_id_addr,
8290 cmd->peer_id_addr_type);
8292 switch (cmd->priv_mode) {
8294 str = "Use Network Privacy";
8297 str = "Use Device Privacy";
8304 print_field("Privacy Mode: %s (0x%2.2x)", str, cmd->priv_mode);
8307 static void le_receiver_test_cmd_v3(uint16_t index, const void *data,
8310 const struct bt_hci_cmd_le_receiver_test_v3 *cmd = data;
8313 print_field("RX Channel: %u MHz (0x%2.2x)", cmd->rx_chan * 2 + 2402,
8318 print_field("PHY: LE 1M (0x%2.2x)", cmd->phy);
8321 print_field("PHY: LE 2M (0x%2.2x)", cmd->phy);
8324 print_field("PHY: LE Coded (0x%2.2x)", cmd->phy);
8328 print_field("Modulation Index: %s (0x%2.2x)",
8329 cmd->mod_index ? "stable" : "standard", cmd->mod_index);
8330 print_field("Expected CTE Length: %u us (0x%2.2x)", cmd->cte_len * 8,
8332 print_field("Expected CTE Type: %u us slots (0x%2.2x)", cmd->cte_type,
8334 print_field("Slot Duration: %u us (0x%2.2x)", cmd->duration,
8336 print_field("Number of Antenna IDs: %u", cmd->num_antenna_id);
8338 if (size < sizeof(*cmd) + cmd->num_antenna_id)
8341 for (i = 0; i < cmd->num_antenna_id; i++)
8342 print_field(" Antenna ID: %u", cmd->antenna_ids[i]);
8345 static const char *parse_tx_test_payload(uint8_t payload)
8349 return "PRBS9 sequence 11111111100000111101...";
8351 return "Repeated 11110000";
8353 return "Repeated 10101010";
8357 return "Repeated 11111111";
8359 return "Repeated 00000000";
8361 return "Repeated 00001111";
8363 return "Repeated 01010101";
8369 static void le_tx_test_cmd_v3(uint16_t index, const void *data, uint8_t size)
8371 const struct bt_hci_cmd_le_tx_test_v3 *cmd = data;
8374 print_field("TX Channel: %u MHz (0x%2.2x)", cmd->chan * 2 + 2402,
8376 print_field("Length of Test Data: %u", cmd->data_len);
8377 print_field("Packet Payload: %s (0x%2.2x)",
8378 parse_tx_test_payload(cmd->payload), cmd->payload);
8382 print_field("PHY: LE 1M (0x%2.2x)", cmd->phy);
8385 print_field("PHY: LE 2M (0x%2.2x)", cmd->phy);
8388 print_field("PHY: LE Coded with S=8 (0x%2.2x)", cmd->phy);
8391 print_field("PHY: LE Coded with S=2 (0x%2.2x)", cmd->phy);
8395 print_field("Expected CTE Length: %u us (0x%2.2x)", cmd->cte_len * 8,
8397 print_field("Expected CTE Type: %u us slots (0x%2.2x)", cmd->cte_type,
8399 print_field("Slot Duration: %u us (0x%2.2x)", cmd->duration,
8401 print_field("Number of Antenna IDs: %u", cmd->num_antenna_id);
8403 if (size < sizeof(*cmd) + cmd->num_antenna_id)
8406 for (i = 0; i < cmd->num_antenna_id; i++)
8407 print_field(" Antenna ID: %u", cmd->antenna_ids[i]);
8410 static void le_pa_rec_enable(uint16_t index, const void *data, uint8_t size)
8412 const struct bt_hci_cmd_le_set_pa_enable *cmd = data;
8414 print_field("Sync handle: %d", cmd->handle);
8415 print_enable("Reporting", cmd->enable);
8418 static void le_pa_sync_trans(uint16_t index, const void *data, uint8_t size)
8420 const struct bt_hci_cmd_periodic_sync_trans *cmd = data;
8422 print_field("Connection handle: %d", cmd->handle);
8423 print_field("Service data: 0x%4.4x", cmd->service_data);
8424 print_field("Sync handle: %d", cmd->sync_handle);
8427 static void le_pa_set_info_trans(uint16_t index, const void *data, uint8_t size)
8429 const struct bt_hci_cmd_pa_set_info_trans *cmd = data;
8431 print_field("Connection handle: %d", cmd->handle);
8432 print_field("Service data: 0x%4.4x", cmd->service_data);
8433 print_field("Advertising handle: %d", cmd->adv_handle);
8436 static void print_sync_mode(uint8_t mode)
8445 str = "Enabled with report events disabled";
8448 str = "Enabled with report events enabled";
8455 print_field("Mode: %s (0x%2.2x)", str, mode);
8458 static void le_pa_sync_trans_params(uint16_t index, const void *data,
8461 const struct bt_hci_cmd_pa_sync_trans_params *cmd = data;
8463 print_field("Connection handle: %d", cmd->handle);
8464 print_sync_mode(cmd->mode);
8465 print_field("Skip: 0x%2.2x", cmd->skip);
8466 print_field("Sync timeout: %d msec (0x%4.4x)",
8467 le16_to_cpu(cmd->sync_timeout) * 10,
8468 le16_to_cpu(cmd->sync_timeout));
8469 print_create_sync_cte_type(cmd->cte_type);
8472 static void le_set_default_pa_sync_trans_params(uint16_t index,
8473 const void *data, uint8_t size)
8475 const struct bt_hci_cmd_default_pa_sync_trans_params *cmd = data;
8477 print_sync_mode(cmd->mode);
8478 print_field("Skip: 0x%2.2x", cmd->skip);
8479 print_field("Sync timeout: %d msec (0x%4.4x)",
8480 le16_to_cpu(cmd->sync_timeout) * 10,
8481 le16_to_cpu(cmd->sync_timeout));
8482 print_create_sync_cte_type(cmd->cte_type);
8485 static void print_sca(uint8_t sca)
8489 print_field("SCA: 201 - 500 ppm (0x%2.2x)", sca);
8492 print_field("SCA: 151 - 200 ppm (0x%2.2x)", sca);
8495 print_field("SCA: 101 - 150 ppm (0x%2.2x)", sca);
8498 print_field("SCA: 76 - 100 ppm (0x%2.2x)", sca);
8501 print_field("SCA: 51 - 75 ppm (0x%2.2x)", sca);
8504 print_field("SCA: 31 - 50 ppm (0x%2.2x)", sca);
8507 print_field("SCA: 21 - 30 ppm (0x%2.2x)", sca);
8510 print_field("SCA: 0 - 20 ppm (0x%2.2x)", sca);
8513 print_field("SCA: Reserved (0x%2.2x)", sca);
8517 static void print_packing(uint8_t value)
8521 print_field("Packing: Sequential (0x%2.2x)", value);
8524 print_field("Packing: Interleaved (0x%2.2x)", value);
8527 print_field("Packing: Reserved (0x%2.2x)", value);
8531 static void print_framing(uint8_t value)
8535 print_field("Framing: Unframed (0x%2.2x)", value);
8538 print_field("Framing: Framed (0x%2.2x)", value);
8541 print_field("Packing: Reserved (0x%2.2x)", value);
8545 static void le_read_buffer_size_v2_rsp(uint16_t index, const void *data,
8548 const struct bt_hci_rsp_le_read_buffer_size_v2 *rsp = data;
8550 print_status(rsp->status);
8555 print_field("ACL MTU: %d", le16_to_cpu(rsp->acl_mtu));
8556 print_field("ACL max packet: %d", rsp->acl_max_pkt);
8557 print_field("ISO MTU: %d", le16_to_cpu(rsp->iso_mtu));
8558 print_field("ISO max packet: %d", rsp->iso_max_pkt);
8561 static void le_read_iso_tx_sync_cmd(uint16_t index, const void *data,
8564 const struct bt_hci_cmd_le_read_iso_tx_sync *cmd = data;
8566 print_field("Handle: %d", le16_to_cpu(cmd->handle));
8569 static void le_read_iso_tx_sync_rsp(uint16_t index, const void *data,
8572 const struct bt_hci_rsp_le_read_iso_tx_sync *rsp = data;
8573 uint32_t offset = 0;
8575 print_status(rsp->status);
8580 print_field("Handle: %d", le16_to_cpu(rsp->handle));
8581 print_field("Sequence Number: %d", le16_to_cpu(rsp->seq));
8582 print_field("Timestamp: %d", le32_to_cpu(rsp->timestamp));
8584 memcpy(&offset, rsp->offset, sizeof(rsp->offset));
8586 print_field("Offset: %d", le32_to_cpu(offset));
8589 static void print_cis_params(const void *data, int i)
8591 const struct bt_hci_cis_params *cis = data;
8593 print_field("CIS ID: 0x%2.2x", cis->cis_id);
8594 print_field("Central to Peripheral Maximum SDU Size: %u",
8595 le16_to_cpu(cis->c_sdu));
8596 print_field("Peripheral to Central Maximum SDU Size: %u",
8597 le16_to_cpu(cis->p_sdu));
8598 print_le_phy("Central to Peripheral PHY", cis->c_phy);
8599 print_le_phy("Peripheral to Central PHY", cis->p_phy);
8600 print_field("Central to Peripheral Retransmission attempts: 0x%2.2x",
8602 print_field("Peripheral to Central Retransmission attempts: 0x%2.2x",
8606 static void le_set_cig_params_cmd(uint16_t index, const void *data,
8609 const struct bt_hci_cmd_le_set_cig_params *cmd = data;
8611 print_field("CIG ID: 0x%2.2x", cmd->cig_id);
8612 print_usec_interval("Central to Peripheral SDU Interval",
8614 print_usec_interval("Peripheral to Central SDU Interval",
8616 print_sca(cmd->sca);
8617 print_packing(cmd->packing);
8618 print_framing(cmd->framing);
8619 print_field("Central to Peripheral Maximum Latency: %d ms (0x%4.4x)",
8620 le16_to_cpu(cmd->c_latency), le16_to_cpu(cmd->c_latency));
8621 print_field("Peripheral to Central Maximum Latency: %d ms (0x%4.4x)",
8622 le16_to_cpu(cmd->p_latency), le16_to_cpu(cmd->p_latency));
8623 print_field("Number of CIS: %u", cmd->num_cis);
8625 size -= sizeof(*cmd);
8627 print_list(cmd->cis, size, cmd->num_cis, sizeof(*cmd->cis),
8631 static void print_cis_params_test(const void *data, int i)
8633 const struct bt_hci_cis_params_test *cis = data;
8635 print_field("CIS ID: 0x%2.2x", cis->cis_id);
8636 print_field("NSE: 0x%2.2x", cis->nse);
8637 print_field("Central to Peripheral Maximum SDU: 0x%4.4x",
8638 le16_to_cpu(cis->c_sdu));
8639 print_field("Peripheral to Central Maximum SDU: 0x%4.4x",
8640 le16_to_cpu(cis->p_sdu));
8641 print_field("Central to Peripheral Maximum PDU: 0x%4.4x",
8642 le16_to_cpu(cis->c_pdu));
8643 print_field("Peripheral to Central Maximum PDU: 0x%4.4x",
8644 le16_to_cpu(cis->p_pdu));
8645 print_le_phy("Central to Peripheral PHY", cis->c_phy);
8646 print_le_phy("Peripheral to Central PHY", cis->p_phy);
8647 print_field("Central to Peripheral Burst Number: 0x%2.2x", cis->c_bn);
8648 print_field("Peripheral to Central Burst Number: 0x%2.2x", cis->p_bn);
8651 static void le_set_cig_params_test_cmd(uint16_t index, const void *data,
8654 const struct bt_hci_cmd_le_set_cig_params_test *cmd = data;
8656 print_field("CIG ID: 0x%2.2x", cmd->cig_id);
8657 print_usec_interval("Central to Peripheral SDU Interval",
8659 print_usec_interval("Peripheral to Central SDU Interval",
8661 print_field("Central to Peripheral Flush Timeout: 0x%2.2x", cmd->c_ft);
8662 print_field("Peripheral to Central Flush Timeout: 0x%2.2x", cmd->p_ft);
8663 print_field("ISO Interval: %.2f ms (0x%4.4x)",
8664 le16_to_cpu(cmd->iso_interval) * 1.25,
8665 le16_to_cpu(cmd->iso_interval));
8666 print_sca(cmd->sca);
8667 print_packing(cmd->packing);
8668 print_framing(cmd->framing);
8669 print_field("Number of CIS: %u", cmd->num_cis);
8671 size -= sizeof(*cmd);
8673 print_list(cmd->cis, size, cmd->num_cis, sizeof(*cmd->cis),
8674 print_cis_params_test);
8677 static void print_cig_handle(const void *data, int i)
8679 uint16_t handle = get_le16(data);
8681 print_field("Connection Handle #%d: %d", i, handle);
8684 static void le_set_cig_params_rsp(uint16_t index, const void *data,
8687 const struct bt_hci_rsp_le_set_cig_params *rsp = data;
8689 print_status(rsp->status);
8694 print_field("CIG ID: 0x%2.2x", rsp->cig_id);
8695 print_field("Number of Handles: %u", rsp->num_handles);
8697 size -= sizeof(*rsp);
8699 print_list(rsp->handle, size, rsp->num_handles, sizeof(*rsp->handle),
8703 static void print_cis(const void *data, int i)
8705 const struct bt_hci_cis *cis = data;
8707 print_field("CIS Handle: %d", cis->cis_handle);
8708 print_field("ACL Handle: %d", cis->acl_handle);
8711 static void le_create_cis_cmd(uint16_t index, const void *data, uint8_t size)
8713 const struct bt_hci_cmd_le_create_cis *cmd = data;
8715 print_field("Number of CIS: %u", cmd->num_cis);
8717 size -= sizeof(*cmd);
8719 print_list(cmd->cis, size, cmd->num_cis, sizeof(*cmd->cis), print_cis);
8722 static void le_remove_cig_cmd(uint16_t index, const void *data, uint8_t size)
8724 const struct bt_hci_cmd_le_remove_cig *cmd = data;
8726 print_field("CIG ID: 0x%02x", cmd->cig_id);
8729 static void le_remove_cig_rsp(uint16_t index, const void *data, uint8_t size)
8731 const struct bt_hci_rsp_le_remove_cig *rsp = data;
8733 print_status(rsp->status);
8738 print_field("CIG ID: 0x%2.2x", rsp->cig_id);
8741 static void le_accept_cis_req_cmd(uint16_t index, const void *data,
8744 const struct bt_hci_cmd_le_accept_cis *cmd = data;
8746 print_field("CIS Handle: %d", le16_to_cpu(cmd->handle));
8749 static void le_reject_cis_req_cmd(uint16_t index, const void *data,
8752 const struct bt_hci_cmd_le_reject_cis *cmd = data;
8754 print_field("CIS Handle: %d", le16_to_cpu(cmd->handle));
8755 print_reason(cmd->reason);
8758 static void print_bis(const struct bt_hci_bis *bis)
8760 print_usec_interval("SDU Interval", bis->sdu_interval);
8761 print_field("Maximum SDU size: %u", le16_to_cpu(bis->sdu));
8762 print_field("Maximum Latency: %u ms (0x%4.4x)",
8763 le16_to_cpu(bis->latency), le16_to_cpu(bis->latency));
8764 print_field("RTN: 0x%2.2x", bis->rtn);
8765 print_le_phy("PHY", bis->phy);
8766 print_packing(bis->packing);
8767 print_framing(bis->framing);
8768 print_field("Encryption: 0x%2.2x", bis->encryption);
8769 print_hex_field("Broadcast Code", bis->bcode, 16);
8772 static void le_create_big_cmd(uint16_t index, const void *data, uint8_t size)
8774 const struct bt_hci_cmd_le_create_big *cmd = data;
8776 print_field("Handle: 0x%2.2x", cmd->handle);
8777 print_field("Advertising Handle: 0x%2.2x", cmd->adv_handle);
8778 print_field("Number of BIS: %u", cmd->num_bis);
8779 print_bis(&cmd->bis);
8782 static void print_bis_test(const void *data, int i)
8784 const struct bt_hci_bis_test *bis = data;
8786 print_usec_interval("SDU Interval", bis->sdu_interval);
8787 print_field("ISO Interval: %.2f ms (0x%4.4x)",
8788 le16_to_cpu(bis->iso_interval) * 1.25,
8789 le16_to_cpu(bis->iso_interval));
8790 print_field("Number of Subevents: %u", bis->nse);
8791 print_field("Maximum SDU: %u", bis->sdu);
8792 print_field("Maximum PDU: %u", bis->pdu);
8793 print_packing(bis->packing);
8794 print_framing(bis->framing);
8795 print_le_phy("PHY", bis->phy);
8796 print_field("Burst Number: %u", bis->bn);
8797 print_field("Immediate Repetition Count: %u", bis->irc);
8798 print_field("Pre Transmission Offset: 0x%2.2x", bis->pto);
8799 print_field("Encryption: 0x%2.2x", bis->encryption);
8800 print_hex_field("Broadcast Code", bis->bcode, 16);
8803 static void le_create_big_cmd_test_cmd(uint16_t index, const void *data,
8806 const struct bt_hci_cmd_le_create_big_test *cmd = data;
8808 print_field("BIG Handle: 0x%2.2x", cmd->big_handle);
8809 print_field("Advertising Handle: 0x%2.2x", cmd->adv_handle);
8810 print_field("Number of BIS: %u", cmd->num_bis);
8812 size -= sizeof(*cmd);
8814 print_list(cmd->bis, size, cmd->num_bis, sizeof(*cmd->bis),
8818 static void le_terminate_big_cmd(uint16_t index, const void *data, uint8_t size)
8820 const struct bt_hci_cmd_le_term_big *cmd = data;
8822 print_field("BIG Handle: 0x%2.2x", cmd->handle);
8823 print_reason(cmd->reason);
8826 static void print_bis_sync(const void *data, int i)
8828 const uint8_t *bis_id = data;
8830 print_field("BIS ID: 0x%2.2x", *bis_id);
8833 static void le_big_create_sync_cmd(uint16_t index, const void *data,
8836 const struct bt_hci_cmd_le_big_create_sync *cmd = data;
8838 print_field("BIG Handle: 0x%2.2x", cmd->handle);
8839 print_field("BIG Sync Handle: 0x%4.4x", le16_to_cpu(cmd->sync_handle));
8840 print_field("Encryption: %s (0x%2.2x)",
8841 cmd->encryption ? "Encrypted" : "Unencrypted",
8843 print_hex_field("Broadcast Code", cmd->bcode, 16);
8844 print_field("Maximum Number Subevents: 0x%2.2x", cmd->mse);
8845 print_field("Timeout: %d ms (0x%4.4x)", le16_to_cpu(cmd->timeout) * 10,
8846 le16_to_cpu(cmd->timeout));
8847 print_field("Number of BIS: %u", cmd->num_bis);
8849 size -= sizeof(*cmd);
8851 print_list(cmd->bis, size, cmd->num_bis, sizeof(*cmd->bis),
8855 static void le_big_term_sync_cmd(uint16_t index, const void *data, uint8_t size)
8857 const struct bt_hci_cmd_le_big_term_sync *cmd = data;
8859 print_field("BIG Handle: 0x%2.2x", cmd->handle);
8862 static void print_iso_path(const char *prefix, uint8_t path)
8866 print_field("%s: HCI (0x%2.2x)", prefix, path);
8869 print_field("%s: Disabled (0x%2.2x)", prefix, path);
8872 print_field("%s: Logical Channel Number %u", prefix, path);
8876 static void le_setup_iso_path_cmd(uint16_t index, const void *data,
8879 const struct bt_hci_cmd_le_setup_iso_path *cmd = data;
8881 print_field("Handle: %d", le16_to_cpu(cmd->handle));
8882 print_path_direction("Data Path Direction", cmd->direction);
8883 print_iso_path("Data Path", cmd->path);
8884 print_codec_id("Coding Format", cmd->codec);
8885 packet_print_company("Company Codec ID", le16_to_cpu(cmd->codec_cid));
8886 print_field("Vendor Codec ID: %d", le16_to_cpu(cmd->codec_vid));
8887 print_usec_interval("Controller Delay", cmd->delay);
8888 print_field("Codec Configuration Length: %d", cmd->codec_cfg_len);
8889 print_hex_field("Codec Configuration", cmd->codec_cfg,
8890 cmd->codec_cfg_len);
8893 static void le_setup_iso_path_rsp(uint16_t index, const void *data,
8896 const struct bt_hci_rsp_le_setup_iso_path *rsp = data;
8898 print_status(rsp->status);
8903 print_field("Handle: %d", le16_to_cpu(rsp->handle));
8906 static void le_remove_iso_path_cmd(uint16_t index, const void *data,
8909 const struct bt_hci_cmd_le_remove_iso_path *cmd = data;
8911 print_field("Connection Handle: %d", le16_to_cpu(cmd->handle));
8912 print_path_direction("Data Path Direction", cmd->direction);
8915 static void le_req_peer_sca_cmd(uint16_t index, const void *data, uint8_t size)
8917 const struct bt_hci_cmd_le_req_peer_sca *cmd = data;
8919 print_field("Connection Handle: %d", le16_to_cpu(cmd->handle));
8922 static void le_set_host_feature_cmd(uint16_t index, const void *data,
8925 const struct bt_hci_cmd_le_set_host_feature *cmd = data;
8928 print_field("Bit Number: %u", cmd->bit_number);
8930 mask = print_bitfield(2, (((uint64_t) 1) << cmd->bit_number),
8933 print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features "
8934 "(0x%16.16" PRIx64 ")", mask);
8936 print_field("Bit Value: %u", cmd->bit_value);
8939 struct opcode_data {
8943 void (*cmd_func) (uint16_t index, const void *data, uint8_t size);
8946 void (*rsp_func) (uint16_t index, const void *data, uint8_t size);
8951 static const struct opcode_data opcode_table[] = {
8952 { 0x0000, -1, "NOP" },
8954 /* OGF 1 - Link Control */
8955 { 0x0401, 0, "Inquiry",
8956 inquiry_cmd, 5, true },
8957 { 0x0402, 1, "Inquiry Cancel",
8959 status_rsp, 1, true },
8960 { 0x0403, 2, "Periodic Inquiry Mode",
8961 periodic_inquiry_cmd, 9, true,
8962 status_rsp, 1, true },
8963 { 0x0404, 3, "Exit Periodic Inquiry Mode",
8965 status_rsp, 1, true },
8966 { 0x0405, 4, "Create Connection",
8967 create_conn_cmd, 13, true },
8968 { 0x0406, 5, "Disconnect",
8969 disconnect_cmd, 3, true },
8970 { 0x0407, 6, "Add SCO Connection",
8971 add_sco_conn_cmd, 4, true },
8972 { 0x0408, 7, "Create Connection Cancel",
8973 create_conn_cancel_cmd, 6, true,
8974 status_bdaddr_rsp, 7, true },
8975 { 0x0409, 8, "Accept Connection Request",
8976 accept_conn_request_cmd, 7, true },
8977 { 0x040a, 9, "Reject Connection Request",
8978 reject_conn_request_cmd, 7, true },
8979 { 0x040b, 10, "Link Key Request Reply",
8980 link_key_request_reply_cmd, 22, true,
8981 status_bdaddr_rsp, 7, true },
8982 { 0x040c, 11, "Link Key Request Negative Reply",
8983 link_key_request_neg_reply_cmd, 6, true,
8984 status_bdaddr_rsp, 7, true },
8985 { 0x040d, 12, "PIN Code Request Reply",
8986 pin_code_request_reply_cmd, 23, true,
8987 status_bdaddr_rsp, 7, true },
8988 { 0x040e, 13, "PIN Code Request Negative Reply",
8989 pin_code_request_neg_reply_cmd, 6, true,
8990 status_bdaddr_rsp, 7, true },
8991 { 0x040f, 14, "Change Connection Packet Type",
8992 change_conn_pkt_type_cmd, 4, true },
8993 { 0x0411, 15, "Authentication Requested",
8994 auth_requested_cmd, 2, true },
8995 { 0x0413, 16, "Set Connection Encryption",
8996 set_conn_encrypt_cmd, 3, true },
8997 { 0x0415, 17, "Change Connection Link Key",
8998 change_conn_link_key_cmd, 2, true },
8999 { 0x0417, 18, "Temporary Link Key",
9000 link_key_selection_cmd, 1, true },
9001 { 0x0419, 19, "Remote Name Request",
9002 remote_name_request_cmd, 10, true },
9003 { 0x041a, 20, "Remote Name Request Cancel",
9004 remote_name_request_cancel_cmd, 6, true,
9005 status_bdaddr_rsp, 7, true },
9006 { 0x041b, 21, "Read Remote Supported Features",
9007 read_remote_features_cmd, 2, true },
9008 { 0x041c, 22, "Read Remote Extended Features",
9009 read_remote_ext_features_cmd, 3, true },
9010 { 0x041d, 23, "Read Remote Version Information",
9011 read_remote_version_cmd, 2, true },
9012 { 0x041f, 24, "Read Clock Offset",
9013 read_clock_offset_cmd, 2, true },
9014 { 0x0420, 25, "Read LMP Handle",
9015 read_lmp_handle_cmd, 2, true,
9016 read_lmp_handle_rsp, 8, true },
9017 { 0x0428, 131, "Setup Synchronous Connection",
9018 setup_sync_conn_cmd, 17, true },
9019 { 0x0429, 132, "Accept Synchronous Connection Request",
9020 accept_sync_conn_request_cmd, 21, true },
9021 { 0x042a, 133, "Reject Synchronous Connection Request",
9022 reject_sync_conn_request_cmd, 7, true },
9023 { 0x042b, 151, "IO Capability Request Reply",
9024 io_capability_request_reply_cmd, 9, true,
9025 status_bdaddr_rsp, 7, true },
9026 { 0x042c, 152, "User Confirmation Request Reply",
9027 user_confirm_request_reply_cmd, 6, true,
9028 status_bdaddr_rsp, 7, true },
9029 { 0x042d, 153, "User Confirmation Request Neg Reply",
9030 user_confirm_request_neg_reply_cmd, 6, true,
9031 status_bdaddr_rsp, 7, true },
9032 { 0x042e, 154, "User Passkey Request Reply",
9033 user_passkey_request_reply_cmd, 10, true,
9034 status_bdaddr_rsp, 7, true },
9035 { 0x042f, 155, "User Passkey Request Negative Reply",
9036 user_passkey_request_neg_reply_cmd, 6, true,
9037 status_bdaddr_rsp, 7, true },
9038 { 0x0430, 156, "Remote OOB Data Request Reply",
9039 remote_oob_data_request_reply_cmd, 38, true,
9040 status_bdaddr_rsp, 7, true },
9041 { 0x0433, 159, "Remote OOB Data Request Neg Reply",
9042 remote_oob_data_request_neg_reply_cmd, 6, true,
9043 status_bdaddr_rsp, 7, true },
9044 { 0x0434, 163, "IO Capability Request Negative Reply",
9045 io_capability_request_neg_reply_cmd, 7, true,
9046 status_bdaddr_rsp, 7, true },
9047 { 0x0435, 168, "Create Physical Link",
9048 create_phy_link_cmd, 3, false },
9049 { 0x0436, 169, "Accept Physical Link",
9050 accept_phy_link_cmd, 3, false },
9051 { 0x0437, 170, "Disconnect Physical Link",
9052 disconn_phy_link_cmd, 2, true },
9053 { 0x0438, 171, "Create Logical Link",
9054 create_logic_link_cmd, 33, true },
9055 { 0x0439, 172, "Accept Logical Link",
9056 accept_logic_link_cmd, 33, true },
9057 { 0x043a, 173, "Disconnect Logical Link",
9058 disconn_logic_link_cmd, 2, true },
9059 { 0x043b, 174, "Logical Link Cancel",
9060 logic_link_cancel_cmd, 2, true,
9061 logic_link_cancel_rsp, 3, true },
9062 { 0x043c, 175, "Flow Specifcation Modify",
9063 flow_spec_modify_cmd, 34, true },
9064 { 0x043d, 235, "Enhanced Setup Synchronous Connection",
9065 enhanced_setup_sync_conn_cmd, 59, true },
9066 { 0x043e, 236, "Enhanced Accept Synchronous Connection Request",
9067 enhanced_accept_sync_conn_request_cmd, 63, true },
9068 { 0x043f, 246, "Truncated Page",
9069 truncated_page_cmd, 9, true },
9070 { 0x0440, 247, "Truncated Page Cancel",
9071 truncated_page_cancel_cmd, 6, true,
9072 status_bdaddr_rsp, 7, true },
9073 { 0x0441, 248, "Set Connectionless Peripheral Broadcast",
9074 set_peripheral_broadcast_cmd, 11, true,
9075 set_peripheral_broadcast_rsp, 4, true },
9076 { 0x0442, 249, "Set Connectionless Peripheral Broadcast Receive",
9077 set_peripheral_broadcast_receive_cmd, 34, true,
9078 set_peripheral_broadcast_receive_rsp, 8, true },
9079 { 0x0443, 250, "Start Synchronization Train",
9080 null_cmd, 0, true },
9081 { 0x0444, 251, "Receive Synchronization Train",
9082 receive_sync_train_cmd, 12, true },
9083 { 0x0445, 257, "Remote OOB Extended Data Request Reply",
9084 remote_oob_ext_data_request_reply_cmd, 70, true,
9085 status_bdaddr_rsp, 7, true },
9087 /* OGF 2 - Link Policy */
9088 { 0x0801, 33, "Hold Mode",
9089 hold_mode_cmd, 6, true },
9090 { 0x0803, 34, "Sniff Mode",
9091 sniff_mode_cmd, 10, true },
9092 { 0x0804, 35, "Exit Sniff Mode",
9093 exit_sniff_mode_cmd, 2, true },
9094 { 0x0805, 36, "Park State",
9095 park_state_cmd, 6, true },
9096 { 0x0806, 37, "Exit Park State",
9097 exit_park_state_cmd, 2, true },
9098 { 0x0807, 38, "QoS Setup",
9099 qos_setup_cmd, 20, true },
9100 { 0x0809, 39, "Role Discovery",
9101 role_discovery_cmd, 2, true,
9102 role_discovery_rsp, 4, true },
9103 { 0x080b, 40, "Switch Role",
9104 switch_role_cmd, 7, true },
9105 { 0x080c, 41, "Read Link Policy Settings",
9106 read_link_policy_cmd, 2, true,
9107 read_link_policy_rsp, 5, true },
9108 { 0x080d, 42, "Write Link Policy Settings",
9109 write_link_policy_cmd, 4, true,
9110 write_link_policy_rsp, 3, true },
9111 { 0x080e, 43, "Read Default Link Policy Settings",
9113 read_default_link_policy_rsp, 3, true },
9114 { 0x080f, 44, "Write Default Link Policy Settings",
9115 write_default_link_policy_cmd, 2, true,
9116 status_rsp, 1, true },
9117 { 0x0810, 45, "Flow Specification",
9118 flow_spec_cmd, 21, true },
9119 { 0x0811, 140, "Sniff Subrating",
9120 sniff_subrating_cmd, 8, true,
9121 sniff_subrating_rsp, 3, true },
9123 /* OGF 3 - Host Control */
9124 { 0x0c01, 46, "Set Event Mask",
9125 set_event_mask_cmd, 8, true,
9126 status_rsp, 1, true },
9127 { 0x0c03, 47, "Reset",
9129 status_rsp, 1, true },
9130 { 0x0c05, 48, "Set Event Filter",
9131 set_event_filter_cmd, 1, false,
9132 status_rsp, 1, true },
9133 { 0x0c08, 49, "Flush",
9135 flush_rsp, 3, true },
9136 { 0x0c09, 50, "Read PIN Type",
9138 read_pin_type_rsp, 2, true },
9139 { 0x0c0a, 51, "Write PIN Type",
9140 write_pin_type_cmd, 1, true,
9141 status_rsp, 1, true },
9142 { 0x0c0b, 52, "Create New Unit Key",
9144 status_rsp, 1, true },
9145 { 0x0c0d, 53, "Read Stored Link Key",
9146 read_stored_link_key_cmd, 7, true,
9147 read_stored_link_key_rsp, 5, true },
9148 { 0x0c11, 54, "Write Stored Link Key",
9149 write_stored_link_key_cmd, 1, false,
9150 write_stored_link_key_rsp, 2, true },
9151 { 0x0c12, 55, "Delete Stored Link Key",
9152 delete_stored_link_key_cmd, 7, true,
9153 delete_stored_link_key_rsp, 3, true },
9154 { 0x0c13, 56, "Write Local Name",
9155 write_local_name_cmd, 248, true,
9156 status_rsp, 1, true },
9157 { 0x0c14, 57, "Read Local Name",
9159 read_local_name_rsp, 249, true },
9160 { 0x0c15, 58, "Read Connection Accept Timeout",
9162 read_conn_accept_timeout_rsp, 3, true },
9163 { 0x0c16, 59, "Write Connection Accept Timeout",
9164 write_conn_accept_timeout_cmd, 2, true,
9165 status_rsp, 1, true },
9166 { 0x0c17, 60, "Read Page Timeout",
9168 read_page_timeout_rsp, 3, true },
9169 { 0x0c18, 61, "Write Page Timeout",
9170 write_page_timeout_cmd, 2, true,
9171 status_rsp, 1, true },
9172 { 0x0c19, 62, "Read Scan Enable",
9174 read_scan_enable_rsp, 2, true },
9175 { 0x0c1a, 63, "Write Scan Enable",
9176 write_scan_enable_cmd, 1, true,
9177 status_rsp, 1, true },
9178 { 0x0c1b, 64, "Read Page Scan Activity",
9180 read_page_scan_activity_rsp, 5, true },
9181 { 0x0c1c, 65, "Write Page Scan Activity",
9182 write_page_scan_activity_cmd, 4, true,
9183 status_rsp, 1, true },
9184 { 0x0c1d, 66, "Read Inquiry Scan Activity",
9186 read_inquiry_scan_activity_rsp, 5, true },
9187 { 0x0c1e, 67, "Write Inquiry Scan Activity",
9188 write_inquiry_scan_activity_cmd, 4, true,
9189 status_rsp, 1, true },
9190 { 0x0c1f, 68, "Read Authentication Enable",
9192 read_auth_enable_rsp, 2, true },
9193 { 0x0c20, 69, "Write Authentication Enable",
9194 write_auth_enable_cmd, 1, true,
9195 status_rsp, 1, true },
9196 { 0x0c21, 70, "Read Encryption Mode",
9198 read_encrypt_mode_rsp, 2, true },
9199 { 0x0c22, 71, "Write Encryption Mode",
9200 write_encrypt_mode_cmd, 1, true,
9201 status_rsp, 1, true },
9202 { 0x0c23, 72, "Read Class of Device",
9204 read_class_of_dev_rsp, 4, true },
9205 { 0x0c24, 73, "Write Class of Device",
9206 write_class_of_dev_cmd, 3, true,
9207 status_rsp, 1, true },
9208 { 0x0c25, 74, "Read Voice Setting",
9210 read_voice_setting_rsp, 3, true },
9211 { 0x0c26, 75, "Write Voice Setting",
9212 write_voice_setting_cmd, 2, true,
9213 status_rsp, 1, true },
9214 { 0x0c27, 76, "Read Automatic Flush Timeout",
9215 read_auto_flush_timeout_cmd, 2, true,
9216 read_auto_flush_timeout_rsp, 5, true },
9217 { 0x0c28, 77, "Write Automatic Flush Timeout",
9218 write_auto_flush_timeout_cmd, 4, true,
9219 write_auto_flush_timeout_rsp, 3, true },
9220 { 0x0c29, 78, "Read Num Broadcast Retransmissions",
9222 read_num_broadcast_retrans_rsp, 2, true },
9223 { 0x0c2a, 79, "Write Num Broadcast Retransmissions",
9224 write_num_broadcast_retrans_cmd, 1, true,
9225 status_rsp, 1, true },
9226 { 0x0c2b, 80, "Read Hold Mode Activity",
9228 read_hold_mode_activity_rsp, 2, true },
9229 { 0x0c2c, 81, "Write Hold Mode Activity",
9230 write_hold_mode_activity_cmd, 1, true,
9231 status_rsp, 1, true },
9232 { 0x0c2d, 82, "Read Transmit Power Level",
9233 read_tx_power_cmd, 3, true,
9234 read_tx_power_rsp, 4, true },
9235 { 0x0c2e, 83, "Read Sync Flow Control Enable",
9237 read_sync_flow_control_rsp, 2, true },
9238 { 0x0c2f, 84, "Write Sync Flow Control Enable",
9239 write_sync_flow_control_cmd, 1, true,
9240 status_rsp, 1, true },
9241 { 0x0c31, 85, "Set Controller To Host Flow Control",
9242 set_host_flow_control_cmd, 1, true,
9243 status_rsp, 1, true },
9244 { 0x0c33, 86, "Host Buffer Size",
9245 host_buffer_size_cmd, 7, true,
9246 status_rsp, 1, true },
9247 { 0x0c35, 87, "Host Number of Completed Packets",
9248 host_num_completed_packets_cmd, 5, false },
9249 { 0x0c36, 88, "Read Link Supervision Timeout",
9250 read_link_supv_timeout_cmd, 2, true,
9251 read_link_supv_timeout_rsp, 5, true },
9252 { 0x0c37, 89, "Write Link Supervision Timeout",
9253 write_link_supv_timeout_cmd, 4, true,
9254 write_link_supv_timeout_rsp, 3, true },
9255 { 0x0c38, 90, "Read Number of Supported IAC",
9257 read_num_supported_iac_rsp, 2, true },
9258 { 0x0c39, 91, "Read Current IAC LAP",
9260 read_current_iac_lap_rsp, 2, false },
9261 { 0x0c3a, 92, "Write Current IAC LAP",
9262 write_current_iac_lap_cmd, 1, false,
9263 status_rsp, 1, true },
9264 { 0x0c3b, 93, "Read Page Scan Period Mode",
9266 read_page_scan_period_mode_rsp, 2, true },
9267 { 0x0c3c, 94, "Write Page Scan Period Mode",
9268 write_page_scan_period_mode_cmd, 1, true,
9269 status_rsp, 1, true },
9270 { 0x0c3d, 95, "Read Page Scan Mode",
9272 read_page_scan_mode_rsp, 2, true },
9273 { 0x0c3e, 96, "Write Page Scan Mode",
9274 write_page_scan_mode_cmd, 1, true,
9275 status_rsp, 1, true },
9276 { 0x0c3f, 97, "Set AFH Host Channel Classification",
9277 set_afh_host_classification_cmd, 10, true,
9278 status_rsp, 1, true },
9279 { 0x0c42, 100, "Read Inquiry Scan Type",
9281 read_inquiry_scan_type_rsp, 2, true },
9282 { 0x0c43, 101, "Write Inquiry Scan Type",
9283 write_inquiry_scan_type_cmd, 1, true,
9284 status_rsp, 1, true },
9285 { 0x0c44, 102, "Read Inquiry Mode",
9287 read_inquiry_mode_rsp, 2, true },
9288 { 0x0c45, 103, "Write Inquiry Mode",
9289 write_inquiry_mode_cmd, 1, true,
9290 status_rsp, 1, true },
9291 { 0x0c46, 104, "Read Page Scan Type",
9293 read_page_scan_type_rsp, 2, true },
9294 { 0x0c47, 105, "Write Page Scan Type",
9295 write_page_scan_type_cmd, 1, true,
9296 status_rsp, 1, true },
9297 { 0x0c48, 106, "Read AFH Channel Assessment Mode",
9299 read_afh_assessment_mode_rsp, 2, true },
9300 { 0x0c49, 107, "Write AFH Channel Assessment Mode",
9301 write_afh_assessment_mode_cmd, 1, true,
9302 status_rsp, 1, true },
9303 { 0x0c51, 136, "Read Extended Inquiry Response",
9305 read_ext_inquiry_response_rsp, 242, true },
9306 { 0x0c52, 137, "Write Extended Inquiry Response",
9307 write_ext_inquiry_response_cmd, 241, true,
9308 status_rsp, 1, true },
9309 { 0x0c53, 138, "Refresh Encryption Key",
9310 refresh_encrypt_key_cmd, 2, true },
9311 { 0x0c55, 141, "Read Simple Pairing Mode",
9313 read_simple_pairing_mode_rsp, 2, true },
9314 { 0x0c56, 142, "Write Simple Pairing Mode",
9315 write_simple_pairing_mode_cmd, 1, true,
9316 status_rsp, 1, true },
9317 { 0x0c57, 143, "Read Local OOB Data",
9319 read_local_oob_data_rsp, 33, true },
9320 { 0x0c58, 144, "Read Inquiry Response TX Power Level",
9322 read_inquiry_resp_tx_power_rsp, 2, true },
9323 { 0x0c59, 145, "Write Inquiry Transmit Power Level",
9324 write_inquiry_tx_power_cmd, 1, true,
9325 status_rsp, 1, true },
9326 { 0x0c5a, 146, "Read Default Erroneous Data Reporting",
9328 read_erroneous_reporting_rsp, 2, true },
9329 { 0x0c5b, 147, "Write Default Erroneous Data Reporting",
9330 write_erroneous_reporting_cmd, 1, true,
9331 status_rsp, 1, true },
9332 { 0x0c5f, 158, "Enhanced Flush",
9333 enhanced_flush_cmd, 3, true },
9334 { 0x0c60, 162, "Send Keypress Notification",
9335 send_keypress_notify_cmd, 7, true,
9336 send_keypress_notify_rsp, 7, true },
9337 { 0x0c61, 176, "Read Logical Link Accept Timeout" },
9338 { 0x0c62, 177, "Write Logical Link Accept Timeout" },
9339 { 0x0c63, 178, "Set Event Mask Page 2",
9340 set_event_mask_page2_cmd, 8, true,
9341 status_rsp, 1, true },
9342 { 0x0c64, 179, "Read Location Data",
9344 read_location_data_rsp, 6, true },
9345 { 0x0c65, 180, "Write Location Data",
9346 write_location_data_cmd, 5, true,
9347 status_rsp, 1, true },
9348 { 0x0c66, 184, "Read Flow Control Mode",
9350 read_flow_control_mode_rsp, 2, true },
9351 { 0x0c67, 185, "Write Flow Control Mode",
9352 write_flow_control_mode_cmd, 1, true,
9353 status_rsp, 1, true },
9354 { 0x0c68, 192, "Read Enhanced Transmit Power Level",
9355 read_enhanced_tx_power_cmd, 3, true,
9356 read_enhanced_tx_power_rsp, 6, true },
9357 { 0x0c69, 194, "Read Best Effort Flush Timeout" },
9358 { 0x0c6a, 195, "Write Best Effort Flush Timeout" },
9359 { 0x0c6b, 196, "Short Range Mode",
9360 short_range_mode_cmd, 2, true },
9361 { 0x0c6c, 197, "Read LE Host Supported",
9363 read_le_host_supported_rsp, 3, true },
9364 { 0x0c6d, 198, "Write LE Host Supported",
9365 write_le_host_supported_cmd, 2, true,
9366 status_rsp, 1, true },
9367 { 0x0c6e, 238, "Set MWS Channel Parameters" },
9368 { 0x0c6f, 239, "Set External Frame Configuration" },
9369 { 0x0c70, 240, "Set MWS Signaling" },
9370 { 0x0c71, 241, "Set MWS Transport Layer" },
9371 { 0x0c72, 242, "Set MWS Scan Frequency Table" },
9372 { 0x0c73, 244, "Set MWS Pattern Configuration" },
9373 { 0x0c74, 252, "Set Reserved LT_ADDR",
9374 set_reserved_lt_addr_cmd, 1, true,
9375 set_reserved_lt_addr_rsp, 2, true },
9376 { 0x0c75, 253, "Delete Reserved LT_ADDR",
9377 delete_reserved_lt_addr_cmd, 1, true,
9378 delete_reserved_lt_addr_rsp, 2, true },
9379 { 0x0c76, 254, "Set Connectionless Peripheral Broadcast Data",
9380 set_peripheral_broadcast_data_cmd, 3, false,
9381 set_peripheral_broadcast_data_rsp, 2, true },
9382 { 0x0c77, 255, "Read Synchronization Train Parameters",
9384 read_sync_train_params_rsp, 8, true },
9385 { 0x0c78, 256, "Write Synchronization Train Parameters",
9386 write_sync_train_params_cmd, 9, true,
9387 write_sync_train_params_rsp, 3, true },
9388 { 0x0c79, 258, "Read Secure Connections Host Support",
9390 read_secure_conn_support_rsp, 2, true },
9391 { 0x0c7a, 259, "Write Secure Connections Host Support",
9392 write_secure_conn_support_cmd, 1, true,
9393 status_rsp, 1, true },
9394 { 0x0c7b, 260, "Read Authenticated Payload Timeout",
9395 read_auth_payload_timeout_cmd, 2, true,
9396 read_auth_payload_timeout_rsp, 5, true },
9397 { 0x0c7c, 261, "Write Authenticated Payload Timeout",
9398 write_auth_payload_timeout_cmd, 4, true,
9399 write_auth_payload_timeout_rsp, 3, true },
9400 { 0x0c7d, 262, "Read Local OOB Extended Data",
9402 read_local_oob_ext_data_rsp, 65, true },
9403 { 0x0c7e, 264, "Read Extended Page Timeout",
9405 read_ext_page_timeout_rsp, 3, true },
9406 { 0x0c7f, 265, "Write Extended Page Timeout",
9407 write_ext_page_timeout_cmd, 2, true,
9408 status_rsp, 1, true },
9409 { 0x0c80, 266, "Read Extended Inquiry Length",
9411 read_ext_inquiry_length_rsp, 3, true },
9412 { 0x0c81, 267, "Write Extended Inquiry Length",
9413 write_ext_inquiry_length_cmd, 2, true,
9414 status_rsp, 1, true },
9416 /* OGF 4 - Information Parameter */
9417 { 0x1001, 115, "Read Local Version Information",
9419 read_local_version_rsp, 9, true },
9420 { 0x1002, 116, "Read Local Supported Commands",
9422 read_local_commands_rsp, 65, true },
9423 { 0x1003, 117, "Read Local Supported Features",
9425 read_local_features_rsp, 9, true },
9426 { 0x1004, 118, "Read Local Extended Features",
9427 read_local_ext_features_cmd, 1, true,
9428 read_local_ext_features_rsp, 11, true },
9429 { 0x1005, 119, "Read Buffer Size",
9431 read_buffer_size_rsp, 8, true },
9432 { 0x1007, 120, "Read Country Code",
9434 read_country_code_rsp, 2, true },
9435 { 0x1009, 121, "Read BD ADDR",
9437 read_bd_addr_rsp, 7, true },
9438 { 0x100a, 186, "Read Data Block Size",
9440 read_data_block_size_rsp, 7, true },
9441 { 0x100b, 237, "Read Local Supported Codecs",
9443 read_local_codecs_rsp, 3, false },
9444 { 0x100c, 331, "Read Local Simple Pairing Options",
9446 read_local_pairing_options_rsp, 3, true },
9447 { BT_HCI_CMD_READ_LOCAL_CODECS_V2, BT_HCI_BIT_READ_LOCAL_CODECS_V2,
9448 "Read Local Supported Codecs V2",
9450 read_local_codecs_rsp_v2,
9451 sizeof(struct bt_hci_rsp_read_local_codecs_v2), false
9453 { BT_HCI_CMD_READ_LOCAL_CODEC_CAPS, BT_HCI_BIT_READ_LOCAL_CODEC_CAPS,
9454 "Read Local Supported Codec Capabilities",
9455 read_local_codec_caps_cmd,
9456 sizeof(struct bt_hci_cmd_read_local_codec_caps), true,
9457 read_local_codec_caps_rsp,
9458 sizeof(struct bt_hci_rsp_read_local_codec_caps), false
9460 { BT_HCI_CMD_READ_LOCAL_CTRL_DELAY, BT_HCI_BIT_READ_LOCAL_CTRL_DELAY,
9461 "Read Local Supported Controller Delay",
9462 read_local_ctrl_delay_cmd,
9463 sizeof(struct bt_hci_cmd_read_local_ctrl_delay), false,
9464 read_local_ctrl_delay_rsp,
9465 sizeof(struct bt_hci_rsp_read_local_ctrl_delay), true
9467 { BT_HCI_CMD_CONFIG_DATA_PATH, BT_HCI_BIT_CONFIG_DATA_PATH,
9468 "Configure Data Path",
9469 config_data_path_cmd,
9470 sizeof(struct bt_hci_cmd_config_data_path), false,
9474 /* OGF 5 - Status Parameter */
9475 { 0x1401, 122, "Read Failed Contact Counter",
9476 read_failed_contact_counter_cmd, 2, true,
9477 read_failed_contact_counter_rsp, 5, true },
9478 { 0x1402, 123, "Reset Failed Contact Counter",
9479 reset_failed_contact_counter_cmd, 2, true,
9480 reset_failed_contact_counter_rsp, 3, true },
9481 { 0x1403, 124, "Read Link Quality",
9482 read_link_quality_cmd, 2, true,
9483 read_link_quality_rsp, 4, true },
9484 { 0x1405, 125, "Read RSSI",
9485 read_rssi_cmd, 2, true,
9486 read_rssi_rsp, 4, true },
9487 { 0x1406, 126, "Read AFH Channel Map",
9488 read_afh_channel_map_cmd, 2, true,
9489 read_afh_channel_map_rsp, 14, true },
9490 { 0x1407, 127, "Read Clock",
9491 read_clock_cmd, 3, true,
9492 read_clock_rsp, 9, true },
9493 { 0x1408, 164, "Read Encryption Key Size",
9494 read_encrypt_key_size_cmd, 2, true,
9495 read_encrypt_key_size_rsp, 4, true },
9496 { 0x1409, 181, "Read Local AMP Info",
9498 read_local_amp_info_rsp, 31, true },
9499 { 0x140a, 182, "Read Local AMP ASSOC",
9500 read_local_amp_assoc_cmd, 5, true,
9501 read_local_amp_assoc_rsp, 5, false },
9502 { 0x140b, 183, "Write Remote AMP ASSOC",
9503 write_remote_amp_assoc_cmd, 6, false,
9504 write_remote_amp_assoc_rsp, 2, true },
9505 { 0x140c, 243, "Get MWS Transport Layer Configuration",
9507 get_mws_transport_config_rsp, 2, false },
9508 { 0x140d, 245, "Set Triggered Clock Capture",
9509 set_triggered_clock_capture_cmd, 6, true,
9510 status_rsp, 1, true },
9512 /* OGF 6 - Testing */
9513 { 0x1801, 128, "Read Loopback Mode",
9515 read_loopback_mode_rsp, 2, true },
9516 { 0x1802, 129, "Write Loopback Mode",
9517 write_loopback_mode_cmd, 1, true,
9518 status_rsp, 1, true },
9519 { 0x1803, 130, "Enable Device Under Test Mode",
9521 status_rsp, 1, true },
9522 { 0x1804, 157, "Write Simple Pairing Debug Mode",
9523 write_ssp_debug_mode_cmd, 1, true,
9524 status_rsp, 1, true },
9525 { 0x1807, 189, "Enable AMP Receiver Reports" },
9526 { 0x1808, 190, "AMP Test End" },
9527 { 0x1809, 191, "AMP Test" },
9528 { 0x180a, 263, "Write Secure Connections Test Mode" },
9530 /* OGF 8 - LE Control */
9531 { 0x2001, 200, "LE Set Event Mask",
9532 le_set_event_mask_cmd, 8, true,
9533 status_rsp, 1, true },
9534 { 0x2002, 201, "LE Read Buffer Size",
9536 le_read_buffer_size_rsp, 4, true },
9537 { 0x2003, 202, "LE Read Local Supported Features",
9539 le_read_local_features_rsp, 9, true },
9540 { 0x2005, 204, "LE Set Random Address",
9541 le_set_random_address_cmd, 6, true,
9542 status_rsp, 1, true },
9543 { 0x2006, 205, "LE Set Advertising Parameters",
9544 le_set_adv_parameters_cmd, 15, true,
9545 status_rsp, 1, true },
9546 { 0x2007, 206, "LE Read Advertising Channel TX Power",
9548 le_read_adv_tx_power_rsp, 2, true },
9549 { 0x2008, 207, "LE Set Advertising Data",
9550 le_set_adv_data_cmd, 32, true,
9551 status_rsp, 1, true },
9552 { 0x2009, 208, "LE Set Scan Response Data",
9553 le_set_scan_rsp_data_cmd, 32, true,
9554 status_rsp, 1, true },
9555 { 0x200a, 209, "LE Set Advertise Enable",
9556 le_set_adv_enable_cmd, 1, true,
9557 status_rsp, 1, true },
9558 { 0x200b, 210, "LE Set Scan Parameters",
9559 le_set_scan_parameters_cmd, 7, true,
9560 status_rsp, 1, true },
9561 { 0x200c, 211, "LE Set Scan Enable",
9562 le_set_scan_enable_cmd, 2, true,
9563 status_rsp, 1, true },
9564 { 0x200d, 212, "LE Create Connection",
9565 le_create_conn_cmd, 25, true },
9566 { 0x200e, 213, "LE Create Connection Cancel",
9568 status_rsp, 1, true },
9569 { 0x200f, 214, "LE Read Accept List Size",
9571 le_read_accept_list_size_rsp, 2, true },
9572 { 0x2010, 215, "LE Clear Accept List",
9574 status_rsp, 1, true },
9575 { 0x2011, 216, "LE Add Device To Accept List",
9576 le_add_to_accept_list_cmd, 7, true,
9577 status_rsp, 1, true },
9578 { 0x2012, 217, "LE Remove Device From Accept List",
9579 le_remove_from_accept_list_cmd, 7, true,
9580 status_rsp, 1, true },
9581 { 0x2013, 218, "LE Connection Update",
9582 le_conn_update_cmd, 14, true },
9583 { 0x2014, 219, "LE Set Host Channel Classification",
9584 le_set_host_classification_cmd, 5, true,
9585 status_rsp, 1, true },
9586 { 0x2015, 220, "LE Read Channel Map",
9587 le_read_channel_map_cmd, 2, true,
9588 le_read_channel_map_rsp, 8, true },
9589 { 0x2016, 221, "LE Read Remote Used Features",
9590 le_read_remote_features_cmd, 2, true },
9591 { 0x2017, 222, "LE Encrypt",
9592 le_encrypt_cmd, 32, true,
9593 le_encrypt_rsp, 17, true },
9594 { 0x2018, 223, "LE Rand",
9596 le_rand_rsp, 9, true },
9597 { 0x2019, 224, "LE Start Encryption",
9598 le_start_encrypt_cmd, 28, true },
9599 { 0x201a, 225, "LE Long Term Key Request Reply",
9600 le_ltk_req_reply_cmd, 18, true,
9601 le_ltk_req_reply_rsp, 3, true },
9602 { 0x201b, 226, "LE Long Term Key Request Neg Reply",
9603 le_ltk_req_neg_reply_cmd, 2, true,
9604 le_ltk_req_neg_reply_rsp, 3, true },
9605 { 0x201c, 227, "LE Read Supported States",
9607 le_read_supported_states_rsp, 9, true },
9608 { 0x201d, 228, "LE Receiver Test",
9609 le_receiver_test_cmd, 1, true,
9610 status_rsp, 1, true },
9611 { 0x201e, 229, "LE Transmitter Test",
9612 le_transmitter_test_cmd, 3, true,
9613 status_rsp, 1, true },
9614 { 0x201f, 230, "LE Test End",
9616 le_test_end_rsp, 3, true },
9617 { 0x2020, 268, "LE Remote Connection Parameter Request Reply",
9618 le_conn_param_req_reply_cmd, 14, true,
9619 le_conn_param_req_reply_rsp, 3, true },
9620 { 0x2021, 269, "LE Remote Connection Parameter Request Negative Reply",
9621 le_conn_param_req_neg_reply_cmd, 3, true,
9622 le_conn_param_req_neg_reply_rsp, 3, true },
9623 { 0x2022, 270, "LE Set Data Length",
9624 le_set_data_length_cmd, 6, true,
9625 le_set_data_length_rsp, 3, true },
9626 { 0x2023, 271, "LE Read Suggested Default Data Length",
9628 le_read_default_data_length_rsp, 5, true },
9629 { 0x2024, 272, "LE Write Suggested Default Data Length",
9630 le_write_default_data_length_cmd, 4, true,
9631 status_rsp, 1, true },
9632 { 0x2025, 273, "LE Read Local P-256 Public Key",
9633 null_cmd, 0, true },
9634 { 0x2026, 274, "LE Generate DHKey",
9635 le_generate_dhkey_cmd, 64, true },
9636 { 0x2027, 275, "LE Add Device To Resolving List",
9637 le_add_to_resolv_list_cmd, 39, true,
9638 status_rsp, 1, true },
9639 { 0x2028, 276, "LE Remove Device From Resolving List",
9640 le_remove_from_resolv_list_cmd, 7, true,
9641 status_rsp, 1, true },
9642 { 0x2029, 277, "LE Clear Resolving List",
9644 status_rsp, 1, true },
9645 { 0x202a, 278, "LE Read Resolving List Size",
9647 le_read_resolv_list_size_rsp, 2, true },
9648 { 0x202b, 279, "LE Read Peer Resolvable Address",
9649 le_read_peer_resolv_addr_cmd, 7, true,
9650 le_read_peer_resolv_addr_rsp, 7, true },
9651 { 0x202c, 280, "LE Read Local Resolvable Address",
9652 le_read_local_resolv_addr_cmd, 7, true,
9653 le_read_local_resolv_addr_rsp, 7, true },
9654 { 0x202d, 281, "LE Set Address Resolution Enable",
9655 le_set_resolv_enable_cmd, 1, true,
9656 status_rsp, 1, true },
9657 { 0x202e, 282, "LE Set Resolvable Private Address Timeout",
9658 le_set_resolv_timeout_cmd, 2, true,
9659 status_rsp, 1, true },
9660 { 0x202f, 283, "LE Read Maximum Data Length",
9662 le_read_max_data_length_rsp, 9, true },
9663 { 0x2030, 284, "LE Read PHY",
9664 le_read_phy_cmd, 2, true,
9665 le_read_phy_rsp, 5, true},
9666 { 0x2031, 285, "LE Set Default PHY",
9667 le_set_default_phy_cmd, 3, true,
9668 status_rsp, 1, true },
9669 { 0x2032, 286, "LE Set PHY",
9670 le_set_phy_cmd, 7, true},
9671 { 0x2033, 287, "LE Enhanced Receiver Test",
9672 le_enhanced_receiver_test_cmd, 3, true,
9673 status_rsp, 1, true },
9674 { 0x2034, 288, "LE Enhanced Transmitter Test",
9675 le_enhanced_transmitter_test_cmd, 4, true,
9676 status_rsp, 1, true },
9677 { 0x2035, 289, "LE Set Advertising Set Random Address",
9678 le_set_adv_set_rand_addr, 7, true,
9679 status_rsp, 1, true },
9680 { 0x2036, 290, "LE Set Extended Advertising Parameters",
9681 le_set_ext_adv_params_cmd, 25, true,
9682 le_set_ext_adv_params_rsp, 2, true },
9683 { 0x2037, 291, "LE Set Extended Advertising Data",
9684 le_set_ext_adv_data_cmd, 4, false,
9685 status_rsp, 1, true },
9686 { 0x2038, 292, "LE Set Extended Scan Response Data",
9687 le_set_ext_scan_rsp_data_cmd, 4, false,
9688 status_rsp, 1, true },
9689 { 0x2039, 293, "LE Set Extended Advertising Enable",
9690 le_set_ext_adv_enable_cmd, 2, false,
9691 status_rsp, 1, true },
9692 { 0x203a, 294, "LE Read Maximum Advertising Data Length",
9694 le_read_max_adv_data_len_rsp, 3, true },
9695 { 0x203b, 295, "LE Read Number of Supported Advertising Sets",
9697 le_read_num_supported_adv_sets_rsp, 2, true },
9698 { 0x203c, 296, "LE Remove Advertising Set",
9699 le_remove_adv_set_cmd, 1, true,
9700 status_rsp, 1, true },
9701 { 0x203d, 297, "LE Clear Advertising Sets",
9703 status_rsp, 1, true },
9704 { 0x203e, 298, "LE Set Periodic Advertising Parameters",
9705 le_set_pa_params_cmd, 7, true,
9706 status_rsp, 1, true },
9707 { 0x203f, 299, "LE Set Periodic Advertising Data",
9708 le_set_pa_data_cmd, 3, false,
9709 status_rsp, 1, true },
9710 { 0x2040, 300, "LE Set Periodic Advertising Enable",
9711 le_set_pa_enable_cmd, 2, true,
9712 status_rsp, 1, true },
9713 { 0x2041, 301, "LE Set Extended Scan Parameters",
9714 le_set_ext_scan_params_cmd, 3, false,
9715 status_rsp, 1, true },
9716 { 0x2042, 302, "LE Set Extended Scan Enable",
9717 le_set_ext_scan_enable_cmd, 6, true,
9718 status_rsp, 1, true },
9719 { 0x2043, 303, "LE Extended Create Connection",
9720 le_ext_create_conn_cmd, 10, false,
9721 status_rsp, 1, true },
9722 { 0x2044, 304, "LE Periodic Advertising Create Sync",
9723 le_pa_create_sync_cmd, 14, true,
9724 status_rsp, 1, true },
9725 { 0x2045, 305, "LE Periodic Advertising Create Sync Cancel",
9727 status_rsp, 1, true },
9728 { 0x2046, 306, "LE Periodic Advertising Terminate Sync",
9729 le_pa_term_sync_cmd, 2, true,
9730 status_rsp, 1, true },
9731 { 0x2047, 307, "LE Add Device To Periodic Advertiser List",
9732 le_add_dev_pa_list_cmd, 8, true,
9733 status_rsp, 1, true },
9734 { 0x2048, 308, "LE Remove Device From Periodic Advertiser List",
9735 le_remove_dev_pa_list_cmd, 8, true,
9736 status_rsp, 1, true },
9737 { 0x2049, 309, "LE Clear Periodic Advertiser List",
9739 status_rsp, 1, true },
9740 { 0x204a, 310, "LE Read Periodic Advertiser List Size",
9742 le_read_pa_list_size_rsp, 2, true },
9743 { 0x204b, 311, "LE Read Transmit Power",
9745 le_read_tx_power_rsp, 3, true },
9746 { 0x204c, 312, "LE Read RF Path Compensation",
9748 le_read_rf_path_comp_rsp, 5, true },
9749 { 0x204d, 313, "LE Write RF Path Compensation",
9750 le_write_rf_path_comp_cmd, 4, true,
9751 status_rsp, 1, true },
9752 { 0x204e, 314, "LE Set Privacy Mode",
9753 le_set_priv_mode_cmd, 8, true,
9754 status_rsp, 1, true },
9755 { 0x204f, 315, "LE Receiver Test command [v3]",
9756 le_receiver_test_cmd_v3, 7, false,
9757 status_rsp, 1, true },
9758 { 0x2050, 316, "LE Transmitter Test command [v3]",
9759 le_tx_test_cmd_v3, 9, false,
9760 status_rsp, 1, true },
9761 { 0x2059, 325, "LE Periodic Advertising Receive Enable",
9762 le_pa_rec_enable, 3, true,
9763 status_rsp, 1, true },
9764 { 0x205a, 326, "LE Periodic Advertising Sync Transfer",
9765 le_pa_sync_trans, 6, true,
9766 status_handle_rsp, 3, true },
9767 { 0x205b, 327, "LE Periodic Advertising Set Info Transfer",
9768 le_pa_set_info_trans, 5, true,
9769 status_handle_rsp, 3, true },
9770 { 0x205c, 328, "LE Periodic Advertising Sync Transfer Parameters",
9771 le_pa_sync_trans_params, 8, true,
9772 status_handle_rsp, 3, true},
9773 { 0x205d, 329, "LE Set Default Periodic Advertisng Sync Transfer "
9775 le_set_default_pa_sync_trans_params,
9776 6, true, status_rsp, 1, true},
9777 { BT_HCI_CMD_LE_READ_BUFFER_SIZE_V2,
9778 BT_HCI_BIT_LE_READ_BUFFER_SIZE_V2,
9779 "LE Read Buffer v2",
9781 le_read_buffer_size_v2_rsp,
9783 struct bt_hci_rsp_le_read_buffer_size_v2),
9785 { BT_HCI_CMD_LE_READ_ISO_TX_SYNC,
9786 BT_HCI_BIT_LE_READ_ISO_TX_SYNC,
9787 "LE Read ISO TX Sync",
9788 le_read_iso_tx_sync_cmd,
9789 sizeof(struct bt_hci_cmd_le_read_iso_tx_sync),
9791 le_read_iso_tx_sync_rsp,
9792 sizeof(struct bt_hci_rsp_le_read_iso_tx_sync),
9794 { BT_HCI_CMD_LE_SET_CIG_PARAMS, BT_HCI_BIT_LE_SET_CIG_PARAMS,
9795 "LE Set Connected Isochronous Group Parameters",
9796 le_set_cig_params_cmd,
9797 sizeof(struct bt_hci_cmd_le_set_cig_params),
9799 le_set_cig_params_rsp,
9800 sizeof(struct bt_hci_rsp_le_set_cig_params),
9802 { BT_HCI_CMD_LE_SET_CIG_PARAMS_TEST, BT_HCI_BIT_LE_SET_CIG_PARAMS_TEST,
9803 "LE Set Connected Isochronous Group Parameters"
9804 " Test", le_set_cig_params_test_cmd,
9806 struct bt_hci_cmd_le_set_cig_params_test),
9808 le_set_cig_params_rsp,
9809 sizeof(struct bt_hci_rsp_le_set_cig_params),
9811 { BT_HCI_CMD_LE_CREATE_CIS, BT_HCI_BIT_LE_CREATE_CIS,
9812 "LE Create Connected Isochronous Stream",
9814 sizeof(struct bt_hci_cmd_le_create_cis),
9816 { BT_HCI_CMD_LE_REMOVE_CIG, BT_HCI_BIT_LE_REMOVE_CIG,
9817 "LE Remove Connected Isochronous Group",
9819 sizeof(struct bt_hci_cmd_le_remove_cig), false,
9821 sizeof(struct bt_hci_rsp_le_remove_cig),
9823 { BT_HCI_CMD_LE_ACCEPT_CIS, BT_HCI_BIT_LE_ACCEPT_CIS,
9824 "LE Accept Connected Isochronous Stream Request",
9825 le_accept_cis_req_cmd,
9826 sizeof(struct bt_hci_cmd_le_accept_cis), true },
9827 { BT_HCI_CMD_LE_REJECT_CIS, BT_HCI_BIT_LE_REJECT_CIS,
9828 "LE Reject Connected Isochronous Stream Request",
9829 le_reject_cis_req_cmd,
9830 sizeof(struct bt_hci_cmd_le_reject_cis), true,
9831 status_rsp, 1, true },
9832 { BT_HCI_CMD_LE_CREATE_BIG, BT_HCI_BIT_LE_CREATE_BIG,
9833 "LE Create Broadcast Isochronous Group",
9834 le_create_big_cmd },
9835 { BT_HCI_CMD_LE_CREATE_BIG_TEST, BT_HCI_BIT_LE_CREATE_BIG_TEST,
9836 "LE Create Broadcast Isochronous Group Test",
9837 le_create_big_cmd_test_cmd },
9838 { BT_HCI_CMD_LE_TERM_BIG, BT_HCI_BIT_LE_TERM_BIG,
9839 "LE Terminate Broadcast Isochronous Group",
9840 le_terminate_big_cmd,
9841 sizeof(struct bt_hci_cmd_le_term_big), true,
9842 status_rsp, 1, true},
9843 { BT_HCI_CMD_LE_BIG_CREATE_SYNC, BT_HCI_BIT_LE_BIG_CREATE_SYNC,
9844 "LE Broadcast Isochronous Group Create Sync",
9845 le_big_create_sync_cmd,
9846 sizeof(struct bt_hci_cmd_le_big_create_sync),
9848 { BT_HCI_CMD_LE_BIG_TERM_SYNC, BT_HCI_BIT_LE_BIG_TERM_SYNC,
9849 "LE Broadcast Isochronous Group Terminate Sync",
9850 le_big_term_sync_cmd,
9851 sizeof(struct bt_hci_cmd_le_big_term_sync),
9853 { BT_HCI_CMD_LE_REQ_PEER_SCA, BT_HCI_BIT_LE_REQ_PEER_SCA,
9854 "LE Request Peer SCA", le_req_peer_sca_cmd,
9855 sizeof(struct bt_hci_cmd_le_req_peer_sca),
9857 { BT_HCI_CMD_LE_SETUP_ISO_PATH, BT_HCI_BIT_LE_SETUP_ISO_PATH,
9858 "LE Setup Isochronous Data Path",
9859 le_setup_iso_path_cmd,
9860 sizeof(struct bt_hci_cmd_le_setup_iso_path),
9861 true, le_setup_iso_path_rsp,
9862 sizeof(struct bt_hci_rsp_le_setup_iso_path),
9864 { BT_HCI_CMD_LE_REMOVE_ISO_PATH, BT_HCI_BIT_LE_REMOVE_ISO_PATH,
9865 "LE Remove Isochronous Data Path",
9866 le_remove_iso_path_cmd,
9867 sizeof(struct bt_hci_cmd_le_remove_iso_path),
9868 true, status_rsp, 1, true },
9869 { BT_HCI_CMD_LE_ISO_TX_TEST, BT_HCI_BIT_LE_ISO_TX_TEST,
9870 "LE Isochronous Transmit Test", NULL, 0,
9872 { BT_HCI_CMD_LE_ISO_RX_TEST, BT_HCI_BIT_LE_ISO_RX_TEST,
9873 "LE Isochronous Receive Test", NULL, 0,
9875 { BT_HCI_CMD_LE_ISO_READ_TEST_COUNTER,
9876 BT_HCI_BIT_LE_ISO_READ_TEST_COUNTER,
9877 "LE Isochronous Read Test Counters", NULL, 0,
9879 { BT_HCI_CMD_LE_ISO_TEST_END, BT_HCI_BIT_LE_ISO_TEST_END,
9880 "LE Isochronous Read Test Counters", NULL, 0,
9882 { BT_HCI_CMD_LE_SET_HOST_FEATURE, BT_HCI_BIT_LE_SET_HOST_FEATURE,
9883 "LE Set Host Feature", le_set_host_feature_cmd,
9884 sizeof(struct bt_hci_cmd_le_set_host_feature),
9885 true, status_rsp, 1, true },
9889 static const char *get_supported_command(int bit)
9893 for (i = 0; opcode_table[i].str; i++) {
9894 if (opcode_table[i].bit == bit)
9895 return opcode_table[i].str;
9901 static const char *current_vendor_str(uint16_t ocf)
9903 uint16_t manufacturer, msft_opcode;
9905 if (index_current < MAX_INDEX) {
9906 manufacturer = index_list[index_current].manufacturer;
9907 msft_opcode = index_list[index_current].msft_opcode;
9909 manufacturer = fallback_manufacturer;
9910 msft_opcode = BT_HCI_CMD_NOP;
9913 if (msft_opcode != BT_HCI_CMD_NOP &&
9914 cmd_opcode_ocf(msft_opcode) == ocf)
9917 switch (manufacturer) {
9924 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9933 static const struct vendor_ocf *current_vendor_ocf(uint16_t ocf)
9935 uint16_t manufacturer, msft_opcode;
9937 if (index_current < MAX_INDEX) {
9938 manufacturer = index_list[index_current].manufacturer;
9939 msft_opcode = index_list[index_current].msft_opcode;
9941 manufacturer = fallback_manufacturer;
9942 msft_opcode = BT_HCI_CMD_NOP;
9945 if (msft_opcode != BT_HCI_CMD_NOP &&
9946 cmd_opcode_ocf(msft_opcode) == ocf)
9947 return msft_vendor_ocf();
9949 switch (manufacturer) {
9951 return intel_vendor_ocf(ocf);
9953 return broadcom_vendor_ocf(ocf);
9954 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9956 return broadcom_vendor_ocf(ocf);
9963 static const struct vendor_evt *current_vendor_evt(const void *data,
9966 uint16_t manufacturer;
9967 uint8_t evt = *((const uint8_t *) data);
9969 /* A regular vendor event consumes 1 byte. */
9972 if (index_current < MAX_INDEX)
9973 manufacturer = index_list[index_current].manufacturer;
9975 manufacturer = fallback_manufacturer;
9977 switch (manufacturer) {
9979 return intel_vendor_evt(data, consumed_size);
9981 return broadcom_vendor_evt(evt);
9982 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
9984 return broadcom_vendor_evt(evt);
9991 static const char *current_vendor_evt_str(void)
9993 uint16_t manufacturer;
9995 if (index_current < MAX_INDEX)
9996 manufacturer = index_list[index_current].manufacturer;
9998 manufacturer = fallback_manufacturer;
10000 switch (manufacturer) {
10012 static void inquiry_complete_evt(struct timeval *tv, uint16_t index,
10013 const void *data, uint8_t size)
10015 const struct bt_hci_evt_inquiry_complete *evt = data;
10017 print_status(evt->status);
10020 static void inquiry_result_evt(struct timeval *tv, uint16_t index,
10021 const void *data, uint8_t size)
10023 const struct bt_hci_evt_inquiry_result *evt = data;
10025 print_num_resp(evt->num_resp);
10026 print_bdaddr(evt->bdaddr);
10027 print_pscan_rep_mode(evt->pscan_rep_mode);
10028 print_pscan_period_mode(evt->pscan_period_mode);
10029 print_pscan_mode(evt->pscan_mode);
10030 print_dev_class(evt->dev_class);
10031 print_clock_offset(evt->clock_offset);
10033 if (size > sizeof(*evt))
10034 packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
10037 static void conn_complete_evt(struct timeval *tv, uint16_t index,
10038 const void *data, uint8_t size)
10040 const struct bt_hci_evt_conn_complete *evt = data;
10042 print_status(evt->status);
10043 print_handle(evt->handle);
10044 print_bdaddr(evt->bdaddr);
10045 print_link_type(evt->link_type);
10046 print_enable("Encryption", evt->encr_mode);
10048 if (evt->status == 0x00)
10049 assign_handle(index, le16_to_cpu(evt->handle), 0x00,
10050 (void *)evt->bdaddr, BDADDR_BREDR);
10053 static void conn_request_evt(struct timeval *tv, uint16_t index,
10054 const void *data, uint8_t size)
10056 const struct bt_hci_evt_conn_request *evt = data;
10058 print_bdaddr(evt->bdaddr);
10059 print_dev_class(evt->dev_class);
10060 print_link_type(evt->link_type);
10063 static void disconnect_complete_evt(struct timeval *tv, uint16_t index,
10064 const void *data, uint8_t size)
10066 const struct bt_hci_evt_disconnect_complete *evt = data;
10068 print_status(evt->status);
10069 print_handle(evt->handle);
10070 print_reason(evt->reason);
10072 if (evt->status == 0x00)
10073 release_handle(le16_to_cpu(evt->handle));
10076 static void auth_complete_evt(struct timeval *tv, uint16_t index,
10077 const void *data, uint8_t size)
10079 const struct bt_hci_evt_auth_complete *evt = data;
10081 print_status(evt->status);
10082 print_handle(evt->handle);
10085 static void remote_name_request_complete_evt(struct timeval *tv, uint16_t index,
10086 const void *data, uint8_t size)
10088 const struct bt_hci_evt_remote_name_request_complete *evt = data;
10090 print_status(evt->status);
10091 print_bdaddr(evt->bdaddr);
10092 print_name(evt->name);
10095 static void encrypt_change_evt(struct timeval *tv, uint16_t index,
10096 const void *data, uint8_t size)
10098 const struct bt_hci_evt_encrypt_change *evt = data;
10100 print_status(evt->status);
10101 print_handle(evt->handle);
10102 print_encr_mode_change(evt->encr_mode, evt->handle);
10105 static void change_conn_link_key_complete_evt(struct timeval *tv,
10107 const void *data, uint8_t size)
10109 const struct bt_hci_evt_change_conn_link_key_complete *evt = data;
10111 print_status(evt->status);
10112 print_handle(evt->handle);
10115 static void link_key_type_changed_evt(struct timeval *tv, uint16_t index,
10116 const void *data, uint8_t size)
10118 const struct bt_hci_evt_link_key_type_changed *evt = data;
10120 print_status(evt->status);
10121 print_handle(evt->handle);
10122 print_key_flag(evt->key_flag);
10125 static void remote_features_complete_evt(struct timeval *tv, uint16_t index,
10126 const void *data, uint8_t size)
10128 const struct bt_hci_evt_remote_features_complete *evt = data;
10130 print_status(evt->status);
10131 print_handle(evt->handle);
10132 print_features(0, evt->features, 0x00);
10135 static void remote_version_complete_evt(struct timeval *tv, uint16_t index,
10136 const void *data, uint8_t size)
10138 const struct bt_hci_evt_remote_version_complete *evt = data;
10140 print_status(evt->status);
10141 print_handle(evt->handle);
10142 print_lmp_version(evt->lmp_ver, evt->lmp_subver);
10143 print_manufacturer(evt->manufacturer);
10145 switch (le16_to_cpu(evt->manufacturer)) {
10147 print_manufacturer_broadcom(evt->lmp_subver, 0xffff);
10152 static void qos_setup_complete_evt(struct timeval *tv, uint16_t index,
10153 const void *data, uint8_t size)
10155 const struct bt_hci_evt_qos_setup_complete *evt = data;
10157 print_status(evt->status);
10158 print_handle(evt->handle);
10159 print_field("Flags: 0x%2.2x", evt->flags);
10161 print_service_type(evt->service_type);
10163 print_field("Token rate: %d", le32_to_cpu(evt->token_rate));
10164 print_field("Peak bandwidth: %d", le32_to_cpu(evt->peak_bandwidth));
10165 print_field("Latency: %d", le32_to_cpu(evt->latency));
10166 print_field("Delay variation: %d", le32_to_cpu(evt->delay_variation));
10169 static void cmd_complete_evt(struct timeval *tv, uint16_t index,
10170 const void *data, uint8_t size)
10172 const struct bt_hci_evt_cmd_complete *evt = data;
10173 uint16_t opcode = le16_to_cpu(evt->opcode);
10174 uint16_t ogf = cmd_opcode_ogf(opcode);
10175 uint16_t ocf = cmd_opcode_ocf(opcode);
10176 struct opcode_data vendor_data;
10177 const struct opcode_data *opcode_data = NULL;
10178 const char *opcode_color, *opcode_str;
10179 char vendor_str[150];
10182 for (i = 0; opcode_table[i].str; i++) {
10183 if (opcode_table[i].opcode == opcode) {
10184 opcode_data = &opcode_table[i];
10190 if (opcode_data->rsp_func)
10191 opcode_color = COLOR_HCI_COMMAND;
10193 opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
10194 opcode_str = opcode_data->str;
10197 const struct vendor_ocf *vnd = current_vendor_ocf(ocf);
10200 const char *str = current_vendor_str(ocf);
10203 snprintf(vendor_str, sizeof(vendor_str),
10204 "%s %s", str, vnd->str);
10205 vendor_data.str = vendor_str;
10207 vendor_data.str = vnd->str;
10208 vendor_data.rsp_func = vnd->rsp_func;
10209 vendor_data.rsp_size = vnd->rsp_size;
10210 vendor_data.rsp_fixed = vnd->rsp_fixed;
10212 opcode_data = &vendor_data;
10214 if (opcode_data->rsp_func)
10215 opcode_color = COLOR_HCI_COMMAND;
10217 opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
10218 opcode_str = opcode_data->str;
10220 opcode_color = COLOR_HCI_COMMAND;
10221 opcode_str = "Vendor";
10224 opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
10225 opcode_str = "Unknown";
10229 print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,
10230 " (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);
10232 if (!opcode_data || !opcode_data->rsp_func) {
10234 uint8_t status = *((uint8_t *) (data + 3));
10236 print_status(status);
10237 packet_hexdump(data + 4, size - 4);
10242 if (opcode_data->rsp_size > 1 && size - 3 == 1) {
10243 uint8_t status = *((uint8_t *) (data + 3));
10245 print_status(status);
10249 if (opcode_data->rsp_fixed) {
10250 if (size - 3 != opcode_data->rsp_size) {
10251 print_text(COLOR_ERROR, "invalid packet size");
10252 packet_hexdump(data + 3, size - 3);
10256 if (size - 3 < opcode_data->rsp_size) {
10257 print_text(COLOR_ERROR, "too short packet");
10258 packet_hexdump(data + 3, size - 3);
10263 opcode_data->rsp_func(index, data + 3, size - 3);
10266 static void cmd_status_evt(struct timeval *tv, uint16_t index,
10267 const void *data, uint8_t size)
10269 const struct bt_hci_evt_cmd_status *evt = data;
10270 uint16_t opcode = le16_to_cpu(evt->opcode);
10271 uint16_t ogf = cmd_opcode_ogf(opcode);
10272 uint16_t ocf = cmd_opcode_ocf(opcode);
10273 const struct opcode_data *opcode_data = NULL;
10274 const char *opcode_color, *opcode_str;
10275 char vendor_str[150];
10278 for (i = 0; opcode_table[i].str; i++) {
10279 if (opcode_table[i].opcode == opcode) {
10280 opcode_data = &opcode_table[i];
10286 opcode_color = COLOR_HCI_COMMAND;
10287 opcode_str = opcode_data->str;
10290 const struct vendor_ocf *vnd = current_vendor_ocf(ocf);
10293 const char *str = current_vendor_str(ocf);
10296 snprintf(vendor_str, sizeof(vendor_str),
10297 "%s %s", str, vnd->str);
10298 opcode_str = vendor_str;
10300 opcode_str = vnd->str;
10302 opcode_color = COLOR_HCI_COMMAND;
10304 opcode_color = COLOR_HCI_COMMAND;
10305 opcode_str = "Vendor";
10308 opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
10309 opcode_str = "Unknown";
10313 print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,
10314 " (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);
10316 print_status(evt->status);
10319 static void hardware_error_evt(struct timeval *tv, uint16_t index,
10320 const void *data, uint8_t size)
10322 const struct bt_hci_evt_hardware_error *evt = data;
10324 print_field("Code: 0x%2.2x", evt->code);
10327 static void flush_occurred_evt(struct timeval *tv, uint16_t index,
10328 const void *data, uint8_t size)
10330 const struct bt_hci_evt_flush_occurred *evt = data;
10332 print_handle(evt->handle);
10335 static void role_change_evt(struct timeval *tv, uint16_t index,
10336 const void *data, uint8_t size)
10338 const struct bt_hci_evt_role_change *evt = data;
10340 print_status(evt->status);
10341 print_bdaddr(evt->bdaddr);
10342 print_role(evt->role);
10345 void packet_latency_add(struct packet_latency *latency, struct timeval *delta)
10347 if ((!timerisset(&latency->min) || timercmp(delta, &latency->min, <))
10348 && delta->tv_sec >= 0 && delta->tv_usec >= 0)
10349 latency->min = *delta;
10351 if (!timerisset(&latency->max) || timercmp(delta, &latency->max, >))
10352 latency->max = *delta;
10354 if (timerisset(&latency->med)) {
10355 struct timeval tmp;
10357 timeradd(&latency->med, delta, &tmp);
10361 if (tmp.tv_sec % 2) {
10362 tmp.tv_usec += 500000;
10363 if (tmp.tv_usec >= 1000000) {
10365 tmp.tv_usec -= 1000000;
10369 latency->med = tmp;
10371 latency->med = *delta;
10374 static void packet_dequeue_tx(struct timeval *tv, uint16_t handle)
10376 struct packet_conn_data *conn;
10377 struct timeval *tx;
10378 struct timeval delta;
10380 conn = packet_get_conn_data(handle);
10384 tx = queue_pop_head(conn->tx_q);
10388 timersub(tv, tx, &delta);
10390 packet_latency_add(&conn->tx_l, &delta);
10392 print_field("Latency: %lld msec (%lld-%lld msec ~%lld msec)",
10393 TV_MSEC(delta), TV_MSEC(conn->tx_l.min),
10394 TV_MSEC(conn->tx_l.max), TV_MSEC(conn->tx_l.med));
10396 l2cap_dequeue_frame(&delta, conn);
10401 static void num_completed_packets_evt(struct timeval *tv, uint16_t index,
10402 const void *data, uint8_t size)
10404 struct iovec iov = { (void *)data, size};
10405 const struct bt_hci_evt_num_completed_packets *evt = data;
10410 print_field("Num handles: %d", evt->num_handles);
10412 for (i = 0; i < evt->num_handles; i++) {
10417 if (!util_iov_pull_le16(&iov, &handle))
10420 print_handle_native(handle);
10422 if (!util_iov_pull_le16(&iov, &count))
10425 print_field("Count: %d", count);
10427 for (j = 0; j < count; j++)
10428 packet_dequeue_tx(tv, handle);
10432 packet_hexdump(iov.iov_base, iov.iov_len);
10435 static void mode_change_evt(struct timeval *tv, uint16_t index,
10436 const void *data, uint8_t size)
10438 const struct bt_hci_evt_mode_change *evt = data;
10440 print_status(evt->status);
10441 print_handle(evt->handle);
10442 print_mode(evt->mode);
10443 print_interval(evt->interval);
10446 static void return_link_keys_evt(struct timeval *tv, uint16_t index,
10447 const void *data, uint8_t size)
10449 const struct bt_hci_evt_return_link_keys *evt = data;
10452 print_field("Num keys: %d", evt->num_keys);
10454 for (i = 0; i < evt->num_keys; i++) {
10455 print_bdaddr(evt->keys + (i * 22));
10456 print_link_key(evt->keys + (i * 22) + 6);
10460 static void pin_code_request_evt(struct timeval *tv, uint16_t index,
10461 const void *data, uint8_t size)
10463 const struct bt_hci_evt_pin_code_request *evt = data;
10465 print_bdaddr(evt->bdaddr);
10468 static void link_key_request_evt(struct timeval *tv, uint16_t index,
10469 const void *data, uint8_t size)
10471 const struct bt_hci_evt_link_key_request *evt = data;
10473 print_bdaddr(evt->bdaddr);
10476 static void link_key_notify_evt(struct timeval *tv, uint16_t index,
10477 const void *data, uint8_t size)
10479 const struct bt_hci_evt_link_key_notify *evt = data;
10481 print_bdaddr(evt->bdaddr);
10482 print_link_key(evt->link_key);
10483 print_key_type(evt->key_type);
10486 static void loopback_command_evt(struct timeval *tv, uint16_t index,
10487 const void *data, uint8_t size)
10489 packet_hexdump(data, size);
10492 static void data_buffer_overflow_evt(struct timeval *tv, uint16_t index,
10493 const void *data, uint8_t size)
10495 const struct bt_hci_evt_data_buffer_overflow *evt = data;
10497 print_link_type(evt->link_type);
10500 static void max_slots_change_evt(struct timeval *tv, uint16_t index,
10501 const void *data, uint8_t size)
10503 const struct bt_hci_evt_max_slots_change *evt = data;
10505 print_handle(evt->handle);
10506 print_field("Max slots: %d", evt->max_slots);
10509 static void clock_offset_complete_evt(struct timeval *tv, uint16_t index,
10510 const void *data, uint8_t size)
10512 const struct bt_hci_evt_clock_offset_complete *evt = data;
10514 print_status(evt->status);
10515 print_handle(evt->handle);
10516 print_clock_offset(evt->clock_offset);
10519 static void conn_pkt_type_changed_evt(struct timeval *tv, uint16_t index,
10520 const void *data, uint8_t size)
10522 const struct bt_hci_evt_conn_pkt_type_changed *evt = data;
10524 print_status(evt->status);
10525 print_handle(evt->handle);
10526 print_pkt_type(evt->pkt_type);
10529 static void qos_violation_evt(struct timeval *tv, uint16_t index,
10530 const void *data, uint8_t size)
10532 const struct bt_hci_evt_qos_violation *evt = data;
10534 print_handle(evt->handle);
10537 static void pscan_mode_change_evt(struct timeval *tv, uint16_t index,
10538 const void *data, uint8_t size)
10540 const struct bt_hci_evt_pscan_mode_change *evt = data;
10542 print_bdaddr(evt->bdaddr);
10543 print_pscan_mode(evt->pscan_mode);
10546 static void pscan_rep_mode_change_evt(struct timeval *tv, uint16_t index,
10547 const void *data, uint8_t size)
10549 const struct bt_hci_evt_pscan_rep_mode_change *evt = data;
10551 print_bdaddr(evt->bdaddr);
10552 print_pscan_rep_mode(evt->pscan_rep_mode);
10555 static void flow_spec_complete_evt(struct timeval *tv, uint16_t index,
10556 const void *data, uint8_t size)
10558 const struct bt_hci_evt_flow_spec_complete *evt = data;
10560 print_status(evt->status);
10561 print_handle(evt->handle);
10562 print_field("Flags: 0x%2.2x", evt->flags);
10564 print_flow_direction(evt->direction);
10565 print_service_type(evt->service_type);
10567 print_field("Token rate: %d", le32_to_cpu(evt->token_rate));
10568 print_field("Token bucket size: %d",
10569 le32_to_cpu(evt->token_bucket_size));
10570 print_field("Peak bandwidth: %d", le32_to_cpu(evt->peak_bandwidth));
10571 print_field("Access latency: %d", le32_to_cpu(evt->access_latency));
10574 static void inquiry_result_with_rssi_evt(struct timeval *tv, uint16_t index,
10575 const void *data, uint8_t size)
10577 const struct bt_hci_evt_inquiry_result_with_rssi *evt = data;
10579 print_num_resp(evt->num_resp);
10580 print_bdaddr(evt->bdaddr);
10581 print_pscan_rep_mode(evt->pscan_rep_mode);
10582 print_pscan_period_mode(evt->pscan_period_mode);
10583 print_dev_class(evt->dev_class);
10584 print_clock_offset(evt->clock_offset);
10585 print_rssi(evt->rssi);
10587 if (size > sizeof(*evt))
10588 packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
10591 static void remote_ext_features_complete_evt(struct timeval *tv, uint16_t index,
10592 const void *data, uint8_t size)
10594 const struct bt_hci_evt_remote_ext_features_complete *evt = data;
10596 print_status(evt->status);
10597 print_handle(evt->handle);
10598 print_field("Page: %d/%d", evt->page, evt->max_page);
10599 print_features(evt->page, evt->features, 0x00);
10602 static void sync_conn_complete_evt(struct timeval *tv, uint16_t index,
10603 const void *data, uint8_t size)
10605 const struct bt_hci_evt_sync_conn_complete *evt = data;
10607 print_status(evt->status);
10608 print_handle(evt->handle);
10609 print_bdaddr(evt->bdaddr);
10610 print_link_type(evt->link_type);
10611 print_field("Transmission interval: 0x%2.2x", evt->tx_interval);
10612 print_field("Retransmission window: 0x%2.2x", evt->retrans_window);
10613 print_field("RX packet length: %d", le16_to_cpu(evt->rx_pkt_len));
10614 print_field("TX packet length: %d", le16_to_cpu(evt->tx_pkt_len));
10615 print_air_mode(evt->air_mode);
10617 if (evt->status == 0x00)
10618 assign_handle(index, le16_to_cpu(evt->handle), evt->link_type,
10619 (void *)evt->bdaddr, BDADDR_BREDR);
10622 static void sync_conn_changed_evt(struct timeval *tv, uint16_t index,
10623 const void *data, uint8_t size)
10625 const struct bt_hci_evt_sync_conn_changed *evt = data;
10627 print_status(evt->status);
10628 print_handle(evt->handle);
10629 print_field("Transmission interval: 0x%2.2x", evt->tx_interval);
10630 print_field("Retransmission window: 0x%2.2x", evt->retrans_window);
10631 print_field("RX packet length: %d", le16_to_cpu(evt->rx_pkt_len));
10632 print_field("TX packet length: %d", le16_to_cpu(evt->tx_pkt_len));
10635 static void sniff_subrating_evt(struct timeval *tv, uint16_t index,
10636 const void *data, uint8_t size)
10638 const struct bt_hci_evt_sniff_subrating *evt = data;
10640 print_status(evt->status);
10641 print_handle(evt->handle);
10642 print_slot_625("Max transmit latency", evt->max_tx_latency);
10643 print_slot_625("Max receive latency", evt->max_rx_latency);
10644 print_slot_625("Min remote timeout", evt->min_remote_timeout);
10645 print_slot_625("Min local timeout", evt->min_local_timeout);
10648 static void ext_inquiry_result_evt(struct timeval *tv, uint16_t index,
10649 const void *data, uint8_t size)
10651 const struct bt_hci_evt_ext_inquiry_result *evt = data;
10653 print_num_resp(evt->num_resp);
10654 print_bdaddr(evt->bdaddr);
10655 print_pscan_rep_mode(evt->pscan_rep_mode);
10656 print_pscan_period_mode(evt->pscan_period_mode);
10657 print_dev_class(evt->dev_class);
10658 print_clock_offset(evt->clock_offset);
10659 print_rssi(evt->rssi);
10660 print_eir(evt->data, sizeof(evt->data), false);
10663 static void encrypt_key_refresh_complete_evt(struct timeval *tv, uint16_t index,
10664 const void *data, uint8_t size)
10666 const struct bt_hci_evt_encrypt_key_refresh_complete *evt = data;
10668 print_status(evt->status);
10669 print_handle(evt->handle);
10672 static void io_capability_request_evt(struct timeval *tv, uint16_t index,
10673 const void *data, uint8_t size)
10675 const struct bt_hci_evt_io_capability_request *evt = data;
10677 print_bdaddr(evt->bdaddr);
10680 static void io_capability_response_evt(struct timeval *tv, uint16_t index,
10681 const void *data, uint8_t size)
10683 const struct bt_hci_evt_io_capability_response *evt = data;
10685 print_bdaddr(evt->bdaddr);
10686 print_io_capability(evt->capability);
10687 print_oob_data_response(evt->oob_data);
10688 print_authentication(evt->authentication);
10691 static void user_confirm_request_evt(struct timeval *tv, uint16_t index,
10692 const void *data, uint8_t size)
10694 const struct bt_hci_evt_user_confirm_request *evt = data;
10696 print_bdaddr(evt->bdaddr);
10697 print_passkey(evt->passkey);
10700 static void user_passkey_request_evt(struct timeval *tv, uint16_t index,
10701 const void *data, uint8_t size)
10703 const struct bt_hci_evt_user_passkey_request *evt = data;
10705 print_bdaddr(evt->bdaddr);
10708 static void remote_oob_data_request_evt(struct timeval *tv, uint16_t index,
10709 const void *data, uint8_t size)
10711 const struct bt_hci_evt_remote_oob_data_request *evt = data;
10713 print_bdaddr(evt->bdaddr);
10716 static void simple_pairing_complete_evt(struct timeval *tv, uint16_t index,
10717 const void *data, uint8_t size)
10719 const struct bt_hci_evt_simple_pairing_complete *evt = data;
10721 print_status(evt->status);
10722 print_bdaddr(evt->bdaddr);
10725 static void link_supv_timeout_changed_evt(struct timeval *tv, uint16_t index,
10726 const void *data, uint8_t size)
10728 const struct bt_hci_evt_link_supv_timeout_changed *evt = data;
10730 print_handle(evt->handle);
10731 print_timeout(evt->timeout);
10734 static void enhanced_flush_complete_evt(struct timeval *tv, uint16_t index,
10735 const void *data, uint8_t size)
10737 const struct bt_hci_evt_enhanced_flush_complete *evt = data;
10739 print_handle(evt->handle);
10742 static void user_passkey_notify_evt(struct timeval *tv, uint16_t index,
10743 const void *data, uint8_t size)
10745 const struct bt_hci_evt_user_passkey_notify *evt = data;
10747 print_bdaddr(evt->bdaddr);
10748 print_passkey(evt->passkey);
10751 static void keypress_notify_evt(struct timeval *tv, uint16_t index,
10752 const void *data, uint8_t size)
10754 const struct bt_hci_evt_keypress_notify *evt = data;
10757 print_bdaddr(evt->bdaddr);
10759 switch (evt->type) {
10761 str = "Passkey entry started";
10764 str = "Passkey digit entered";
10767 str = "Passkey digit erased";
10770 str = "Passkey clared";
10773 str = "Passkey entry completed";
10780 print_field("Notification type: %s (0x%2.2x)", str, evt->type);
10783 static void remote_host_features_notify_evt(struct timeval *tv, uint16_t index,
10784 const void *data, uint8_t size)
10786 const struct bt_hci_evt_remote_host_features_notify *evt = data;
10788 print_bdaddr(evt->bdaddr);
10789 print_features(1, evt->features, 0x00);
10792 static void phy_link_complete_evt(struct timeval *tv, uint16_t index,
10793 const void *data, uint8_t size)
10795 const struct bt_hci_evt_phy_link_complete *evt = data;
10797 print_status(evt->status);
10798 print_phy_handle(evt->phy_handle);
10801 static void channel_selected_evt(struct timeval *tv, uint16_t index,
10802 const void *data, uint8_t size)
10804 const struct bt_hci_evt_channel_selected *evt = data;
10806 print_phy_handle(evt->phy_handle);
10809 static void disconn_phy_link_complete_evt(struct timeval *tv, uint16_t index,
10810 const void *data, uint8_t size)
10812 const struct bt_hci_evt_disconn_phy_link_complete *evt = data;
10814 print_status(evt->status);
10815 print_phy_handle(evt->phy_handle);
10816 print_reason(evt->reason);
10819 static void phy_link_loss_early_warning_evt(struct timeval *tv, uint16_t index,
10820 const void *data, uint8_t size)
10822 const struct bt_hci_evt_phy_link_loss_early_warning *evt = data;
10825 print_phy_handle(evt->phy_handle);
10827 switch (evt->reason) {
10832 str = "Range related";
10835 str = "Bandwidth related";
10838 str = "Resolving conflict";
10841 str = "Interference";
10848 print_field("Reason: %s (0x%2.2x)", str, evt->reason);
10851 static void phy_link_recovery_evt(struct timeval *tv, uint16_t index,
10852 const void *data, uint8_t size)
10854 const struct bt_hci_evt_phy_link_recovery *evt = data;
10856 print_phy_handle(evt->phy_handle);
10859 static void logic_link_complete_evt(struct timeval *tv, uint16_t index,
10860 const void *data, uint8_t size)
10862 const struct bt_hci_evt_logic_link_complete *evt = data;
10864 print_status(evt->status);
10865 print_handle(evt->handle);
10866 print_phy_handle(evt->phy_handle);
10867 print_field("TX flow spec: 0x%2.2x", evt->flow_spec);
10870 static void disconn_logic_link_complete_evt(struct timeval *tv, uint16_t index,
10871 const void *data, uint8_t size)
10873 const struct bt_hci_evt_disconn_logic_link_complete *evt = data;
10875 print_status(evt->status);
10876 print_handle(evt->handle);
10877 print_reason(evt->reason);
10880 static void flow_spec_modify_complete_evt(struct timeval *tv, uint16_t index,
10881 const void *data, uint8_t size)
10883 const struct bt_hci_evt_flow_spec_modify_complete *evt = data;
10885 print_status(evt->status);
10886 print_handle(evt->handle);
10889 static void num_completed_data_blocks_evt(struct timeval *tv, uint16_t index,
10890 const void *data, uint8_t size)
10892 const struct bt_hci_evt_num_completed_data_blocks *evt = data;
10894 print_field("Total num data blocks: %d",
10895 le16_to_cpu(evt->total_num_blocks));
10896 print_field("Num handles: %d", evt->num_handles);
10897 print_handle(evt->handle);
10898 print_field("Num packets: %d", evt->num_packets);
10899 print_field("Num blocks: %d", evt->num_blocks);
10901 if (size > sizeof(*evt))
10902 packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
10905 static void short_range_mode_change_evt(struct timeval *tv, uint16_t index,
10906 const void *data, uint8_t size)
10908 const struct bt_hci_evt_short_range_mode_change *evt = data;
10910 print_status(evt->status);
10911 print_phy_handle(evt->phy_handle);
10912 print_enable("Short range mode", evt->mode);
10915 static void amp_status_change_evt(struct timeval *tv, uint16_t index,
10916 const void *data, uint8_t size)
10918 const struct bt_hci_evt_amp_status_change *evt = data;
10920 print_status(evt->status);
10921 print_amp_status(evt->amp_status);
10924 static void triggered_clock_capture_evt(struct timeval *tv, uint16_t index,
10925 const void *data, uint8_t size)
10927 const struct bt_hci_evt_triggered_clock_capture *evt = data;
10929 print_handle(evt->handle);
10930 print_clock_type(evt->type);
10931 print_clock(evt->clock);
10932 print_clock_offset(evt->clock_offset);
10935 static void sync_train_complete_evt(struct timeval *tv, uint16_t index,
10936 const void *data, uint8_t size)
10938 const struct bt_hci_evt_sync_train_complete *evt = data;
10940 print_status(evt->status);
10943 static void sync_train_received_evt(struct timeval *tv, uint16_t index,
10944 const void *data, uint8_t size)
10946 const struct bt_hci_evt_sync_train_received *evt = data;
10948 print_status(evt->status);
10949 print_bdaddr(evt->bdaddr);
10950 print_field("Offset: 0x%8.8x", le32_to_cpu(evt->offset));
10951 print_channel_map(evt->map);
10952 print_lt_addr(evt->lt_addr);
10953 print_field("Next broadcast instant: 0x%4.4x",
10954 le16_to_cpu(evt->instant));
10955 print_interval(evt->interval);
10956 print_field("Service Data: 0x%2.2x", evt->service_data);
10959 static void peripheral_broadcast_receive_evt(struct timeval *tv, uint16_t index,
10960 const void *data, uint8_t size)
10962 const struct bt_hci_evt_peripheral_broadcast_receive *evt = data;
10964 print_bdaddr(evt->bdaddr);
10965 print_lt_addr(evt->lt_addr);
10966 print_field("Clock: 0x%8.8x", le32_to_cpu(evt->clock));
10967 print_field("Offset: 0x%8.8x", le32_to_cpu(evt->offset));
10968 print_field("Receive status: 0x%2.2x", evt->status);
10969 print_broadcast_fragment(evt->fragment);
10970 print_field("Length: %d", evt->length);
10972 if (size - 18 != evt->length)
10973 print_text(COLOR_ERROR, "invalid data size (%d != %d)",
10974 size - 18, evt->length);
10976 if (evt->lt_addr == 0x01 && evt->length == 17)
10977 print_3d_broadcast(data + 18, size - 18);
10979 packet_hexdump(data + 18, size - 18);
10982 static void peripheral_broadcast_timeout_evt(struct timeval *tv, uint16_t index,
10983 const void *data, uint8_t size)
10985 const struct bt_hci_evt_peripheral_broadcast_timeout *evt = data;
10987 print_bdaddr(evt->bdaddr);
10988 print_lt_addr(evt->lt_addr);
10991 static void truncated_page_complete_evt(struct timeval *tv, uint16_t index,
10992 const void *data, uint8_t size)
10994 const struct bt_hci_evt_truncated_page_complete *evt = data;
10996 print_status(evt->status);
10997 print_bdaddr(evt->bdaddr);
11000 static void peripheral_page_response_timeout_evt(struct timeval *tv,
11001 uint16_t index, const void *data,
11006 static void channel_map_change_evt(struct timeval *tv, uint16_t index,
11007 const void *data, uint8_t size)
11009 const struct bt_hci_evt_channel_map_change *evt = data;
11011 print_channel_map(evt->map);
11014 static void inquiry_response_notify_evt(struct timeval *tv, uint16_t index,
11015 const void *data, uint8_t size)
11017 const struct bt_hci_evt_inquiry_response_notify *evt = data;
11019 print_iac(evt->lap);
11020 print_rssi(evt->rssi);
11023 static void auth_payload_timeout_expired_evt(struct timeval *tv, uint16_t index,
11024 const void *data, uint8_t size)
11026 const struct bt_hci_evt_auth_payload_timeout_expired *evt = data;
11028 print_handle(evt->handle);
11031 static void le_conn_complete_evt(struct timeval *tv, uint16_t index,
11032 const void *data, uint8_t size)
11034 const struct bt_hci_evt_le_conn_complete *evt = data;
11036 print_status(evt->status);
11037 print_handle(evt->handle);
11038 print_role(evt->role);
11039 print_peer_addr_type("Peer address type", evt->peer_addr_type);
11040 print_addr("Peer address", evt->peer_addr, evt->peer_addr_type);
11041 print_slot_125("Connection interval", evt->interval);
11042 print_conn_latency("Connection latency", evt->latency);
11043 print_field("Supervision timeout: %d msec (0x%4.4x)",
11044 le16_to_cpu(evt->supv_timeout) * 10,
11045 le16_to_cpu(evt->supv_timeout));
11046 print_field("Central clock accuracy: 0x%2.2x", evt->clock_accuracy);
11048 if (evt->status == 0x00)
11049 assign_handle(index, le16_to_cpu(evt->handle), 0x01,
11050 (void *)evt->peer_addr, evt->peer_addr_type);
11053 static void le_adv_report_evt(struct timeval *tv, uint16_t index,
11054 const void *data, uint8_t size)
11056 const struct bt_hci_evt_le_adv_report *evt = data;
11060 print_num_reports(evt->num_reports);
11063 print_adv_event_type("Event type", evt->event_type);
11064 print_peer_addr_type("Address type", evt->addr_type);
11065 print_addr("Address", evt->addr, evt->addr_type);
11066 print_field("Data length: %d", evt->data_len);
11067 print_eir(evt->data, evt->data_len, true);
11069 rssi = (int8_t *) (evt->data + evt->data_len);
11072 evt_len = sizeof(*evt) + evt->data_len + 1;
11074 if (size > evt_len) {
11075 data += evt_len - 1;
11076 size -= evt_len - 1;
11082 static void le_conn_update_complete_evt(struct timeval *tv, uint16_t index,
11083 const void *data, uint8_t size)
11085 const struct bt_hci_evt_le_conn_update_complete *evt = data;
11087 print_status(evt->status);
11088 print_handle(evt->handle);
11089 print_slot_125("Connection interval", evt->interval);
11090 print_conn_latency("Connection latency", evt->latency);
11091 print_field("Supervision timeout: %d msec (0x%4.4x)",
11092 le16_to_cpu(evt->supv_timeout) * 10,
11093 le16_to_cpu(evt->supv_timeout));
11096 static void le_remote_features_complete_evt(struct timeval *tv, uint16_t index,
11097 const void *data, uint8_t size)
11099 const struct bt_hci_evt_le_remote_features_complete *evt = data;
11101 print_status(evt->status);
11102 print_handle(evt->handle);
11103 print_features(0, evt->features, 0x01);
11106 static void le_long_term_key_request_evt(struct timeval *tv, uint16_t index,
11107 const void *data, uint8_t size)
11109 const struct bt_hci_evt_le_long_term_key_request *evt = data;
11111 print_handle(evt->handle);
11112 print_random_number(evt->rand);
11113 print_encrypted_diversifier(evt->ediv);
11116 static void le_conn_param_request_evt(struct timeval *tv, uint16_t index,
11117 const void *data, uint8_t size)
11119 const struct bt_hci_evt_le_conn_param_request *evt = data;
11121 print_handle(evt->handle);
11122 print_slot_125("Min connection interval", evt->min_interval);
11123 print_slot_125("Max connection interval", evt->max_interval);
11124 print_conn_latency("Connection latency", evt->latency);
11125 print_field("Supervision timeout: %d msec (0x%4.4x)",
11126 le16_to_cpu(evt->supv_timeout) * 10,
11127 le16_to_cpu(evt->supv_timeout));
11130 static void le_data_length_change_evt(struct timeval *tv, uint16_t index,
11131 const void *data, uint8_t size)
11133 const struct bt_hci_evt_le_data_length_change *evt = data;
11135 print_handle(evt->handle);
11136 print_field("Max TX octets: %d", le16_to_cpu(evt->max_tx_len));
11137 print_field("Max TX time: %d", le16_to_cpu(evt->max_tx_time));
11138 print_field("Max RX octets: %d", le16_to_cpu(evt->max_rx_len));
11139 print_field("Max RX time: %d", le16_to_cpu(evt->max_rx_time));
11142 static void le_read_local_pk256_complete_evt(struct timeval *tv, uint16_t index,
11143 const void *data, uint8_t size)
11145 const struct bt_hci_evt_le_read_local_pk256_complete *evt = data;
11147 print_status(evt->status);
11148 print_pk256("Local P-256 public key", evt->local_pk256);
11151 static void le_generate_dhkey_complete_evt(struct timeval *tv, uint16_t index,
11152 const void *data, uint8_t size)
11154 const struct bt_hci_evt_le_generate_dhkey_complete *evt = data;
11156 print_status(evt->status);
11157 print_dhkey(evt->dhkey);
11160 static void le_enhanced_conn_complete_evt(struct timeval *tv, uint16_t index,
11161 const void *data, uint8_t size)
11163 const struct bt_hci_evt_le_enhanced_conn_complete *evt = data;
11165 print_status(evt->status);
11166 print_handle(evt->handle);
11167 print_role(evt->role);
11168 print_peer_addr_type("Peer address type", evt->peer_addr_type);
11169 print_addr("Peer address", evt->peer_addr, evt->peer_addr_type);
11170 print_addr("Local resolvable private address", evt->local_rpa, 0x01);
11171 print_addr("Peer resolvable private address", evt->peer_rpa, 0x01);
11172 print_slot_125("Connection interval", evt->interval);
11173 print_conn_latency("Connection latency", evt->latency);
11174 print_field("Supervision timeout: %d msec (0x%4.4x)",
11175 le16_to_cpu(evt->supv_timeout) * 10,
11176 le16_to_cpu(evt->supv_timeout));
11177 print_field("Central clock accuracy: 0x%2.2x", evt->clock_accuracy);
11179 if (evt->status == 0x00)
11180 assign_handle(index, le16_to_cpu(evt->handle), 0x01,
11181 (void *)evt->peer_addr, evt->peer_addr_type);
11184 static void le_direct_adv_report_evt(struct timeval *tv, uint16_t index,
11185 const void *data, uint8_t size)
11187 const struct bt_hci_evt_le_direct_adv_report *evt = data;
11189 print_num_reports(evt->num_reports);
11191 print_adv_event_type("Event type", evt->event_type);
11192 print_peer_addr_type("Address type", evt->addr_type);
11193 print_addr("Address", evt->addr, evt->addr_type);
11194 print_addr_type("Direct address type", evt->direct_addr_type);
11195 print_addr("Direct address", evt->direct_addr, evt->direct_addr_type);
11196 print_rssi(evt->rssi);
11198 if (size > sizeof(*evt))
11199 packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
11202 static void le_phy_update_complete_evt(struct timeval *tv, uint16_t index,
11203 const void *data, uint8_t size)
11205 const struct bt_hci_evt_le_phy_update_complete *evt = data;
11207 print_status(evt->status);
11208 print_handle(evt->handle);
11209 print_le_phy("TX PHY", evt->tx_phy);
11210 print_le_phy("RX PHY", evt->rx_phy);
11213 static const struct bitfield_data ext_adv_report_evt_type[] = {
11214 { 0, "Connectable" },
11215 { 1, "Scannable" },
11217 { 3, "Scan response" },
11218 { 4, "Use legacy advertising PDUs" },
11222 static void print_ext_adv_report_evt_type(const char *indent, uint16_t flags)
11224 uint16_t mask = flags;
11225 uint16_t props = flags;
11226 uint8_t data_status;
11228 const char *color_on;
11231 print_field("%sEvent type: 0x%4.4x", indent, flags);
11234 print_field("%s Props: 0x%4.4x", indent, props);
11235 for (i = 0; ext_adv_report_evt_type[i].str; i++) {
11236 if (flags & (1 << ext_adv_report_evt_type[i].bit)) {
11237 print_field("%s %s", indent,
11238 ext_adv_report_evt_type[i].str);
11239 mask &= ~(1 << ext_adv_report_evt_type[i].bit);
11243 data_status = (flags >> 5) & 3;
11244 mask &= ~(data_status << 5);
11246 switch (data_status) {
11249 color_on = COLOR_GREEN;
11252 str = "Incomplete, more data to come";
11253 color_on = COLOR_YELLOW;
11256 str = "Incomplete, data truncated, no more to come";
11257 color_on = COLOR_RED;
11261 color_on = COLOR_RED;
11265 print_field("%s Data status: %s%s%s", indent, color_on, str, COLOR_OFF);
11268 print_text(COLOR_UNKNOWN_ADV_FLAG,
11269 "%s Reserved (0x%4.4x)", indent, mask);
11272 static void print_legacy_adv_report_pdu(uint16_t flags)
11276 if (!(flags & (1 << 4)))
11281 str = "ADV_NONCONN_IND";
11284 str = "ADV_SCAN_IND";
11290 str = "ADV_DIRECT_IND";
11293 str = "SCAN_RSP to an ADV_IND";
11296 str = "SCAN_RSP to an ADV_SCAN_IND";
11303 print_field(" Legacy PDU Type: %s (0x%4.4x)", str, flags);
11306 static void le_ext_adv_report_evt(struct timeval *tv, uint16_t index,
11307 const void *data, uint8_t size)
11309 const struct bt_hci_evt_le_ext_adv_report *evt = data;
11310 const struct bt_hci_le_ext_adv_report *report;
11314 print_num_reports(evt->num_reports);
11316 data += sizeof(evt->num_reports);
11318 for (i = 0; i < evt->num_reports; ++i) {
11320 print_field("Entry %d", i);
11321 print_ext_adv_report_evt_type(" ", report->event_type);
11322 print_legacy_adv_report_pdu(report->event_type);
11323 print_peer_addr_type(" Address type", report->addr_type);
11324 print_addr(" Address", report->addr, report->addr_type);
11326 switch (report->primary_phy) {
11338 print_field(" Primary PHY: %s", str);
11340 switch (report->secondary_phy) {
11342 str = "No packets";
11358 print_field(" Secondary PHY: %s", str);
11360 if (report->sid == 0xff)
11361 print_field(" SID: no ADI field (0x%2.2x)",
11363 else if (report->sid > 0x0f)
11364 print_field(" SID: Reserved (0x%2.2x)", report->sid);
11366 print_field(" SID: 0x%2.2x", report->sid);
11368 print_field(" TX power: %d dBm", report->tx_power);
11370 if (report->rssi == 127)
11371 print_field(" RSSI: not available (0x%2.2x)",
11372 (uint8_t) report->rssi);
11373 else if (report->rssi >= -127 && report->rssi <= 20)
11374 print_field(" RSSI: %d dBm (0x%2.2x)",
11375 report->rssi, (uint8_t) report->rssi);
11377 print_field(" RSSI: reserved (0x%2.2x)",
11378 (uint8_t) report->rssi);
11380 print_slot_125(" Periodic advertising interval",
11382 print_peer_addr_type(" Direct address type",
11383 report->direct_addr_type);
11384 print_addr(" Direct address", report->direct_addr,
11385 report->direct_addr_type);
11386 print_field(" Data length: 0x%2.2x", report->data_len);
11387 data += sizeof(struct bt_hci_le_ext_adv_report);
11388 packet_hexdump(data, report->data_len);
11389 print_eir(data, report->data_len, true);
11390 data += report->data_len;
11394 static void le_pa_sync_evt(struct timeval *tv, uint16_t index,
11395 const void *data, uint8_t size)
11397 const struct bt_hci_evt_le_per_sync_established *evt = data;
11399 print_status(evt->status);
11400 print_field("Sync handle: %d", evt->handle);
11401 if (evt->sid > 0x0f)
11402 print_field("Advertising SID: Reserved (0x%2.2x)", evt->sid);
11404 print_field("Advertising SID: 0x%2.2x", evt->sid);
11406 print_peer_addr_type("Advertiser address type", evt->addr_type);
11407 print_addr("Advertiser address", evt->addr, evt->addr_type);
11408 print_le_phy("Advertiser PHY", evt->phy);
11409 print_slot_125("Periodic advertising interval", evt->interval);
11410 print_field("Advertiser clock accuracy: 0x%2.2x", evt->clock_accuracy);
11413 static void le_pa_report_evt(struct timeval *tv, uint16_t index,
11414 const void *data, uint8_t size)
11416 const struct bt_hci_le_pa_report *evt = data;
11417 const char *color_on;
11420 print_field("Sync handle: %d", evt->handle);
11421 print_power_level(evt->tx_power, NULL);
11422 if (evt->rssi == 127)
11423 print_field("RSSI: not available (0x%2.2x)",
11424 (uint8_t) evt->rssi);
11425 else if (evt->rssi >= -127 && evt->rssi <= 20)
11426 print_field("RSSI: %d dBm (0x%2.2x)",
11427 evt->rssi, (uint8_t) evt->rssi);
11429 print_field("RSSI: reserved (0x%2.2x)",
11430 (uint8_t) evt->rssi);
11432 switch (evt->cte_type) {
11434 str = "AoA Constant Tone Extension";
11437 str = "AoA Constant Tone Extension with 1us slots";
11440 str = "AoD Constant Tone Extension with 2us slots";
11443 str = "No Constant Tone Extension";
11450 print_field("CTE Type: %s (0x%2x)", str, evt->cte_type);
11452 switch (evt->data_status) {
11455 color_on = COLOR_GREEN;
11458 str = "Incomplete, more data to come";
11459 color_on = COLOR_YELLOW;
11462 str = "Incomplete, data truncated, no more to come";
11463 color_on = COLOR_RED;
11467 color_on = COLOR_RED;
11471 print_field("Data status: %s%s%s", color_on, str, COLOR_OFF);
11472 print_field("Data length: 0x%2.2x", evt->data_len);
11473 packet_hexdump(evt->data, evt->data_len);
11476 static void le_pa_sync_lost_evt(struct timeval *tv, uint16_t index,
11477 const void *data, uint8_t size)
11479 const struct bt_hci_evt_le_per_sync_lost *evt = data;
11481 print_field("Sync handle: %d", evt->handle);
11484 static void le_adv_set_term_evt(struct timeval *tv, uint16_t index,
11485 const void *data, uint8_t size)
11487 const struct bt_hci_evt_le_adv_set_term *evt = data;
11489 print_status(evt->status);
11490 print_field("Handle: %d", evt->handle);
11491 print_field("Connection handle: %d", evt->conn_handle);
11492 print_field("Number of completed extended advertising events: %d",
11496 static void le_scan_req_received_evt(struct timeval *tv, uint16_t index,
11497 const void *data, uint8_t size)
11499 const struct bt_hci_evt_le_scan_req_received *evt = data;
11501 print_field("Handle: %d", evt->handle);
11502 print_peer_addr_type("Scanner address type", evt->scanner_addr_type);
11503 print_addr("Scanner address", evt->scanner_addr,
11504 evt->scanner_addr_type);
11507 static void le_chan_select_alg_evt(struct timeval *tv, uint16_t index,
11508 const void *data, uint8_t size)
11510 const struct bt_hci_evt_le_chan_select_alg *evt = data;
11513 print_handle(evt->handle);
11515 switch (evt->algorithm) {
11527 print_field("Algorithm: %s (0x%2.2x)", str, evt->algorithm);
11530 static void le_cte_request_failed_evt(struct timeval *tv, uint16_t index,
11531 const void *data, uint8_t size)
11533 const struct bt_hci_evt_le_cte_request_failed *evt = data;
11535 print_status(evt->status);
11536 print_field("Connection handle: %d", evt->handle);
11539 static void le_pa_sync_trans_rec_evt(struct timeval *tv, uint16_t index,
11540 const void *data, uint8_t size)
11542 const struct bt_hci_evt_le_pa_sync_trans_rec *evt = data;
11544 print_status(evt->status);
11545 print_field("Handle: %d", evt->handle);
11546 print_field("Connection handle: %d", evt->handle);
11547 print_field("Service data: 0x%4.4x", evt->service_data);
11548 print_field("Sync handle: %d", evt->sync_handle);
11549 print_field("SID: 0x%2.2x", evt->sid);
11550 print_peer_addr_type("Address type:", evt->addr_type);
11551 print_addr("Address:", evt->addr, evt->addr_type);
11552 print_le_phy("PHY:", evt->phy);
11553 print_field("Periodic advertising Interval: %.3f",
11554 1.25 * evt->interval);
11555 print_clock_accuracy(evt->clock_accuracy);
11558 static void le_cis_established_evt(struct timeval *tv, uint16_t index,
11559 const void *data, uint8_t size)
11561 const struct bt_hci_evt_le_cis_established *evt = data;
11563 print_status(evt->status);
11564 print_field("Connection Handle: %d", le16_to_cpu(evt->conn_handle));
11565 print_usec_interval("CIG Synchronization Delay", evt->cig_sync_delay);
11566 print_usec_interval("CIS Synchronization Delay", evt->cis_sync_delay);
11567 print_usec_interval("Central to Peripheral Latency", evt->c_latency);
11568 print_usec_interval("Peripheral to Central Latency", evt->p_latency);
11569 print_le_phy("Central to Peripheral PHY", evt->c_phy);
11570 print_le_phy("Peripheral to Central PHY", evt->p_phy);
11571 print_field("Number of Subevents: %u", evt->nse);
11572 print_field("Central to Peripheral Burst Number: %u", evt->c_bn);
11573 print_field("Peripheral to Central Burst Number: %u", evt->p_bn);
11574 print_field("Central to Peripheral Flush Timeout: %u", evt->c_ft);
11575 print_field("Peripheral to Central Flush Timeout: %u", evt->p_ft);
11576 print_field("Central to Peripheral MTU: %u", le16_to_cpu(evt->c_mtu));
11577 print_field("Peripheral to Central MTU: %u", le16_to_cpu(evt->p_mtu));
11578 print_slot_125("ISO Interval", evt->interval);
11581 assign_handle(index, le16_to_cpu(evt->conn_handle), 0x05,
11582 NULL, BDADDR_LE_PUBLIC);
11585 static void le_req_cis_evt(struct timeval *tv, uint16_t index,
11586 const void *data, uint8_t size)
11588 const struct bt_hci_evt_le_cis_req *evt = data;
11590 print_field("ACL Handle: %d", le16_to_cpu(evt->acl_handle));
11591 print_field("CIS Handle: %d", le16_to_cpu(evt->cis_handle));
11592 print_field("CIG ID: 0x%2.2x", evt->cig_id);
11593 print_field("CIS ID: 0x%2.2x", evt->cis_id);
11596 static void print_bis_handle(const void *data, int i)
11598 uint16_t handle = get_le16(data);
11600 print_field("Connection Handle #%d: %d", i, handle);
11603 static void le_big_complete_evt(struct timeval *tv, uint16_t index,
11604 const void *data, uint8_t size)
11606 const struct bt_hci_evt_le_big_complete *evt = data;
11608 print_status(evt->status);
11609 print_field("Handle: 0x%2.2x", evt->handle);
11610 print_usec_interval("BIG Synchronization Delay", evt->sync_delay);
11611 print_usec_interval("Transport Latency", evt->latency);
11612 print_le_phy("PHY", evt->phy);
11613 print_field("NSE: %u", evt->nse);
11614 print_field("BN: %u", evt->bn);
11615 print_field("PTO: %u", evt->pto);
11616 print_field("IRC: %u", evt->irc);
11617 print_field("Maximum PDU: %u", evt->max_pdu);
11618 print_slot_125("ISO Interval", evt->interval);
11619 print_list(evt->bis_handle, size, evt->num_bis,
11620 sizeof(*evt->bis_handle), print_bis_handle);
11622 if (!evt->status) {
11625 for (i = 0; i < evt->num_bis; i++)
11626 assign_handle(index, le16_to_cpu(evt->bis_handle[i]),
11627 0x05, NULL, BDADDR_LE_PUBLIC);
11631 static void le_big_terminate_evt(struct timeval *tv, uint16_t index,
11632 const void *data, uint8_t size)
11634 const struct bt_hci_evt_le_big_terminate *evt = data;
11636 print_field("BIG Handle: 0x%2.2x", evt->handle);
11637 print_reason(evt->reason);
11640 static void le_big_sync_estabilished_evt(struct timeval *tv, uint16_t index,
11641 const void *data, uint8_t size)
11643 const struct bt_hci_evt_le_big_sync_estabilished *evt = data;
11645 print_status(evt->status);
11646 print_field("BIG Handle: 0x%2.2x", evt->handle);
11647 print_usec_interval("Transport Latency", evt->latency);
11648 print_field("NSE: %u", evt->nse);
11649 print_field("BN: %u", evt->bn);
11650 print_field("PTO: %u", evt->bn);
11651 print_field("IRC: %u", evt->irc);
11652 print_field("Maximum PDU: %u", evt->max_pdu);
11653 print_slot_125("ISO Interval", evt->interval);
11654 print_list(evt->bis, size, evt->num_bis, sizeof(*evt->bis),
11657 if (!evt->status) {
11660 for (i = 0; i < evt->num_bis; i++)
11661 assign_handle(index, le16_to_cpu(evt->bis[i]),
11662 0x05, NULL, BDADDR_LE_PUBLIC);
11666 static void le_big_sync_lost_evt(struct timeval *tv, uint16_t index,
11667 const void *data, uint8_t size)
11669 const struct bt_hci_evt_le_big_sync_lost *evt = data;
11671 print_field("BIG Handle: 0x%2.2x", evt->big_handle);
11672 print_reason(evt->reason);
11675 static void le_req_sca_complete_evt(struct timeval *tv, uint16_t index,
11676 const void *data, uint8_t size)
11678 const struct bt_hci_evt_le_req_peer_sca_complete *evt = data;
11680 print_status(evt->status);
11681 print_field("Connection Handle: %d", le16_to_cpu(evt->handle));
11682 print_sca(evt->sca);
11685 static void le_big_info_evt(struct timeval *tv, uint16_t index,
11686 const void *data, uint8_t size)
11688 const struct bt_hci_evt_le_big_info_adv_report *evt = data;
11690 print_field("Sync Handle: 0x%4.4x", evt->sync_handle);
11691 print_field("Number BIS: %u", evt->num_bis);
11692 print_field("NSE: %u", evt->nse);
11693 print_slot_125("ISO Interval", evt->iso_interval);
11694 print_field("BN: %u", evt->bn);
11695 print_field("PTO: %u", evt->bn);
11696 print_field("IRC: %u", evt->irc);
11697 print_field("Maximum PDU: %u", evt->max_pdu);
11698 print_usec_interval("SDU Interval", evt->sdu_interval);
11699 print_field("Maximum SDU: %u", evt->max_sdu);
11700 print_le_phy("PHY", evt->phy);
11701 print_framing(evt->framing);
11702 print_field("Encryption: 0x%02x", evt->encryption);
11705 struct subevent_data {
11708 void (*func) (struct timeval *tv, uint16_t index, const void *data,
11714 static void print_subevent(struct timeval *tv, uint16_t index,
11715 const struct subevent_data *subevent_data,
11716 const void *data, uint8_t size)
11718 const char *subevent_color;
11720 if (subevent_data->func)
11721 subevent_color = COLOR_HCI_EVENT;
11723 subevent_color = COLOR_HCI_EVENT_UNKNOWN;
11725 print_indent(6, subevent_color, "", subevent_data->str, COLOR_OFF,
11726 " (0x%2.2x)", subevent_data->subevent);
11728 if (!subevent_data->func) {
11729 packet_hexdump(data, size);
11733 if (subevent_data->fixed) {
11734 if (size != subevent_data->size) {
11735 print_text(COLOR_ERROR, "invalid packet size");
11736 packet_hexdump(data, size);
11740 if (size < subevent_data->size) {
11741 print_text(COLOR_ERROR, "too short packet");
11742 packet_hexdump(data, size);
11747 subevent_data->func(tv, index, data, size);
11750 static const struct subevent_data le_meta_event_table[] = {
11751 { 0x01, "LE Connection Complete",
11752 le_conn_complete_evt, 18, true },
11753 { 0x02, "LE Advertising Report",
11754 le_adv_report_evt, 1, false },
11755 { 0x03, "LE Connection Update Complete",
11756 le_conn_update_complete_evt, 9, true },
11757 { 0x04, "LE Read Remote Used Features",
11758 le_remote_features_complete_evt, 11, true },
11759 { 0x05, "LE Long Term Key Request",
11760 le_long_term_key_request_evt, 12, true },
11761 { 0x06, "LE Remote Connection Parameter Request",
11762 le_conn_param_request_evt, 10, true },
11763 { 0x07, "LE Data Length Change",
11764 le_data_length_change_evt, 10, true },
11765 { 0x08, "LE Read Local P-256 Public Key Complete",
11766 le_read_local_pk256_complete_evt, 65, true },
11767 { 0x09, "LE Generate DHKey Complete",
11768 le_generate_dhkey_complete_evt, 33, true },
11769 { 0x0a, "LE Enhanced Connection Complete",
11770 le_enhanced_conn_complete_evt, 30, true },
11771 { 0x0b, "LE Direct Advertising Report",
11772 le_direct_adv_report_evt, 1, false },
11773 { 0x0c, "LE PHY Update Complete",
11774 le_phy_update_complete_evt, 5, true},
11775 { 0x0d, "LE Extended Advertising Report",
11776 le_ext_adv_report_evt, 1, false},
11777 { 0x0e, "LE Periodic Advertising Sync Established",
11778 le_pa_sync_evt, 15, true },
11779 { 0x0f, "LE Periodic Advertising Report",
11780 le_pa_report_evt, 7, false},
11781 { 0x10, "LE Periodic Advertising Sync Lost",
11782 le_pa_sync_lost_evt, 2, true},
11783 { 0x11, "LE Scan Timeout" },
11784 { 0x12, "LE Advertising Set Terminated",
11785 le_adv_set_term_evt, 5, true},
11786 { 0x13, "LE Scan Request Received",
11787 le_scan_req_received_evt, 8, true},
11788 { 0x14, "LE Channel Selection Algorithm",
11789 le_chan_select_alg_evt, 3, true},
11790 { 0x17, "LE CTE Request Failed",
11791 le_cte_request_failed_evt, 3, true},
11792 { 0x18, "LE Periodic Advertising Sync Transfer Received",
11793 le_pa_sync_trans_rec_evt, 19,
11795 { BT_HCI_EVT_LE_CIS_ESTABLISHED,
11796 "LE Connected Isochronous Stream Established",
11797 le_cis_established_evt,
11798 sizeof(struct bt_hci_evt_le_cis_established),
11800 { BT_HCI_EVT_LE_CIS_REQ, "LE Connected Isochronous Stream Request",
11802 sizeof(struct bt_hci_evt_le_cis_req),
11804 { BT_HCI_EVT_LE_BIG_COMPLETE,
11805 "LE Broadcast Isochronous Group Complete",
11806 le_big_complete_evt,
11807 sizeof(struct bt_hci_evt_le_big_complete) },
11808 { BT_HCI_EVT_LE_BIG_TERMINATE,
11809 "LE Broadcast Isochronous Group Terminate",
11810 le_big_terminate_evt,
11811 sizeof(struct bt_hci_evt_le_big_terminate) },
11812 { BT_HCI_EVT_LE_BIG_SYNC_ESTABILISHED,
11813 "LE Broadcast Isochronous Group Sync "
11814 "Estabilished", le_big_sync_estabilished_evt,
11815 sizeof(struct bt_hci_evt_le_big_sync_lost) },
11816 { BT_HCI_EVT_LE_BIG_SYNC_LOST,
11817 "LE Broadcast Isochronous Group Sync Lost",
11818 le_big_sync_lost_evt,
11819 sizeof(struct bt_hci_evt_le_big_sync_lost) },
11820 { BT_HCI_EVT_LE_REQ_PEER_SCA_COMPLETE,
11821 "LE Request Peer SCA Complete",
11822 le_req_sca_complete_evt,
11824 struct bt_hci_evt_le_req_peer_sca_complete)},
11825 { BT_HCI_EVT_LE_BIG_INFO_ADV_REPORT,
11826 "LE Broadcast Isochronous Group Info Advertising Report",
11828 sizeof(struct bt_hci_evt_le_big_info_adv_report) },
11832 static void le_meta_event_evt(struct timeval *tv, uint16_t index,
11833 const void *data, uint8_t size)
11835 uint8_t subevent = *((const uint8_t *) data);
11836 struct subevent_data unknown;
11837 const struct subevent_data *subevent_data = &unknown;
11840 unknown.subevent = subevent;
11841 unknown.str = "Unknown";
11842 unknown.func = NULL;
11844 unknown.fixed = true;
11846 for (i = 0; le_meta_event_table[i].str; i++) {
11847 if (le_meta_event_table[i].subevent == subevent) {
11848 subevent_data = &le_meta_event_table[i];
11853 print_subevent(tv, index, subevent_data, data + 1, size - 1);
11856 static void vendor_evt(struct timeval *tv, uint16_t index,
11857 const void *data, uint8_t size)
11859 struct subevent_data vendor_data;
11860 char vendor_str[150];
11862 const struct vendor_evt *vnd = current_vendor_evt(data, &consumed_size);
11865 const char *str = current_vendor_evt_str();
11868 snprintf(vendor_str, sizeof(vendor_str),
11869 "%s %s", str, vnd->str);
11870 vendor_data.str = vendor_str;
11872 vendor_data.str = vnd->str;
11873 vendor_data.subevent = vnd->evt;
11874 vendor_data.func = vnd->evt_func;
11875 vendor_data.size = vnd->evt_size;
11876 vendor_data.fixed = vnd->evt_fixed;
11878 print_subevent(tv, index, &vendor_data, data + consumed_size,
11879 size - consumed_size);
11881 uint16_t manufacturer;
11883 if (index_current < MAX_INDEX)
11884 manufacturer = index_list[index_current].manufacturer;
11886 manufacturer = fallback_manufacturer;
11888 vendor_event(manufacturer, data, size);
11892 struct event_data {
11895 void (*func) (struct timeval *tv, uint16_t index, const void *data,
11901 static const struct event_data event_table[] = {
11902 { 0x01, "Inquiry Complete",
11903 inquiry_complete_evt, 1, true },
11904 { 0x02, "Inquiry Result",
11905 inquiry_result_evt, 1, false },
11906 { 0x03, "Connect Complete",
11907 conn_complete_evt, 11, true },
11908 { 0x04, "Connect Request",
11909 conn_request_evt, 10, true },
11910 { 0x05, "Disconnect Complete",
11911 disconnect_complete_evt, 4, true },
11912 { 0x06, "Auth Complete",
11913 auth_complete_evt, 3, true },
11914 { 0x07, "Remote Name Req Complete",
11915 remote_name_request_complete_evt, 255, true },
11916 { 0x08, "Encryption Change",
11917 encrypt_change_evt, 4, true },
11918 { 0x09, "Change Connection Link Key Complete",
11919 change_conn_link_key_complete_evt, 3, true },
11920 { 0x0a, "Link Key Type Changed",
11921 link_key_type_changed_evt, 4, true },
11922 { 0x0b, "Read Remote Supported Features",
11923 remote_features_complete_evt, 11, true },
11924 { 0x0c, "Read Remote Version Complete",
11925 remote_version_complete_evt, 8, true },
11926 { 0x0d, "QoS Setup Complete",
11927 qos_setup_complete_evt, 21, true },
11928 { 0x0e, "Command Complete",
11929 cmd_complete_evt, 3, false },
11930 { 0x0f, "Command Status",
11931 cmd_status_evt, 4, true },
11932 { 0x10, "Hardware Error",
11933 hardware_error_evt, 1, true },
11934 { 0x11, "Flush Occurred",
11935 flush_occurred_evt, 2, true },
11936 { 0x12, "Role Change",
11937 role_change_evt, 8, true },
11938 { 0x13, "Number of Completed Packets",
11939 num_completed_packets_evt, 1, false },
11940 { 0x14, "Mode Change",
11941 mode_change_evt, 6, true },
11942 { 0x15, "Return Link Keys",
11943 return_link_keys_evt, 1, false },
11944 { 0x16, "PIN Code Request",
11945 pin_code_request_evt, 6, true },
11946 { 0x17, "Link Key Request",
11947 link_key_request_evt, 6, true },
11948 { 0x18, "Link Key Notification",
11949 link_key_notify_evt, 23, true },
11950 { 0x19, "Loopback Command",
11951 loopback_command_evt, 3, false },
11952 { 0x1a, "Data Buffer Overflow",
11953 data_buffer_overflow_evt, 1, true },
11954 { 0x1b, "Max Slots Change",
11955 max_slots_change_evt, 3, true },
11956 { 0x1c, "Read Clock Offset Complete",
11957 clock_offset_complete_evt, 5, true },
11958 { 0x1d, "Connection Packet Type Changed",
11959 conn_pkt_type_changed_evt, 5, true },
11960 { 0x1e, "QoS Violation",
11961 qos_violation_evt, 2, true },
11962 { 0x1f, "Page Scan Mode Change",
11963 pscan_mode_change_evt, 7, true },
11964 { 0x20, "Page Scan Repetition Mode Change",
11965 pscan_rep_mode_change_evt, 7, true },
11966 { 0x21, "Flow Specification Complete",
11967 flow_spec_complete_evt, 22, true },
11968 { 0x22, "Inquiry Result with RSSI",
11969 inquiry_result_with_rssi_evt, 1, false },
11970 { 0x23, "Read Remote Extended Features",
11971 remote_ext_features_complete_evt, 13, true },
11972 { 0x2c, "Synchronous Connect Complete",
11973 sync_conn_complete_evt, 17, true },
11974 { 0x2d, "Synchronous Connect Changed",
11975 sync_conn_changed_evt, 9, true },
11976 { 0x2e, "Sniff Subrating",
11977 sniff_subrating_evt, 11, true },
11978 { 0x2f, "Extended Inquiry Result",
11979 ext_inquiry_result_evt, 1, false },
11980 { 0x30, "Encryption Key Refresh Complete",
11981 encrypt_key_refresh_complete_evt, 3, true },
11982 { 0x31, "IO Capability Request",
11983 io_capability_request_evt, 6, true },
11984 { 0x32, "IO Capability Response",
11985 io_capability_response_evt, 9, true },
11986 { 0x33, "User Confirmation Request",
11987 user_confirm_request_evt, 10, true },
11988 { 0x34, "User Passkey Request",
11989 user_passkey_request_evt, 6, true },
11990 { 0x35, "Remote OOB Data Request",
11991 remote_oob_data_request_evt, 6, true },
11992 { 0x36, "Simple Pairing Complete",
11993 simple_pairing_complete_evt, 7, true },
11994 { 0x38, "Link Supervision Timeout Changed",
11995 link_supv_timeout_changed_evt, 4, true },
11996 { 0x39, "Enhanced Flush Complete",
11997 enhanced_flush_complete_evt, 2, true },
11998 { 0x3b, "User Passkey Notification",
11999 user_passkey_notify_evt, 10, true },
12000 { 0x3c, "Keypress Notification",
12001 keypress_notify_evt, 7, true },
12002 { 0x3d, "Remote Host Supported Features",
12003 remote_host_features_notify_evt, 14, true },
12004 { 0x3e, "LE Meta Event",
12005 le_meta_event_evt, 1, false },
12006 { 0x40, "Physical Link Complete",
12007 phy_link_complete_evt, 2, true },
12008 { 0x41, "Channel Selected",
12009 channel_selected_evt, 1, true },
12010 { 0x42, "Disconnect Physical Link Complete",
12011 disconn_phy_link_complete_evt, 3, true },
12012 { 0x43, "Physical Link Loss Early Warning",
12013 phy_link_loss_early_warning_evt, 2, true },
12014 { 0x44, "Physical Link Recovery",
12015 phy_link_recovery_evt, 1, true },
12016 { 0x45, "Logical Link Complete",
12017 logic_link_complete_evt, 5, true },
12018 { 0x46, "Disconnect Logical Link Complete",
12019 disconn_logic_link_complete_evt, 4, true },
12020 { 0x47, "Flow Specification Modify Complete",
12021 flow_spec_modify_complete_evt, 3, true },
12022 { 0x48, "Number of Completed Data Blocks",
12023 num_completed_data_blocks_evt, 3, false },
12024 { 0x49, "AMP Start Test" },
12025 { 0x4a, "AMP Test End" },
12026 { 0x4b, "AMP Receiver Report" },
12027 { 0x4c, "Short Range Mode Change Complete",
12028 short_range_mode_change_evt, 3, true },
12029 { 0x4d, "AMP Status Change",
12030 amp_status_change_evt, 2, true },
12031 { 0x4e, "Triggered Clock Capture",
12032 triggered_clock_capture_evt, 9, true },
12033 { 0x4f, "Synchronization Train Complete",
12034 sync_train_complete_evt, 1, true },
12035 { 0x50, "Synchronization Train Received",
12036 sync_train_received_evt, 29, true },
12037 { 0x51, "Connectionless Peripheral Broadcast Receive",
12038 peripheral_broadcast_receive_evt, 18, false },
12039 { 0x52, "Connectionless Peripheral Broadcast Timeout",
12040 peripheral_broadcast_timeout_evt, 7, true },
12041 { 0x53, "Truncated Page Complete",
12042 truncated_page_complete_evt, 7, true },
12043 { 0x54, "Peripheral Page Response Timeout",
12044 peripheral_page_response_timeout_evt, 0, true },
12045 { 0x55, "Connectionless Peripheral Broadcast Channel Map Change",
12046 channel_map_change_evt, 10, true },
12047 { 0x56, "Inquiry Response Notification",
12048 inquiry_response_notify_evt, 4, true },
12049 { 0x57, "Authenticated Payload Timeout Expired",
12050 auth_payload_timeout_expired_evt, 2, true },
12051 { 0x58, "SAM Status Change" },
12052 { 0xfe, "Testing" },
12053 { 0xff, "Vendor", vendor_evt, 0, false },
12057 void packet_new_index(struct timeval *tv, uint16_t index, const char *label,
12058 uint8_t type, uint8_t bus, const char *name)
12062 sprintf(details, "(%s,%s,%s)", hci_typetostr(type),
12063 hci_bustostr(bus), name);
12065 print_packet(tv, NULL, '=', index, NULL, COLOR_NEW_INDEX,
12066 "New Index", label, details);
12069 void packet_del_index(struct timeval *tv, uint16_t index, const char *label)
12071 print_packet(tv, NULL, '=', index, NULL, COLOR_DEL_INDEX,
12072 "Delete Index", label, NULL);
12075 void packet_open_index(struct timeval *tv, uint16_t index, const char *label)
12077 print_packet(tv, NULL, '=', index, NULL, COLOR_OPEN_INDEX,
12078 "Open Index", label, NULL);
12081 void packet_close_index(struct timeval *tv, uint16_t index, const char *label)
12083 print_packet(tv, NULL, '=', index, NULL, COLOR_CLOSE_INDEX,
12084 "Close Index", label, NULL);
12087 void packet_index_info(struct timeval *tv, uint16_t index, const char *label,
12088 uint16_t manufacturer)
12092 sprintf(details, "(%s)", bt_compidtostr(manufacturer));
12094 print_packet(tv, NULL, '=', index, NULL, COLOR_INDEX_INFO,
12095 "Index Info", label, details);
12098 void packet_vendor_diag(struct timeval *tv, uint16_t index,
12099 uint16_t manufacturer,
12100 const void *data, uint16_t size)
12102 char extra_str[16];
12104 sprintf(extra_str, "(len %d)", size);
12106 print_packet(tv, NULL, '=', index, NULL, COLOR_VENDOR_DIAG,
12107 "Vendor Diagnostic", NULL, extra_str);
12109 switch (manufacturer) {
12111 broadcom_lm_diag(data, size);
12114 packet_hexdump(data, size);
12119 void packet_system_note(struct timeval *tv, struct ucred *cred,
12120 uint16_t index, const void *message)
12122 print_packet(tv, cred, '=', index, NULL, COLOR_SYSTEM_NOTE,
12123 "Note", message, NULL);
12126 struct monitor_l2cap_hdr {
12129 } __attribute__((packed));
12131 static void packet_decode(struct timeval *tv, struct ucred *cred, char dir,
12132 uint16_t index, const char *color,
12133 const char *label, const void *data,
12136 const struct monitor_l2cap_hdr *hdr = data;
12138 if (size < sizeof(*hdr)) {
12139 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12140 "Malformed User Data packet", NULL, NULL);
12143 print_packet(tv, cred, dir, index, NULL, COLOR_HCI_ACLDATA, label,
12144 dir == '>' ? "User Data RX" : "User Data TX",
12147 /* Discard last byte since it just a filler */
12148 l2cap_frame(index, dir == '>', 0,
12149 le16_to_cpu(hdr->cid), le16_to_cpu(hdr->psm),
12150 data + sizeof(*hdr), size - (sizeof(*hdr) + 1));
12153 void packet_user_logging(struct timeval *tv, struct ucred *cred,
12154 uint16_t index, uint8_t priority,
12155 const char *ident, const void *data,
12161 if (priority > priority_level)
12164 switch (priority) {
12165 case BTSNOOP_PRIORITY_ERR:
12166 color = COLOR_ERROR;
12168 case BTSNOOP_PRIORITY_WARNING:
12169 color = COLOR_WARN;
12171 case BTSNOOP_PRIORITY_INFO:
12172 color = COLOR_INFO;
12174 case BTSNOOP_PRIORITY_DEBUG:
12175 color = COLOR_DEBUG;
12178 color = COLOR_WHITE_BG;
12191 if (ident && (ident[0] == '<' || ident[0] == '>')) {
12192 packet_decode(tv, cred, ident[0], index, color,
12193 label == ident ? &ident[2] : label,
12198 print_packet(tv, cred, '=', index, NULL, color, label, data, NULL);
12201 void packet_hci_command(struct timeval *tv, struct ucred *cred, uint16_t index,
12202 const void *data, uint16_t size)
12204 const hci_command_hdr *hdr = data;
12205 uint16_t opcode = le16_to_cpu(hdr->opcode);
12206 uint16_t ogf = cmd_opcode_ogf(opcode);
12207 uint16_t ocf = cmd_opcode_ocf(opcode);
12208 struct opcode_data vendor_data;
12209 const struct opcode_data *opcode_data = NULL;
12210 const char *opcode_color, *opcode_str;
12211 char extra_str[25], vendor_str[150];
12214 if (index >= MAX_INDEX) {
12215 print_field("Invalid index (%d).", index);
12219 index_list[index].frame++;
12221 if (size < HCI_COMMAND_HDR_SIZE || size > BTSNOOP_MAX_PACKET_SIZE) {
12222 sprintf(extra_str, "(len %d)", size);
12223 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12224 "Malformed HCI Command packet", NULL, extra_str);
12228 data += HCI_COMMAND_HDR_SIZE;
12229 size -= HCI_COMMAND_HDR_SIZE;
12231 for (i = 0; opcode_table[i].str; i++) {
12232 if (opcode_table[i].opcode == opcode) {
12233 opcode_data = &opcode_table[i];
12239 if (opcode_data->cmd_func)
12240 opcode_color = COLOR_HCI_COMMAND;
12242 opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
12243 opcode_str = opcode_data->str;
12246 const struct vendor_ocf *vnd = current_vendor_ocf(ocf);
12249 const char *str = current_vendor_str(ocf);
12252 snprintf(vendor_str, sizeof(vendor_str),
12253 "%s %s", str, vnd->str);
12254 vendor_data.str = vendor_str;
12256 vendor_data.str = vnd->str;
12257 vendor_data.cmd_func = vnd->cmd_func;
12258 vendor_data.cmd_size = vnd->cmd_size;
12259 vendor_data.cmd_fixed = vnd->cmd_fixed;
12261 opcode_data = &vendor_data;
12263 if (opcode_data->cmd_func)
12264 opcode_color = COLOR_HCI_COMMAND;
12266 opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
12267 opcode_str = opcode_data->str;
12269 opcode_color = COLOR_HCI_COMMAND;
12270 opcode_str = "Vendor";
12273 opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
12274 opcode_str = "Unknown";
12278 sprintf(extra_str, "(0x%2.2x|0x%4.4x) plen %d", ogf, ocf, hdr->plen);
12280 print_packet(tv, cred, '<', index, NULL, opcode_color, "HCI Command",
12281 opcode_str, extra_str);
12283 if (!opcode_data || !opcode_data->cmd_func) {
12284 packet_hexdump(data, size);
12288 if (size != hdr->plen) {
12289 print_text(COLOR_ERROR, "invalid packet size (%u != %u)", size,
12291 packet_hexdump(data, size);
12295 if (opcode_data->cmd_fixed) {
12296 if (hdr->plen != opcode_data->cmd_size) {
12297 print_text(COLOR_ERROR, "invalid packet size");
12298 packet_hexdump(data, size);
12302 if (hdr->plen < opcode_data->cmd_size) {
12303 print_text(COLOR_ERROR, "too short packet");
12304 packet_hexdump(data, size);
12309 opcode_data->cmd_func(index, data, hdr->plen);
12312 void packet_hci_event(struct timeval *tv, struct ucred *cred, uint16_t index,
12313 const void *data, uint16_t size)
12315 const hci_event_hdr *hdr = data;
12316 const struct event_data *event_data = NULL;
12317 const char *event_color, *event_str;
12318 char extra_str[25];
12321 if (index >= MAX_INDEX) {
12322 print_field("Invalid index (%d).", index);
12327 index_list[index].frame++;
12329 if (size < HCI_EVENT_HDR_SIZE) {
12330 sprintf(extra_str, "(len %d)", size);
12331 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12332 "Malformed HCI Event packet", NULL, extra_str);
12333 packet_hexdump(data, size);
12337 data += HCI_EVENT_HDR_SIZE;
12338 size -= HCI_EVENT_HDR_SIZE;
12340 for (i = 0; event_table[i].str; i++) {
12341 if (event_table[i].event == hdr->evt) {
12342 event_data = &event_table[i];
12348 if (event_data->func)
12349 event_color = COLOR_HCI_EVENT;
12351 event_color = COLOR_HCI_EVENT_UNKNOWN;
12352 event_str = event_data->str;
12354 event_color = COLOR_HCI_EVENT_UNKNOWN;
12355 event_str = "Unknown";
12358 sprintf(extra_str, "(0x%2.2x) plen %d", hdr->evt, hdr->plen);
12360 print_packet(tv, cred, '>', index, NULL, event_color, "HCI Event",
12361 event_str, extra_str);
12363 if (!event_data || !event_data->func) {
12364 packet_hexdump(data, size);
12368 if (size != hdr->plen) {
12369 print_text(COLOR_ERROR, "invalid packet size (%u != %u)", size,
12371 packet_hexdump(data, size);
12375 if (event_data->fixed) {
12376 if (hdr->plen != event_data->size) {
12377 print_text(COLOR_ERROR, "invalid packet size");
12378 packet_hexdump(data, size);
12382 if (hdr->plen < event_data->size) {
12383 print_text(COLOR_ERROR, "too short packet");
12384 packet_hexdump(data, size);
12389 event_data->func(tv, index, data, hdr->plen);
12392 static void packet_queue_tx(struct timeval *tv, uint16_t handle)
12394 struct packet_conn_data *conn;
12395 struct timeval *tx;
12397 conn = packet_get_conn_data(handle);
12402 conn->tx_q = queue_new();
12404 tx = new0(struct timeval, 1);
12405 memcpy(tx, tv, sizeof(*tv));
12406 queue_push_tail(conn->tx_q, tx);
12409 void packet_hci_acldata(struct timeval *tv, struct ucred *cred, uint16_t index,
12410 bool in, const void *data, uint16_t size)
12412 const struct bt_hci_acl_hdr *hdr = data;
12413 uint16_t handle = le16_to_cpu(hdr->handle);
12414 uint16_t dlen = le16_to_cpu(hdr->dlen);
12415 uint8_t flags = acl_flags(handle);
12416 char handle_str[16], extra_str[32];
12418 if (index >= MAX_INDEX) {
12419 print_field("Invalid index (%d).", index);
12423 index_list[index].frame++;
12425 if (size < HCI_ACL_HDR_SIZE) {
12427 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12428 "Malformed ACL Data RX packet", NULL, NULL);
12430 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12431 "Malformed ACL Data TX packet", NULL, NULL);
12432 packet_hexdump(data, size);
12436 data += HCI_ACL_HDR_SIZE;
12437 size -= HCI_ACL_HDR_SIZE;
12439 sprintf(handle_str, "Handle %d", acl_handle(handle));
12440 sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, dlen);
12442 print_packet(tv, cred, in ? '>' : '<', index, NULL, COLOR_HCI_ACLDATA,
12443 in ? "ACL Data RX" : "ACL Data TX",
12444 handle_str, extra_str);
12447 packet_queue_tx(tv, acl_handle(handle));
12449 if (size != dlen) {
12450 print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
12452 packet_hexdump(data, size);
12456 if (filter_mask & PACKET_FILTER_SHOW_ACL_DATA)
12457 packet_hexdump(data, size);
12459 l2cap_packet(index, in, acl_handle(handle), flags, data, size);
12462 void packet_hci_scodata(struct timeval *tv, struct ucred *cred, uint16_t index,
12463 bool in, const void *data, uint16_t size)
12465 const hci_sco_hdr *hdr = data;
12466 uint16_t handle = le16_to_cpu(hdr->handle);
12467 uint8_t flags = acl_flags(handle);
12468 char handle_str[16], extra_str[32];
12470 index_list[index].frame++;
12472 if (size < HCI_SCO_HDR_SIZE) {
12474 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12475 "Malformed SCO Data RX packet", NULL, NULL);
12477 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12478 "Malformed SCO Data TX packet", NULL, NULL);
12479 packet_hexdump(data, size);
12483 data += HCI_SCO_HDR_SIZE;
12484 size -= HCI_SCO_HDR_SIZE;
12486 sprintf(handle_str, "Handle %d", acl_handle(handle));
12487 sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, hdr->dlen);
12489 print_packet(tv, cred, in ? '>' : '<', index, NULL, COLOR_HCI_SCODATA,
12490 in ? "SCO Data RX" : "SCO Data TX",
12491 handle_str, extra_str);
12494 packet_queue_tx(tv, acl_handle(handle));
12496 if (size != hdr->dlen) {
12497 print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
12499 packet_hexdump(data, size);
12503 if (filter_mask & PACKET_FILTER_SHOW_SCO_DATA)
12504 packet_hexdump(data, size);
12507 void packet_hci_isodata(struct timeval *tv, struct ucred *cred, uint16_t index,
12508 bool in, const void *data, uint16_t size)
12510 const struct bt_hci_iso_hdr *hdr = data;
12511 uint16_t handle = le16_to_cpu(hdr->handle);
12512 uint8_t flags = acl_flags(handle);
12513 char handle_str[16], extra_str[32];
12515 if (index >= MAX_INDEX) {
12516 print_field("Invalid index (%d).", index);
12520 index_list[index].frame++;
12522 if (size < sizeof(*hdr)) {
12524 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12525 "Malformed ISO Data RX packet", NULL, NULL);
12527 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12528 "Malformed ISO Data TX packet", NULL, NULL);
12529 packet_hexdump(data, size);
12533 data += sizeof(*hdr);
12534 size -= sizeof(*hdr);
12536 sprintf(handle_str, "Handle %d", acl_handle(handle));
12537 sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, hdr->dlen);
12539 print_packet(tv, cred, in ? '>' : '<', index, NULL, COLOR_HCI_ISODATA,
12540 in ? "ISO Data RX" : "ISO Data TX",
12541 handle_str, extra_str);
12544 packet_queue_tx(tv, acl_handle(handle));
12546 if (size != hdr->dlen) {
12547 print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
12549 packet_hexdump(data, size);
12553 if (filter_mask & PACKET_FILTER_SHOW_ISO_DATA)
12554 packet_hexdump(data, size);
12558 void packet_ctrl_open(struct timeval *tv, struct ucred *cred, uint16_t index,
12559 const void *data, uint16_t size)
12566 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12567 "Malformed Control Open packet", NULL, NULL);
12568 packet_hexdump(data, size);
12572 cookie = get_le32(data);
12573 format = get_le16(data + 4);
12578 sprintf(channel, "0x%4.4x", cookie);
12580 if ((format == CTRL_RAW || format == CTRL_USER || format == CTRL_MGMT)
12590 version = get_u8(data);
12591 revision = get_le16(data + 1);
12592 flags = get_le32(data + 3);
12593 ident_len = get_u8(data + 7);
12598 comm = ident_len > 0 ? data : "unknown";
12603 assign_ctrl(cookie, format, comm);
12605 sprintf(details, "%sversion %u.%u",
12606 flags & 0x0001 ? "(privileged) " : "",
12607 version, revision);
12611 title = "RAW Open";
12614 title = "USER Open";
12617 title = "MGMT Open";
12620 title = "Control Open";
12624 print_packet(tv, cred, '@', index, channel, COLOR_CTRL_OPEN,
12625 title, comm, details);
12629 assign_ctrl(cookie, format, NULL);
12631 sprintf(label, "0x%4.4x", format);
12633 print_packet(tv, cred, '@', index, channel, COLOR_CTRL_OPEN,
12634 "Control Open", label, NULL);
12637 packet_hexdump(data, size);
12640 void packet_ctrl_close(struct timeval *tv, struct ucred *cred, uint16_t index,
12641 const void *data, uint16_t size)
12645 char channel[11], label[22];
12649 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
12650 "Malformed Control Close packet", NULL, NULL);
12651 packet_hexdump(data, size);
12655 cookie = get_le32(data);
12660 sprintf(channel, "0x%4.4x", cookie);
12662 release_ctrl(cookie, &format, label);
12666 title = "RAW Close";
12669 title = "USER Close";
12672 title = "MGMT Close";
12675 sprintf(label, "0x%4.4x", format);
12676 title = "Control Close";
12680 print_packet(tv, cred, '@', index, channel, COLOR_CTRL_CLOSE,
12681 title, label, NULL);
12683 packet_hexdump(data, size);
12686 static const struct {
12689 } mgmt_status_table[] = {
12690 { 0x00, "Success" },
12691 { 0x01, "Unknown Command" },
12692 { 0x02, "Not Connected" },
12693 { 0x03, "Failed" },
12694 { 0x04, "Connect Failed" },
12695 { 0x05, "Authentication Failed" },
12696 { 0x06, "Not Paired" },
12697 { 0x07, "No Resources" },
12698 { 0x08, "Timeout" },
12699 { 0x09, "Already Connected" },
12701 { 0x0b, "Rejected" },
12702 { 0x0c, "Not Supported" },
12703 { 0x0d, "Invalid Parameters" },
12704 { 0x0e, "Disconnected" },
12705 { 0x0f, "Not Powered" },
12706 { 0x10, "Cancelled" },
12707 { 0x11, "Invalid Index" },
12708 { 0x12, "RFKilled" },
12709 { 0x13, "Already Paired" },
12710 { 0x14, "Permission Denied" },
12714 static void mgmt_print_status(uint8_t status)
12716 const char *str = "Unknown";
12717 const char *color_on, *color_off;
12718 bool unknown = true;
12721 for (i = 0; mgmt_status_table[i].str; i++) {
12722 if (mgmt_status_table[i].status == status) {
12723 str = mgmt_status_table[i].str;
12732 color_on = COLOR_UNKNOWN_ERROR;
12734 color_on = COLOR_RED;
12736 color_on = COLOR_GREEN;
12737 color_off = COLOR_OFF;
12743 print_field("Status: %s%s%s (0x%2.2x)",
12744 color_on, str, color_off, status);
12747 static void mgmt_print_address(const uint8_t *address, uint8_t type)
12751 print_addr_resolve("BR/EDR Address", address, 0x00, false);
12754 print_addr_resolve("LE Address", address, 0x00, false);
12757 print_addr_resolve("LE Address", address, 0x01, false);
12760 print_addr_resolve("Address", address, 0xff, false);
12765 static const struct bitfield_data mgmt_address_type_table[] = {
12767 { 1, "LE Public" },
12768 { 2, "LE Random" },
12772 static void mgmt_print_address_type(uint8_t type)
12776 print_field("Address type: 0x%2.2x", type);
12778 mask = print_bitfield(2, type, mgmt_address_type_table);
12780 print_text(COLOR_UNKNOWN_ADDRESS_TYPE, " Unknown address type"
12781 " (0x%2.2x)", mask);
12784 static void mgmt_print_version(uint8_t version)
12786 packet_print_version("Version", version, NULL, 0x0000);
12789 static void mgmt_print_manufacturer(uint16_t manufacturer)
12791 packet_print_company("Manufacturer", manufacturer);
12794 static const struct bitfield_data mgmt_options_table[] = {
12795 { 0, "External configuration" },
12796 { 1, "Bluetooth public address configuration" },
12800 static void mgmt_print_options(const char *label, uint32_t options)
12804 print_field("%s: 0x%8.8x", label, options);
12806 mask = print_bitfield(2, options, mgmt_options_table);
12808 print_text(COLOR_UNKNOWN_OPTIONS_BIT, " Unknown options"
12809 " (0x%8.8x)", mask);
12812 static const struct bitfield_data mgmt_settings_table[] = {
12814 { 1, "Connectable" },
12815 { 2, "Fast Connectable" },
12816 { 3, "Discoverable" },
12818 { 5, "Link Security" },
12819 { 6, "Secure Simple Pairing" },
12821 { 8, "High Speed" },
12822 { 9, "Low Energy" },
12823 { 10, "Advertising" },
12824 { 11, "Secure Connections" },
12825 { 12, "Debug Keys" },
12827 { 14, "Controller Configuration"},
12828 { 15, "Static Address" },
12829 { 16, "PHY Configuration" },
12830 { 17, "Wideband Speech" },
12831 { 18, "CIS Central" },
12832 { 19, "CIS Peripheral" },
12833 { 20, "ISO Broadcaster" },
12834 { 21, "Sync Receiver" },
12838 static void mgmt_print_settings(const char *label, uint32_t settings)
12842 print_field("%s: 0x%8.8x", label, settings);
12844 mask = print_bitfield(2, settings, mgmt_settings_table);
12846 print_text(COLOR_UNKNOWN_SETTINGS_BIT, " Unknown settings"
12847 " (0x%8.8x)", mask);
12850 static void mgmt_print_name(const void *data)
12852 print_field("Name: %s", (char *) data);
12853 print_field("Short name: %s", (char *) (data + 249));
12856 static void mgmt_print_io_capability(uint8_t capability)
12860 switch (capability) {
12862 str = "DisplayOnly";
12865 str = "DisplayYesNo";
12868 str = "KeyboardOnly";
12871 str = "NoInputNoOutput";
12874 str = "KeyboardDisplay";
12881 print_field("Capability: %s (0x%2.2x)", str, capability);
12884 static const struct bitfield_data mgmt_device_flags_table[] = {
12885 { 0, "Confirm Name" },
12886 { 1, "Legacy Pairing" },
12887 { 2, "Not Connectable" },
12888 { 3, "Connection Locally Initiated" },
12889 { 4, "Name Request Failed" },
12890 { 5, "Scan Response" },
12894 static void mgmt_print_device_flags(uint32_t flags)
12898 print_field("Flags: 0x%8.8x", flags);
12900 mask = print_bitfield(2, flags, mgmt_device_flags_table);
12902 print_text(COLOR_UNKNOWN_DEVICE_FLAG, " Unknown device flag"
12903 " (0x%8.8x)", mask);
12906 static void mgmt_print_device_action(uint8_t action)
12912 str = "Background scan for device";
12915 str = "Allow incoming connection";
12918 str = "Auto-connect remote device";
12925 print_field("Action: %s (0x%2.2x)", str, action);
12928 static const struct bitfield_data mgmt_adv_flags_table[] = {
12929 { 0, "Switch into Connectable mode" },
12930 { 1, "Advertise as Discoverable" },
12931 { 2, "Advertise as Limited Discoverable" },
12932 { 3, "Add Flags field to Advertising Data" },
12933 { 4, "Add TX Power field to Advertising Data" },
12934 { 5, "Add Appearance field to Scan Response" },
12935 { 6, "Add Local Name in Scan Response" },
12936 { 7, "Advertise in 1M on Secondary channel" },
12937 { 8, "Advertise in 2M on Secondary channel" },
12938 { 9, "Advertise in CODED on Secondary channel" },
12939 { 10, "Support setting Tx Power" },
12940 { 11, "Support HW offload" },
12941 { 12, "Use provided duration parameter" },
12942 { 13, "Use provided timeout parameter" },
12943 { 14, "Use provided interval parameters" },
12944 { 15, "Use provided tx power parameter" },
12945 { 16, "Contain Scan Response Data" },
12948 #define MGMT_ADV_PARAM_DURATION (1 << 12)
12949 #define MGMT_ADV_PARAM_TIMEOUT (1 << 13)
12950 #define MGMT_ADV_PARAM_INTERVALS (1 << 14)
12951 #define MGMT_ADV_PARAM_TX_POWER (1 << 15)
12953 static void mgmt_print_adv_flags(uint32_t flags)
12957 print_field("Flags: 0x%8.8x", flags);
12959 mask = print_bitfield(2, flags, mgmt_adv_flags_table);
12961 print_text(COLOR_UNKNOWN_ADV_FLAG, " Unknown advertising flag"
12962 " (0x%8.8x)", mask);
12965 static void mgmt_print_store_hint(uint8_t hint)
12981 print_field("Store hint: %s (0x%2.2x)", str, hint);
12984 static void mgmt_print_connection_parameter(const void *data)
12986 uint8_t address_type = get_u8(data + 6);
12987 uint16_t min_conn_interval = get_le16(data + 7);
12988 uint16_t max_conn_interval = get_le16(data + 9);
12989 uint16_t conn_latency = get_le16(data + 11);
12990 uint16_t supv_timeout = get_le16(data + 13);
12992 mgmt_print_address(data, address_type);
12993 print_field("Min connection interval: %u", min_conn_interval);
12994 print_field("Max connection interval: %u", max_conn_interval);
12995 print_conn_latency("Connection latency", conn_latency);
12996 print_field("Supervision timeout: %u", supv_timeout);
12999 static void mgmt_print_link_key(const void *data)
13001 uint8_t address_type = get_u8(data + 6);
13002 uint8_t key_type = get_u8(data + 7);
13003 uint8_t pin_len = get_u8(data + 24);
13005 mgmt_print_address(data, address_type);
13006 print_key_type(key_type);
13007 print_link_key(data + 8);
13008 print_field("PIN length: %d", pin_len);
13011 static void mgmt_print_long_term_key(const void *data)
13013 uint8_t address_type = get_u8(data + 6);
13014 uint8_t key_type = get_u8(data + 7);
13015 uint8_t central = get_u8(data + 8);
13016 uint8_t enc_size = get_u8(data + 9);
13019 mgmt_print_address(data, address_type);
13021 switch (key_type) {
13023 str = "Unauthenticated legacy key";
13026 str = "Authenticated legacy key";
13029 str = "Unauthenticated key from P-256";
13032 str = "Authenticated key from P-256";
13035 str = "Debug key from P-256";
13042 print_field("Key type: %s (0x%2.2x)", str, key_type);
13043 print_field("Central: 0x%2.2x", central);
13044 print_field("Encryption size: %u", enc_size);
13045 print_hex_field("Diversifier", data + 10, 2);
13046 print_hex_field("Randomizer", data + 12, 8);
13047 print_hex_field("Key", data + 20, 16);
13050 static void mgmt_print_identity_resolving_key(const void *data)
13052 uint8_t address_type = get_u8(data + 6);
13054 mgmt_print_address(data, address_type);
13055 print_hex_field("Key", data + 7, 16);
13056 keys_add_identity(data, address_type, data + 7);
13059 static void mgmt_print_signature_resolving_key(const void *data)
13061 uint8_t address_type = get_u8(data + 6);
13062 uint8_t key_type = get_u8(data + 7);
13065 mgmt_print_address(data, address_type);
13067 switch (key_type) {
13069 str = "Unauthenticated local CSRK";
13072 str = "Unauthenticated remote CSRK";
13075 str = "Authenticated local CSRK";
13078 str = "Authenticated remote CSRK";
13085 print_field("Key type: %s (0x%2.2x)", str, key_type);
13086 print_hex_field("Key", data + 8, 16);
13089 static void mgmt_print_oob_data(const void *data)
13091 print_hash_p192(data);
13092 print_randomizer_p192(data + 16);
13093 print_hash_p256(data + 32);
13094 print_randomizer_p256(data + 48);
13097 static const struct bitfield_data mgmt_exp_feature_flags_table[] = {
13099 { 1, "Settings change" },
13103 static void mgmt_print_exp_feature(const void *data)
13105 uint32_t flags = get_le32(data + 16);
13108 print_field("UUID: %s", bt_uuid128_to_str(data));
13109 print_field("Flags: 0x%8.8x", flags);
13111 mask = print_bitfield(2, flags, mgmt_exp_feature_flags_table);
13113 print_text(COLOR_UNKNOWN_EXP_FEATURE_FLAG,
13114 " Unknown feature flag (0x%8.8x)", mask);
13117 static void mgmt_null_cmd(const void *data, uint16_t size)
13121 static void mgmt_null_rsp(const void *data, uint16_t size)
13125 static void mgmt_read_version_info_rsp(const void *data, uint16_t size)
13130 version = get_u8(data);
13131 revision = get_le16(data + 1);
13133 print_field("Version: %u.%u", version, revision);
13136 static void mgmt_print_commands(const void *data, uint16_t num);
13137 static void mgmt_print_events(const void *data, uint16_t num);
13139 static void mgmt_read_supported_commands_rsp(const void *data, uint16_t size)
13141 uint16_t num_commands = get_le16(data);
13142 uint16_t num_events = get_le16(data + 2);
13144 if (size - 4 != (num_commands * 2) + (num_events *2)) {
13145 packet_hexdump(data, size);
13149 mgmt_print_commands(data + 4, num_commands);
13150 mgmt_print_events(data + 4 + num_commands * 2, num_events);
13153 static void mgmt_read_index_list_rsp(const void *data, uint16_t size)
13155 uint16_t num_controllers = get_le16(data);
13158 print_field("Controllers: %u", num_controllers);
13160 if (size - 2 != num_controllers * 2) {
13161 packet_hexdump(data + 2, size - 2);
13165 for (i = 0; i < num_controllers; i++) {
13166 uint16_t index = get_le16(data + 2 + (i * 2));
13168 print_field(" hci%u", index);
13172 static void mgmt_read_controller_info_rsp(const void *data, uint16_t size)
13174 uint8_t version = get_u8(data + 6);
13175 uint16_t manufacturer = get_le16(data + 7);
13176 uint32_t supported_settings = get_le32(data + 9);
13177 uint32_t current_settings = get_le32(data + 13);
13179 print_addr_resolve("Address", data, 0x00, false);
13180 mgmt_print_version(version);
13181 mgmt_print_manufacturer(manufacturer);
13182 mgmt_print_settings("Supported settings", supported_settings);
13183 mgmt_print_settings("Current settings", current_settings);
13184 print_dev_class(data + 17);
13185 mgmt_print_name(data + 20);
13188 static void mgmt_set_powered_cmd(const void *data, uint16_t size)
13190 uint8_t enable = get_u8(data);
13192 print_enable("Powered", enable);
13195 static void mgmt_set_discoverable_cmd(const void *data, uint16_t size)
13197 uint8_t enable = get_u8(data);
13198 uint16_t timeout = get_le16(data + 1);
13216 print_field("Discoverable: %s (0x%2.2x)", str, enable);
13217 print_field("Timeout: %u", timeout);
13220 static void mgmt_set_connectable_cmd(const void *data, uint16_t size)
13222 uint8_t enable = get_u8(data);
13224 print_enable("Connectable", enable);
13227 static void mgmt_set_fast_connectable_cmd(const void *data, uint16_t size)
13229 uint8_t enable = get_u8(data);
13231 print_enable("Fast Connectable", enable);
13234 static void mgmt_set_bondable_cmd(const void *data, uint16_t size)
13236 uint8_t enable = get_u8(data);
13238 print_enable("Bondable", enable);
13241 static void mgmt_set_link_security_cmd(const void *data, uint16_t size)
13243 uint8_t enable = get_u8(data);
13245 print_enable("Link Security", enable);
13248 static void mgmt_set_secure_simple_pairing_cmd(const void *data, uint16_t size)
13250 uint8_t enable = get_u8(data);
13252 print_enable("Secure Simple Pairing", enable);
13255 static void mgmt_set_high_speed_cmd(const void *data, uint16_t size)
13257 uint8_t enable = get_u8(data);
13259 print_enable("High Speed", enable);
13262 static void mgmt_set_low_energy_cmd(const void *data, uint16_t size)
13264 uint8_t enable = get_u8(data);
13266 print_enable("Low Energy", enable);
13269 static void mgmt_new_settings_rsp(const void *data, uint16_t size)
13271 uint32_t current_settings = get_le32(data);
13273 mgmt_print_settings("Current settings", current_settings);
13276 static void mgmt_set_device_class_cmd(const void *data, uint16_t size)
13278 uint8_t major = get_u8(data);
13279 uint8_t minor = get_u8(data + 1);
13281 print_field("Major class: 0x%2.2x", major);
13282 print_field("Minor class: 0x%2.2x", minor);
13285 static void mgmt_set_device_class_rsp(const void *data, uint16_t size)
13287 print_dev_class(data);
13290 static void mgmt_set_local_name_cmd(const void *data, uint16_t size)
13292 mgmt_print_name(data);
13295 static void mgmt_set_local_name_rsp(const void *data, uint16_t size)
13297 mgmt_print_name(data);
13300 static void mgmt_add_uuid_cmd(const void *data, uint16_t size)
13302 uint8_t service_class = get_u8(data + 16);
13304 print_field("UUID: %s", bt_uuid128_to_str(data));
13305 print_field("Service class: 0x%2.2x", service_class);
13308 static void mgmt_add_uuid_rsp(const void *data, uint16_t size)
13310 print_dev_class(data);
13313 static void mgmt_remove_uuid_cmd(const void *data, uint16_t size)
13315 print_field("UUID: %s", bt_uuid128_to_str(data));
13318 static void mgmt_remove_uuid_rsp(const void *data, uint16_t size)
13320 print_dev_class(data);
13323 static void mgmt_load_link_keys_cmd(const void *data, uint16_t size)
13325 uint8_t debug_keys = get_u8(data);
13326 uint16_t num_keys = get_le16(data + 1);
13329 print_enable("Debug keys", debug_keys);
13330 print_field("Keys: %u", num_keys);
13332 if (size - 3 != num_keys * 25) {
13333 packet_hexdump(data + 3, size - 3);
13337 for (i = 0; i < num_keys; i++)
13338 mgmt_print_link_key(data + 3 + (i * 25));
13341 static void mgmt_load_long_term_keys_cmd(const void *data, uint16_t size)
13343 uint16_t num_keys = get_le16(data);
13346 print_field("Keys: %u", num_keys);
13348 if (size - 2 != num_keys * 36) {
13349 packet_hexdump(data + 2, size - 2);
13353 for (i = 0; i < num_keys; i++)
13354 mgmt_print_long_term_key(data + 2 + (i * 36));
13357 static void mgmt_disconnect_cmd(const void *data, uint16_t size)
13359 uint8_t address_type = get_u8(data + 6);
13361 mgmt_print_address(data, address_type);
13364 static void mgmt_disconnect_rsp(const void *data, uint16_t size)
13366 uint8_t address_type = get_u8(data + 6);
13368 mgmt_print_address(data, address_type);
13371 static void mgmt_get_connections_rsp(const void *data, uint16_t size)
13373 uint16_t num_connections = get_le16(data);
13376 print_field("Connections: %u", num_connections);
13378 if (size - 2 != num_connections * 7) {
13379 packet_hexdump(data + 2, size - 2);
13383 for (i = 0; i < num_connections; i++) {
13384 uint8_t address_type = get_u8(data + 2 + (i * 7) + 6);
13386 mgmt_print_address(data + 2 + (i * 7), address_type);
13390 static void mgmt_pin_code_reply_cmd(const void *data, uint16_t size)
13392 uint8_t address_type = get_u8(data + 6);
13393 uint8_t pin_len = get_u8(data + 7);
13395 mgmt_print_address(data, address_type);
13396 print_field("PIN length: %u", pin_len);
13397 print_hex_field("PIN code", data + 8, 16);
13400 static void mgmt_pin_code_reply_rsp(const void *data, uint16_t size)
13402 uint8_t address_type = get_u8(data + 6);
13404 mgmt_print_address(data, address_type);
13407 static void mgmt_pin_code_neg_reply_cmd(const void *data, uint16_t size)
13409 uint8_t address_type = get_u8(data + 6);
13411 mgmt_print_address(data, address_type);
13414 static void mgmt_pin_code_neg_reply_rsp(const void *data, uint16_t size)
13416 uint8_t address_type = get_u8(data + 6);
13418 mgmt_print_address(data, address_type);
13421 static void mgmt_set_io_capability_cmd(const void *data, uint16_t size)
13423 uint8_t capability = get_u8(data);
13425 mgmt_print_io_capability(capability);
13428 static void mgmt_pair_device_cmd(const void *data, uint16_t size)
13430 uint8_t address_type = get_u8(data + 6);
13431 uint8_t capability = get_u8(data + 7);
13433 mgmt_print_address(data, address_type);
13434 mgmt_print_io_capability(capability);
13437 static void mgmt_pair_device_rsp(const void *data, uint16_t size)
13439 uint8_t address_type = get_u8(data + 6);
13441 mgmt_print_address(data, address_type);
13444 static void mgmt_cancel_pair_device_cmd(const void *data, uint16_t size)
13446 uint8_t address_type = get_u8(data + 6);
13448 mgmt_print_address(data, address_type);
13451 static void mgmt_cancel_pair_device_rsp(const void *data, uint16_t size)
13453 uint8_t address_type = get_u8(data + 6);
13455 mgmt_print_address(data, address_type);
13458 static void mgmt_unpair_device_cmd(const void *data, uint16_t size)
13460 uint8_t address_type = get_u8(data + 6);
13461 uint8_t disconnect = get_u8(data + 7);
13463 mgmt_print_address(data, address_type);
13464 print_enable("Disconnect", disconnect);
13467 static void mgmt_unpair_device_rsp(const void *data, uint16_t size)
13469 uint8_t address_type = get_u8(data + 6);
13471 mgmt_print_address(data, address_type);
13474 static void mgmt_user_confirmation_reply_cmd(const void *data, uint16_t size)
13476 uint8_t address_type = get_u8(data + 6);
13478 mgmt_print_address(data, address_type);
13481 static void mgmt_user_confirmation_reply_rsp(const void *data, uint16_t size)
13483 uint8_t address_type = get_u8(data + 6);
13485 mgmt_print_address(data, address_type);
13488 static void mgmt_user_confirmation_neg_reply_cmd(const void *data, uint16_t size)
13490 uint8_t address_type = get_u8(data + 6);
13492 mgmt_print_address(data, address_type);
13495 static void mgmt_user_confirmation_neg_reply_rsp(const void *data, uint16_t size)
13497 uint8_t address_type = get_u8(data + 6);
13499 mgmt_print_address(data, address_type);
13502 static void mgmt_user_passkey_reply_cmd(const void *data, uint16_t size)
13504 uint8_t address_type = get_u8(data + 6);
13505 uint32_t passkey = get_le32(data + 7);
13507 mgmt_print_address(data, address_type);
13508 print_field("Passkey: 0x%4.4x", passkey);
13511 static void mgmt_user_passkey_reply_rsp(const void *data, uint16_t size)
13513 uint8_t address_type = get_u8(data + 6);
13515 mgmt_print_address(data, address_type);
13518 static void mgmt_user_passkey_neg_reply_cmd(const void *data, uint16_t size)
13520 uint8_t address_type = get_u8(data + 6);
13522 mgmt_print_address(data, address_type);
13525 static void mgmt_user_passkey_neg_reply_rsp(const void *data, uint16_t size)
13527 uint8_t address_type = get_u8(data + 6);
13529 mgmt_print_address(data, address_type);
13532 static void mgmt_read_local_oob_data_rsp(const void *data, uint16_t size)
13534 mgmt_print_oob_data(data);
13537 static void mgmt_add_remote_oob_data_cmd(const void *data, uint16_t size)
13539 uint8_t address_type = get_u8(data + 6);
13541 mgmt_print_address(data, address_type);
13542 mgmt_print_oob_data(data + 7);
13545 static void mgmt_add_remote_oob_data_rsp(const void *data, uint16_t size)
13547 uint8_t address_type = get_u8(data + 6);
13549 mgmt_print_address(data, address_type);
13552 static void mgmt_remove_remote_oob_data_cmd(const void *data, uint16_t size)
13554 uint8_t address_type = get_u8(data + 6);
13556 mgmt_print_address(data, address_type);
13559 static void mgmt_remove_remote_oob_data_rsp(const void *data, uint16_t size)
13561 uint8_t address_type = get_u8(data + 6);
13563 mgmt_print_address(data, address_type);
13566 static void mgmt_start_discovery_cmd(const void *data, uint16_t size)
13568 uint8_t type = get_u8(data);
13570 mgmt_print_address_type(type);
13573 static void mgmt_start_discovery_rsp(const void *data, uint16_t size)
13575 uint8_t type = get_u8(data);
13577 mgmt_print_address_type(type);
13580 static void mgmt_stop_discovery_cmd(const void *data, uint16_t size)
13582 uint8_t type = get_u8(data);
13584 mgmt_print_address_type(type);
13587 static void mgmt_stop_discovery_rsp(const void *data, uint16_t size)
13589 uint8_t type = get_u8(data);
13591 mgmt_print_address_type(type);
13594 static void mgmt_confirm_name_cmd(const void *data, uint16_t size)
13596 uint8_t address_type = get_u8(data + 6);
13597 uint8_t name_known = get_u8(data + 7);
13600 mgmt_print_address(data, address_type);
13602 switch (name_known) {
13614 print_field("Name known: %s (0x%2.2x)", str, name_known);
13617 static void mgmt_confirm_name_rsp(const void *data, uint16_t size)
13619 uint8_t address_type = get_u8(data + 6);
13621 mgmt_print_address(data, address_type);
13624 static void mgmt_block_device_cmd(const void *data, uint16_t size)
13626 uint8_t address_type = get_u8(data + 6);
13628 mgmt_print_address(data, address_type);
13631 static void mgmt_block_device_rsp(const void *data, uint16_t size)
13633 uint8_t address_type = get_u8(data + 6);
13635 mgmt_print_address(data, address_type);
13638 static void mgmt_unblock_device_cmd(const void *data, uint16_t size)
13640 uint8_t address_type = get_u8(data + 6);
13642 mgmt_print_address(data, address_type);
13645 static void mgmt_unblock_device_rsp(const void *data, uint16_t size)
13647 uint8_t address_type = get_u8(data + 6);
13649 mgmt_print_address(data, address_type);
13652 static void mgmt_set_device_id_cmd(const void *data, uint16_t size)
13654 print_device_id(data, size);
13657 static void mgmt_set_advertising_cmd(const void *data, uint16_t size)
13659 uint8_t enable = get_u8(data);
13670 str = "Connectable";
13677 print_field("Advertising: %s (0x%2.2x)", str, enable);
13680 static void mgmt_set_bredr_cmd(const void *data, uint16_t size)
13682 uint8_t enable = get_u8(data);
13684 print_enable("BR/EDR", enable);
13687 static void mgmt_set_static_address_cmd(const void *data, uint16_t size)
13689 print_addr_resolve("Address", data, 0x01, false);
13692 static void mgmt_set_scan_parameters_cmd(const void *data, uint16_t size)
13694 uint16_t interval = get_le16(data);
13695 uint16_t window = get_le16(data + 2);
13697 print_field("Interval: %u (0x%2.2x)", interval, interval);
13698 print_field("Window: %u (0x%2.2x)", window, window);
13701 static void mgmt_set_secure_connections_cmd(const void *data, uint16_t size)
13703 uint8_t enable = get_u8(data);
13721 print_field("Secure Connections: %s (0x%2.2x)", str, enable);
13724 static void mgmt_set_debug_keys_cmd(const void *data, uint16_t size)
13726 uint8_t enable = get_u8(data);
13744 print_field("Debug Keys: %s (0x%2.2x)", str, enable);
13747 static void mgmt_set_privacy_cmd(const void *data, uint16_t size)
13749 uint8_t enable = get_u8(data);
13767 print_field("Privacy: %s (0x%2.2x)", str, enable);
13768 print_hex_field("Key", data + 1, 16);
13771 static void mgmt_load_identity_resolving_keys_cmd(const void *data, uint16_t size)
13773 uint16_t num_keys = get_le16(data);
13776 print_field("Keys: %u", num_keys);
13778 if (size - 2 != num_keys * 23) {
13779 packet_hexdump(data + 2, size - 2);
13783 for (i = 0; i < num_keys; i++)
13784 mgmt_print_identity_resolving_key(data + 2 + (i * 23));
13787 static void mgmt_get_connection_information_cmd(const void *data, uint16_t size)
13789 uint8_t address_type = get_u8(data + 6);
13791 mgmt_print_address(data, address_type);
13794 static void mgmt_get_connection_information_rsp(const void *data, uint16_t size)
13796 uint8_t address_type = get_u8(data + 6);
13797 int8_t rssi = get_s8(data + 7);
13798 int8_t tx_power = get_s8(data + 8);
13799 int8_t max_tx_power = get_s8(data + 9);
13801 mgmt_print_address(data, address_type);
13803 print_power_level(tx_power, NULL);
13804 print_power_level(max_tx_power, "max");
13807 static void mgmt_get_clock_information_cmd(const void *data, uint16_t size)
13809 uint8_t address_type = get_u8(data + 6);
13811 mgmt_print_address(data, address_type);
13814 static void mgmt_get_clock_information_rsp(const void *data, uint16_t size)
13816 uint8_t address_type = get_u8(data + 6);
13817 uint32_t local_clock = get_le32(data + 7);
13818 uint32_t piconet_clock = get_le32(data + 11);
13819 uint16_t accuracy = get_le16(data + 15);
13821 mgmt_print_address(data, address_type);
13822 print_field("Local clock: 0x%8.8x", local_clock);
13823 print_field("Piconet clock: 0x%8.8x", piconet_clock);
13824 print_field("Accuracy: 0x%4.4x", accuracy);
13827 static void mgmt_add_device_cmd(const void *data, uint16_t size)
13829 uint8_t address_type = get_u8(data + 6);
13830 uint8_t action = get_u8(data + 7);
13832 mgmt_print_address(data, address_type);
13833 mgmt_print_device_action(action);
13836 static void mgmt_add_device_rsp(const void *data, uint16_t size)
13838 uint8_t address_type = get_u8(data + 6);
13840 mgmt_print_address(data, address_type);
13843 static void mgmt_remove_device_cmd(const void *data, uint16_t size)
13845 uint8_t address_type = get_u8(data + 6);
13847 mgmt_print_address(data, address_type);
13850 static void mgmt_remove_device_rsp(const void *data, uint16_t size)
13852 uint8_t address_type = get_u8(data + 6);
13854 mgmt_print_address(data, address_type);
13857 static void mgmt_load_connection_parameters_cmd(const void *data, uint16_t size)
13859 uint16_t num_parameters = get_le16(data);
13862 print_field("Parameters: %u", num_parameters);
13864 if (size - 2 != num_parameters * 15) {
13865 packet_hexdump(data + 2, size - 2);
13869 for (i = 0; i < num_parameters; i++)
13870 mgmt_print_connection_parameter(data + 2 + (i * 15));
13873 static void mgmt_read_unconf_index_list_rsp(const void *data, uint16_t size)
13875 uint16_t num_controllers = get_le16(data);
13878 print_field("Controllers: %u", num_controllers);
13880 if (size - 2 != num_controllers * 2) {
13881 packet_hexdump(data + 2, size - 2);
13885 for (i = 0; i < num_controllers; i++) {
13886 uint16_t index = get_le16(data + 2 + (i * 2));
13888 print_field(" hci%u", index);
13892 static void mgmt_read_controller_conf_info_rsp(const void *data, uint16_t size)
13894 uint16_t manufacturer = get_le16(data);
13895 uint32_t supported_options = get_le32(data + 2);
13896 uint32_t missing_options = get_le32(data + 6);
13898 mgmt_print_manufacturer(manufacturer);
13899 mgmt_print_options("Supported options", supported_options);
13900 mgmt_print_options("Missing options", missing_options);
13903 static void mgmt_set_external_configuration_cmd(const void *data, uint16_t size)
13905 uint8_t enable = get_u8(data);
13907 print_enable("Configuration", enable);
13910 static void mgmt_set_public_address_cmd(const void *data, uint16_t size)
13912 print_addr_resolve("Address", data, 0x00, false);
13915 static void mgmt_new_options_rsp(const void *data, uint16_t size)
13917 uint32_t missing_options = get_le32(data);
13919 mgmt_print_options("Missing options", missing_options);
13922 static void mgmt_start_service_discovery_cmd(const void *data, uint16_t size)
13924 uint8_t type = get_u8(data);
13925 int8_t rssi = get_s8(data + 1);
13926 uint16_t num_uuids = get_le16(data + 2);
13929 mgmt_print_address_type(type);
13931 print_field("UUIDs: %u", num_uuids);
13933 if (size - 4 != num_uuids * 16) {
13934 packet_hexdump(data + 4, size - 4);
13938 for (i = 0; i < num_uuids; i++)
13939 print_field("UUID: %s", bt_uuid128_to_str(data + 4 + (i * 16)));
13942 static void mgmt_start_service_discovery_rsp(const void *data, uint16_t size)
13944 uint8_t type = get_u8(data);
13946 mgmt_print_address_type(type);
13949 static void mgmt_read_ext_index_list_rsp(const void *data, uint16_t size)
13951 uint16_t num_controllers = get_le16(data);
13954 print_field("Controllers: %u", num_controllers);
13956 if (size - 2 != num_controllers * 4) {
13957 packet_hexdump(data + 2, size - 2);
13961 for (i = 0; i < num_controllers; i++) {
13962 uint16_t index = get_le16(data + 2 + (i * 4));
13963 uint8_t type = get_u8(data + 4 + (i * 4));
13964 uint8_t bus = get_u8(data + 5 + (i * 4));
13972 str = "Unconfigured";
13982 print_field(" hci%u (%s,%s)", index, str, hci_bustostr(bus));
13986 static void mgmt_read_local_oob_ext_data_cmd(const void *data, uint16_t size)
13988 uint8_t type = get_u8(data);
13990 mgmt_print_address_type(type);
13993 static void mgmt_read_local_oob_ext_data_rsp(const void *data, uint16_t size)
13995 uint8_t type = get_u8(data);
13996 uint16_t data_len = get_le16(data + 1);
13998 mgmt_print_address_type(type);
13999 print_field("Data length: %u", data_len);
14000 print_eir(data + 3, size - 3, true);
14003 static void mgmt_read_advertising_features_rsp(const void *data, uint16_t size)
14005 uint32_t flags = get_le32(data);
14006 uint8_t adv_data_len = get_u8(data + 4);
14007 uint8_t scan_rsp_len = get_u8(data + 5);
14008 uint8_t max_instances = get_u8(data + 6);
14009 uint8_t num_instances = get_u8(data + 7);
14012 mgmt_print_adv_flags(flags);
14013 print_field("Advertising data length: %u", adv_data_len);
14014 print_field("Scan response length: %u", scan_rsp_len);
14015 print_field("Max instances: %u", max_instances);
14016 print_field("Instances: %u", num_instances);
14018 if (size - 8 != num_instances) {
14019 packet_hexdump(data + 8, size - 8);
14023 for (i = 0; i < num_instances; i++) {
14024 uint8_t instance = get_u8(data + 8 + i);
14026 print_field(" %u", instance);
14030 static void mgmt_add_advertising_cmd(const void *data, uint16_t size)
14032 uint8_t instance = get_u8(data);
14033 uint32_t flags = get_le32(data + 1);
14034 uint16_t duration = get_le16(data + 5);
14035 uint16_t timeout = get_le16(data + 7);
14036 uint8_t adv_data_len = get_u8(data + 9);
14037 uint8_t scan_rsp_len = get_u8(data + 10);
14039 print_field("Instance: %u", instance);
14040 mgmt_print_adv_flags(flags);
14041 print_field("Duration: %u", duration);
14042 print_field("Timeout: %u", timeout);
14043 print_field("Advertising data length: %u", adv_data_len);
14044 print_eir(data + 11, adv_data_len, false);
14045 print_field("Scan response length: %u", scan_rsp_len);
14046 print_eir(data + 11 + adv_data_len, scan_rsp_len, false);
14049 static void mgmt_add_advertising_rsp(const void *data, uint16_t size)
14051 uint8_t instance = get_u8(data);
14053 print_field("Instance: %u", instance);
14056 static void mgmt_remove_advertising_cmd(const void *data, uint16_t size)
14058 uint8_t instance = get_u8(data);
14060 print_field("Instance: %u", instance);
14063 static void mgmt_remove_advertising_rsp(const void *data, uint16_t size)
14065 uint8_t instance = get_u8(data);
14067 print_field("Instance: %u", instance);
14070 static void mgmt_get_advertising_size_info_cmd(const void *data, uint16_t size)
14072 uint8_t instance = get_u8(data);
14073 uint32_t flags = get_le32(data + 1);
14075 print_field("Instance: %u", instance);
14076 mgmt_print_adv_flags(flags);
14079 static void mgmt_get_advertising_size_info_rsp(const void *data, uint16_t size)
14081 uint8_t instance = get_u8(data);
14082 uint32_t flags = get_le32(data + 1);
14083 uint8_t adv_data_len = get_u8(data + 5);
14084 uint8_t scan_rsp_len = get_u8(data + 6);
14086 print_field("Instance: %u", instance);
14087 mgmt_print_adv_flags(flags);
14088 print_field("Advertising data length: %u", adv_data_len);
14089 print_field("Scan response length: %u", scan_rsp_len);
14092 static void mgmt_start_limited_discovery_cmd(const void *data, uint16_t size)
14094 uint8_t type = get_u8(data);
14096 mgmt_print_address_type(type);
14099 static void mgmt_start_limited_discovery_rsp(const void *data, uint16_t size)
14101 uint8_t type = get_u8(data);
14103 mgmt_print_address_type(type);
14106 static void mgmt_read_ext_controller_info_rsp(const void *data, uint16_t size)
14108 uint8_t version = get_u8(data + 6);
14109 uint16_t manufacturer = get_le16(data + 7);
14110 uint32_t supported_settings = get_le32(data + 9);
14111 uint32_t current_settings = get_le32(data + 13);
14112 uint16_t data_len = get_le16(data + 17);
14114 print_addr_resolve("Address", data, 0x00, false);
14115 mgmt_print_version(version);
14116 mgmt_print_manufacturer(manufacturer);
14117 mgmt_print_settings("Supported settings", supported_settings);
14118 mgmt_print_settings("Current settings", current_settings);
14119 print_field("Data length: %u", data_len);
14120 print_eir(data + 19, size - 19, false);
14123 static void mgmt_set_apperance_cmd(const void *data, uint16_t size)
14125 uint16_t appearance = get_le16(data);
14127 print_appearance(appearance);
14130 static const struct bitfield_data mgmt_phy_table[] = {
14131 { 0, "BR 1M 1SLOT" },
14132 { 1, "BR 1M 3SLOT" },
14133 { 2, "BR 1M 5SLOT" },
14134 { 3, "EDR 2M 1SLOT" },
14135 { 4, "EDR 2M 3SLOT" },
14136 { 5, "EDR 2M 5SLOT" },
14137 { 6, "EDR 3M 1SLOT" },
14138 { 7, "EDR 3M 3SLOT" },
14139 { 8, "EDR 3M 5SLOT" },
14141 { 10, "LE 1M RX" },
14142 { 11, "LE 2M TX" },
14143 { 12, "LE 2M RX" },
14144 { 13, "LE CODED TX" },
14145 { 14, "LE CODED RX" },
14149 static void mgmt_print_phys(const char *label, uint16_t phys)
14153 print_field("%s: 0x%4.4x", label, phys);
14155 mask = print_bitfield(2, phys, mgmt_phy_table);
14157 print_text(COLOR_UNKNOWN_PHY, " Unknown PHYs"
14158 " (0x%8.8x)", mask);
14161 static void mgmt_get_phy_rsp(const void *data, uint16_t size)
14163 uint32_t supported_phys = get_le32(data);
14164 uint32_t configurable_phys = get_le32(data + 4);
14165 uint32_t selected_phys = get_le32(data + 8);
14167 mgmt_print_phys("Supported PHYs", supported_phys);
14168 mgmt_print_phys("Configurable PHYs", configurable_phys);
14169 mgmt_print_phys("Selected PHYs", selected_phys);
14172 static void mgmt_set_phy_cmd(const void *data, uint16_t size)
14174 uint32_t selected_phys = get_le32(data);
14176 mgmt_print_phys("Selected PHYs", selected_phys);
14179 static void mgmt_read_exp_features_info_rsp(const void *data, uint16_t size)
14181 uint16_t num_features = get_le16(data);
14184 print_field("Features: %u", num_features);
14186 if (size - 2 != num_features * 20) {
14187 packet_hexdump(data + 2, size - 2);
14191 for (i = 0; i < num_features; i++)
14192 mgmt_print_exp_feature(data + 2 + (i * 20));
14195 static void mgmt_set_exp_feature_cmd(const void *data, uint16_t size)
14197 uint8_t enable = get_u8(data + 16);
14199 print_field("UUID: %s", bt_uuid128_to_str(data));
14200 print_enable("Action", enable);
14203 static void mgmt_set_exp_feature_rsp(const void *data, uint16_t size)
14205 mgmt_print_exp_feature(data);
14208 static const struct bitfield_data mgmt_added_device_flags_table[] = {
14209 { 0, "Remote Wakeup" },
14210 { 1, "Device Privacy Mode" },
14214 static void mgmt_print_added_device_flags(char *label, uint32_t flags)
14218 print_field("%s: 0x%8.8x", label, flags);
14219 mask = print_bitfield(2, flags, mgmt_added_device_flags_table);
14221 print_text(COLOR_UNKNOWN_ADDED_DEVICE_FLAG,
14222 " Unknown Flags (0x%8.8x)", mask);
14225 static void mgmt_get_device_flags_cmd(const void *data, uint16_t size)
14227 uint8_t type = get_u8(data + 6);
14229 mgmt_print_address(data, type);
14232 static void mgmt_get_device_flags_rsp(const void *data, uint16_t size)
14234 uint8_t type = get_u8(data + 6);
14235 uint32_t supported_flags = get_le32(data + 7);
14236 uint32_t current_flags = get_le32(data + 11);
14238 mgmt_print_address(data, type);
14239 mgmt_print_added_device_flags("Supported Flags", supported_flags);
14240 mgmt_print_added_device_flags("Current Flags", current_flags);
14243 static void mgmt_set_device_flags_cmd(const void *data, uint16_t size)
14245 uint8_t type = get_u8(data + 6);
14246 uint32_t current_flags = get_le32(data + 7);
14248 mgmt_print_address(data, type);
14249 mgmt_print_added_device_flags("Current Flags", current_flags);
14252 static void mgmt_set_device_flags_rsp(const void *data, uint16_t size)
14254 uint8_t type = get_u8(data + 6);
14256 mgmt_print_address(data, type);
14258 static void mgmt_add_ext_adv_params_cmd(const void *data, uint16_t size)
14260 uint8_t instance = get_u8(data);
14261 uint32_t flags = get_le32(data + 1);
14262 uint16_t duration = get_le16(data + 5);
14263 uint16_t timeout = get_le16(data + 7);
14264 uint8_t *min_interval = (uint8_t *)(data + 9);
14265 uint8_t *max_interval = (uint8_t *)(data + 13);
14266 int8_t tx_power = get_s8(data + 17);
14268 print_field("Instance: %u", instance);
14269 mgmt_print_adv_flags(flags);
14270 print_field("Duration: %u", duration);
14271 print_field("Timeout: %u", timeout);
14272 print_ext_slot_625("Min advertising interval", min_interval);
14273 print_ext_slot_625("Max advertising interval", max_interval);
14274 print_power_level(tx_power, NULL);
14277 static void mgmt_add_ext_adv_params_rsp(const void *data, uint16_t size)
14279 uint8_t instance = get_u8(data);
14280 int8_t tx_power = get_s8(data + 1);
14281 uint8_t max_adv_data_len = get_u8(data+2);
14282 uint8_t max_scan_rsp_len = get_u8(data+3);
14284 print_field("Instance: %u", instance);
14285 print_power_level(tx_power, NULL);
14286 print_field("Available adv data len: %u", max_adv_data_len);
14287 print_field("Available scan rsp data len: %u", max_scan_rsp_len);
14290 static void mgmt_add_ext_adv_data_cmd(const void *data, uint16_t size)
14292 uint8_t instance = get_u8(data);
14293 uint8_t adv_data_len = get_u8(data + 1);
14294 uint8_t scan_rsp_len = get_u8(data + 2);
14296 print_field("Instance: %u", instance);
14297 print_field("Advertising data length: %u", adv_data_len);
14298 print_eir(data + 3, adv_data_len, false);
14299 print_field("Scan response length: %u", scan_rsp_len);
14300 print_eir(data + 3 + adv_data_len, scan_rsp_len, false);
14303 static void mgmt_add_ext_adv_data_rsp(const void *data, uint16_t size)
14305 uint8_t instance = get_u8(data);
14307 print_field("Instance: %u", instance);
14310 static const struct bitfield_data mgmt_adv_monitor_features_table[] = {
14311 { 1, "OR Patterns" },
14315 static void mgmt_print_adv_monitor_features(char *label, uint32_t flags)
14319 print_field("%s: 0x%8.8x", label, flags);
14320 mask = print_bitfield(2, flags, mgmt_adv_monitor_features_table);
14322 print_text(COLOR_UNKNOWN_ADVMON_FEATURES,
14323 " Unknown Flags (0x%8.8x)", mask);
14326 static void mgmt_print_adv_monitor_handles(const void *data, uint8_t len)
14330 while (idx + 2 <= len) {
14331 print_field(" Handle: %d", get_le16(data + idx));
14336 static void mgmt_read_adv_monitor_features_rsp(const void *data, uint16_t size)
14338 uint32_t supported_features = get_le32(data);
14339 uint32_t enabled_features = get_le32(data + 4);
14340 uint16_t max_num_handles = get_le16(data + 8);
14341 uint8_t max_num_patterns = get_u8(data + 10);
14342 uint16_t num_handles = get_le16(data + 11);
14344 mgmt_print_adv_monitor_features("Supported Features",
14345 supported_features);
14346 mgmt_print_adv_monitor_features("Enabled Features",
14348 print_field("Max number of handles: %d", max_num_handles);
14349 print_field("Max number of patterns: %d", max_num_patterns);
14350 print_field("Number of handles: %d", num_handles);
14351 mgmt_print_adv_monitor_handles(data + 13, size - 13);
14354 static void mgmt_print_adv_monitor_patterns(const void *data, uint8_t len)
14356 uint8_t data_idx = 0, pattern_idx = 1;
14358 /* Reference: struct mgmt_adv_pattern in lib/mgmt.h. */
14359 while (data_idx + 34 <= len) {
14360 uint8_t ad_type = get_u8(data);
14361 uint8_t offset = get_u8(data + 1);
14362 uint8_t length = get_u8(data + 2);
14364 print_field(" Pattern %d:", pattern_idx);
14365 print_field(" AD type: %d", ad_type);
14366 print_field(" Offset: %d", offset);
14367 print_field(" Length: %d", length);
14369 print_hex_field(" Value ", data + 3, length);
14371 print_text(COLOR_ERROR, " invalid length");
14379 static void mgmt_add_adv_monitor_patterns_cmd(const void *data, uint16_t size)
14381 uint8_t pattern_count = get_u8(data);
14383 print_field("Number of patterns: %d", pattern_count);
14384 mgmt_print_adv_monitor_patterns(data + 1, size - 1);
14387 static void mgmt_add_adv_monitor_patterns_rssi_cmd(const void *data,
14390 int8_t high_rssi = get_s8(data);
14391 uint16_t high_rssi_timeout = get_le16(data + 1);
14392 int8_t low_rssi = get_s8(data + 3);
14393 uint16_t low_rssi_timeout = get_le16(data + 4);
14394 uint8_t sampling_period = get_u8(data + 6);
14395 uint8_t pattern_count = get_u8(data + 7);
14397 print_field("RSSI data:");
14398 print_field(" high threshold: %d dBm", high_rssi);
14399 print_field(" high timeout: %d seconds", high_rssi_timeout);
14400 print_field(" low threshold: %d dBm", low_rssi);
14401 print_field(" low timeout: %d seconds", low_rssi_timeout);
14403 if (sampling_period == 0)
14404 print_field(" sampling: propagate all (0x00)");
14405 else if (sampling_period == 0xff)
14406 print_field(" sampling: just once (0xFF)");
14408 print_field(" sampling: every %d ms", 100 * sampling_period);
14410 print_field("Number of patterns: %d", pattern_count);
14411 mgmt_print_adv_monitor_patterns(data + 8, size - 8);
14414 static void mgmt_add_adv_monitor_patterns_rsp(const void *data, uint16_t size)
14416 uint16_t handle = get_le16(data);
14418 print_field("Handle: %d", handle);
14421 static void mgmt_remove_adv_monitor_patterns_cmd(const void *data,
14424 uint16_t handle = get_le16(data);
14426 print_field("Handle: %d", handle);
14429 static void mgmt_remove_adv_monitor_patterns_rsp(const void *data,
14432 uint16_t handle = get_le16(data);
14434 print_field("Handle: %d", handle);
14437 static void mgmt_set_mesh_receiver_cmd(const void *data, uint16_t size)
14439 uint8_t enable = get_u8(data);
14440 uint16_t window = get_le16(data + 1);
14441 uint16_t period = get_le16(data + 3);
14442 uint8_t num_ad_types = get_u8(data + 5);
14443 const uint8_t *ad_types = data + 6;
14445 print_field("Enable: %d", enable);
14446 print_field("Window: %d", window);
14447 print_field("Period: %d", period);
14448 print_field("Num AD Types: %d", num_ad_types);
14452 print_field(" AD Type: %d", *ad_types++);
14455 static void mgmt_read_mesh_features_rsp(const void *data, uint16_t size)
14457 uint16_t index = get_le16(data);
14458 uint8_t max_handles = get_u8(data + 2);
14459 uint8_t used_handles = get_u8(data + 3);
14460 const uint8_t *handles = data + 4;
14462 print_field("Index: %d", index);
14463 print_field("Max Handles: %d", max_handles);
14464 print_field("Used Handles: %d", used_handles);
14468 print_field(" Used Handle: %d", *handles++);
14471 static void mgmt_mesh_send_cmd(const void *data, uint16_t size)
14473 const uint8_t *addr = data;
14474 uint8_t addr_type = get_u8(data + 6);
14475 uint64_t instant = get_le64(data + 7);
14476 uint16_t delay = get_le16(data + 15);
14477 uint8_t cnt = get_u8(data + 17);
14478 uint8_t adv_data_len = get_u8(data + 18);
14482 print_bdaddr(addr);
14483 print_field("Addr Type: %d", addr_type);
14484 print_field("Instant: 0x%16.16" PRIx64, instant);
14485 print_field("Delay: %d", delay);
14486 print_field("Count: %d", cnt);
14487 print_field("Data Length: %d", adv_data_len);
14488 print_hex_field("Data", data, size);
14491 static void mgmt_mesh_send_rsp(const void *data, uint16_t size)
14493 uint8_t handle = get_u8(data);
14495 print_field("Handle: %d", handle);
14498 static void mgmt_mesh_send_cancel_cmd(const void *data, uint16_t size)
14500 uint8_t handle = get_u8(data);
14502 print_field("Handle: %d", handle);
14508 void (*func) (const void *data, uint16_t size);
14511 void (*rsp_func) (const void *data, uint16_t size);
14516 static const struct mgmt_data mgmt_command_table[] = {
14517 { 0x0001, "Read Management Version Information",
14518 mgmt_null_cmd, 0, true,
14519 mgmt_read_version_info_rsp, 3, true },
14520 { 0x0002, "Read Management Supported Commands",
14521 mgmt_null_cmd, 0, true,
14522 mgmt_read_supported_commands_rsp, 4, false },
14523 { 0x0003, "Read Controller Index List",
14524 mgmt_null_cmd, 0, true,
14525 mgmt_read_index_list_rsp, 2, false },
14526 { 0x0004, "Read Controller Information",
14527 mgmt_null_cmd, 0, true,
14528 mgmt_read_controller_info_rsp, 280, true },
14529 { 0x0005, "Set Powered",
14530 mgmt_set_powered_cmd, 1, true,
14531 mgmt_new_settings_rsp, 4, true },
14532 { 0x0006, "Set Discoverable",
14533 mgmt_set_discoverable_cmd, 3, true,
14534 mgmt_new_settings_rsp, 4, true },
14535 { 0x0007, "Set Connectable",
14536 mgmt_set_connectable_cmd, 1, true,
14537 mgmt_new_settings_rsp, 4, true },
14538 { 0x0008, "Set Fast Connectable",
14539 mgmt_set_fast_connectable_cmd, 1, true,
14540 mgmt_new_settings_rsp, 4, true },
14541 { 0x0009, "Set Bondable",
14542 mgmt_set_bondable_cmd, 1, true,
14543 mgmt_new_settings_rsp, 4, true },
14544 { 0x000a, "Set Link Security",
14545 mgmt_set_link_security_cmd, 1, true,
14546 mgmt_new_settings_rsp, 4, true },
14547 { 0x000b, "Set Secure Simple Pairing",
14548 mgmt_set_secure_simple_pairing_cmd, 1, true,
14549 mgmt_new_settings_rsp, 4, true },
14550 { 0x000c, "Set High Speed",
14551 mgmt_set_high_speed_cmd, 1, true,
14552 mgmt_new_settings_rsp, 4, true },
14553 { 0x000d, "Set Low Energy",
14554 mgmt_set_low_energy_cmd, 1, true,
14555 mgmt_new_settings_rsp, 4, true },
14556 { 0x000e, "Set Device Class",
14557 mgmt_set_device_class_cmd, 2, true,
14558 mgmt_set_device_class_rsp, 3, true },
14559 { 0x000f, "Set Local Name",
14560 mgmt_set_local_name_cmd, 260, true,
14561 mgmt_set_local_name_rsp, 260, true },
14562 { 0x0010, "Add UUID",
14563 mgmt_add_uuid_cmd, 17, true,
14564 mgmt_add_uuid_rsp, 3, true },
14565 { 0x0011, "Remove UUID",
14566 mgmt_remove_uuid_cmd, 16, true,
14567 mgmt_remove_uuid_rsp, 3, true },
14568 { 0x0012, "Load Link Keys",
14569 mgmt_load_link_keys_cmd, 3, false,
14570 mgmt_null_rsp, 0, true },
14571 { 0x0013, "Load Long Term Keys",
14572 mgmt_load_long_term_keys_cmd, 2, false,
14573 mgmt_null_rsp, 0, true },
14574 { 0x0014, "Disconnect",
14575 mgmt_disconnect_cmd, 7, true,
14576 mgmt_disconnect_rsp, 7, true },
14577 { 0x0015, "Get Connections",
14578 mgmt_null_cmd, 0, true,
14579 mgmt_get_connections_rsp, 2, false },
14580 { 0x0016, "PIN Code Reply",
14581 mgmt_pin_code_reply_cmd, 24, true,
14582 mgmt_pin_code_reply_rsp, 7, true },
14583 { 0x0017, "PIN Code Negative Reply",
14584 mgmt_pin_code_neg_reply_cmd, 7, true,
14585 mgmt_pin_code_neg_reply_rsp, 7, true },
14586 { 0x0018, "Set IO Capability",
14587 mgmt_set_io_capability_cmd, 1, true,
14588 mgmt_null_rsp, 0, true },
14589 { 0x0019, "Pair Device",
14590 mgmt_pair_device_cmd, 8, true,
14591 mgmt_pair_device_rsp, 7, true },
14592 { 0x001a, "Cancel Pair Device",
14593 mgmt_cancel_pair_device_cmd, 7, true,
14594 mgmt_cancel_pair_device_rsp, 7, true },
14595 { 0x001b, "Unpair Device",
14596 mgmt_unpair_device_cmd, 8, true,
14597 mgmt_unpair_device_rsp, 7, true },
14598 { 0x001c, "User Confirmation Reply",
14599 mgmt_user_confirmation_reply_cmd, 7, true,
14600 mgmt_user_confirmation_reply_rsp, 7, true },
14601 { 0x001d, "User Confirmation Negative Reply",
14602 mgmt_user_confirmation_neg_reply_cmd, 7, true,
14603 mgmt_user_confirmation_neg_reply_rsp, 7, true },
14604 { 0x001e, "User Passkey Reply",
14605 mgmt_user_passkey_reply_cmd, 11, true,
14606 mgmt_user_passkey_reply_rsp, 7, true },
14607 { 0x001f, "User Passkey Negative Reply",
14608 mgmt_user_passkey_neg_reply_cmd, 7, true,
14609 mgmt_user_passkey_neg_reply_rsp, 7, true },
14610 { 0x0020, "Read Local Out Of Band Data",
14611 mgmt_null_cmd, 0, true,
14612 mgmt_read_local_oob_data_rsp, 64, true },
14613 { 0x0021, "Add Remote Out Of Band Data",
14614 mgmt_add_remote_oob_data_cmd, 71, true,
14615 mgmt_add_remote_oob_data_rsp, 7, true },
14616 { 0x0022, "Remove Remote Out Of Band Data",
14617 mgmt_remove_remote_oob_data_cmd, 7, true,
14618 mgmt_remove_remote_oob_data_rsp, 7, true },
14619 { 0x0023, "Start Discovery",
14620 mgmt_start_discovery_cmd, 1, true,
14621 mgmt_start_discovery_rsp, 1, true },
14622 { 0x0024, "Stop Discovery",
14623 mgmt_stop_discovery_cmd, 1, true,
14624 mgmt_stop_discovery_rsp, 1, true },
14625 { 0x0025, "Confirm Name",
14626 mgmt_confirm_name_cmd, 8, true,
14627 mgmt_confirm_name_rsp, 7, true },
14628 { 0x0026, "Block Device",
14629 mgmt_block_device_cmd, 7, true,
14630 mgmt_block_device_rsp, 7, true },
14631 { 0x0027, "Unblock Device",
14632 mgmt_unblock_device_cmd, 7, true,
14633 mgmt_unblock_device_rsp, 7, true },
14634 { 0x0028, "Set Device ID",
14635 mgmt_set_device_id_cmd, 8, true,
14636 mgmt_null_rsp, 0, true },
14637 { 0x0029, "Set Advertising",
14638 mgmt_set_advertising_cmd, 1, true,
14639 mgmt_new_settings_rsp, 4, true },
14640 { 0x002a, "Set BR/EDR",
14641 mgmt_set_bredr_cmd, 1, true,
14642 mgmt_new_settings_rsp, 4, true },
14643 { 0x002b, "Set Static Address",
14644 mgmt_set_static_address_cmd, 6, true,
14645 mgmt_new_settings_rsp, 4, true },
14646 { 0x002c, "Set Scan Parameters",
14647 mgmt_set_scan_parameters_cmd, 4, true,
14648 mgmt_null_rsp, 0, true },
14649 { 0x002d, "Set Secure Connections",
14650 mgmt_set_secure_connections_cmd, 1, true,
14651 mgmt_new_settings_rsp, 4, true },
14652 { 0x002e, "Set Debug Keys",
14653 mgmt_set_debug_keys_cmd, 1, true,
14654 mgmt_new_settings_rsp, 4, true },
14655 { 0x002f, "Set Privacy",
14656 mgmt_set_privacy_cmd, 17, true,
14657 mgmt_new_settings_rsp, 4, true },
14658 { 0x0030, "Load Identity Resolving Keys",
14659 mgmt_load_identity_resolving_keys_cmd, 2, false,
14660 mgmt_null_rsp, 0, true },
14661 { 0x0031, "Get Connection Information",
14662 mgmt_get_connection_information_cmd, 7, true,
14663 mgmt_get_connection_information_rsp, 10, true },
14664 { 0x0032, "Get Clock Information",
14665 mgmt_get_clock_information_cmd, 7, true,
14666 mgmt_get_clock_information_rsp, 17, true },
14667 { 0x0033, "Add Device",
14668 mgmt_add_device_cmd, 8, true,
14669 mgmt_add_device_rsp, 7, true },
14670 { 0x0034, "Remove Device",
14671 mgmt_remove_device_cmd, 7, true,
14672 mgmt_remove_device_rsp, 7, true },
14673 { 0x0035, "Load Connection Parameters",
14674 mgmt_load_connection_parameters_cmd, 2, false,
14675 mgmt_null_rsp, 0, true },
14676 { 0x0036, "Read Unconfigured Controller Index List",
14677 mgmt_null_cmd, 0, true,
14678 mgmt_read_unconf_index_list_rsp, 2, false },
14679 { 0x0037, "Read Controller Configuration Information",
14680 mgmt_null_cmd, 0, true,
14681 mgmt_read_controller_conf_info_rsp, 10, true },
14682 { 0x0038, "Set External Configuration",
14683 mgmt_set_external_configuration_cmd, 1, true,
14684 mgmt_new_options_rsp, 4, true },
14685 { 0x0039, "Set Public Address",
14686 mgmt_set_public_address_cmd, 6, true,
14687 mgmt_new_options_rsp, 4, true },
14688 { 0x003a, "Start Service Discovery",
14689 mgmt_start_service_discovery_cmd, 3, false,
14690 mgmt_start_service_discovery_rsp, 1, true },
14691 { 0x003b, "Read Local Out Of Band Extended Data",
14692 mgmt_read_local_oob_ext_data_cmd, 1, true,
14693 mgmt_read_local_oob_ext_data_rsp, 3, false },
14694 { 0x003c, "Read Extended Controller Index List",
14695 mgmt_null_cmd, 0, true,
14696 mgmt_read_ext_index_list_rsp, 2, false },
14697 { 0x003d, "Read Advertising Features",
14698 mgmt_null_cmd, 0, true,
14699 mgmt_read_advertising_features_rsp, 8, false },
14700 { 0x003e, "Add Advertising",
14701 mgmt_add_advertising_cmd, 11, false,
14702 mgmt_add_advertising_rsp, 1, true },
14703 { 0x003f, "Remove Advertising",
14704 mgmt_remove_advertising_cmd, 1, true,
14705 mgmt_remove_advertising_rsp, 1, true },
14706 { 0x0040, "Get Advertising Size Information",
14707 mgmt_get_advertising_size_info_cmd, 5, true,
14708 mgmt_get_advertising_size_info_rsp, 7, true },
14709 { 0x0041, "Start Limited Discovery",
14710 mgmt_start_limited_discovery_cmd, 1, true,
14711 mgmt_start_limited_discovery_rsp, 1, true },
14712 { 0x0042, "Read Extended Controller Information",
14713 mgmt_null_cmd, 0, true,
14714 mgmt_read_ext_controller_info_rsp, 19, false },
14715 { 0x0043, "Set Appearance",
14716 mgmt_set_apperance_cmd, 2, true,
14717 mgmt_null_rsp, 0, true },
14718 { 0x0044, "Get PHY Configuration",
14719 mgmt_null_cmd, 0, true,
14720 mgmt_get_phy_rsp, 12, true },
14721 { 0x0045, "Set PHY Configuration",
14722 mgmt_set_phy_cmd, 4, true,
14723 mgmt_null_rsp, 0, true },
14724 { 0x0046, "Load Blocked Keys" },
14725 { 0x0047, "Set Wideband Speech" },
14726 { 0x0048, "Read Controller Capabilities" },
14727 { 0x0049, "Read Experimental Features Information",
14728 mgmt_null_cmd, 0, true,
14729 mgmt_read_exp_features_info_rsp, 2, false },
14730 { 0x004a, "Set Experimental Feature",
14731 mgmt_set_exp_feature_cmd, 17, true,
14732 mgmt_set_exp_feature_rsp, 20, true },
14733 { 0x004b, "Read Default System Configuration" },
14734 { 0x004c, "Set Default System Configuration" },
14735 { 0x004d, "Read Default Runtime Configuration" },
14736 { 0x004e, "Set Default Runtime Configuration" },
14737 { 0x004f, "Get Device Flags",
14738 mgmt_get_device_flags_cmd, 7, true,
14739 mgmt_get_device_flags_rsp, 15, true},
14740 { 0x0050, "Set Device Flags",
14741 mgmt_set_device_flags_cmd, 11, true,
14742 mgmt_set_device_flags_rsp, 7, true},
14743 { 0x0051, "Read Advertisement Monitor Features",
14744 mgmt_null_cmd, 0, true,
14745 mgmt_read_adv_monitor_features_rsp, 13, false},
14746 { 0x0052, "Add Advertisement Patterns Monitor",
14747 mgmt_add_adv_monitor_patterns_cmd, 1, false,
14748 mgmt_add_adv_monitor_patterns_rsp, 2, true},
14749 { 0x0053, "Remove Advertisement Monitor",
14750 mgmt_remove_adv_monitor_patterns_cmd, 2, true,
14751 mgmt_remove_adv_monitor_patterns_rsp, 2, true},
14752 { 0x0054, "Add Extended Advertising Parameters",
14753 mgmt_add_ext_adv_params_cmd, 18, false,
14754 mgmt_add_ext_adv_params_rsp, 4, true },
14755 { 0x0055, "Add Extended Advertising Data",
14756 mgmt_add_ext_adv_data_cmd, 3, false,
14757 mgmt_add_ext_adv_data_rsp, 1, true },
14758 { 0x0056, "Add Advertisement Patterns Monitor With RSSI Threshold",
14759 mgmt_add_adv_monitor_patterns_rssi_cmd, 8,
14761 mgmt_add_adv_monitor_patterns_rsp, 2, true},
14762 { 0x0057, "Set Mesh Receiver",
14763 mgmt_set_mesh_receiver_cmd, 6, false,
14764 mgmt_null_rsp, 0, true},
14765 { 0x0058, "Read Mesh Features",
14766 mgmt_null_cmd, 0, true,
14767 mgmt_read_mesh_features_rsp, 4, false},
14768 { 0x0059, "Mesh Send",
14769 mgmt_mesh_send_cmd, 19, false,
14770 mgmt_mesh_send_rsp, 1, true},
14771 { 0x0056, "Mesh Send Cancel",
14772 mgmt_mesh_send_cancel_cmd, 1, true,
14773 mgmt_null_rsp, 0, true},
14777 static void mgmt_null_evt(const void *data, uint16_t size)
14781 static void mgmt_command_complete_evt(const void *data, uint16_t size)
14785 const struct mgmt_data *mgmt_data = NULL;
14786 const char *mgmt_color, *mgmt_str;
14789 opcode = get_le16(data);
14790 status = get_u8(data + 2);
14795 for (i = 0; mgmt_command_table[i].str; i++) {
14796 if (mgmt_command_table[i].opcode == opcode) {
14797 mgmt_data = &mgmt_command_table[i];
14803 if (mgmt_data->rsp_func)
14804 mgmt_color = COLOR_CTRL_COMMAND;
14806 mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
14807 mgmt_str = mgmt_data->str;
14809 mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
14810 mgmt_str = "Unknown";
14813 print_indent(6, mgmt_color, "", mgmt_str, COLOR_OFF,
14814 " (0x%4.4x) plen %u", opcode, size);
14816 mgmt_print_status(status);
14818 if (!mgmt_data || !mgmt_data->rsp_func) {
14819 packet_hexdump(data, size);
14823 if (mgmt_data->rsp_fixed) {
14824 if (size != mgmt_data->rsp_size) {
14825 print_text(COLOR_ERROR, "invalid packet size");
14826 packet_hexdump(data, size);
14830 if (size < mgmt_data->rsp_size) {
14831 print_text(COLOR_ERROR, "too short packet");
14832 packet_hexdump(data, size);
14837 mgmt_data->rsp_func(data, size);
14840 static void mgmt_command_status_evt(const void *data, uint16_t size)
14844 const struct mgmt_data *mgmt_data = NULL;
14845 const char *mgmt_color, *mgmt_str;
14848 opcode = get_le16(data);
14849 status = get_u8(data + 2);
14851 for (i = 0; mgmt_command_table[i].str; i++) {
14852 if (mgmt_command_table[i].opcode == opcode) {
14853 mgmt_data = &mgmt_command_table[i];
14859 mgmt_color = COLOR_CTRL_COMMAND;
14860 mgmt_str = mgmt_data->str;
14862 mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
14863 mgmt_str = "Unknown";
14866 print_indent(6, mgmt_color, "", mgmt_str, COLOR_OFF,
14867 " (0x%4.4x)", opcode);
14869 mgmt_print_status(status);
14872 static void mgmt_controller_error_evt(const void *data, uint16_t size)
14874 uint8_t error = get_u8(data);
14876 print_field("Error: 0x%2.2x", error);
14879 static void mgmt_new_settings_evt(const void *data, uint16_t size)
14881 uint32_t settings = get_le32(data);
14883 mgmt_print_settings("Current settings", settings);
14886 static void mgmt_class_of_dev_changed_evt(const void *data, uint16_t size)
14888 print_dev_class(data);
14891 static void mgmt_local_name_changed_evt(const void *data, uint16_t size)
14893 mgmt_print_name(data);
14896 static void mgmt_new_link_key_evt(const void *data, uint16_t size)
14898 uint8_t store_hint = get_u8(data);
14900 mgmt_print_store_hint(store_hint);
14901 mgmt_print_link_key(data + 1);
14904 static void mgmt_new_long_term_key_evt(const void *data, uint16_t size)
14906 uint8_t store_hint = get_u8(data);
14908 mgmt_print_store_hint(store_hint);
14909 mgmt_print_long_term_key(data + 1);
14912 static void mgmt_device_connected_evt(const void *data, uint16_t size)
14914 uint8_t address_type = get_u8(data + 6);
14915 uint32_t flags = get_le32(data + 7);
14916 uint16_t data_len = get_le16(data + 11);
14918 mgmt_print_address(data, address_type);
14919 mgmt_print_device_flags(flags);
14920 print_field("Data length: %u", data_len);
14921 print_eir(data + 13, size - 13, false);
14924 static void mgmt_device_disconnected_evt(const void *data, uint16_t size)
14926 uint8_t address_type = get_u8(data + 6);
14927 uint8_t reason = get_u8(data + 7);
14930 mgmt_print_address(data, address_type);
14934 str = "Unspecified";
14937 str = "Connection timeout";
14940 str = "Connection terminated by local host";
14943 str = "Connection terminated by remote host";
14946 str = "Connection terminated due to authentication failure";
14949 str = "Connection terminated by local host for suspend";
14956 print_field("Reason: %s (0x%2.2x)", str, reason);
14959 static void mgmt_connect_failed_evt(const void *data, uint16_t size)
14961 uint8_t address_type = get_u8(data + 6);
14962 uint8_t status = get_u8(data + 7);
14964 mgmt_print_address(data, address_type);
14965 mgmt_print_status(status);
14968 static void mgmt_pin_code_request_evt(const void *data, uint16_t size)
14970 uint8_t address_type = get_u8(data + 6);
14971 uint8_t secure_pin = get_u8(data + 7);
14973 mgmt_print_address(data, address_type);
14974 print_field("Secure PIN: 0x%2.2x", secure_pin);
14977 static void mgmt_user_confirmation_request_evt(const void *data, uint16_t size)
14979 uint8_t address_type = get_u8(data + 6);
14980 uint8_t confirm_hint = get_u8(data + 7);
14981 uint32_t value = get_le32(data + 8);
14983 mgmt_print_address(data, address_type);
14984 print_field("Confirm hint: 0x%2.2x", confirm_hint);
14985 print_field("Value: 0x%8.8x", value);
14988 static void mgmt_user_passkey_request_evt(const void *data, uint16_t size)
14990 uint8_t address_type = get_u8(data + 6);
14992 mgmt_print_address(data, address_type);
14995 static void mgmt_authentication_failed_evt(const void *data, uint16_t size)
14997 uint8_t address_type = get_u8(data + 6);
14998 uint8_t status = get_u8(data + 7);
15000 mgmt_print_address(data, address_type);
15001 mgmt_print_status(status);
15004 static void mgmt_device_found_evt(const void *data, uint16_t size)
15006 uint8_t address_type = get_u8(data + 6);
15007 int8_t rssi = get_s8(data + 7);
15008 uint32_t flags = get_le32(data + 8);
15009 uint16_t data_len = get_le16(data + 12);
15011 mgmt_print_address(data, address_type);
15013 mgmt_print_device_flags(flags);
15014 print_field("Data length: %u", data_len);
15015 print_eir(data + 14, size - 14, false);
15018 static void mgmt_discovering_evt(const void *data, uint16_t size)
15020 uint8_t type = get_u8(data);
15021 uint8_t enable = get_u8(data + 1);
15023 mgmt_print_address_type(type);
15024 print_enable("Discovery", enable);
15027 static void mgmt_device_blocked_evt(const void *data, uint16_t size)
15029 uint8_t address_type = get_u8(data + 6);
15031 mgmt_print_address(data, address_type);
15034 static void mgmt_device_unblocked_evt(const void *data, uint16_t size)
15036 uint8_t address_type = get_u8(data + 6);
15038 mgmt_print_address(data, address_type);
15041 static void mgmt_device_unpaired_evt(const void *data, uint16_t size)
15043 uint8_t address_type = get_u8(data + 6);
15045 mgmt_print_address(data, address_type);
15048 static void mgmt_passkey_notify_evt(const void *data, uint16_t size)
15050 uint8_t address_type = get_u8(data + 6);
15051 uint32_t passkey = get_le32(data + 7);
15052 uint8_t entered = get_u8(data + 11);
15054 mgmt_print_address(data, address_type);
15055 print_field("Passkey: 0x%8.8x", passkey);
15056 print_field("Entered: %u", entered);
15059 static void mgmt_new_identity_resolving_key_evt(const void *data, uint16_t size)
15061 uint8_t store_hint = get_u8(data);
15063 mgmt_print_store_hint(store_hint);
15064 print_addr_resolve("Random address", data + 1, 0x01, false);
15065 mgmt_print_identity_resolving_key(data + 7);
15068 static void mgmt_new_signature_resolving_key_evt(const void *data, uint16_t size)
15070 uint8_t store_hint = get_u8(data);
15072 mgmt_print_store_hint(store_hint);
15073 mgmt_print_signature_resolving_key(data + 1);
15076 static void mgmt_device_added_evt(const void *data, uint16_t size)
15078 uint8_t address_type = get_u8(data + 6);
15079 uint8_t action = get_u8(data + 7);
15081 mgmt_print_address(data, address_type);
15082 mgmt_print_device_action(action);
15085 static void mgmt_device_removed_evt(const void *data, uint16_t size)
15087 uint8_t address_type = get_u8(data + 6);
15089 mgmt_print_address(data, address_type);
15092 static void mgmt_new_connection_parameter_evt(const void *data, uint16_t size)
15094 uint8_t store_hint = get_u8(data);
15096 mgmt_print_store_hint(store_hint);
15097 mgmt_print_connection_parameter(data + 1);
15100 static void mgmt_new_conf_options_evt(const void *data, uint16_t size)
15102 uint32_t missing_options = get_le32(data);
15104 mgmt_print_options("Missing options", missing_options);
15107 static void mgmt_ext_index_added_evt(const void *data, uint16_t size)
15109 uint8_t type = get_u8(data);
15110 uint8_t bus = get_u8(data + 1);
15112 print_field("type 0x%2.2x - bus 0x%2.2x", type, bus);
15115 static void mgmt_ext_index_removed_evt(const void *data, uint16_t size)
15117 uint8_t type = get_u8(data);
15118 uint8_t bus = get_u8(data + 1);
15120 print_field("type 0x%2.2x - bus 0x%2.2x", type, bus);
15123 static void mgmt_local_oob_ext_data_updated_evt(const void *data, uint16_t size)
15125 uint8_t type = get_u8(data);
15126 uint16_t data_len = get_le16(data + 1);
15128 mgmt_print_address_type(type);
15129 print_field("Data length: %u", data_len);
15130 print_eir(data + 3, size - 3, true);
15133 static void mgmt_advertising_added_evt(const void *data, uint16_t size)
15135 uint8_t instance = get_u8(data);
15137 print_field("Instance: %u", instance);
15140 static void mgmt_advertising_removed_evt(const void *data, uint16_t size)
15142 uint8_t instance = get_u8(data);
15144 print_field("Instance: %u", instance);
15147 static void mgmt_ext_controller_info_changed_evt(const void *data, uint16_t size)
15149 uint16_t data_len = get_le16(data);
15151 print_field("Data length: %u", data_len);
15152 print_eir(data + 2, size - 2, false);
15155 static void mgmt_phy_changed_evt(const void *data, uint16_t size)
15157 uint32_t selected_phys = get_le32(data);
15159 mgmt_print_phys("Selected PHYs", selected_phys);
15162 static void mgmt_exp_feature_changed_evt(const void *data, uint16_t size)
15164 mgmt_print_exp_feature(data);
15167 static void mgmt_device_flags_changed_evt(const void *data, uint16_t size)
15169 uint8_t type = get_u8(data + 6);
15170 uint32_t supported_flags = get_le32(data + 7);
15171 uint32_t current_flags = get_le32(data + 11);
15173 mgmt_print_address(data, type);
15174 mgmt_print_added_device_flags("Supported Flags", supported_flags);
15175 mgmt_print_added_device_flags("Current Flags", current_flags);
15178 static void mgmt_adv_monitor_added_evt(const void *data, uint16_t size)
15180 uint16_t handle = get_le16(data);
15182 print_field("Handle: %d", handle);
15185 static void mgmt_adv_monitor_removed_evt(const void *data, uint16_t size)
15187 uint16_t handle = get_le16(data);
15189 print_field("Handle: %d", handle);
15192 static void mgmt_controller_suspend_evt(const void *data, uint16_t size)
15194 uint8_t state = get_u8(data);
15199 str = "Controller running (failed to suspend)";
15202 str = "Disconnected and not scanning";
15205 str = "Page scanning and/or passive scanning";
15208 str = "Unknown suspend state";
15212 print_field("Suspend state: %s (%d)", str, state);
15215 static void mgmt_controller_resume_evt(const void *data, uint16_t size)
15217 uint8_t addr_type = get_u8(data + 6);
15218 uint8_t wake_reason = get_u8(data + 7);
15221 switch (wake_reason) {
15223 str = "Resume from non-Bluetooth wake source";
15226 str = "Wake due to unexpected event";
15229 str = "Remote wake due to peer device connection";
15232 str = "Unknown wake reason";
15236 print_field("Wake reason: %s (%d)", str, wake_reason);
15237 mgmt_print_address(data, addr_type);
15240 static void mgmt_adv_monitor_device_found_evt(const void *data, uint16_t size)
15242 uint16_t handle = get_le16(data);
15243 const uint8_t *addr = data + 2;
15244 uint8_t addr_type = get_u8(data + 8);
15245 int8_t rssi = get_s8(data + 9);
15246 uint32_t flags = get_le32(data + 10);
15247 uint16_t ad_data_len = get_le16(data + 14);
15248 const uint8_t *ad_data = data + 16;
15250 print_field("Handle: %d", handle);
15251 print_bdaddr(addr);
15252 print_field("Addr Type: %d", addr_type);
15253 print_field("RSSI: %d", rssi);
15254 mgmt_print_device_flags(flags);
15255 print_field("AD Data Len: %d", ad_data_len);
15257 print_hex_field("AD Data", ad_data, size);
15260 static void mgmt_adv_monitor_device_lost_evt(const void *data, uint16_t size)
15262 uint16_t handle = get_le16(data);
15263 const uint8_t *addr = data + 2;
15264 uint8_t addr_type = get_u8(data + 8);
15266 print_field("Handle: %d", handle);
15267 print_bdaddr(addr);
15268 print_field("Addr Type: %d", addr_type);
15271 static void mgmt_mesh_device_found_evt(const void *data, uint16_t size)
15273 const uint8_t *addr = data;
15274 uint8_t addr_type = get_u8(data + 6);
15275 int8_t rssi = get_s8(data + 7);
15276 uint64_t instant = get_le64(data + 8);
15277 uint32_t flags = get_le32(data + 16);
15278 uint16_t eir_len = get_le16(data + 20);
15279 const uint8_t *eir_data = data + 22;
15281 print_bdaddr(addr);
15282 print_field("Addr Type: %d", addr_type);
15283 print_field("RSSI: %d", rssi);
15284 print_field("Instant: 0x%16.16" PRIx64, instant);
15285 mgmt_print_device_flags(flags);
15286 print_field("EIR Length: %d", eir_len);
15288 print_hex_field("EIR Data", eir_data, size);
15291 static void mgmt_mesh_packet_cmplt_evt(const void *data, uint16_t size)
15293 uint8_t handle = get_u8(data);
15295 print_field("Handle: %d", handle);
15298 static const struct mgmt_data mgmt_event_table[] = {
15299 { 0x0001, "Command Complete",
15300 mgmt_command_complete_evt, 3, false },
15301 { 0x0002, "Command Status",
15302 mgmt_command_status_evt, 3, true },
15303 { 0x0003, "Controller Error",
15304 mgmt_controller_error_evt, 1, true },
15305 { 0x0004, "Index Added",
15306 mgmt_null_evt, 0, true },
15307 { 0x0005, "Index Removed",
15308 mgmt_null_evt, 0, true },
15309 { 0x0006, "New Settings",
15310 mgmt_new_settings_evt, 4, true },
15311 { 0x0007, "Class Of Device Changed",
15312 mgmt_class_of_dev_changed_evt, 3, true },
15313 { 0x0008, "Local Name Changed",
15314 mgmt_local_name_changed_evt, 260, true },
15315 { 0x0009, "New Link Key",
15316 mgmt_new_link_key_evt, 26, true },
15317 { 0x000a, "New Long Term Key",
15318 mgmt_new_long_term_key_evt, 37, true },
15319 { 0x000b, "Device Connected",
15320 mgmt_device_connected_evt, 13, false },
15321 { 0x000c, "Device Disconnected",
15322 mgmt_device_disconnected_evt, 8, true },
15323 { 0x000d, "Connect Failed",
15324 mgmt_connect_failed_evt, 8, true },
15325 { 0x000e, "PIN Code Request",
15326 mgmt_pin_code_request_evt, 8, true },
15327 { 0x000f, "User Confirmation Request",
15328 mgmt_user_confirmation_request_evt, 12, true },
15329 { 0x0010, "User Passkey Request",
15330 mgmt_user_passkey_request_evt, 7, true },
15331 { 0x0011, "Authentication Failed",
15332 mgmt_authentication_failed_evt, 8, true },
15333 { 0x0012, "Device Found",
15334 mgmt_device_found_evt, 14, false },
15335 { 0x0013, "Discovering",
15336 mgmt_discovering_evt, 2, true },
15337 { 0x0014, "Device Blocked",
15338 mgmt_device_blocked_evt, 7, true },
15339 { 0x0015, "Device Unblocked",
15340 mgmt_device_unblocked_evt, 7, true },
15341 { 0x0016, "Device Unpaired",
15342 mgmt_device_unpaired_evt, 7, true },
15343 { 0x0017, "Passkey Notify",
15344 mgmt_passkey_notify_evt, 12, true },
15345 { 0x0018, "New Identity Resolving Key",
15346 mgmt_new_identity_resolving_key_evt, 30, true },
15347 { 0x0019, "New Signature Resolving Key",
15348 mgmt_new_signature_resolving_key_evt, 25, true },
15349 { 0x001a, "Device Added",
15350 mgmt_device_added_evt, 8, true },
15351 { 0x001b, "Device Removed",
15352 mgmt_device_removed_evt, 7, true },
15353 { 0x001c, "New Connection Parameter",
15354 mgmt_new_connection_parameter_evt, 16, true },
15355 { 0x001d, "Unconfigured Index Added",
15356 mgmt_null_evt, 0, true },
15357 { 0x001e, "Unconfigured Index Removed",
15358 mgmt_null_evt, 0, true },
15359 { 0x001f, "New Configuration Options",
15360 mgmt_new_conf_options_evt, 4, true },
15361 { 0x0020, "Extended Index Added",
15362 mgmt_ext_index_added_evt, 2, true },
15363 { 0x0021, "Extended Index Removed",
15364 mgmt_ext_index_removed_evt, 2, true },
15365 { 0x0022, "Local Out Of Band Extended Data Updated",
15366 mgmt_local_oob_ext_data_updated_evt, 3, false },
15367 { 0x0023, "Advertising Added",
15368 mgmt_advertising_added_evt, 1, true },
15369 { 0x0024, "Advertising Removed",
15370 mgmt_advertising_removed_evt, 1, true },
15371 { 0x0025, "Extended Controller Information Changed",
15372 mgmt_ext_controller_info_changed_evt, 2, false },
15373 { 0x0026, "PHY Configuration Changed",
15374 mgmt_phy_changed_evt, 4, true },
15375 { 0x0027, "Experimental Feature Changed",
15376 mgmt_exp_feature_changed_evt, 20, true },
15377 { 0x002a, "Device Flags Changed",
15378 mgmt_device_flags_changed_evt, 15, true },
15379 { 0x002b, "Advertisement Monitor Added",
15380 mgmt_adv_monitor_added_evt, 2, true },
15381 { 0x002c, "Advertisement Monitor Removed",
15382 mgmt_adv_monitor_removed_evt, 2, true },
15383 { 0x002d, "Controller Suspended",
15384 mgmt_controller_suspend_evt, 1, true },
15385 { 0x002e, "Controller Resumed",
15386 mgmt_controller_resume_evt, 8, true },
15387 { 0x002f, "ADV Monitor Device Found",
15388 mgmt_adv_monitor_device_found_evt, 16, false },
15389 { 0x0030, "ADV Monitor Device Lost",
15390 mgmt_adv_monitor_device_lost_evt, 9, true },
15391 { 0x0031, "Mesh Device Found",
15392 mgmt_mesh_device_found_evt, 22, false },
15393 { 0x0032, "Mesh Packet Complete",
15394 mgmt_mesh_packet_cmplt_evt, 1, true },
15398 static void mgmt_print_commands(const void *data, uint16_t num)
15402 print_field("Commands: %u", num);
15404 for (i = 0; i < num; i++) {
15405 uint16_t opcode = get_le16(data + (i * 2));
15406 const char *str = NULL;
15409 for (n = 0; mgmt_command_table[n].str; n++) {
15410 if (mgmt_command_table[n].opcode == opcode) {
15411 str = mgmt_command_table[n].str;
15416 print_field(" %s (0x%4.4x)", str ?: "Reserved", opcode);
15420 static void mgmt_print_events(const void *data, uint16_t num)
15424 print_field("Events: %u", num);
15426 for (i = 0; i < num; i++) {
15427 uint16_t opcode = get_le16(data + (i * 2));
15428 const char *str = NULL;
15431 for (n = 0; mgmt_event_table[n].str; n++) {
15432 if (mgmt_event_table[n].opcode == opcode) {
15433 str = mgmt_event_table[n].str;
15438 print_field(" %s (0x%4.4x)", str ?: "Reserved", opcode);
15442 void packet_ctrl_command(struct timeval *tv, struct ucred *cred, uint16_t index,
15443 const void *data, uint16_t size)
15446 uint16_t format, opcode;
15447 const struct mgmt_data *mgmt_data = NULL;
15448 const char *mgmt_color, *mgmt_str;
15449 char channel[11], extra_str[25];
15453 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
15454 "Malformed Control Command packet", NULL, NULL);
15455 packet_hexdump(data, size);
15459 cookie = get_le32(data);
15464 sprintf(channel, "0x%4.4x", cookie);
15466 format = get_format(cookie);
15468 if (format != CTRL_MGMT) {
15471 sprintf(label, "0x%4.4x", format);
15473 print_packet(tv, cred, '@', index, channel, COLOR_CTRL_CLOSE,
15474 "Control Command", label, NULL);
15475 packet_hexdump(data, size);
15480 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
15481 "Malformed MGMT Command packet", NULL, NULL);
15482 packet_hexdump(data, size);
15486 opcode = get_le16(data);
15491 for (i = 0; mgmt_command_table[i].str; i++) {
15492 if (mgmt_command_table[i].opcode == opcode) {
15493 mgmt_data = &mgmt_command_table[i];
15499 if (mgmt_data->func)
15500 mgmt_color = COLOR_CTRL_COMMAND;
15502 mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
15503 mgmt_str = mgmt_data->str;
15505 mgmt_color = COLOR_CTRL_COMMAND_UNKNOWN;
15506 mgmt_str = "Unknown";
15509 sprintf(extra_str, "(0x%4.4x) plen %d", opcode, size);
15511 print_packet(tv, cred, '@', index, channel, mgmt_color,
15512 "MGMT Command", mgmt_str, extra_str);
15514 if (!mgmt_data || !mgmt_data->func) {
15515 packet_hexdump(data, size);
15519 if (mgmt_data->fixed) {
15520 if (size != mgmt_data->size) {
15521 print_text(COLOR_ERROR, "invalid packet size");
15522 packet_hexdump(data, size);
15526 if (size < mgmt_data->size) {
15527 print_text(COLOR_ERROR, "too short packet");
15528 packet_hexdump(data, size);
15533 mgmt_data->func(data, size);
15536 void packet_ctrl_event(struct timeval *tv, struct ucred *cred, uint16_t index,
15537 const void *data, uint16_t size)
15540 uint16_t format, opcode;
15541 const struct mgmt_data *mgmt_data = NULL;
15542 const char *mgmt_color, *mgmt_str;
15543 char channel[11], extra_str[25];
15547 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
15548 "Malformed Control Event packet", NULL, NULL);
15549 packet_hexdump(data, size);
15553 cookie = get_le32(data);
15558 sprintf(channel, "0x%4.4x", cookie);
15560 format = get_format(cookie);
15562 if (format != CTRL_MGMT) {
15565 sprintf(label, "0x%4.4x", format);
15567 print_packet(tv, cred, '@', index, channel, COLOR_CTRL_CLOSE,
15568 "Control Event", label, NULL);
15569 packet_hexdump(data, size);
15574 print_packet(tv, cred, '*', index, NULL, COLOR_ERROR,
15575 "Malformed MGMT Event packet", NULL, NULL);
15576 packet_hexdump(data, size);
15580 opcode = get_le16(data);
15585 for (i = 0; mgmt_event_table[i].str; i++) {
15586 if (mgmt_event_table[i].opcode == opcode) {
15587 mgmt_data = &mgmt_event_table[i];
15593 if (mgmt_data->func)
15594 mgmt_color = COLOR_CTRL_EVENT;
15596 mgmt_color = COLOR_CTRL_EVENT_UNKNOWN;
15597 mgmt_str = mgmt_data->str;
15599 mgmt_color = COLOR_CTRL_EVENT_UNKNOWN;
15600 mgmt_str = "Unknown";
15603 sprintf(extra_str, "(0x%4.4x) plen %d", opcode, size);
15605 print_packet(tv, cred, '@', index, channel, mgmt_color,
15606 "MGMT Event", mgmt_str, extra_str);
15608 if (!mgmt_data || !mgmt_data->func) {
15609 packet_hexdump(data, size);
15613 if (mgmt_data->fixed) {
15614 if (size != mgmt_data->size) {
15615 print_text(COLOR_ERROR, "invalid packet size");
15616 packet_hexdump(data, size);
15620 if (size < mgmt_data->size) {
15621 print_text(COLOR_ERROR, "too short packet");
15622 packet_hexdump(data, size);
15627 mgmt_data->func(data, size);
15630 void packet_todo(void)
15634 printf("HCI commands with missing decodings:\n");
15636 for (i = 0; opcode_table[i].str; i++) {
15637 if (opcode_table[i].bit < 0)
15640 if (opcode_table[i].cmd_func)
15643 printf("\t%s\n", opcode_table[i].str);
15646 printf("HCI events with missing decodings:\n");
15648 for (i = 0; event_table[i].str; i++) {
15649 if (event_table[i].func)
15652 printf("\t%s\n", event_table[i].str);
15655 for (i = 0; le_meta_event_table[i].str; i++) {
15656 if (le_meta_event_table[i].func)
15659 printf("\t%s\n", le_meta_event_table[i].str);
15663 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15664 void print_le_set_adv_parameters_cmd(const void *data, uint8_t size)
15666 uint16_t dummy = 0;
15667 le_set_adv_parameters_cmd(dummy, data, size);
15670 void print_le_set_random_address_cmd(const void *data, uint8_t size)
15672 uint16_t dummy = 0;
15673 le_set_random_address_cmd(dummy, data, size);
15676 void print_le_set_adv_data_cmd(const void *data, uint8_t size)
15678 uint16_t dummy = 0;
15679 le_set_adv_data_cmd(dummy, data, size);
15682 void print_le_set_scan_rsp_data_cmd(const void *data, uint8_t size)
15684 uint16_t dummy = 0;
15685 le_set_scan_rsp_data_cmd(dummy, data, size);
15688 void print_le_set_adv_enable_cmd(const void *data, uint8_t size)
15690 uint16_t dummy = 0;
15691 le_set_adv_enable_cmd(dummy, data, size);