hci.c revision 27eb1cb2512b886662cab125e53305ca6d779e7f
195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/*
2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
3e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Bluetooth packet analyzer - HCI parser
4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Copyright (C) 2000-2002  Maxim Krasnyansky <maxk@qualcomm.com>
6d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann *  Copyright (C) 2003-2005  Marcel Holtmann <marcel@holtmann.org>
7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is free software; you can redistribute it and/or modify
10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  it under the terms of the GNU General Public License as published by
11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  the Free Software Foundation; either version 2 of the License, or
12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  (at your option) any later version.
13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is distributed in the hope that it will be useful,
15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  GNU General Public License for more details.
18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  You should have received a copy of the GNU General Public License
20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  along with this program; if not, write to the Free Software
21e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
23e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
24e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  $Id$
2595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky */
2695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdio.h>
28e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#include <errno.h>
29d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#include <ctype.h>
3095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdlib.h>
3195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <unistd.h>
3295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <string.h>
3395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/types.h>
350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <sys/socket.h>
360d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <netinet/in.h>
3795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/bluetooth.h>
3995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/hci.h>
40ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann#include <bluetooth/hci_lib.h>
4195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
4295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include "parser.h"
4395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
44be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic uint16_t manufacturer = DEFAULT_COMPID;
45be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
46be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic inline uint16_t get_manufacturer(void)
47be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann{
48be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer);
49be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann}
50be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
51d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *event_str[] = {
5266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Unknown",
5366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Complete",
5466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Result",
5566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Complete",
5666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Request",
5766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Disconn Complete",
5866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Auth Complete",
5966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Remote Name Req Complete",
60d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	"Encrypt Change",
6166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Change Connection Link Key Complete",
6266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Master Link Key Complete",
6366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Supported Features",
6466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Ver Info Complete",
6566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Setup Complete",
6666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Complete",
6766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Status",
6866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Hardware Error",
6966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Flush Occurred",
7066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Role Change",
7166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Number of Completed Packets",
7266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Mode Change",
7366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Return Link Keys",
7466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"PIN Code Request",
7566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Request",
7666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Notification",
7766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Loopback Command",
7866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Data Buffer Overflow",
7966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Max Slots Change",
8066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Clock Offset Complete",
8166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connection Packet Type Changed",
8266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Violation",
8366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Page Scan Mode Change",
84328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Page Scan Repetition Mode Change",
85328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Flow Specification Complete",
86328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Inquiry Result with RSSI",
87328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
88328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
89328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
90328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
91328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
92328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
93328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
94328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
95328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
96328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Synchronous Connect Complete",
971a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Synchronous Connect Changed",
981a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Unknown",
991a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Extended Inquiry Result",
10066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky};
10127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann#define EVENT_NUM 47
1022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
103d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_linkctl_str[] = {
1042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry",
1062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry Cancel",
1072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Periodic Inquiry Mode",
1082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Periodic Inquiry Mode",
1092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create Connection",
1102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Disconnect",
1112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Add SCO Connection",
112328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Create Connection Cancel",
1132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Accept Connection Request",
1142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reject Connection Request",
1152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Reply",
1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Negative Reply",
1172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Reply",
1182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Negative Reply",
1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Packet Type",
120f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Authentication Requested",
122f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Connection Encryption",
124f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Link Key",
126f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Master Link Key",
128f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Remote Name Request",
130328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Remote Name Request Cancel",
1312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Supported Features",
132328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
1332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Version Information",
134f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
135328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Clock Offset",
136328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read LMP Handle"
137328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
138328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
139328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
140328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
141328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
142328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
143328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
144328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Setup Synchronous Connection",
145328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Accept Synchronous Connection",
1461a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Reject Synchronous Connection",
1472bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
148328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_LINKCTL_NUM 42
1492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
150d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_linkpol_str[] = {
1512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Hold Mode",
153f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Sniff Mode",
1552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Sniff Mode",
156328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Park State",
157328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Exit Park State",
1582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"QoS Setup",
159f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Role Discovery",
161f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Switch Role",
1632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Policy Settings",
164328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Link Policy Settings",
165328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Default Link Policy Settings",
166328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Default Link Policy Settings",
1671a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Flow Specification",
1682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
169328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_LINKPOL_NUM 16
1702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
171d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_hostctl_str[] = {
1722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Mask",
174f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset",
176f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Filter",
178f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
179f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Flush",
1812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read PIN Type ",
1822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write PIN Type",
1832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create New Unit Key",
184f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Stored Link Key",
186f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
187f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
188f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Stored Link Key",
1902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Delete Stored Link Key",
191328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Local Name",
1922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Name",
1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Connection Accept Timeout",
1942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Connection Accept Timeout",
1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Timeout",
1962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Timeout",
1972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Scan Enable",
1982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Scan Enable",
1992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Activity",
2002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Activity",
2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Inquiry Scan Activity",
2022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Inquiry Scan Activity",
2032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Authentication Enable",
2042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Authentication Enable",
2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Encryption Mode",
2062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Encryption Mode",
2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Class of Device",
2082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Class of Device",
2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Voice Setting",
2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Voice Setting",
2112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Automatic Flush Timeout",
2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Automatic Flush Timeout",
2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Num Broadcast Retransmissions",
2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Num Broadcast Retransmissions",
2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Hold Mode Activity ",
2162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Hold Mode Activity",
2172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Transmit Power Level",
218328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Synchronous Flow Control Enable",
219328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Synchronous Flow Control Enable",
220f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Host Controller To Host Flow Control",
222f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Buffer Size",
224f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Number of Completed Packets",
2262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Supervision Timeout",
2272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Link Supervision Timeout",
2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Number of Supported IAC",
2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Current IAC LAP",
2302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Current IAC LAP",
2312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Period Mode",
2322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Period Mode",
2332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Mode",
234328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Mode",
235328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Set AFH Host Channel Classification",
236328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
237328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
238328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Scan Type",
239328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Scan Type",
240328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Mode",
241328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Mode",
242328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Page Scan Type",
243328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Type",
244328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Assessment Mode",
2451a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write AFH Channel Assessment Mode",
2461a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Unknown",
2471a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Extended Inquiry Response",
2481a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write Extended Inquiry Response",
2492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2501a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann#define CMD_HOSTCTL_NUM 76
2512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
252d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_info_str[] = {
2532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Version Information",
255328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Supported Commands",
2562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Supported Features",
257328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Extended Features",
2582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Buffer Size",
259f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Country Code",
261f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2621a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read BD ADDR",
2632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
264f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky#define CMD_INFO_NUM 9
2652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
266d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_status_str[] = {
2672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Failed Contact Counter",
2692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset Failed Contact Counter",
270328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Link Quality",
271f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
272328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read RSSI",
273328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Map",
2741a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Clock",
2752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
276328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_STATUS_NUM 7
27766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky
278d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *error_code_str[] = {
279d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Success",
280d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown HCI Command",
281d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown Connection Identifier",
282d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Hardware Failure",
283d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Page Timeout",
284d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Authentication Failure",
285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"PIN or Key Missing",
286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Memory Capacity Exceeded",
287d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Timeout",
288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Limit Exceeded",
289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Synchronous Connection to a Device Exceeded",
290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"ACL Connection Already Exists",
291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Command Disallowed",
292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Limited Resources",
293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Security Reasons",
294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Unacceptable BD_ADDR",
295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Accept Timeout Exceeded",
296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Feature or Parameter Value",
297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid HCI Command Parameters",
29860864ce9e77ec159d0914fe8d938565493f08eebMarcel Holtmann	"Remote User Terminated Connection",
299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Low Resources",
300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Power Off",
301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Terminated by Local Host",
302fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Repeated Attempts",
303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Pairing Not Allowed",
304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown LMP PDU",
305d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Remote Feature / Unsupported LMP Feature",
306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Offset Rejected",
307d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Interval Rejected",
308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Air Mode Rejected",
309d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid LMP Parameters",
310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unspecified Error",
311d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported LMP Parameter Value",
312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Change Not Allowed",
313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Response Timeout",
314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Error Transaction Collision",
315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP PDU Not Allowed",
316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Encryption Mode Not Acceptable",
317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Link Key Can Not be Changed",
318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Requested QoS Not Supported",
319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Instant Passed",
320fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Pairing with Unit Key Not Supported",
321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Different Transaction Collision",
322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Unacceptable Parameter",
324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Rejected",
325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Channel Classification Not Supported",
326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Insufficient Security",
327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Parameter out of Mandatory Range",
328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Switch Pending",
330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved Slot Violation",
3321a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Role Switch Failed",
333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann};
334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#define ERROR_CODE_NUM 53
335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *status2str(uint8_t status)
337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char *str;
339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status <= ERROR_CODE_NUM)
341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = error_code_str[status];
342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	else
343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = "Unknown";
344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return str;
346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
347d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
348d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *opcode2str(uint16_t opcode)
34995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
3500d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
3510d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
3522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	char *cmd;
35395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	switch (ogf) {
3552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_INFO_PARAM:
3562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_INFO_NUM)
357d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_info_str[ocf];
3582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_HOST_CTL:
3632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_HOSTCTL_NUM)
364d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_hostctl_str[ocf];
3652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_CTL:
3702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKCTL_NUM)
371d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkctl_str[ocf];
3722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_POLICY:
3772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKPOL_NUM)
378d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkpol_str[ocf];
3792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_STATUS_PARAM:
3842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_STATUS_NUM)
385d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_status_str[ocf];
3862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
390cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_TESTING_CMD:
391cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Testing";
392cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
393cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
394cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_VENDOR_CMD:
395cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Vendor";
396cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
397cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
3982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	default:
3992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		cmd = "Unknown";
4002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
4012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	}
4022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
403d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return cmd;
404d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
405d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
406ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *role2str(uint8_t role)
407ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
408ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (role) {
409ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
410ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Master";
411ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Slave";
413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
416ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
417ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
418ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *mode2str(uint8_t mode)
419ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
420ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (mode) {
421ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
422ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Active";
423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Hold";
425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x02:
426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Sniff";
427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x03:
428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Park";
429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
434d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic char *airmode2str(uint8_t mode)
435d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
436d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	switch (mode) {
437d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x00:
438d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "u-law log";
439d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x01:
440d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "A-law log";
441d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x02:
442d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "CVSD";
443d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x04:
444d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Transparent data";
445d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	default:
446d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Reserved";
447d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
448d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
449d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void generic_command_dump(int level, struct frame *frm)
451ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
452ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
453ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
454ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
455ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d\n", handle);
456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
459ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
46090480219be366c65e68ae8612de7a361027e751aMarcel Holtmannstatic inline void bdaddr_command_dump(int level, struct frame *frm)
46190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann{
46290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
46390480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	char addr[18];
46490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
46590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->ptr += sizeof(bdaddr_t);
46690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->len -= sizeof(bdaddr_t);
46790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
46890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	p_indent(level, frm);
46990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	ba2str(bdaddr, addr);
47090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann        printf("bdaddr %s\n", addr);
47190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
47290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	raw_dump(level, frm);
47390480219be366c65e68ae8612de7a361027e751aMarcel Holtmann}
47490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
475ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void inquiry_dump(int level, struct frame *frm)
476ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
477ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	inquiry_cp *cp = frm->ptr;
478ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
479ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
480ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
481ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
482ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
483ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
484ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void periodic_inquiry_dump(int level, struct frame *frm)
485ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
486ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	periodic_inquiry_cp *cp = frm->ptr;
487ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
488ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
489ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
490ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		btohs(cp->max_period), btohs(cp->min_period),
491ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
492ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
493ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
494ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void create_conn_dump(int level, struct frame *frm)
495ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
496ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	create_conn_cp *cp = frm->ptr;
497ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
498ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
499ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], *str;
500ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
501ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
502ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n",
504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		addr, ptype, cp->role_switch,
505ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
506ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
507ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
508ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
509ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
510ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
511ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
512ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
513ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
515ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void disconnect_dump(int level, struct frame *frm)
516ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
517ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	disconnect_cp *cp = frm->ptr;
518ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
519ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
520ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason);
521ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
522ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
523ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
524ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
525ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
526ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void add_sco_dump(int level, struct frame *frm)
527ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
528ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	add_sco_cp *cp = frm->ptr;
529ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
530ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
531ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
532ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
533ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype);
534ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
535ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
536ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
537ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
538ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void accept_conn_req_dump(int level, struct frame *frm)
544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	accept_conn_req_cp *cp = frm->ptr;
546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s role 0x%2.2x\n", addr, cp->role);
551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Role: %s\n", role2str(cp->role));
554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void reject_conn_req_dump(int level, struct frame *frm)
557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	reject_conn_req_cp *cp = frm->ptr;
559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason);
564ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
565ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
566ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_reply_dump(int level, struct frame *frm)
570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	pin_code_reply_cp *cp = frm->ptr;
572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], pin[17];
573ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
574ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
575ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
576ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(pin, 0, sizeof(pin));
577ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memcpy(pin, cp->pin_code, cp->pin_len);
578ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin);
579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_reply_dump(int level, struct frame *frm)
582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	link_key_reply_cp *cp = frm->ptr;
584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
58944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
59144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2X", cp->link_key[i]);
592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("\n");
593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_neg_reply_dump(int level, struct frame *frm)
596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void set_conn_encrypt_dump(int level, struct frame *frm)
606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	set_conn_encrypt_cp *cp = frm->ptr;
608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt);
611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
613ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void remote_name_req_dump(int level, struct frame *frm)
614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	remote_name_req_cp *cp = frm->ptr;
616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
62172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann	printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n",
62272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		addr, cp->pscan_rep_mode,
62372e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
62617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_dump(int level, struct frame *frm)
62717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
62817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	master_link_key_cp *cp = frm->ptr;
62917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
63017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
63117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("flag %d\n", cp->key_flag);
63217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
63317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
63417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_dump(int level, struct frame *frm)
63517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
63617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_remote_ext_features_cp *cp = frm->ptr;
63717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
63817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann        p_indent(level, frm);
639b7aa4c8a065d56e738d352cc491262313c01ef98Marcel Holtmann        printf("handle %d page %d\n", btohs(cp->handle), cp->page_num);
64017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
64117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
642ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_link_policy_dump(int level, struct frame *frm)
643ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
644ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_link_policy_cp *cp = frm->ptr;
645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t policy = btohs(cp->policy);
646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy);
650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_lptostr(policy);
652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
654ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Link policy: %s\n", str);
655ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
656ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
657ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
658ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
65944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_mask_dump(int level, struct frame *frm)
66044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
66144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_mask_cp *cp = frm->ptr;
66244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i;
66344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
66444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
66544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("Mask: 0x");
66644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (i = 0; i < 8; i++)
66744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2x", cp->mask[i]);
66844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("\n");
66944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
67044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
67144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_flt_dump(int level, struct frame *frm)
67244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
67344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_flt_cp *cp = frm->ptr;
67444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
67544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
67644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("type %d condition %d\n", cp->flt_type, cp->cond_type);
67744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
67844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	switch (cp->flt_type) {
67944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CLEAR_ALL:
68044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Clear all filters\n");
68144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
68244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_INQ_RESULT:
68344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Inquiry result");
68444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
68544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_ALL:
68644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_CLASS:
68744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_BDADDR:
68844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
68944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
69044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
69144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
69244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
69344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CONN_SETUP:
69444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Connection setup");
69544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
69644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_ALL:
69744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_CLASS:
69844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_BDADDR:
69944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
70044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
70144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
70244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
70344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
70444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
70544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
70644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
70744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_pin_type_dump(int level, struct frame *frm)
70844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
70944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_pin_type_cp *cp = frm->ptr;
71044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
71144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
71244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("type %d\n", cp->pin_type);
71344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
71444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
71544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void request_stored_link_key_dump(int level, struct frame *frm)
71644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
71744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_cp *cp = frm->ptr;
71844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
71944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
72044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
72144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	ba2str(&cp->bdaddr, addr);
72244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s all %d\n", addr, cp->read_all);
72344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
72444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
72544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void return_link_keys_dump(int level, struct frame *frm)
72644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
72744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t num = get_u8(frm);
72844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t key[16];
72944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
73044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i, n;
73144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
73244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (n = 0; n < num; n++) {
73344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		ba2str(frm->ptr, addr);
73444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		memcpy(key, frm->ptr + 6, 16);
73544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
73644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
73744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("bdaddr %s key ", addr);
73844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		for (i = 0; i < 16; i++)
73944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("%2.2X", key[i]);
74044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("\n");
74144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
74244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->ptr += 2;
74344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->len -= 2;
74444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
74544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
74644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
747ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void change_local_name_dump(int level, struct frame *frm)
748ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
749ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	change_local_name_cp *cp = frm->ptr;
750ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
751ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
752ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
753ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
754ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && cp->name[i]; i++)
755ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(cp->name[i]))
756ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = cp->name[i];
757ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
758ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
759ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
760ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
761ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("name \'%s\'\n", name);
762ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
763ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
764ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_class_of_dev_dump(int level, struct frame *frm)
765ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
766ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_class_of_dev_cp *cp = frm->ptr;
767ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
768ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
769ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("class 0x%2.2x%2.2x%2.2x\n",
770ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
771ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
772ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
773ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_voice_setting_dump(int level, struct frame *frm)
774ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
775ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_voice_setting_cp *cp = frm->ptr;
776ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
777ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
778ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));
779ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
780ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
781fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void write_current_iac_lap_dump(int level, struct frame *frm)
782fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
783fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	write_current_iac_lap_cp *cp = frm->ptr;
784fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
785fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
786fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < cp->num_current_iac; i++) {
787fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
788fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]);
789fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) {
790fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (cp->lap[i][0]) {
791fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
792fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
793fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
794fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
795fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
796fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
797fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
798fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
799fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
800fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
801fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
802fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
80369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void write_scan_enable_dump(int level, struct frame *frm)
80469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
80569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
80669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
80769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
80869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("enable %d\n", enable);
80969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
81069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
811d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_timeout_dump(int level, struct frame *frm)
812d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
813d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_timeout_cp *cp = frm->ptr;
814d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
815d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
816d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("timeout %d\n", btohs(cp->timeout));
817d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
818d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
819d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_activity_dump(int level, struct frame *frm)
820d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
821d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_activity_cp *cp = frm->ptr;
822d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
823d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
824d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window));
825d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
826d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
827a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void write_inquiry_scan_type_dump(int level, struct frame *frm)
828a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
829a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	write_inquiry_scan_type_cp *cp = frm->ptr;
830a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
831a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
832a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("type %d\n", cp->type);
833a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
834a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
835f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmannstatic inline void write_inquiry_mode_dump(int level, struct frame *frm)
836f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann{
837f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	write_inquiry_mode_cp *cp = frm->ptr;
838f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
839f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	p_indent(level, frm);
840f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	printf("mode %d\n", cp->mode);
841f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann}
842f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
8436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void write_link_supervision_timeout_dump(int level, struct frame *frm)
8446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
8456eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	write_link_supervision_timeout_cp *cp = frm->ptr;
8466eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
8476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
8486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d timeout %d\n",
8496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		btohs(cp->handle), btohs(cp->link_sup_to));
8506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
8516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
8521a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void write_ext_inquiry_response_dump(int level, struct frame *frm)
8531a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
8541a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	write_ext_inquiry_response_cp *cp = frm->ptr;
8551a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
8561a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
8571a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("fec 0x%2.2x\n", cp->fec);
8581a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
8591a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
8606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void request_transmit_power_level_dump(int level, struct frame *frm)
8616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
8626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_cp *cp = frm->ptr;
8636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
8646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
8656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d type %d (%s)\n",
8666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		btohs(cp->handle), cp->type,
8676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		cp->type ? "maximum" : "current");
8686eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
8696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
87017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void request_local_ext_features_dump(int level, struct frame *frm)
87117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
87217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_cp *cp = frm->ptr;
87317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
87417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
87517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("page %d\n", cp->page_num);
87617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
87717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
878f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void request_clock_dump(int level, struct frame *frm)
879f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
880f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_cp *cp = frm->ptr;
881f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
882f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
883f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("handle %d which %d (%s)\n",
884f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		btohs(cp->handle), cp->which_clock,
885f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		cp->which_clock ? "piconet" : "local");
886f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
887f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
888d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm)
889d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
890d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	hci_command_hdr *hdr = frm->ptr;
891d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(hdr->opcode);
892d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
893d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
894d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
895d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (p_filter(FILT_HCI))
896d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
897d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
898ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
89965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
900803752117135528b1adebf0fa045596e188a996dMarcel Holtmann	printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, hdr->plen);
90265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
90365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_COMMAND_HDR_SIZE;
90465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_COMMAND_HDR_SIZE;
90565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
906be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (ogf == OGF_VENDOR_CMD && ocf == 0 && get_manufacturer() == 10) {
907be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		csr_dump(level + 1, frm);
908be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		return;
909be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
910be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
9114f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
9124f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
9134f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
9144f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
9154f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
916ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (ogf) {
917ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
918ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
919ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY:
920ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			inquiry_dump(level + 1, frm);
921ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
922ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
923ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			periodic_inquiry_dump(level + 1, frm);
924ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
925ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY_CANCEL:
926ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
927ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
928ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CREATE_CONN:
929ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			create_conn_dump(level + 1, frm);
930ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
931ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_DISCONNECT:
932ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			disconnect_dump(level + 1, frm);
933ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
93490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
93590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
93690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_ACCEPT_SYNC_CONN_REQ:
93790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			bdaddr_command_dump(level + 1, frm);
93890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			return;
939ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ADD_SCO:
940ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_PTYPE:
941ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			add_sco_dump(level + 1, frm);
942acc2322e0bed89e8ada2564359a1a6d293c9d514Marcel Holtmann			return;
943ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ACCEPT_CONN_REQ:
944ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
945ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
946ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REJECT_CONN_REQ:
94790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REJECT_SYNC_CONN_REQ:
948ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			reject_conn_req_dump(level + 1, frm);
949ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
950ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
951ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_reply_dump(level + 1, frm);
952ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
953ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
954ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			link_key_reply_dump(level + 1, frm);
955ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
956ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
957ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
958ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_neg_reply_dump(level + 1, frm);
959ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
960ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_ENCRYPT:
961ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			set_conn_encrypt_dump(level + 1, frm);
962ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
963ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_AUTH_REQUESTED:
964ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_CONN_LINK_KEY:
965ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_FEATURES:
966ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_VERSION:
967ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLOCK_OFFSET:
96890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_READ_LMP_HANDLE:
96990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_SETUP_SYNC_CONN:
970ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
971ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
97217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_MASTER_LINK_KEY:
97317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			master_link_key_dump(level + 1, frm);
97417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
97517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_REMOTE_EXT_FEATURES:
97617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_remote_ext_features_dump(level + 1, frm);
97717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
978ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REMOTE_NAME_REQ:
979ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			remote_name_req_dump(level + 1, frm);
980ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
981ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
982ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
983ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
984ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
985ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
986ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_SNIFF_MODE:
987ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PARK_MODE:
988ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ROLE_DISCOVERY:
989ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_LINK_POLICY:
990ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
991ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SWITCH_ROLE:
993ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_link_policy_dump(level + 1, frm);
997ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
999ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_HOST_CTL:
1002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
100344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
100444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
100544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
100644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
100744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_mask_dump(level + 1, frm);
100844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
100944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
101044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_flt_dump(level + 1, frm);
101144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
101244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
101344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_pin_type_dump(level + 1, frm);
101444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
101544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
101644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
101744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			request_stored_link_key_dump(level + 1, frm);
101844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
101944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
102044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return_link_keys_dump(level + 1, frm);
102144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1022ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			change_local_name_dump(level + 1, frm);
1024ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1025ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1026ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_class_of_dev_dump(level + 1, frm);
1027ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1028ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1029ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_voice_setting_dump(level + 1, frm);
1030ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1031fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
1032fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			write_current_iac_lap_dump(level + 1, frm);
1033fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
103469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
103569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
103669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			write_scan_enable_dump(level + 1, frm);
103769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1038097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1039d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1040d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_timeout_dump(level + 1, frm);
1041d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1042d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1043d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1044d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_activity_dump(level + 1, frm);
1045d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1046a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1047a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			write_inquiry_scan_type_dump(level + 1, frm);
1048a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
104969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1050f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1051f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_AFH_MODE:
1052f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			write_inquiry_mode_dump(level + 1, frm);
1053f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
10546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
10556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			request_transmit_power_level_dump(level + 1, frm);
10566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
105744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
10586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
10596eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_command_dump(level + 1, frm);
10606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
10616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
10626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			write_link_supervision_timeout_dump(level + 1, frm);
10636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
10641a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
10651a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			write_ext_inquiry_response_dump(level + 1, frm);
10661a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
1067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1068ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
106917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
107017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case OGF_INFO_PARAM:
107117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		switch (ocf) {
107217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
107317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			request_local_ext_features_dump(level + 1, frm);
107417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
107517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
1076ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1077f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1078f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	case OGF_STATUS_PARAM:
1079f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		switch (ocf) {
1080f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_LINK_QUALITY:
1081f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_RSSI:
1082f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_AFH_MAP:
1083f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			generic_command_dump(level + 1, frm);
1084f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1085f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_CLOCK:
1086f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			request_clock_dump(level + 1, frm);
1087f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1088f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		}
1089f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		break;
1090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
109265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	raw_dump(level, frm);
109395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
109495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1095d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm)
1096d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1097d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1098d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1099d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1100d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x\n", status);
1101d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1102d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1103d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1104d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1105d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1106d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1107d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1108d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1109d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1110afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void handle_response_dump(int level, struct frame *frm)
1111afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1112afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1113afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1114afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1115afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("handle %d\n", handle);
1116afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1117afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	raw_dump(level, frm);
1118afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1119afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1120ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm)
1121ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1122ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t status = get_u8(frm);
1123ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
1124ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1125ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1126ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->ptr += sizeof(bdaddr_t);
1127ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->len -= sizeof(bdaddr_t);
1128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1130ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
1131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s\n", status, addr);
1132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (status > 0) {
1134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(status));
1136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1138ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1139ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1140ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1141d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm)
1142d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1143d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1144d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1145d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1146d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1147d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d\n", status, handle);
1148d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1149d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1150d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1151d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1152d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1153d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1154d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1155d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1156d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
115744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_pin_type_dump(int level, struct frame *frm)
115844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
115944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_pin_type_rp *rp = frm->ptr;
116044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
116144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
116244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type);
116344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
116444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
116544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
116644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
116744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
116844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
116944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
117044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_stored_link_key_dump(int level, struct frame *frm)
117144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
117244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_rp *rp = frm->ptr;
117344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
117444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
117544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x max %d num %d\n",
117644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		rp->status, rp->max_keys, rp->num_keys);
117744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
117844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
117944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
118044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
118144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
118244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
118344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
118444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_stored_link_key_dump(int level, struct frame *frm)
118544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
118644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_stored_link_key_rp *rp = frm->ptr;
118744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
118844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
118944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys);
119044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
119144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
119244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
119344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
119444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
119544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
119644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
119744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void delete_stored_link_key_dump(int level, struct frame *frm)
119844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
119944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	delete_stored_link_key_rp *rp = frm->ptr;
120044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
120144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
120244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys));
120344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
120444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
120544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
120644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
120744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
120844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
120944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
1210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm)
1211ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1212ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_name_rp *rp = frm->ptr;
1213ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
1214ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1215ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1216ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
1217ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && rp->name[i]; i++)
1218ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(rp->name[i]))
1219ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = rp->name[i];
1220ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
1221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
1222ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1223ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1224ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x name \'%s\'\n", rp->status, name);
1225ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1226ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1229ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1230ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1231ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1232ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm)
1233ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_class_of_dev_rp *rp = frm->ptr;
1235ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1236ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1237ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
1238ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
1239ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1240ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1241ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1242ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1243ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1244ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1245ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1246ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm)
1247ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1248ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_voice_setting_rp *rp = frm->ptr;
1249ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1250ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1251ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x voice setting 0x%4.4x\n",
1252ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->status, btohs(rp->voice_setting));
1253ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1254ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1255ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1256ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1257ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1258ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1259ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1260fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm)
1261fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
1262fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	read_current_iac_lap_rp *rp = frm->ptr;
1263fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
1264fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
1265fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < rp->num_current_iac; i++) {
1266fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
1267fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]);
1268fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) {
1269fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (rp->lap[i][0]) {
1270fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
1271fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
1272fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1273fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
1274fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
1275fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1276fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
1277fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
1278fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
1279fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
1280fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
1281fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
128269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void read_scan_enable_dump(int level, struct frame *frm)
128369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
128469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t status = get_u8(frm);
128569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
128669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
128769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
128869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("status 0x%2.2x enable %d\n", status, enable);
128969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
129069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	if (status > 0) {
129169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		p_indent(level, frm);
129269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		printf("Error: %s\n", status2str(status));
129369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	}
129469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
129569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
1296d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_timeout_dump(int level, struct frame *frm)
1297d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1298d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_timeout_rp *rp = frm->ptr;
1299d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1300d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1301d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout));
1302d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1303d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1304d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1305d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1306d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1307d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1308d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1309d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_activity_dump(int level, struct frame *frm)
1310d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1311d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_activity_rp *rp = frm->ptr;
1312d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1313d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1314d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x interval %d window %d\n",
1315d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		rp->status, btohs(rp->interval), btohs(rp->window));
1316d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1317d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1318d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1319d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1320d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1321d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1322d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1323a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void read_inquiry_scan_type_dump(int level, struct frame *frm)
1324a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
1325a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	read_inquiry_scan_type_rp *rp = frm->ptr;
1326a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1327a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
1328a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->type);
1329a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1330a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	if (rp->status > 0) {
1331a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		p_indent(level, frm);
1332a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1333a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	}
1334a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
1335a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
13366eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_inquiry_mode_dump(int level, struct frame *frm)
13376eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
13386eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_inquiry_mode_rp *rp = frm->ptr;
13396eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13406eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
13416eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x mode %d\n", rp->status, rp->mode);
13426eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
13446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
13456eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
13466eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
13476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
13486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_link_supervision_timeout_dump(int level, struct frame *frm)
13506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
13516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_link_supervision_timeout_rp *rp = frm->ptr;
13526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13536eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
13546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d timeout %d\n",
13556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		rp->status, btohs(rp->handle), btohs(rp->link_sup_to));
13566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13576eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
13586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
13596eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
13606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
13616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
13626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_transmit_power_level_dump(int level, struct frame *frm)
13646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
13656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_rp *rp = frm->ptr;
13666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
13686eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d level %d\n",
13696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		rp->status, btohs(rp->handle), rp->level);
13706eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
13726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
13736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
13746eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
13756eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
13766eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13771a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void read_ext_inquiry_response_dump(int level, struct frame *frm)
13781a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
13791a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	read_ext_inquiry_response_rp *rp = frm->ptr;
13801a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
13811a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
13821a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec);
13831a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
13841a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	if (rp->status > 0) {
13851a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		p_indent(level, frm);
13861a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
13871a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	}
13881a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
13891a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
1390ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm)
1391ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1392ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_version_rp *rp = frm->ptr;
1393ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(rp->manufacturer);
1394ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1395ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1396ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1397ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1398ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1399ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1400ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1401ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1402ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
14031a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann		printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
1404ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			hci_vertostr(rp->hci_ver), rp->hci_ver,
1405ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->hci_rev));
1406ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1407ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
1408ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(rp->lmp_ver), rp->lmp_ver,
1409ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->lmp_subver));
1410ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1411ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
1412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
1413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
141617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_commands_dump(int level, struct frame *frm)
141717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
141817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_commands_rp *rp = frm->ptr;
141917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i, max = 0;
142017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
142117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
142217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
142317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
142417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
142517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
142617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
142717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
142817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 64; i++)
142917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			if (rp->commands[i])
143017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				max = i + 1;
143117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
143217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Commands: ");
143317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < (max > 32 ? 32 : max); i++)
143417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("%2.2x", rp->commands[i]);
143517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
143617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		if (max > 32) {
143717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			p_indent(level, frm);
143817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("          ");
143917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			for (i = 32; i < max; i++)
144017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				printf("%2.2x", rp->commands[i]);
144117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("\n");
144217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
144317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
144417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
144517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm)
1447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_features_rp *rp = frm->ptr;
1449ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1451ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1452ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1453ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1454ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1455ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1459ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
1460ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
1461ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", rp->features[i]);
1462ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
1463ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1464ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1465ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
146617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_ext_features_dump(int level, struct frame *frm)
146717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
146817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_rp *rp = frm->ptr;
146917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
147017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
147117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
147217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x page %d max %d\n",
147317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		rp->status, rp->page_num, rp->max_page_num);
147417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
147517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
147617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
147717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
147817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
147917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
148017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
148117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
148217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			 printf(" 0x%2.2x", rp->features[i]);
148317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
148417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
148517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
148617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1487ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm)
1488ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1489ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_buffer_size_rp *rp = frm->ptr;
1490ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1491ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1492ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1493ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1494ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1495ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1496ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1497ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1498ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1499ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("ACL MTU %d:%d SCO MTU %d:%d\n",
1500ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
1501ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			rp->sco_mtu, btohs(rp->sco_max_pkt));
1502ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1505f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_link_quality_dump(int level, struct frame *frm)
1506f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1507f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_link_quality_rp *rp = frm->ptr;
1508f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1509f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1510f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d lq %d\n",
1511f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->link_quality);
1512f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1513f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1514f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1515f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1516f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1517f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1518f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1519f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_rssi_dump(int level, struct frame *frm)
1520f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1521f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_rssi_rp *rp = frm->ptr;
1522f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1523f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1524f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d rssi %d\n",
1525f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->rssi);
1526f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1527f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1528f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1529f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1530f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1531f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1532f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1533f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_afh_map_dump(int level, struct frame *frm)
1534f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1535f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_afh_map_rp *rp = frm->ptr;
1536f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	int i;
1537f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1538f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1539f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d mode %d\n",
1540f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->mode);
1541f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1542f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1543f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1544f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1545f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	} else {
1546f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1547f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("AFH map: 0x");
1548f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		for (i = 0; i < 10; i++)
1549f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			printf("%2.2x", rp->map[i]);
1550f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("\n");
1551f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1552f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1553f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1554f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_clock_dump(int level, struct frame *frm)
1555f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1556f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_rp *rp = frm->ptr;
1557f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1558f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1559f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n",
1560f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle),
1561f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		btohl(rp->clock), btohs(rp->accuracy));
1562f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1563f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1564f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1565f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1566f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1567f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1568f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1569d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm)
1570d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1571d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_complete *evt = frm->ptr;
1572d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1573d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
1574d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
1575d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1576d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1577d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
1578d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, evt->ncmd);
1579d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1580d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->ptr += EVT_CMD_COMPLETE_SIZE;
1581d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->len -= EVT_CMD_COMPLETE_SIZE;
1582d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
15834f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
15844f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
15854f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
15864f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
15874f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
1588d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (ogf) {
1589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
1590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
159117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_INQUIRY_CANCEL:
159217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
159317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
159417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			status_response_dump(level, frm);
159517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
159690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
159790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
1598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
1599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
1600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
1601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
1602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
160517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
1608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
1609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
1610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_response_dump(level, frm);
1611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
161317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1615d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_HOST_CTL:
1616d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
161744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_PIN_TYPE:
161844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_pin_type_dump(level, frm);
161944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
162044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
162144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_stored_link_key_dump(level, frm);
162244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
162344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
162444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_stored_link_key_dump(level, frm);
162544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
162644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
162744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			delete_stored_link_key_dump(level, frm);
162844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1629d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_NAME:
1630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_name_dump(level, frm);
1631ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1632ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLASS_OF_DEV:
1633ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_class_of_dev_dump(level, frm);
1634ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_VOICE_SETTING:
1636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_voice_setting_dump(level, frm);
1637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1638fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_READ_CURRENT_IAC_LAP:
1639fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			read_current_iac_lap_dump(level, frm);
1640fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
164169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_SCAN_ENABLE:
164269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_AUTH_ENABLE:
164369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			read_scan_enable_dump(level, frm);
164469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1645097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_READ_CONN_ACCEPT_TIMEOUT:
1646d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_TIMEOUT:
1647d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_timeout_dump(level, frm);
1648d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1649d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_ACTIVITY:
1650d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_INQ_ACTIVITY:
1651d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_activity_dump(level, frm);
1652d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1653a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_READ_INQUIRY_SCAN_TYPE:
1654a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			read_inquiry_scan_type_dump(level, frm);
1655a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
165669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_ENCRYPT_MODE:
1657f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_INQUIRY_MODE:
1658f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_AFH_MODE:
1659f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			read_inquiry_mode_dump(level, frm);
1660f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
16616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
16626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_link_supervision_timeout_dump(level, frm);
16636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
16646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
16656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_transmit_power_level_dump(level, frm);
16666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
16671a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_READ_EXT_INQUIRY_RESPONSE:
16681a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			read_ext_inquiry_response_dump(level, frm);
16691a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
167044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
16716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
16726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_response_dump(level, frm);
16736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
167444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
167544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
167644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
167744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
167844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
16791577526370e596583b15d68940c24e975e62a502Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1680f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1681f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1682fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
168369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
168469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
168569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1686097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1687d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1688d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1689d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1690a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1691fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1692fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_AFH_MODE:
1693d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_SET_AFH_CLASSIFICATION:
16941a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
1695d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			status_response_dump(level, frm);
1696ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1697d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
169817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1699d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1700d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_INFO_PARAM:
1701d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1702d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_VERSION:
1703ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_version_dump(level, frm);
1704ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
170517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_COMMANDS:
170617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_commands_dump(level, frm);
170717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1708d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_FEATURES:
1709ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_features_dump(level, frm);
1710ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
171117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
171217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_ext_features_dump(level, frm);
171317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1714d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BUFFER_SIZE:
1715ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_buffer_size_dump(level, frm);
1716ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1717d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BD_ADDR:
1718ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1719ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1720d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
172117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1722d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1723d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_STATUS_PARAM:
1724d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1725d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_FAILED_CONTACT_COUNTER:
1726d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_RESET_FAILED_CONTACT_COUNTER:
1727f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			status_response_dump(level, frm);
1728f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1729d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LINK_QUALITY:
1730f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_link_quality_dump(level, frm);
1731f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1732d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_RSSI:
1733f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_rssi_dump(level, frm);
1734f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1735d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_AFH_MAP:
1736f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_afh_map_dump(level, frm);
1737f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1738d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_CLOCK:
1739f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_clock_dump(level, frm);
1740ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1741d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
174217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1743d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1744ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1745ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1746d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1747d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1748d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm)
1749d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1750d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_status *evt = frm->ptr;
1751d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1752d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1753d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1754d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
1755d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode),
1756d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_opcode_ogf(opcode), cmd_opcode_ocf(opcode),
1757d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, evt->ncmd);
1758d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1759d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1760d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1761d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1762d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1763d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1764d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1765afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void hardware_error_dump(int level, struct frame *frm)
1766afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1767afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	evt_hardware_error *evt = frm->ptr;
1768afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1769afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1770afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("code %d\n", evt->code);
1771afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1772afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1773d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm)
1774d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1775d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
1776b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
1777d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1778d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1779d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < num; i++) {
1780d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inquiry_info *info = frm->ptr;
1781d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1782d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		ba2str(&info->bdaddr, addr);
1783d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1784d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
178572e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n",
178672e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
178772e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0]);
1788d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1789d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->ptr += INQUIRY_INFO_SIZE;
1790d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->len -= INQUIRY_INFO_SIZE;
1791d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1792d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1793d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1794d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm)
1795d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1796d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_complete *evt = frm->ptr;
1797d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1798d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1799d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1800d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1801d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1802d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
1803d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), addr,
1804d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode);
1805d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1806d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1807d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1808d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1809d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1810d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1811d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1812d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm)
1813d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1814d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_request *evt = frm->ptr;
1815d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1816d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1817d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1818d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1819d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1820d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
1821d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		addr, evt->dev_class[2], evt->dev_class[1],
1822d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO");
1823d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1824d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1825d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm)
1826d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1827d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_disconn_complete *evt = frm->ptr;
1828d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1829d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1830d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
1831d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->reason);
1832d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1833d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1834d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1835d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1836d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	} else if (evt->reason > 0) {
1837d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1838d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Reason: %s\n", status2str(evt->reason));
1839d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1840d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1841d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1842d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm)
1843d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1844d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_remote_name_req_complete *evt = frm->ptr;
1845d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18], name[249];
1846d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1847d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1848d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1849d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1850d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	memset(name, 0, sizeof(name));
1851d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < 248 && evt->name[i]; i++)
1852d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		if (isprint(evt->name[i]))
1853d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = evt->name[i];
1854d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		else
1855d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = '.';
1856d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1857d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1858d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name);
1859d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1860d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1861d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1862d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1863d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1864d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1865d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
186617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_complete_dump(int level, struct frame *frm)
186717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
186817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_master_link_key_complete *evt = frm->ptr;
186917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
187017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
187117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d flag %d\n",
187217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->status, btohs(evt->handle), evt->key_flag);
187317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
187417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
187517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
187617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
187717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
187817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
187917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1880d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm)
1881d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1882d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_encrypt_change *evt = frm->ptr;
1883d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1884d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1885d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
1886d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->encrypt);
1887d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1888d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1889d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1890d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1891d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1892d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1893d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1894ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm)
1895ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1896ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_features_complete *evt = frm->ptr;
1897ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1898ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1899ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1900ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
1901ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1902ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1903ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1904ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1905ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1906ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1907ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
1908ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
1909ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
1910ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
1911ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1912ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1913ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1914ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm)
1915ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1916ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_version_complete *evt = frm->ptr;
1917ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(evt->manufacturer);
1918ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1919ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1920ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
1921ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1922ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1923ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1924ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1925ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1926ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1927ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
1928ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(evt->lmp_ver), evt->lmp_ver,
1929ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(evt->lmp_subver));
1930ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1931ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
1932ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
1933ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1934ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1935ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
193611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void qos_setup_complete_dump(int level, struct frame *frm)
193711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
193811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_qos_setup_complete *evt = frm->ptr;
193911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
194011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
194111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("status 0x%2.2x handle %d flags %d\n",
194211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		evt->status, btohs(evt->handle), evt->flags);
194311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
194411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	if (evt->status > 0) {
194511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
194611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Error: %s\n", status2str(evt->status));
194711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	} else {
194811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
194911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
195011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
195111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
195211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
195311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
195411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
195511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
195611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
195711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
195811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	}
195911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
196011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
1961ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm)
1962ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1963ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_role_change *evt = frm->ptr;
1964ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1965ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1966ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1967ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1968ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
1969ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, addr, evt->role);
1970ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1971ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1972ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1973ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1974ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1975ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1976ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Role: %s\n", role2str(evt->role));
1977ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1978ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1979ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1980ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm)
1981ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1982ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t num = get_u8(frm);
19832374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann	uint16_t handle, packets;
1984ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1985ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1986ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < num; i++) {
19872374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		handle = btohs(htons(get_u16(frm)));
19882374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		packets = btohs(htons(get_u16(frm)));
19892374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann
19902374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		p_indent(level, frm);
19912374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		printf("handle %d packets %d\n", handle, packets);
1992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1993ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm)
1996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1997ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_mode_change *evt = frm->ptr;
1998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1999ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",
2001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));
2002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2003ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2004ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2005ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2006ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2007ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2008ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Mode: %s\n", mode2str(evt->mode));
2009ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2010ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2011ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2012ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm)
2013ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2014ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_pin_code_req *evt = frm->ptr;
2015ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2016ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2017ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2018ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
2019ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
2020ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2021ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2022ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm)
2023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2024ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_link_key_notify *evt = frm->ptr;
2025ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2026ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2027ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2028ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2029ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
203044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
2031ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
203244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2X", evt->link_key[i]);
203344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf(" type %d\n", evt->key_type);
2034ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2035ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
203611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void max_slots_change_dump(int level, struct frame *frm)
203711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
203811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_max_slots_change *evt = frm->ptr;
203911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
204011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
204111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);
204211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
204311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
2044c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmannstatic inline void data_buffer_overflow_dump(int level, struct frame *frm)
2045c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann{
2046c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	evt_data_buffer_overflow *evt = frm->ptr;
2047c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2048c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	p_indent(level, frm);
2049c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO");
2050c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann}
2051c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2052ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm)
2053ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2054ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_clock_offset_complete *evt = frm->ptr;
2055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2056ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2057ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",
2058ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), btohs(evt->clock_offset));
2059ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2064ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm)
2067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2068ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_conn_ptype_changed *evt = frm->ptr;
2069ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(evt->ptype);
2070ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
2071ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
2074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), ptype);
2075ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2080ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		str = hci_ptypetostr(ptype);
2081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (str) {
2082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			p_indent(level, frm);
2083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf("Packet type: %s\n", str);
2084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			free(str);
2085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
2086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
208911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void pscan_rep_mode_change_dump(int level, struct frame *frm)
209011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
209111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_pscan_rep_mode_change *evt = frm->ptr;
209211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	char addr[18];
209311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
209411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
209511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	ba2str(&evt->bdaddr, addr);
209611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);
209711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
2098ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2099f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmannstatic inline void flow_spec_complete_dump(int level, struct frame *frm)
2100f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann{
2101f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	evt_flow_spec_complete *evt = frm->ptr;
2102f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2103f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	p_indent(level, frm);
2104f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	printf("status 0x%2.2x handle %d flags %d %s\n",
2105f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		evt->status, btohs(evt->handle), evt->flags,
2106f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		evt->direction == 0 ? "outgoing" : "incoming");
2107f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2108f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	if (evt->status > 0) {
2109f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2110f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2111f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	} else {
2112f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2113f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
2114f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2115f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
2116f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2117f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
2118f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2119f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
2120f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2121f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
2122f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	}
2123f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann}
2124f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2125d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm)
2126d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
2127d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
2128b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
2129d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
2130d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2131ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (!num)
2132ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		return;
2133d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2134ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
2135ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2136ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr;
2137d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2138ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2139d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2140ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			ba2str(&info->bdaddr, addr);
2141ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2142ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2143ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2144ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2145ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2146ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2147ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2148ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	} else {
2149ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2150ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi *info = frm->ptr;
2151ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2152ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2153ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2154ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			ba2str(&info->bdaddr, addr);
2155ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2156ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2157ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2158ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2159ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
2160ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
2161ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2162d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2163d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
2164d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
216517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_complete_dump(int level, struct frame *frm)
216617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
216717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_read_remote_ext_features_complete *evt = frm->ptr;
216817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
216917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
217017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
217117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d page %d max %d\n",
217217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->status, btohs(evt->handle),
217317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->page_num, evt->max_page_num);
217417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
217517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
217617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
217717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
217817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
217917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
218017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
218117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
218217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
218317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
218417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
218517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
218617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
2187d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_complete_dump(int level, struct frame *frm)
2188d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2189d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_complete *evt = frm->ptr;
2190d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	char addr[18];
2191d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2192d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	ba2str(&evt->bdaddr, addr);
2193d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2194d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2195d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s\n",
2196d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->status, btohs(evt->handle), addr,
2197d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->link_type == 0 ? "SCO" : "eSCO");
2198d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2199d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2200d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2201d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2202d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	} else {
2203d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2204d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Air mode: %s\n", airmode2str(evt->air_mode));
2205d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2206d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2207d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2208d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_changed_dump(int level, struct frame *frm)
2209d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2210d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_changed *evt = frm->ptr;
2211d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2212d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2213d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	printf("status 0x%2.2x handle %d\n",
2214d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->status, btohs(evt->handle));
2215d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2216d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2217d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2218d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2219d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2220d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2221d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2222807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmannstatic inline void extended_inq_result_dump(int level, struct frame *frm)
2223807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann{
2224807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	uint8_t num = get_u8(frm);
2225807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	char addr[18];
2226807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	int i;
2227807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2228807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	for (i = 0; i < num; i++) {
2229807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inquiry_info *info = frm->ptr;
2230807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2231807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		ba2str(&info->bdaddr, addr);
2232807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2233807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		p_indent(level, frm);
223427eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2235807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
223627eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
223727eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
223827eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
223927eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
224027eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
224127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		raw_dump(level, frm);
2242807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
224327eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->ptr += EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE;
224427eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->len -= EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE;
2245807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	}
2246807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann}
2247807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
224865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm)
224995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2250174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_event_hdr *hdr = frm->ptr;
2251be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	uint8_t event = hdr->evt;
225265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
225365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (p_filter(FILT_HCI))
225465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		return;
225565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2256ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
225795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2258d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (event <= EVENT_NUM) {
2259803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: %s (0x%2.2x) plen %d\n",
2260d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			event_str[hdr->evt], hdr->evt, hdr->plen);
2261be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_TESTING) {
2262803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
2263be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_VENDOR) {
2264803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
2265be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (get_manufacturer() == 10) {
2266be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->ptr += HCI_EVENT_HDR_SIZE;
2267be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->len -= HCI_EVENT_HDR_SIZE;
2268be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			csr_dump(level + 1, frm);
2269be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			return;
2270be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
2271be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else
227266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
227365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
227465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_EVENT_HDR_SIZE;
227565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_EVENT_HDR_SIZE;
227665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2277be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (event == EVT_CMD_COMPLETE) {
2278be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		evt_cmd_complete *cc = frm->ptr;
2279be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {
2280be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;
2281be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			manufacturer = rp->manufacturer;
2282be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
2283be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
2284be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
228525554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	if (event == EVT_DISCONN_COMPLETE) {
228625554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		evt_disconn_complete *evt = frm->ptr;
228725554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		l2cap_clear(btohs(evt->handle));
228825554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	}
228925554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann
2290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
2291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
2293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (event) {
2296ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann	case EVT_LOOPBACK_COMMAND:
2297ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		command_dump(level + 1, frm);
2298ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
2299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_COMPLETE:
2300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_complete_dump(level + 1, frm);
2301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2302d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_STATUS:
2303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_status_dump(level + 1, frm);
2304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2305afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_HARDWARE_ERROR:
2306afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		hardware_error_dump(level + 1, frm);
2307afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2308afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_FLUSH_OCCURRED:
2309f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_QOS_VIOLATION:
2310afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		handle_response_dump(level + 1, frm);
2311afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_COMPLETE:
2313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		status_response_dump(level + 1, frm);
2314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT:
2316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_dump(level + 1, frm);
2317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_COMPLETE:
2319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_complete_dump(level + 1, frm);
2320d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_REQUEST:
2322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_request_dump(level + 1, frm);
2323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_DISCONN_COMPLETE:
2325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		disconn_complete_dump(level + 1, frm);
2326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_AUTH_COMPLETE:
2328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
2329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		generic_response_dump(level + 1, frm);
2330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
233117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_MASTER_LINK_KEY_COMPLETE:
233217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		master_link_key_complete_dump(level + 1, frm);
233317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_REMOTE_NAME_REQ_COMPLETE:
2335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		remote_name_req_complete_dump(level + 1, frm);
2336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_ENCRYPT_CHANGE:
2338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		encrypt_change_dump(level + 1, frm);
2339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2340ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_FEATURES_COMPLETE:
2341ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_features_complete_dump(level + 1, frm);
2342ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2343ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_VERSION_COMPLETE:
2344ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_version_complete_dump(level + 1, frm);
2345ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2346ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_QOS_SETUP_COMPLETE:
234711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		qos_setup_complete_dump(level + 1, frm);
2348ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2349ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_ROLE_CHANGE:
2350ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		role_change_dump(level + 1, frm);
2351ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2352ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_NUM_COMP_PKTS:
2353ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		num_comp_pkts_dump(level + 1, frm);
2354ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2355ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_MODE_CHANGE:
2356ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		mode_change_dump(level + 1, frm);
2357ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2358b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	case EVT_RETURN_LINK_KEYS:
2359b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		return_link_keys_dump(level + 1, frm);
2360b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		break;
2361ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_PIN_CODE_REQ:
2362ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_REQ:
2363ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		pin_code_req_dump(level + 1, frm);
2364ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2365ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_NOTIFY:
2366ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		link_key_notify_dump(level + 1, frm);
2367ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2368c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	case EVT_DATA_BUFFER_OVERFLOW:
2369c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		data_buffer_overflow_dump(level + 1, frm);
2370c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		break;
237111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_MAX_SLOTS_CHANGE:
237211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		max_slots_change_dump(level + 1, frm);
237311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2374ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_CLOCK_OFFSET_COMPLETE:
2375ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_clock_offset_complete_dump(level + 1, frm);
2376ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2377ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_CONN_PTYPE_CHANGED:
2378ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		conn_ptype_changed_dump(level + 1, frm);
2379ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
238011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_PSCAN_REP_MODE_CHANGE:
238111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		pscan_rep_mode_change_dump(level + 1, frm);
238211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2383f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_FLOW_SPEC_COMPLETE:
2384f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		flow_spec_complete_dump(level + 1, frm);
2385f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		break;
2386d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT_WITH_RSSI:
2387d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_with_rssi_dump(level + 1, frm);
2388d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
238917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:
239017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		read_remote_ext_features_complete_dump(level + 1, frm);
239117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2392d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_COMPLETE:
2393d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_complete_dump(level + 1, frm);
2394d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2395d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_CHANGED:
2396d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_changed_dump(level + 1, frm);
2397d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2398807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	case EVT_EXTENDED_INQUIRY_RESULT:
2399807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inq_result_dump(level + 1, frm);
2400807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		break;
2401d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	default:
2402d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2403d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2404d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
240595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
240695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
240765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm)
240895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2409174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_acl_hdr *hdr = (void *) frm->ptr;
24100d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
24110d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t dlen = btohs(hdr->dlen);
24120d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t flags = acl_flags(handle);
241365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
241465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (!p_filter(FILT_HCI)) {
2415ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2416d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",
241765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			acl_handle(handle), flags, dlen);
241865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		level++;
241965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	}
2420e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2421e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->ptr += HCI_ACL_HDR_SIZE;
2422e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->len -= HCI_ACL_HDR_SIZE;
2423f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->flags  = flags;
2424f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->handle = acl_handle(handle);
242565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
242665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (parser.filter & ~FILT_HCI)
242765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		l2cap_dump(level, frm);
242865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	else
242965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
243095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
243195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2432d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm)
2433d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{
2434d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	hci_sco_hdr *hdr = (void *) frm->ptr;
24350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
2436d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2437d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	if (!p_filter(FILT_SCO)) {
2438ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2439d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("SCO data: handle %d dlen %d\n",
2440d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky			acl_handle(handle), hdr->dlen);
2441d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		level++;
2442d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2443d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->ptr += HCI_SCO_HDR_SIZE;
2444d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->len -= HCI_SCO_HDR_SIZE;
2445d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		raw_dump(level, frm);
2446d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	}
2447d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky}
2448d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2449b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm)
2450b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{
2451b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (p_filter(FILT_HCI))
2452b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2453b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
245438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	if (frm->dev_id == HCI_DEV_NONE) {
2455a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann		uint16_t device = btohs(htons(get_u16(frm)));
245638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t type = btohs(htons(get_u16(frm)));
245738acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t plen = btohs(htons(get_u16(frm)));
245838acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
245938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		p_indent(level, frm);
246038acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
2461a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann		printf("System %s: device hci%d type 0x%2.2x plen %d\n",
2462a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann			frm->in ? "event" : "command", device, type, plen);
246338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
246438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		raw_dump(level, frm);
246538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		return;
246638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	}
246738acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
2468b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (get_manufacturer() == 12) {
2469b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		bpa_dump(level, frm);
2470b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2471b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	}
2472b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
2473b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	p_indent(level, frm);
2474b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	printf("Vendor data: len %d\n", frm->len);
2475b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	raw_dump(level, frm);
2476b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann}
2477b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
2478174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm)
247995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2480d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t type = *(uint8_t *)frm->ptr;
248195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2482174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	frm->ptr++; frm->len--;
2483e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
248495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	switch (type) {
248595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_COMMAND_PKT:
248665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		command_dump(level, frm);
248795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
248895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
248995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_EVENT_PKT:
249065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		event_dump(level, frm);
249195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
249295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
249395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_ACLDATA_PKT:
249465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		acl_dump(level, frm);
249595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
249695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2497d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	case HCI_SCODATA_PKT:
2498d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		sco_dump(level, frm);
2499d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		break;
2500e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2501b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	case HCI_VENDOR_PKT:
2502b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		vendor_dump(level, frm);
2503b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		break;
2504b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
250595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	default:
250665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		if (p_filter(FILT_HCI))
250765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			break;
250865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2509ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2510174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
251165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
251295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
251395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	}
251495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
2515