• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *  BlueZ - Bluetooth protocol stack for Linux
4  *
5  *  Copyright (C) 2000-2002  Maxim Krasnyansky <maxk@qualcomm.com>
6  *  Copyright (C) 2003-2007  Marcel Holtmann <marcel@holtmann.org>
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 
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #include <netinet/in.h>
39 
40 #include <bluetooth/bluetooth.h>
41 #include <bluetooth/hci.h>
42 #include <bluetooth/hci_lib.h>
43 
44 #include "parser.h"
45 
46 static uint16_t manufacturer = DEFAULT_COMPID;
47 
get_manufacturer(void)48 static inline uint16_t get_manufacturer(void)
49 {
50 	return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer);
51 }
52 
53 #define EVENT_NUM 61
54 static char *event_str[EVENT_NUM + 1] = {
55 	"Unknown",
56 	"Inquiry Complete",
57 	"Inquiry Result",
58 	"Connect Complete",
59 	"Connect Request",
60 	"Disconn Complete",
61 	"Auth Complete",
62 	"Remote Name Req Complete",
63 	"Encrypt Change",
64 	"Change Connection Link Key Complete",
65 	"Master Link Key Complete",
66 	"Read Remote Supported Features",
67 	"Read Remote Ver Info Complete",
68 	"QoS Setup Complete",
69 	"Command Complete",
70 	"Command Status",
71 	"Hardware Error",
72 	"Flush Occurred",
73 	"Role Change",
74 	"Number of Completed Packets",
75 	"Mode Change",
76 	"Return Link Keys",
77 	"PIN Code Request",
78 	"Link Key Request",
79 	"Link Key Notification",
80 	"Loopback Command",
81 	"Data Buffer Overflow",
82 	"Max Slots Change",
83 	"Read Clock Offset Complete",
84 	"Connection Packet Type Changed",
85 	"QoS Violation",
86 	"Page Scan Mode Change",
87 	"Page Scan Repetition Mode Change",
88 	"Flow Specification Complete",
89 	"Inquiry Result with RSSI",
90 	"Read Remote Extended Features",
91 	"Unknown",
92 	"Unknown",
93 	"Unknown",
94 	"Unknown",
95 	"Unknown",
96 	"Unknown",
97 	"Unknown",
98 	"Unknown",
99 	"Synchronous Connect Complete",
100 	"Synchronous Connect Changed",
101 	"Sniff Subrate",
102 	"Extended Inquiry Result",
103 	"Encryption Key Refresh Complete",
104 	"IO Capability Request",
105 	"IO Capability Response",
106 	"User Confirmation Request",
107 	"User Passkey Request",
108 	"Remote OOB Data Request",
109 	"Simple Pairing Complete",
110 	"Unknown",
111 	"Link Supervision Timeout Change",
112 	"Enhanced Flush Complete",
113 	"Unknown",
114 	"User Passkey Notification",
115 	"Keypress Notification",
116 	"Remote Host Supported Features Notification",
117 };
118 
119 #define CMD_LINKCTL_NUM 52
120 static char *cmd_linkctl_str[CMD_LINKCTL_NUM + 1] = {
121 	"Unknown",
122 	"Inquiry",
123 	"Inquiry Cancel",
124 	"Periodic Inquiry Mode",
125 	"Exit Periodic Inquiry Mode",
126 	"Create Connection",
127 	"Disconnect",
128 	"Add SCO Connection",
129 	"Create Connection Cancel",
130 	"Accept Connection Request",
131 	"Reject Connection Request",
132 	"Link Key Request Reply",
133 	"Link Key Request Negative Reply",
134 	"PIN Code Request Reply",
135 	"PIN Code Request Negative Reply",
136 	"Change Connection Packet Type",
137 	"Unknown",
138 	"Authentication Requested",
139 	"Unknown",
140 	"Set Connection Encryption",
141 	"Unknown",
142 	"Change Connection Link Key",
143 	"Unknown",
144 	"Master Link Key",
145 	"Unknown",
146 	"Remote Name Request",
147 	"Remote Name Request Cancel",
148 	"Read Remote Supported Features",
149 	"Read Remote Extended Features",
150 	"Read Remote Version Information",
151 	"Unknown",
152 	"Read Clock Offset",
153 	"Read LMP Handle",
154 	"Unknown",
155 	"Unknown",
156 	"Unknown",
157 	"Unknown",
158 	"Unknown",
159 	"Unknown",
160 	"Unknown",
161 	"Setup Synchronous Connection",
162 	"Accept Synchronous Connection",
163 	"Reject Synchronous Connection",
164 	"IO Capability Request Reply",
165 	"User Confirmation Request Reply",
166 	"User Confirmation Request Negative Reply",
167 	"User Passkey Request Reply",
168 	"User Passkey Request Negative Reply",
169 	"Remote OOB Data Request Reply",
170 	"Unknown",
171 	"Unknown",
172 	"Remote OOB Data Request Negative Reply",
173 	"IO Capability Request Negative Reply",
174 };
175 
176 #define CMD_LINKPOL_NUM 17
177 static char *cmd_linkpol_str[CMD_LINKPOL_NUM + 1] = {
178 	"Unknown",
179 	"Hold Mode",
180 	"Unknown",
181 	"Sniff Mode",
182 	"Exit Sniff Mode",
183 	"Park State",
184 	"Exit Park State",
185 	"QoS Setup",
186 	"Unknown",
187 	"Role Discovery",
188 	"Unknown",
189 	"Switch Role",
190 	"Read Link Policy Settings",
191 	"Write Link Policy Settings",
192 	"Read Default Link Policy Settings",
193 	"Write Default Link Policy Settings",
194 	"Flow Specification",
195 	"Sniff Subrating",
196 };
197 
198 #define CMD_HOSTCTL_NUM 95
199 static char *cmd_hostctl_str[CMD_HOSTCTL_NUM + 1] = {
200 	"Unknown",
201 	"Set Event Mask",
202 	"Unknown",
203 	"Reset",
204 	"Unknown",
205 	"Set Event Filter",
206 	"Unknown",
207 	"Unknown",
208 	"Flush",
209 	"Read PIN Type ",
210 	"Write PIN Type",
211 	"Create New Unit Key",
212 	"Unknown",
213 	"Read Stored Link Key",
214 	"Unknown",
215 	"Unknown",
216 	"Unknown",
217 	"Write Stored Link Key",
218 	"Delete Stored Link Key",
219 	"Write Local Name",
220 	"Read Local Name",
221 	"Read Connection Accept Timeout",
222 	"Write Connection Accept Timeout",
223 	"Read Page Timeout",
224 	"Write Page Timeout",
225 	"Read Scan Enable",
226 	"Write Scan Enable",
227 	"Read Page Scan Activity",
228 	"Write Page Scan Activity",
229 	"Read Inquiry Scan Activity",
230 	"Write Inquiry Scan Activity",
231 	"Read Authentication Enable",
232 	"Write Authentication Enable",
233 	"Read Encryption Mode",
234 	"Write Encryption Mode",
235 	"Read Class of Device",
236 	"Write Class of Device",
237 	"Read Voice Setting",
238 	"Write Voice Setting",
239 	"Read Automatic Flush Timeout",
240 	"Write Automatic Flush Timeout",
241 	"Read Num Broadcast Retransmissions",
242 	"Write Num Broadcast Retransmissions",
243 	"Read Hold Mode Activity ",
244 	"Write Hold Mode Activity",
245 	"Read Transmit Power Level",
246 	"Read Synchronous Flow Control Enable",
247 	"Write Synchronous Flow Control Enable",
248 	"Unknown",
249 	"Set Host Controller To Host Flow Control",
250 	"Unknown",
251 	"Host Buffer Size",
252 	"Unknown",
253 	"Host Number of Completed Packets",
254 	"Read Link Supervision Timeout",
255 	"Write Link Supervision Timeout",
256 	"Read Number of Supported IAC",
257 	"Read Current IAC LAP",
258 	"Write Current IAC LAP",
259 	"Read Page Scan Period Mode",
260 	"Write Page Scan Period Mode",
261 	"Read Page Scan Mode",
262 	"Write Page Scan Mode",
263 	"Set AFH Host Channel Classification",
264 	"Unknown",
265 	"Unknown",
266 	"Read Inquiry Scan Type",
267 	"Write Inquiry Scan Type",
268 	"Read Inquiry Mode",
269 	"Write Inquiry Mode",
270 	"Read Page Scan Type",
271 	"Write Page Scan Type",
272 	"Read AFH Channel Assessment Mode",
273 	"Write AFH Channel Assessment Mode",
274 	"Unknown",
275 	"Unknown",
276 	"Unknown",
277 	"Unknown",
278 	"Unknown",
279 	"Unknown",
280 	"Unknown",
281 	"Read Extended Inquiry Response",
282 	"Write Extended Inquiry Response",
283 	"Refresh Encryption Key",
284 	"Unknown",
285 	"Read Simple Pairing Mode",
286 	"Write Simple Pairing Mode",
287 	"Read Local OOB Data",
288 	"Read Inquiry Response Transmit Power Level",
289 	"Write Inquiry Response Transmit Power Level",
290 	"Read Default Erroneous Data Reporting",
291 	"Write Default Erroneous Data Reporting",
292 	"Unknown",
293 	"Unknown",
294 	"Unknown",
295 	"Enhanced Flush"
296 	"Unknown",
297 };
298 
299 #define CMD_INFO_NUM 9
300 static char *cmd_info_str[CMD_INFO_NUM + 1] = {
301 	"Unknown",
302 	"Read Local Version Information",
303 	"Read Local Supported Commands",
304 	"Read Local Supported Features",
305 	"Read Local Extended Features",
306 	"Read Buffer Size",
307 	"Unknown",
308 	"Read Country Code",
309 	"Unknown",
310 	"Read BD ADDR",
311 };
312 
313 #define CMD_STATUS_NUM 7
314 static char *cmd_status_str[CMD_STATUS_NUM + 1] = {
315 	"Unknown",
316 	"Read Failed Contact Counter",
317 	"Reset Failed Contact Counter",
318 	"Read Link Quality",
319 	"Unknown",
320 	"Read RSSI",
321 	"Read AFH Channel Map",
322 	"Read Clock",
323 };
324 
325 #define CMD_TESTING_NUM 4
326 static char *cmd_testing_str[CMD_TESTING_NUM + 1] = {
327 	"Unknown",
328 	"Read Loopback Mode",
329 	"Write Loopback Mode",
330 	"Enable Device Under Test mode",
331 	"Unknown",
332 };
333 
334 #define ERROR_CODE_NUM 56
335 static char *error_code_str[ERROR_CODE_NUM + 1] = {
336 	"Success",
337 	"Unknown HCI Command",
338 	"Unknown Connection Identifier",
339 	"Hardware Failure",
340 	"Page Timeout",
341 	"Authentication Failure",
342 	"PIN or Key Missing",
343 	"Memory Capacity Exceeded",
344 	"Connection Timeout",
345 	"Connection Limit Exceeded",
346 	"Synchronous Connection to a Device Exceeded",
347 	"ACL Connection Already Exists",
348 	"Command Disallowed",
349 	"Connection Rejected due to Limited Resources",
350 	"Connection Rejected due to Security Reasons",
351 	"Connection Rejected due to Unacceptable BD_ADDR",
352 	"Connection Accept Timeout Exceeded",
353 	"Unsupported Feature or Parameter Value",
354 	"Invalid HCI Command Parameters",
355 	"Remote User Terminated Connection",
356 	"Remote Device Terminated Connection due to Low Resources",
357 	"Remote Device Terminated Connection due to Power Off",
358 	"Connection Terminated by Local Host",
359 	"Repeated Attempts",
360 	"Pairing Not Allowed",
361 	"Unknown LMP PDU",
362 	"Unsupported Remote Feature / Unsupported LMP Feature",
363 	"SCO Offset Rejected",
364 	"SCO Interval Rejected",
365 	"SCO Air Mode Rejected",
366 	"Invalid LMP Parameters",
367 	"Unspecified Error",
368 	"Unsupported LMP Parameter Value",
369 	"Role Change Not Allowed",
370 	"LMP Response Timeout",
371 	"LMP Error Transaction Collision",
372 	"LMP PDU Not Allowed",
373 	"Encryption Mode Not Acceptable",
374 	"Link Key Can Not be Changed",
375 	"Requested QoS Not Supported",
376 	"Instant Passed",
377 	"Pairing with Unit Key Not Supported",
378 	"Different Transaction Collision",
379 	"Reserved",
380 	"QoS Unacceptable Parameter",
381 	"QoS Rejected",
382 	"Channel Classification Not Supported",
383 	"Insufficient Security",
384 	"Parameter out of Mandatory Range",
385 	"Reserved",
386 	"Role Switch Pending",
387 	"Reserved",
388 	"Reserved Slot Violation",
389 	"Role Switch Failed",
390 	"Extended Inquiry Response Too Large",
391 	"Simple Pairing Not Supported by Host",
392 	"Host Busy - Pairing",
393 };
394 
status2str(uint8_t status)395 static char *status2str(uint8_t status)
396 {
397 	char *str;
398 
399 	if (status <= ERROR_CODE_NUM)
400 		str = error_code_str[status];
401 	else
402 		str = "Unknown";
403 
404 	return str;
405 }
406 
opcode2str(uint16_t opcode)407 static char *opcode2str(uint16_t opcode)
408 {
409 	uint16_t ogf = cmd_opcode_ogf(opcode);
410 	uint16_t ocf = cmd_opcode_ocf(opcode);
411 	char *cmd;
412 
413 	switch (ogf) {
414 	case OGF_INFO_PARAM:
415 		if (ocf <= CMD_INFO_NUM)
416 			cmd = cmd_info_str[ocf];
417 		else
418 			cmd = "Unknown";
419 		break;
420 
421 	case OGF_HOST_CTL:
422 		if (ocf <= CMD_HOSTCTL_NUM)
423 			cmd = cmd_hostctl_str[ocf];
424 		else
425 			cmd = "Unknown";
426 		break;
427 
428 	case OGF_LINK_CTL:
429 		if (ocf <= CMD_LINKCTL_NUM)
430 			cmd = cmd_linkctl_str[ocf];
431 		else
432 			cmd = "Unknown";
433 		break;
434 
435 	case OGF_LINK_POLICY:
436 		if (ocf <= CMD_LINKPOL_NUM)
437 			cmd = cmd_linkpol_str[ocf];
438 		else
439 			cmd = "Unknown";
440 		break;
441 
442 	case OGF_STATUS_PARAM:
443 		if (ocf <= CMD_STATUS_NUM)
444 			cmd = cmd_status_str[ocf];
445 		else
446 			cmd = "Unknown";
447 		break;
448 
449 	case OGF_TESTING_CMD:
450 		if (ocf <= CMD_TESTING_NUM)
451 			cmd = cmd_testing_str[ocf];
452 		else
453 			cmd = "Unknown";
454 		break;
455 
456 	case OGF_VENDOR_CMD:
457 		cmd = "Vendor";
458 		break;
459 
460 	default:
461 		cmd = "Unknown";
462 		break;
463 	}
464 
465 	return cmd;
466 }
467 
linktype2str(uint8_t type)468 static char *linktype2str(uint8_t type)
469 {
470 	switch (type) {
471 	case 0x00:
472 		return "SCO";
473 	case 0x01:
474 		return "ACL";
475 	case 0x02:
476 		return "eSCO";
477 	default:
478 		return "Unknown";
479 	}
480 }
481 
role2str(uint8_t role)482 static char *role2str(uint8_t role)
483 {
484 	switch (role) {
485 	case 0x00:
486 		return "Master";
487 	case 0x01:
488 		return "Slave";
489 	default:
490 		return "Unknown";
491 	}
492 }
493 
mode2str(uint8_t mode)494 static char *mode2str(uint8_t mode)
495 {
496 	switch (mode) {
497 	case 0x00:
498 		return "Active";
499 	case 0x01:
500 		return "Hold";
501 	case 0x02:
502 		return "Sniff";
503 	case 0x03:
504 		return "Park";
505 	default:
506 		return "Unknown";
507 	}
508 }
509 
airmode2str(uint8_t mode)510 static char *airmode2str(uint8_t mode)
511 {
512 	switch (mode) {
513 	case 0x00:
514 		return "u-law log";
515 	case 0x01:
516 		return "A-law log";
517 	case 0x02:
518 		return "CVSD";
519 	case 0x04:
520 		return "Transparent data";
521 	default:
522 		return "Reserved";
523 	}
524 }
525 
keytype2str(uint8_t type)526 static char *keytype2str(uint8_t type)
527 {
528 	switch (type) {
529 	case 0x00:
530 		return "Combination Key";
531 	case 0x01:
532 		return "Local Unit Key";
533 	case 0x02:
534 		return "Remote Unit Key";
535 	case 0x03:
536 		return "Debug Combination Key";
537 	case 0x04:
538 		return "Unauthenticated Combination Key";
539 	case 0x05:
540 		return "Authenticated Combination Key";
541 	case 0x06:
542 		return "Changed Combination Key";
543 	default:
544 		return "Reserved";
545 	}
546 }
547 
capability2str(uint8_t capability)548 static char *capability2str(uint8_t capability)
549 {
550 	switch (capability) {
551 	case 0x00:
552 		return "DisplayOnly";
553 	case 0x01:
554 		return "DisplayYesNo";
555 	case 0x02:
556 		return "KeyboardOnly";
557 	case 0x03:
558 		return "NoInputNoOutput";
559 	default:
560 		return "Reserved";
561 	}
562 }
563 
authentication2str(uint8_t authentication)564 static char *authentication2str(uint8_t authentication)
565 {
566 	switch (authentication) {
567 	case 0x00:
568 		return "No Bonding (No MITM Protection)";
569 	case 0x01:
570 		return "No Bonding (MITM Protection)";
571 	case 0x02:
572 		return "Dedicated Bonding (No MITM Protection)";
573 	case 0x03:
574 		return "Dedicated Bonding (MITM Protection)";
575 	case 0x04:
576 		return "General Bonding (No MITM Protection)";
577 	case 0x05:
578 		return "General Bonding (MITM Protection)";
579 	default:
580 		return "Reserved";
581 	}
582 }
583 
ext_inquiry_response_dump(int level,struct frame * frm)584 static inline void ext_inquiry_response_dump(int level, struct frame *frm)
585 {
586 	void *ptr = frm->ptr;
587 	uint32_t len = frm->len;
588 	uint8_t type, length;
589 	char *str;
590 	int i;
591 
592 	length = get_u8(frm);
593 
594 	while (length > 0) {
595 		type = get_u8(frm);
596 		length--;
597 
598 		switch (type) {
599 		case 0x01:
600 			p_indent(level, frm);
601 			printf("Flags:");
602 			for (i = 0; i < length; i++)
603 				printf(" 0x%2.2x", *((uint8_t *) (frm->ptr + i)));
604 			printf("\n");
605 			break;
606 
607 		case 0x02:
608 		case 0x03:
609 			p_indent(level, frm);
610 			printf("%s service classes:",
611 					type == 0x02 ? "Shortened" : "Complete");
612 			for (i = 0; i < length / 2; i++) {
613 				uint16_t val = btohs(bt_get_unaligned((uint16_t *) (frm->ptr + (i * 2))));
614 				printf(" 0x%4.4x", val);
615 			}
616 			printf("\n");
617 			break;
618 
619 		case 0x08:
620 		case 0x09:
621 			str = malloc(length + 1);
622 			if (str) {
623 				snprintf(str, length + 1, "%s", (char *) frm->ptr);
624 				for (i = 0; i < length; i++)
625 					if (!isprint(str[i]))
626 						str[i] = '.';
627 				p_indent(level, frm);
628 				printf("%s local name: \'%s\'\n",
629 					type == 0x08 ? "Shortened" : "Complete", str);
630 				free(str);
631 			}
632 			break;
633 
634 		case 0x0a:
635 			p_indent(level, frm);
636 			printf("TX power level: %d\n", *((uint8_t *) frm->ptr));
637 			break;
638 
639 		default:
640 			p_indent(level, frm);
641 			printf("Unknown type 0x%02x with %d bytes data\n",
642 								type, length);
643 			break;
644 		}
645 
646 		frm->ptr += length;
647 		frm->len -= length;
648 
649 		length = get_u8(frm);
650 	}
651 
652 	frm->ptr = ptr + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
653 	frm->len = len + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
654 }
655 
bdaddr_command_dump(int level,struct frame * frm)656 static inline void bdaddr_command_dump(int level, struct frame *frm)
657 {
658 	bdaddr_t *bdaddr = frm->ptr;
659 	char addr[18];
660 
661 	frm->ptr += sizeof(bdaddr_t);
662 	frm->len -= sizeof(bdaddr_t);
663 
664 	p_indent(level, frm);
665 	p_ba2str(bdaddr, addr);
666 	printf("bdaddr %s\n", addr);
667 
668 	raw_dump(level, frm);
669 }
670 
generic_command_dump(int level,struct frame * frm)671 static inline void generic_command_dump(int level, struct frame *frm)
672 {
673 	uint16_t handle = btohs(htons(get_u16(frm)));
674 
675 	p_indent(level, frm);
676 	printf("handle %d\n", handle);
677 
678 	raw_dump(level, frm);
679 }
680 
generic_write_mode_dump(int level,struct frame * frm)681 static inline void generic_write_mode_dump(int level, struct frame *frm)
682 {
683 	uint8_t mode = get_u8(frm);
684 
685 	p_indent(level, frm);
686 	printf("mode 0x%2.2x\n", mode);
687 }
688 
inquiry_dump(int level,struct frame * frm)689 static inline void inquiry_dump(int level, struct frame *frm)
690 {
691 	inquiry_cp *cp = frm->ptr;
692 
693 	p_indent(level, frm);
694 	printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
695 		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
696 }
697 
periodic_inquiry_dump(int level,struct frame * frm)698 static inline void periodic_inquiry_dump(int level, struct frame *frm)
699 {
700 	periodic_inquiry_cp *cp = frm->ptr;
701 
702 	p_indent(level, frm);
703 	printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
704 		btohs(cp->max_period), btohs(cp->min_period),
705 		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
706 }
707 
create_conn_dump(int level,struct frame * frm)708 static inline void create_conn_dump(int level, struct frame *frm)
709 {
710 	create_conn_cp *cp = frm->ptr;
711 	uint16_t ptype = btohs(cp->pkt_type);
712 	uint16_t clkoffset = btohs(cp->clock_offset);
713 	char addr[18], *str;
714 
715 	p_indent(level, frm);
716 	p_ba2str(&cp->bdaddr, addr);
717 	printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n",
718 		addr, ptype, cp->role_switch,
719 		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
720 
721 	str = hci_ptypetostr(ptype);
722 	if (str) {
723 		p_indent(level, frm);
724 		printf("Packet type: %s\n", str);
725 		free(str);
726 	}
727 }
728 
disconnect_dump(int level,struct frame * frm)729 static inline void disconnect_dump(int level, struct frame *frm)
730 {
731 	disconnect_cp *cp = frm->ptr;
732 
733 	p_indent(level, frm);
734 	printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason);
735 
736 	p_indent(level, frm);
737 	printf("Reason: %s\n", status2str(cp->reason));
738 }
739 
add_sco_dump(int level,struct frame * frm)740 static inline void add_sco_dump(int level, struct frame *frm)
741 {
742 	add_sco_cp *cp = frm->ptr;
743 	uint16_t ptype = btohs(cp->pkt_type);
744 	char *str;
745 
746 	p_indent(level, frm);
747 	printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype);
748 
749 	str = hci_ptypetostr(ptype);
750 	if (str) {
751 		p_indent(level, frm);
752 		printf("Packet type: %s\n", str);
753 		free(str);
754 	}
755 }
756 
accept_conn_req_dump(int level,struct frame * frm)757 static inline void accept_conn_req_dump(int level, struct frame *frm)
758 {
759 	accept_conn_req_cp *cp = frm->ptr;
760 	char addr[18];
761 
762 	p_indent(level, frm);
763 	p_ba2str(&cp->bdaddr, addr);
764 	printf("bdaddr %s role 0x%2.2x\n", addr, cp->role);
765 
766 	p_indent(level, frm);
767 	printf("Role: %s\n", role2str(cp->role));
768 }
769 
reject_conn_req_dump(int level,struct frame * frm)770 static inline void reject_conn_req_dump(int level, struct frame *frm)
771 {
772 	reject_conn_req_cp *cp = frm->ptr;
773 	char addr[18];
774 
775 	p_indent(level, frm);
776 	p_ba2str(&cp->bdaddr, addr);
777 	printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason);
778 
779 	p_indent(level, frm);
780 	printf("Reason: %s\n", status2str(cp->reason));
781 }
782 
pin_code_reply_dump(int level,struct frame * frm)783 static inline void pin_code_reply_dump(int level, struct frame *frm)
784 {
785 	pin_code_reply_cp *cp = frm->ptr;
786 	char addr[18], pin[17];
787 
788 	p_indent(level, frm);
789 	p_ba2str(&cp->bdaddr, addr);
790 	memset(pin, 0, sizeof(pin));
791 	if (parser.flags & DUMP_NOVENDOR)
792 		memset(pin, '*', cp->pin_len);
793 	else
794 		memcpy(pin, cp->pin_code, cp->pin_len);
795 	printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin);
796 }
797 
link_key_reply_dump(int level,struct frame * frm)798 static inline void link_key_reply_dump(int level, struct frame *frm)
799 {
800 	link_key_reply_cp *cp = frm->ptr;
801 	char addr[18];
802 	int i;
803 
804 	p_indent(level, frm);
805 	p_ba2str(&cp->bdaddr, addr);
806 	printf("bdaddr %s key ", addr);
807 	for (i = 0; i < 16; i++)
808 		if (parser.flags & DUMP_NOVENDOR)
809 			printf("**");
810 		else
811 			printf("%2.2X", cp->link_key[i]);
812 	printf("\n");
813 }
814 
pin_code_neg_reply_dump(int level,struct frame * frm)815 static inline void pin_code_neg_reply_dump(int level, struct frame *frm)
816 {
817 	bdaddr_t *bdaddr = frm->ptr;
818 	char addr[18];
819 
820 	p_indent(level, frm);
821 	p_ba2str(bdaddr, addr);
822 	printf("bdaddr %s\n", addr);
823 }
824 
user_passkey_reply_dump(int level,struct frame * frm)825 static inline void user_passkey_reply_dump(int level, struct frame *frm)
826 {
827 	user_passkey_reply_cp *cp = frm->ptr;
828 	char addr[18];
829 
830 	p_indent(level, frm);
831 	p_ba2str(&cp->bdaddr, addr);
832 	printf("bdaddr %s passkey %d\n", addr, btohl(cp->passkey));
833 }
834 
remote_oob_data_reply_dump(int level,struct frame * frm)835 static inline void remote_oob_data_reply_dump(int level, struct frame *frm)
836 {
837 	remote_oob_data_reply_cp *cp = frm->ptr;
838 	char addr[18];
839 	int i;
840 
841 	p_indent(level, frm);
842 	p_ba2str(&cp->bdaddr, addr);
843 	printf("bdaddr %s\n", addr);
844 
845 	p_indent(level, frm);
846 	printf("hash 0x");
847 	for (i = 0; i < 16; i++)
848 		printf("%02x", cp->hash[i]);
849 	printf("\n");
850 
851 	p_indent(level, frm);
852 	printf("randomizer 0x");
853 	for (i = 0; i < 16; i++)
854 			printf("%02x", cp->randomizer[i]);
855 	printf("\n");
856 }
857 
io_capability_reply_dump(int level,struct frame * frm)858 static inline void io_capability_reply_dump(int level, struct frame *frm)
859 {
860 	io_capability_reply_cp *cp = frm->ptr;
861 	char addr[18];
862 
863 	p_indent(level, frm);
864 	p_ba2str(&cp->bdaddr, addr);
865 	printf("bdaddr %s capability 0x%2.2x oob 0x%2.2x auth 0x%2.2x\n",
866 					addr, cp->capability, cp->oob_data,
867 							cp->authentication);
868 
869 	p_indent(level, frm);
870 	printf("Capability: %s (OOB data %s)\n",
871 			capability2str(cp->capability),
872 			cp->oob_data == 0x00 ? "not present" : "available");
873 
874 	p_indent(level, frm);
875 	printf("Authentication: %s\n", authentication2str(cp->authentication));
876 }
877 
set_conn_encrypt_dump(int level,struct frame * frm)878 static inline void set_conn_encrypt_dump(int level, struct frame *frm)
879 {
880 	set_conn_encrypt_cp *cp = frm->ptr;
881 
882 	p_indent(level, frm);
883 	printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt);
884 }
885 
remote_name_req_dump(int level,struct frame * frm)886 static inline void remote_name_req_dump(int level, struct frame *frm)
887 {
888 	remote_name_req_cp *cp = frm->ptr;
889 	uint16_t clkoffset = btohs(cp->clock_offset);
890 	char addr[18];
891 
892 	p_indent(level, frm);
893 	p_ba2str(&cp->bdaddr, addr);
894 	printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n",
895 		addr, cp->pscan_rep_mode,
896 		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
897 }
898 
master_link_key_dump(int level,struct frame * frm)899 static inline void master_link_key_dump(int level, struct frame *frm)
900 {
901 	master_link_key_cp *cp = frm->ptr;
902 
903 	p_indent(level, frm);
904 	printf("flag %d\n", cp->key_flag);
905 }
906 
read_remote_ext_features_dump(int level,struct frame * frm)907 static inline void read_remote_ext_features_dump(int level, struct frame *frm)
908 {
909 	read_remote_ext_features_cp *cp = frm->ptr;
910 
911 	p_indent(level, frm);
912 	printf("handle %d page %d\n", btohs(cp->handle), cp->page_num);
913 }
914 
setup_sync_conn_dump(int level,struct frame * frm)915 static inline void setup_sync_conn_dump(int level, struct frame *frm)
916 {
917 	setup_sync_conn_cp *cp = frm->ptr;
918 
919 	p_indent(level, frm);
920 	printf("handle %d voice setting 0x%4.4x pkt_type 0x%4.4x\n",
921 		btohs(cp->handle), btohs(cp->voice_setting),
922 		btohs(cp->pkt_type));
923 }
924 
accept_sync_conn_req_dump(int level,struct frame * frm)925 static inline void accept_sync_conn_req_dump(int level, struct frame *frm)
926 {
927 	accept_sync_conn_req_cp *cp = frm->ptr;
928 	char addr[18];
929 
930 	p_indent(level, frm);
931 	p_ba2str(&cp->bdaddr, addr);
932 	printf("bdaddr %s voice_setting 0x%4.4x pkt_type 0x%4.4x\n",
933 		addr, btohs(cp->voice_setting), btohs(cp->pkt_type));
934 }
935 
hold_mode_dump(int level,struct frame * frm)936 static inline void hold_mode_dump(int level, struct frame *frm)
937 {
938 	hold_mode_cp *cp = frm->ptr;
939 
940 	p_indent(level, frm);
941 	printf("handle %d max %d min %d\n", btohs(cp->handle),
942 			btohs(cp->max_interval), btohs(cp->min_interval));
943 }
944 
sniff_mode_dump(int level,struct frame * frm)945 static inline void sniff_mode_dump(int level, struct frame *frm)
946 {
947 	sniff_mode_cp *cp = frm->ptr;
948 
949 	p_indent(level, frm);
950 	printf("handle %d max %d min %d attempt %d timeout %d\n",
951 		btohs(cp->handle), btohs(cp->max_interval),
952 		btohs(cp->min_interval), btohs(cp->attempt), btohs(cp->timeout));
953 }
954 
qos_setup_dump(int level,struct frame * frm)955 static inline void qos_setup_dump(int level, struct frame *frm)
956 {
957 	qos_setup_cp *cp = frm->ptr;
958 
959 	p_indent(level, frm);
960 	printf("handle %d flags 0x%2.2x\n", btohs(cp->handle), cp->flags);
961 
962 	p_indent(level, frm);
963 	printf("Service type: %d\n", cp->qos.service_type);
964 	p_indent(level, frm);
965 	printf("Token rate: %d\n", btohl(cp->qos.token_rate));
966 	p_indent(level, frm);
967 	printf("Peak bandwith: %d\n", btohl(cp->qos.peak_bandwidth));
968 	p_indent(level, frm);
969 	printf("Latency: %d\n", btohl(cp->qos.latency));
970 	p_indent(level, frm);
971 	printf("Delay variation: %d\n", btohl(cp->qos.delay_variation));
972 }
973 
write_link_policy_dump(int level,struct frame * frm)974 static inline void write_link_policy_dump(int level, struct frame *frm)
975 {
976 	write_link_policy_cp *cp = frm->ptr;
977 	uint16_t policy = btohs(cp->policy);
978 	char *str;
979 
980 	p_indent(level, frm);
981 	printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy);
982 
983 	str = hci_lptostr(policy);
984 	if (str) {
985 		p_indent(level, frm);
986 		printf("Link policy: %s\n", str);
987 		free(str);
988 	}
989 }
990 
write_default_link_policy_dump(int level,struct frame * frm)991 static inline void write_default_link_policy_dump(int level, struct frame *frm)
992 {
993 	uint16_t policy = btohs(htons(get_u16(frm)));
994 	char *str;
995 
996 	p_indent(level, frm);
997 	printf("policy 0x%2.2x\n", policy);
998 
999 	str = hci_lptostr(policy);
1000 	if (str) {
1001 		p_indent(level, frm);
1002 		printf("Link policy: %s\n", str);
1003 		free(str);
1004 	}
1005 }
1006 
sniff_subrating_dump(int level,struct frame * frm)1007 static inline void sniff_subrating_dump(int level, struct frame *frm)
1008 {
1009 	sniff_subrating_cp *cp = frm->ptr;
1010 
1011 	p_indent(level, frm);
1012 	printf("handle %d\n", btohs(cp->handle));
1013 
1014 	p_indent(level, frm);
1015 	printf("max latency %d\n", btohs(cp->max_latency));
1016 
1017 	p_indent(level, frm);
1018 	printf("min timeout remote %d local %d\n",
1019 		btohs(cp->min_remote_timeout), btohs(cp->min_local_timeout));
1020 }
1021 
set_event_mask_dump(int level,struct frame * frm)1022 static inline void set_event_mask_dump(int level, struct frame *frm)
1023 {
1024 	set_event_mask_cp *cp = frm->ptr;
1025 	int i;
1026 
1027 	p_indent(level, frm);
1028 	printf("Mask: 0x");
1029 	for (i = 0; i < 8; i++)
1030 		printf("%2.2x", cp->mask[i]);
1031 	printf("\n");
1032 }
1033 
set_event_flt_dump(int level,struct frame * frm)1034 static inline void set_event_flt_dump(int level, struct frame *frm)
1035 {
1036 	set_event_flt_cp *cp = frm->ptr;
1037 	uint8_t dev_class[3], dev_mask[3];
1038 	char addr[18];
1039 
1040 	p_indent(level, frm);
1041 	printf("type %d condition %d\n", cp->flt_type,
1042 				(cp->flt_type == 0) ? 0 : cp->cond_type);
1043 
1044 	switch (cp->flt_type) {
1045 	case FLT_CLEAR_ALL:
1046 		p_indent(level, frm);
1047 		printf("Clear all filters\n");
1048 		break;
1049 	case FLT_INQ_RESULT:
1050 		p_indent(level, frm);
1051 		printf("Inquiry result");
1052 		switch (cp->cond_type) {
1053 		case INQ_RESULT_RETURN_ALL:
1054 			printf(" for all devices\n");
1055 			break;
1056 		case INQ_RESULT_RETURN_CLASS:
1057 			memcpy(dev_class, cp->condition, 3);
1058 			memcpy(dev_mask, cp->condition + 3, 3);
1059 			printf(" with class 0x%2.2x%2.2x%2.2x mask 0x%2.2x%2.2x%2.2x\n",
1060 				dev_class[2], dev_class[1], dev_class[0],
1061 				dev_mask[2], dev_mask[1], dev_mask[0]);
1062 			break;
1063 		case INQ_RESULT_RETURN_BDADDR:
1064 			p_ba2str((bdaddr_t *) cp->condition, addr);
1065 			printf(" with bdaddr %s\n", addr);
1066 			break;
1067 		default:
1068 			printf("\n");
1069 			break;
1070 		}
1071 		break;
1072 	case FLT_CONN_SETUP:
1073 		p_indent(level, frm);
1074 		printf("Connection setup");
1075 		switch (cp->cond_type) {
1076 		case CONN_SETUP_ALLOW_ALL:
1077 		case CONN_SETUP_ALLOW_CLASS:
1078 		case CONN_SETUP_ALLOW_BDADDR:
1079 		default:
1080 			printf("\n");
1081 			break;
1082 		}
1083 		break;
1084 	}
1085 }
1086 
write_pin_type_dump(int level,struct frame * frm)1087 static inline void write_pin_type_dump(int level, struct frame *frm)
1088 {
1089 	write_pin_type_cp *cp = frm->ptr;
1090 
1091 	p_indent(level, frm);
1092 	printf("type %d\n", cp->pin_type);
1093 }
1094 
request_stored_link_key_dump(int level,struct frame * frm)1095 static inline void request_stored_link_key_dump(int level, struct frame *frm)
1096 {
1097 	read_stored_link_key_cp *cp = frm->ptr;
1098 	char addr[18];
1099 
1100 	p_indent(level, frm);
1101 	p_ba2str(&cp->bdaddr, addr);
1102 	printf("bdaddr %s all %d\n", addr, cp->read_all);
1103 }
1104 
return_link_keys_dump(int level,struct frame * frm)1105 static inline void return_link_keys_dump(int level, struct frame *frm)
1106 {
1107 	uint8_t num = get_u8(frm);
1108 	uint8_t key[16];
1109 	char addr[18];
1110 	int i, n;
1111 
1112 	for (n = 0; n < num; n++) {
1113 		p_ba2str(frm->ptr, addr);
1114 		memcpy(key, frm->ptr + 6, 16);
1115 
1116 		p_indent(level, frm);
1117 		printf("bdaddr %s key ", addr);
1118 		for (i = 0; i < 16; i++)
1119 			if (parser.flags & DUMP_NOVENDOR)
1120 				printf("**");
1121 			else
1122 				printf("%2.2X", key[i]);
1123 		printf("\n");
1124 
1125 		frm->ptr += 2;
1126 		frm->len -= 2;
1127 	}
1128 }
1129 
change_local_name_dump(int level,struct frame * frm)1130 static inline void change_local_name_dump(int level, struct frame *frm)
1131 {
1132 	change_local_name_cp *cp = frm->ptr;
1133 	char name[249];
1134 	int i;
1135 
1136 	memset(name, 0, sizeof(name));
1137 	for (i = 0; i < 248 && cp->name[i]; i++)
1138 		if (isprint(cp->name[i]))
1139 			name[i] = cp->name[i];
1140 		else
1141 			name[i] = '.';
1142 
1143 	p_indent(level, frm);
1144 	printf("name \'%s\'\n", name);
1145 }
1146 
write_class_of_dev_dump(int level,struct frame * frm)1147 static inline void write_class_of_dev_dump(int level, struct frame *frm)
1148 {
1149 	write_class_of_dev_cp *cp = frm->ptr;
1150 
1151 	p_indent(level, frm);
1152 	printf("class 0x%2.2x%2.2x%2.2x\n",
1153 			cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
1154 }
1155 
write_voice_setting_dump(int level,struct frame * frm)1156 static inline void write_voice_setting_dump(int level, struct frame *frm)
1157 {
1158 	write_voice_setting_cp *cp = frm->ptr;
1159 
1160 	p_indent(level, frm);
1161 	printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));
1162 }
1163 
write_current_iac_lap_dump(int level,struct frame * frm)1164 static inline void write_current_iac_lap_dump(int level, struct frame *frm)
1165 {
1166 	write_current_iac_lap_cp *cp = frm->ptr;
1167 	int i;
1168 
1169 	for (i = 0; i < cp->num_current_iac; i++) {
1170 		p_indent(level, frm);
1171 		printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]);
1172 		if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) {
1173 			switch (cp->lap[i][0]) {
1174 			case 0x00:
1175 				printf(" (Limited Inquiry Access Code)");
1176 				break;
1177 			case 0x33:
1178 				printf(" (General Inquiry Access Code)");
1179 				break;
1180 			}
1181 		}
1182 		printf("\n");
1183 	}
1184 }
1185 
write_scan_enable_dump(int level,struct frame * frm)1186 static inline void write_scan_enable_dump(int level, struct frame *frm)
1187 {
1188 	uint8_t enable = get_u8(frm);
1189 
1190 	p_indent(level, frm);
1191 	printf("enable %d\n", enable);
1192 }
1193 
write_page_timeout_dump(int level,struct frame * frm)1194 static inline void write_page_timeout_dump(int level, struct frame *frm)
1195 {
1196 	write_page_timeout_cp *cp = frm->ptr;
1197 
1198 	p_indent(level, frm);
1199 	printf("timeout %d\n", btohs(cp->timeout));
1200 }
1201 
write_page_activity_dump(int level,struct frame * frm)1202 static inline void write_page_activity_dump(int level, struct frame *frm)
1203 {
1204 	write_page_activity_cp *cp = frm->ptr;
1205 
1206 	p_indent(level, frm);
1207 	printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window));
1208 }
1209 
write_inquiry_scan_type_dump(int level,struct frame * frm)1210 static inline void write_inquiry_scan_type_dump(int level, struct frame *frm)
1211 {
1212 	write_inquiry_scan_type_cp *cp = frm->ptr;
1213 
1214 	p_indent(level, frm);
1215 	printf("type %d\n", cp->type);
1216 }
1217 
write_inquiry_mode_dump(int level,struct frame * frm)1218 static inline void write_inquiry_mode_dump(int level, struct frame *frm)
1219 {
1220 	write_inquiry_mode_cp *cp = frm->ptr;
1221 
1222 	p_indent(level, frm);
1223 	printf("mode %d\n", cp->mode);
1224 }
1225 
set_afh_classification_dump(int level,struct frame * frm)1226 static inline void set_afh_classification_dump(int level, struct frame *frm)
1227 {
1228 	set_afh_classification_cp *cp = frm->ptr;
1229 	int i;
1230 
1231 	p_indent(level, frm);
1232 	printf("map 0x");
1233 	for (i = 0; i < 10; i++)
1234 		printf("%02x", cp->map[i]);
1235 	printf("\n");
1236 }
1237 
write_link_supervision_timeout_dump(int level,struct frame * frm)1238 static inline void write_link_supervision_timeout_dump(int level, struct frame *frm)
1239 {
1240 	write_link_supervision_timeout_cp *cp = frm->ptr;
1241 
1242 	p_indent(level, frm);
1243 	printf("handle %d timeout %d\n",
1244 				btohs(cp->handle), btohs(cp->timeout));
1245 }
1246 
write_ext_inquiry_response_dump(int level,struct frame * frm)1247 static inline void write_ext_inquiry_response_dump(int level, struct frame *frm)
1248 {
1249 	write_ext_inquiry_response_cp *cp = frm->ptr;
1250 
1251 	p_indent(level, frm);
1252 	printf("fec 0x%2.2x\n", cp->fec);
1253 
1254 	frm->ptr++;
1255 	frm->len--;
1256 
1257 	ext_inquiry_response_dump(level, frm);
1258 }
1259 
write_inquiry_transmit_power_level_dump(int level,struct frame * frm)1260 static inline void write_inquiry_transmit_power_level_dump(int level, struct frame *frm)
1261 {
1262 	write_inquiry_transmit_power_level_cp *cp = frm->ptr;
1263 
1264 	p_indent(level, frm);
1265 	printf("level %d\n", cp->level);
1266 }
1267 
write_default_error_data_reporting_dump(int level,struct frame * frm)1268 static inline void write_default_error_data_reporting_dump(int level, struct frame *frm)
1269 {
1270 	write_default_error_data_reporting_cp *cp = frm->ptr;
1271 
1272 	p_indent(level, frm);
1273 	printf("reporting %d\n", cp->reporting);
1274 }
1275 
enhanced_flush_dump(int level,struct frame * frm)1276 static inline void enhanced_flush_dump(int level, struct frame *frm)
1277 {
1278 	enhanced_flush_cp *cp = frm->ptr;
1279 
1280 	p_indent(level, frm);
1281 	printf("handle %d type %d\n", btohs(cp->handle), cp->type);
1282 }
1283 
send_keypress_notify_dump(int level,struct frame * frm)1284 static inline void send_keypress_notify_dump(int level, struct frame *frm)
1285 {
1286 	send_keypress_notify_cp *cp = frm->ptr;
1287 	char addr[18];
1288 
1289 	p_indent(level, frm);
1290 	p_ba2str(&cp->bdaddr, addr);
1291 	printf("bdaddr %s type %d\n", addr, cp->type);
1292 }
1293 
request_transmit_power_level_dump(int level,struct frame * frm)1294 static inline void request_transmit_power_level_dump(int level, struct frame *frm)
1295 {
1296 	read_transmit_power_level_cp *cp = frm->ptr;
1297 
1298 	p_indent(level, frm);
1299 	printf("handle %d type %d (%s)\n",
1300 					btohs(cp->handle), cp->type,
1301 					cp->type ? "maximum" : "current");
1302 }
1303 
request_local_ext_features_dump(int level,struct frame * frm)1304 static inline void request_local_ext_features_dump(int level, struct frame *frm)
1305 {
1306 	read_local_ext_features_cp *cp = frm->ptr;
1307 
1308 	p_indent(level, frm);
1309 	printf("page %d\n", cp->page_num);
1310 }
1311 
request_clock_dump(int level,struct frame * frm)1312 static inline void request_clock_dump(int level, struct frame *frm)
1313 {
1314 	read_clock_cp *cp = frm->ptr;
1315 
1316 	p_indent(level, frm);
1317 	printf("handle %d which %d (%s)\n",
1318 					btohs(cp->handle), cp->which_clock,
1319 					cp->which_clock ? "piconet" : "local");
1320 }
1321 
host_buffer_size_dump(int level,struct frame * frm)1322 static inline void host_buffer_size_dump(int level, struct frame *frm)
1323 {
1324 	host_buffer_size_cp *cp = frm->ptr;
1325 
1326 	p_indent(level, frm);
1327 	printf("ACL MTU %d:%d SCO MTU %d:%d\n",
1328 				btohs(cp->acl_mtu), btohs(cp->acl_max_pkt),
1329 				cp->sco_mtu, btohs(cp->sco_max_pkt));
1330 }
1331 
num_comp_pkts_dump(int level,struct frame * frm)1332 static inline void num_comp_pkts_dump(int level, struct frame *frm)
1333 {
1334 	uint8_t num = get_u8(frm);
1335 	uint16_t handle, packets;
1336 	int i;
1337 
1338 	for (i = 0; i < num; i++) {
1339 		handle = btohs(htons(get_u16(frm)));
1340 		packets = btohs(htons(get_u16(frm)));
1341 
1342 		p_indent(level, frm);
1343 		printf("handle %d packets %d\n", handle, packets);
1344 	}
1345 }
1346 
command_dump(int level,struct frame * frm)1347 static inline void command_dump(int level, struct frame *frm)
1348 {
1349 	hci_command_hdr *hdr = frm->ptr;
1350 	uint16_t opcode = btohs(hdr->opcode);
1351 	uint16_t ogf = cmd_opcode_ogf(opcode);
1352 	uint16_t ocf = cmd_opcode_ocf(opcode);
1353 
1354 	if (p_filter(FILT_HCI))
1355 		return;
1356 
1357 	if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
1358 		return;
1359 
1360 	p_indent(level, frm);
1361 	printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
1362 				opcode2str(opcode), ogf, ocf, hdr->plen);
1363 
1364 	frm->ptr += HCI_COMMAND_HDR_SIZE;
1365 	frm->len -= HCI_COMMAND_HDR_SIZE;
1366 
1367 	if (ogf == OGF_VENDOR_CMD) {
1368 		if (ocf == 0 && get_manufacturer() == 10) {
1369 			csr_dump(level + 1, frm);
1370 			return;
1371 		}
1372 	}
1373 
1374 	if (!(parser.flags & DUMP_VERBOSE)) {
1375 		raw_dump(level, frm);
1376 		return;
1377 	}
1378 
1379 	switch (ogf) {
1380 	case OGF_LINK_CTL:
1381 		switch (ocf) {
1382 		case OCF_INQUIRY:
1383 			inquiry_dump(level + 1, frm);
1384 			return;
1385 		case OCF_PERIODIC_INQUIRY:
1386 			periodic_inquiry_dump(level + 1, frm);
1387 			return;
1388 		case OCF_INQUIRY_CANCEL:
1389 		case OCF_EXIT_PERIODIC_INQUIRY:
1390 			return;
1391 		case OCF_CREATE_CONN:
1392 			create_conn_dump(level + 1, frm);
1393 			return;
1394 		case OCF_DISCONNECT:
1395 			disconnect_dump(level + 1, frm);
1396 			return;
1397 		case OCF_CREATE_CONN_CANCEL:
1398 		case OCF_REMOTE_NAME_REQ_CANCEL:
1399 			bdaddr_command_dump(level + 1, frm);
1400 			return;
1401 		case OCF_ACCEPT_SYNC_CONN_REQ:
1402 			accept_sync_conn_req_dump(level + 1, frm);
1403 			return;
1404 		case OCF_ADD_SCO:
1405 		case OCF_SET_CONN_PTYPE:
1406 			add_sco_dump(level + 1, frm);
1407 			return;
1408 		case OCF_ACCEPT_CONN_REQ:
1409 			accept_conn_req_dump(level + 1, frm);
1410 			return;
1411 		case OCF_REJECT_CONN_REQ:
1412 		case OCF_REJECT_SYNC_CONN_REQ:
1413 		case OCF_IO_CAPABILITY_NEG_REPLY:
1414 			reject_conn_req_dump(level + 1, frm);
1415 			return;
1416 		case OCF_PIN_CODE_REPLY:
1417 			pin_code_reply_dump(level + 1, frm);
1418 			return;
1419 		case OCF_LINK_KEY_REPLY:
1420 			link_key_reply_dump(level + 1, frm);
1421 			return;
1422 		case OCF_PIN_CODE_NEG_REPLY:
1423 		case OCF_LINK_KEY_NEG_REPLY:
1424 		case OCF_USER_CONFIRM_REPLY:
1425 		case OCF_USER_CONFIRM_NEG_REPLY:
1426 		case OCF_USER_PASSKEY_NEG_REPLY:
1427 		case OCF_REMOTE_OOB_DATA_NEG_REPLY:
1428 			pin_code_neg_reply_dump(level + 1, frm);
1429 			return;
1430 		case OCF_USER_PASSKEY_REPLY:
1431 			user_passkey_reply_dump(level + 1, frm);
1432 			return;
1433 		case OCF_REMOTE_OOB_DATA_REPLY:
1434 			remote_oob_data_reply_dump(level + 1, frm);
1435 			return;
1436 		case OCF_IO_CAPABILITY_REPLY:
1437 			io_capability_reply_dump(level + 1, frm);
1438 			return;
1439 		case OCF_SET_CONN_ENCRYPT:
1440 			set_conn_encrypt_dump(level + 1, frm);
1441 			return;
1442 		case OCF_AUTH_REQUESTED:
1443 		case OCF_CHANGE_CONN_LINK_KEY:
1444 		case OCF_READ_REMOTE_FEATURES:
1445 		case OCF_READ_REMOTE_VERSION:
1446 		case OCF_READ_CLOCK_OFFSET:
1447 		case OCF_READ_LMP_HANDLE:
1448 			generic_command_dump(level + 1, frm);
1449 			return;
1450 		case OCF_MASTER_LINK_KEY:
1451 			master_link_key_dump(level + 1, frm);
1452 			return;
1453 		case OCF_READ_REMOTE_EXT_FEATURES:
1454 			read_remote_ext_features_dump(level + 1, frm);
1455 			return;
1456 		case OCF_REMOTE_NAME_REQ:
1457 			remote_name_req_dump(level + 1, frm);
1458 			return;
1459 		case OCF_SETUP_SYNC_CONN:
1460 			setup_sync_conn_dump(level + 1, frm);
1461 			return;
1462 		}
1463 		break;
1464 
1465 	case OGF_LINK_POLICY:
1466 		switch (ocf) {
1467 		case OCF_HOLD_MODE:
1468 		case OCF_PARK_MODE:
1469 			hold_mode_dump(level + 1, frm);
1470 			return;
1471 		case OCF_SNIFF_MODE:
1472 			sniff_mode_dump(level + 1, frm);
1473 			return;
1474 		case OCF_EXIT_SNIFF_MODE:
1475 		case OCF_EXIT_PARK_MODE:
1476 		case OCF_ROLE_DISCOVERY:
1477 		case OCF_READ_LINK_POLICY:
1478 			generic_command_dump(level + 1, frm);
1479 			return;
1480 		case OCF_READ_DEFAULT_LINK_POLICY:
1481 			return;
1482 		case OCF_SWITCH_ROLE:
1483 			accept_conn_req_dump(level + 1, frm);
1484 			return;
1485 		case OCF_QOS_SETUP:
1486 			qos_setup_dump(level + 1, frm);
1487 			return;
1488 		case OCF_WRITE_LINK_POLICY:
1489 			write_link_policy_dump(level + 1, frm);
1490 			return;
1491 		case OCF_WRITE_DEFAULT_LINK_POLICY:
1492 			write_default_link_policy_dump(level + 1, frm);
1493 			return;
1494 		case OCF_SNIFF_SUBRATING:
1495 			sniff_subrating_dump(level + 1, frm);
1496 			return;
1497 		}
1498 		break;
1499 
1500 	case OGF_HOST_CTL:
1501 		switch (ocf) {
1502 		case OCF_RESET:
1503 		case OCF_CREATE_NEW_UNIT_KEY:
1504 			return;
1505 		case OCF_SET_EVENT_MASK:
1506 			set_event_mask_dump(level + 1, frm);
1507 			return;
1508 		case OCF_SET_EVENT_FLT:
1509 			set_event_flt_dump(level + 1, frm);
1510 			return;
1511 		case OCF_WRITE_PIN_TYPE:
1512 			write_pin_type_dump(level + 1, frm);
1513 			return;
1514 		case OCF_READ_STORED_LINK_KEY:
1515 		case OCF_DELETE_STORED_LINK_KEY:
1516 			request_stored_link_key_dump(level + 1, frm);
1517 			return;
1518 		case OCF_WRITE_STORED_LINK_KEY:
1519 			return_link_keys_dump(level + 1, frm);
1520 			return;
1521 		case OCF_CHANGE_LOCAL_NAME:
1522 			change_local_name_dump(level + 1, frm);
1523 			return;
1524 		case OCF_WRITE_CLASS_OF_DEV:
1525 			write_class_of_dev_dump(level + 1, frm);
1526 			return;
1527 		case OCF_WRITE_VOICE_SETTING:
1528 			write_voice_setting_dump(level + 1, frm);
1529 			return;
1530 		case OCF_WRITE_CURRENT_IAC_LAP:
1531 			write_current_iac_lap_dump(level + 1, frm);
1532 			return;
1533 		case OCF_WRITE_SCAN_ENABLE:
1534 		case OCF_WRITE_AUTH_ENABLE:
1535 		case OCF_SET_CONTROLLER_TO_HOST_FC:
1536 			write_scan_enable_dump(level + 1, frm);
1537 			return;
1538 		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1539 		case OCF_WRITE_PAGE_TIMEOUT:
1540 			write_page_timeout_dump(level + 1, frm);
1541 			return;
1542 		case OCF_WRITE_PAGE_ACTIVITY:
1543 		case OCF_WRITE_INQ_ACTIVITY:
1544 			write_page_activity_dump(level + 1, frm);
1545 			return;
1546 		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1547 			write_inquiry_scan_type_dump(level + 1, frm);
1548 			return;
1549 		case OCF_WRITE_ENCRYPT_MODE:
1550 		case OCF_WRITE_INQUIRY_MODE:
1551 		case OCF_WRITE_AFH_MODE:
1552 			write_inquiry_mode_dump(level + 1, frm);
1553 			return;
1554 		case OCF_SET_AFH_CLASSIFICATION:
1555 			set_afh_classification_dump(level + 1, frm);
1556 			return;
1557 		case OCF_READ_TRANSMIT_POWER_LEVEL:
1558 			request_transmit_power_level_dump(level + 1, frm);
1559 			return;
1560 		case OCF_HOST_BUFFER_SIZE:
1561 			host_buffer_size_dump(level + 1, frm);
1562 			return;
1563 		case OCF_HOST_NUM_COMP_PKTS:
1564 			num_comp_pkts_dump(level + 1, frm);
1565 			return;
1566 		case OCF_FLUSH:
1567 		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
1568 		case OCF_REFRESH_ENCRYPTION_KEY:
1569 			generic_command_dump(level + 1, frm);
1570 			return;
1571 		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
1572 			write_link_supervision_timeout_dump(level + 1, frm);
1573 			return;
1574 		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
1575 			write_ext_inquiry_response_dump(level + 1, frm);
1576 			return;
1577 		case OCF_WRITE_SIMPLE_PAIRING_MODE:
1578 			generic_write_mode_dump(level + 1, frm);
1579 			return;
1580 		case OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL:
1581 			write_inquiry_transmit_power_level_dump(level + 1, frm);
1582 			return;
1583 		case OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING:
1584 			write_default_error_data_reporting_dump(level + 1, frm);
1585 			return;
1586 		case OCF_ENHANCED_FLUSH:
1587 			enhanced_flush_dump(level + 1, frm);
1588 			return;
1589 		case OCF_SEND_KEYPRESS_NOTIFY:
1590 			send_keypress_notify_dump(level + 1, frm);
1591 			return;
1592 		}
1593 		break;
1594 
1595 	case OGF_INFO_PARAM:
1596 		switch (ocf) {
1597 		case OCF_READ_LOCAL_EXT_FEATURES:
1598 			request_local_ext_features_dump(level + 1, frm);
1599 			return;
1600 		}
1601 		break;
1602 
1603 	case OGF_STATUS_PARAM:
1604 		switch (ocf) {
1605 		case OCF_READ_LINK_QUALITY:
1606 		case OCF_READ_RSSI:
1607 		case OCF_READ_AFH_MAP:
1608 			generic_command_dump(level + 1, frm);
1609 			return;
1610 		case OCF_READ_CLOCK:
1611 			request_clock_dump(level + 1, frm);
1612 			return;
1613 		}
1614 		break;
1615 
1616 	case OGF_TESTING_CMD:
1617 		switch (ocf) {
1618 		case OCF_WRITE_LOOPBACK_MODE:
1619 		case OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE:
1620 			generic_write_mode_dump(level + 1, frm);
1621 			return;
1622 		}
1623 		break;
1624 	}
1625 
1626 	raw_dump(level, frm);
1627 }
1628 
status_response_dump(int level,struct frame * frm)1629 static inline void status_response_dump(int level, struct frame *frm)
1630 {
1631 	uint8_t status = get_u8(frm);
1632 
1633 	p_indent(level, frm);
1634 	printf("status 0x%2.2x\n", status);
1635 
1636 	if (status > 0) {
1637 		p_indent(level, frm);
1638 		printf("Error: %s\n", status2str(status));
1639 	}
1640 
1641 	raw_dump(level, frm);
1642 }
1643 
handle_response_dump(int level,struct frame * frm)1644 static inline void handle_response_dump(int level, struct frame *frm)
1645 {
1646 	uint16_t handle = btohs(htons(get_u16(frm)));
1647 
1648 	p_indent(level, frm);
1649 	printf("handle %d\n", handle);
1650 
1651 	raw_dump(level, frm);
1652 }
1653 
bdaddr_response_dump(int level,struct frame * frm)1654 static inline void bdaddr_response_dump(int level, struct frame *frm)
1655 {
1656 	uint8_t status = get_u8(frm);
1657 	bdaddr_t *bdaddr = frm->ptr;
1658 	char addr[18];
1659 
1660 	frm->ptr += sizeof(bdaddr_t);
1661 	frm->len -= sizeof(bdaddr_t);
1662 
1663 	p_indent(level, frm);
1664 	p_ba2str(bdaddr, addr);
1665 	printf("status 0x%2.2x bdaddr %s\n", status, addr);
1666 
1667 	if (status > 0) {
1668 		p_indent(level, frm);
1669 		printf("Error: %s\n", status2str(status));
1670 	}
1671 
1672 	raw_dump(level, frm);
1673 }
1674 
generic_response_dump(int level,struct frame * frm)1675 static inline void generic_response_dump(int level, struct frame *frm)
1676 {
1677 	uint8_t status = get_u8(frm);
1678 	uint16_t handle = btohs(htons(get_u16(frm)));
1679 
1680 	p_indent(level, frm);
1681 	printf("status 0x%2.2x handle %d\n", status, handle);
1682 
1683 	if (status > 0) {
1684 		p_indent(level, frm);
1685 		printf("Error: %s\n", status2str(status));
1686 	}
1687 
1688 	raw_dump(level, frm);
1689 }
1690 
status_mode_dump(int level,struct frame * frm)1691 static inline void status_mode_dump(int level, struct frame *frm)
1692 {
1693 	uint8_t status = get_u8(frm);
1694 	uint8_t mode = get_u8(frm);
1695 
1696 	p_indent(level, frm);
1697 	printf("status 0x%2.2x mode 0x%2.2x\n", status, mode);
1698 
1699 	if (status > 0) {
1700 		p_indent(level, frm);
1701 		printf("Error: %s\n", status2str(status));
1702 	}
1703 }
1704 
read_link_policy_dump(int level,struct frame * frm)1705 static inline void read_link_policy_dump(int level, struct frame *frm)
1706 {
1707 	read_link_policy_rp *rp = frm->ptr;
1708 	uint16_t policy = btohs(rp->policy);
1709 	char *str;
1710 
1711 	p_indent(level, frm);
1712 	printf("status 0x%2.2x handle %d policy 0x%2.2x\n",
1713 				rp->status, btohs(rp->handle), policy);
1714 
1715 	if (rp->status > 0) {
1716 		p_indent(level, frm);
1717 		printf("Error: %s\n", status2str(rp->status));
1718 	} else {
1719 		str = hci_lptostr(policy);
1720 		if (str) {
1721 			p_indent(level, frm);
1722 			printf("Link policy: %s\n", str);
1723 			free(str);
1724 		}
1725 	}
1726 }
1727 
read_default_link_policy_dump(int level,struct frame * frm)1728 static inline void read_default_link_policy_dump(int level, struct frame *frm)
1729 {
1730 	uint8_t status = get_u8(frm);
1731 	uint16_t policy = btohs(htons(get_u16(frm)));
1732 	char *str;
1733 
1734 	p_indent(level, frm);
1735 	printf("status 0x%2.2x policy 0x%2.2x\n", status, policy);
1736 
1737 	if (status > 0) {
1738 		p_indent(level, frm);
1739 		printf("Error: %s\n", status2str(status));
1740 	} else {
1741 		str = hci_lptostr(policy);
1742 		if (str) {
1743 			p_indent(level, frm);
1744 			printf("Link policy: %s\n", str);
1745 			free(str);
1746 		}
1747 	}
1748 }
1749 
read_pin_type_dump(int level,struct frame * frm)1750 static inline void read_pin_type_dump(int level, struct frame *frm)
1751 {
1752 	read_pin_type_rp *rp = frm->ptr;
1753 
1754 	p_indent(level, frm);
1755 	printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type);
1756 
1757 	if (rp->status > 0) {
1758 		p_indent(level, frm);
1759 		printf("Error: %s\n", status2str(rp->status));
1760 	}
1761 }
1762 
read_stored_link_key_dump(int level,struct frame * frm)1763 static inline void read_stored_link_key_dump(int level, struct frame *frm)
1764 {
1765 	read_stored_link_key_rp *rp = frm->ptr;
1766 
1767 	p_indent(level, frm);
1768 	printf("status 0x%2.2x max %d num %d\n",
1769 				rp->status, rp->max_keys, rp->num_keys);
1770 
1771 	if (rp->status > 0) {
1772 		p_indent(level, frm);
1773 		printf("Error: %s\n", status2str(rp->status));
1774 	}
1775 }
1776 
write_stored_link_key_dump(int level,struct frame * frm)1777 static inline void write_stored_link_key_dump(int level, struct frame *frm)
1778 {
1779 	write_stored_link_key_rp *rp = frm->ptr;
1780 
1781 	p_indent(level, frm);
1782 	printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys);
1783 
1784 	if (rp->status > 0) {
1785 		p_indent(level, frm);
1786 		printf("Error: %s\n", status2str(rp->status));
1787 	}
1788 }
1789 
delete_stored_link_key_dump(int level,struct frame * frm)1790 static inline void delete_stored_link_key_dump(int level, struct frame *frm)
1791 {
1792 	delete_stored_link_key_rp *rp = frm->ptr;
1793 
1794 	p_indent(level, frm);
1795 	printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys));
1796 
1797 	if (rp->status > 0) {
1798 		p_indent(level, frm);
1799 		printf("Error: %s\n", status2str(rp->status));
1800 	}
1801 }
1802 
read_local_name_dump(int level,struct frame * frm)1803 static inline void read_local_name_dump(int level, struct frame *frm)
1804 {
1805 	read_local_name_rp *rp = frm->ptr;
1806 	char name[249];
1807 	int i;
1808 
1809 	memset(name, 0, sizeof(name));
1810 	for (i = 0; i < 248 && rp->name[i]; i++)
1811 		if (isprint(rp->name[i]))
1812 			name[i] = rp->name[i];
1813 		else
1814 			name[i] = '.';
1815 
1816 	p_indent(level, frm);
1817 	printf("status 0x%2.2x name \'%s\'\n", rp->status, name);
1818 
1819 	if (rp->status > 0) {
1820 		p_indent(level, frm);
1821 		printf("Error: %s\n", status2str(rp->status));
1822 	}
1823 }
1824 
read_class_of_dev_dump(int level,struct frame * frm)1825 static inline void read_class_of_dev_dump(int level, struct frame *frm)
1826 {
1827 	read_class_of_dev_rp *rp = frm->ptr;
1828 
1829 	p_indent(level, frm);
1830 	printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
1831 			rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
1832 
1833 	if (rp->status > 0) {
1834 		p_indent(level, frm);
1835 		printf("Error: %s\n", status2str(rp->status));
1836 	}
1837 }
1838 
read_voice_setting_dump(int level,struct frame * frm)1839 static inline void read_voice_setting_dump(int level, struct frame *frm)
1840 {
1841 	read_voice_setting_rp *rp = frm->ptr;
1842 
1843 	p_indent(level, frm);
1844 	printf("status 0x%2.2x voice setting 0x%4.4x\n",
1845 					rp->status, btohs(rp->voice_setting));
1846 
1847 	if (rp->status > 0) {
1848 		p_indent(level, frm);
1849 		printf("Error: %s\n", status2str(rp->status));
1850 	}
1851 }
1852 
read_current_iac_lap_dump(int level,struct frame * frm)1853 static inline void read_current_iac_lap_dump(int level, struct frame *frm)
1854 {
1855 	read_current_iac_lap_rp *rp = frm->ptr;
1856 	int i;
1857 
1858 	for (i = 0; i < rp->num_current_iac; i++) {
1859 		p_indent(level, frm);
1860 		printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]);
1861 		if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) {
1862 			switch (rp->lap[i][0]) {
1863 			case 0x00:
1864 				printf(" (Limited Inquiry Access Code)");
1865 				break;
1866 			case 0x33:
1867 				printf(" (General Inquiry Access Code)");
1868 				break;
1869 			}
1870 		}
1871 		printf("\n");
1872 	}
1873 }
1874 
read_scan_enable_dump(int level,struct frame * frm)1875 static inline void read_scan_enable_dump(int level, struct frame *frm)
1876 {
1877 	uint8_t status = get_u8(frm);
1878 	uint8_t enable = get_u8(frm);
1879 
1880 	p_indent(level, frm);
1881 	printf("status 0x%2.2x enable %d\n", status, enable);
1882 
1883 	if (status > 0) {
1884 		p_indent(level, frm);
1885 		printf("Error: %s\n", status2str(status));
1886 	}
1887 }
1888 
read_page_timeout_dump(int level,struct frame * frm)1889 static inline void read_page_timeout_dump(int level, struct frame *frm)
1890 {
1891 	read_page_timeout_rp *rp = frm->ptr;
1892 
1893 	p_indent(level, frm);
1894 	printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout));
1895 
1896 	if (rp->status > 0) {
1897 		p_indent(level, frm);
1898 		printf("Error: %s\n", status2str(rp->status));
1899 	}
1900 }
1901 
read_page_activity_dump(int level,struct frame * frm)1902 static inline void read_page_activity_dump(int level, struct frame *frm)
1903 {
1904 	read_page_activity_rp *rp = frm->ptr;
1905 
1906 	p_indent(level, frm);
1907 	printf("status 0x%2.2x interval %d window %d\n",
1908 			rp->status, btohs(rp->interval), btohs(rp->window));
1909 
1910 	if (rp->status > 0) {
1911 		p_indent(level, frm);
1912 		printf("Error: %s\n", status2str(rp->status));
1913 	}
1914 }
1915 
read_inquiry_scan_type_dump(int level,struct frame * frm)1916 static inline void read_inquiry_scan_type_dump(int level, struct frame *frm)
1917 {
1918 	read_inquiry_scan_type_rp *rp = frm->ptr;
1919 
1920 	p_indent(level, frm);
1921 	printf("status 0x%2.2x type %d\n", rp->status, rp->type);
1922 
1923 	if (rp->status > 0) {
1924 		p_indent(level, frm);
1925 		printf("Error: %s\n", status2str(rp->status));
1926 	}
1927 }
1928 
read_inquiry_mode_dump(int level,struct frame * frm)1929 static inline void read_inquiry_mode_dump(int level, struct frame *frm)
1930 {
1931 	read_inquiry_mode_rp *rp = frm->ptr;
1932 
1933 	p_indent(level, frm);
1934 	printf("status 0x%2.2x mode %d\n", rp->status, rp->mode);
1935 
1936 	if (rp->status > 0) {
1937 		p_indent(level, frm);
1938 		printf("Error: %s\n", status2str(rp->status));
1939 	}
1940 }
1941 
read_link_supervision_timeout_dump(int level,struct frame * frm)1942 static inline void read_link_supervision_timeout_dump(int level, struct frame *frm)
1943 {
1944 	read_link_supervision_timeout_rp *rp = frm->ptr;
1945 
1946 	p_indent(level, frm);
1947 	printf("status 0x%2.2x handle %d timeout %d\n",
1948 			rp->status, btohs(rp->handle), btohs(rp->timeout));
1949 
1950 	if (rp->status > 0) {
1951 		p_indent(level, frm);
1952 		printf("Error: %s\n", status2str(rp->status));
1953 	}
1954 }
1955 
read_transmit_power_level_dump(int level,struct frame * frm)1956 static inline void read_transmit_power_level_dump(int level, struct frame *frm)
1957 {
1958 	read_transmit_power_level_rp *rp = frm->ptr;
1959 
1960 	p_indent(level, frm);
1961 	printf("status 0x%2.2x handle %d level %d\n",
1962 				rp->status, btohs(rp->handle), rp->level);
1963 
1964 	if (rp->status > 0) {
1965 		p_indent(level, frm);
1966 		printf("Error: %s\n", status2str(rp->status));
1967 	}
1968 }
1969 
read_ext_inquiry_response_dump(int level,struct frame * frm)1970 static inline void read_ext_inquiry_response_dump(int level, struct frame *frm)
1971 {
1972 	read_ext_inquiry_response_rp *rp = frm->ptr;
1973 
1974 	p_indent(level, frm);
1975 	printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec);
1976 
1977 	if (rp->status > 0) {
1978 		p_indent(level, frm);
1979 		printf("Error: %s\n", status2str(rp->status));
1980 	} else {
1981 		frm->ptr += 2;
1982 		frm->len -= 2;
1983 
1984 		ext_inquiry_response_dump(level, frm);
1985 	}
1986 }
1987 
read_inquiry_transmit_power_level_dump(int level,struct frame * frm)1988 static inline void read_inquiry_transmit_power_level_dump(int level, struct frame *frm)
1989 {
1990 	read_inquiry_transmit_power_level_rp *rp = frm->ptr;
1991 
1992 	p_indent(level, frm);
1993 	printf("status 0x%2.2x level %d\n", rp->status, rp->level);
1994 
1995 	if (rp->status > 0) {
1996 		p_indent(level, frm);
1997 		printf("Error: %s\n", status2str(rp->status));
1998 	}
1999 }
2000 
read_default_error_data_reporting_dump(int level,struct frame * frm)2001 static inline void read_default_error_data_reporting_dump(int level, struct frame *frm)
2002 {
2003 	read_default_error_data_reporting_rp *rp = frm->ptr;
2004 
2005 	p_indent(level, frm);
2006 	printf("status 0x%2.2x reporting %d\n", rp->status, rp->reporting);
2007 
2008 	if (rp->status > 0) {
2009 		p_indent(level, frm);
2010 		printf("Error: %s\n", status2str(rp->status));
2011 	}
2012 }
2013 
read_local_oob_data_dump(int level,struct frame * frm)2014 static inline void read_local_oob_data_dump(int level, struct frame *frm)
2015 {
2016 	read_local_oob_data_rp *rp = frm->ptr;
2017 	int i;
2018 
2019 	p_indent(level, frm);
2020 	printf("status 0x%2.2x\n", rp->status);
2021 
2022 	if (rp->status > 0) {
2023 		p_indent(level, frm);
2024 		printf("Error: %s\n", status2str(rp->status));
2025 	} else {
2026 		p_indent(level, frm);
2027 		printf("hash 0x");
2028 		for (i = 0; i < 16; i++)
2029 			printf("%02x", rp->hash[i]);
2030 		printf("\n");
2031 
2032 		p_indent(level, frm);
2033 		printf("randomizer 0x");
2034 		for (i = 0; i < 16; i++)
2035 			printf("%02x", rp->randomizer[i]);
2036 		printf("\n");
2037 	}
2038 }
2039 
read_local_version_dump(int level,struct frame * frm)2040 static inline void read_local_version_dump(int level, struct frame *frm)
2041 {
2042 	read_local_version_rp *rp = frm->ptr;
2043 	uint16_t manufacturer = btohs(rp->manufacturer);
2044 
2045 	p_indent(level, frm);
2046 	printf("status 0x%2.2x\n", rp->status);
2047 
2048 	if (rp->status > 0) {
2049 		p_indent(level, frm);
2050 		printf("Error: %s\n", status2str(rp->status));
2051 	} else {
2052 		p_indent(level, frm);
2053 		printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
2054 					hci_vertostr(rp->hci_ver),
2055 					rp->hci_ver, btohs(rp->hci_rev));
2056 		p_indent(level, frm);
2057 		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
2058 					lmp_vertostr(rp->lmp_ver),
2059 					rp->lmp_ver, btohs(rp->lmp_subver));
2060 		p_indent(level, frm);
2061 		printf("Manufacturer: %s (%d)\n",
2062 				bt_compidtostr(manufacturer), manufacturer);
2063 	}
2064 }
2065 
read_local_commands_dump(int level,struct frame * frm)2066 static inline void read_local_commands_dump(int level, struct frame *frm)
2067 {
2068 	read_local_commands_rp *rp = frm->ptr;
2069 	int i, max = 0;
2070 
2071 	p_indent(level, frm);
2072 	printf("status 0x%2.2x\n", rp->status);
2073 
2074 	if (rp->status > 0) {
2075 		p_indent(level, frm);
2076 		printf("Error: %s\n", status2str(rp->status));
2077 	} else {
2078 		for (i = 0; i < 64; i++)
2079 			if (rp->commands[i])
2080 				max = i + 1;
2081 		p_indent(level, frm);
2082 		printf("Commands: ");
2083 		for (i = 0; i < (max > 32 ? 32 : max); i++)
2084 			printf("%2.2x", rp->commands[i]);
2085 		printf("\n");
2086 		if (max > 32) {
2087 			p_indent(level, frm);
2088 			printf("          ");
2089 			for (i = 32; i < max; i++)
2090 				printf("%2.2x", rp->commands[i]);
2091 			printf("\n");
2092 		}
2093 	}
2094 }
2095 
read_local_features_dump(int level,struct frame * frm)2096 static inline void read_local_features_dump(int level, struct frame *frm)
2097 {
2098 	read_local_features_rp *rp = frm->ptr;
2099 	int i;
2100 
2101 	p_indent(level, frm);
2102 	printf("status 0x%2.2x\n", rp->status);
2103 
2104 	if (rp->status > 0) {
2105 		p_indent(level, frm);
2106 		printf("Error: %s\n", status2str(rp->status));
2107 	} else {
2108 		p_indent(level, frm);
2109 		printf("Features:");
2110 		for (i = 0; i < 8; i++)
2111 			printf(" 0x%2.2x", rp->features[i]);
2112 		printf("\n");
2113 	}
2114 }
2115 
read_local_ext_features_dump(int level,struct frame * frm)2116 static inline void read_local_ext_features_dump(int level, struct frame *frm)
2117 {
2118 	read_local_ext_features_rp *rp = frm->ptr;
2119 	int i;
2120 
2121 	p_indent(level, frm);
2122 	printf("status 0x%2.2x page %d max %d\n",
2123 		rp->status, rp->page_num, rp->max_page_num);
2124 
2125 	if (rp->status > 0) {
2126 		p_indent(level, frm);
2127 		printf("Error: %s\n", status2str(rp->status));
2128 	} else {
2129 		p_indent(level, frm);
2130 		printf("Features:");
2131 		for (i = 0; i < 8; i++)
2132 			 printf(" 0x%2.2x", rp->features[i]);
2133 		printf("\n");
2134 	}
2135 }
2136 
read_buffer_size_dump(int level,struct frame * frm)2137 static inline void read_buffer_size_dump(int level, struct frame *frm)
2138 {
2139 	read_buffer_size_rp *rp = frm->ptr;
2140 
2141 	p_indent(level, frm);
2142 	printf("status 0x%2.2x\n", rp->status);
2143 
2144 	if (rp->status > 0) {
2145 		p_indent(level, frm);
2146 		printf("Error: %s\n", status2str(rp->status));
2147 	} else {
2148 		p_indent(level, frm);
2149 		printf("ACL MTU %d:%d SCO MTU %d:%d\n",
2150 				btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
2151 				rp->sco_mtu, btohs(rp->sco_max_pkt));
2152 	}
2153 }
2154 
read_link_quality_dump(int level,struct frame * frm)2155 static inline void read_link_quality_dump(int level, struct frame *frm)
2156 {
2157 	read_link_quality_rp *rp = frm->ptr;
2158 
2159 	p_indent(level, frm);
2160 	printf("status 0x%2.2x handle %d lq %d\n",
2161 			rp->status, btohs(rp->handle), rp->link_quality);
2162 
2163 	if (rp->status > 0) {
2164 		p_indent(level, frm);
2165 		printf("Error: %s\n", status2str(rp->status));
2166 	}
2167 }
2168 
read_rssi_dump(int level,struct frame * frm)2169 static inline void read_rssi_dump(int level, struct frame *frm)
2170 {
2171 	read_rssi_rp *rp = frm->ptr;
2172 
2173 	p_indent(level, frm);
2174 	printf("status 0x%2.2x handle %d rssi %d\n",
2175 				rp->status, btohs(rp->handle), rp->rssi);
2176 
2177 	if (rp->status > 0) {
2178 		p_indent(level, frm);
2179 		printf("Error: %s\n", status2str(rp->status));
2180 	}
2181 }
2182 
read_afh_map_dump(int level,struct frame * frm)2183 static inline void read_afh_map_dump(int level, struct frame *frm)
2184 {
2185 	read_afh_map_rp *rp = frm->ptr;
2186 	int i;
2187 
2188 	p_indent(level, frm);
2189 	printf("status 0x%2.2x handle %d mode %d\n",
2190 				rp->status, btohs(rp->handle), rp->mode);
2191 
2192 	if (rp->status > 0) {
2193 		p_indent(level, frm);
2194 		printf("Error: %s\n", status2str(rp->status));
2195 	} else {
2196 		p_indent(level, frm);
2197 		printf("AFH map: 0x");
2198 		for (i = 0; i < 10; i++)
2199 			printf("%2.2x", rp->map[i]);
2200 		printf("\n");
2201 	}
2202 }
2203 
read_clock_dump(int level,struct frame * frm)2204 static inline void read_clock_dump(int level, struct frame *frm)
2205 {
2206 	read_clock_rp *rp = frm->ptr;
2207 
2208 	p_indent(level, frm);
2209 	printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n",
2210 					rp->status, btohs(rp->handle),
2211 					btohl(rp->clock), btohs(rp->accuracy));
2212 
2213 	if (rp->status > 0) {
2214 		p_indent(level, frm);
2215 		printf("Error: %s\n", status2str(rp->status));
2216 	}
2217 }
2218 
cmd_complete_dump(int level,struct frame * frm)2219 static inline void cmd_complete_dump(int level, struct frame *frm)
2220 {
2221 	evt_cmd_complete *evt = frm->ptr;
2222 	uint16_t opcode = btohs(evt->opcode);
2223 	uint16_t ogf = cmd_opcode_ogf(opcode);
2224 	uint16_t ocf = cmd_opcode_ocf(opcode);
2225 
2226 	if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
2227 		return;
2228 
2229 	p_indent(level, frm);
2230 	printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
2231 				opcode2str(opcode), ogf, ocf, evt->ncmd);
2232 
2233 	frm->ptr += EVT_CMD_COMPLETE_SIZE;
2234 	frm->len -= EVT_CMD_COMPLETE_SIZE;
2235 
2236 	if (!(parser.flags & DUMP_VERBOSE)) {
2237 		raw_dump(level, frm);
2238 		return;
2239 	}
2240 
2241 	switch (ogf) {
2242 	case OGF_LINK_CTL:
2243 		switch (ocf) {
2244 		case OCF_INQUIRY_CANCEL:
2245 		case OCF_PERIODIC_INQUIRY:
2246 		case OCF_EXIT_PERIODIC_INQUIRY:
2247 		case OCF_READ_REMOTE_EXT_FEATURES:
2248 			status_response_dump(level, frm);
2249 			return;
2250 		case OCF_CREATE_CONN_CANCEL:
2251 		case OCF_REMOTE_NAME_REQ_CANCEL:
2252 		case OCF_PIN_CODE_REPLY:
2253 		case OCF_LINK_KEY_REPLY:
2254 		case OCF_PIN_CODE_NEG_REPLY:
2255 		case OCF_LINK_KEY_NEG_REPLY:
2256 		case OCF_USER_CONFIRM_REPLY:
2257 		case OCF_USER_CONFIRM_NEG_REPLY:
2258 		case OCF_USER_PASSKEY_REPLY:
2259 		case OCF_USER_PASSKEY_NEG_REPLY:
2260 		case OCF_REMOTE_OOB_DATA_REPLY:
2261 		case OCF_REMOTE_OOB_DATA_NEG_REPLY:
2262 		case OCF_IO_CAPABILITY_REPLY:
2263 		case OCF_IO_CAPABILITY_NEG_REPLY:
2264 			bdaddr_response_dump(level, frm);
2265 			return;
2266 		}
2267 		break;
2268 
2269 	case OGF_LINK_POLICY:
2270 		switch (ocf) {
2271 		case OCF_READ_LINK_POLICY:
2272 			read_link_policy_dump(level, frm);
2273 			return;
2274 		case OCF_WRITE_LINK_POLICY:
2275 		case OCF_SNIFF_SUBRATING:
2276 			generic_response_dump(level, frm);
2277 			return;
2278 		case OCF_READ_DEFAULT_LINK_POLICY:
2279 			read_default_link_policy_dump(level, frm);
2280 			return;
2281 		case OCF_WRITE_DEFAULT_LINK_POLICY:
2282 			status_response_dump(level, frm);
2283 			return;
2284 		}
2285 		break;
2286 
2287 	case OGF_HOST_CTL:
2288 		switch (ocf) {
2289 		case OCF_READ_PIN_TYPE:
2290 			read_pin_type_dump(level, frm);
2291 			return;
2292 		case OCF_READ_STORED_LINK_KEY:
2293 			read_stored_link_key_dump(level, frm);
2294 			return;
2295 		case OCF_WRITE_STORED_LINK_KEY:
2296 			write_stored_link_key_dump(level, frm);
2297 			return;
2298 		case OCF_DELETE_STORED_LINK_KEY:
2299 			delete_stored_link_key_dump(level, frm);
2300 			return;
2301 		case OCF_READ_LOCAL_NAME:
2302 			read_local_name_dump(level, frm);
2303 			return;
2304 		case OCF_READ_CLASS_OF_DEV:
2305 			read_class_of_dev_dump(level, frm);
2306 			return;
2307 		case OCF_READ_VOICE_SETTING:
2308 			read_voice_setting_dump(level, frm);
2309 			return;
2310 		case OCF_READ_CURRENT_IAC_LAP:
2311 			read_current_iac_lap_dump(level, frm);
2312 			return;
2313 		case OCF_READ_SCAN_ENABLE:
2314 		case OCF_READ_AUTH_ENABLE:
2315 			read_scan_enable_dump(level, frm);
2316 			return;
2317 		case OCF_READ_CONN_ACCEPT_TIMEOUT:
2318 		case OCF_READ_PAGE_TIMEOUT:
2319 			read_page_timeout_dump(level, frm);
2320 			return;
2321 		case OCF_READ_PAGE_ACTIVITY:
2322 		case OCF_READ_INQ_ACTIVITY:
2323 			read_page_activity_dump(level, frm);
2324 			return;
2325 		case OCF_READ_INQUIRY_SCAN_TYPE:
2326 			read_inquiry_scan_type_dump(level, frm);
2327 			return;
2328 		case OCF_READ_ENCRYPT_MODE:
2329 		case OCF_READ_INQUIRY_MODE:
2330 		case OCF_READ_AFH_MODE:
2331 			read_inquiry_mode_dump(level, frm);
2332 			return;
2333 		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
2334 			read_link_supervision_timeout_dump(level, frm);
2335 			return;
2336 		case OCF_READ_TRANSMIT_POWER_LEVEL:
2337 			read_transmit_power_level_dump(level, frm);
2338 			return;
2339 		case OCF_READ_EXT_INQUIRY_RESPONSE:
2340 			read_ext_inquiry_response_dump(level, frm);
2341 			return;
2342 		case OCF_READ_INQUIRY_TRANSMIT_POWER_LEVEL:
2343 			read_inquiry_transmit_power_level_dump(level, frm);
2344 			return;
2345 		case OCF_READ_DEFAULT_ERROR_DATA_REPORTING:
2346 			read_default_error_data_reporting_dump(level, frm);
2347 			return;
2348 		case OCF_READ_LOCAL_OOB_DATA:
2349 			read_local_oob_data_dump(level, frm);
2350 			return;
2351 		case OCF_READ_SIMPLE_PAIRING_MODE:
2352 			status_mode_dump(level, frm);
2353 			return;
2354 		case OCF_FLUSH:
2355 		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
2356 			generic_response_dump(level, frm);
2357 			return;
2358 		case OCF_RESET:
2359 		case OCF_SET_EVENT_MASK:
2360 		case OCF_SET_EVENT_FLT:
2361 		case OCF_WRITE_PIN_TYPE:
2362 		case OCF_CREATE_NEW_UNIT_KEY:
2363 		case OCF_CHANGE_LOCAL_NAME:
2364 		case OCF_WRITE_CLASS_OF_DEV:
2365 		case OCF_WRITE_VOICE_SETTING:
2366 		case OCF_WRITE_CURRENT_IAC_LAP:
2367 		case OCF_WRITE_SCAN_ENABLE:
2368 		case OCF_WRITE_AUTH_ENABLE:
2369 		case OCF_WRITE_ENCRYPT_MODE:
2370 		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
2371 		case OCF_WRITE_PAGE_TIMEOUT:
2372 		case OCF_WRITE_PAGE_ACTIVITY:
2373 		case OCF_WRITE_INQ_ACTIVITY:
2374 		case OCF_WRITE_INQUIRY_SCAN_TYPE:
2375 		case OCF_WRITE_INQUIRY_MODE:
2376 		case OCF_WRITE_AFH_MODE:
2377 		case OCF_SET_AFH_CLASSIFICATION:
2378 		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
2379 		case OCF_WRITE_SIMPLE_PAIRING_MODE:
2380 		case OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL:
2381 		case OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING:
2382 		case OCF_SET_CONTROLLER_TO_HOST_FC:
2383 		case OCF_HOST_BUFFER_SIZE:
2384 		case OCF_REFRESH_ENCRYPTION_KEY:
2385 		case OCF_SEND_KEYPRESS_NOTIFY:
2386 			status_response_dump(level, frm);
2387 			return;
2388 		}
2389 		break;
2390 
2391 	case OGF_INFO_PARAM:
2392 		switch (ocf) {
2393 		case OCF_READ_LOCAL_VERSION:
2394 			read_local_version_dump(level, frm);
2395 			return;
2396 		case OCF_READ_LOCAL_COMMANDS:
2397 			read_local_commands_dump(level, frm);
2398 			return;
2399 		case OCF_READ_LOCAL_FEATURES:
2400 			read_local_features_dump(level, frm);
2401 			return;
2402 		case OCF_READ_LOCAL_EXT_FEATURES:
2403 			read_local_ext_features_dump(level, frm);
2404 			return;
2405 		case OCF_READ_BUFFER_SIZE:
2406 			read_buffer_size_dump(level, frm);
2407 			return;
2408 		case OCF_READ_BD_ADDR:
2409 			bdaddr_response_dump(level, frm);
2410 			return;
2411 		}
2412 		break;
2413 
2414 	case OGF_STATUS_PARAM:
2415 		switch (ocf) {
2416 		case OCF_READ_FAILED_CONTACT_COUNTER:
2417 		case OCF_RESET_FAILED_CONTACT_COUNTER:
2418 			status_response_dump(level, frm);
2419 			return;
2420 		case OCF_READ_LINK_QUALITY:
2421 			read_link_quality_dump(level, frm);
2422 			return;
2423 		case OCF_READ_RSSI:
2424 			read_rssi_dump(level, frm);
2425 			return;
2426 		case OCF_READ_AFH_MAP:
2427 			read_afh_map_dump(level, frm);
2428 			return;
2429 		case OCF_READ_CLOCK:
2430 			read_clock_dump(level, frm);
2431 			return;
2432 		}
2433 		break;
2434 
2435 	case OGF_TESTING_CMD:
2436 		switch (ocf) {
2437 		case OCF_READ_LOOPBACK_MODE:
2438 			status_mode_dump(level, frm);
2439 			return;
2440 		case OCF_WRITE_LOOPBACK_MODE:
2441 		case OCF_ENABLE_DEVICE_UNDER_TEST_MODE:
2442 		case OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE:
2443 			status_response_dump(level, frm);
2444 			return;
2445 		}
2446 		break;
2447 	}
2448 
2449 	raw_dump(level, frm);
2450 }
2451 
cmd_status_dump(int level,struct frame * frm)2452 static inline void cmd_status_dump(int level, struct frame *frm)
2453 {
2454 	evt_cmd_status *evt = frm->ptr;
2455 	uint16_t opcode = btohs(evt->opcode);
2456 	uint16_t ogf = cmd_opcode_ogf(opcode);
2457 	uint16_t ocf = cmd_opcode_ocf(opcode);
2458 
2459 	if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
2460 		return;
2461 
2462 	p_indent(level, frm);
2463 	printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
2464 			opcode2str(opcode), ogf, ocf, evt->status, evt->ncmd);
2465 
2466 	if (evt->status > 0) {
2467 		p_indent(level, frm);
2468 		printf("Error: %s\n", status2str(evt->status));
2469 	}
2470 }
2471 
hardware_error_dump(int level,struct frame * frm)2472 static inline void hardware_error_dump(int level, struct frame *frm)
2473 {
2474 	evt_hardware_error *evt = frm->ptr;
2475 
2476 	p_indent(level, frm);
2477 	printf("code %d\n", evt->code);
2478 }
2479 
inq_result_dump(int level,struct frame * frm)2480 static inline void inq_result_dump(int level, struct frame *frm)
2481 {
2482 	uint8_t num = get_u8(frm);
2483 	char addr[18];
2484 	int i;
2485 
2486 	for (i = 0; i < num; i++) {
2487 		inquiry_info *info = frm->ptr;
2488 
2489 		p_ba2str(&info->bdaddr, addr);
2490 
2491 		p_indent(level, frm);
2492 		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n",
2493 			addr, info->pscan_rep_mode, btohs(info->clock_offset),
2494 			info->dev_class[2], info->dev_class[1], info->dev_class[0]);
2495 
2496 		frm->ptr += INQUIRY_INFO_SIZE;
2497 		frm->len -= INQUIRY_INFO_SIZE;
2498 	}
2499 }
2500 
conn_complete_dump(int level,struct frame * frm)2501 static inline void conn_complete_dump(int level, struct frame *frm)
2502 {
2503 	evt_conn_complete *evt = frm->ptr;
2504 	char addr[18];
2505 
2506 	p_ba2str(&evt->bdaddr, addr);
2507 
2508 	p_indent(level, frm);
2509 	printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
2510 			evt->status, btohs(evt->handle), addr,
2511 			linktype2str(evt->link_type), evt->encr_mode);
2512 
2513 	if (evt->status > 0) {
2514 		p_indent(level, frm);
2515 		printf("Error: %s\n", status2str(evt->status));
2516 	}
2517 }
2518 
conn_request_dump(int level,struct frame * frm)2519 static inline void conn_request_dump(int level, struct frame *frm)
2520 {
2521 	evt_conn_request *evt = frm->ptr;
2522 	char addr[18];
2523 
2524 	p_ba2str(&evt->bdaddr, addr);
2525 
2526 	p_indent(level, frm);
2527 	printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
2528 			addr, evt->dev_class[2], evt->dev_class[1],
2529 			evt->dev_class[0], linktype2str(evt->link_type));
2530 }
2531 
disconn_complete_dump(int level,struct frame * frm)2532 static inline void disconn_complete_dump(int level, struct frame *frm)
2533 {
2534 	evt_disconn_complete *evt = frm->ptr;
2535 
2536 	p_indent(level, frm);
2537 	printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
2538 				evt->status, btohs(evt->handle), evt->reason);
2539 
2540 	if (evt->status > 0) {
2541 		p_indent(level, frm);
2542 		printf("Error: %s\n", status2str(evt->status));
2543 	} else if (evt->reason > 0) {
2544 		p_indent(level, frm);
2545 		printf("Reason: %s\n", status2str(evt->reason));
2546 	}
2547 }
2548 
remote_name_req_complete_dump(int level,struct frame * frm)2549 static inline void remote_name_req_complete_dump(int level, struct frame *frm)
2550 {
2551 	evt_remote_name_req_complete *evt = frm->ptr;
2552 	char addr[18], name[249];
2553 	int i;
2554 
2555 	p_ba2str(&evt->bdaddr, addr);
2556 
2557 	memset(name, 0, sizeof(name));
2558 	for (i = 0; i < 248 && evt->name[i]; i++)
2559 		if (isprint(evt->name[i]))
2560 			name[i] = evt->name[i];
2561 		else
2562 			name[i] = '.';
2563 
2564 	p_indent(level, frm);
2565 	printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name);
2566 
2567 	if (evt->status > 0) {
2568 		p_indent(level, frm);
2569 		printf("Error: %s\n", status2str(evt->status));
2570 	}
2571 }
2572 
master_link_key_complete_dump(int level,struct frame * frm)2573 static inline void master_link_key_complete_dump(int level, struct frame *frm)
2574 {
2575 	evt_master_link_key_complete *evt = frm->ptr;
2576 
2577 	p_indent(level, frm);
2578 	printf("status 0x%2.2x handle %d flag %d\n",
2579 				evt->status, btohs(evt->handle), evt->key_flag);
2580 
2581 	if (evt->status > 0) {
2582 		p_indent(level, frm);
2583 		printf("Error: %s\n", status2str(evt->status));
2584 	}
2585 }
2586 
encrypt_change_dump(int level,struct frame * frm)2587 static inline void encrypt_change_dump(int level, struct frame *frm)
2588 {
2589 	evt_encrypt_change *evt = frm->ptr;
2590 
2591 	p_indent(level, frm);
2592 	printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
2593 				evt->status, btohs(evt->handle), evt->encrypt);
2594 
2595 	if (evt->status > 0) {
2596 		p_indent(level, frm);
2597 		printf("Error: %s\n", status2str(evt->status));
2598 	}
2599 }
2600 
read_remote_features_complete_dump(int level,struct frame * frm)2601 static inline void read_remote_features_complete_dump(int level, struct frame *frm)
2602 {
2603 	evt_read_remote_features_complete *evt = frm->ptr;
2604 	int i;
2605 
2606 	p_indent(level, frm);
2607 	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2608 
2609 	if (evt->status > 0) {
2610 		p_indent(level, frm);
2611 		printf("Error: %s\n", status2str(evt->status));
2612 	} else {
2613 		p_indent(level, frm);
2614 		printf("Features:");
2615 		for (i = 0; i < 8; i++)
2616 			printf(" 0x%2.2x", evt->features[i]);
2617 		printf("\n");
2618 	}
2619 }
2620 
read_remote_version_complete_dump(int level,struct frame * frm)2621 static inline void read_remote_version_complete_dump(int level, struct frame *frm)
2622 {
2623 	evt_read_remote_version_complete *evt = frm->ptr;
2624 	uint16_t manufacturer = btohs(evt->manufacturer);
2625 
2626 	p_indent(level, frm);
2627 	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2628 
2629 	if (evt->status > 0) {
2630 		p_indent(level, frm);
2631 		printf("Error: %s\n", status2str(evt->status));
2632 	} else {
2633 		p_indent(level, frm);
2634 		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
2635 			lmp_vertostr(evt->lmp_ver), evt->lmp_ver,
2636 			btohs(evt->lmp_subver));
2637 		p_indent(level, frm);
2638 		printf("Manufacturer: %s (%d)\n",
2639 			bt_compidtostr(manufacturer), manufacturer);
2640 	}
2641 }
2642 
qos_setup_complete_dump(int level,struct frame * frm)2643 static inline void qos_setup_complete_dump(int level, struct frame *frm)
2644 {
2645 	evt_qos_setup_complete *evt = frm->ptr;
2646 
2647 	p_indent(level, frm);
2648 	printf("status 0x%2.2x handle %d flags %d\n",
2649 				evt->status, btohs(evt->handle), evt->flags);
2650 
2651 	if (evt->status > 0) {
2652 		p_indent(level, frm);
2653 		printf("Error: %s\n", status2str(evt->status));
2654 	} else {
2655 		p_indent(level, frm);
2656 		printf("Service type: %d\n", evt->qos.service_type);
2657 		p_indent(level, frm);
2658 		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
2659 		p_indent(level, frm);
2660 		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
2661 		p_indent(level, frm);
2662 		printf("Latency: %d\n", btohl(evt->qos.latency));
2663 		p_indent(level, frm);
2664 		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
2665 	}
2666 }
2667 
role_change_dump(int level,struct frame * frm)2668 static inline void role_change_dump(int level, struct frame *frm)
2669 {
2670 	evt_role_change *evt = frm->ptr;
2671 	char addr[18];
2672 
2673 	p_indent(level, frm);
2674 	p_ba2str(&evt->bdaddr, addr);
2675 	printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
2676 						evt->status, addr, evt->role);
2677 
2678 	if (evt->status > 0) {
2679 		p_indent(level, frm);
2680 		printf("Error: %s\n", status2str(evt->status));
2681 	} else {
2682 		p_indent(level, frm);
2683 		printf("Role: %s\n", role2str(evt->role));
2684 	}
2685 }
2686 
mode_change_dump(int level,struct frame * frm)2687 static inline void mode_change_dump(int level, struct frame *frm)
2688 {
2689 	evt_mode_change *evt = frm->ptr;
2690 
2691 	p_indent(level, frm);
2692 	printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",
2693 		evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));
2694 
2695 	if (evt->status > 0) {
2696 		p_indent(level, frm);
2697 		printf("Error: %s\n", status2str(evt->status));
2698 	} else {
2699 		p_indent(level, frm);
2700 		printf("Mode: %s\n", mode2str(evt->mode));
2701 	}
2702 }
2703 
pin_code_req_dump(int level,struct frame * frm)2704 static inline void pin_code_req_dump(int level, struct frame *frm)
2705 {
2706 	evt_pin_code_req *evt = frm->ptr;
2707 	char addr[18];
2708 
2709 	p_indent(level, frm);
2710 	p_ba2str(&evt->bdaddr, addr);
2711 	printf("bdaddr %s\n", addr);
2712 }
2713 
link_key_notify_dump(int level,struct frame * frm)2714 static inline void link_key_notify_dump(int level, struct frame *frm)
2715 {
2716 	evt_link_key_notify *evt = frm->ptr;
2717 	char addr[18];
2718 	int i;
2719 
2720 	p_indent(level, frm);
2721 	p_ba2str(&evt->bdaddr, addr);
2722 	printf("bdaddr %s key ", addr);
2723 	for (i = 0; i < 16; i++)
2724 		if (parser.flags & DUMP_NOVENDOR)
2725 			printf("**");
2726 		else
2727 			printf("%2.2X", evt->link_key[i]);
2728 	printf(" type %d\n", evt->key_type);
2729 
2730 	p_indent(level, frm);
2731 	printf("Type: %s\n", keytype2str(evt->key_type));
2732 }
2733 
max_slots_change_dump(int level,struct frame * frm)2734 static inline void max_slots_change_dump(int level, struct frame *frm)
2735 {
2736 	evt_max_slots_change *evt = frm->ptr;
2737 
2738 	p_indent(level, frm);
2739 	printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);
2740 }
2741 
data_buffer_overflow_dump(int level,struct frame * frm)2742 static inline void data_buffer_overflow_dump(int level, struct frame *frm)
2743 {
2744 	evt_data_buffer_overflow *evt = frm->ptr;
2745 
2746 	p_indent(level, frm);
2747 	printf("type %s\n", linktype2str(evt->link_type));
2748 }
2749 
read_clock_offset_complete_dump(int level,struct frame * frm)2750 static inline void read_clock_offset_complete_dump(int level, struct frame *frm)
2751 {
2752 	evt_read_clock_offset_complete *evt = frm->ptr;
2753 
2754 	p_indent(level, frm);
2755 	printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",
2756 		evt->status, btohs(evt->handle), btohs(evt->clock_offset));
2757 
2758 	if (evt->status > 0) {
2759 		p_indent(level, frm);
2760 		printf("Error: %s\n", status2str(evt->status));
2761 	}
2762 }
2763 
conn_ptype_changed_dump(int level,struct frame * frm)2764 static inline void conn_ptype_changed_dump(int level, struct frame *frm)
2765 {
2766 	evt_conn_ptype_changed *evt = frm->ptr;
2767 	uint16_t ptype = btohs(evt->ptype);
2768 	char *str;
2769 
2770 	p_indent(level, frm);
2771 	printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
2772 				evt->status, btohs(evt->handle), ptype);
2773 
2774 	if (evt->status > 0) {
2775 		p_indent(level, frm);
2776 		printf("Error: %s\n", status2str(evt->status));
2777 	} else {
2778 		str = hci_ptypetostr(ptype);
2779 		if (str) {
2780 			p_indent(level, frm);
2781 			printf("Packet type: %s\n", str);
2782 			free(str);
2783 		}
2784 	}
2785 }
2786 
pscan_rep_mode_change_dump(int level,struct frame * frm)2787 static inline void pscan_rep_mode_change_dump(int level, struct frame *frm)
2788 {
2789 	evt_pscan_rep_mode_change *evt = frm->ptr;
2790 	char addr[18];
2791 
2792 	p_indent(level, frm);
2793 	p_ba2str(&evt->bdaddr, addr);
2794 	printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);
2795 }
2796 
flow_spec_complete_dump(int level,struct frame * frm)2797 static inline void flow_spec_complete_dump(int level, struct frame *frm)
2798 {
2799 	evt_flow_spec_complete *evt = frm->ptr;
2800 
2801 	p_indent(level, frm);
2802 	printf("status 0x%2.2x handle %d flags %d %s\n",
2803 				evt->status, btohs(evt->handle), evt->flags,
2804 				evt->direction == 0 ? "outgoing" : "incoming");
2805 
2806 	if (evt->status > 0) {
2807 		p_indent(level, frm);
2808 		printf("Error: %s\n", status2str(evt->status));
2809 	} else {
2810 		p_indent(level, frm);
2811 		printf("Service type: %d\n", evt->qos.service_type);
2812 		p_indent(level, frm);
2813 		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
2814 		p_indent(level, frm);
2815 		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
2816 		p_indent(level, frm);
2817 		printf("Latency: %d\n", btohl(evt->qos.latency));
2818 		p_indent(level, frm);
2819 		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
2820 	}
2821 }
2822 
inq_result_with_rssi_dump(int level,struct frame * frm)2823 static inline void inq_result_with_rssi_dump(int level, struct frame *frm)
2824 {
2825 	uint8_t num = get_u8(frm);
2826 	char addr[18];
2827 	int i;
2828 
2829 	if (!num)
2830 		return;
2831 
2832 	if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
2833 		for (i = 0; i < num; i++) {
2834 			inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr;
2835 
2836 			p_indent(level, frm);
2837 
2838 			p_ba2str(&info->bdaddr, addr);
2839 			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2840 				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2841 				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2842 
2843 			frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2844 			frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2845 		}
2846 	} else {
2847 		for (i = 0; i < num; i++) {
2848 			inquiry_info_with_rssi *info = frm->ptr;
2849 
2850 			p_indent(level, frm);
2851 
2852 			p_ba2str(&info->bdaddr, addr);
2853 			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2854 				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2855 				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2856 
2857 			frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
2858 			frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
2859 		}
2860 	}
2861 }
2862 
read_remote_ext_features_complete_dump(int level,struct frame * frm)2863 static inline void read_remote_ext_features_complete_dump(int level, struct frame *frm)
2864 {
2865 	evt_read_remote_ext_features_complete *evt = frm->ptr;
2866 	int i;
2867 
2868 	p_indent(level, frm);
2869 	printf("status 0x%2.2x handle %d page %d max %d\n",
2870 					evt->status, btohs(evt->handle),
2871 					evt->page_num, evt->max_page_num);
2872 
2873 	if (evt->status > 0) {
2874 		p_indent(level, frm);
2875 		printf("Error: %s\n", status2str(evt->status));
2876 	} else {
2877 		p_indent(level, frm);
2878 		printf("Features:");
2879 		for (i = 0; i < 8; i++)
2880 			printf(" 0x%2.2x", evt->features[i]);
2881 		printf("\n");
2882 	}
2883 }
2884 
sync_conn_complete_dump(int level,struct frame * frm)2885 static inline void sync_conn_complete_dump(int level, struct frame *frm)
2886 {
2887 	evt_sync_conn_complete *evt = frm->ptr;
2888 	char addr[18];
2889 
2890 	p_ba2str(&evt->bdaddr, addr);
2891 
2892 	p_indent(level, frm);
2893 	printf("status 0x%2.2x handle %d bdaddr %s type %s\n",
2894 					evt->status, btohs(evt->handle), addr,
2895 					evt->link_type == 0 ? "SCO" : "eSCO");
2896 
2897 	if (evt->status > 0) {
2898 		p_indent(level, frm);
2899 		printf("Error: %s\n", status2str(evt->status));
2900 	} else {
2901 		p_indent(level, frm);
2902 		printf("Air mode: %s\n", airmode2str(evt->air_mode));
2903 	}
2904 }
2905 
sync_conn_changed_dump(int level,struct frame * frm)2906 static inline void sync_conn_changed_dump(int level, struct frame *frm)
2907 {
2908 	evt_sync_conn_changed *evt = frm->ptr;
2909 
2910 	p_indent(level, frm);
2911 	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2912 
2913 	if (evt->status > 0) {
2914 		p_indent(level, frm);
2915 		printf("Error: %s\n", status2str(evt->status));
2916 	}
2917 }
2918 
sniff_subrating_event_dump(int level,struct frame * frm)2919 static inline void sniff_subrating_event_dump(int level, struct frame *frm)
2920 {
2921 	evt_sniff_subrating *evt = frm->ptr;
2922 
2923 	p_indent(level, frm);
2924 	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2925 
2926 	if (evt->status > 0) {
2927 		p_indent(level, frm);
2928 		printf("Error: %s\n", status2str(evt->status));
2929 	} else {
2930 		p_indent(level, frm);
2931 		printf("max latency transmit %d receive %d\n",
2932 					btohs(evt->max_tx_latency),
2933 					btohs(evt->max_rx_latency));
2934 
2935 		p_indent(level, frm);
2936 		printf("min timeout remote %d local %d\n",
2937 					btohs(evt->min_remote_timeout),
2938 					btohs(evt->min_local_timeout));
2939 	}
2940 }
2941 
extended_inq_result_dump(int level,struct frame * frm)2942 static inline void extended_inq_result_dump(int level, struct frame *frm)
2943 {
2944 	uint8_t num = get_u8(frm);
2945 	char addr[18];
2946 	int i;
2947 
2948 	for (i = 0; i < num; i++) {
2949 		extended_inquiry_info *info = frm->ptr;
2950 
2951 		p_ba2str(&info->bdaddr, addr);
2952 
2953 		p_indent(level, frm);
2954 		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2955 			addr, info->pscan_rep_mode, btohs(info->clock_offset),
2956 			info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2957 
2958 		frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
2959 		frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
2960 
2961 		ext_inquiry_response_dump(level, frm);
2962 	}
2963 }
2964 
link_supervision_timeout_changed_dump(int level,struct frame * frm)2965 static inline void link_supervision_timeout_changed_dump(int level, struct frame *frm)
2966 {
2967 	evt_link_supervision_timeout_changed *evt = frm->ptr;
2968 
2969 	p_indent(level, frm);
2970 	printf("handle %d timeout %d\n",
2971 				btohs(evt->handle), btohs(evt->timeout));
2972 }
2973 
user_passkey_notify_dump(int level,struct frame * frm)2974 static inline void user_passkey_notify_dump(int level, struct frame *frm)
2975 {
2976 	evt_user_passkey_notify *evt = frm->ptr;
2977 	char addr[18];
2978 
2979 	p_indent(level, frm);
2980 	p_ba2str(&evt->bdaddr, addr);
2981 	printf("bdaddr %s passkey %d\n", addr, btohl(evt->passkey));
2982 }
2983 
keypress_notify_dump(int level,struct frame * frm)2984 static inline void keypress_notify_dump(int level, struct frame *frm)
2985 {
2986 	evt_keypress_notify *evt = frm->ptr;
2987 	char addr[18];
2988 
2989 	p_indent(level, frm);
2990 	p_ba2str(&evt->bdaddr, addr);
2991 	printf("bdaddr %s type %d\n", addr, evt->type);
2992 }
2993 
remote_host_features_notify_dump(int level,struct frame * frm)2994 static inline void remote_host_features_notify_dump(int level, struct frame *frm)
2995 {
2996 	evt_remote_host_features_notify *evt = frm->ptr;
2997 	char addr[18];
2998 	int i;
2999 
3000 	p_indent(level, frm);
3001 	p_ba2str(&evt->bdaddr, addr);
3002 	printf("bdaddr %s\n", addr);
3003 
3004 	p_indent(level, frm);
3005 	printf("Features:");
3006 	for (i = 0; i < 8; i++)
3007 		printf(" 0x%2.2x", evt->features[i]);
3008 	printf("\n");
3009 }
3010 
event_dump(int level,struct frame * frm)3011 static inline void event_dump(int level, struct frame *frm)
3012 {
3013 	hci_event_hdr *hdr = frm->ptr;
3014 	uint8_t event = hdr->evt;
3015 
3016 	if (p_filter(FILT_HCI))
3017 		return;
3018 
3019 	if (event <= EVENT_NUM) {
3020 		p_indent(level, frm);
3021 		printf("HCI Event: %s (0x%2.2x) plen %d\n",
3022 					event_str[hdr->evt], hdr->evt, hdr->plen);
3023 	} else if (hdr->evt == EVT_TESTING) {
3024 		p_indent(level, frm);
3025 		printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
3026 	} else if (hdr->evt == EVT_VENDOR) {
3027 		uint16_t manufacturer;
3028 
3029 		if (parser.flags & DUMP_NOVENDOR)
3030 			return;
3031 
3032 		p_indent(level, frm);
3033 		printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
3034 
3035 		manufacturer = get_manufacturer();
3036 
3037 		switch (manufacturer) {
3038 		case 0:
3039 		case 37:
3040 		case 48:
3041 			frm->ptr += HCI_EVENT_HDR_SIZE;
3042 			frm->len -= HCI_EVENT_HDR_SIZE;
3043 			ericsson_dump(level + 1, frm);
3044 			return;
3045 		case 10:
3046 			frm->ptr += HCI_EVENT_HDR_SIZE;
3047 			frm->len -= HCI_EVENT_HDR_SIZE;
3048 			csr_dump(level + 1, frm);
3049 			return;
3050 		}
3051 	} else {
3052 		p_indent(level, frm);
3053 		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
3054 	}
3055 
3056 	frm->ptr += HCI_EVENT_HDR_SIZE;
3057 	frm->len -= HCI_EVENT_HDR_SIZE;
3058 
3059 	if (event == EVT_CMD_COMPLETE) {
3060 		evt_cmd_complete *cc = frm->ptr;
3061 		if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {
3062 			read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;
3063 			manufacturer = rp->manufacturer;
3064 		}
3065 	}
3066 
3067 	if (event == EVT_DISCONN_COMPLETE) {
3068 		evt_disconn_complete *evt = frm->ptr;
3069 		l2cap_clear(btohs(evt->handle));
3070 	}
3071 
3072 	if (!(parser.flags & DUMP_VERBOSE)) {
3073 		raw_dump(level, frm);
3074 		return;
3075 	}
3076 
3077 	switch (event) {
3078 	case EVT_LOOPBACK_COMMAND:
3079 		command_dump(level + 1, frm);
3080 		break;
3081 	case EVT_CMD_COMPLETE:
3082 		cmd_complete_dump(level + 1, frm);
3083 		break;
3084 	case EVT_CMD_STATUS:
3085 		cmd_status_dump(level + 1, frm);
3086 		break;
3087 	case EVT_HARDWARE_ERROR:
3088 		hardware_error_dump(level + 1, frm);
3089 		break;
3090 	case EVT_FLUSH_OCCURRED:
3091 	case EVT_QOS_VIOLATION:
3092 		handle_response_dump(level + 1, frm);
3093 		break;
3094 	case EVT_INQUIRY_COMPLETE:
3095 		status_response_dump(level + 1, frm);
3096 		break;
3097 	case EVT_INQUIRY_RESULT:
3098 		inq_result_dump(level + 1, frm);
3099 		break;
3100 	case EVT_CONN_COMPLETE:
3101 		conn_complete_dump(level + 1, frm);
3102 		break;
3103 	case EVT_CONN_REQUEST:
3104 		conn_request_dump(level + 1, frm);
3105 		break;
3106 	case EVT_DISCONN_COMPLETE:
3107 		disconn_complete_dump(level + 1, frm);
3108 		break;
3109 	case EVT_AUTH_COMPLETE:
3110 	case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
3111 		generic_response_dump(level + 1, frm);
3112 		break;
3113 	case EVT_MASTER_LINK_KEY_COMPLETE:
3114 		master_link_key_complete_dump(level + 1, frm);
3115 		break;
3116 	case EVT_REMOTE_NAME_REQ_COMPLETE:
3117 		remote_name_req_complete_dump(level + 1, frm);
3118 		break;
3119 	case EVT_ENCRYPT_CHANGE:
3120 		encrypt_change_dump(level + 1, frm);
3121 		break;
3122 	case EVT_READ_REMOTE_FEATURES_COMPLETE:
3123 		read_remote_features_complete_dump(level + 1, frm);
3124 		break;
3125 	case EVT_READ_REMOTE_VERSION_COMPLETE:
3126 		read_remote_version_complete_dump(level + 1, frm);
3127 		break;
3128 	case EVT_QOS_SETUP_COMPLETE:
3129 		qos_setup_complete_dump(level + 1, frm);
3130 		break;
3131 	case EVT_ROLE_CHANGE:
3132 		role_change_dump(level + 1, frm);
3133 		break;
3134 	case EVT_NUM_COMP_PKTS:
3135 		num_comp_pkts_dump(level + 1, frm);
3136 		break;
3137 	case EVT_MODE_CHANGE:
3138 		mode_change_dump(level + 1, frm);
3139 		break;
3140 	case EVT_RETURN_LINK_KEYS:
3141 		return_link_keys_dump(level + 1, frm);
3142 		break;
3143 	case EVT_PIN_CODE_REQ:
3144 	case EVT_LINK_KEY_REQ:
3145 	case EVT_IO_CAPABILITY_REQUEST:
3146 	case EVT_USER_PASSKEY_REQUEST:
3147 	case EVT_REMOTE_OOB_DATA_REQUEST:
3148 		pin_code_req_dump(level + 1, frm);
3149 		break;
3150 	case EVT_LINK_KEY_NOTIFY:
3151 		link_key_notify_dump(level + 1, frm);
3152 		break;
3153 	case EVT_DATA_BUFFER_OVERFLOW:
3154 		data_buffer_overflow_dump(level + 1, frm);
3155 		break;
3156 	case EVT_MAX_SLOTS_CHANGE:
3157 		max_slots_change_dump(level + 1, frm);
3158 		break;
3159 	case EVT_READ_CLOCK_OFFSET_COMPLETE:
3160 		read_clock_offset_complete_dump(level + 1, frm);
3161 		break;
3162 	case EVT_CONN_PTYPE_CHANGED:
3163 		conn_ptype_changed_dump(level + 1, frm);
3164 		break;
3165 	case EVT_PSCAN_REP_MODE_CHANGE:
3166 		pscan_rep_mode_change_dump(level + 1, frm);
3167 		break;
3168 	case EVT_FLOW_SPEC_COMPLETE:
3169 		flow_spec_complete_dump(level + 1, frm);
3170 		break;
3171 	case EVT_INQUIRY_RESULT_WITH_RSSI:
3172 		inq_result_with_rssi_dump(level + 1, frm);
3173 		break;
3174 	case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:
3175 		read_remote_ext_features_complete_dump(level + 1, frm);
3176 		break;
3177 	case EVT_SYNC_CONN_COMPLETE:
3178 		sync_conn_complete_dump(level + 1, frm);
3179 		break;
3180 	case EVT_SYNC_CONN_CHANGED:
3181 		sync_conn_changed_dump(level + 1, frm);
3182 		break;
3183 	case EVT_SNIFF_SUBRATING:
3184 		sniff_subrating_event_dump(level + 1, frm);
3185 		break;
3186 	case EVT_EXTENDED_INQUIRY_RESULT:
3187 		extended_inq_result_dump(level + 1, frm);
3188 		break;
3189 	case EVT_ENCRYPTION_KEY_REFRESH_COMPLETE:
3190 		generic_response_dump(level + 1, frm);
3191 		break;
3192 	case EVT_SIMPLE_PAIRING_COMPLETE:
3193 		bdaddr_response_dump(level + 1, frm);
3194 		break;
3195 	case EVT_LINK_SUPERVISION_TIMEOUT_CHANGED:
3196 		link_supervision_timeout_changed_dump(level + 1, frm);
3197 		break;
3198 	case EVT_ENHANCED_FLUSH_COMPLETE:
3199 		generic_command_dump(level + 1, frm);
3200 		break;
3201 	case EVT_IO_CAPABILITY_RESPONSE:
3202 		io_capability_reply_dump(level + 1, frm);
3203 		break;
3204 	case EVT_USER_CONFIRM_REQUEST:
3205 	case EVT_USER_PASSKEY_NOTIFY:
3206 		user_passkey_notify_dump(level + 1, frm);
3207 		break;
3208 	case EVT_KEYPRESS_NOTIFY:
3209 		keypress_notify_dump(level + 1, frm);
3210 		break;
3211 	case EVT_REMOTE_HOST_FEATURES_NOTIFY:
3212 		remote_host_features_notify_dump(level + 1, frm);
3213 		break;
3214 	default:
3215 		raw_dump(level, frm);
3216 		break;
3217 	}
3218 }
3219 
acl_dump(int level,struct frame * frm)3220 static inline void acl_dump(int level, struct frame *frm)
3221 {
3222 	hci_acl_hdr *hdr = (void *) frm->ptr;
3223 	uint16_t handle = btohs(hdr->handle);
3224 	uint16_t dlen = btohs(hdr->dlen);
3225 	uint8_t flags = acl_flags(handle);
3226 
3227 	if (!p_filter(FILT_HCI)) {
3228 		p_indent(level, frm);
3229 		printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",
3230 			acl_handle(handle), flags, dlen);
3231 		level++;
3232 	}
3233 
3234 	frm->ptr += HCI_ACL_HDR_SIZE;
3235 	frm->len -= HCI_ACL_HDR_SIZE;
3236 	frm->flags  = flags;
3237 	frm->handle = acl_handle(handle);
3238 
3239 	if (parser.filter & ~FILT_HCI)
3240 		l2cap_dump(level, frm);
3241 	else
3242 		raw_dump(level, frm);
3243 }
3244 
sco_dump(int level,struct frame * frm)3245 static inline void sco_dump(int level, struct frame *frm)
3246 {
3247 	hci_sco_hdr *hdr = (void *) frm->ptr;
3248 	uint16_t handle = btohs(hdr->handle);
3249 	uint8_t flags = acl_flags(handle);
3250 	int len;
3251 
3252 	if (frm->audio_fd > fileno(stderr))
3253 		len = write(frm->audio_fd, frm->ptr + HCI_SCO_HDR_SIZE, hdr->dlen);
3254 
3255 	if (!p_filter(FILT_SCO)) {
3256 		p_indent(level, frm);
3257 		printf("SCO data: handle %d flags 0x%2.2x dlen %d\n",
3258 				acl_handle(handle), flags, hdr->dlen);
3259 		level++;
3260 
3261 		frm->ptr += HCI_SCO_HDR_SIZE;
3262 		frm->len -= HCI_SCO_HDR_SIZE;
3263 		raw_dump(level, frm);
3264 	}
3265 }
3266 
vendor_dump(int level,struct frame * frm)3267 static inline void vendor_dump(int level, struct frame *frm)
3268 {
3269 	if (p_filter(FILT_HCI))
3270 		return;
3271 
3272 	if (frm->dev_id == HCI_DEV_NONE) {
3273 		uint16_t device = btohs(htons(get_u16(frm)));
3274 		uint16_t proto = btohs(htons(get_u16(frm)));
3275 		uint16_t type = btohs(htons(get_u16(frm)));
3276 		uint16_t plen = btohs(htons(get_u16(frm)));
3277 
3278 		p_indent(level, frm);
3279 
3280 		printf("System %s: device hci%d proto 0x%2.2x type 0x%2.2x plen %d\n",
3281 			frm->in ? "event" : "command", device, proto, type, plen);
3282 
3283 		raw_dump(level, frm);
3284 		return;
3285 	}
3286 
3287 	if (parser.flags & DUMP_NOVENDOR)
3288 		return;
3289 
3290 	if (get_manufacturer() == 12) {
3291 		bpa_dump(level, frm);
3292 		return;
3293 	}
3294 
3295 	p_indent(level, frm);
3296 	printf("Vendor data: len %d\n", frm->len);
3297 	raw_dump(level, frm);
3298 }
3299 
hci_dump(int level,struct frame * frm)3300 void hci_dump(int level, struct frame *frm)
3301 {
3302 	uint8_t type = *(uint8_t *)frm->ptr;
3303 
3304 	frm->ptr++; frm->len--;
3305 
3306 	switch (type) {
3307 	case HCI_COMMAND_PKT:
3308 		command_dump(level, frm);
3309 		break;
3310 
3311 	case HCI_EVENT_PKT:
3312 		event_dump(level, frm);
3313 		break;
3314 
3315 	case HCI_ACLDATA_PKT:
3316 		acl_dump(level, frm);
3317 		break;
3318 
3319 	case HCI_SCODATA_PKT:
3320 		sco_dump(level, frm);
3321 		break;
3322 
3323 	case HCI_VENDOR_PKT:
3324 		vendor_dump(level, frm);
3325 		break;
3326 
3327 	default:
3328 		if (p_filter(FILT_HCI))
3329 			break;
3330 
3331 		p_indent(level, frm);
3332 		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
3333 		raw_dump(level, frm);
3334 		break;
3335 	}
3336 }
3337