CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
orangepi-xunlong

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.

GitHub Repository: orangepi-xunlong/orangepi-build
Path: blob/next/external/cache/sources/hcitools/monitor/packet.c
Views: 3959
1
/*
2
*
3
* BlueZ - Bluetooth protocol stack for Linux
4
*
5
* Copyright (C) 2011-2012 Intel Corporation
6
* Copyright (C) 2004-2010 Marcel Holtmann <[email protected]>
7
*
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22
*
23
*/
24
25
#ifdef HAVE_CONFIG_H
26
#include <config.h>
27
#endif
28
29
#include <stdio.h>
30
#include <errno.h>
31
#include <ctype.h>
32
#include <unistd.h>
33
#include <stdlib.h>
34
#include <string.h>
35
#include <stdbool.h>
36
#include <inttypes.h>
37
#include <time.h>
38
#include <sys/time.h>
39
40
#include <bluetooth/bluetooth.h>
41
#include <bluetooth/hci.h>
42
#include <bluetooth/hci_lib.h>
43
44
#include "display.h"
45
#include "bt.h"
46
#include "ll.h"
47
#include "uuid.h"
48
#include "l2cap.h"
49
#include "control.h"
50
#include "btsnoop.h"
51
#include "vendor.h"
52
#include "packet.h"
53
54
#define COLOR_INDEX_LABEL COLOR_WHITE
55
#define COLOR_TIMESTAMP COLOR_YELLOW
56
57
#define COLOR_NEW_INDEX COLOR_GREEN
58
#define COLOR_DEL_INDEX COLOR_RED
59
60
#define COLOR_HCI_COMMAND COLOR_BLUE
61
#define COLOR_HCI_COMMAND_UNKNOWN COLOR_WHITE_BG
62
63
#define COLOR_HCI_EVENT COLOR_MAGENTA
64
#define COLOR_HCI_EVENT_UNKNOWN COLOR_WHITE_BG
65
66
#define COLOR_HCI_ACLDATA COLOR_CYAN
67
#define COLOR_HCI_SCODATA COLOR_YELLOW
68
69
#define COLOR_UNKNOWN_FEATURE_BIT COLOR_WHITE_BG
70
#define COLOR_UNKNOWN_EVENT_MASK COLOR_WHITE_BG
71
#define COLOR_UNKNOWN_LE_STATES COLOR_WHITE_BG
72
#define COLOR_UNKNOWN_SERVICE_CLASS COLOR_WHITE_BG
73
74
#define COLOR_PHY_PACKET COLOR_BLUE
75
76
static time_t time_offset = ((time_t) -1);
77
static unsigned long filter_mask = 0;
78
static bool index_filter = false;
79
static uint16_t index_number = 0;
80
static uint16_t index_current = 0;
81
82
#define MAX_CONN 16
83
84
struct conn_data {
85
uint16_t handle;
86
uint8_t type;
87
};
88
89
static struct conn_data conn_list[MAX_CONN];
90
91
static void assign_handle(uint16_t handle, uint8_t type)
92
{
93
int i;
94
95
for (i = 0; i < MAX_CONN; i++) {
96
if (conn_list[i].handle == 0x0000) {
97
conn_list[i].handle = handle;
98
conn_list[i].type = type;
99
break;
100
}
101
}
102
}
103
104
static void release_handle(uint16_t handle)
105
{
106
int i;
107
108
for (i = 0; i < MAX_CONN; i++) {
109
if (conn_list[i].handle == handle) {
110
conn_list[i].handle = 0x0000;
111
conn_list[i].type = 0x00;
112
break;
113
}
114
}
115
}
116
117
static uint8_t get_type(uint16_t handle)
118
{
119
int i;
120
121
for (i = 0; i < MAX_CONN; i++) {
122
if (conn_list[i].handle == handle)
123
return conn_list[i].type;
124
}
125
126
return 0xff;
127
}
128
129
void packet_set_filter(unsigned long filter)
130
{
131
filter_mask = filter;
132
}
133
134
void packet_add_filter(unsigned long filter)
135
{
136
if (index_filter)
137
filter &= ~PACKET_FILTER_SHOW_INDEX;
138
139
filter_mask |= filter;
140
}
141
142
void packet_del_filter(unsigned long filter)
143
{
144
filter_mask &= ~filter;
145
}
146
147
void packet_select_index(uint16_t index)
148
{
149
filter_mask &= ~PACKET_FILTER_SHOW_INDEX;
150
151
index_filter = true;
152
index_number = index;
153
}
154
155
#define print_space(x) printf("%*c", (x), ' ');
156
157
static void print_packet(struct timeval *tv, uint16_t index, char ident,
158
const char *color, const char *label,
159
const char *text, const char *extra)
160
{
161
int col = num_columns();
162
char line[256], ts_str[64];
163
int n, ts_len = 0, ts_pos = 0, len = 0, pos = 0;
164
165
if (filter_mask & PACKET_FILTER_SHOW_INDEX) {
166
if (use_color()) {
167
n = sprintf(ts_str + ts_pos, "%s", COLOR_INDEX_LABEL);
168
if (n > 0)
169
ts_pos += n;
170
}
171
172
n = sprintf(ts_str + ts_pos, " [hci%d]", index);
173
if (n > 0) {
174
ts_pos += n;
175
ts_len += n;
176
}
177
}
178
179
if (tv) {
180
time_t t = tv->tv_sec;
181
struct tm tm;
182
183
localtime_r(&t, &tm);
184
185
if (use_color()) {
186
n = sprintf(ts_str + ts_pos, "%s", COLOR_TIMESTAMP);
187
if (n > 0)
188
ts_pos += n;
189
}
190
191
if (filter_mask & PACKET_FILTER_SHOW_DATE) {
192
n = sprintf(ts_str + ts_pos, " %04d-%02d-%02d",
193
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
194
if (n > 0) {
195
ts_pos += n;
196
ts_len += n;
197
}
198
}
199
200
if (filter_mask & PACKET_FILTER_SHOW_TIME) {
201
n = sprintf(ts_str + ts_pos, " %02d:%02d:%02d.%06lu",
202
tm.tm_hour, tm.tm_min, tm.tm_sec, tv->tv_usec);
203
if (n > 0) {
204
ts_pos += n;
205
ts_len += n;
206
}
207
}
208
209
if (filter_mask & PACKET_FILTER_SHOW_TIME_OFFSET) {
210
n = sprintf(ts_str + ts_pos, " %lu.%06lu",
211
tv->tv_sec - time_offset, tv->tv_usec);
212
if (n > 0) {
213
ts_pos += n;
214
ts_len += n;
215
}
216
}
217
}
218
219
if (use_color()) {
220
n = sprintf(ts_str + ts_pos, "%s", COLOR_OFF);
221
if (n > 0)
222
ts_pos += n;
223
}
224
225
if (use_color()) {
226
n = sprintf(line + pos, "%s", color);
227
if (n > 0)
228
pos += n;
229
}
230
231
n = sprintf(line + pos, "%c %s", ident, label);
232
if (n > 0) {
233
pos += n;
234
len += n;
235
}
236
237
if (text) {
238
int extra_len = extra ? strlen(extra) : 0;
239
int max_len = col - len - extra_len - ts_len - 3;
240
241
n = snprintf(line + pos, max_len + 1, ": %s", text);
242
if (n > max_len) {
243
line[pos + max_len - 1] = '.';
244
line[pos + max_len - 2] = '.';
245
if (line[pos + max_len - 3] == ' ')
246
line[pos + max_len - 3] = '.';
247
248
n = max_len;
249
}
250
251
if (n > 0) {
252
pos += n;
253
len += n;
254
}
255
}
256
257
if (use_color()) {
258
n = sprintf(line + pos, "%s", COLOR_OFF);
259
if (n > 0)
260
pos += n;
261
}
262
263
if (extra) {
264
n = sprintf(line + pos, " %s", extra);
265
if (n > 0) {
266
pos += n;
267
len += n;
268
}
269
}
270
271
if (ts_len > 0) {
272
printf("%s", line);
273
if (len < col)
274
print_space(col - len - ts_len - 1);
275
printf("%s%s\n", use_color() ? COLOR_TIMESTAMP : "", ts_str);
276
} else
277
printf("%s\n", line);
278
}
279
280
static const struct {
281
uint8_t error;
282
const char *str;
283
} error2str_table[] = {
284
{ 0x00, "Success" },
285
{ 0x01, "Unknown HCI Command" },
286
{ 0x02, "Unknown Connection Identifier" },
287
{ 0x03, "Hardware Failure" },
288
{ 0x04, "Page Timeout" },
289
{ 0x05, "Authentication Failure" },
290
{ 0x06, "PIN or Key Missing" },
291
{ 0x07, "Memory Capacity Exceeded" },
292
{ 0x08, "Connection Timeout" },
293
{ 0x09, "Connection Limit Exceeded" },
294
{ 0x0a, "Synchronous Connection Limit to a Device Exceeded" },
295
{ 0x0b, "ACL Connection Already Exists" },
296
{ 0x0c, "Command Disallowed" },
297
{ 0x0d, "Connection Rejected due to Limited Resources" },
298
{ 0x0e, "Connection Rejected due to Security Reasons" },
299
{ 0x0f, "Connection Rejected due to Unacceptable BD_ADDR" },
300
{ 0x10, "Connection Accept Timeout Exceeded" },
301
{ 0x11, "Unsupported Feature or Parameter Value" },
302
{ 0x12, "Invalid HCI Command Parameters" },
303
{ 0x13, "Remote User Terminated Connection" },
304
{ 0x14, "Remote Device Terminated due to Low Resources" },
305
{ 0x15, "Remote Device Terminated due to Power Off" },
306
{ 0x16, "Connection Terminated By Local Host" },
307
{ 0x17, "Repeated Attempts" },
308
{ 0x18, "Pairing Not Allowed" },
309
{ 0x19, "Unknown LMP PDU" },
310
{ 0x1a, "Unsupported Remote Feature / Unsupported LMP Feature" },
311
{ 0x1b, "SCO Offset Rejected" },
312
{ 0x1c, "SCO Interval Rejected" },
313
{ 0x1d, "SCO Air Mode Rejected" },
314
{ 0x1e, "Invalid LMP Parameters" },
315
{ 0x1f, "Unspecified Error" },
316
{ 0x20, "Unsupported LMP Parameter Value" },
317
{ 0x21, "Role Change Not Allowed" },
318
{ 0x22, "LMP Response Timeout / LL Response Timeout" },
319
{ 0x23, "LMP Error Transaction Collision" },
320
{ 0x24, "LMP PDU Not Allowed" },
321
{ 0x25, "Encryption Mode Not Acceptable" },
322
{ 0x26, "Link Key cannot be Changed" },
323
{ 0x27, "Requested QoS Not Supported" },
324
{ 0x28, "Instant Passed" },
325
{ 0x29, "Pairing With Unit Key Not Supported" },
326
{ 0x2a, "Different Transaction Collision" },
327
{ 0x2b, "Reserved" },
328
{ 0x2c, "QoS Unacceptable Parameter" },
329
{ 0x2d, "QoS Rejected" },
330
{ 0x2e, "Channel Classification Not Supported" },
331
{ 0x2f, "Insufficient Security" },
332
{ 0x30, "Parameter Out Of Manadatory Range" },
333
{ 0x31, "Reserved" },
334
{ 0x32, "Role Switch Pending" },
335
{ 0x33, "Reserved" },
336
{ 0x34, "Reserved Slot Violation" },
337
{ 0x35, "Role Switch Failed" },
338
{ 0x36, "Extended Inquiry Response Too Large" },
339
{ 0x37, "Secure Simple Pairing Not Supported By Host" },
340
{ 0x38, "Host Busy - Pairing" },
341
{ 0x39, "Connection Rejected due to No Suitable Channel Found" },
342
{ 0x3a, "Controller Busy" },
343
{ 0x3b, "Unacceptable Connection Interval" },
344
{ 0x3c, "Directed Advertising Timeout" },
345
{ 0x3d, "Connection Terminated due to MIC Failure" },
346
{ 0x3e, "Connection Failed to be Established" },
347
{ 0x3f, "MAC Connection Failed" },
348
{ }
349
};
350
351
static void print_error(const char *label, uint8_t error)
352
{
353
const char *str = "Unknown";
354
const char *color_on, *color_off;
355
int i;
356
357
for (i = 0; error2str_table[i].str; i++) {
358
if (error2str_table[i].error == error) {
359
str = error2str_table[i].str;
360
break;
361
}
362
}
363
364
if (use_color()) {
365
if (error)
366
color_on = COLOR_RED;
367
else
368
color_on = COLOR_GREEN;
369
color_off = COLOR_OFF;
370
} else {
371
color_on = "";
372
color_off = "";
373
}
374
375
print_field("%s: %s%s%s (0x%2.2x)", label,
376
color_on, str, color_off, error);
377
}
378
379
static void print_status(uint8_t status)
380
{
381
print_error("Status", status);
382
}
383
384
static void print_reason(uint8_t reason)
385
{
386
print_error("Reason", reason);
387
}
388
389
static void print_bdaddr(const uint8_t *bdaddr)
390
{
391
print_field("Address: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
392
" (OUI %2.2X-%2.2X-%2.2X)",
393
bdaddr[5], bdaddr[4], bdaddr[3],
394
bdaddr[2], bdaddr[1], bdaddr[0],
395
bdaddr[5], bdaddr[4], bdaddr[3]);
396
}
397
398
static void print_addr(const char *label, const uint8_t *addr,
399
uint8_t addr_type)
400
{
401
const char *str;
402
403
switch (addr_type) {
404
case 0x00:
405
print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"
406
" (OUI %2.2X-%2.2X-%2.2X)", label,
407
addr[5], addr[4], addr[3],
408
addr[2], addr[1], addr[0],
409
addr[5], addr[4], addr[3]);
410
break;
411
case 0x01:
412
switch ((addr[5] & 0xc0) >> 6) {
413
case 0x00:
414
str = "Non-Resolvable";
415
break;
416
case 0x01:
417
str = "Resolvable";
418
break;
419
case 0x03:
420
str = "Static";
421
break;
422
default:
423
str = "Reserved";
424
break;
425
}
426
427
print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X (%s)",
428
label, addr[5], addr[4], addr[3],
429
addr[2], addr[1], addr[0], str);
430
break;
431
default:
432
print_field("%s: %2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X",
433
label, addr[5], addr[4], addr[3],
434
addr[2], addr[1], addr[0]);
435
break;
436
}
437
}
438
439
static void print_addr_type(const char *label, uint8_t addr_type)
440
{
441
const char *str;
442
443
switch (addr_type) {
444
case 0x00:
445
str = "Public";
446
break;
447
case 0x01:
448
str = "Random";
449
break;
450
default:
451
str = "Reserved";
452
break;
453
}
454
455
print_field("%s: %s (0x%2.2x)", label, str, addr_type);
456
}
457
458
static void print_handle(uint16_t handle)
459
{
460
print_field("Handle: %d", btohs(handle));
461
}
462
463
static void print_phy_handle(uint8_t phy_handle)
464
{
465
print_field("Physical handle: %d", phy_handle);
466
}
467
468
static void print_pkt_type(uint16_t pkt_type)
469
{
470
print_field("Packet type: 0x%4.4x", btohs(pkt_type));
471
}
472
473
static void print_iac(const uint8_t *lap)
474
{
475
const char *str = "";
476
477
if (lap[2] == 0x9e && lap[1] == 0x8b) {
478
switch (lap[0]) {
479
case 0x33:
480
str = " (General Inquiry)";
481
break;
482
case 0x00:
483
str = " (Limited Inquiry)";
484
break;
485
}
486
}
487
488
print_field("Access code: 0x%2.2x%2.2x%2.2x%s",
489
lap[2], lap[1], lap[0], str);
490
}
491
492
static void print_auth_enable(uint8_t enable)
493
{
494
const char *str;
495
496
switch (enable) {
497
case 0x00:
498
str = "Authentication not required";
499
break;
500
case 0x01:
501
str = "Authentication required for all connections";
502
break;
503
default:
504
str = "Reserved";
505
break;
506
}
507
508
print_field("Enable: %s (0x%2.2x)", str, enable);
509
}
510
511
static void print_encrypt_mode(uint8_t mode)
512
{
513
const char *str;
514
515
switch (mode) {
516
case 0x00:
517
str = "Encryption not required";
518
break;
519
case 0x01:
520
str = "Encryption required for all connections";
521
break;
522
default:
523
str = "Reserved";
524
break;
525
}
526
527
print_field("Mode: %s (0x%2.2x)", str, mode);
528
}
529
530
static const struct {
531
uint8_t bit;
532
const char *str;
533
} svc_class_table[] = {
534
{ 0, "Positioning (Location identification)" },
535
{ 1, "Networking (LAN, Ad hoc)" },
536
{ 2, "Rendering (Printing, Speaker)" },
537
{ 3, "Capturing (Scanner, Microphone)" },
538
{ 4, "Object Transfer (v-Inbox, v-Folder)" },
539
{ 5, "Audio (Speaker, Microphone, Headset)" },
540
{ 6, "Telephony (Cordless telephony, Modem, Headset)" },
541
{ 7, "Information (WEB-server, WAP-server)" },
542
{ }
543
};
544
545
static const struct {
546
uint8_t val;
547
const char *str;
548
} major_class_computer_table[] = {
549
{ 0x00, "Uncategorized, code for device not assigned" },
550
{ 0x01, "Desktop workstation" },
551
{ 0x02, "Server-class computer" },
552
{ 0x03, "Laptop" },
553
{ 0x04, "Handheld PC/PDA (clam shell)" },
554
{ 0x05, "Palm sized PC/PDA" },
555
{ 0x06, "Wearable computer (Watch sized)" },
556
{ 0x07, "Tablet" },
557
{ }
558
};
559
560
static const char *major_class_computer(uint8_t minor)
561
{
562
int i;
563
564
for (i = 0; major_class_computer_table[i].str; i++) {
565
if (major_class_computer_table[i].val == minor)
566
return major_class_computer_table[i].str;
567
}
568
569
return NULL;
570
}
571
572
static const struct {
573
uint8_t val;
574
const char *str;
575
} major_class_phone_table[] = {
576
{ 0x00, "Uncategorized, code for device not assigned" },
577
{ 0x01, "Cellular" },
578
{ 0x02, "Cordless" },
579
{ 0x03, "Smart phone" },
580
{ 0x04, "Wired modem or voice gateway" },
581
{ 0x05, "Common ISDN Access" },
582
{ }
583
};
584
585
static const char *major_class_phone(uint8_t minor)
586
{
587
int i;
588
589
for (i = 0; major_class_phone_table[i].str; i++) {
590
if (major_class_phone_table[i].val == minor)
591
return major_class_phone_table[i].str;
592
}
593
594
return NULL;
595
}
596
597
static const struct {
598
uint8_t val;
599
const char *str;
600
} major_class_av_table[] = {
601
{ 0x00, "Uncategorized, code for device not assigned" },
602
{ 0x01, "earable Headset Device" },
603
{ 0x02, "Hands-free Device" },
604
{ 0x04, "Microphone" },
605
{ 0x05, "Loudspeaker" },
606
{ 0x06, "Headphones" },
607
{ 0x07, "Portable Audio" },
608
{ 0x08, "Car audio" },
609
{ 0x09, "Set-top box" },
610
{ 0x0a, "HiFi Audio Device" },
611
{ 0x0b, "VCR" },
612
{ 0x0c, "Video Camera" },
613
{ 0x0d, "Camcorder" },
614
{ 0x0e, "Video Monitor" },
615
{ 0x0f, "Video Display and Loudspeaker" },
616
{ 0x10, "Video Conferencing" },
617
{ 0x12, "Gaming/Toy" },
618
{ }
619
};
620
621
static const char *major_class_av(uint8_t minor)
622
{
623
int i;
624
625
for (i = 0; major_class_av_table[i].str; i++) {
626
if (major_class_av_table[i].val == minor)
627
return major_class_av_table[i].str;
628
}
629
630
return NULL;
631
}
632
633
static const struct {
634
uint8_t val;
635
const char *str;
636
} major_class_wearable_table[] = {
637
{ 0x01, "Wrist Watch" },
638
{ 0x02, "Pager" },
639
{ 0x03, "Jacket" },
640
{ 0x04, "Helmet" },
641
{ 0x05, "Glasses" },
642
{ }
643
};
644
645
static const char *major_class_wearable(uint8_t minor)
646
{
647
int i;
648
649
for (i = 0; major_class_wearable_table[i].str; i++) {
650
if (major_class_wearable_table[i].val == minor)
651
return major_class_wearable_table[i].str;
652
}
653
654
return NULL;
655
}
656
657
static const struct {
658
uint8_t val;
659
const char *str;
660
const char *(*func)(uint8_t minor);
661
} major_class_table[] = {
662
{ 0x00, "Miscellaneous" },
663
{ 0x01, "Computer (desktop, notebook, PDA, organizers)",
664
major_class_computer },
665
{ 0x02, "Phone (cellular, cordless, payphone, modem)",
666
major_class_phone },
667
{ 0x03, "LAN /Network Access point" },
668
{ 0x04, "Audio/Video (headset, speaker, stereo, video, vcr)",
669
major_class_av },
670
{ 0x05, "Peripheral (mouse, joystick, keyboards)" },
671
{ 0x06, "Imaging (printing, scanner, camera, display)" },
672
{ 0x07, "Wearable", major_class_wearable },
673
{ 0x08, "Toy" },
674
{ 0x09, "Health" },
675
{ 0x1f, "Uncategorized, specific device code not specified" },
676
{ }
677
};
678
679
static void print_dev_class(const uint8_t *dev_class)
680
{
681
uint8_t mask, major_cls, minor_cls;
682
const char *major_str = NULL;
683
const char *minor_str = NULL;
684
int i;
685
686
print_field("Class: 0x%2.2x%2.2x%2.2x",
687
dev_class[2], dev_class[1], dev_class[0]);
688
689
if ((dev_class[0] & 0x03) != 0x00) {
690
print_field(" Format type: 0x%2.2x", dev_class[0] & 0x03);
691
print_text(COLOR_ERROR, " invalid format type");
692
return;
693
}
694
695
major_cls = dev_class[1] & 0x1f;
696
minor_cls = (dev_class[0] & 0xfc) >> 2;
697
698
for (i = 0; major_class_table[i].str; i++) {
699
if (major_class_table[i].val == major_cls) {
700
major_str = major_class_table[i].str;
701
702
if (!major_class_table[i].func)
703
break;
704
705
minor_str = major_class_table[i].func(minor_cls);
706
break;
707
}
708
}
709
710
if (major_str) {
711
print_field(" Major class: %s", major_str);
712
if (minor_str)
713
print_field(" Minor class: %s", minor_str);
714
else
715
print_field(" Minor class: 0x%2.2x", minor_cls);
716
} else {
717
print_field(" Major class: 0x%2.2x", major_cls);
718
print_field(" Minor class: 0x%2.2x", minor_cls);
719
}
720
721
if (dev_class[1] & 0x20)
722
print_field(" Limited Discoverable Mode");
723
724
if ((dev_class[1] & 0xc0) != 0x00) {
725
print_text(COLOR_ERROR, " invalid service class");
726
return;
727
}
728
729
mask = dev_class[2];
730
731
for (i = 0; svc_class_table[i].str; i++) {
732
if (dev_class[2] & (1 << svc_class_table[i].bit)) {
733
print_field(" %s", svc_class_table[i].str);
734
mask &= ~(1 << svc_class_table[i].bit);
735
}
736
}
737
738
if (mask)
739
print_text(COLOR_UNKNOWN_SERVICE_CLASS,
740
" Unknown service class (0x%2.2x)", mask);
741
}
742
743
static void print_voice_setting(uint16_t setting)
744
{
745
print_field("Setting: 0x%4.4x", btohs(setting));
746
}
747
748
static void print_retransmission_effort(uint8_t effort)
749
{
750
const char *str;
751
752
switch (effort) {
753
case 0x00:
754
str = "No retransmissions";
755
break;
756
case 0x01:
757
str = "Optimize for power consumption";
758
break;
759
case 0x02:
760
str = "Optimize for link quality";
761
break;
762
case 0xff:
763
str = "Don't care";
764
break;
765
default:
766
str = "Reserved";
767
break;
768
}
769
770
print_field("Retransmission effort: %s (0x%2.2x)", str, effort);
771
}
772
773
static void print_scan_enable(uint8_t scan_enable)
774
{
775
const char *str;
776
777
switch (scan_enable) {
778
case 0x00:
779
str = "No Scans";
780
break;
781
case 0x01:
782
str = "Inquiry Scan";
783
break;
784
case 0x02:
785
str = "Page Scan";
786
break;
787
case 0x03:
788
str = "Inquiry Scan + Page Scan";
789
break;
790
default:
791
str = "Reserved";
792
break;
793
}
794
795
print_field("Scan enable: %s (0x%2.2x)", str, scan_enable);
796
}
797
798
static void print_link_policy(uint16_t link_policy)
799
{
800
print_field("Link policy: 0x%4.4x", btohs(link_policy));
801
}
802
803
static void print_air_mode(uint8_t mode)
804
{
805
const char *str;
806
807
switch (mode) {
808
case 0x00:
809
str = "u-law log";
810
break;
811
case 0x01:
812
str = "A-law log";
813
break;
814
case 0x02:
815
str = "CVSD";
816
break;
817
case 0x03:
818
str = "Transparent";
819
break;
820
default:
821
str = "Reserved";
822
break;
823
}
824
825
print_field("Air mode: %s (0x%2.2x)", str, mode);
826
}
827
828
static void print_inquiry_mode(uint8_t mode)
829
{
830
const char *str;
831
832
switch (mode) {
833
case 0x00:
834
str = "Standard Inquiry Result";
835
break;
836
case 0x01:
837
str = "Inquiry Result with RSSI";
838
break;
839
case 0x02:
840
str = "Inquiry Result with RSSI or Extended Inquiry Result";
841
break;
842
default:
843
str = "Reserved";
844
break;
845
}
846
847
print_field("Mode: %s (0x%2.2x)", str, mode);
848
}
849
850
static void print_inquiry_scan_type(uint8_t type)
851
{
852
const char *str;
853
854
switch (type) {
855
case 0x00:
856
str = "Standard Scan";
857
break;
858
case 0x01:
859
str = "Interlaced Scan";
860
break;
861
default:
862
str = "Reserved";
863
break;
864
}
865
866
print_field("Type: %s (0x%2.2x)", str, type);
867
}
868
869
static void print_pscan_type(uint8_t type)
870
{
871
const char *str;
872
873
switch (type) {
874
case 0x00:
875
str = "Standard Scan";
876
break;
877
case 0x01:
878
str = "Interlaced Scan";
879
break;
880
default:
881
str = "Reserved";
882
break;
883
}
884
885
print_field("Type: %s (0x%2.2x)", str, type);
886
}
887
888
static void print_afh_mode(uint8_t mode)
889
{
890
const char *str;
891
892
switch (mode) {
893
case 0x00:
894
str = "Disabled";
895
break;
896
case 0x01:
897
str = "Enabled";
898
break;
899
break;
900
default:
901
str = "Reserved";
902
break;
903
}
904
905
print_field("Mode: %s (0x%2.2x)", str, mode);
906
}
907
908
static void print_simple_pairing_mode(uint8_t mode)
909
{
910
const char *str;
911
912
switch (mode) {
913
case 0x00:
914
str = "Disabled";
915
break;
916
case 0x01:
917
str = "Enabled";
918
break;
919
default:
920
str = "Reserved";
921
break;
922
}
923
924
print_field("Mode: %s (0x%2.2x)", str, mode);
925
}
926
927
static void print_pscan_rep_mode(uint8_t pscan_rep_mode)
928
{
929
const char *str;
930
931
switch (pscan_rep_mode) {
932
case 0x00:
933
str = "R0";
934
break;
935
case 0x01:
936
str = "R1";
937
break;
938
case 0x02:
939
str = "R2";
940
break;
941
default:
942
str = "Reserved";
943
break;
944
}
945
946
print_field("Page scan repetition mode: %s (0x%2.2x)",
947
str, pscan_rep_mode);
948
}
949
950
static void print_pscan_period_mode(uint8_t pscan_period_mode)
951
{
952
const char *str;
953
954
switch (pscan_period_mode) {
955
case 0x00:
956
str = "P0";
957
break;
958
case 0x01:
959
str = "P1";
960
break;
961
case 0x02:
962
str = "P2";
963
break;
964
default:
965
str = "Reserved";
966
break;
967
}
968
969
print_field("Page period mode: %s (0x%2.2x)", str, pscan_period_mode);
970
}
971
972
static void print_pscan_mode(uint8_t pscan_mode)
973
{
974
const char *str;
975
976
switch (pscan_mode) {
977
case 0x00:
978
str = "Mandatory";
979
break;
980
case 0x01:
981
str = "Optional I";
982
break;
983
case 0x02:
984
str = "Optional II";
985
break;
986
case 0x03:
987
str = "Optional III";
988
break;
989
default:
990
str = "Reserved";
991
break;
992
}
993
994
print_field("Page scan mode: %s (0x%2.2x)", str, pscan_mode);
995
}
996
997
static void print_clock_offset(uint16_t clock_offset)
998
{
999
print_field("Clock offset: 0x%4.4x", btohs(clock_offset));
1000
}
1001
1002
static void print_clock(uint32_t clock)
1003
{
1004
print_field("Clock: 0x%8.8x", btohl(clock));
1005
}
1006
1007
static void print_clock_accuracy(uint16_t accuracy)
1008
{
1009
if (btohs(accuracy) == 0xffff)
1010
print_field("Accuracy: Unknown (0x%4.4x)", btohs(accuracy));
1011
else
1012
print_field("Accuracy: %.4f msec (0x%4.4x)",
1013
btohs(accuracy) * 0.3125, btohs(accuracy));
1014
}
1015
1016
static void print_link_type(uint8_t link_type)
1017
{
1018
const char *str;
1019
1020
switch (link_type) {
1021
case 0x00:
1022
str = "SCO";
1023
break;
1024
case 0x01:
1025
str = "ACL";
1026
break;
1027
case 0x02:
1028
str = "eSCO";
1029
break;
1030
default:
1031
str = "Reserved";
1032
break;
1033
}
1034
1035
print_field("Link type: %s (0x%2.2x)", str, link_type);
1036
}
1037
1038
static void print_encr_mode(uint8_t encr_mode)
1039
{
1040
const char *str;
1041
1042
switch (encr_mode) {
1043
case 0x00:
1044
str = "Disabled";
1045
break;
1046
case 0x01:
1047
str = "Enabled";
1048
break;
1049
default:
1050
str = "Reserved";
1051
break;
1052
}
1053
1054
print_field("Encryption: %s (0x%2.2x)", str, encr_mode);
1055
}
1056
1057
static void print_encr_mode_change(uint8_t encr_mode, uint16_t handle)
1058
{
1059
const char *str;
1060
uint8_t conn_type;
1061
1062
conn_type = get_type(btohs(handle));
1063
1064
switch (encr_mode) {
1065
case 0x00:
1066
str = "Disabled";
1067
break;
1068
case 0x01:
1069
switch (conn_type) {
1070
case 0x00:
1071
str = "Enabled with E0";
1072
break;
1073
case 0x01:
1074
str = "Enabled with AES-CCM";
1075
break;
1076
default:
1077
str = "Enabled";
1078
break;
1079
}
1080
break;
1081
default:
1082
str = "Reserved";
1083
break;
1084
}
1085
1086
print_field("Encryption: %s (0x%2.2x)", str, encr_mode);
1087
}
1088
1089
static void print_pin_type(uint8_t pin_type)
1090
{
1091
const char *str;
1092
1093
switch (pin_type) {
1094
case 0x00:
1095
str = "Variable";
1096
break;
1097
case 0x01:
1098
str = "Fixed";
1099
break;
1100
default:
1101
str = "Reserved";
1102
break;
1103
}
1104
1105
print_field("PIN type: %s (0x%2.2x)", str, pin_type);
1106
}
1107
1108
static void print_key_flag(uint8_t key_flag)
1109
{
1110
const char *str;
1111
1112
switch (key_flag) {
1113
case 0x00:
1114
str = "Semi-permanent";
1115
break;
1116
case 0x01:
1117
str = "Temporary";
1118
break;
1119
default:
1120
str = "Reserved";
1121
break;
1122
}
1123
1124
print_field("Key flag: %s (0x%2.2x)", str, key_flag);
1125
}
1126
1127
static void print_key_len(uint8_t key_len)
1128
{
1129
const char *str;
1130
1131
switch (key_len) {
1132
case 32:
1133
str = "802.11 PAL";
1134
break;
1135
default:
1136
str = "Reserved";
1137
break;
1138
}
1139
1140
print_field("Key length: %s (%d)", str, key_len);
1141
}
1142
1143
static void print_key_type(uint8_t key_type)
1144
{
1145
const char *str;
1146
1147
switch (key_type) {
1148
case 0x00:
1149
str = "Combination key";
1150
break;
1151
case 0x01:
1152
str = "Local Unit key";
1153
break;
1154
case 0x02:
1155
str = "Remote Unit key";
1156
break;
1157
case 0x03:
1158
str = "Debug Combination key";
1159
break;
1160
case 0x04:
1161
str = "Unauthenticated Combination key";
1162
break;
1163
case 0x05:
1164
str = "Authenticated Combination key";
1165
break;
1166
case 0x06:
1167
str = "Changed Combination key";
1168
break;
1169
default:
1170
str = "Reserved";
1171
break;
1172
}
1173
1174
print_field("Key type: %s (0x%2.2x)", str, key_type);
1175
}
1176
1177
static void print_key_size(uint8_t key_size)
1178
{
1179
print_field("Key size: %d", key_size);
1180
}
1181
1182
static void print_hex_field(const char *label, const uint8_t *data,
1183
uint8_t len)
1184
{
1185
char str[len * 2 + 1];
1186
uint8_t i;
1187
1188
str[0] = '\0';
1189
1190
for (i = 0; i < len; i++)
1191
sprintf(str + (i * 2), "%2.2x", data[i]);
1192
1193
print_field("%s: %s", label, str);
1194
}
1195
1196
static void print_key(const char *label, const uint8_t *link_key)
1197
{
1198
print_hex_field(label, link_key, 16);
1199
}
1200
1201
static void print_link_key(const uint8_t *link_key)
1202
{
1203
print_key("Link key", link_key);
1204
}
1205
1206
static void print_pin_code(const uint8_t *pin_code, uint8_t pin_len)
1207
{
1208
char str[pin_len + 1];
1209
uint8_t i;
1210
1211
for (i = 0; i < pin_len; i++)
1212
sprintf(str + i, "%c", (const char) pin_code[i]);
1213
1214
print_field("PIN code: %s", str);
1215
}
1216
1217
static void print_hash(const char *label, const uint8_t *hash)
1218
{
1219
print_key("Hash C from %s", hash);
1220
}
1221
1222
static void print_randomizer(const char *label, const uint8_t *randomizer)
1223
{
1224
print_key("Randomizer R with %s", randomizer);
1225
}
1226
1227
static void print_passkey(uint32_t passkey)
1228
{
1229
print_field("Passkey: %06d", btohl(passkey));
1230
}
1231
1232
static void print_io_capability(uint8_t capability)
1233
{
1234
const char *str;
1235
1236
switch (capability) {
1237
case 0x00:
1238
str = "DisplayOnly";
1239
break;
1240
case 0x01:
1241
str = "DisplayYesNo";
1242
break;
1243
case 0x02:
1244
str = "KeyboardOnly";
1245
break;
1246
case 0x03:
1247
str = "NoInputNoOutput";
1248
break;
1249
default:
1250
str = "Reserved";
1251
break;
1252
}
1253
1254
print_field("IO capability: %s (0x%2.2x)", str, capability);
1255
}
1256
1257
static void print_oob_data(uint8_t oob_data)
1258
{
1259
const char *str;
1260
1261
switch (oob_data) {
1262
case 0x00:
1263
str = "Authentication data not present";
1264
break;
1265
case 0x01:
1266
str = "Authentication data present";
1267
break;
1268
default:
1269
str = "Reserved";
1270
break;
1271
}
1272
1273
print_field("OOB data: %s (0x%2.2x)", str, oob_data);
1274
}
1275
1276
static void print_authentication(uint8_t authentication)
1277
{
1278
const char *str;
1279
1280
switch (authentication) {
1281
case 0x00:
1282
str = "No Bonding - MITM not required";
1283
break;
1284
case 0x01:
1285
str = "No Bonding - MITM required";
1286
break;
1287
case 0x02:
1288
str = "Dedicated Bonding - MITM not required";
1289
break;
1290
case 0x03:
1291
str = "Dedicated Bonding - MITM required";
1292
break;
1293
case 0x04:
1294
str = "General Bonding - MITM not required";
1295
break;
1296
case 0x05:
1297
str = "General Bonding - MITM required";
1298
break;
1299
default:
1300
str = "Reserved";
1301
break;
1302
}
1303
1304
print_field("Authentication: %s (0x%2.2x)", str, authentication);
1305
}
1306
1307
static void print_location_domain_aware(uint8_t aware)
1308
{
1309
const char *str;
1310
1311
switch (aware) {
1312
case 0x00:
1313
str = "Regulatory domain unknown";
1314
break;
1315
case 0x01:
1316
str = "Regulatory domain known";
1317
break;
1318
default:
1319
str = "Reserved";
1320
break;
1321
}
1322
1323
print_field("Domain aware: %s (0x%2.2x)", str, aware);
1324
}
1325
1326
static void print_location_domain(const uint8_t *domain)
1327
{
1328
print_field("Domain: %c%c (0x%2.2x%2.2x)",
1329
(char) domain[0], (char) domain[1], domain[0], domain[1]);
1330
}
1331
1332
static void print_location_domain_options(uint8_t options)
1333
{
1334
print_field("Domain options: %c (0x%2.2x)", (char) options, options);
1335
}
1336
1337
static void print_location_options(uint8_t options)
1338
{
1339
print_field("Options: 0x%2.2x", options);
1340
}
1341
1342
static void print_flow_control_mode(uint8_t mode)
1343
{
1344
const char *str;
1345
1346
switch (mode) {
1347
case 0x00:
1348
str = "Packet based";
1349
break;
1350
case 0x01:
1351
str = "Data block based";
1352
break;
1353
default:
1354
str = "Reserved";
1355
break;
1356
}
1357
1358
print_field("Flow control mode: %s (0x%2.2x)", str, mode);
1359
}
1360
1361
static void print_flow_direction(uint8_t direction)
1362
{
1363
const char *str;
1364
1365
switch (direction) {
1366
case 0x00:
1367
str = "Outgoing";
1368
break;
1369
case 0x01:
1370
str = "Incoming";
1371
break;
1372
default:
1373
str = "Reserved";
1374
break;
1375
}
1376
1377
print_field("Flow direction: %s (0x%2.2x)", str, direction);
1378
}
1379
1380
static void print_service_type(uint8_t service_type)
1381
{
1382
const char *str;
1383
1384
switch (service_type) {
1385
case 0x00:
1386
str = "No Traffic";
1387
break;
1388
case 0x01:
1389
str = "Best Effort";
1390
break;
1391
case 0x02:
1392
str = "Guaranteed";
1393
break;
1394
default:
1395
str = "Reserved";
1396
break;
1397
}
1398
1399
print_field("Service type: %s (0x%2.2x)", str, service_type);
1400
}
1401
1402
static void print_flow_spec(const char *label, const uint8_t *data)
1403
{
1404
const char *str;
1405
1406
switch (data[1]) {
1407
case 0x00:
1408
str = "No traffic";
1409
break;
1410
case 0x01:
1411
str = "Best effort";
1412
break;
1413
case 0x02:
1414
str = "Guaranteed";
1415
break;
1416
default:
1417
str = "Reserved";
1418
break;
1419
}
1420
1421
print_field("%s flow spec: 0x%2.2x", label, data[0]);
1422
print_field(" Service type: %s (0x%2.2x)", str, data[1]);
1423
print_field(" Maximum SDU size: 0x%4.4x", bt_get_le16(data + 2));
1424
print_field(" SDU inter-arrival time: 0x%8.8x", bt_get_le32(data + 4));
1425
print_field(" Access latency: 0x%8.8x", bt_get_le32(data + 8));
1426
print_field(" Flush timeout: 0x%8.8x", bt_get_le32(data + 12));
1427
}
1428
1429
static void print_short_range_mode(uint8_t mode)
1430
{
1431
const char *str;
1432
1433
switch (mode) {
1434
case 0x00:
1435
str = "Disabled";
1436
break;
1437
case 0x01:
1438
str = "Enabled";
1439
break;
1440
default:
1441
str = "Reserved";
1442
break;
1443
}
1444
1445
print_field("Short range mode: %s (0x%2.2x)", str, mode);
1446
}
1447
1448
static void print_amp_status(uint8_t amp_status)
1449
{
1450
const char *str;
1451
1452
switch (amp_status) {
1453
case 0x00:
1454
str = "Present";
1455
break;
1456
case 0x01:
1457
str = "Bluetooth only";
1458
break;
1459
case 0x02:
1460
str = "No capacity";
1461
break;
1462
case 0x03:
1463
str = "Low capacity";
1464
break;
1465
case 0x04:
1466
str = "Medium capacity";
1467
break;
1468
case 0x05:
1469
str = "High capacity";
1470
break;
1471
case 0x06:
1472
str = "Full capacity";
1473
break;
1474
default:
1475
str = "Reserved";
1476
break;
1477
}
1478
1479
print_field("AMP status: %s (0x%2.2x)", str, amp_status);
1480
}
1481
1482
static void print_num_resp(uint8_t num_resp)
1483
{
1484
print_field("Num responses: %d", num_resp);
1485
}
1486
1487
static void print_num_reports(uint8_t num_reports)
1488
{
1489
print_field("Num reports: %d", num_reports);
1490
}
1491
1492
static void print_rssi(int8_t rssi)
1493
{
1494
if ((uint8_t) rssi == 0x99 || rssi == 127)
1495
print_field("RSSI: invalid (0x%2.2x)", (uint8_t) rssi);
1496
else
1497
print_field("RSSI: %d dBm (0x%2.2x)", rssi, (uint8_t) rssi);
1498
}
1499
1500
static void print_slot_625(const char *label, uint16_t value)
1501
{
1502
print_field("%s: %.3f msec (0x%4.4x)", label,
1503
btohs(value) * 0.625, btohs(value));
1504
}
1505
1506
static void print_slot_125(const char *label, uint16_t value)
1507
{
1508
print_field("%s: %.2f msec (0x%4.4x)", label,
1509
btohs(value) * 1.25, btohs(value));
1510
}
1511
1512
static void print_timeout(uint16_t timeout)
1513
{
1514
print_slot_625("Timeout", timeout);
1515
}
1516
1517
static void print_interval(uint16_t interval)
1518
{
1519
print_slot_625("Interval", interval);
1520
}
1521
1522
static void print_window(uint16_t window)
1523
{
1524
print_slot_625("Window", window);
1525
}
1526
1527
static void print_role(uint8_t role)
1528
{
1529
const char *str;
1530
1531
switch (role) {
1532
case 0x00:
1533
str = "Master";
1534
break;
1535
case 0x01:
1536
str = "Slave";
1537
break;
1538
default:
1539
str = "Reserved";
1540
break;
1541
}
1542
1543
print_field("Role: %s (0x%2.2x)", str, role);
1544
}
1545
1546
static void print_mode(uint8_t mode)
1547
{
1548
const char *str;
1549
1550
switch (mode) {
1551
case 0x00:
1552
str = "Active";
1553
break;
1554
case 0x01:
1555
str = "Hold";
1556
break;
1557
case 0x02:
1558
str = "Sniff";
1559
break;
1560
case 0x03:
1561
str = "Park";
1562
break;
1563
default:
1564
str = "Reserved";
1565
break;
1566
}
1567
1568
print_field("Mode: %s (0x%2.2x)", str, mode);
1569
}
1570
1571
static void print_name(const uint8_t *name)
1572
{
1573
char str[249];
1574
1575
memcpy(str, name, 248);
1576
str[248] = '\0';
1577
1578
print_field("Name: %s", str);
1579
}
1580
1581
static void print_channel_map(const uint8_t *map)
1582
{
1583
char str[21];
1584
int i;
1585
1586
for (i = 0; i < 10; i++)
1587
sprintf(str + (i * 2), "%2.2x", map[i]);
1588
1589
print_field("Channel map: 0x%s", str);
1590
}
1591
1592
void packet_print_version(const char *label, uint8_t version,
1593
const char *sublabel, uint16_t subversion)
1594
{
1595
const char *str;
1596
1597
switch (version) {
1598
case 0x00:
1599
str = "Bluetooth 1.0b";
1600
break;
1601
case 0x01:
1602
str = "Bluetooth 1.1";
1603
break;
1604
case 0x02:
1605
str = "Bluetooth 1.2";
1606
break;
1607
case 0x03:
1608
str = "Bluetooth 2.0";
1609
break;
1610
case 0x04:
1611
str = "Bluetooth 2.1";
1612
break;
1613
case 0x05:
1614
str = "Bluetooth 3.0";
1615
break;
1616
case 0x06:
1617
str = "Bluetooth 4.0";
1618
break;
1619
case 0x07:
1620
str = "Bluetooth 4.1";
1621
break;
1622
default:
1623
str = "Reserved";
1624
break;
1625
}
1626
1627
print_field("%s: %s (0x%2.2x) - %s %d (0x%4.4x)", label, str, version,
1628
sublabel, subversion, subversion);
1629
}
1630
1631
static void print_hci_version(uint8_t version, uint16_t revision)
1632
{
1633
packet_print_version("HCI version", version,
1634
"Revision", btohs(revision));
1635
}
1636
1637
static void print_lmp_version(uint8_t version, uint16_t subversion)
1638
{
1639
packet_print_version("LMP version", version,
1640
"Subversion", btohs(subversion));
1641
}
1642
1643
static void print_pal_version(uint8_t version, uint16_t subversion)
1644
{
1645
const char *str;
1646
1647
switch (version) {
1648
case 0x01:
1649
str = "Bluetooth 3.0";
1650
break;
1651
default:
1652
str = "Reserved";
1653
break;
1654
}
1655
1656
print_field("PAL version: %s (0x%2.2x) - Subversion %d (0x%4.4x)",
1657
str, version, btohs(subversion), btohs(subversion));
1658
}
1659
1660
void packet_print_company(const char *label, uint16_t company)
1661
{
1662
print_field("%s: %s (%d)", label, bt_compidtostr(company), company);
1663
}
1664
1665
static void print_manufacturer(uint16_t manufacturer)
1666
{
1667
packet_print_company("Manufacturer", btohs(manufacturer));
1668
}
1669
1670
static const char *get_supported_command(int bit);
1671
1672
static void print_commands(const uint8_t *commands)
1673
{
1674
unsigned int count = 0;
1675
int i, n;
1676
1677
for (i = 0; i < 64; i++) {
1678
for (n = 0; n < 8; n++) {
1679
if (commands[i] & (1 << n))
1680
count++;
1681
}
1682
}
1683
1684
print_field("Commands: %u entr%s", count, count == 1 ? "y" : "ies");
1685
1686
for (i = 0; i < 64; i++) {
1687
for (n = 0; n < 8; n++) {
1688
const char *cmd;
1689
1690
if (!(commands[i] & (1 << n)))
1691
continue;
1692
1693
cmd = get_supported_command((i * 8) + n);
1694
print_field(" %s (Octet %d - Bit %d)", cmd, i, n);
1695
}
1696
}
1697
}
1698
1699
struct features_data {
1700
uint8_t bit;
1701
const char *str;
1702
};
1703
1704
static const struct features_data features_page0[] = {
1705
{ 0, "3 slot packets" },
1706
{ 1, "5 slot packets" },
1707
{ 2, "Encryption" },
1708
{ 3, "Slot offset" },
1709
{ 4, "Timing accuracy" },
1710
{ 5, "Role switch" },
1711
{ 6, "Hold mode" },
1712
{ 7, "Sniff mode" },
1713
{ 8, "Park state" },
1714
{ 9, "Power control requests" },
1715
{ 10, "Channel quality driven data rate (CQDDR)"},
1716
{ 11, "SCO link" },
1717
{ 12, "HV2 packets" },
1718
{ 13, "HV3 packets" },
1719
{ 14, "u-law log synchronous data" },
1720
{ 15, "A-law log synchronous data" },
1721
{ 16, "CVSD synchronous data" },
1722
{ 17, "Paging parameter negotiation" },
1723
{ 18, "Power control" },
1724
{ 19, "Transparent synchronous data" },
1725
{ 20, "Flow control lag (least significant bit)"},
1726
{ 21, "Flow control lag (middle bit)" },
1727
{ 22, "Flow control lag (most significant bit)" },
1728
{ 23, "Broadcast Encryption" },
1729
{ 25, "Enhanced Data Rate ACL 2 Mbps mode" },
1730
{ 26, "Enhanced Data Rate ACL 3 Mbps mode" },
1731
{ 27, "Enhanced inquiry scan" },
1732
{ 28, "Interlaced inquiry scan" },
1733
{ 29, "Interlaced page scan" },
1734
{ 30, "RSSI with inquiry results" },
1735
{ 31, "Extended SCO link (EV3 packets)" },
1736
{ 32, "EV4 packets" },
1737
{ 33, "EV5 packets" },
1738
{ 35, "AFH capable slave" },
1739
{ 36, "AFH classification slave" },
1740
{ 37, "BR/EDR Not Supported" },
1741
{ 38, "LE Supported (Controller)" },
1742
{ 39, "3-slot Enhanced Data Rate ACL packets" },
1743
{ 40, "5-slot Enhanced Data Rate ACL packets" },
1744
{ 41, "Sniff subrating" },
1745
{ 42, "Pause encryption" },
1746
{ 43, "AFH capable master" },
1747
{ 44, "AFH classification master" },
1748
{ 45, "Enhanced Data Rate eSCO 2 Mbps mode" },
1749
{ 46, "Enhanced Data Rate eSCO 3 Mbps mode" },
1750
{ 47, "3-slot Enhanced Data Rate eSCO packets" },
1751
{ 48, "Extended Inquiry Response" },
1752
{ 49, "Simultaneous LE and BR/EDR (Controller)" },
1753
{ 51, "Secure Simple Pairing" },
1754
{ 52, "Encapsulated PDU" },
1755
{ 53, "Erroneous Data Reporting" },
1756
{ 54, "Non-flushable Packet Boundary Flag" },
1757
{ 56, "Link Supervision Timeout Changed Event" },
1758
{ 57, "Inquiry TX Power Level" },
1759
{ 58, "Enhanced Power Control" },
1760
{ 63, "Extended features" },
1761
{ }
1762
};
1763
1764
static const struct features_data features_page1[] = {
1765
{ 0, "Secure Simple Pairing (Host Support)" },
1766
{ 1, "LE Supported (Host)" },
1767
{ 2, "Simultaneous LE and BR/EDR (Host)" },
1768
{ }
1769
};
1770
1771
static const struct features_data features_page2[] = {
1772
{ 0, "Connectionless Slave Broadcast - Master" },
1773
{ 1, "Connectionless Slave Broadcast - Slave" },
1774
{ 2, "Synchronization Train" },
1775
{ 3, "Synchronization Scan" },
1776
{ 4, "Inquiry Response Notification Event" },
1777
{ }
1778
};
1779
1780
static const struct features_data features_le[] = {
1781
{ 0, "LE Encryption" },
1782
{ }
1783
};
1784
1785
static void print_features(uint8_t page, const uint8_t *features_array,
1786
uint8_t type)
1787
{
1788
const struct features_data *features_table = NULL;
1789
uint64_t mask, features = 0;
1790
char str[41];
1791
int i;
1792
1793
for (i = 0; i < 8; i++) {
1794
sprintf(str + (i * 5), " 0x%2.2x", features_array[i]);
1795
features |= ((uint64_t) features_array[i]) << (i * 8);
1796
}
1797
1798
print_field("Features:%s", str);
1799
1800
switch (type) {
1801
case 0x00:
1802
switch (page) {
1803
case 0:
1804
features_table = features_page0;
1805
break;
1806
case 1:
1807
features_table = features_page1;
1808
break;
1809
case 2:
1810
features_table = features_page2;
1811
break;
1812
}
1813
break;
1814
case 0x01:
1815
switch (page) {
1816
case 0:
1817
features_table = features_le;
1818
break;
1819
}
1820
break;
1821
}
1822
1823
if (!features_table)
1824
return;
1825
1826
mask = features;
1827
1828
for (i = 0; features_table[i].str; i++) {
1829
if (features & (((uint64_t) 1) << features_table[i].bit)) {
1830
print_field(" %s", features_table[i].str);
1831
mask &= ~(((uint64_t) 1) << features_table[i].bit);
1832
}
1833
}
1834
1835
if (mask)
1836
print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features "
1837
"(0x%16.16" PRIx64 ")", mask);
1838
}
1839
1840
void packet_print_features_ll(const uint8_t *features)
1841
{
1842
print_features(0, features, 0x01);
1843
}
1844
1845
static const struct {
1846
uint8_t bit;
1847
const char *str;
1848
} le_states_table[] = {
1849
{ 0, "Non-connectable Advertising State" },
1850
{ 1, "Scannable Advertising State" },
1851
{ 2, "Connectable Advertising State" },
1852
{ 3, "Directed Advertising State" },
1853
{ 4, "Passive Scanning State" },
1854
{ 5, "Active Scanning State" },
1855
{ 6, "Initiating State and Connection State in Master Role" },
1856
{ 7, "Connection State in Slave Role" },
1857
{ 8, "Non-connectable Advertising State and "
1858
"Passive Scanning State combination" },
1859
{ 9, "Scannable Advertising State and "
1860
"Passive Scanning State combination" },
1861
{ 10, "Connectable Advertising State and "
1862
"Passive Scanning State combination" },
1863
{ 11, "Directed Advertising State and "
1864
"Passive Scanning State combination" },
1865
{ 12, "Non-connectable Advertising State and "
1866
"Active Scanning State combination" },
1867
{ 13, "Scannable Advertising State and "
1868
"Active Scanning State combination" },
1869
{ 14, "Connectable Advertising State and "
1870
"Active Scanning State combination" },
1871
{ 15, "Directed Advertising State and "
1872
"Active Scanning State combination" },
1873
{ 16, "Non-connectable Advertising State and "
1874
"Initiating State combination" },
1875
{ 17, "Scannable Advertising State and "
1876
"Initiating State combination" },
1877
{ 18, "Non-connectable Advertising State and "
1878
"Mater Role combination" },
1879
{ 19, "Scannable Advertising State and "
1880
"Master Role combination" },
1881
{ 20, "Non-connectable Advertising State and "
1882
"Slave Role combination" },
1883
{ 21, "Scannable Advertising State and "
1884
"Slave Role combination" },
1885
{ 22, "Passive Scanning State and Initiating State combination" },
1886
{ 23, "Active Scanning State and Initiating State combination" },
1887
{ 24, "Passive Scanning State and Master Role combination" },
1888
{ 25, "Active Scanning State and Master Role combination" },
1889
{ 26, "Passive Scanning State and Slave Role combination" },
1890
{ 27, "Active Scanning State and Slave Role combination" },
1891
{ 28, "Initiating State and Master Role combination" },
1892
{ }
1893
};
1894
1895
static void print_le_states(const uint8_t *states_array)
1896
{
1897
uint64_t mask, states = 0;
1898
int i;
1899
1900
for (i = 0; i < 8; i++)
1901
states |= ((uint64_t) states_array[i]) << (i * 8);
1902
1903
print_field("States: 0x%16.16" PRIx64, states);
1904
1905
mask = states;
1906
1907
for (i = 0; le_states_table[i].str; i++) {
1908
if (states & (((uint64_t) 1) << le_states_table[i].bit)) {
1909
print_field(" %s", le_states_table[i].str);
1910
mask &= ~(((uint64_t) 1) << le_states_table[i].bit);
1911
}
1912
}
1913
1914
if (mask)
1915
print_text(COLOR_UNKNOWN_LE_STATES, " Unknown states "
1916
"(0x%16.16" PRIx64 ")", mask);
1917
}
1918
1919
static void print_le_channel_map(const uint8_t *map)
1920
{
1921
char str[11];
1922
int i;
1923
1924
for (i = 0; i < 5; i++)
1925
sprintf(str + (i * 2), "%2.2x", map[i]);
1926
1927
print_field("Channel map: 0x%s", str);
1928
}
1929
1930
void packet_print_channel_map_ll(const uint8_t *map)
1931
{
1932
print_le_channel_map(map);
1933
}
1934
1935
static void print_random_number(const uint8_t *number)
1936
{
1937
print_hex_field("Random number", number, 8);
1938
}
1939
1940
static const struct {
1941
uint8_t bit;
1942
const char *str;
1943
} events_table[] = {
1944
{ 0, "Inquiry Complete" },
1945
{ 1, "Inquiry Result" },
1946
{ 2, "Connection Complete" },
1947
{ 3, "Connection Request" },
1948
{ 4, "Disconnection Complete" },
1949
{ 5, "Authentication Complete" },
1950
{ 6, "Remote Name Request Complete" },
1951
{ 7, "Encryption Change" },
1952
{ 8, "Change Connection Link Key Complete" },
1953
{ 9, "Master Link Key Complete" },
1954
{ 10, "Read Remote Supported Features Complete" },
1955
{ 11, "Read Remote Version Information Complete" },
1956
{ 12, "QoS Setup Complete" },
1957
{ 13, "Command Complete" },
1958
{ 14, "Command Status" },
1959
{ 15, "Hardware Error" },
1960
{ 16, "Flush Occurred" },
1961
{ 17, "Role Change" },
1962
{ 18, "Number of Completed Packets" },
1963
{ 19, "Mode Change" },
1964
{ 20, "Return Link Keys" },
1965
{ 21, "PIN Code Request" },
1966
{ 22, "Link Key Request" },
1967
{ 23, "Link Key Notification" },
1968
{ 24, "Loopback Command" },
1969
{ 25, "Data Buffer Overflow" },
1970
{ 26, "Max Slots Change" },
1971
{ 27, "Read Clock Offset Complete" },
1972
{ 28, "Connection Packet Type Changed" },
1973
{ 29, "QoS Violation" },
1974
{ 30, "Page Scan Mode Change" },
1975
{ 31, "Page Scan Repetition Mode Change" },
1976
{ 32, "Flow Specification Complete" },
1977
{ 33, "Inquiry Result with RSSI" },
1978
{ 34, "Read Remote Extended Features Complete" },
1979
{ 43, "Synchronous Connection Complete" },
1980
{ 44, "Synchronous Connection Changed" },
1981
{ 45, "Sniff Subrating" },
1982
{ 46, "Extended Inquiry Result" },
1983
{ 47, "Encryption Key Refresh Complete" },
1984
{ 48, "IO Capability Request" },
1985
{ 49, "IO Capability Request Reply" },
1986
{ 50, "User Confirmation Request" },
1987
{ 51, "User Passkey Request" },
1988
{ 52, "Remote OOB Data Request" },
1989
{ 53, "Simple Pairing Complete" },
1990
{ 55, "Link Supervision Timeout Changed" },
1991
{ 56, "Enhanced Flush Complete" },
1992
{ 58, "User Passkey Notification" },
1993
{ 59, "Keypress Notification" },
1994
{ 60, "Remote Host Supported Features Notification" },
1995
{ 61, "LE Meta" },
1996
{ }
1997
};
1998
1999
static void print_event_mask(const uint8_t *events_array)
2000
{
2001
uint64_t mask, events = 0;
2002
int i;
2003
2004
for (i = 0; i < 8; i++)
2005
events |= ((uint64_t) events_array[i]) << (i * 8);
2006
2007
print_field("Mask: 0x%16.16" PRIx64, events);
2008
2009
mask = events;
2010
2011
for (i = 0; events_table[i].str; i++) {
2012
if (events & (((uint64_t) 1) << events_table[i].bit)) {
2013
print_field(" %s", events_table[i].str);
2014
mask &= ~(((uint64_t) 1) << events_table[i].bit);
2015
}
2016
}
2017
2018
if (mask)
2019
print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "
2020
"(0x%16.16" PRIx64 ")", mask);
2021
}
2022
2023
static const struct {
2024
uint8_t bit;
2025
const char *str;
2026
} events_page2_table[] = {
2027
{ 0, "Physical Link Complete" },
2028
{ 1, "Channel Selected" },
2029
{ 2, "Disconnection Physical Link Complete" },
2030
{ 3, "Physical Link Loss Early Warning" },
2031
{ 4, "Physical Link Recovery" },
2032
{ 5, "Logical Link Complete" },
2033
{ 6, "Disconnection Logical Link Complete" },
2034
{ 7, "Flow Specification Modify Complete" },
2035
{ 8, "Number of Completed Data Blocks" },
2036
{ 9, "AMP Start Test" },
2037
{ 10, "AMP Test End" },
2038
{ 11, "AMP Receiver Report" },
2039
{ 12, "Short Range Mode Change Complete" },
2040
{ 13, "AMP Status Change" },
2041
{ 14, "Triggered Clock Capture" },
2042
{ 15, "Synchronization Train Complete" },
2043
{ 16, "Synchronization Train Received" },
2044
{ 17, "Connectionless Slave Broadcast Receive" },
2045
{ 18, "Connectionless Slave Broadcast Timeout" },
2046
{ 19, "Truncated Page Complete" },
2047
{ 20, "Slave Page Response Timeout" },
2048
{ 21, "Connectionless Slave Broadcast Channel Map Change" },
2049
{ 22, "Inquiry Response Notification" },
2050
{ }
2051
};
2052
2053
static void print_event_mask_page2(const uint8_t *events_array)
2054
{
2055
uint64_t mask, events = 0;
2056
int i;
2057
2058
for (i = 0; i < 8; i++)
2059
events |= ((uint64_t) events_array[i]) << (i * 8);
2060
2061
print_field("Mask: 0x%16.16" PRIx64, events);
2062
2063
mask = events;
2064
2065
for (i = 0; events_page2_table[i].str; i++) {
2066
if (events & (((uint64_t) 1) << events_page2_table[i].bit)) {
2067
print_field(" %s", events_page2_table[i].str);
2068
mask &= ~(((uint64_t) 1) << events_page2_table[i].bit);
2069
}
2070
}
2071
2072
if (mask)
2073
print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "
2074
"(0x%16.16" PRIx64 ")", mask);
2075
}
2076
2077
static const struct {
2078
uint8_t bit;
2079
const char *str;
2080
} events_le_table[] = {
2081
{ 0, "LE Connection Complete" },
2082
{ 1, "LE Advertising Report" },
2083
{ 2, "LE Connection Update Complete" },
2084
{ 3, "LE Read Remote Used Features" },
2085
{ 4, "LE Long Term Key Request" },
2086
{ }
2087
};
2088
2089
static void print_event_mask_le(const uint8_t *events_array)
2090
{
2091
uint64_t mask, events = 0;
2092
int i;
2093
2094
for (i = 0; i < 8; i++)
2095
events |= ((uint64_t) events_array[i]) << (i * 8);
2096
2097
print_field("Mask: 0x%16.16" PRIx64, events);
2098
2099
mask = events;
2100
2101
for (i = 0; events_le_table[i].str; i++) {
2102
if (events & (((uint64_t) 1) << events_le_table[i].bit)) {
2103
print_field(" %s", events_le_table[i].str);
2104
mask &= ~(((uint64_t) 1) << events_le_table[i].bit);
2105
}
2106
}
2107
2108
if (mask)
2109
print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "
2110
"(0x%16.16" PRIx64 ")", mask);
2111
}
2112
2113
static void print_fec(uint8_t fec)
2114
{
2115
const char *str;
2116
2117
switch (fec) {
2118
case 0x00:
2119
str = "Not required";
2120
break;
2121
case 0x01:
2122
str = "Required";
2123
break;
2124
default:
2125
str = "Reserved";
2126
break;
2127
}
2128
2129
print_field("FEC: %s (0x%02x)", str, fec);
2130
}
2131
2132
#define BT_EIR_FLAGS 0x01
2133
#define BT_EIR_UUID16_SOME 0x02
2134
#define BT_EIR_UUID16_ALL 0x03
2135
#define BT_EIR_UUID32_SOME 0x04
2136
#define BT_EIR_UUID32_ALL 0x05
2137
#define BT_EIR_UUID128_SOME 0x06
2138
#define BT_EIR_UUID128_ALL 0x07
2139
#define BT_EIR_NAME_SHORT 0x08
2140
#define BT_EIR_NAME_COMPLETE 0x09
2141
#define BT_EIR_TX_POWER 0x0a
2142
#define BT_EIR_CLASS_OF_DEV 0x0d
2143
#define BT_EIR_SSP_HASH_P192 0x0e
2144
#define BT_EIR_SSP_RANDOMIZER_P192 0x0f
2145
#define BT_EIR_DEVICE_ID 0x10
2146
#define BT_EIR_SMP_TK 0x10
2147
#define BT_EIR_SMP_OOB_FLAGS 0x11
2148
#define BT_EIR_SLAVE_CONN_INTERVAL 0x12
2149
#define BT_EIR_SERVICE_UUID16 0x14
2150
#define BT_EIR_SERVICE_UUID128 0x15
2151
#define BT_EIR_SERVICE_DATA 0x16
2152
#define BT_EIR_PUBLIC_ADDRESS 0x17
2153
#define BT_EIR_RANDOM_ADDRESS 0x18
2154
#define BT_EIR_GAP_APPEARANCE 0x19
2155
#define BT_EIR_ADVERTISING_INTERVAL 0x1a
2156
#define BT_EIR_LE_DEVICE_ADDRESS 0x1b
2157
#define BT_EIR_LE_ROLE 0x1c
2158
#define BT_EIR_SSP_HASH_P256 0x1d
2159
#define BT_EIR_SSP_RANDOMIZER_P256 0x1e
2160
#define BT_EIR_3D_INFO_DATA 0x3d
2161
#define BT_EIR_MANUFACTURER_DATA 0xff
2162
2163
static void print_manufacturer_apple(const void *data, uint8_t data_len)
2164
{
2165
uint8_t type = *((uint8_t *) data);
2166
uint8_t len;
2167
const uint8_t *uuid;
2168
uint16_t minor, major;
2169
int8_t tx_power;
2170
char identifier[100];
2171
2172
if (data_len < 1)
2173
return;
2174
2175
switch (type) {
2176
case 0x01:
2177
snprintf(identifier, sizeof(identifier) - 1, "%s",
2178
(const char *) (data + 1));
2179
print_field(" Identifier: %s", identifier);
2180
break;
2181
case 0x02:
2182
len = *((uint8_t *) (data + 1));
2183
if (len != 0x15) {
2184
print_hex_field(" Data", data, data_len);
2185
break;
2186
}
2187
2188
uuid = data + 2;
2189
print_field(" iBeacon: %8.8x-%4.4x-%4.4x-%4.4x-%8.8x%4.4x",
2190
bt_get_le32(&uuid[12]), bt_get_le16(&uuid[10]),
2191
bt_get_le16(&uuid[8]), bt_get_le16(&uuid[6]),
2192
bt_get_le32(&uuid[2]), bt_get_le16(&uuid[0]));
2193
2194
major = bt_get_le16(data + 18);
2195
minor = bt_get_le16(data + 20);
2196
print_field(" Version: %u.%u", major, minor);
2197
2198
tx_power = *(int8_t *) (data + 22);
2199
print_field(" TX power: %d dB", tx_power);
2200
break;
2201
default:
2202
print_hex_field(" Data", data, data_len);
2203
break;
2204
}
2205
}
2206
2207
static void print_manufacturer_data(const void *data, uint8_t data_len)
2208
{
2209
uint16_t company = bt_get_le16(data);
2210
2211
packet_print_company("Company", company);
2212
2213
switch (company) {
2214
case 76:
2215
case 19456:
2216
print_manufacturer_apple(data + 2, data_len - 2);
2217
break;
2218
default:
2219
print_hex_field(" Data", data + 2, data_len - 2);
2220
break;
2221
}
2222
}
2223
2224
static void print_uuid16_list(const char *label, const void *data,
2225
uint8_t data_len)
2226
{
2227
uint8_t count = data_len / sizeof(uint16_t);
2228
unsigned int i;
2229
2230
print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
2231
2232
for (i = 0; i < count; i++) {
2233
uint16_t uuid = bt_get_le16(data + (i * 2));
2234
print_field(" %s (0x%4.4x)", uuid16_to_str(uuid), uuid);
2235
}
2236
}
2237
2238
static void print_uuid32_list(const char *label, const void *data,
2239
uint8_t data_len)
2240
{
2241
uint8_t count = data_len / sizeof(uint32_t);
2242
unsigned int i;
2243
2244
print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
2245
2246
for (i = 0; i < count; i++) {
2247
uint32_t uuid = bt_get_le32(data + (i * 4));
2248
print_field(" %s (0x%8.8x)", uuid32_to_str(uuid), uuid);
2249
}
2250
}
2251
2252
static void print_uuid128_list(const char *label, const void *data,
2253
uint8_t data_len)
2254
{
2255
uint8_t count = data_len / 16;
2256
unsigned int i;
2257
2258
print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");
2259
2260
for (i = 0; i < count; i++) {
2261
const uint8_t *uuid = data + (i * 16);
2262
2263
print_field(" %8.8x-%4.4x-%4.4x-%4.4x-%8.8x%4.4x",
2264
bt_get_le32(&uuid[12]), bt_get_le16(&uuid[10]),
2265
bt_get_le16(&uuid[8]), bt_get_le16(&uuid[6]),
2266
bt_get_le32(&uuid[2]), bt_get_le16(&uuid[0]));
2267
}
2268
}
2269
2270
static const struct {
2271
uint8_t bit;
2272
const char *str;
2273
} eir_flags_table[] = {
2274
{ 0, "LE Limited Discoverable Mode" },
2275
{ 1, "LE General Discoverable Mode" },
2276
{ 2, "BR/EDR Not Supported" },
2277
{ 3, "Simultaneous LE and BR/EDR (Controller)" },
2278
{ 4, "Simultaneous LE and BR/EDR (Host)" },
2279
{ }
2280
};
2281
2282
static const struct {
2283
uint8_t bit;
2284
const char *str;
2285
} eir_3d_table[] = {
2286
{ 0, "Association Notification" },
2287
{ 1, "Battery Level Reporting" },
2288
{ 2, "Send Battery Level Report on Start-up Synchronization" },
2289
{ 7, "Factory Test Mode" },
2290
{ }
2291
};
2292
2293
static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)
2294
{
2295
uint16_t len = 0;
2296
2297
if (eir_len == 0)
2298
return;
2299
2300
while (len < eir_len - 1) {
2301
uint8_t field_len = eir[0];
2302
const uint8_t *data = &eir[2];
2303
uint8_t data_len;
2304
char name[239], label[100];
2305
uint8_t flags, mask;
2306
int i;
2307
2308
/* Check for the end of EIR */
2309
if (field_len == 0)
2310
break;
2311
2312
len += field_len + 1;
2313
2314
/* Do not continue EIR Data parsing if got incorrect length */
2315
if (len > eir_len) {
2316
len -= field_len + 1;
2317
break;
2318
}
2319
2320
data_len = field_len - 1;
2321
2322
switch (eir[1]) {
2323
case BT_EIR_FLAGS:
2324
flags = *data;
2325
mask = flags;
2326
2327
print_field("Flags: 0x%2.2x", flags);
2328
2329
for (i = 0; eir_flags_table[i].str; i++) {
2330
if (flags & (1 << eir_flags_table[i].bit)) {
2331
print_field(" %s",
2332
eir_flags_table[i].str);
2333
mask &= ~(1 << eir_flags_table[i].bit);
2334
}
2335
}
2336
2337
if (mask)
2338
print_text(COLOR_UNKNOWN_SERVICE_CLASS,
2339
" Unknown flags (0x%2.2x)", mask);
2340
break;
2341
2342
case BT_EIR_UUID16_SOME:
2343
if (data_len < sizeof(uint16_t))
2344
break;
2345
print_uuid16_list("16-bit Service UUIDs (partial)",
2346
data, data_len);
2347
break;
2348
2349
case BT_EIR_UUID16_ALL:
2350
if (data_len < sizeof(uint16_t))
2351
break;
2352
print_uuid16_list("16-bit Service UUIDs (complete)",
2353
data, data_len);
2354
break;
2355
2356
case BT_EIR_UUID32_SOME:
2357
if (data_len < sizeof(uint32_t))
2358
break;
2359
print_uuid32_list("32-bit Service UUIDs (partial)",
2360
data, data_len);
2361
break;
2362
2363
case BT_EIR_UUID32_ALL:
2364
if (data_len < sizeof(uint32_t))
2365
break;
2366
print_uuid32_list("32-bit Service UUIDs (complete)",
2367
data, data_len);
2368
break;
2369
2370
case BT_EIR_UUID128_SOME:
2371
if (data_len < 16)
2372
break;
2373
print_uuid128_list("128-bit Service UUIDs (partial)",
2374
data, data_len);
2375
break;
2376
2377
case BT_EIR_UUID128_ALL:
2378
if (data_len < 16)
2379
break;
2380
print_uuid128_list("128-bit Service UUIDs (complete)",
2381
data, data_len);
2382
break;
2383
2384
case BT_EIR_NAME_SHORT:
2385
memset(name, 0, sizeof(name));
2386
memcpy(name, data, data_len);
2387
print_field("Name (short): %s", name);
2388
break;
2389
2390
case BT_EIR_NAME_COMPLETE:
2391
memset(name, 0, sizeof(name));
2392
memcpy(name, data, data_len);
2393
print_field("Name (complete): %s", name);
2394
break;
2395
2396
case BT_EIR_TX_POWER:
2397
if (data_len < 1)
2398
break;
2399
print_field("TX power: %d dBm", (int8_t) *data);
2400
break;
2401
2402
case BT_EIR_CLASS_OF_DEV:
2403
if (data_len < 3)
2404
break;
2405
print_dev_class(data);
2406
break;
2407
2408
case BT_EIR_SSP_HASH_P192:
2409
if (data_len < 16)
2410
break;
2411
print_hash("P-192", data);
2412
break;
2413
2414
case BT_EIR_SSP_RANDOMIZER_P192:
2415
if (data_len < 16)
2416
break;
2417
print_randomizer("P-192", data);
2418
break;
2419
2420
case BT_EIR_DEVICE_ID:
2421
/* SMP TK has the same value as Device ID */
2422
if (le)
2423
print_hex_field("SMP TK", data, data_len);
2424
else if (data_len >= 8)
2425
print_field("Device ID: "
2426
"Source 0x%4.4x "
2427
"Vendor 0x%4.4x "
2428
"Product 0x%4.4x "
2429
"Version 0x%4.4x",
2430
bt_get_le16(&data[0]),
2431
bt_get_le16(&data[2]),
2432
bt_get_le16(&data[4]),
2433
bt_get_le16(&data[6]));
2434
break;
2435
2436
case BT_EIR_SMP_OOB_FLAGS:
2437
print_field("SMP OOB Flags: 0x%2.2x", *data);
2438
break;
2439
2440
case BT_EIR_SLAVE_CONN_INTERVAL:
2441
if (data_len < 4)
2442
break;
2443
print_field("Slave Conn. Interval: 0x%4.4x - 0x%4.4x",
2444
bt_get_le16(&data[0]),
2445
bt_get_le16(&data[2]));
2446
break;
2447
2448
case BT_EIR_SERVICE_UUID16:
2449
if (data_len < sizeof(uint16_t))
2450
break;
2451
print_uuid16_list("16-bit Service UUIDs",
2452
data, data_len);
2453
break;
2454
2455
case BT_EIR_SERVICE_UUID128:
2456
if (data_len < 16)
2457
break;
2458
print_uuid128_list("128-bit Service UUIDs",
2459
data, data_len);
2460
break;
2461
2462
case BT_EIR_SERVICE_DATA:
2463
if (data_len < 2)
2464
break;
2465
sprintf(label, "Service Data (UUID 0x%4.4x)",
2466
bt_get_le16(&data[0]));
2467
print_hex_field(label, &data[2], data_len - 2);
2468
break;
2469
2470
case BT_EIR_RANDOM_ADDRESS:
2471
if (data_len < 6)
2472
break;
2473
print_addr("Random Address", data, 0x01);
2474
break;
2475
2476
case BT_EIR_PUBLIC_ADDRESS:
2477
if (data_len < 6)
2478
break;
2479
print_addr("Public Address", data, 0x00);
2480
break;
2481
2482
case BT_EIR_GAP_APPEARANCE:
2483
if (data_len < 2)
2484
break;
2485
print_field("Appearance: 0x%4.4x", bt_get_le16(data));
2486
break;
2487
2488
case BT_EIR_SSP_HASH_P256:
2489
if (data_len < 16)
2490
break;
2491
print_hash("P-256", data);
2492
break;
2493
2494
case BT_EIR_SSP_RANDOMIZER_P256:
2495
if (data_len < 16)
2496
break;
2497
print_randomizer("P-256", data);
2498
break;
2499
2500
case BT_EIR_3D_INFO_DATA:
2501
print_hex_field("3D Information Data", data, data_len);
2502
if (data_len < 2)
2503
break;
2504
2505
flags = *data;
2506
mask = flags;
2507
2508
print_field(" Features: 0x%2.2x", flags);
2509
2510
for (i = 0; eir_3d_table[i].str; i++) {
2511
if (flags & (1 << eir_3d_table[i].bit)) {
2512
print_field(" %s",
2513
eir_3d_table[i].str);
2514
mask &= ~(1 << eir_3d_table[i].bit);
2515
}
2516
}
2517
2518
if (mask)
2519
print_text(COLOR_UNKNOWN_FEATURE_BIT,
2520
" Unknown features (0x%2.2x)", mask);
2521
2522
print_field(" Path Loss Threshold: %d", data[1]);
2523
break;
2524
2525
case BT_EIR_MANUFACTURER_DATA:
2526
if (data_len < 2)
2527
break;
2528
print_manufacturer_data(data, data_len);
2529
break;
2530
2531
default:
2532
sprintf(label, "Unknown EIR field 0x%2.2x", eir[1]);
2533
print_hex_field(label, data, data_len);
2534
break;
2535
}
2536
2537
eir += field_len + 1;
2538
}
2539
2540
if (len < eir_len && eir[0] != 0)
2541
packet_hexdump(eir, eir_len - len);
2542
}
2543
2544
void packet_print_addr(const char *label, const void *data, bool random)
2545
{
2546
print_addr(label ? : "Address", data, random ? 0x01 : 0x00);
2547
}
2548
2549
void packet_print_ad(const void *data, uint8_t size)
2550
{
2551
print_eir(data, size, true);
2552
}
2553
2554
void packet_hexdump(const unsigned char *buf, uint16_t len)
2555
{
2556
static const char hexdigits[] = "0123456789abcdef";
2557
char str[68];
2558
uint16_t i;
2559
2560
if (!len)
2561
return;
2562
2563
for (i = 0; i < len; i++) {
2564
str[((i % 16) * 3) + 0] = hexdigits[buf[i] >> 4];
2565
str[((i % 16) * 3) + 1] = hexdigits[buf[i] & 0xf];
2566
str[((i % 16) * 3) + 2] = ' ';
2567
str[(i % 16) + 49] = isprint(buf[i]) ? buf[i] : '.';
2568
2569
if ((i + 1) % 16 == 0) {
2570
str[47] = ' ';
2571
str[48] = ' ';
2572
str[65] = '\0';
2573
print_text(COLOR_WHITE, "%s", str);
2574
str[0] = ' ';
2575
}
2576
}
2577
2578
if (i % 16 > 0) {
2579
uint16_t j;
2580
for (j = (i % 16); j < 16; j++) {
2581
str[(j * 3) + 0] = ' ';
2582
str[(j * 3) + 1] = ' ';
2583
str[(j * 3) + 2] = ' ';
2584
str[j + 49] = ' ';
2585
}
2586
str[47] = ' ';
2587
str[48] = ' ';
2588
str[65] = '\0';
2589
print_text(COLOR_WHITE, "%s", str);
2590
}
2591
}
2592
2593
void packet_control(struct timeval *tv, uint16_t index, uint16_t opcode,
2594
const void *data, uint16_t size)
2595
{
2596
if (index_filter && index_number != index)
2597
return;
2598
2599
control_message(opcode, data, size);
2600
}
2601
2602
struct monitor_new_index {
2603
uint8_t type;
2604
uint8_t bus;
2605
bdaddr_t bdaddr;
2606
char name[8];
2607
} __attribute__((packed));
2608
2609
#define MONITOR_NEW_INDEX_SIZE 16
2610
2611
#define MONITOR_DEL_INDEX_SIZE 0
2612
2613
#define MAX_INDEX 16
2614
2615
struct index_data {
2616
uint8_t type;
2617
bdaddr_t bdaddr;
2618
};
2619
2620
static struct index_data index_list[MAX_INDEX];
2621
2622
void packet_monitor(struct timeval *tv, uint16_t index, uint16_t opcode,
2623
const void *data, uint16_t size)
2624
{
2625
const struct monitor_new_index *ni;
2626
char str[18], extra_str[24];
2627
2628
if (index_filter && index_number != index)
2629
return;
2630
2631
index_current = index;
2632
2633
if (tv && time_offset == ((time_t) -1))
2634
time_offset = tv->tv_sec;
2635
2636
switch (opcode) {
2637
case BTSNOOP_OPCODE_NEW_INDEX:
2638
ni = data;
2639
2640
if (index < MAX_INDEX) {
2641
index_list[index].type = ni->type;
2642
bacpy(&index_list[index].bdaddr, &ni->bdaddr);
2643
}
2644
2645
ba2str(&ni->bdaddr, str);
2646
packet_new_index(tv, index, str, ni->type, ni->bus, ni->name);
2647
break;
2648
case BTSNOOP_OPCODE_DEL_INDEX:
2649
if (index < MAX_INDEX)
2650
ba2str(&index_list[index].bdaddr, str);
2651
else
2652
ba2str(BDADDR_ANY, str);
2653
2654
packet_del_index(tv, index, str);
2655
break;
2656
case BTSNOOP_OPCODE_COMMAND_PKT:
2657
packet_hci_command(tv, index, data, size);
2658
break;
2659
case BTSNOOP_OPCODE_EVENT_PKT:
2660
packet_hci_event(tv, index, data, size);
2661
break;
2662
case BTSNOOP_OPCODE_ACL_TX_PKT:
2663
packet_hci_acldata(tv, index, false, data, size);
2664
break;
2665
case BTSNOOP_OPCODE_ACL_RX_PKT:
2666
packet_hci_acldata(tv, index, true, data, size);
2667
break;
2668
case BTSNOOP_OPCODE_SCO_TX_PKT:
2669
packet_hci_scodata(tv, index, false, data, size);
2670
break;
2671
case BTSNOOP_OPCODE_SCO_RX_PKT:
2672
packet_hci_scodata(tv, index, true, data, size);
2673
break;
2674
default:
2675
sprintf(extra_str, "(code %d len %d)", opcode, size);
2676
print_packet(tv, index, '*', COLOR_ERROR,
2677
"Unknown packet", NULL, extra_str);
2678
packet_hexdump(data, size);
2679
break;
2680
}
2681
}
2682
2683
void packet_simulator(struct timeval *tv, uint16_t frequency,
2684
const void *data, uint16_t size)
2685
{
2686
char str[10];
2687
2688
if (tv && time_offset == ((time_t) -1))
2689
time_offset = tv->tv_sec;
2690
2691
sprintf(str, "%u MHz", frequency);
2692
2693
print_packet(tv, 0, '*', COLOR_PHY_PACKET,
2694
"Physical packet:", NULL, str);
2695
2696
ll_packet(frequency, data, size);
2697
}
2698
2699
static void null_cmd(const void *data, uint8_t size)
2700
{
2701
}
2702
2703
static void status_rsp(const void *data, uint8_t size)
2704
{
2705
uint8_t status = *((const uint8_t *) data);
2706
2707
print_status(status);
2708
}
2709
2710
static void status_bdaddr_rsp(const void *data, uint8_t size)
2711
{
2712
uint8_t status = *((const uint8_t *) data);
2713
2714
print_status(status);
2715
print_bdaddr(data + 1);
2716
}
2717
2718
static void inquiry_cmd(const void *data, uint8_t size)
2719
{
2720
const struct bt_hci_cmd_inquiry *cmd = data;
2721
2722
print_iac(cmd->lap);
2723
print_field("Length: %.2fs (0x%2.2x)",
2724
cmd->length * 1.28, cmd->length);
2725
print_num_resp(cmd->num_resp);
2726
}
2727
2728
static void periodic_inquiry_cmd(const void *data, uint8_t size)
2729
{
2730
const struct bt_hci_cmd_periodic_inquiry *cmd = data;
2731
2732
print_field("Max period: %.2fs (0x%2.2x)",
2733
cmd->max_period * 1.28, cmd->max_period);
2734
print_field("Min period: %.2fs (0x%2.2x)",
2735
cmd->min_period * 1.28, cmd->min_period);
2736
print_iac(cmd->lap);
2737
print_field("Length: %.2fs (0x%2.2x)",
2738
cmd->length * 1.28, cmd->length);
2739
print_num_resp(cmd->num_resp);
2740
}
2741
2742
static void create_conn_cmd(const void *data, uint8_t size)
2743
{
2744
const struct bt_hci_cmd_create_conn *cmd = data;
2745
const char *str;
2746
2747
print_bdaddr(cmd->bdaddr);
2748
print_pkt_type(cmd->pkt_type);
2749
print_pscan_rep_mode(cmd->pscan_rep_mode);
2750
print_pscan_mode(cmd->pscan_mode);
2751
print_clock_offset(cmd->clock_offset);
2752
2753
switch (cmd->role_switch) {
2754
case 0x00:
2755
str = "Stay master";
2756
break;
2757
case 0x01:
2758
str = "Allow slave";
2759
break;
2760
default:
2761
str = "Reserved";
2762
break;
2763
}
2764
2765
print_field("Role switch: %s (0x%2.2x)", str, cmd->role_switch);
2766
}
2767
2768
static void disconnect_cmd(const void *data, uint8_t size)
2769
{
2770
const struct bt_hci_cmd_disconnect *cmd = data;
2771
2772
print_handle(cmd->handle);
2773
print_reason(cmd->reason);
2774
}
2775
2776
static void add_sco_conn_cmd(const void *data, uint8_t size)
2777
{
2778
const struct bt_hci_cmd_add_sco_conn *cmd = data;
2779
2780
print_handle(cmd->handle);
2781
print_pkt_type(cmd->pkt_type);
2782
}
2783
2784
static void create_conn_cancel_cmd(const void *data, uint8_t size)
2785
{
2786
const struct bt_hci_cmd_create_conn_cancel *cmd = data;
2787
2788
print_bdaddr(cmd->bdaddr);
2789
}
2790
2791
static void accept_conn_request_cmd(const void *data, uint8_t size)
2792
{
2793
const struct bt_hci_cmd_accept_conn_request *cmd = data;
2794
2795
print_bdaddr(cmd->bdaddr);
2796
print_role(cmd->role);
2797
}
2798
2799
static void reject_conn_request_cmd(const void *data, uint8_t size)
2800
{
2801
const struct bt_hci_cmd_reject_conn_request *cmd = data;
2802
2803
print_bdaddr(cmd->bdaddr);
2804
print_reason(cmd->reason);
2805
}
2806
2807
static void link_key_request_reply_cmd(const void *data, uint8_t size)
2808
{
2809
const struct bt_hci_cmd_link_key_request_reply *cmd = data;
2810
2811
print_bdaddr(cmd->bdaddr);
2812
print_link_key(cmd->link_key);
2813
}
2814
2815
static void link_key_request_neg_reply_cmd(const void *data, uint8_t size)
2816
{
2817
const struct bt_hci_cmd_link_key_request_neg_reply *cmd = data;
2818
2819
print_bdaddr(cmd->bdaddr);
2820
}
2821
2822
static void pin_code_request_reply_cmd(const void *data, uint8_t size)
2823
{
2824
const struct bt_hci_cmd_pin_code_request_reply *cmd = data;
2825
2826
print_bdaddr(cmd->bdaddr);
2827
print_field("PIN length: %d", cmd->pin_len);
2828
print_pin_code(cmd->pin_code, cmd->pin_len);
2829
}
2830
2831
static void pin_code_request_neg_reply_cmd(const void *data, uint8_t size)
2832
{
2833
const struct bt_hci_cmd_pin_code_request_neg_reply *cmd = data;
2834
2835
print_bdaddr(cmd->bdaddr);
2836
}
2837
2838
static void change_conn_pkt_type_cmd(const void *data, uint8_t size)
2839
{
2840
const struct bt_hci_cmd_change_conn_pkt_type *cmd = data;
2841
2842
print_handle(cmd->handle);
2843
print_pkt_type(cmd->pkt_type);
2844
}
2845
2846
static void auth_requested_cmd(const void *data, uint8_t size)
2847
{
2848
const struct bt_hci_cmd_auth_requested *cmd = data;
2849
2850
print_handle(cmd->handle);
2851
}
2852
2853
static void set_conn_encrypt_cmd(const void *data, uint8_t size)
2854
{
2855
const struct bt_hci_cmd_set_conn_encrypt *cmd = data;
2856
2857
print_handle(cmd->handle);
2858
print_encr_mode(cmd->encr_mode);
2859
}
2860
2861
static void change_conn_link_key_cmd(const void *data, uint8_t size)
2862
{
2863
const struct bt_hci_cmd_change_conn_link_key *cmd = data;
2864
2865
print_handle(cmd->handle);
2866
}
2867
2868
static void master_link_key_cmd(const void *data, uint8_t size)
2869
{
2870
const struct bt_hci_cmd_master_link_key *cmd = data;
2871
2872
print_key_flag(cmd->key_flag);
2873
}
2874
2875
static void remote_name_request_cmd(const void *data, uint8_t size)
2876
{
2877
const struct bt_hci_cmd_remote_name_request *cmd = data;
2878
2879
print_bdaddr(cmd->bdaddr);
2880
print_pscan_rep_mode(cmd->pscan_rep_mode);
2881
print_pscan_mode(cmd->pscan_mode);
2882
print_clock_offset(cmd->clock_offset);
2883
}
2884
2885
static void remote_name_request_cancel_cmd(const void *data, uint8_t size)
2886
{
2887
const struct bt_hci_cmd_remote_name_request_cancel *cmd = data;
2888
2889
print_bdaddr(cmd->bdaddr);
2890
}
2891
2892
static void read_remote_features_cmd(const void *data, uint8_t size)
2893
{
2894
const struct bt_hci_cmd_read_remote_features *cmd = data;
2895
2896
print_handle(cmd->handle);
2897
}
2898
2899
static void read_remote_ext_features_cmd(const void *data, uint8_t size)
2900
{
2901
const struct bt_hci_cmd_read_remote_ext_features *cmd = data;
2902
2903
print_handle(cmd->handle);
2904
print_field("Page: %d", cmd->page);
2905
}
2906
2907
static void read_remote_version_cmd(const void *data, uint8_t size)
2908
{
2909
const struct bt_hci_cmd_read_remote_version *cmd = data;
2910
2911
print_handle(cmd->handle);
2912
}
2913
2914
static void read_clock_offset_cmd(const void *data, uint8_t size)
2915
{
2916
const struct bt_hci_cmd_read_clock_offset *cmd = data;
2917
2918
print_handle(cmd->handle);
2919
}
2920
2921
static void read_lmp_handle_cmd(const void *data, uint8_t size)
2922
{
2923
const struct bt_hci_cmd_read_lmp_handle *cmd = data;
2924
2925
print_handle(cmd->handle);
2926
}
2927
2928
static void read_lmp_handle_rsp(const void *data, uint8_t size)
2929
{
2930
const struct bt_hci_rsp_read_lmp_handle *rsp = data;
2931
2932
print_status(rsp->status);
2933
print_handle(rsp->handle);
2934
print_field("LMP handle: %d", rsp->lmp_handle);
2935
print_field("Reserved: %d", btohl(rsp->reserved));
2936
}
2937
2938
static void setup_sync_conn_cmd(const void *data, uint8_t size)
2939
{
2940
const struct bt_hci_cmd_setup_sync_conn *cmd = data;
2941
2942
print_handle(cmd->handle);
2943
print_field("Transmit bandwidth: %d", btohl(cmd->tx_bandwidth));
2944
print_field("Receive bandwidth: %d", btohl(cmd->rx_bandwidth));
2945
print_field("Max latency: %d", btohs(cmd->max_latency));
2946
print_voice_setting(cmd->voice_setting);
2947
print_retransmission_effort(cmd->retrans_effort);
2948
print_pkt_type(cmd->pkt_type);
2949
}
2950
2951
static void accept_sync_conn_cmd(const void *data, uint8_t size)
2952
{
2953
const struct bt_hci_cmd_accept_sync_conn *cmd = data;
2954
2955
print_bdaddr(cmd->bdaddr);
2956
print_field("Transmit bandwidth: %d", btohl(cmd->tx_bandwidth));
2957
print_field("Receive bandwidth: %d", btohl(cmd->rx_bandwidth));
2958
print_field("Max latency: %d", btohs(cmd->max_latency));
2959
print_voice_setting(cmd->voice_setting);
2960
print_retransmission_effort(cmd->retrans_effort);
2961
print_pkt_type(cmd->pkt_type);
2962
}
2963
2964
static void reject_sync_conn_cmd(const void *data, uint8_t size)
2965
{
2966
const struct bt_hci_cmd_reject_sync_conn *cmd = data;
2967
2968
print_bdaddr(cmd->bdaddr);
2969
print_reason(cmd->reason);
2970
}
2971
2972
static void io_capability_request_reply_cmd(const void *data, uint8_t size)
2973
{
2974
const struct bt_hci_cmd_io_capability_request_reply *cmd = data;
2975
2976
print_bdaddr(cmd->bdaddr);
2977
print_io_capability(cmd->capability);
2978
print_oob_data(cmd->oob_data);
2979
print_authentication(cmd->authentication);
2980
}
2981
2982
static void user_confirm_request_reply_cmd(const void *data, uint8_t size)
2983
{
2984
const struct bt_hci_cmd_user_confirm_request_reply *cmd = data;
2985
2986
print_bdaddr(cmd->bdaddr);
2987
}
2988
2989
static void user_confirm_request_neg_reply_cmd(const void *data, uint8_t size)
2990
{
2991
const struct bt_hci_cmd_user_confirm_request_neg_reply *cmd = data;
2992
2993
print_bdaddr(cmd->bdaddr);
2994
}
2995
2996
static void user_passkey_request_reply_cmd(const void *data, uint8_t size)
2997
{
2998
const struct bt_hci_cmd_user_passkey_request_reply *cmd = data;
2999
3000
print_bdaddr(cmd->bdaddr);
3001
print_passkey(cmd->passkey);
3002
}
3003
3004
static void user_passkey_request_neg_reply_cmd(const void *data, uint8_t size)
3005
{
3006
const struct bt_hci_cmd_user_passkey_request_neg_reply *cmd = data;
3007
3008
print_bdaddr(cmd->bdaddr);
3009
}
3010
3011
static void remote_oob_data_request_reply_cmd(const void *data, uint8_t size)
3012
{
3013
const struct bt_hci_cmd_remote_oob_data_request_reply *cmd = data;
3014
3015
print_bdaddr(cmd->bdaddr);
3016
print_hash("P-192", cmd->hash);
3017
print_randomizer("P-192", cmd->randomizer);
3018
}
3019
3020
static void remote_oob_data_request_neg_reply_cmd(const void *data, uint8_t size)
3021
{
3022
const struct bt_hci_cmd_remote_oob_data_request_neg_reply *cmd = data;
3023
3024
print_bdaddr(cmd->bdaddr);
3025
}
3026
3027
static void io_capability_request_neg_reply_cmd(const void *data, uint8_t size)
3028
{
3029
const struct bt_hci_cmd_io_capability_request_neg_reply *cmd = data;
3030
3031
print_bdaddr(cmd->bdaddr);
3032
print_reason(cmd->reason);
3033
}
3034
3035
static void create_phy_link_cmd(const void *data, uint8_t size)
3036
{
3037
const struct bt_hci_cmd_create_phy_link *cmd = data;
3038
3039
print_phy_handle(cmd->phy_handle);
3040
print_key_len(cmd->key_len);
3041
print_key_type(cmd->key_type);
3042
3043
packet_hexdump(data + 3, size - 3);
3044
}
3045
3046
static void accept_phy_link_cmd(const void *data, uint8_t size)
3047
{
3048
const struct bt_hci_cmd_accept_phy_link *cmd = data;
3049
3050
print_phy_handle(cmd->phy_handle);
3051
print_key_len(cmd->key_len);
3052
print_key_type(cmd->key_type);
3053
3054
packet_hexdump(data + 3, size - 3);
3055
}
3056
3057
static void disconn_phy_link_cmd(const void *data, uint8_t size)
3058
{
3059
const struct bt_hci_cmd_disconn_phy_link *cmd = data;
3060
3061
print_phy_handle(cmd->phy_handle);
3062
print_reason(cmd->reason);
3063
}
3064
3065
static void create_logic_link_cmd(const void *data, uint8_t size)
3066
{
3067
const struct bt_hci_cmd_create_logic_link *cmd = data;
3068
3069
print_phy_handle(cmd->phy_handle);
3070
print_flow_spec("TX", cmd->tx_flow_spec);
3071
print_flow_spec("RX", cmd->rx_flow_spec);
3072
}
3073
3074
static void accept_logic_link_cmd(const void *data, uint8_t size)
3075
{
3076
const struct bt_hci_cmd_accept_logic_link *cmd = data;
3077
3078
print_phy_handle(cmd->phy_handle);
3079
print_flow_spec("TX", cmd->tx_flow_spec);
3080
print_flow_spec("RX", cmd->rx_flow_spec);
3081
}
3082
3083
static void disconn_logic_link_cmd(const void *data, uint8_t size)
3084
{
3085
const struct bt_hci_cmd_disconn_logic_link *cmd = data;
3086
3087
print_handle(cmd->handle);
3088
}
3089
3090
static void logic_link_cancel_cmd(const void *data, uint8_t size)
3091
{
3092
const struct bt_hci_cmd_logic_link_cancel *cmd = data;
3093
3094
print_phy_handle(cmd->phy_handle);
3095
print_field("TX flow spec: 0x%2.2x", cmd->flow_spec);
3096
}
3097
3098
static void logic_link_cancel_rsp(const void *data, uint8_t size)
3099
{
3100
const struct bt_hci_rsp_logic_link_cancel *rsp = data;
3101
3102
print_status(rsp->status);
3103
print_phy_handle(rsp->phy_handle);
3104
print_field("TX flow spec: 0x%2.2x", rsp->flow_spec);
3105
}
3106
3107
static void flow_spec_modify_cmd(const void *data, uint8_t size)
3108
{
3109
const struct bt_hci_cmd_flow_spec_modify *cmd = data;
3110
3111
print_handle(cmd->handle);
3112
print_flow_spec("TX", cmd->tx_flow_spec);
3113
print_flow_spec("RX", cmd->rx_flow_spec);
3114
}
3115
3116
static void hold_mode_cmd(const void *data, uint8_t size)
3117
{
3118
const struct bt_hci_cmd_hold_mode *cmd = data;
3119
3120
print_handle(cmd->handle);
3121
print_slot_625("Hold max interval", cmd->max_interval);
3122
print_slot_625("Hold min interval", cmd->min_interval);
3123
}
3124
3125
static void sniff_mode_cmd(const void *data, uint8_t size)
3126
{
3127
const struct bt_hci_cmd_sniff_mode *cmd = data;
3128
3129
print_handle(cmd->handle);
3130
print_slot_625("Sniff max interval", cmd->max_interval);
3131
print_slot_625("Sniff min interval", cmd->min_interval);
3132
print_slot_125("Sniff attempt", cmd->attempt);
3133
print_slot_125("Sniff timeout", cmd->timeout);
3134
}
3135
3136
static void exit_sniff_mode_cmd(const void *data, uint8_t size)
3137
{
3138
const struct bt_hci_cmd_exit_sniff_mode *cmd = data;
3139
3140
print_handle(cmd->handle);
3141
}
3142
3143
static void park_state_cmd(const void *data, uint8_t size)
3144
{
3145
const struct bt_hci_cmd_park_state *cmd = data;
3146
3147
print_handle(cmd->handle);
3148
print_slot_625("Beacon max interval", cmd->max_interval);
3149
print_slot_625("Beacon min interval", cmd->min_interval);
3150
}
3151
3152
static void exit_park_state_cmd(const void *data, uint8_t size)
3153
{
3154
const struct bt_hci_cmd_exit_park_state *cmd = data;
3155
3156
print_handle(cmd->handle);
3157
}
3158
3159
static void qos_setup_cmd(const void *data, uint8_t size)
3160
{
3161
const struct bt_hci_cmd_qos_setup *cmd = data;
3162
3163
print_handle(cmd->handle);
3164
print_field("Flags: 0x%2.2x", cmd->flags);
3165
3166
print_service_type(cmd->service_type);
3167
3168
print_field("Token rate: %d", btohl(cmd->token_rate));
3169
print_field("Peak bandwidth: %d", btohl(cmd->peak_bandwidth));
3170
print_field("Latency: %d", btohl(cmd->latency));
3171
print_field("Delay variation: %d", btohl(cmd->delay_variation));
3172
}
3173
3174
static void role_discovery_cmd(const void *data, uint8_t size)
3175
{
3176
const struct bt_hci_cmd_role_discovery *cmd = data;
3177
3178
print_handle(cmd->handle);
3179
}
3180
3181
static void role_discovery_rsp(const void *data, uint8_t size)
3182
{
3183
const struct bt_hci_rsp_role_discovery *rsp = data;
3184
3185
print_status(rsp->status);
3186
print_handle(rsp->handle);
3187
print_role(rsp->role);
3188
}
3189
3190
static void switch_role_cmd(const void *data, uint8_t size)
3191
{
3192
const struct bt_hci_cmd_switch_role *cmd = data;
3193
3194
print_bdaddr(cmd->bdaddr);
3195
print_role(cmd->role);
3196
}
3197
3198
static void read_link_policy_cmd(const void *data, uint8_t size)
3199
{
3200
const struct bt_hci_cmd_read_link_policy *cmd = data;
3201
3202
print_handle(cmd->handle);
3203
}
3204
3205
static void read_link_policy_rsp(const void *data, uint8_t size)
3206
{
3207
const struct bt_hci_rsp_read_link_policy *rsp = data;
3208
3209
print_status(rsp->status);
3210
print_handle(rsp->handle);
3211
print_link_policy(rsp->policy);
3212
}
3213
3214
static void write_link_policy_cmd(const void *data, uint8_t size)
3215
{
3216
const struct bt_hci_cmd_write_link_policy *cmd = data;
3217
3218
print_handle(cmd->handle);
3219
print_link_policy(cmd->policy);
3220
}
3221
3222
static void write_link_policy_rsp(const void *data, uint8_t size)
3223
{
3224
const struct bt_hci_rsp_write_link_policy *rsp = data;
3225
3226
print_status(rsp->status);
3227
print_handle(rsp->handle);
3228
}
3229
3230
static void read_default_link_policy_rsp(const void *data, uint8_t size)
3231
{
3232
const struct bt_hci_rsp_read_default_link_policy *rsp = data;
3233
3234
print_status(rsp->status);
3235
print_link_policy(rsp->policy);
3236
}
3237
3238
static void write_default_link_policy_cmd(const void *data, uint8_t size)
3239
{
3240
const struct bt_hci_cmd_write_default_link_policy *cmd = data;
3241
3242
print_link_policy(cmd->policy);
3243
}
3244
3245
static void flow_spec_cmd(const void *data, uint8_t size)
3246
{
3247
const struct bt_hci_cmd_flow_spec *cmd = data;
3248
3249
print_handle(cmd->handle);
3250
print_field("Flags: 0x%2.2x", cmd->flags);
3251
3252
print_flow_direction(cmd->direction);
3253
print_service_type(cmd->service_type);
3254
3255
print_field("Token rate: %d", btohl(cmd->token_rate));
3256
print_field("Token bucket size: %d", btohl(cmd->token_bucket_size));
3257
print_field("Peak bandwidth: %d", btohl(cmd->peak_bandwidth));
3258
print_field("Access latency: %d", btohl(cmd->access_latency));
3259
}
3260
3261
static void sniff_subrating_cmd(const void *data, uint8_t size)
3262
{
3263
const struct bt_hci_cmd_sniff_subrating *cmd = data;
3264
3265
print_handle(cmd->handle);
3266
print_slot_625("Max latency", cmd->max_latency);
3267
print_slot_625("Min remote timeout", cmd->min_remote_timeout);
3268
print_slot_625("Min local timeout", cmd->min_local_timeout);
3269
}
3270
3271
static void sniff_subrating_rsp(const void *data, uint8_t size)
3272
{
3273
const struct bt_hci_rsp_sniff_subrating *rsp = data;
3274
3275
print_status(rsp->status);
3276
print_handle(rsp->handle);
3277
}
3278
3279
static void set_event_mask_cmd(const void *data, uint8_t size)
3280
{
3281
const struct bt_hci_cmd_set_event_mask *cmd = data;
3282
3283
print_event_mask(cmd->mask);
3284
}
3285
3286
static void set_event_filter_cmd(const void *data, uint8_t size)
3287
{
3288
uint8_t type = *((const uint8_t *) data);
3289
uint8_t filter;
3290
const char *str;
3291
3292
switch (type) {
3293
case 0x00:
3294
str = "Clear All Filters";
3295
break;
3296
case 0x01:
3297
str = "Inquiry Result";
3298
break;
3299
case 0x02:
3300
str = "Connection Setup";
3301
break;
3302
default:
3303
str = "Reserved";
3304
break;
3305
}
3306
3307
print_field("Type: %s (0x%2.2x)", str, type);
3308
3309
switch (type) {
3310
case 0x00:
3311
if (size > 1) {
3312
print_text(COLOR_ERROR, " invalid parameter size");
3313
packet_hexdump(data + 1, size - 1);
3314
}
3315
break;
3316
3317
case 0x01:
3318
filter = *((const uint8_t *) (data + 1));
3319
3320
switch (filter) {
3321
case 0x00:
3322
str = "Return responses from all devices";
3323
break;
3324
case 0x01:
3325
str = "Device with specific Class of Device";
3326
break;
3327
case 0x02:
3328
str = "Device with specific BD_ADDR";
3329
break;
3330
default:
3331
str = "Reserved";
3332
break;
3333
}
3334
3335
print_field("Filter: %s (0x%2.2x)", str, filter);
3336
packet_hexdump(data + 2, size - 2);
3337
break;
3338
3339
case 0x02:
3340
filter = *((const uint8_t *) (data + 1));
3341
3342
switch (filter) {
3343
case 0x00:
3344
str = "Allow connections all devices";
3345
break;
3346
case 0x01:
3347
str = "Allow connections with specific Class of Device";
3348
break;
3349
case 0x02:
3350
str = "Allow connections with specific BD_ADDR";
3351
break;
3352
default:
3353
str = "Reserved";
3354
break;
3355
}
3356
3357
print_field("Filter: %s (0x%2.2x)", str, filter);
3358
packet_hexdump(data + 2, size - 2);
3359
break;
3360
3361
default:
3362
filter = *((const uint8_t *) (data + 1));
3363
3364
print_field("Filter: Reserved (0x%2.2x)", filter);
3365
packet_hexdump(data + 2, size - 2);
3366
break;
3367
}
3368
}
3369
3370
static void flush_cmd(const void *data, uint8_t size)
3371
{
3372
const struct bt_hci_cmd_flush *cmd = data;
3373
3374
print_handle(cmd->handle);
3375
}
3376
3377
static void flush_rsp(const void *data, uint8_t size)
3378
{
3379
const struct bt_hci_rsp_flush *rsp = data;
3380
3381
print_status(rsp->status);
3382
print_handle(rsp->handle);
3383
}
3384
3385
static void read_pin_type_rsp(const void *data, uint8_t size)
3386
{
3387
const struct bt_hci_rsp_read_pin_type *rsp = data;
3388
3389
print_status(rsp->status);
3390
print_pin_type(rsp->pin_type);
3391
}
3392
3393
static void write_pin_type_cmd(const void *data, uint8_t size)
3394
{
3395
const struct bt_hci_cmd_write_pin_type *cmd = data;
3396
3397
print_pin_type(cmd->pin_type);
3398
}
3399
3400
static void read_stored_link_key_cmd(const void *data, uint8_t size)
3401
{
3402
const struct bt_hci_cmd_read_stored_link_key *cmd = data;
3403
3404
print_bdaddr(cmd->bdaddr);
3405
print_field("Read all: 0x%2.2x", cmd->read_all);
3406
}
3407
3408
static void read_stored_link_key_rsp(const void *data, uint8_t size)
3409
{
3410
const struct bt_hci_rsp_read_stored_link_key *rsp = data;
3411
3412
print_status(rsp->status);
3413
print_field("Max num keys: %d", btohs(rsp->max_num_keys));
3414
print_field("Num keys: %d", btohs(rsp->num_keys));
3415
}
3416
3417
static void write_stored_link_key_cmd(const void *data, uint8_t size)
3418
{
3419
const struct bt_hci_cmd_write_stored_link_key *cmd = data;
3420
3421
print_field("Num keys: %d", cmd->num_keys);
3422
3423
packet_hexdump(data + 1, size - 1);
3424
}
3425
3426
static void write_stored_link_key_rsp(const void *data, uint8_t size)
3427
{
3428
const struct bt_hci_rsp_write_stored_link_key *rsp = data;
3429
3430
print_status(rsp->status);
3431
print_field("Num keys: %d", rsp->num_keys);
3432
}
3433
3434
static void delete_stored_link_key_cmd(const void *data, uint8_t size)
3435
{
3436
const struct bt_hci_cmd_delete_stored_link_key *cmd = data;
3437
3438
print_bdaddr(cmd->bdaddr);
3439
print_field("Delete all: 0x%2.2x", cmd->delete_all);
3440
}
3441
3442
static void delete_stored_link_key_rsp(const void *data, uint8_t size)
3443
{
3444
const struct bt_hci_rsp_delete_stored_link_key *rsp = data;
3445
3446
print_status(rsp->status);
3447
print_field("Num keys: %d", btohs(rsp->num_keys));
3448
}
3449
3450
static void write_local_name_cmd(const void *data, uint8_t size)
3451
{
3452
const struct bt_hci_cmd_write_local_name *cmd = data;
3453
3454
print_name(cmd->name);
3455
}
3456
3457
static void read_local_name_rsp(const void *data, uint8_t size)
3458
{
3459
const struct bt_hci_rsp_read_local_name *rsp = data;
3460
3461
print_status(rsp->status);
3462
print_name(rsp->name);
3463
}
3464
3465
static void read_conn_accept_timeout_rsp(const void *data, uint8_t size)
3466
{
3467
const struct bt_hci_rsp_read_conn_accept_timeout *rsp = data;
3468
3469
print_status(rsp->status);
3470
print_timeout(rsp->timeout);
3471
}
3472
3473
static void write_conn_accept_timeout_cmd(const void *data, uint8_t size)
3474
{
3475
const struct bt_hci_cmd_write_conn_accept_timeout *cmd = data;
3476
3477
print_timeout(cmd->timeout);
3478
}
3479
3480
static void read_page_timeout_rsp(const void *data, uint8_t size)
3481
{
3482
const struct bt_hci_rsp_read_page_timeout *rsp = data;
3483
3484
print_status(rsp->status);
3485
print_timeout(rsp->timeout);
3486
}
3487
3488
static void write_page_timeout_cmd(const void *data, uint8_t size)
3489
{
3490
const struct bt_hci_cmd_write_page_timeout *cmd = data;
3491
3492
print_timeout(cmd->timeout);
3493
}
3494
3495
static void read_scan_enable_rsp(const void *data, uint8_t size)
3496
{
3497
const struct bt_hci_rsp_read_scan_enable *rsp = data;
3498
3499
print_status(rsp->status);
3500
print_scan_enable(rsp->enable);
3501
}
3502
3503
static void write_scan_enable_cmd(const void *data, uint8_t size)
3504
{
3505
const struct bt_hci_cmd_write_scan_enable *cmd = data;
3506
3507
print_scan_enable(cmd->enable);
3508
}
3509
3510
static void read_page_scan_activity_rsp(const void *data, uint8_t size)
3511
{
3512
const struct bt_hci_rsp_read_page_scan_activity *rsp = data;
3513
3514
print_status(rsp->status);
3515
print_interval(rsp->interval);
3516
print_window(rsp->window);
3517
}
3518
3519
static void write_page_scan_activity_cmd(const void *data, uint8_t size)
3520
{
3521
const struct bt_hci_cmd_write_page_scan_activity *cmd = data;
3522
3523
print_interval(cmd->interval);
3524
print_window(cmd->window);
3525
}
3526
3527
static void read_inquiry_scan_activity_rsp(const void *data, uint8_t size)
3528
{
3529
const struct bt_hci_rsp_read_inquiry_scan_activity *rsp = data;
3530
3531
print_status(rsp->status);
3532
print_interval(rsp->interval);
3533
print_window(rsp->window);
3534
}
3535
3536
static void write_inquiry_scan_activity_cmd(const void *data, uint8_t size)
3537
{
3538
const struct bt_hci_cmd_write_inquiry_scan_activity *cmd = data;
3539
3540
print_interval(cmd->interval);
3541
print_window(cmd->window);
3542
}
3543
3544
static void read_auth_enable_rsp(const void *data, uint8_t size)
3545
{
3546
const struct bt_hci_rsp_read_auth_enable *rsp = data;
3547
3548
print_status(rsp->status);
3549
print_auth_enable(rsp->enable);
3550
}
3551
3552
static void write_auth_enable_cmd(const void *data, uint8_t size)
3553
{
3554
const struct bt_hci_cmd_write_auth_enable *cmd = data;
3555
3556
print_auth_enable(cmd->enable);
3557
}
3558
3559
static void read_encrypt_mode_rsp(const void *data, uint8_t size)
3560
{
3561
const struct bt_hci_rsp_read_encrypt_mode *rsp = data;
3562
3563
print_status(rsp->status);
3564
print_encrypt_mode(rsp->mode);
3565
}
3566
3567
static void write_encrypt_mode_cmd(const void *data, uint8_t size)
3568
{
3569
const struct bt_hci_cmd_write_encrypt_mode *cmd = data;
3570
3571
print_encrypt_mode(cmd->mode);
3572
}
3573
3574
static void read_class_of_dev_rsp(const void *data, uint8_t size)
3575
{
3576
const struct bt_hci_rsp_read_class_of_dev *rsp = data;
3577
3578
print_status(rsp->status);
3579
print_dev_class(rsp->dev_class);
3580
}
3581
3582
static void write_class_of_dev_cmd(const void *data, uint8_t size)
3583
{
3584
const struct bt_hci_cmd_write_class_of_dev *cmd = data;
3585
3586
print_dev_class(cmd->dev_class);
3587
}
3588
3589
static void read_voice_setting_rsp(const void *data, uint8_t size)
3590
{
3591
const struct bt_hci_rsp_read_voice_setting *rsp = data;
3592
3593
print_status(rsp->status);
3594
print_voice_setting(rsp->setting);
3595
}
3596
3597
static void write_voice_setting_cmd(const void *data, uint8_t size)
3598
{
3599
const struct bt_hci_cmd_write_voice_setting *cmd = data;
3600
3601
print_voice_setting(cmd->setting);
3602
}
3603
3604
static void host_buffer_size_cmd(const void *data, uint8_t size)
3605
{
3606
const struct bt_hci_cmd_host_buffer_size *cmd = data;
3607
3608
print_field("ACL MTU: %-4d ACL max packet: %d",
3609
btohs(cmd->acl_mtu), btohs(cmd->acl_max_pkt));
3610
print_field("SCO MTU: %-4d SCO max packet: %d",
3611
cmd->sco_mtu, btohs(cmd->sco_max_pkt));
3612
}
3613
3614
static void read_link_supv_timeout_cmd(const void *data, uint8_t size)
3615
{
3616
const struct bt_hci_cmd_read_link_supv_timeout *cmd = data;
3617
3618
print_handle(cmd->handle);
3619
}
3620
3621
static void read_link_supv_timeout_rsp(const void *data, uint8_t size)
3622
{
3623
const struct bt_hci_rsp_read_link_supv_timeout *rsp = data;
3624
3625
print_status(rsp->status);
3626
print_handle(rsp->handle);
3627
print_timeout(rsp->timeout);
3628
}
3629
3630
static void write_link_supv_timeout_cmd(const void *data, uint8_t size)
3631
{
3632
const struct bt_hci_cmd_write_link_supv_timeout *cmd = data;
3633
3634
print_handle(cmd->handle);
3635
print_timeout(cmd->timeout);
3636
}
3637
3638
static void write_link_supv_timeout_rsp(const void *data, uint8_t size)
3639
{
3640
const struct bt_hci_rsp_write_link_supv_timeout *rsp = data;
3641
3642
print_status(rsp->status);
3643
print_handle(rsp->handle);
3644
}
3645
3646
static void read_num_supported_iac_rsp(const void *data, uint8_t size)
3647
{
3648
const struct bt_hci_rsp_read_num_supported_iac *rsp = data;
3649
3650
print_status(rsp->status);
3651
print_field("Number of IAC: %d", rsp->num_iac);
3652
}
3653
3654
static void read_current_iac_lap_rsp(const void *data, uint8_t size)
3655
{
3656
const struct bt_hci_rsp_read_current_iac_lap *rsp = data;
3657
uint8_t i;
3658
3659
print_status(rsp->status);
3660
print_field("Number of IAC: %d", rsp->num_iac);
3661
3662
for (i = 0; i < rsp->num_iac; i++)
3663
print_iac(rsp->iac_lap + (i * 3));
3664
}
3665
3666
static void write_current_iac_lap_cmd(const void *data, uint8_t size)
3667
{
3668
const struct bt_hci_cmd_write_current_iac_lap *cmd = data;
3669
uint8_t i;
3670
3671
print_field("Number of IAC: %d", cmd->num_iac);
3672
3673
for (i = 0; i < cmd->num_iac; i++)
3674
print_iac(cmd->iac_lap + (i * 3));
3675
}
3676
3677
static void read_page_scan_period_mode_rsp(const void *data, uint8_t size)
3678
{
3679
const struct bt_hci_rsp_read_page_scan_period_mode *rsp = data;
3680
3681
print_status(rsp->status);
3682
print_pscan_period_mode(rsp->mode);
3683
}
3684
3685
static void write_page_scan_period_mode_cmd(const void *data, uint8_t size)
3686
{
3687
const struct bt_hci_cmd_write_page_scan_period_mode *cmd = data;
3688
3689
print_pscan_period_mode(cmd->mode);
3690
}
3691
3692
static void read_page_scan_mode_rsp(const void *data, uint8_t size)
3693
{
3694
const struct bt_hci_rsp_read_page_scan_mode *rsp = data;
3695
3696
print_status(rsp->status);
3697
print_pscan_mode(rsp->mode);
3698
}
3699
3700
static void write_page_scan_mode_cmd(const void *data, uint8_t size)
3701
{
3702
const struct bt_hci_cmd_write_page_scan_mode *cmd = data;
3703
3704
print_pscan_mode(cmd->mode);
3705
}
3706
3707
static void set_afh_host_classification_cmd(const void *data, uint8_t size)
3708
{
3709
const struct bt_hci_cmd_set_afh_host_classification *cmd = data;
3710
3711
print_channel_map(cmd->map);
3712
}
3713
3714
static void read_inquiry_scan_type_rsp(const void *data, uint8_t size)
3715
{
3716
const struct bt_hci_rsp_read_inquiry_scan_type *rsp = data;
3717
3718
print_status(rsp->status);
3719
print_inquiry_scan_type(rsp->type);
3720
}
3721
3722
static void write_inquiry_scan_type_cmd(const void *data, uint8_t size)
3723
{
3724
const struct bt_hci_cmd_write_inquiry_scan_type *cmd = data;
3725
3726
print_inquiry_scan_type(cmd->type);
3727
}
3728
3729
static void read_inquiry_mode_rsp(const void *data, uint8_t size)
3730
{
3731
const struct bt_hci_rsp_read_inquiry_mode *rsp = data;
3732
3733
print_status(rsp->status);
3734
print_inquiry_mode(rsp->mode);
3735
}
3736
3737
static void write_inquiry_mode_cmd(const void *data, uint8_t size)
3738
{
3739
const struct bt_hci_cmd_write_inquiry_mode *cmd = data;
3740
3741
print_inquiry_mode(cmd->mode);
3742
}
3743
3744
static void read_page_scan_type_rsp(const void *data, uint8_t size)
3745
{
3746
const struct bt_hci_rsp_read_page_scan_type *rsp = data;
3747
3748
print_status(rsp->status);
3749
print_pscan_type(rsp->type);
3750
}
3751
3752
static void write_page_scan_type_cmd(const void *data, uint8_t size)
3753
{
3754
const struct bt_hci_cmd_write_page_scan_type *cmd = data;
3755
3756
print_pscan_type(cmd->type);
3757
}
3758
3759
static void read_afh_assessment_mode_rsp(const void *data, uint8_t size)
3760
{
3761
const struct bt_hci_rsp_read_afh_assessment_mode *rsp = data;
3762
3763
print_status(rsp->status);
3764
print_afh_mode(rsp->mode);
3765
}
3766
3767
static void write_afh_assessment_mode_cmd(const void *data, uint8_t size)
3768
{
3769
const struct bt_hci_cmd_write_afh_assessment_mode *cmd = data;
3770
3771
print_afh_mode(cmd->mode);
3772
}
3773
3774
static void read_ext_inquiry_response_rsp(const void *data, uint8_t size)
3775
{
3776
const struct bt_hci_rsp_read_ext_inquiry_response *rsp = data;
3777
3778
print_status(rsp->status);
3779
print_fec(rsp->fec);
3780
print_eir(rsp->data, sizeof(rsp->data), false);
3781
}
3782
3783
static void write_ext_inquiry_response_cmd(const void *data, uint8_t size)
3784
{
3785
const struct bt_hci_cmd_write_ext_inquiry_response *cmd = data;
3786
3787
print_fec(cmd->fec);
3788
print_eir(cmd->data, sizeof(cmd->data), false);
3789
}
3790
3791
static void refresh_encrypt_key_cmd(const void *data, uint8_t size)
3792
{
3793
const struct bt_hci_cmd_refresh_encrypt_key *cmd = data;
3794
3795
print_handle(cmd->handle);
3796
}
3797
3798
static void read_simple_pairing_mode_rsp(const void *data, uint8_t size)
3799
{
3800
const struct bt_hci_rsp_read_simple_pairing_mode *rsp = data;
3801
3802
print_status(rsp->status);
3803
print_simple_pairing_mode(rsp->mode);
3804
}
3805
3806
static void write_simple_pairing_mode_cmd(const void *data, uint8_t size)
3807
{
3808
const struct bt_hci_cmd_write_simple_pairing_mode *cmd = data;
3809
3810
print_simple_pairing_mode(cmd->mode);
3811
}
3812
3813
static void read_local_oob_data_rsp(const void *data, uint8_t size)
3814
{
3815
const struct bt_hci_rsp_read_local_oob_data *rsp = data;
3816
3817
print_status(rsp->status);
3818
print_hash("P-192", rsp->hash);
3819
print_randomizer("P-192", rsp->randomizer);
3820
}
3821
3822
static void read_inquiry_resp_tx_power_rsp(const void *data, uint8_t size)
3823
{
3824
const struct bt_hci_rsp_read_inquiry_resp_tx_power *rsp = data;
3825
3826
print_status(rsp->status);
3827
print_field("TX power: %d dBm", rsp->level);
3828
}
3829
3830
static void write_inquiry_tx_power_cmd(const void *data, uint8_t size)
3831
{
3832
const struct bt_hci_cmd_write_inquiry_tx_power *cmd = data;
3833
3834
print_field("TX power: %d dBm", cmd->level);
3835
}
3836
3837
static void enhanced_flush_cmd(const void *data, uint8_t size)
3838
{
3839
const struct bt_hci_cmd_enhanced_flush *cmd = data;
3840
const char *str;
3841
3842
print_handle(cmd->handle);
3843
3844
switch (cmd->type) {
3845
case 0x00:
3846
str = "Automatic flushable only";
3847
break;
3848
default:
3849
str = "Reserved";
3850
break;
3851
}
3852
3853
print_field("Type: %s (0x%2.2x)", str, cmd->type);
3854
}
3855
3856
static void set_event_mask_page2_cmd(const void *data, uint8_t size)
3857
{
3858
const struct bt_hci_cmd_set_event_mask_page2 *cmd = data;
3859
3860
print_event_mask_page2(cmd->mask);
3861
}
3862
3863
static void read_location_data_rsp(const void *data, uint8_t size)
3864
{
3865
const struct bt_hci_rsp_read_location_data *rsp = data;
3866
3867
print_status(rsp->status);
3868
print_location_domain_aware(rsp->domain_aware);
3869
print_location_domain(rsp->domain);
3870
print_location_domain_options(rsp->domain_options);
3871
print_location_options(rsp->options);
3872
}
3873
3874
static void write_location_data_cmd(const void *data, uint8_t size)
3875
{
3876
const struct bt_hci_cmd_write_location_data *cmd = data;
3877
3878
print_location_domain_aware(cmd->domain_aware);
3879
print_location_domain(cmd->domain);
3880
print_location_domain_options(cmd->domain_options);
3881
print_location_options(cmd->options);
3882
}
3883
3884
static void read_flow_control_mode_rsp(const void *data, uint8_t size)
3885
{
3886
const struct bt_hci_rsp_read_flow_control_mode *rsp = data;
3887
3888
print_status(rsp->status);
3889
print_flow_control_mode(rsp->mode);
3890
}
3891
3892
static void write_flow_control_mode_cmd(const void *data, uint8_t size)
3893
{
3894
const struct bt_hci_cmd_write_flow_control_mode *cmd = data;
3895
3896
print_flow_control_mode(cmd->mode);
3897
}
3898
3899
static void read_le_host_supported_rsp(const void *data, uint8_t size)
3900
{
3901
const struct bt_hci_rsp_read_le_host_supported *rsp = data;
3902
3903
print_status(rsp->status);
3904
print_field("Supported: 0x%2.2x", rsp->supported);
3905
print_field("Simultaneous: 0x%2.2x", rsp->simultaneous);
3906
}
3907
3908
static void write_le_host_supported_cmd(const void *data, uint8_t size)
3909
{
3910
const struct bt_hci_cmd_write_le_host_supported *cmd = data;
3911
3912
print_field("Supported: 0x%2.2x", cmd->supported);
3913
print_field("Simultaneous: 0x%2.2x", cmd->simultaneous);
3914
}
3915
3916
static void read_sync_train_params_rsp(const void *data, uint8_t size)
3917
{
3918
const struct bt_hci_rsp_read_sync_train_params *rsp = data;
3919
3920
print_status(rsp->status);
3921
print_interval(rsp->interval);
3922
print_field("Timeout: %.3f msec (0x%8.8x)",
3923
btohl(rsp->timeout) * 0.625, btohl(rsp->timeout));
3924
print_field("Service Data: 0x%2.2x", rsp->service_data);
3925
}
3926
3927
static void read_local_version_rsp(const void *data, uint8_t size)
3928
{
3929
const struct bt_hci_rsp_read_local_version *rsp = data;
3930
3931
print_status(rsp->status);
3932
print_hci_version(rsp->hci_ver, rsp->hci_rev);
3933
3934
switch (index_list[index_current].type) {
3935
case HCI_BREDR:
3936
print_lmp_version(rsp->lmp_ver, rsp->lmp_subver);
3937
break;
3938
case HCI_AMP:
3939
print_pal_version(rsp->lmp_ver, rsp->lmp_subver);
3940
break;
3941
}
3942
3943
print_manufacturer(rsp->manufacturer);
3944
}
3945
3946
static void read_local_commands_rsp(const void *data, uint8_t size)
3947
{
3948
const struct bt_hci_rsp_read_local_commands *rsp = data;
3949
3950
print_status(rsp->status);
3951
print_commands(rsp->commands);
3952
}
3953
3954
static void read_local_features_rsp(const void *data, uint8_t size)
3955
{
3956
const struct bt_hci_rsp_read_local_features *rsp = data;
3957
3958
print_status(rsp->status);
3959
print_features(0, rsp->features, 0x00);
3960
}
3961
3962
static void read_local_ext_features_cmd(const void *data, uint8_t size)
3963
{
3964
const struct bt_hci_cmd_read_local_ext_features *cmd = data;
3965
3966
print_field("Page: %d", cmd->page);
3967
}
3968
3969
static void read_local_ext_features_rsp(const void *data, uint8_t size)
3970
{
3971
const struct bt_hci_rsp_read_local_ext_features *rsp = data;
3972
3973
print_status(rsp->status);
3974
print_field("Page: %d/%d", rsp->page, rsp->max_page);
3975
print_features(rsp->page, rsp->features, 0x00);
3976
}
3977
3978
static void read_buffer_size_rsp(const void *data, uint8_t size)
3979
{
3980
const struct bt_hci_rsp_read_buffer_size *rsp = data;
3981
3982
print_status(rsp->status);
3983
print_field("ACL MTU: %-4d ACL max packet: %d",
3984
btohs(rsp->acl_mtu), btohs(rsp->acl_max_pkt));
3985
print_field("SCO MTU: %-4d SCO max packet: %d",
3986
rsp->sco_mtu, btohs(rsp->sco_max_pkt));
3987
}
3988
3989
static void read_country_code_rsp(const void *data, uint8_t size)
3990
{
3991
const struct bt_hci_rsp_read_country_code *rsp = data;
3992
const char *str;
3993
3994
print_status(rsp->status);
3995
3996
switch (rsp->code) {
3997
case 0x00:
3998
str = "North America, Europe*, Japan";
3999
break;
4000
case 0x01:
4001
str = "France";
4002
break;
4003
default:
4004
str = "Reserved";
4005
break;
4006
}
4007
4008
print_field("Country code: %s (0x%2.2x)", str, rsp->code);
4009
}
4010
4011
static void read_bd_addr_rsp(const void *data, uint8_t size)
4012
{
4013
const struct bt_hci_rsp_read_bd_addr *rsp = data;
4014
4015
print_status(rsp->status);
4016
print_bdaddr(rsp->bdaddr);
4017
}
4018
4019
static void read_data_block_size_rsp(const void *data, uint8_t size)
4020
{
4021
const struct bt_hci_rsp_read_data_block_size *rsp = data;
4022
4023
print_status(rsp->status);
4024
print_field("Max ACL length: %d", btohs(rsp->max_acl_len));
4025
print_field("Block length: %d", btohs(rsp->block_len));
4026
print_field("Num blocks: %d", btohs(rsp->num_blocks));
4027
}
4028
4029
static void read_failed_contact_counter_cmd(const void *data, uint8_t size)
4030
{
4031
const struct bt_hci_cmd_read_failed_contact_counter *cmd = data;
4032
4033
print_handle(cmd->handle);
4034
}
4035
4036
static void read_failed_contact_counter_rsp(const void *data, uint8_t size)
4037
{
4038
const struct bt_hci_rsp_read_failed_contact_counter *rsp = data;
4039
4040
print_status(rsp->status);
4041
print_handle(rsp->handle);
4042
print_field("Counter: %u", htobs(rsp->counter));
4043
}
4044
4045
static void reset_failed_contact_counter_cmd(const void *data, uint8_t size)
4046
{
4047
const struct bt_hci_cmd_reset_failed_contact_counter *cmd = data;
4048
4049
print_handle(cmd->handle);
4050
}
4051
4052
static void reset_failed_contact_counter_rsp(const void *data, uint8_t size)
4053
{
4054
const struct bt_hci_rsp_reset_failed_contact_counter *rsp = data;
4055
4056
print_status(rsp->status);
4057
print_handle(rsp->handle);
4058
}
4059
4060
static void read_link_quality_cmd(const void *data, uint8_t size)
4061
{
4062
const struct bt_hci_cmd_read_link_quality *cmd = data;
4063
4064
print_handle(cmd->handle);
4065
}
4066
4067
static void read_link_quality_rsp(const void *data, uint8_t size)
4068
{
4069
const struct bt_hci_rsp_read_link_quality *rsp = data;
4070
4071
print_status(rsp->status);
4072
print_handle(rsp->handle);
4073
print_field("Link quality: 0x%2.2x", rsp->link_quality);
4074
}
4075
4076
static void read_rssi_cmd(const void *data, uint8_t size)
4077
{
4078
const struct bt_hci_cmd_read_rssi *cmd = data;
4079
4080
print_handle(cmd->handle);
4081
}
4082
4083
static void read_rssi_rsp(const void *data, uint8_t size)
4084
{
4085
const struct bt_hci_rsp_read_rssi *rsp = data;
4086
4087
print_status(rsp->status);
4088
print_handle(rsp->handle);
4089
print_rssi(rsp->rssi);
4090
}
4091
4092
static void read_afh_channel_map_cmd(const void *data, uint8_t size)
4093
{
4094
const struct bt_hci_cmd_read_afh_channel_map *cmd = data;
4095
4096
print_handle(cmd->handle);
4097
}
4098
4099
static void read_afh_channel_map_rsp(const void *data, uint8_t size)
4100
{
4101
const struct bt_hci_rsp_read_afh_channel_map *rsp = data;
4102
4103
print_status(rsp->status);
4104
print_handle(rsp->handle);
4105
print_afh_mode(rsp->mode);
4106
print_channel_map(rsp->map);
4107
}
4108
4109
static void read_clock_cmd(const void *data, uint8_t size)
4110
{
4111
const struct bt_hci_cmd_read_clock *cmd = data;
4112
const char *str;
4113
4114
print_handle(cmd->handle);
4115
4116
switch (cmd->type) {
4117
case 0x00:
4118
str = "Local clock";
4119
break;
4120
case 0x01:
4121
str = "Piconet clock";
4122
break;
4123
default:
4124
str = "Reserved";
4125
break;
4126
}
4127
4128
print_field("Type: %s (0x%2.2x)", str, cmd->type);
4129
}
4130
4131
static void read_clock_rsp(const void *data, uint8_t size)
4132
{
4133
const struct bt_hci_rsp_read_clock *rsp = data;
4134
4135
print_status(rsp->status);
4136
print_handle(rsp->handle);
4137
print_clock(rsp->clock);
4138
print_clock_accuracy(rsp->accuracy);
4139
}
4140
4141
static void read_encrypt_key_size_cmd(const void *data, uint8_t size)
4142
{
4143
const struct bt_hci_cmd_read_encrypt_key_size *cmd = data;
4144
4145
print_handle(cmd->handle);
4146
}
4147
4148
static void read_encrypt_key_size_rsp(const void *data, uint8_t size)
4149
{
4150
const struct bt_hci_rsp_read_encrypt_key_size *rsp = data;
4151
4152
print_status(rsp->status);
4153
print_handle(rsp->handle);
4154
print_key_size(rsp->key_size);
4155
}
4156
4157
static void read_local_amp_info_rsp(const void *data, uint8_t size)
4158
{
4159
const struct bt_hci_rsp_read_local_amp_info *rsp = data;
4160
const char *str;
4161
4162
print_status(rsp->status);
4163
print_amp_status(rsp->amp_status);
4164
4165
print_field("Total bandwidth: %d kbps", btohl(rsp->total_bw));
4166
print_field("Max guaranteed bandwidth: %d kbps", btohl(rsp->max_bw));
4167
print_field("Min latency: %d", btohl(rsp->min_latency));
4168
print_field("Max PDU size: %d", btohl(rsp->max_pdu));
4169
4170
switch (rsp->amp_type) {
4171
case 0x00:
4172
str = "Primary BR/EDR Controller";
4173
break;
4174
case 0x01:
4175
str = "802.11 AMP Controller";
4176
break;
4177
default:
4178
str = "Reserved";
4179
break;
4180
}
4181
4182
print_field("Controller type: %s (0x%2.2x)", str, rsp->amp_type);
4183
4184
print_field("PAL capabilities: 0x%4.4x", btohs(rsp->pal_cap));
4185
print_field("Max ASSOC length: %d", btohs(rsp->max_assoc_len));
4186
print_field("Max flush timeout: %d", btohl(rsp->max_flush_to));
4187
print_field("Best effort flush timeout: %d", btohl(rsp->be_flush_to));
4188
}
4189
4190
static void read_local_amp_assoc_cmd(const void *data, uint8_t size)
4191
{
4192
const struct bt_hci_cmd_read_local_amp_assoc *cmd = data;
4193
4194
print_phy_handle(cmd->phy_handle);
4195
print_field("Length so far: %d", btohs(cmd->len_so_far));
4196
print_field("Max ASSOC length: %d", btohs(cmd->max_assoc_len));
4197
}
4198
4199
static void read_local_amp_assoc_rsp(const void *data, uint8_t size)
4200
{
4201
const struct bt_hci_rsp_read_local_amp_assoc *rsp = data;
4202
4203
print_status(rsp->status);
4204
print_phy_handle(rsp->phy_handle);
4205
print_field("Remaining ASSOC length: %d", btohs(rsp->remain_assoc_len));
4206
4207
packet_hexdump(data + 4, size - 4);
4208
}
4209
4210
static void write_remote_amp_assoc_cmd(const void *data, uint8_t size)
4211
{
4212
const struct bt_hci_cmd_write_remote_amp_assoc *cmd = data;
4213
4214
print_phy_handle(cmd->phy_handle);
4215
print_field("Length so far: %d", btohs(cmd->len_so_far));
4216
print_field("Remaining ASSOC length: %d", btohs(cmd->remain_assoc_len));
4217
4218
packet_hexdump(data + 5, size - 5);
4219
}
4220
4221
static void write_remote_amp_assoc_rsp(const void *data, uint8_t size)
4222
{
4223
const struct bt_hci_rsp_write_remote_amp_assoc *rsp = data;
4224
4225
print_status(rsp->status);
4226
print_phy_handle(rsp->phy_handle);
4227
}
4228
4229
static void le_set_event_mask_cmd(const void *data, uint8_t size)
4230
{
4231
const struct bt_hci_cmd_le_set_event_mask *cmd = data;
4232
4233
print_event_mask_le(cmd->mask);
4234
}
4235
4236
static void le_read_buffer_size_rsp(const void *data, uint8_t size)
4237
{
4238
const struct bt_hci_rsp_le_read_buffer_size *rsp = data;
4239
4240
print_status(rsp->status);
4241
print_field("Data packet length: %d", btohs(rsp->le_mtu));
4242
print_field("Num data packets: %d", rsp->le_max_pkt);
4243
}
4244
4245
static void le_read_local_features_rsp(const void *data, uint8_t size)
4246
{
4247
const struct bt_hci_rsp_le_read_local_features *rsp = data;
4248
4249
print_status(rsp->status);
4250
print_features(0, rsp->features, 0x01);
4251
}
4252
4253
static void le_set_random_address_cmd(const void *data, uint8_t size)
4254
{
4255
const struct bt_hci_cmd_le_set_random_address *cmd = data;
4256
4257
print_addr("Address", cmd->addr, 0x01);
4258
}
4259
4260
static void le_set_adv_parameters_cmd(const void *data, uint8_t size)
4261
{
4262
const struct bt_hci_cmd_le_set_adv_parameters *cmd = data;
4263
const char *str;
4264
4265
print_slot_625("Min advertising interval", cmd->min_interval);
4266
print_slot_625("Max advertising interval", cmd->max_interval);
4267
4268
switch (cmd->type) {
4269
case 0x00:
4270
str = "Connectable undirected - ADV_IND";
4271
break;
4272
case 0x01:
4273
str = "Connectable directed - ADV_DIRECT_IND";
4274
break;
4275
case 0x02:
4276
str = "Scannable undirected - ADV_SCAN_IND";
4277
break;
4278
case 0x03:
4279
str = "Non connectable undirect - ADV_NONCONN_IND";
4280
break;
4281
default:
4282
str = "Reserved";
4283
break;
4284
}
4285
4286
print_field("Type: %s (0x%2.2x)", str, cmd->type);
4287
4288
print_addr_type("Own address type", cmd->own_addr_type);
4289
print_addr_type("Direct address type", cmd->direct_addr_type);
4290
print_addr("Direct address", cmd->direct_addr, cmd->direct_addr_type);
4291
4292
switch (cmd->channel_map) {
4293
case 0x01:
4294
str = "37";
4295
break;
4296
case 0x02:
4297
str = "38";
4298
break;
4299
case 0x03:
4300
str = "37, 38";
4301
break;
4302
case 0x04:
4303
str = "39";
4304
break;
4305
case 0x05:
4306
str = "37, 39";
4307
break;
4308
case 0x06:
4309
str = "38, 39";
4310
break;
4311
case 0x07:
4312
str = "37, 38, 39";
4313
break;
4314
default:
4315
str = "Reserved";
4316
break;
4317
}
4318
4319
print_field("Channel map: %s (0x%2.2x)", str, cmd->channel_map);
4320
4321
switch (cmd->filter_policy) {
4322
case 0x00:
4323
str = "Allow Scan Request from Any, "
4324
"Allow Connect Request from Any";
4325
break;
4326
case 0x01:
4327
str = "Allow Scan Request from White List Only, "
4328
"Allow Connect Request from Any";
4329
break;
4330
case 0x02:
4331
str = "Allow Scan Request from Any, "
4332
"Allow Connect Request from White List Only";
4333
break;
4334
case 0x03:
4335
str = "Allow Scan Request from White List Only, "
4336
"Allow Connect Request from White List Only";
4337
default:
4338
str = "Reserved";
4339
break;
4340
}
4341
4342
print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
4343
}
4344
4345
static void le_read_adv_tx_power_rsp(const void *data, uint8_t size)
4346
{
4347
const struct bt_hci_rsp_le_read_adv_tx_power *rsp = data;
4348
4349
print_status(rsp->status);
4350
print_field("TX power: %d dBm", rsp->level);
4351
}
4352
4353
static void le_set_adv_data_cmd(const void *data, uint8_t size)
4354
{
4355
const struct bt_hci_cmd_le_set_adv_data *cmd = data;
4356
4357
print_field("Length: %d", cmd->len);
4358
print_eir(cmd->data, cmd->len, true);
4359
}
4360
4361
static void le_set_scan_rsp_data_cmd(const void *data, uint8_t size)
4362
{
4363
const struct bt_hci_cmd_le_set_scan_rsp_data *cmd = data;
4364
4365
print_field("Length: %d", cmd->len);
4366
print_eir(cmd->data, cmd->len, true);
4367
}
4368
4369
static void le_set_adv_enable_cmd(const void *data, uint8_t size)
4370
{
4371
const struct bt_hci_cmd_le_set_adv_enable *cmd = data;
4372
const char *str;
4373
4374
switch (cmd->enable) {
4375
case 0x00:
4376
str = "Disabled";
4377
break;
4378
case 0x01:
4379
str = "Enabled";
4380
break;
4381
default:
4382
str = "Reserved";
4383
break;
4384
}
4385
4386
print_field("Advertising: %s (0x%2.2x)", str, cmd->enable);
4387
}
4388
4389
static void le_set_scan_parameters_cmd(const void *data, uint8_t size)
4390
{
4391
const struct bt_hci_cmd_le_set_scan_parameters *cmd = data;
4392
const char *str;
4393
4394
switch (cmd->type) {
4395
case 0x00:
4396
str = "Passive";
4397
break;
4398
case 0x01:
4399
str = "Active";
4400
break;
4401
default:
4402
str = "Reserved";
4403
break;
4404
}
4405
4406
print_field("Type: %s (0x%2.2x)", str, cmd->type);
4407
4408
print_interval(cmd->interval);
4409
print_window(cmd->window);
4410
print_addr_type("Own address type", cmd->own_addr_type);
4411
4412
switch (cmd->filter_policy) {
4413
case 0x00:
4414
str = "Accept all advertisement";
4415
break;
4416
case 0x01:
4417
str = "Ignore not in white list";
4418
break;
4419
default:
4420
str = "Reserved";
4421
break;
4422
}
4423
4424
print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
4425
}
4426
4427
static void le_set_scan_enable_cmd(const void *data, uint8_t size)
4428
{
4429
const struct bt_hci_cmd_le_set_scan_enable *cmd = data;
4430
const char *str;
4431
4432
switch (cmd->enable) {
4433
case 0x00:
4434
str = "Disabled";
4435
break;
4436
case 0x01:
4437
str = "Enabled";
4438
break;
4439
default:
4440
str = "Reserved";
4441
break;
4442
}
4443
4444
print_field("Scanning: %s (0x%2.2x)", str, cmd->enable);
4445
4446
switch (cmd->filter_dup) {
4447
case 0x00:
4448
str = "Disabled";
4449
break;
4450
case 0x01:
4451
str = "Enabled";
4452
break;
4453
default:
4454
str = "Reserved";
4455
break;
4456
}
4457
4458
print_field("Filter duplicates: %s (0x%2.2x)", str, cmd->filter_dup);
4459
}
4460
4461
static void le_create_conn_cmd(const void *data, uint8_t size)
4462
{
4463
const struct bt_hci_cmd_le_create_conn *cmd = data;
4464
const char *str;
4465
4466
print_slot_625("Scan interval", cmd->scan_interval);
4467
print_slot_625("Scan window", cmd->scan_window);
4468
4469
switch (cmd->filter_policy) {
4470
case 0x00:
4471
str = "White list is not used";
4472
break;
4473
case 0x01:
4474
str = "White list is used";
4475
break;
4476
default:
4477
str = "Reserved";
4478
break;
4479
}
4480
4481
print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);
4482
4483
print_addr_type("Peer address type", cmd->peer_addr_type);
4484
print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);
4485
print_addr_type("Own address type", cmd->own_addr_type);
4486
4487
print_slot_125("Min connection interval", cmd->min_interval);
4488
print_slot_125("Max connection interval", cmd->max_interval);
4489
print_field("Connection latency: 0x%4.4x", btohs(cmd->latency));
4490
print_field("Supervision timeout: %d msec (0x%4.4x)",
4491
btohs(cmd->supv_timeout) * 10, btohs(cmd->supv_timeout));
4492
print_slot_625("Min connection length", cmd->min_length);
4493
print_slot_625("Max connection length", cmd->max_length);
4494
}
4495
4496
static void le_read_white_list_size_rsp(const void *data, uint8_t size)
4497
{
4498
const struct bt_hci_rsp_le_read_white_list_size *rsp = data;
4499
4500
print_status(rsp->status);
4501
print_field("Size: %u", rsp->size);
4502
}
4503
4504
static void le_add_to_white_list_cmd(const void *data, uint8_t size)
4505
{
4506
const struct bt_hci_cmd_le_add_to_white_list *cmd = data;
4507
4508
print_addr_type("Address type", cmd->addr_type);
4509
print_addr("Address", cmd->addr, cmd->addr_type);
4510
}
4511
4512
static void le_remove_from_white_list_cmd(const void *data, uint8_t size)
4513
{
4514
const struct bt_hci_cmd_le_remove_from_white_list *cmd = data;
4515
4516
print_addr_type("Address type", cmd->addr_type);
4517
print_addr("Address", cmd->addr, cmd->addr_type);
4518
}
4519
4520
static void le_conn_update_cmd(const void *data, uint8_t size)
4521
{
4522
const struct bt_hci_cmd_le_conn_update *cmd = data;
4523
4524
print_handle(cmd->handle);
4525
print_slot_125("Min connection interval", cmd->min_interval);
4526
print_slot_125("Max connection interval", cmd->max_interval);
4527
print_field("Connection latency: 0x%4.4x", btohs(cmd->latency));
4528
print_field("Supervision timeout: %d msec (0x%4.4x)",
4529
btohs(cmd->supv_timeout) * 10, btohs(cmd->supv_timeout));
4530
print_slot_625("Min connection length", cmd->min_length);
4531
print_slot_625("Max connection length", cmd->max_length);
4532
}
4533
4534
static void le_set_host_classification_cmd(const void *data, uint8_t size)
4535
{
4536
const struct bt_hci_cmd_le_set_host_classification *cmd = data;
4537
4538
print_le_channel_map(cmd->map);
4539
}
4540
4541
static void le_read_channel_map_cmd(const void *data, uint8_t size)
4542
{
4543
const struct bt_hci_cmd_le_read_channel_map *cmd = data;
4544
4545
print_handle(cmd->handle);
4546
}
4547
4548
static void le_read_channel_map_rsp(const void *data, uint8_t size)
4549
{
4550
const struct bt_hci_rsp_le_read_channel_map *rsp = data;
4551
4552
print_status(rsp->status);
4553
print_handle(rsp->handle);
4554
print_le_channel_map(rsp->map);
4555
}
4556
4557
static void le_read_remote_features_cmd(const void *data, uint8_t size)
4558
{
4559
const struct bt_hci_cmd_le_read_remote_features *cmd = data;
4560
4561
print_handle(cmd->handle);
4562
}
4563
4564
static void le_encrypt_cmd(const void *data, uint8_t size)
4565
{
4566
const struct bt_hci_cmd_le_encrypt *cmd = data;
4567
4568
print_key("Key", cmd->key);
4569
print_key("Plaintext data", cmd->plaintext);
4570
}
4571
4572
static void le_encrypt_rsp(const void *data, uint8_t size)
4573
{
4574
const struct bt_hci_rsp_le_encrypt *rsp = data;
4575
4576
print_status(rsp->status);
4577
print_key("Encrypted data", rsp->data);
4578
}
4579
4580
static void le_rand_rsp(const void *data, uint8_t size)
4581
{
4582
const struct bt_hci_rsp_le_rand *rsp = data;
4583
4584
print_status(rsp->status);
4585
print_random_number(rsp->number);
4586
}
4587
4588
static void le_start_encrypt_cmd(const void *data, uint8_t size)
4589
{
4590
const struct bt_hci_cmd_le_start_encrypt *cmd = data;
4591
4592
print_handle(cmd->handle);
4593
print_random_number(cmd->number);
4594
print_field("Encryption diversifier: 0x%4.4x",
4595
btohs(cmd->diversifier));
4596
print_key("Long term key", cmd->ltk);
4597
}
4598
4599
static void le_ltk_req_reply_cmd(const void *data, uint8_t size)
4600
{
4601
const struct bt_hci_cmd_le_ltk_req_reply *cmd = data;
4602
4603
print_handle(cmd->handle);
4604
print_key("Long term key", cmd->ltk);
4605
}
4606
4607
static void le_ltk_req_reply_rsp(const void *data, uint8_t size)
4608
{
4609
const struct bt_hci_rsp_le_ltk_req_reply *rsp = data;
4610
4611
print_status(rsp->status);
4612
print_handle(rsp->handle);
4613
}
4614
4615
static void le_ltk_req_neg_reply_cmd(const void *data, uint8_t size)
4616
{
4617
const struct bt_hci_cmd_le_ltk_req_neg_reply *cmd = data;
4618
4619
print_handle(cmd->handle);
4620
}
4621
4622
static void le_ltk_req_neg_reply_rsp(const void *data, uint8_t size)
4623
{
4624
const struct bt_hci_rsp_le_ltk_req_neg_reply *rsp = data;
4625
4626
print_status(rsp->status);
4627
print_handle(rsp->handle);
4628
}
4629
4630
static void le_read_supported_states_rsp(const void *data, uint8_t size)
4631
{
4632
const struct bt_hci_rsp_le_read_supported_states *rsp = data;
4633
4634
print_status(rsp->status);
4635
print_le_states(rsp->states);
4636
}
4637
4638
static void le_receiver_test_cmd(const void *data, uint8_t size)
4639
{
4640
const struct bt_hci_cmd_le_receiver_test *cmd = data;
4641
4642
print_field("RX frequency: %d MHz (0x%2.2x)",
4643
(cmd->frequency * 2) + 2402, cmd->frequency);
4644
}
4645
4646
static void le_transmitter_test_cmd(const void *data, uint8_t size)
4647
{
4648
const struct bt_hci_cmd_le_transmitter_test *cmd = data;
4649
4650
print_field("TX frequency: %d MHz (0x%2.2x)",
4651
(cmd->frequency * 2) + 2402, cmd->frequency);
4652
print_field("Test data length: %d bytes", cmd->data_len);
4653
print_field("Packet payload: 0x%2.2x", cmd->payload);
4654
}
4655
4656
static void le_test_end_rsp(const void *data, uint8_t size)
4657
{
4658
const struct bt_hci_rsp_le_test_end *rsp = data;
4659
4660
print_status(rsp->status);
4661
print_field("Number of packets: %d", btohs(rsp->num_packets));
4662
}
4663
4664
struct opcode_data {
4665
uint16_t opcode;
4666
int bit;
4667
const char *str;
4668
void (*cmd_func) (const void *data, uint8_t size);
4669
uint8_t cmd_size;
4670
bool cmd_fixed;
4671
void (*rsp_func) (const void *data, uint8_t size);
4672
uint8_t rsp_size;
4673
bool rsp_fixed;
4674
};
4675
4676
static const struct opcode_data opcode_table[] = {
4677
{ 0x0000, -1, "NOP" },
4678
4679
/* OGF 1 - Link Control */
4680
{ 0x0401, 0, "Inquiry",
4681
inquiry_cmd, 5, true },
4682
{ 0x0402, 1, "Inquiry Cancel",
4683
null_cmd, 0, true,
4684
status_rsp, 1, true },
4685
{ 0x0403, 2, "Periodic Inquiry Mode",
4686
periodic_inquiry_cmd, 9, true,
4687
status_rsp, 1, true },
4688
{ 0x0404, 3, "Exit Periodic Inquiry Mode",
4689
null_cmd, 0, true,
4690
status_rsp, 1, true },
4691
{ 0x0405, 4, "Create Connection",
4692
create_conn_cmd, 13, true },
4693
{ 0x0406, 5, "Disconnect",
4694
disconnect_cmd, 3, true },
4695
{ 0x0407, 6, "Add SCO Connection",
4696
add_sco_conn_cmd, 4, true },
4697
{ 0x0408, 7, "Create Connection Cancel",
4698
create_conn_cancel_cmd, 6, true,
4699
status_bdaddr_rsp, 7, true },
4700
{ 0x0409, 8, "Accept Connection Request",
4701
accept_conn_request_cmd, 7, true },
4702
{ 0x040a, 9, "Reject Connection Request",
4703
reject_conn_request_cmd, 7, true },
4704
{ 0x040b, 10, "Link Key Request Reply",
4705
link_key_request_reply_cmd, 22, true,
4706
status_bdaddr_rsp, 7, true },
4707
{ 0x040c, 11, "Link Key Request Negative Reply",
4708
link_key_request_neg_reply_cmd, 6, true,
4709
status_bdaddr_rsp, 7, true },
4710
{ 0x040d, 12, "PIN Code Request Reply",
4711
pin_code_request_reply_cmd, 23, true,
4712
status_bdaddr_rsp, 7, true },
4713
{ 0x040e, 13, "PIN Code Request Negative Reply",
4714
pin_code_request_neg_reply_cmd, 6, true,
4715
status_bdaddr_rsp, 7, true },
4716
{ 0x040f, 14, "Change Connection Packet Type",
4717
change_conn_pkt_type_cmd, 4, true },
4718
{ 0x0411, 15, "Authentication Requested",
4719
auth_requested_cmd, 2, true },
4720
{ 0x0413, 16, "Set Connection Encryption",
4721
set_conn_encrypt_cmd, 3, true },
4722
{ 0x0415, 17, "Change Connection Link Key",
4723
change_conn_link_key_cmd, 2, true },
4724
{ 0x0417, 18, "Master Link Key",
4725
master_link_key_cmd, 1, true },
4726
{ 0x0419, 19, "Remote Name Request",
4727
remote_name_request_cmd, 10, true },
4728
{ 0x041a, 20, "Remote Name Request Cancel",
4729
remote_name_request_cancel_cmd, 6, true,
4730
status_bdaddr_rsp, 7, true },
4731
{ 0x041b, 21, "Read Remote Supported Features",
4732
read_remote_features_cmd, 2, true },
4733
{ 0x041c, 22, "Read Remote Extended Features",
4734
read_remote_ext_features_cmd, 3, true },
4735
{ 0x041d, 23, "Read Remote Version Information",
4736
read_remote_version_cmd, 2, true },
4737
{ 0x041f, 24, "Read Clock Offset",
4738
read_clock_offset_cmd, 2, true },
4739
{ 0x0420, 25, "Read LMP Handle",
4740
read_lmp_handle_cmd, 2, true,
4741
read_lmp_handle_rsp, 8, true },
4742
{ 0x0428, 131, "Setup Synchronous Connection",
4743
setup_sync_conn_cmd, 17, true },
4744
{ 0x0429, 132, "Accept Synchronous Connection",
4745
accept_sync_conn_cmd, 21, true },
4746
{ 0x042a, 133, "Reject Synchronous Connection",
4747
reject_sync_conn_cmd, 7, true },
4748
{ 0x042b, 151, "IO Capability Request Reply",
4749
io_capability_request_reply_cmd, 9, true,
4750
status_bdaddr_rsp, 7, true },
4751
{ 0x042c, 152, "User Confirmation Request Reply",
4752
user_confirm_request_reply_cmd, 6, true,
4753
status_bdaddr_rsp, 7, true },
4754
{ 0x042d, 153, "User Confirmation Request Neg Reply",
4755
user_confirm_request_neg_reply_cmd, 6, true,
4756
status_bdaddr_rsp, 7, true },
4757
{ 0x042e, 154, "User Passkey Request Reply",
4758
user_passkey_request_reply_cmd, 10, true,
4759
status_bdaddr_rsp, 7, true },
4760
{ 0x042f, 155, "User Passkey Request Negative Reply",
4761
user_passkey_request_neg_reply_cmd, 6, true,
4762
status_bdaddr_rsp, 7, true },
4763
{ 0x0430, 156, "Remote OOB Data Request Reply",
4764
remote_oob_data_request_reply_cmd, 38, true,
4765
status_bdaddr_rsp, 7, true },
4766
{ 0x0433, 159, "Remote OOB Data Request Neg Reply",
4767
remote_oob_data_request_neg_reply_cmd, 6, true,
4768
status_bdaddr_rsp, 7, true },
4769
{ 0x0434, 163, "IO Capability Request Negative Reply",
4770
io_capability_request_neg_reply_cmd, 7, true,
4771
status_bdaddr_rsp, 7, true },
4772
{ 0x0435, 168, "Create Physical Link",
4773
create_phy_link_cmd, 3, false },
4774
{ 0x0436, 169, "Accept Physical Link",
4775
accept_phy_link_cmd, 3, false },
4776
{ 0x0437, 170, "Disconnect Physical Link",
4777
disconn_phy_link_cmd, 2, true },
4778
{ 0x0438, 171, "Create Logical Link",
4779
create_logic_link_cmd, 33, true },
4780
{ 0x0439, 172, "Accept Logical Link",
4781
accept_logic_link_cmd, 33, true },
4782
{ 0x043a, 173, "Disconnect Logical Link",
4783
disconn_logic_link_cmd, 2, true },
4784
{ 0x043b, 174, "Logical Link Cancel",
4785
logic_link_cancel_cmd, 2, true,
4786
logic_link_cancel_rsp, 3, true },
4787
{ 0x043c, 175, "Flow Specifcation Modify",
4788
flow_spec_modify_cmd, 34, true },
4789
{ 0x043d, 235, "Enhanced Setup Synchronous Connection" },
4790
{ 0x043e, 236, "Enhanced Accept Synchronous Connection" },
4791
{ 0x043f, 246, "Truncated Page" },
4792
{ 0x0440, 247, "Truncated Page Cancel" },
4793
{ 0x0441, 248, "Set Connectionless Slave Broadcast" },
4794
{ 0x0442, 249, "Set Connectionless Slave Broadcast Receive" },
4795
{ 0x0443, 250, "Start Synchronization Train" },
4796
{ 0x0444, 251, "Receive Synchronization Train" },
4797
4798
/* OGF 2 - Link Policy */
4799
{ 0x0801, 33, "Holde Mode",
4800
hold_mode_cmd, 6, true },
4801
{ 0x0803, 34, "Sniff Mode",
4802
sniff_mode_cmd, 10, true },
4803
{ 0x0804, 35, "Exit Sniff Mode",
4804
exit_sniff_mode_cmd, 2, true },
4805
{ 0x0805, 36, "Park State",
4806
park_state_cmd, 6, true },
4807
{ 0x0806, 37, "Exit Park State",
4808
exit_park_state_cmd, 2, true },
4809
{ 0x0807, 38, "QoS Setup",
4810
qos_setup_cmd, 20, true },
4811
{ 0x0809, 39, "Role Discovery",
4812
role_discovery_cmd, 2, true,
4813
role_discovery_rsp, 4, true },
4814
{ 0x080b, 40, "Switch Role",
4815
switch_role_cmd, 7, true },
4816
{ 0x080c, 41, "Read Link Policy Settings",
4817
read_link_policy_cmd, 2, true,
4818
read_link_policy_rsp, 5, true },
4819
{ 0x080d, 42, "Write Link Policy Settings",
4820
write_link_policy_cmd, 4, true,
4821
write_link_policy_rsp, 3, true },
4822
{ 0x080e, 43, "Read Default Link Policy Settings",
4823
null_cmd, 0, true,
4824
read_default_link_policy_rsp, 3, true },
4825
{ 0x080f, 44, "Write Default Link Policy Settings",
4826
write_default_link_policy_cmd, 2, true,
4827
status_rsp, 1, true },
4828
{ 0x0810, 45, "Flow Specification",
4829
flow_spec_cmd, 21, true },
4830
{ 0x0811, 140, "Sniff Subrating",
4831
sniff_subrating_cmd, 8, true,
4832
sniff_subrating_rsp, 3, true },
4833
4834
/* OGF 3 - Host Control */
4835
{ 0x0c01, 46, "Set Event Mask",
4836
set_event_mask_cmd, 8, true,
4837
status_rsp, 1, true },
4838
{ 0x0c03, 47, "Reset",
4839
null_cmd, 0, true,
4840
status_rsp, 1, true },
4841
{ 0x0c05, 48, "Set Event Filter",
4842
set_event_filter_cmd, 1, false,
4843
status_rsp, 1, true },
4844
{ 0x0c08, 49, "Flush",
4845
flush_cmd, 2, true,
4846
flush_rsp, 3, true },
4847
{ 0x0c09, 50, "Read PIN Type",
4848
null_cmd, 0, true,
4849
read_pin_type_rsp, 2, true },
4850
{ 0x0c0a, 51, "Write PIN Type",
4851
write_pin_type_cmd, 1, true,
4852
status_rsp, 1, true },
4853
{ 0x0c0b, 52, "Create New Unit Key",
4854
null_cmd, 0, true,
4855
status_rsp, 1, true },
4856
{ 0x0c0d, 53, "Read Stored Link Key",
4857
read_stored_link_key_cmd, 7, true,
4858
read_stored_link_key_rsp, 5, true },
4859
{ 0x0c11, 54, "Write Stored Link Key",
4860
write_stored_link_key_cmd, 1, false,
4861
write_stored_link_key_rsp, 2, true },
4862
{ 0x0c12, 55, "Delete Stored Link Key",
4863
delete_stored_link_key_cmd, 7, true,
4864
delete_stored_link_key_rsp, 3, true },
4865
{ 0x0c13, 56, "Write Local Name",
4866
write_local_name_cmd, 248, true,
4867
status_rsp, 1, true },
4868
{ 0x0c14, 57, "Read Local Name",
4869
null_cmd, 0, true,
4870
read_local_name_rsp, 249, true },
4871
{ 0x0c15, 58, "Read Connection Accept Timeout",
4872
null_cmd, 0, true,
4873
read_conn_accept_timeout_rsp, 3, true },
4874
{ 0x0c16, 59, "Write Connection Accept Timeout",
4875
write_conn_accept_timeout_cmd, 2, true,
4876
status_rsp, 1, true },
4877
{ 0x0c17, 60, "Read Page Timeout",
4878
null_cmd, 0, true,
4879
read_page_timeout_rsp, 3, true },
4880
{ 0x0c18, 61, "Write Page Timeout",
4881
write_page_timeout_cmd, 2, true,
4882
status_rsp, 1, true },
4883
{ 0x0c19, 62, "Read Scan Enable",
4884
null_cmd, 0, true,
4885
read_scan_enable_rsp, 2, true },
4886
{ 0x0c1a, 63, "Write Scan Enable",
4887
write_scan_enable_cmd, 1, true,
4888
status_rsp, 1, true },
4889
{ 0x0c1b, 64, "Read Page Scan Activity",
4890
null_cmd, 0, true,
4891
read_page_scan_activity_rsp, 5, true },
4892
{ 0x0c1c, 65, "Write Page Scan Activity",
4893
write_page_scan_activity_cmd, 4, true,
4894
status_rsp, 1, true },
4895
{ 0x0c1d, 66, "Read Inquiry Scan Activity",
4896
null_cmd, 0, true,
4897
read_inquiry_scan_activity_rsp, 5, true },
4898
{ 0x0c1e, 67, "Write Inquiry Scan Activity",
4899
write_inquiry_scan_activity_cmd, 4, true,
4900
status_rsp, 1, true },
4901
{ 0x0c1f, 68, "Read Authentication Enable",
4902
null_cmd, 0, true,
4903
read_auth_enable_rsp, 2, true },
4904
{ 0x0c20, 69, "Write Authentication Enable",
4905
write_auth_enable_cmd, 1, true,
4906
status_rsp, 1, true },
4907
{ 0x0c21, 70, "Read Encryption Mode",
4908
null_cmd, 0, true,
4909
read_encrypt_mode_rsp, 2, true },
4910
{ 0x0c22, 71, "Write Encryption Mode",
4911
write_encrypt_mode_cmd, 1, true,
4912
status_rsp, 1, true },
4913
{ 0x0c23, 72, "Read Class of Device",
4914
null_cmd, 0, true,
4915
read_class_of_dev_rsp, 4, true },
4916
{ 0x0c24, 73, "Write Class of Device",
4917
write_class_of_dev_cmd, 3, true,
4918
status_rsp, 1, true },
4919
{ 0x0c25, 74, "Read Voice Setting",
4920
null_cmd, 0, true,
4921
read_voice_setting_rsp, 3, true },
4922
{ 0x0c26, 75, "Write Voice Setting",
4923
write_voice_setting_cmd, 2, true,
4924
status_rsp, 1, true },
4925
{ 0x0c27, 76, "Read Automatic Flush Timeout" },
4926
{ 0x0c28, 77, "Write Automatic Flush Timeout" },
4927
{ 0x0c29, 78, "Read Num Broadcast Retransmissions" },
4928
{ 0x0c2a, 79, "Write Num Broadcast Retransmissions" },
4929
{ 0x0c2b, 80, "Read Hold Mode Activity" },
4930
{ 0x0c2c, 81, "Write Hold Mode Activity" },
4931
{ 0x0c2d, 82, "Read Transmit Power Level" },
4932
{ 0x0c2e, 83, "Read Sync Flow Control Enable" },
4933
{ 0x0c2f, 84, "Write Sync Flow Control Enable" },
4934
{ 0x0c31, 85, "Set Host Controller To Host Flow" },
4935
{ 0x0c33, 86, "Host Buffer Size",
4936
host_buffer_size_cmd, 7, true,
4937
status_rsp, 1, true },
4938
{ 0x0c35, 87, "Host Number of Completed Packets" },
4939
{ 0x0c36, 88, "Read Link Supervision Timeout",
4940
read_link_supv_timeout_cmd, 2, true,
4941
read_link_supv_timeout_rsp, 5, true },
4942
{ 0x0c37, 89, "Write Link Supervision Timeout",
4943
write_link_supv_timeout_cmd, 4, true,
4944
write_link_supv_timeout_rsp, 3, true },
4945
{ 0x0c38, 90, "Read Number of Supported IAC",
4946
null_cmd, 0, true,
4947
read_num_supported_iac_rsp, 2, true },
4948
{ 0x0c39, 91, "Read Current IAC LAP",
4949
null_cmd, 0, true,
4950
read_current_iac_lap_rsp, 2, false },
4951
{ 0x0c3a, 92, "Write Current IAC LAP",
4952
write_current_iac_lap_cmd, 1, false,
4953
status_rsp, 1, true },
4954
{ 0x0c3b, 93, "Read Page Scan Period Mode",
4955
null_cmd, 0, true,
4956
read_page_scan_period_mode_rsp, 2, true },
4957
{ 0x0c3c, 94, "Write Page Scan Period Mode",
4958
write_page_scan_period_mode_cmd, 1, true,
4959
status_rsp, 1, true },
4960
{ 0x0c3d, 95, "Read Page Scan Mode",
4961
null_cmd, 0, true,
4962
read_page_scan_mode_rsp, 2, true },
4963
{ 0x0c3e, 96, "Write Page Scan Mode",
4964
write_page_scan_mode_cmd, 1, true,
4965
status_rsp, 1, true },
4966
{ 0x0c3f, 97, "Set AFH Host Channel Classification",
4967
set_afh_host_classification_cmd, 10, true,
4968
status_rsp, 1, true },
4969
{ 0x0c42, 100, "Read Inquiry Scan Type",
4970
null_cmd, 0, true,
4971
read_inquiry_scan_type_rsp, 2, true },
4972
{ 0x0c43, 101, "Write Inquiry Scan Type",
4973
write_inquiry_scan_type_cmd, 1, true,
4974
status_rsp, 1, true },
4975
{ 0x0c44, 102, "Read Inquiry Mode",
4976
null_cmd, 0, true,
4977
read_inquiry_mode_rsp, 2, true },
4978
{ 0x0c45, 103, "Write Inquiry Mode",
4979
write_inquiry_mode_cmd, 1, true,
4980
status_rsp, 1, true },
4981
{ 0x0c46, 104, "Read Page Scan Type",
4982
null_cmd, 0, true,
4983
read_page_scan_type_rsp, 2, true },
4984
{ 0x0c47, 105, "Write Page Scan Type",
4985
write_page_scan_type_cmd, 1, true,
4986
status_rsp, 1, true },
4987
{ 0x0c48, 106, "Read AFH Channel Assessment Mode",
4988
null_cmd, 0, true,
4989
read_afh_assessment_mode_rsp, 2, true },
4990
{ 0x0c49, 107, "Write AFH Channel Assessment Mode",
4991
write_afh_assessment_mode_cmd, 1, true,
4992
status_rsp, 1, true },
4993
{ 0x0c51, 136, "Read Extended Inquiry Response",
4994
null_cmd, 0, true,
4995
read_ext_inquiry_response_rsp, 242, true },
4996
{ 0x0c52, 137, "Write Extended Inquiry Response",
4997
write_ext_inquiry_response_cmd, 241, true,
4998
status_rsp, 1, true },
4999
{ 0x0c53, 138, "Refresh Encryption Key",
5000
refresh_encrypt_key_cmd, 2, true },
5001
{ 0x0c55, 141, "Read Simple Pairing Mode",
5002
null_cmd, 0, true,
5003
read_simple_pairing_mode_rsp, 2, true },
5004
{ 0x0c56, 142, "Write Simple Pairing Mode",
5005
write_simple_pairing_mode_cmd, 1, true,
5006
status_rsp, 1, true },
5007
{ 0x0c57, 143, "Read Local OOB Data",
5008
null_cmd, 0, true,
5009
read_local_oob_data_rsp, 33, true },
5010
{ 0x0c58, 144, "Read Inquiry Response TX Power Level",
5011
null_cmd, 0, true,
5012
read_inquiry_resp_tx_power_rsp, 2, true },
5013
{ 0x0c59, 145, "Write Inquiry Transmit Power Level",
5014
write_inquiry_tx_power_cmd, 1, true,
5015
status_rsp, 1, true },
5016
{ 0x0c5a, 146, "Read Default Erroneous Reporting" },
5017
{ 0x0c5b, 147, "Write Default Erroneous Reporting" },
5018
{ 0x0c5f, 158, "Enhanced Flush",
5019
enhanced_flush_cmd, 3, true },
5020
{ 0x0c60, 162, "Send Keypress Notification" },
5021
{ 0x0c61, 176, "Read Logical Link Accept Timeout" },
5022
{ 0x0c62, 177, "Write Logical Link Accept Timeout" },
5023
{ 0x0c63, 178, "Set Event Mask Page 2",
5024
set_event_mask_page2_cmd, 8, true,
5025
status_rsp, 1, true },
5026
{ 0x0c64, 179, "Read Location Data",
5027
null_cmd, 0, true,
5028
read_location_data_rsp, 6, true },
5029
{ 0x0c65, 180, "Write Location Data",
5030
write_location_data_cmd, 5, true,
5031
status_rsp, 1, true },
5032
{ 0x0c66, 184, "Read Flow Control Mode",
5033
null_cmd, 0, true,
5034
read_flow_control_mode_rsp, 2, true },
5035
{ 0x0c67, 185, "Write Flow Control Mode",
5036
write_flow_control_mode_cmd, 1, true,
5037
status_rsp, 1, true },
5038
{ 0x0c68, 192, "Read Enhanced Transmit Power Level" },
5039
{ 0x0c69, 194, "Read Best Effort Flush Timeout" },
5040
{ 0x0c6a, 195, "Write Best Effort Flush Timeout" },
5041
{ 0x0c6b, 196, "Short Range Mode" },
5042
{ 0x0c6c, 197, "Read LE Host Supported",
5043
null_cmd, 0, true,
5044
read_le_host_supported_rsp, 3, true },
5045
{ 0x0c6d, 198, "Write LE Host Supported",
5046
write_le_host_supported_cmd, 2, true,
5047
status_rsp, 1, true },
5048
{ 0x0c6e, 238, "Set MWS Channel Parameters" },
5049
{ 0x0c6f, 239, "Set External Frame Configuration" },
5050
{ 0x0c70, 240, "Set MWS Signaling" },
5051
{ 0x0c71, 241, "Set MWS Transport Layer" },
5052
{ 0x0c72, 242, "Set MWS Scan Frequency Table" },
5053
{ 0x0c73, 244, "Set MWS Pattern Configuration" },
5054
{ 0x0c74, 252, "Set Reserved LT_ADDR" },
5055
{ 0x0c75, 253, "Delete Reserved LT_ADDR" },
5056
{ 0x0c76, 254, "Set Connectionless Slave Broadcast Data" },
5057
{ 0x0c77, 255, "Read Synchronization Train Parameters",
5058
null_cmd, 0, true,
5059
read_sync_train_params_rsp, 8, true },
5060
{ 0x0c78, 256, "Write Synchronization Train Parameters" },
5061
5062
/* OGF 4 - Information Parameter */
5063
{ 0x1001, 115, "Read Local Version Information",
5064
null_cmd, 0, true,
5065
read_local_version_rsp, 9, true },
5066
{ 0x1002, 116, "Read Local Supported Commands",
5067
null_cmd, 0, true,
5068
read_local_commands_rsp, 65, true },
5069
{ 0x1003, 117, "Read Local Supported Features",
5070
null_cmd, 0, true,
5071
read_local_features_rsp, 9, true },
5072
{ 0x1004, 118, "Read Local Extended Features",
5073
read_local_ext_features_cmd, 1, true,
5074
read_local_ext_features_rsp, 11, true },
5075
{ 0x1005, 119, "Read Buffer Size",
5076
null_cmd, 0, true,
5077
read_buffer_size_rsp, 8, true },
5078
{ 0x1007, 120, "Read Country Code",
5079
null_cmd, 0, true,
5080
read_country_code_rsp, 2, true },
5081
{ 0x1009, 121, "Read BD ADDR",
5082
null_cmd, 0, true,
5083
read_bd_addr_rsp, 7, true },
5084
{ 0x100a, 186, "Read Data Block Size",
5085
null_cmd, 0, true,
5086
read_data_block_size_rsp, 7, true },
5087
{ 0x100b, 237, "Read Local Supported Codecs" },
5088
5089
/* OGF 5 - Status Parameter */
5090
{ 0x1401, 122, "Read Failed Contact Counter",
5091
read_failed_contact_counter_cmd, 2, true,
5092
read_failed_contact_counter_rsp, 5, true },
5093
{ 0x1402, 123, "Reset Failed Contact Counter",
5094
reset_failed_contact_counter_cmd, 2, true,
5095
reset_failed_contact_counter_rsp, 3, true },
5096
{ 0x1403, 124, "Read Link Quality",
5097
read_link_quality_cmd, 2, true,
5098
read_link_quality_rsp, 4, true },
5099
{ 0x1405, 125, "Read RSSI",
5100
read_rssi_cmd, 2, true,
5101
read_rssi_rsp, 4, true },
5102
{ 0x1406, 126, "Read AFH Channel Map",
5103
read_afh_channel_map_cmd, 2, true,
5104
read_afh_channel_map_rsp, 14, true },
5105
{ 0x1407, 127, "Read Clock",
5106
read_clock_cmd, 3, true,
5107
read_clock_rsp, 9, true },
5108
{ 0x1408, 164, "Read Encryption Key Size",
5109
read_encrypt_key_size_cmd, 2, true,
5110
read_encrypt_key_size_rsp, 4, true },
5111
{ 0x1409, 181, "Read Local AMP Info",
5112
null_cmd, 0, true,
5113
read_local_amp_info_rsp, 31, true },
5114
{ 0x140a, 182, "Read Local AMP ASSOC",
5115
read_local_amp_assoc_cmd, 5, true,
5116
read_local_amp_assoc_rsp, 5, false },
5117
{ 0x140b, 183, "Write Remote AMP ASSOC",
5118
write_remote_amp_assoc_cmd, 6, false,
5119
write_remote_amp_assoc_rsp, 2, true },
5120
{ 0x140c, 243, "Get MWS Transport Layer Configuration" },
5121
{ 0x140d, 245, "Set Triggered Clock Capture" },
5122
5123
/* OGF 6 - Testing */
5124
{ 0x1801, 128, "Read Loopback Mode" },
5125
{ 0x1802, 129, "Write Loopback Mode" },
5126
{ 0x1803, 130, "Enable Device Under Test Mode",
5127
null_cmd, 0, true,
5128
status_rsp, 1, true },
5129
{ 0x1804, 157, "Write Simple Pairing Debug Mode" },
5130
{ 0x1807, 189, "Enable AMP Receiver Reports" },
5131
{ 0x1808, 190, "AMP Test End" },
5132
{ 0x1809, 191, "AMP Test" },
5133
5134
/* OGF 8 - LE Control */
5135
{ 0x2001, 200, "LE Set Event Mask",
5136
le_set_event_mask_cmd, 8, true,
5137
status_rsp, 1, true },
5138
{ 0x2002, 201, "LE Read Buffer Size",
5139
null_cmd, 0, true,
5140
le_read_buffer_size_rsp, 4, true },
5141
{ 0x2003, 202, "LE Read Local Supported Features",
5142
null_cmd, 0, true,
5143
le_read_local_features_rsp, 9, true },
5144
{ 0x2005, 204, "LE Set Random Address",
5145
le_set_random_address_cmd, 6, true,
5146
status_rsp, 1, true },
5147
{ 0x2006, 205, "LE Set Advertising Parameters",
5148
le_set_adv_parameters_cmd, 15, true,
5149
status_rsp, 1, true },
5150
{ 0x2007, 206, "LE Read Advertising Channel TX Power",
5151
null_cmd, 0, true,
5152
le_read_adv_tx_power_rsp, 2, true },
5153
{ 0x2008, 207, "LE Set Advertising Data",
5154
le_set_adv_data_cmd, 32, true,
5155
status_rsp, 1, true },
5156
{ 0x2009, 208, "LE Set Scan Response Data",
5157
le_set_scan_rsp_data_cmd, 32, true,
5158
status_rsp, 1, true },
5159
{ 0x200a, 209, "LE Set Advertise Enable",
5160
le_set_adv_enable_cmd, 1, true,
5161
status_rsp, 1, true },
5162
{ 0x200b, 210, "LE Set Scan Parameters",
5163
le_set_scan_parameters_cmd, 7, true,
5164
status_rsp, 1, true },
5165
{ 0x200c, 211, "LE Set Scan Enable",
5166
le_set_scan_enable_cmd, 2, true,
5167
status_rsp, 1, true },
5168
{ 0x200d, 212, "LE Create Connection",
5169
le_create_conn_cmd, 25, true },
5170
{ 0x200e, 213, "LE Create Connection Cancel",
5171
null_cmd, 0, true,
5172
status_rsp, 1, true },
5173
{ 0x200f, 214, "LE Read White List Size",
5174
null_cmd, 0, true,
5175
le_read_white_list_size_rsp, 2, true },
5176
{ 0x2010, 215, "LE Clear White List",
5177
null_cmd, 0, true,
5178
status_rsp, 1, true },
5179
{ 0x2011, 216, "LE Add Device To White List",
5180
le_add_to_white_list_cmd, 7, true,
5181
status_rsp, 1, true },
5182
{ 0x2012, 217, "LE Remove Device From White List",
5183
le_remove_from_white_list_cmd, 7, true,
5184
status_rsp, 1, true },
5185
{ 0x2013, 218, "LE Connection Update",
5186
le_conn_update_cmd, 14, true },
5187
{ 0x2014, 219, "LE Set Host Channel Classification",
5188
le_set_host_classification_cmd, 5, true,
5189
status_rsp, 1, true },
5190
{ 0x2015, 220, "LE Read Channel Map",
5191
le_read_channel_map_cmd, 2, true,
5192
le_read_channel_map_rsp, 8, true },
5193
{ 0x2016, 221, "LE Read Remote Used Features",
5194
le_read_remote_features_cmd, 2, true },
5195
{ 0x2017, 222, "LE Encrypt",
5196
le_encrypt_cmd, 32, true,
5197
le_encrypt_rsp, 17, true },
5198
{ 0x2018, 223, "LE Rand",
5199
null_cmd, 0, true,
5200
le_rand_rsp, 9, true },
5201
{ 0x2019, 224, "LE Start Encryption",
5202
le_start_encrypt_cmd, 28, true },
5203
{ 0x201a, 225, "LE Long Term Key Request Reply",
5204
le_ltk_req_reply_cmd, 18, true,
5205
le_ltk_req_reply_rsp, 3, true },
5206
{ 0x201b, 226, "LE Long Term Key Request Neg Reply",
5207
le_ltk_req_neg_reply_cmd, 2, true,
5208
le_ltk_req_neg_reply_rsp, 3, true },
5209
{ 0x201c, 227, "LE Read Supported States",
5210
null_cmd, 0, true,
5211
le_read_supported_states_rsp, 9, true },
5212
{ 0x201d, 228, "LE Receiver Test",
5213
le_receiver_test_cmd, 1, true,
5214
status_rsp, 1, true },
5215
{ 0x201e, 229, "LE Transmitter Test",
5216
le_transmitter_test_cmd, 3, true,
5217
status_rsp, 1, true },
5218
{ 0x201f, 230, "LE Test End",
5219
null_cmd, 0, true,
5220
le_test_end_rsp, 3, true },
5221
{ }
5222
};
5223
5224
static const char *get_supported_command(int bit)
5225
{
5226
int i;
5227
5228
for (i = 0; opcode_table[i].str; i++) {
5229
if (opcode_table[i].bit == bit)
5230
return opcode_table[i].str;
5231
}
5232
5233
return NULL;
5234
}
5235
5236
static void status_evt(const void *data, uint8_t size)
5237
{
5238
uint8_t status = *((uint8_t *) data);
5239
5240
print_status(status);
5241
}
5242
5243
static void inquiry_result_evt(const void *data, uint8_t size)
5244
{
5245
const struct bt_hci_evt_inquiry_result *evt = data;
5246
5247
print_num_resp(evt->num_resp);
5248
print_bdaddr(evt->bdaddr);
5249
print_pscan_rep_mode(evt->pscan_rep_mode);
5250
print_pscan_period_mode(evt->pscan_period_mode);
5251
print_pscan_mode(evt->pscan_mode);
5252
print_dev_class(evt->dev_class);
5253
print_clock_offset(evt->clock_offset);
5254
5255
if (size > sizeof(*evt))
5256
packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
5257
}
5258
5259
static void conn_complete_evt(const void *data, uint8_t size)
5260
{
5261
const struct bt_hci_evt_conn_complete *evt = data;
5262
5263
print_status(evt->status);
5264
print_handle(evt->handle);
5265
print_bdaddr(evt->bdaddr);
5266
print_link_type(evt->link_type);
5267
print_encr_mode(evt->encr_mode);
5268
5269
if (evt->status == 0x00)
5270
assign_handle(btohs(evt->handle), 0x00);
5271
}
5272
5273
static void conn_request_evt(const void *data, uint8_t size)
5274
{
5275
const struct bt_hci_evt_conn_request *evt = data;
5276
5277
print_bdaddr(evt->bdaddr);
5278
print_dev_class(evt->dev_class);
5279
print_link_type(evt->link_type);
5280
}
5281
5282
static void disconnect_complete_evt(const void *data, uint8_t size)
5283
{
5284
const struct bt_hci_evt_disconnect_complete *evt = data;
5285
5286
print_status(evt->status);
5287
print_handle(evt->handle);
5288
print_reason(evt->reason);
5289
5290
if (evt->status == 0x00)
5291
release_handle(btohs(evt->handle));
5292
}
5293
5294
static void auth_complete_evt(const void *data, uint8_t size)
5295
{
5296
const struct bt_hci_evt_auth_complete *evt = data;
5297
5298
print_status(evt->status);
5299
print_handle(evt->handle);
5300
}
5301
5302
static void remote_name_request_complete_evt(const void *data, uint8_t size)
5303
{
5304
const struct bt_hci_evt_remote_name_request_complete *evt = data;
5305
5306
print_status(evt->status);
5307
print_bdaddr(evt->bdaddr);
5308
print_name(evt->name);
5309
}
5310
5311
static void encrypt_change_evt(const void *data, uint8_t size)
5312
{
5313
const struct bt_hci_evt_encrypt_change *evt = data;
5314
5315
print_status(evt->status);
5316
print_handle(evt->handle);
5317
print_encr_mode_change(evt->encr_mode, evt->handle);
5318
}
5319
5320
static void change_conn_link_key_complete_evt(const void *data, uint8_t size)
5321
{
5322
const struct bt_hci_evt_change_conn_link_key_complete *evt = data;
5323
5324
print_status(evt->status);
5325
print_handle(evt->handle);
5326
}
5327
5328
static void master_link_key_complete_evt(const void *data, uint8_t size)
5329
{
5330
const struct bt_hci_evt_master_link_key_complete *evt = data;
5331
5332
print_status(evt->status);
5333
print_handle(evt->handle);
5334
print_key_flag(evt->key_flag);
5335
}
5336
5337
static void remote_features_complete_evt(const void *data, uint8_t size)
5338
{
5339
const struct bt_hci_evt_remote_features_complete *evt = data;
5340
5341
print_status(evt->status);
5342
print_handle(evt->handle);
5343
print_features(0, evt->features, 0x00);
5344
}
5345
5346
static void remote_version_complete_evt(const void *data, uint8_t size)
5347
{
5348
const struct bt_hci_evt_remote_version_complete *evt = data;
5349
5350
print_status(evt->status);
5351
print_handle(evt->handle);
5352
print_lmp_version(evt->lmp_ver, evt->lmp_subver);
5353
print_manufacturer(evt->manufacturer);
5354
}
5355
5356
static void qos_setup_complete_evt(const void *data, uint8_t size)
5357
{
5358
const struct bt_hci_evt_qos_setup_complete *evt = data;
5359
5360
print_status(evt->status);
5361
print_handle(evt->handle);
5362
print_field("Flags: 0x%2.2x", evt->flags);
5363
5364
print_service_type(evt->service_type);
5365
5366
print_field("Token rate: %d", btohl(evt->token_rate));
5367
print_field("Peak bandwidth: %d", btohl(evt->peak_bandwidth));
5368
print_field("Latency: %d", btohl(evt->latency));
5369
print_field("Delay variation: %d", btohl(evt->delay_variation));
5370
}
5371
5372
static void cmd_complete_evt(const void *data, uint8_t size)
5373
{
5374
const struct bt_hci_evt_cmd_complete *evt = data;
5375
uint16_t opcode = btohs(evt->opcode);
5376
uint16_t ogf = cmd_opcode_ogf(opcode);
5377
uint16_t ocf = cmd_opcode_ocf(opcode);
5378
const struct opcode_data *opcode_data = NULL;
5379
const char *opcode_color, *opcode_str;
5380
int i;
5381
5382
for (i = 0; opcode_table[i].str; i++) {
5383
if (opcode_table[i].opcode == opcode) {
5384
opcode_data = &opcode_table[i];
5385
break;
5386
}
5387
}
5388
5389
if (opcode_data) {
5390
if (opcode_data->rsp_func)
5391
opcode_color = COLOR_HCI_COMMAND;
5392
else
5393
opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
5394
opcode_str = opcode_data->str;
5395
} else {
5396
opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
5397
opcode_str = "Unknown";
5398
}
5399
5400
print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,
5401
" (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);
5402
5403
if (!opcode_data || !opcode_data->rsp_func) {
5404
packet_hexdump(data + 3, size - 3);
5405
return;
5406
}
5407
5408
if (opcode_data->rsp_fixed) {
5409
if (size - 3 != opcode_data->rsp_size) {
5410
print_text(COLOR_ERROR, "invalid packet size");
5411
packet_hexdump(data + 3, size - 3);
5412
return;
5413
}
5414
} else {
5415
if (size - 3 < opcode_data->rsp_size) {
5416
print_text(COLOR_ERROR, "too short packet");
5417
packet_hexdump(data + 3, size - 3);
5418
return;
5419
}
5420
}
5421
5422
opcode_data->rsp_func(data + 3, size - 3);
5423
}
5424
5425
static void cmd_status_evt(const void *data, uint8_t size)
5426
{
5427
const struct bt_hci_evt_cmd_status *evt = data;
5428
uint16_t opcode = btohs(evt->opcode);
5429
uint16_t ogf = cmd_opcode_ogf(opcode);
5430
uint16_t ocf = cmd_opcode_ocf(opcode);
5431
const struct opcode_data *opcode_data = NULL;
5432
const char *opcode_color, *opcode_str;
5433
int i;
5434
5435
for (i = 0; opcode_table[i].str; i++) {
5436
if (opcode_table[i].opcode == opcode) {
5437
opcode_data = &opcode_table[i];
5438
break;
5439
}
5440
}
5441
5442
if (opcode_data) {
5443
opcode_color = COLOR_HCI_COMMAND;
5444
opcode_str = opcode_data->str;
5445
} else {
5446
opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
5447
opcode_str = "Unknown";
5448
}
5449
5450
print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,
5451
" (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);
5452
5453
print_status(evt->status);
5454
}
5455
5456
static void hardware_error_evt(const void *data, uint8_t size)
5457
{
5458
const struct bt_hci_evt_hardware_error *evt = data;
5459
5460
print_field("Code: 0x%2.2x", evt->code);
5461
}
5462
5463
static void flush_occurred_evt(const void *data, uint8_t size)
5464
{
5465
const struct bt_hci_evt_flush_occurred *evt = data;
5466
5467
print_handle(evt->handle);
5468
}
5469
5470
static void role_change_evt(const void *data, uint8_t size)
5471
{
5472
const struct bt_hci_evt_role_change *evt = data;
5473
5474
print_status(evt->status);
5475
print_bdaddr(evt->bdaddr);
5476
print_role(evt->role);
5477
}
5478
5479
static void num_completed_packets_evt(const void *data, uint8_t size)
5480
{
5481
const struct bt_hci_evt_num_completed_packets *evt = data;
5482
5483
print_field("Num handles: %d", evt->num_handles);
5484
print_handle(evt->handle);
5485
print_field("Count: %d", btohs(evt->count));
5486
5487
if (size > sizeof(*evt))
5488
packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
5489
}
5490
5491
static void mode_change_evt(const void *data, uint8_t size)
5492
{
5493
const struct bt_hci_evt_mode_change *evt = data;
5494
5495
print_status(evt->status);
5496
print_handle(evt->handle);
5497
print_mode(evt->mode);
5498
print_interval(evt->interval);
5499
}
5500
5501
static void return_link_keys_evt(const void *data, uint8_t size)
5502
{
5503
uint8_t num_keys = *((uint8_t *) data);
5504
5505
print_field("Num keys: %d", num_keys);
5506
5507
packet_hexdump(data + 1, size - 1);
5508
}
5509
5510
static void pin_code_request_evt(const void *data, uint8_t size)
5511
{
5512
const struct bt_hci_evt_pin_code_request *evt = data;
5513
5514
print_bdaddr(evt->bdaddr);
5515
}
5516
5517
static void link_key_request_evt(const void *data, uint8_t size)
5518
{
5519
const struct bt_hci_evt_link_key_request *evt = data;
5520
5521
print_bdaddr(evt->bdaddr);
5522
}
5523
5524
static void link_key_notify_evt(const void *data, uint8_t size)
5525
{
5526
const struct bt_hci_evt_link_key_notify *evt = data;
5527
5528
print_bdaddr(evt->bdaddr);
5529
print_link_key(evt->link_key);
5530
print_key_type(evt->key_type);
5531
}
5532
5533
static void loopback_command_evt(const void *data, uint8_t size)
5534
{
5535
packet_hexdump(data, size);
5536
}
5537
5538
static void data_buffer_overflow_evt(const void *data, uint8_t size)
5539
{
5540
const struct bt_hci_evt_data_buffer_overflow *evt = data;
5541
5542
print_link_type(evt->link_type);
5543
}
5544
5545
static void max_slots_change_evt(const void *data, uint8_t size)
5546
{
5547
const struct bt_hci_evt_max_slots_change *evt = data;
5548
5549
print_handle(evt->handle);
5550
print_field("Max slots: %d", evt->max_slots);
5551
}
5552
5553
static void clock_offset_complete_evt(const void *data, uint8_t size)
5554
{
5555
const struct bt_hci_evt_clock_offset_complete *evt = data;
5556
5557
print_status(evt->status);
5558
print_handle(evt->handle);
5559
print_clock_offset(evt->clock_offset);
5560
}
5561
5562
static void conn_pkt_type_changed_evt(const void *data, uint8_t size)
5563
{
5564
const struct bt_hci_evt_conn_pkt_type_changed *evt = data;
5565
5566
print_status(evt->status);
5567
print_handle(evt->handle);
5568
print_pkt_type(evt->pkt_type);
5569
}
5570
5571
static void qos_violation_evt(const void *data, uint8_t size)
5572
{
5573
const struct bt_hci_evt_qos_violation *evt = data;
5574
5575
print_handle(evt->handle);
5576
}
5577
5578
static void pscan_mode_change_evt(const void *data, uint8_t size)
5579
{
5580
const struct bt_hci_evt_pscan_mode_change *evt = data;
5581
5582
print_bdaddr(evt->bdaddr);
5583
print_pscan_mode(evt->pscan_mode);
5584
}
5585
5586
static void pscan_rep_mode_change_evt(const void *data, uint8_t size)
5587
{
5588
const struct bt_hci_evt_pscan_rep_mode_change *evt = data;
5589
5590
print_bdaddr(evt->bdaddr);
5591
print_pscan_rep_mode(evt->pscan_rep_mode);
5592
}
5593
5594
static void flow_spec_complete_evt(const void *data, uint8_t size)
5595
{
5596
const struct bt_hci_evt_flow_spec_complete *evt = data;
5597
5598
print_status(evt->status);
5599
print_handle(evt->handle);
5600
print_field("Flags: 0x%2.2x", evt->flags);
5601
5602
print_flow_direction(evt->direction);
5603
print_service_type(evt->service_type);
5604
5605
print_field("Token rate: %d", btohl(evt->token_rate));
5606
print_field("Token bucket size: %d", btohl(evt->token_bucket_size));
5607
print_field("Peak bandwidth: %d", btohl(evt->peak_bandwidth));
5608
print_field("Access latency: %d", btohl(evt->access_latency));
5609
}
5610
5611
static void inquiry_result_with_rssi_evt(const void *data, uint8_t size)
5612
{
5613
const struct bt_hci_evt_inquiry_result_with_rssi *evt = data;
5614
5615
print_num_resp(evt->num_resp);
5616
print_bdaddr(evt->bdaddr);
5617
print_pscan_rep_mode(evt->pscan_rep_mode);
5618
print_pscan_period_mode(evt->pscan_period_mode);
5619
print_dev_class(evt->dev_class);
5620
print_clock_offset(evt->clock_offset);
5621
print_rssi(evt->rssi);
5622
5623
if (size > sizeof(*evt))
5624
packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
5625
}
5626
5627
static void remote_ext_features_complete_evt(const void *data, uint8_t size)
5628
{
5629
const struct bt_hci_evt_remote_ext_features_complete *evt = data;
5630
5631
print_status(evt->status);
5632
print_handle(evt->handle);
5633
print_field("Page: %d/%d", evt->page, evt->max_page);
5634
print_features(evt->page, evt->features, 0x00);
5635
}
5636
5637
static void sync_conn_complete_evt(const void *data, uint8_t size)
5638
{
5639
const struct bt_hci_evt_sync_conn_complete *evt = data;
5640
5641
print_status(evt->status);
5642
print_handle(evt->handle);
5643
print_bdaddr(evt->bdaddr);
5644
print_link_type(evt->link_type);
5645
print_field("Transmission interval: 0x%2.2x", evt->tx_interval);
5646
print_field("Retransmission window: 0x%2.2x", evt->retrans_window);
5647
print_field("RX packet length: %d", btohs(evt->rx_pkt_len));
5648
print_field("TX packet length: %d", btohs(evt->tx_pkt_len));
5649
print_air_mode(evt->air_mode);
5650
}
5651
5652
static void sync_conn_changed_evt(const void *data, uint8_t size)
5653
{
5654
const struct bt_hci_evt_sync_conn_changed *evt = data;
5655
5656
print_status(evt->status);
5657
print_handle(evt->handle);
5658
print_field("Transmission interval: 0x%2.2x", evt->tx_interval);
5659
print_field("Retransmission window: 0x%2.2x", evt->retrans_window);
5660
print_field("RX packet length: %d", btohs(evt->rx_pkt_len));
5661
print_field("TX packet length: %d", btohs(evt->tx_pkt_len));
5662
}
5663
5664
static void sniff_subrating_evt(const void *data, uint8_t size)
5665
{
5666
const struct bt_hci_evt_sniff_subrating *evt = data;
5667
5668
print_status(evt->status);
5669
print_handle(evt->handle);
5670
print_slot_625("Max transmit latency", evt->max_tx_latency);
5671
print_slot_625("Max receive latency", evt->max_rx_latency);
5672
print_slot_625("Min remote timeout", evt->min_remote_timeout);
5673
print_slot_625("Min local timeout", evt->min_local_timeout);
5674
}
5675
5676
static void ext_inquiry_result_evt(const void *data, uint8_t size)
5677
{
5678
const struct bt_hci_evt_ext_inquiry_result *evt = data;
5679
5680
print_num_resp(evt->num_resp);
5681
print_bdaddr(evt->bdaddr);
5682
print_pscan_rep_mode(evt->pscan_rep_mode);
5683
print_pscan_period_mode(evt->pscan_period_mode);
5684
print_dev_class(evt->dev_class);
5685
print_clock_offset(evt->clock_offset);
5686
print_rssi(evt->rssi);
5687
print_eir(evt->data, sizeof(evt->data), false);
5688
}
5689
5690
static void encrypt_key_refresh_complete_evt(const void *data, uint8_t size)
5691
{
5692
const struct bt_hci_evt_encrypt_key_refresh_complete *evt = data;
5693
5694
print_status(evt->status);
5695
print_handle(evt->handle);
5696
}
5697
5698
static void io_capability_request_evt(const void *data, uint8_t size)
5699
{
5700
const struct bt_hci_evt_io_capability_request *evt = data;
5701
5702
print_bdaddr(evt->bdaddr);
5703
}
5704
5705
static void io_capability_response_evt(const void *data, uint8_t size)
5706
{
5707
const struct bt_hci_evt_io_capability_response *evt = data;
5708
5709
print_bdaddr(evt->bdaddr);
5710
print_io_capability(evt->capability);
5711
print_oob_data(evt->oob_data);
5712
print_authentication(evt->authentication);
5713
}
5714
5715
static void user_confirm_request_evt(const void *data, uint8_t size)
5716
{
5717
const struct bt_hci_evt_user_confirm_request *evt = data;
5718
5719
print_bdaddr(evt->bdaddr);
5720
print_passkey(evt->passkey);
5721
}
5722
5723
static void user_passkey_request_evt(const void *data, uint8_t size)
5724
{
5725
const struct bt_hci_evt_user_passkey_request *evt = data;
5726
5727
print_bdaddr(evt->bdaddr);
5728
}
5729
5730
static void remote_oob_data_request_evt(const void *data, uint8_t size)
5731
{
5732
const struct bt_hci_evt_remote_oob_data_request *evt = data;
5733
5734
print_bdaddr(evt->bdaddr);
5735
}
5736
5737
static void simple_pairing_complete_evt(const void *data, uint8_t size)
5738
{
5739
const struct bt_hci_evt_simple_pairing_complete *evt = data;
5740
5741
print_status(evt->status);
5742
print_bdaddr(evt->bdaddr);
5743
}
5744
5745
static void link_supv_timeout_changed_evt(const void *data, uint8_t size)
5746
{
5747
const struct bt_hci_evt_link_supv_timeout_changed *evt = data;
5748
5749
print_handle(evt->handle);
5750
print_timeout(evt->timeout);
5751
}
5752
5753
static void enhanced_flush_complete_evt(const void *data, uint8_t size)
5754
{
5755
const struct bt_hci_evt_enhanced_flush_complete *evt = data;
5756
5757
print_handle(evt->handle);
5758
}
5759
5760
static void user_passkey_notify_evt(const void *data, uint8_t size)
5761
{
5762
const struct bt_hci_evt_user_passkey_notify *evt = data;
5763
5764
print_bdaddr(evt->bdaddr);
5765
print_passkey(evt->passkey);
5766
}
5767
5768
static void keypress_notify_evt(const void *data, uint8_t size)
5769
{
5770
const struct bt_hci_evt_keypress_notify *evt = data;
5771
const char *str;
5772
5773
print_bdaddr(evt->bdaddr);
5774
5775
switch (evt->type) {
5776
case 0x00:
5777
str = "Passkey entry started";
5778
break;
5779
case 0x01:
5780
str = "Passkey digit entered";
5781
break;
5782
case 0x02:
5783
str = "Passkey digit erased";
5784
break;
5785
case 0x03:
5786
str = "Passkey clared";
5787
break;
5788
case 0x04:
5789
str = "Passkey entry completed";
5790
break;
5791
default:
5792
str = "Reserved";
5793
break;
5794
}
5795
5796
print_field("Notification type: %s (0x%2.2x)", str, evt->type);
5797
}
5798
5799
static void remote_host_features_notify_evt(const void *data, uint8_t size)
5800
{
5801
const struct bt_hci_evt_remote_host_features_notify *evt = data;
5802
5803
print_bdaddr(evt->bdaddr);
5804
print_features(1, evt->features, 0x00);
5805
}
5806
5807
static void phy_link_complete_evt(const void *data, uint8_t size)
5808
{
5809
const struct bt_hci_evt_phy_link_complete *evt = data;
5810
5811
print_status(evt->status);
5812
print_phy_handle(evt->phy_handle);
5813
}
5814
5815
static void channel_selected_evt(const void *data, uint8_t size)
5816
{
5817
const struct bt_hci_evt_channel_selected *evt = data;
5818
5819
print_phy_handle(evt->phy_handle);
5820
}
5821
5822
static void disconn_phy_link_complete_evt(const void *data, uint8_t size)
5823
{
5824
const struct bt_hci_evt_disconn_phy_link_complete *evt = data;
5825
5826
print_status(evt->status);
5827
print_phy_handle(evt->phy_handle);
5828
print_reason(evt->reason);
5829
}
5830
5831
static void phy_link_loss_early_warning_evt(const void *data, uint8_t size)
5832
{
5833
const struct bt_hci_evt_phy_link_loss_early_warning *evt = data;
5834
const char *str;
5835
5836
print_phy_handle(evt->phy_handle);
5837
5838
switch (evt->reason) {
5839
case 0x00:
5840
str = "Unknown";
5841
break;
5842
case 0x01:
5843
str = "Range related";
5844
break;
5845
case 0x02:
5846
str = "Bandwidth related";
5847
break;
5848
case 0x03:
5849
str = "Resolving conflict";
5850
break;
5851
case 0x04:
5852
str = "Interference";
5853
break;
5854
default:
5855
str = "Reserved";
5856
break;
5857
}
5858
5859
print_field("Reason: %s (0x%2.2x)", str, evt->reason);
5860
}
5861
5862
static void phy_link_recovery_evt(const void *data, uint8_t size)
5863
{
5864
const struct bt_hci_evt_phy_link_recovery *evt = data;
5865
5866
print_phy_handle(evt->phy_handle);
5867
}
5868
5869
static void logic_link_complete_evt(const void *data, uint8_t size)
5870
{
5871
const struct bt_hci_evt_logic_link_complete *evt = data;
5872
5873
print_status(evt->status);
5874
print_handle(evt->handle);
5875
print_phy_handle(evt->phy_handle);
5876
print_field("TX flow spec: 0x%2.2x", evt->flow_spec);
5877
}
5878
5879
static void disconn_logic_link_complete_evt(const void *data, uint8_t size)
5880
{
5881
const struct bt_hci_evt_disconn_logic_link_complete *evt = data;
5882
5883
print_status(evt->status);
5884
print_handle(evt->handle);
5885
print_reason(evt->reason);
5886
}
5887
5888
static void flow_spec_modify_complete_evt(const void *data, uint8_t size)
5889
{
5890
const struct bt_hci_evt_flow_spec_modify_complete *evt = data;
5891
5892
print_status(evt->status);
5893
print_handle(evt->handle);
5894
}
5895
5896
static void num_completed_data_blocks_evt(const void *data, uint8_t size)
5897
{
5898
const struct bt_hci_evt_num_completed_data_blocks *evt = data;
5899
5900
print_field("Total num data blocks: %d", btohs(evt->total_num_blocks));
5901
print_field("Num handles: %d", evt->num_handles);
5902
print_handle(evt->handle);
5903
print_field("Num packets: %d", evt->num_packets);
5904
print_field("Num blocks: %d", evt->num_blocks);
5905
5906
if (size > sizeof(*evt))
5907
packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));
5908
}
5909
5910
static void short_range_mode_change_evt(const void *data, uint8_t size)
5911
{
5912
const struct bt_hci_evt_short_range_mode_change *evt = data;
5913
5914
print_status(evt->status);
5915
print_phy_handle(evt->phy_handle);
5916
print_short_range_mode(evt->mode);
5917
}
5918
5919
static void amp_status_change_evt(const void *data, uint8_t size)
5920
{
5921
const struct bt_hci_evt_amp_status_change *evt = data;
5922
5923
print_status(evt->status);
5924
print_amp_status(evt->amp_status);
5925
}
5926
5927
static void le_conn_complete_evt(const void *data, uint8_t size)
5928
{
5929
const struct bt_hci_evt_le_conn_complete *evt = data;
5930
5931
print_status(evt->status);
5932
print_handle(evt->handle);
5933
print_role(evt->role);
5934
print_addr_type("Peer address type", evt->peer_addr_type);
5935
print_addr("Peer address", evt->peer_addr, evt->peer_addr_type);
5936
print_slot_125("Connection interval", evt->interval);
5937
print_slot_125("Connection latency", evt->latency);
5938
print_field("Supervision timeout: %d msec (0x%4.4x)",
5939
btohs(evt->supv_timeout) * 10, btohs(evt->supv_timeout));
5940
print_field("Master clock accuracy: 0x%2.2x", evt->clock_accuracy);
5941
5942
if (evt->status == 0x00)
5943
assign_handle(btohs(evt->handle), 0x01);
5944
}
5945
5946
static void le_adv_report_evt(const void *data, uint8_t size)
5947
{
5948
const struct bt_hci_evt_le_adv_report *evt = data;
5949
const char *str;
5950
uint8_t evt_len;
5951
int8_t *rssi;
5952
5953
print_num_reports(evt->num_reports);
5954
5955
switch (evt->event_type) {
5956
case 0x00:
5957
str = "Connectable undirected - ADV_IND";
5958
break;
5959
case 0x01:
5960
str = "Connectable directed - ADV_DIRECT_IND";
5961
break;
5962
case 0x02:
5963
str = "Scannable undirected - ADV_SCAN_IND";
5964
break;
5965
case 0x03:
5966
str = "Non connectable undirected - ADV_NONCONN_IND";
5967
break;
5968
case 0x04:
5969
str = "Scan response - SCAN_RSP";
5970
break;
5971
default:
5972
str = "Reserved";
5973
break;
5974
}
5975
5976
print_field("Event type: %s (0x%2.2x)", str, evt->event_type);
5977
print_addr_type("Address type", evt->addr_type);
5978
print_addr("Address", evt->addr, evt->addr_type);
5979
print_field("Data length: %d", evt->data_len);
5980
print_eir(evt->data, evt->data_len, true);
5981
5982
rssi = (int8_t *) (evt->data + evt->data_len);
5983
print_rssi(*rssi);
5984
5985
evt_len = sizeof(*evt) + evt->data_len + 1;
5986
5987
if (size > evt_len)
5988
packet_hexdump(data + evt_len, size - evt_len);
5989
}
5990
5991
static void le_conn_update_complete_evt(const void *data, uint8_t size)
5992
{
5993
const struct bt_hci_evt_le_conn_update_complete *evt = data;
5994
5995
print_status(evt->status);
5996
print_handle(evt->handle);
5997
print_slot_125("Connection interval", evt->interval);
5998
print_slot_125("Connection latency", evt->latency);
5999
print_field("Supervision timeout: %d msec (0x%4.4x)",
6000
btohs(evt->supv_timeout) * 10, btohs(evt->supv_timeout));
6001
}
6002
6003
static void le_remote_features_complete_evt(const void *data, uint8_t size)
6004
{
6005
const struct bt_hci_evt_le_remote_features_complete *evt = data;
6006
6007
print_status(evt->status);
6008
print_handle(evt->handle);
6009
print_features(0, evt->features, 0x01);
6010
}
6011
6012
static void le_long_term_key_request_evt(const void *data, uint8_t size)
6013
{
6014
const struct bt_hci_evt_le_long_term_key_request *evt = data;
6015
6016
print_handle(evt->handle);
6017
print_random_number(evt->number);
6018
print_field("Encryption diversifier: 0x%4.4x",
6019
btohs(evt->diversifier));
6020
}
6021
6022
struct subevent_data {
6023
uint8_t subevent;
6024
const char *str;
6025
void (*func) (const void *data, uint8_t size);
6026
uint8_t size;
6027
bool fixed;
6028
};
6029
6030
static const struct subevent_data subevent_table[] = {
6031
{ 0x01, "LE Connection Complete",
6032
le_conn_complete_evt, 18, true },
6033
{ 0x02, "LE Advertising Report",
6034
le_adv_report_evt, 1, false },
6035
{ 0x03, "LE Connection Update Complete",
6036
le_conn_update_complete_evt, 9, true },
6037
{ 0x04, "LE Read Remote Used Features",
6038
le_remote_features_complete_evt, 11, true },
6039
{ 0x05, "LE Long Term Key Request",
6040
le_long_term_key_request_evt, 12, true },
6041
{ }
6042
};
6043
6044
static void le_meta_event_evt(const void *data, uint8_t size)
6045
{
6046
uint8_t subevent = *((const uint8_t *) data);
6047
const struct subevent_data *subevent_data = NULL;
6048
const char *subevent_color, *subevent_str;
6049
int i;
6050
6051
for (i = 0; subevent_table[i].str; i++) {
6052
if (subevent_table[i].subevent == subevent) {
6053
subevent_data = &subevent_table[i];
6054
break;
6055
}
6056
}
6057
6058
if (subevent_data) {
6059
if (subevent_data->func)
6060
subevent_color = COLOR_HCI_EVENT;
6061
else
6062
subevent_color = COLOR_HCI_EVENT_UNKNOWN;
6063
subevent_str = subevent_data->str;
6064
} else {
6065
subevent_color = COLOR_HCI_EVENT_UNKNOWN;
6066
subevent_str = "Unknown";
6067
}
6068
6069
print_indent(6, subevent_color, "", subevent_str, COLOR_OFF,
6070
" (0x%2.2x)", subevent);
6071
6072
if (!subevent_data || !subevent_data->func) {
6073
packet_hexdump(data + 1, size - 1);
6074
return;
6075
}
6076
6077
if (subevent_data->fixed) {
6078
if (size - 1 != subevent_data->size) {
6079
print_text(COLOR_ERROR, "invalid packet size");
6080
packet_hexdump(data + 1, size - 1);
6081
return;
6082
}
6083
} else {
6084
if (size - 1 < subevent_data->size) {
6085
print_text(COLOR_ERROR, "too short packet");
6086
packet_hexdump(data + 1, size - 1);
6087
return;
6088
}
6089
}
6090
6091
subevent_data->func(data + 1, size - 1);
6092
}
6093
6094
static void vendor_evt(const void *data, uint8_t size)
6095
{
6096
vendor_event(0xffff, data, size);
6097
}
6098
6099
struct event_data {
6100
uint8_t event;
6101
const char *str;
6102
void (*func) (const void *data, uint8_t size);
6103
uint8_t size;
6104
bool fixed;
6105
};
6106
6107
static const struct event_data event_table[] = {
6108
{ 0x01, "Inquiry Complete",
6109
status_evt, 1, true },
6110
{ 0x02, "Inquiry Result",
6111
inquiry_result_evt, 1, false },
6112
{ 0x03, "Connect Complete",
6113
conn_complete_evt, 11, true },
6114
{ 0x04, "Connect Request",
6115
conn_request_evt, 10, true },
6116
{ 0x05, "Disconnect Complete",
6117
disconnect_complete_evt, 4, true },
6118
{ 0x06, "Auth Complete",
6119
auth_complete_evt, 3, true },
6120
{ 0x07, "Remote Name Req Complete",
6121
remote_name_request_complete_evt, 255, true },
6122
{ 0x08, "Encryption Change",
6123
encrypt_change_evt, 4, true },
6124
{ 0x09, "Change Connection Link Key Complete",
6125
change_conn_link_key_complete_evt, 3, true },
6126
{ 0x0a, "Master Link Key Complete",
6127
master_link_key_complete_evt, 4, true },
6128
{ 0x0b, "Read Remote Supported Features",
6129
remote_features_complete_evt, 11, true },
6130
{ 0x0c, "Read Remote Version Complete",
6131
remote_version_complete_evt, 8, true },
6132
{ 0x0d, "QoS Setup Complete",
6133
qos_setup_complete_evt, 21, true },
6134
{ 0x0e, "Command Complete",
6135
cmd_complete_evt, 3, false },
6136
{ 0x0f, "Command Status",
6137
cmd_status_evt, 4, true },
6138
{ 0x10, "Hardware Error",
6139
hardware_error_evt, 1, true },
6140
{ 0x11, "Flush Occurred",
6141
flush_occurred_evt, 2, true },
6142
{ 0x12, "Role Change",
6143
role_change_evt, 8, true },
6144
{ 0x13, "Number of Completed Packets",
6145
num_completed_packets_evt, 1, false },
6146
{ 0x14, "Mode Change",
6147
mode_change_evt, 6, true },
6148
{ 0x15, "Return Link Keys",
6149
return_link_keys_evt, 1, false },
6150
{ 0x16, "PIN Code Request",
6151
pin_code_request_evt, 6, true },
6152
{ 0x17, "Link Key Request",
6153
link_key_request_evt, 6, true },
6154
{ 0x18, "Link Key Notification",
6155
link_key_notify_evt, 23, true },
6156
{ 0x19, "Loopback Command",
6157
loopback_command_evt, 3, false },
6158
{ 0x1a, "Data Buffer Overflow",
6159
data_buffer_overflow_evt, 1, true },
6160
{ 0x1b, "Max Slots Change",
6161
max_slots_change_evt, 3, true },
6162
{ 0x1c, "Read Clock Offset Complete",
6163
clock_offset_complete_evt, 5, true },
6164
{ 0x1d, "Connection Packet Type Changed",
6165
conn_pkt_type_changed_evt, 5, true },
6166
{ 0x1e, "QoS Violation",
6167
qos_violation_evt, 2, true },
6168
{ 0x1f, "Page Scan Mode Change",
6169
pscan_mode_change_evt, 7, true },
6170
{ 0x20, "Page Scan Repetition Mode Change",
6171
pscan_rep_mode_change_evt, 7, true },
6172
{ 0x21, "Flow Specification Complete",
6173
flow_spec_complete_evt, 22, true },
6174
{ 0x22, "Inquiry Result with RSSI",
6175
inquiry_result_with_rssi_evt, 1, false },
6176
{ 0x23, "Read Remote Extended Features",
6177
remote_ext_features_complete_evt, 13, true },
6178
{ 0x2c, "Synchronous Connect Complete",
6179
sync_conn_complete_evt, 17, true },
6180
{ 0x2d, "Synchronous Connect Changed",
6181
sync_conn_changed_evt, 9, true },
6182
{ 0x2e, "Sniff Subrating",
6183
sniff_subrating_evt, 11, true },
6184
{ 0x2f, "Extended Inquiry Result",
6185
ext_inquiry_result_evt, 1, false },
6186
{ 0x30, "Encryption Key Refresh Complete",
6187
encrypt_key_refresh_complete_evt, 3, true },
6188
{ 0x31, "IO Capability Request",
6189
io_capability_request_evt, 6, true },
6190
{ 0x32, "IO Capability Response",
6191
io_capability_response_evt, 9, true },
6192
{ 0x33, "User Confirmation Request",
6193
user_confirm_request_evt, 10, true },
6194
{ 0x34, "User Passkey Request",
6195
user_passkey_request_evt, 6, true },
6196
{ 0x35, "Remote OOB Data Request",
6197
remote_oob_data_request_evt, 6, true },
6198
{ 0x36, "Simple Pairing Complete",
6199
simple_pairing_complete_evt, 7, true },
6200
{ 0x38, "Link Supervision Timeout Changed",
6201
link_supv_timeout_changed_evt, 4, true },
6202
{ 0x39, "Enhanced Flush Complete",
6203
enhanced_flush_complete_evt, 2, true },
6204
{ 0x3b, "User Passkey Notification",
6205
user_passkey_notify_evt, 10, true },
6206
{ 0x3c, "Keypress Notification",
6207
keypress_notify_evt, 7, true },
6208
{ 0x3d, "Remote Host Supported Features",
6209
remote_host_features_notify_evt, 14, true },
6210
{ 0x3e, "LE Meta Event",
6211
le_meta_event_evt, 1, false },
6212
{ 0x40, "Physical Link Complete",
6213
phy_link_complete_evt, 2, true },
6214
{ 0x41, "Channel Selected",
6215
channel_selected_evt, 1, true },
6216
{ 0x42, "Disconnect Physical Link Complete",
6217
disconn_phy_link_complete_evt, 3, true },
6218
{ 0x43, "Physical Link Loss Early Warning",
6219
phy_link_loss_early_warning_evt, 2, true },
6220
{ 0x44, "Physical Link Recovery",
6221
phy_link_recovery_evt, 1, true },
6222
{ 0x45, "Logical Link Complete",
6223
logic_link_complete_evt, 5, true },
6224
{ 0x46, "Disconnect Logical Link Complete",
6225
disconn_logic_link_complete_evt, 4, true },
6226
{ 0x47, "Flow Specification Modify Complete",
6227
flow_spec_modify_complete_evt, 3, true },
6228
{ 0x48, "Number of Completed Data Blocks",
6229
num_completed_data_blocks_evt, 3, false },
6230
{ 0x49, "AMP Start Test" },
6231
{ 0x4a, "AMP Test End" },
6232
{ 0x4b, "AMP Receiver Report" },
6233
{ 0x4c, "Short Range Mode Change Complete",
6234
short_range_mode_change_evt, 3, true },
6235
{ 0x4d, "AMP Status Change",
6236
amp_status_change_evt, 2, true },
6237
{ 0xfe, "Testing" },
6238
{ 0xff, "Vendor", vendor_evt, 0, false },
6239
{ }
6240
};
6241
6242
void packet_new_index(struct timeval *tv, uint16_t index, const char *label,
6243
uint8_t type, uint8_t bus, const char *name)
6244
{
6245
char details[48];
6246
6247
sprintf(details, "(%s,%s,%s)", hci_typetostr(type),
6248
hci_bustostr(bus), name);
6249
6250
print_packet(tv, index, '=', COLOR_NEW_INDEX, "New Index",
6251
label, details);
6252
}
6253
6254
void packet_del_index(struct timeval *tv, uint16_t index, const char *label)
6255
{
6256
print_packet(tv, index, '=', COLOR_DEL_INDEX, "Delete Index",
6257
label, NULL);
6258
}
6259
6260
void packet_hci_command(struct timeval *tv, uint16_t index,
6261
const void *data, uint16_t size)
6262
{
6263
const hci_command_hdr *hdr = data;
6264
uint16_t opcode = btohs(hdr->opcode);
6265
uint16_t ogf = cmd_opcode_ogf(opcode);
6266
uint16_t ocf = cmd_opcode_ocf(opcode);
6267
const struct opcode_data *opcode_data = NULL;
6268
const char *opcode_color, *opcode_str;
6269
char extra_str[25];
6270
int i;
6271
6272
if (size < HCI_COMMAND_HDR_SIZE) {
6273
sprintf(extra_str, "(len %d)", size);
6274
print_packet(tv, index, '*', COLOR_ERROR,
6275
"Malformed HCI Command packet", NULL, extra_str);
6276
packet_hexdump(data, size);
6277
return;
6278
}
6279
6280
data += HCI_COMMAND_HDR_SIZE;
6281
size -= HCI_COMMAND_HDR_SIZE;
6282
6283
for (i = 0; opcode_table[i].str; i++) {
6284
if (opcode_table[i].opcode == opcode) {
6285
opcode_data = &opcode_table[i];
6286
break;
6287
}
6288
}
6289
6290
if (opcode_data) {
6291
if (opcode_data->cmd_func)
6292
opcode_color = COLOR_HCI_COMMAND;
6293
else
6294
opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
6295
opcode_str = opcode_data->str;
6296
} else {
6297
opcode_color = COLOR_HCI_COMMAND_UNKNOWN;
6298
opcode_str = "Unknown";
6299
}
6300
6301
sprintf(extra_str, "(0x%2.2x|0x%4.4x) plen %d", ogf, ocf, hdr->plen);
6302
6303
print_packet(tv, index, '<', opcode_color, "HCI Command",
6304
opcode_str, extra_str);
6305
6306
if (!opcode_data || !opcode_data->cmd_func) {
6307
packet_hexdump(data, size);
6308
return;
6309
}
6310
6311
if (opcode_data->cmd_fixed) {
6312
if (hdr->plen != opcode_data->cmd_size) {
6313
print_text(COLOR_ERROR, "invalid packet size");
6314
packet_hexdump(data, size);
6315
return;
6316
}
6317
} else {
6318
if (hdr->plen < opcode_data->cmd_size) {
6319
print_text(COLOR_ERROR, "too short packet");
6320
packet_hexdump(data, size);
6321
return;
6322
}
6323
}
6324
6325
opcode_data->cmd_func(data, hdr->plen);
6326
}
6327
6328
void packet_hci_event(struct timeval *tv, uint16_t index,
6329
const void *data, uint16_t size)
6330
{
6331
const hci_event_hdr *hdr = data;
6332
const struct event_data *event_data = NULL;
6333
const char *event_color, *event_str;
6334
char extra_str[25];
6335
int i;
6336
6337
if (size < HCI_EVENT_HDR_SIZE) {
6338
sprintf(extra_str, "(len %d)", size);
6339
print_packet(tv, index, '*', COLOR_ERROR,
6340
"Malformed HCI Event packet", NULL, extra_str);
6341
packet_hexdump(data, size);
6342
return;
6343
}
6344
6345
data += HCI_EVENT_HDR_SIZE;
6346
size -= HCI_EVENT_HDR_SIZE;
6347
6348
for (i = 0; event_table[i].str; i++) {
6349
if (event_table[i].event == hdr->evt) {
6350
event_data = &event_table[i];
6351
break;
6352
}
6353
}
6354
6355
if (event_data) {
6356
if (event_data->func)
6357
event_color = COLOR_HCI_EVENT;
6358
else
6359
event_color = COLOR_HCI_EVENT_UNKNOWN;
6360
event_str = event_data->str;
6361
} else {
6362
event_color = COLOR_HCI_EVENT_UNKNOWN;
6363
event_str = "Unknown";
6364
}
6365
6366
sprintf(extra_str, "(0x%2.2x) plen %d", hdr->evt, hdr->plen);
6367
6368
print_packet(tv, index, '>', event_color, "HCI Event",
6369
event_str, extra_str);
6370
6371
if (!event_data || !event_data->func) {
6372
packet_hexdump(data, size);
6373
return;
6374
}
6375
6376
if (event_data->fixed) {
6377
if (hdr->plen != event_data->size) {
6378
print_text(COLOR_ERROR, "invalid packet size");
6379
packet_hexdump(data, size);
6380
return;
6381
}
6382
} else {
6383
if (hdr->plen < event_data->size) {
6384
print_text(COLOR_ERROR, "too short packet");
6385
packet_hexdump(data, size);
6386
return;
6387
}
6388
}
6389
6390
event_data->func(data, hdr->plen);
6391
}
6392
6393
void packet_hci_acldata(struct timeval *tv, uint16_t index, bool in,
6394
const void *data, uint16_t size)
6395
{
6396
const struct bt_hci_acl_hdr *hdr = data;
6397
uint16_t handle = btohs(hdr->handle);
6398
uint16_t dlen = btohs(hdr->dlen);
6399
uint8_t flags = acl_flags(handle);
6400
char handle_str[16], extra_str[32];
6401
6402
if (size < sizeof(*hdr)) {
6403
if (in)
6404
print_packet(tv, index, '*', COLOR_ERROR,
6405
"Malformed ACL Data RX packet", NULL, NULL);
6406
else
6407
print_packet(tv, index, '*', COLOR_ERROR,
6408
"Malformed ACL Data TX packet", NULL, NULL);
6409
packet_hexdump(data, size);
6410
return;
6411
}
6412
6413
data += sizeof(*hdr);
6414
size -= sizeof(*hdr);
6415
6416
sprintf(handle_str, "Handle %d", acl_handle(handle));
6417
sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, dlen);
6418
6419
print_packet(tv, index, in ? '>' : '<', COLOR_HCI_ACLDATA,
6420
in ? "ACL Data RX" : "ACL Data TX",
6421
handle_str, extra_str);
6422
6423
if (size != dlen) {
6424
print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
6425
size, dlen);
6426
packet_hexdump(data, size);
6427
return;
6428
}
6429
6430
if (filter_mask & PACKET_FILTER_SHOW_ACL_DATA)
6431
packet_hexdump(data, size);
6432
6433
l2cap_packet(index, in, acl_handle(handle), flags, data, size);
6434
}
6435
6436
void packet_hci_scodata(struct timeval *tv, uint16_t index, bool in,
6437
const void *data, uint16_t size)
6438
{
6439
const hci_sco_hdr *hdr = data;
6440
uint16_t handle = btohs(hdr->handle);
6441
uint8_t flags = acl_flags(handle);
6442
char handle_str[16], extra_str[32];
6443
6444
if (size < HCI_SCO_HDR_SIZE) {
6445
if (in)
6446
print_packet(tv, index, '*', COLOR_ERROR,
6447
"Malformed SCO Data RX packet", NULL, NULL);
6448
else
6449
print_packet(tv, index, '*', COLOR_ERROR,
6450
"Malformed SCO Data TX packet", NULL, NULL);
6451
packet_hexdump(data, size);
6452
return;
6453
}
6454
6455
data += HCI_SCO_HDR_SIZE;
6456
size -= HCI_SCO_HDR_SIZE;
6457
6458
sprintf(handle_str, "Handle %d", acl_handle(handle));
6459
sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, hdr->dlen);
6460
6461
print_packet(tv, index, in ? '>' : '<', COLOR_HCI_SCODATA,
6462
in ? "SCO Data RX" : "SCO Data TX",
6463
handle_str, extra_str);
6464
6465
if (size != hdr->dlen) {
6466
print_text(COLOR_ERROR, "invalid packet size (%d != %d)",
6467
size, hdr->dlen);
6468
packet_hexdump(data, size);
6469
return;
6470
}
6471
6472
if (filter_mask & PACKET_FILTER_SHOW_SCO_DATA)
6473
packet_hexdump(data, size);
6474
}
6475
6476