hci.c revision d6821ff2b800acae15702935d84a0b3cbbf04c6c
195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/*
2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
3aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann *  BlueZ - Bluetooth protocol stack for Linux
4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Copyright (C) 2000-2002  Maxim Krasnyansky <maxk@qualcomm.com>
6fa3dc8fee8b3525e53b8b2513b57abfc8bf93927Marcel Holtmann *  Copyright (C) 2003-2006  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
21aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
2395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky */
2495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
25aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#ifdef HAVE_CONFIG_H
26aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <config.h>
27aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#endif
28aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann
2995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdio.h>
30e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#include <errno.h>
31d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#include <ctype.h>
3295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <unistd.h>
33aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <stdlib.h>
3495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <string.h>
3595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/types.h>
370d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <sys/socket.h>
380d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <netinet/in.h>
3995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
4095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/bluetooth.h>
4195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/hci.h>
42ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann#include <bluetooth/hci_lib.h>
4395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
4495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include "parser.h"
4595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
46be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic uint16_t manufacturer = DEFAULT_COMPID;
47be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
48be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic inline uint16_t get_manufacturer(void)
49be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann{
50be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer);
51be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann}
52be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
53d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann#define EVENT_NUM 55
5413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *event_str[EVENT_NUM + 1] = {
5566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Unknown",
5666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Complete",
5766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Result",
5866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Complete",
5966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Request",
6066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Disconn Complete",
6166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Auth Complete",
6266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Remote Name Req Complete",
63d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	"Encrypt Change",
6466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Change Connection Link Key Complete",
6566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Master Link Key Complete",
6666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Supported Features",
6766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Ver Info Complete",
6866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Setup Complete",
6966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Complete",
7066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Status",
7166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Hardware Error",
7266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Flush Occurred",
7366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Role Change",
7466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Number of Completed Packets",
7566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Mode Change",
7666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Return Link Keys",
7766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"PIN Code Request",
7866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Request",
7966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Notification",
8066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Loopback Command",
8166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Data Buffer Overflow",
8266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Max Slots Change",
8366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Clock Offset Complete",
8466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connection Packet Type Changed",
8566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Violation",
8666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Page Scan Mode Change",
87328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Page Scan Repetition Mode Change",
88328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Flow Specification Complete",
89328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Inquiry Result with RSSI",
90328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
91328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
92328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
93328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
94328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
95328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
96328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
97328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
98328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
99328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Synchronous Connect Complete",
1001a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Synchronous Connect Changed",
101120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	"Sniff Subrate",
1021a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Extended Inquiry Result",
103d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Unknown",
104d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Unknown",
105d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Unknown",
106d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Unknown",
107d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Unknown",
108d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Unknown",
109d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Unknown",
110d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	"Link Supervision Timeout Change",
11166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky};
1122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
11313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_LINKCTL_NUM 41
11413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkctl_str[CMD_LINKCTL_NUM + 1] = {
1152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry",
1172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry Cancel",
1182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Periodic Inquiry Mode",
1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Periodic Inquiry Mode",
1202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create Connection",
1212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Disconnect",
1222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Add SCO Connection",
123328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Create Connection Cancel",
1242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Accept Connection Request",
1252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reject Connection Request",
1262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Reply",
1272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Negative Reply",
1282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Reply",
1292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Negative Reply",
1302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Packet Type",
131f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Authentication Requested",
133f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Connection Encryption",
135f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1362bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Link Key",
137f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1382bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Master Link Key",
139f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1402bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Remote Name Request",
141328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Remote Name Request Cancel",
1422bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Supported Features",
143328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
1442bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Version Information",
145f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
146328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Clock Offset",
147328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read LMP Handle"
148328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
149328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
150328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
151328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
152328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
153328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
154328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
155328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Setup Synchronous Connection",
156328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Accept Synchronous Connection",
1571a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Reject Synchronous Connection",
1582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
1592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
160120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann#define CMD_LINKPOL_NUM 17
16113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkpol_str[CMD_LINKPOL_NUM + 1] = {
1622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Hold Mode",
164f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Sniff Mode",
1662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Sniff Mode",
167328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Park State",
168328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Exit Park State",
1692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"QoS Setup",
170f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Role Discovery",
172f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Switch Role",
1742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Policy Settings",
175328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Link Policy Settings",
176328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Default Link Policy Settings",
177328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Default Link Policy Settings",
1781a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Flow Specification",
179120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	"Sniff Subrate",
1802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
1812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
18213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_HOSTCTL_NUM 82
18313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_hostctl_str[CMD_HOSTCTL_NUM + 1] = {
1842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Mask",
186f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset",
188f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Filter",
190f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
191f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Flush",
1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read PIN Type ",
1942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write PIN Type",
1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create New Unit Key",
196f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Stored Link Key",
198f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
199f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
200f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Stored Link Key",
2022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Delete Stored Link Key",
203328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Local Name",
2042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Name",
2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Connection Accept Timeout",
2062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Connection Accept Timeout",
2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Timeout",
2082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Timeout",
2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Scan Enable",
2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Scan Enable",
2112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Activity",
2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Activity",
2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Inquiry Scan Activity",
2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Inquiry Scan Activity",
2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Authentication Enable",
2162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Authentication Enable",
2172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Encryption Mode",
2182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Encryption Mode",
2192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Class of Device",
2202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Class of Device",
2212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Voice Setting",
2222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Voice Setting",
2232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Automatic Flush Timeout",
2242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Automatic Flush Timeout",
2252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Num Broadcast Retransmissions",
2262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Num Broadcast Retransmissions",
2272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Hold Mode Activity ",
2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Hold Mode Activity",
2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Transmit Power Level",
230328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Synchronous Flow Control Enable",
231328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Synchronous Flow Control Enable",
232f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Host Controller To Host Flow Control",
234f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2352bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Buffer Size",
236f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2372bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Number of Completed Packets",
2382bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Supervision Timeout",
2392bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Link Supervision Timeout",
2402bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Number of Supported IAC",
2412bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Current IAC LAP",
2422bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Current IAC LAP",
2432bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Period Mode",
2442bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Period Mode",
2452bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Mode",
246328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Mode",
247328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Set AFH Host Channel Classification",
248328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
249328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
250328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Scan Type",
251328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Scan Type",
252328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Mode",
253328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Mode",
254328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Page Scan Type",
255328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Type",
256328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Assessment Mode",
2571a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write AFH Channel Assessment Mode",
2581a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Unknown",
25913acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
26013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
26113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
26213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
26313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
26413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
2651a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Extended Inquiry Response",
2661a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write Extended Inquiry Response",
2672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
26913acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_INFO_NUM 9
27013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_info_str[CMD_INFO_NUM + 1] = {
2712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Version Information",
273328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Supported Commands",
2742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Supported Features",
275328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Extended Features",
2762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Buffer Size",
277f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Country Code",
279f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2801a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read BD ADDR",
2812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
28313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_STATUS_NUM 7
28413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_status_str[CMD_STATUS_NUM + 1] = {
2852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Failed Contact Counter",
2872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset Failed Contact Counter",
288328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Link Quality",
289f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
290328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read RSSI",
291328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Map",
2921a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Clock",
2932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
29466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky
29513acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define ERROR_CODE_NUM 53
29613acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *error_code_str[ERROR_CODE_NUM + 1] = {
297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Success",
298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown HCI Command",
299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown Connection Identifier",
300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Hardware Failure",
301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Page Timeout",
302d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Authentication Failure",
303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"PIN or Key Missing",
304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Memory Capacity Exceeded",
305d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Timeout",
306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Limit Exceeded",
307d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Synchronous Connection to a Device Exceeded",
308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"ACL Connection Already Exists",
309d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Command Disallowed",
310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Limited Resources",
311d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Security Reasons",
312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Unacceptable BD_ADDR",
313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Accept Timeout Exceeded",
314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Feature or Parameter Value",
315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid HCI Command Parameters",
31660864ce9e77ec159d0914fe8d938565493f08eebMarcel Holtmann	"Remote User Terminated Connection",
317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Low Resources",
318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Power Off",
319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Terminated by Local Host",
320fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Repeated Attempts",
321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Pairing Not Allowed",
322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown LMP PDU",
323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Remote Feature / Unsupported LMP Feature",
324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Offset Rejected",
325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Interval Rejected",
326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Air Mode Rejected",
327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid LMP Parameters",
328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unspecified Error",
329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported LMP Parameter Value",
330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Change Not Allowed",
331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Response Timeout",
332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Error Transaction Collision",
333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP PDU Not Allowed",
334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Encryption Mode Not Acceptable",
335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Link Key Can Not be Changed",
336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Requested QoS Not Supported",
337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Instant Passed",
338fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Pairing with Unit Key Not Supported",
339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Different Transaction Collision",
340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Unacceptable Parameter",
342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Rejected",
343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Channel Classification Not Supported",
344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Insufficient Security",
345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Parameter out of Mandatory Range",
346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
347d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Switch Pending",
348d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
349d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved Slot Violation",
3501a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Role Switch Failed",
351d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann};
352d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
353d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *status2str(uint8_t status)
354d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
355d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char *str;
356d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
357d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status <= ERROR_CODE_NUM)
358d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = error_code_str[status];
359d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	else
360d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = "Unknown";
361d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
362d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return str;
363d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
364d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
365d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *opcode2str(uint16_t opcode)
36695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
3670d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
3680d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
3692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	char *cmd;
37095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	switch (ogf) {
3722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_INFO_PARAM:
3732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_INFO_NUM)
374d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_info_str[ocf];
3752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_HOST_CTL:
3802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_HOSTCTL_NUM)
381d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_hostctl_str[ocf];
3822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_CTL:
3872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKCTL_NUM)
388d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkctl_str[ocf];
3892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3912bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_POLICY:
3942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKPOL_NUM)
395d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkpol_str[ocf];
3962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
4002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_STATUS_PARAM:
4012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_STATUS_NUM)
402d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_status_str[ocf];
4032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
4042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
4052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
4062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
407cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_TESTING_CMD:
408cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Testing";
409cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
410cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
411cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_VENDOR_CMD:
412cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Vendor";
413cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
414cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
4152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	default:
4162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		cmd = "Unknown";
4172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
4182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	}
4192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
420d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return cmd;
421d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
422d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *role2str(uint8_t role)
424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (role) {
426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Master";
428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Slave";
430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *mode2str(uint8_t mode)
436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (mode) {
438ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Active";
440ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
441ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Hold";
442ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x02:
443ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Sniff";
444ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x03:
445ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Park";
446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
449ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
451d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic char *airmode2str(uint8_t mode)
452d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
453d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	switch (mode) {
454d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x00:
455d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "u-law log";
456d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x01:
457d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "A-law log";
458d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x02:
459d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "CVSD";
460d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x04:
461d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Transparent data";
462d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	default:
463d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Reserved";
464d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
465d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
466d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
467e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmannstatic inline void ext_inquiry_response_dump(int level, struct frame *frm)
468e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann{
469e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	void *ptr = frm->ptr;
470e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	uint32_t len = frm->len;
471e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	uint8_t type, length;
472e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	char *str;
473e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	int i;
474e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
475e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	length = get_u8(frm);
476e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
477e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	while (length > 0) {
478e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		type = get_u8(frm);
479e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		length--;
480e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
481e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		switch (type) {
482e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		case 0x08:
483e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		case 0x09:
484e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			str = malloc(length + 1);
485e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			if (str) {
486ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann				snprintf(str, length + 1, "%s", (char *) frm->ptr);
487e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				for (i = 0; i < length; i++)
488e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				if (!isprint(str[i]))
489e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann					str[i] = '.';
490e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				p_indent(level, frm);
491e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				printf("%s local name: \'%s\'\n",
492e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann					type == 0x08 ? "Shortened" : "Complete", str);
493e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				free(str);
494e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			}
495e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			break;
496e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
497e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		default:
498e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			p_indent(level, frm);
499e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			printf("Unknown type 0x%02x with %d bytes data\n",
500e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann								type, length);
501e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			break;
502e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		}
503e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
504e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		frm->ptr += length;
505e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		frm->len -= length;
506e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
507e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		length = get_u8(frm);
508e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	}
509e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
510e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	frm->ptr = ptr + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
511e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	frm->len = len + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
512e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann}
513e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void generic_command_dump(int level, struct frame *frm)
515ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
516ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
517ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
518ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
519ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d\n", handle);
520ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
521ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
522ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
523ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
52490480219be366c65e68ae8612de7a361027e751aMarcel Holtmannstatic inline void bdaddr_command_dump(int level, struct frame *frm)
52590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann{
52690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
52790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	char addr[18];
52890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
52990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->ptr += sizeof(bdaddr_t);
53090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->len -= sizeof(bdaddr_t);
53190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
53290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	p_indent(level, frm);
533bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(bdaddr, addr);
534e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	printf("bdaddr %s\n", addr);
53590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
53690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	raw_dump(level, frm);
53790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann}
53890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void inquiry_dump(int level, struct frame *frm)
540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	inquiry_cp *cp = frm->ptr;
542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void periodic_inquiry_dump(int level, struct frame *frm)
549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	periodic_inquiry_cp *cp = frm->ptr;
551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		btohs(cp->max_period), btohs(cp->min_period),
555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void create_conn_dump(int level, struct frame *frm)
559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	create_conn_cp *cp = frm->ptr;
561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], *str;
564ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
565ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
566bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&cp->bdaddr, addr);
567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n",
568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		addr, ptype, cp->role_switch,
569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
573ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
574ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
575ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
576ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
577ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
578ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void disconnect_dump(int level, struct frame *frm)
580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	disconnect_cp *cp = frm->ptr;
582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason);
585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void add_sco_dump(int level, struct frame *frm)
591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	add_sco_cp *cp = frm->ptr;
593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype);
598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void accept_conn_req_dump(int level, struct frame *frm)
608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	accept_conn_req_cp *cp = frm->ptr;
610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
613bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&cp->bdaddr, addr);
614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s role 0x%2.2x\n", addr, cp->role);
615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Role: %s\n", role2str(cp->role));
618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void reject_conn_req_dump(int level, struct frame *frm)
621ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
622ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	reject_conn_req_cp *cp = frm->ptr;
623ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
626bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&cp->bdaddr, addr);
627ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason);
628ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
629ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
631ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
632ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
633ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_reply_dump(int level, struct frame *frm)
634ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	pin_code_reply_cp *cp = frm->ptr;
636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], pin[17];
637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
638ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
639bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&cp->bdaddr, addr);
640ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(pin, 0, sizeof(pin));
641a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann	if (parser.flags & DUMP_NOVENDOR)
642a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann		memset(pin, '*', cp->pin_len);
643a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann	else
644a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann		memcpy(pin, cp->pin_code, cp->pin_len);
645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin);
646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_reply_dump(int level, struct frame *frm)
649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	link_key_reply_cp *cp = frm->ptr;
651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
654ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
655bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&cp->bdaddr, addr);
65644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
657ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
658a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann		if (parser.flags & DUMP_NOVENDOR)
659a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann			printf("**");
660a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann		else
661a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann			printf("%2.2X", cp->link_key[i]);
662ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("\n");
663ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
664ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
665ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_neg_reply_dump(int level, struct frame *frm)
666ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
667ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
668ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
669ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
670ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
671bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(bdaddr, addr);
672ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
673ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
674ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
675ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void set_conn_encrypt_dump(int level, struct frame *frm)
676ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
677ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	set_conn_encrypt_cp *cp = frm->ptr;
678ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
679ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
680ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt);
681ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
682ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
683ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void remote_name_req_dump(int level, struct frame *frm)
684ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
685ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	remote_name_req_cp *cp = frm->ptr;
686ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
687ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
688ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
689ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
690bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&cp->bdaddr, addr);
69172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann	printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n",
69272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		addr, cp->pscan_rep_mode,
69372e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
694ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
695ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
69617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_dump(int level, struct frame *frm)
69717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
69817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	master_link_key_cp *cp = frm->ptr;
69917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
70017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
70117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("flag %d\n", cp->key_flag);
70217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
70317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
70417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_dump(int level, struct frame *frm)
70517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
70617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_remote_ext_features_cp *cp = frm->ptr;
70717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
708e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	p_indent(level, frm);
709e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	printf("handle %d page %d\n", btohs(cp->handle), cp->page_num);
71017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
71117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
7129ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmannstatic inline void hold_mode_dump(int level, struct frame *frm)
7139ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann{
7149ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	hold_mode_cp *cp = frm->ptr;
7159ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
7169ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	p_indent(level, frm);
7179ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	printf("handle %d max %d min %d\n", btohs(cp->handle),
7189ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			btohs(cp->max_interval), btohs(cp->min_interval));
7199ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann}
7209ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
7219ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmannstatic inline void sniff_mode_dump(int level, struct frame *frm)
7229ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann{
7239ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	sniff_mode_cp *cp = frm->ptr;
7249ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
7259ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	p_indent(level, frm);
7269ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	printf("handle %d max %d min %d attempt %d timeout %d\n",
7279ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		btohs(cp->handle), btohs(cp->max_interval),
7289ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		btohs(cp->min_interval), btohs(cp->attempt), btohs(cp->timeout));
7299ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann}
7309ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
731ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_link_policy_dump(int level, struct frame *frm)
732ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
733ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_link_policy_cp *cp = frm->ptr;
734ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t policy = btohs(cp->policy);
735ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
736ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
737ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
738ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy);
739ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
740ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_lptostr(policy);
741ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
742ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
743ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Link policy: %s\n", str);
744ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
745ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
746ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
747ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
748120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmannstatic inline void sniff_subrate_dump(int level, struct frame *frm)
749120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann{
750120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	sniff_subrate_cp *cp = frm->ptr;
751120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
752120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	p_indent(level, frm);
753120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	printf("handle %d\n", btohs(cp->handle));
754120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
755120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	p_indent(level, frm);
756f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann	printf("max latency %d\n", btohs(cp->max_latency));
757120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
758120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	p_indent(level, frm);
759120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	printf("min timeout remote %d local %d\n",
760120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		btohs(cp->min_remote_timeout), btohs(cp->min_local_timeout));
761120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann}
762120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
76344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_mask_dump(int level, struct frame *frm)
76444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
76544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_mask_cp *cp = frm->ptr;
76644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i;
76744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
76844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
76944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("Mask: 0x");
77044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (i = 0; i < 8; i++)
77144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2x", cp->mask[i]);
77244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("\n");
77344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
77444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
77544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_flt_dump(int level, struct frame *frm)
77644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
77744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_flt_cp *cp = frm->ptr;
778cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann	uint8_t dev_class[3], dev_mask[3];
779cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann	char addr[18];
78044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
78144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
782662fd6cd30f3adbfef7c39e2bfcfb1107d96ebbbMarcel Holtmann	printf("type %d condition %d\n", cp->flt_type,
783662fd6cd30f3adbfef7c39e2bfcfb1107d96ebbbMarcel Holtmann				(cp->flt_type == 0) ? 0 : cp->cond_type);
78444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
78544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	switch (cp->flt_type) {
78644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CLEAR_ALL:
78751c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann		p_indent(level, frm);
78844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Clear all filters\n");
78944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
79044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_INQ_RESULT:
79151c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann		p_indent(level, frm);
79244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Inquiry result");
79344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
79444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_ALL:
795cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			printf(" for all devices\n");
796cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			break;
79744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_CLASS:
798cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			memcpy(dev_class, cp->condition, 3);
799cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			memcpy(dev_mask, cp->condition + 3, 3);
800cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			printf(" with class 0x%2.2x%2.2x%2.2x mask 0x%2.2x%2.2x%2.2x\n",
801cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann				dev_class[2], dev_class[1], dev_class[0],
802cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann				dev_mask[2], dev_mask[1], dev_mask[0]);
803cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			break;
80444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_BDADDR:
805bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann			p_ba2str((bdaddr_t *) cp->condition, addr);
806cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			printf(" with bdaddr %s\n", addr);
807cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann			break;
80844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
80944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
81044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
81144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
81244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
81344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CONN_SETUP:
81451c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann		p_indent(level, frm);
81544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Connection setup");
81644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
81744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_ALL:
81844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_CLASS:
81944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_BDADDR:
82044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
82144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
82244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
82344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
82444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
82544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
82644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
82744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
82844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_pin_type_dump(int level, struct frame *frm)
82944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
83044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_pin_type_cp *cp = frm->ptr;
83144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
83244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
83344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("type %d\n", cp->pin_type);
83444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
83544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
83644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void request_stored_link_key_dump(int level, struct frame *frm)
83744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
83844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_cp *cp = frm->ptr;
83944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
84044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
84144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
842bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&cp->bdaddr, addr);
84344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s all %d\n", addr, cp->read_all);
84444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
84544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
84644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void return_link_keys_dump(int level, struct frame *frm)
84744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
84844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t num = get_u8(frm);
84944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t key[16];
85044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
85144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i, n;
85244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
85344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (n = 0; n < num; n++) {
854bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann		p_ba2str(frm->ptr, addr);
85544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		memcpy(key, frm->ptr + 6, 16);
85644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
85744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
85844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("bdaddr %s key ", addr);
85944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		for (i = 0; i < 16; i++)
860a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann			if (parser.flags & DUMP_NOVENDOR)
861a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann				printf("**");
862a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann			else
863a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann				printf("%2.2X", key[i]);
86444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("\n");
86544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
86644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->ptr += 2;
86744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->len -= 2;
86844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
86944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
87044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
871ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void change_local_name_dump(int level, struct frame *frm)
872ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
873ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	change_local_name_cp *cp = frm->ptr;
874ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
875ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
876ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
877ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
878ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && cp->name[i]; i++)
879ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(cp->name[i]))
880ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = cp->name[i];
881ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
882ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
883ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
884ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
885ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("name \'%s\'\n", name);
886ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
887ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
888ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_class_of_dev_dump(int level, struct frame *frm)
889ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
890ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_class_of_dev_cp *cp = frm->ptr;
891ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
892ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
893ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("class 0x%2.2x%2.2x%2.2x\n",
894120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
895ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
896ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
897ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_voice_setting_dump(int level, struct frame *frm)
898ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
899ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_voice_setting_cp *cp = frm->ptr;
900ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
901ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
902ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));
903ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
904ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
905fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void write_current_iac_lap_dump(int level, struct frame *frm)
906fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
907fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	write_current_iac_lap_cp *cp = frm->ptr;
908fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
909fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
910fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < cp->num_current_iac; i++) {
911fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
912fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]);
913fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) {
914fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (cp->lap[i][0]) {
915fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
916fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
917fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
918fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
919fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
920fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
921fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
922fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
923fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
924fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
925fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
926fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
92769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void write_scan_enable_dump(int level, struct frame *frm)
92869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
92969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
93069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
93169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
93269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("enable %d\n", enable);
93369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
93469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
935d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_timeout_dump(int level, struct frame *frm)
936d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
937d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_timeout_cp *cp = frm->ptr;
938d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
939d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
940d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("timeout %d\n", btohs(cp->timeout));
941d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
942d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
943d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_activity_dump(int level, struct frame *frm)
944d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
945d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_activity_cp *cp = frm->ptr;
946d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
947d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
948d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window));
949d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
950d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
951a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void write_inquiry_scan_type_dump(int level, struct frame *frm)
952a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
953a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	write_inquiry_scan_type_cp *cp = frm->ptr;
954a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
955a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
956a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("type %d\n", cp->type);
957a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
958a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
959f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmannstatic inline void write_inquiry_mode_dump(int level, struct frame *frm)
960f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann{
961f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	write_inquiry_mode_cp *cp = frm->ptr;
962f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
963f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	p_indent(level, frm);
964f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	printf("mode %d\n", cp->mode);
965f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann}
966f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
9676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void write_link_supervision_timeout_dump(int level, struct frame *frm)
9686eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
9696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	write_link_supervision_timeout_cp *cp = frm->ptr;
9706eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
9716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
9726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d timeout %d\n",
973d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann				btohs(cp->handle), btohs(cp->timeout));
9746eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
9756eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
9761a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void write_ext_inquiry_response_dump(int level, struct frame *frm)
9771a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
9781a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	write_ext_inquiry_response_cp *cp = frm->ptr;
9791a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
9801a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
9811a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("fec 0x%2.2x\n", cp->fec);
982f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
983f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	frm->ptr++;
984f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	frm->len--;
985f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
986e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	ext_inquiry_response_dump(level, frm);
9871a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
9881a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
9896eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void request_transmit_power_level_dump(int level, struct frame *frm)
9906eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
9916eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_cp *cp = frm->ptr;
9926eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
9936eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
9946eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d type %d (%s)\n",
995120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					btohs(cp->handle), cp->type,
996120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					cp->type ? "maximum" : "current");
9976eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
9986eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
99917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void request_local_ext_features_dump(int level, struct frame *frm)
100017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
100117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_cp *cp = frm->ptr;
100217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
100317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
100417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("page %d\n", cp->page_num);
100517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
100617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1007f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void request_clock_dump(int level, struct frame *frm)
1008f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1009f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_cp *cp = frm->ptr;
1010f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1011f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1012f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("handle %d which %d (%s)\n",
1013120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					btohs(cp->handle), cp->which_clock,
1014120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					cp->which_clock ? "piconet" : "local");
1015f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1016f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1017d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm)
1018d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1019d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	hci_command_hdr *hdr = frm->ptr;
1020d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(hdr->opcode);
1021d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
1022d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
1023d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1024d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (p_filter(FILT_HCI))
1025d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
1026d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
10277b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
10287b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		return;
102965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
10307b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	p_indent(level, frm);
1031803752117135528b1adebf0fa045596e188a996dMarcel Holtmann	printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
1032120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				opcode2str(opcode), ogf, ocf, hdr->plen);
103365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
103465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_COMMAND_HDR_SIZE;
103565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_COMMAND_HDR_SIZE;
103665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
10377b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	if (ogf == OGF_VENDOR_CMD) {
10387b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	       	if (ocf == 0 && get_manufacturer() == 10) {
10397b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann			csr_dump(level + 1, frm);
10407b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann			return;
10417b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		}
1042be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
1043be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
10444f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
10454f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
10464f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
10474f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
10484f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
1049ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (ogf) {
1050ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
1051ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
1052ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY:
1053ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			inquiry_dump(level + 1, frm);
1054ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
1056ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			periodic_inquiry_dump(level + 1, frm);
1057ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1058ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY_CANCEL:
1059ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
1060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CREATE_CONN:
1062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			create_conn_dump(level + 1, frm);
1063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1064ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_DISCONNECT:
1065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			disconnect_dump(level + 1, frm);
1066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
106790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
106890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
106990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_ACCEPT_SYNC_CONN_REQ:
107090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			bdaddr_command_dump(level + 1, frm);
107190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			return;
1072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ADD_SCO:
1073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_PTYPE:
1074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			add_sco_dump(level + 1, frm);
1075acc2322e0bed89e8ada2564359a1a6d293c9d514Marcel Holtmann			return;
1076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ACCEPT_CONN_REQ:
1077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
1078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REJECT_CONN_REQ:
108090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REJECT_SYNC_CONN_REQ:
1081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			reject_conn_req_dump(level + 1, frm);
1082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
1084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_reply_dump(level + 1, frm);
1085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
1087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			link_key_reply_dump(level + 1, frm);
1088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
1090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
1091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_neg_reply_dump(level + 1, frm);
1092ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1093ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_ENCRYPT:
1094ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			set_conn_encrypt_dump(level + 1, frm);
1095ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1096ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_AUTH_REQUESTED:
1097ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_CONN_LINK_KEY:
1098ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_FEATURES:
1099ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_VERSION:
1100ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLOCK_OFFSET:
110190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_READ_LMP_HANDLE:
110290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_SETUP_SYNC_CONN:
1103ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
1104ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
110517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_MASTER_LINK_KEY:
110617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			master_link_key_dump(level + 1, frm);
110717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
110817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_REMOTE_EXT_FEATURES:
110917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_remote_ext_features_dump(level + 1, frm);
111017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1111ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REMOTE_NAME_REQ:
1112ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			remote_name_req_dump(level + 1, frm);
1113ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1114ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1115ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1116ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1117ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
1118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
11199ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		case OCF_HOLD_MODE:
11209ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		case OCF_PARK_MODE:
11219ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			hold_mode_dump(level + 1, frm);
11229ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			return;
11239ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		case OCF_SNIFF_MODE:
11249ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			sniff_mode_dump(level + 1, frm);
11259ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			return;
1126ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_SNIFF_MODE:
1127ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PARK_MODE:
1128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ROLE_DISCOVERY:
1129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_LINK_POLICY:
1130ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
1131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SWITCH_ROLE:
1133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
1134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
1136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_link_policy_dump(level + 1, frm);
1137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1138120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		case OCF_SNIFF_SUBRATE:
1139120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			sniff_subrate_dump(level + 1, frm);
1140120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			return;
1141ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1142ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1143ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1144ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_HOST_CTL:
1145ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
114644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
114744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
114844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
114944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
115044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_mask_dump(level + 1, frm);
115144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
115244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
115344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_flt_dump(level + 1, frm);
115444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
115544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
115644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_pin_type_dump(level + 1, frm);
115744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
115844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
115944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
116044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			request_stored_link_key_dump(level + 1, frm);
116144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
116244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
116344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return_link_keys_dump(level + 1, frm);
116444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1165ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1166ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			change_local_name_dump(level + 1, frm);
1167ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1168ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1169ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_class_of_dev_dump(level + 1, frm);
1170ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1171ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1172ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_voice_setting_dump(level + 1, frm);
1173ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1174fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
1175fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			write_current_iac_lap_dump(level + 1, frm);
1176fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
117769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
117869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
117969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			write_scan_enable_dump(level + 1, frm);
118069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1181097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1182d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1183d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_timeout_dump(level + 1, frm);
1184d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1185d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1186d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1187d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_activity_dump(level + 1, frm);
1188d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1189a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1190a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			write_inquiry_scan_type_dump(level + 1, frm);
1191a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
119269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1193f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1194f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_AFH_MODE:
1195f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			write_inquiry_mode_dump(level + 1, frm);
1196f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
11976eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
11986eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			request_transmit_power_level_dump(level + 1, frm);
11996eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
120044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
12016eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
12026eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_command_dump(level + 1, frm);
12036eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
12046eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
12056eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			write_link_supervision_timeout_dump(level + 1, frm);
12066eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
12071a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
12081a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			write_ext_inquiry_response_dump(level + 1, frm);
12091a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
1210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1211ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
121217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
121317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case OGF_INFO_PARAM:
121417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		switch (ocf) {
121517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
121617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			request_local_ext_features_dump(level + 1, frm);
121717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
121817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
1219ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1220f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1221f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	case OGF_STATUS_PARAM:
1222f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		switch (ocf) {
1223f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_LINK_QUALITY:
1224f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_RSSI:
1225f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_AFH_MAP:
1226f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			generic_command_dump(level + 1, frm);
1227f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1228f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_CLOCK:
1229f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			request_clock_dump(level + 1, frm);
1230f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1231f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		}
1232f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		break;
1233ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
123565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	raw_dump(level, frm);
123695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
123795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1238d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm)
1239d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1240d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1241d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1242d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1243d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x\n", status);
1244d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1245d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1246d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1247d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1248d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1249d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1250d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1251d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1252d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1253afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void handle_response_dump(int level, struct frame *frm)
1254afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1255afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1256afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1257afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1258afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("handle %d\n", handle);
1259afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1260afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	raw_dump(level, frm);
1261afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1262afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1263ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm)
1264ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1265ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t status = get_u8(frm);
1266ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
1267ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1268ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1269ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->ptr += sizeof(bdaddr_t);
1270ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->len -= sizeof(bdaddr_t);
1271ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1272ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1273bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(bdaddr, addr);
1274ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s\n", status, addr);
1275ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1276ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (status > 0) {
1277ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1278ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(status));
1279ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1280ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1281ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1282ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1283ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1284d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm)
1285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1287d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d\n", status, handle);
1291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
130044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_pin_type_dump(int level, struct frame *frm)
130144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
130244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_pin_type_rp *rp = frm->ptr;
130344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
130444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
130544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type);
130644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
130744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
130844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
130944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
131044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
131144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
131244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
131344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_stored_link_key_dump(int level, struct frame *frm)
131444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
131544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_rp *rp = frm->ptr;
131644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
131744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
131844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x max %d num %d\n",
1319120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				rp->status, rp->max_keys, rp->num_keys);
132044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
132144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
132244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
132344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
132444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
132544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
132644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
132744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_stored_link_key_dump(int level, struct frame *frm)
132844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
132944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_stored_link_key_rp *rp = frm->ptr;
133044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
133144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
133244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys);
133344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
133444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
133544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
133644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
133744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
133844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
133944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
134044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void delete_stored_link_key_dump(int level, struct frame *frm)
134144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
134244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	delete_stored_link_key_rp *rp = frm->ptr;
134344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
134444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
134544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys));
134644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
134744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
134844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
134944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
135044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
135144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
135244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
1353ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm)
1354ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1355ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_name_rp *rp = frm->ptr;
1356ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
1357ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1358ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1359ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
1360ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && rp->name[i]; i++)
1361ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(rp->name[i]))
1362ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = rp->name[i];
1363ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
1364ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
1365ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1366ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1367ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x name \'%s\'\n", rp->status, name);
1368ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1369ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1370ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1371ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1372ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1373ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1374ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1375ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm)
1376ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1377ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_class_of_dev_rp *rp = frm->ptr;
1378ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1379ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1380ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
1381120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
1382ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1383ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1384ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1385ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1386ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1387ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1388ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1389ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm)
1390ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1391ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_voice_setting_rp *rp = frm->ptr;
1392ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1393ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1394ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x voice setting 0x%4.4x\n",
1395120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					rp->status, btohs(rp->voice_setting));
1396ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1397ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1398ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1399ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1400ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1401ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1402ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1403fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm)
1404fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
1405fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	read_current_iac_lap_rp *rp = frm->ptr;
1406fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
1407fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
1408fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < rp->num_current_iac; i++) {
1409fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
1410fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]);
1411fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) {
1412fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (rp->lap[i][0]) {
1413fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
1414fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
1415fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1416fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
1417fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
1418fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1419fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
1420fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
1421fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
1422fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
1423fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
1424fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
142569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void read_scan_enable_dump(int level, struct frame *frm)
142669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
142769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t status = get_u8(frm);
142869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
142969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
143069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
143169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("status 0x%2.2x enable %d\n", status, enable);
143269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
143369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	if (status > 0) {
143469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		p_indent(level, frm);
143569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		printf("Error: %s\n", status2str(status));
143669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	}
143769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
143869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
1439d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_timeout_dump(int level, struct frame *frm)
1440d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1441d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_timeout_rp *rp = frm->ptr;
1442d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1443d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1444d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout));
1445d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1446d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1447d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1448d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1449d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1450d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1451d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1452d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_activity_dump(int level, struct frame *frm)
1453d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1454d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_activity_rp *rp = frm->ptr;
1455d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1456d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1457d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x interval %d window %d\n",
1458120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			rp->status, btohs(rp->interval), btohs(rp->window));
1459d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1460d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1461d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1462d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1463d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1464d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1465d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1466a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void read_inquiry_scan_type_dump(int level, struct frame *frm)
1467a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
1468a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	read_inquiry_scan_type_rp *rp = frm->ptr;
1469a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1470a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
1471a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->type);
1472a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1473a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	if (rp->status > 0) {
1474a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		p_indent(level, frm);
1475a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1476a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	}
1477a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
1478a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
14796eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_inquiry_mode_dump(int level, struct frame *frm)
14806eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
14816eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_inquiry_mode_rp *rp = frm->ptr;
14826eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14836eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
14846eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x mode %d\n", rp->status, rp->mode);
14856eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14866eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
14876eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
14886eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
14896eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
14906eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
14916eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14926eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_link_supervision_timeout_dump(int level, struct frame *frm)
14936eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
14946eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_link_supervision_timeout_rp *rp = frm->ptr;
14956eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14966eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
14976eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d timeout %d\n",
1498d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann			rp->status, btohs(rp->handle), btohs(rp->timeout));
14996eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
15006eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
15016eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
15026eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
15036eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
15046eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
15056eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
15066eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_transmit_power_level_dump(int level, struct frame *frm)
15076eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
15086eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_rp *rp = frm->ptr;
15096eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
15106eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
15116eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d level %d\n",
1512120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				rp->status, btohs(rp->handle), rp->level);
15136eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
15146eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
15156eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
15166eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
15176eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
15186eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
15196eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
15201a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void read_ext_inquiry_response_dump(int level, struct frame *frm)
15211a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
15221a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	read_ext_inquiry_response_rp *rp = frm->ptr;
15231a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
15241a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
15251a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec);
15261a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
15271a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	if (rp->status > 0) {
15281a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		p_indent(level, frm);
15291a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1530f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	} else {
1531f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann		frm->ptr += 2;
1532f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann		frm->len -= 2;
1533f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
1534e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		ext_inquiry_response_dump(level, frm);
15351a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	}
15361a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
15371a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
1538ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm)
1539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_version_rp *rp = frm->ptr;
1541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(rp->manufacturer);
1542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
15511a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann		printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
1552120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					hci_vertostr(rp->hci_ver),
1553120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					rp->hci_ver, btohs(rp->hci_rev));
1554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
1556120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					lmp_vertostr(rp->lmp_ver),
1557120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					rp->lmp_ver, btohs(rp->lmp_subver));
1558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
1560120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				bt_compidtostr(manufacturer), manufacturer);
1561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
156417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_commands_dump(int level, struct frame *frm)
156517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
156617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_commands_rp *rp = frm->ptr;
156717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i, max = 0;
156817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
156917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
157017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
157117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
157217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
157317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
157417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
157517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
157617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 64; i++)
157717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			if (rp->commands[i])
157817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				max = i + 1;
157917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
158017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Commands: ");
158117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < (max > 32 ? 32 : max); i++)
158217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("%2.2x", rp->commands[i]);
158317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
158417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		if (max > 32) {
158517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			p_indent(level, frm);
158617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("          ");
158717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			for (i = 32; i < max; i++)
158817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				printf("%2.2x", rp->commands[i]);
158917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("\n");
159017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
159117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
159217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
159317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm)
1595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_features_rp *rp = frm->ptr;
1597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
1608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
1609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", rp->features[i]);
1610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
1611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1613ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
161417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_ext_features_dump(int level, struct frame *frm)
161517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
161617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_rp *rp = frm->ptr;
161717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
161817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
161917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
162017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x page %d max %d\n",
162117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		rp->status, rp->page_num, rp->max_page_num);
162217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
162317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
162417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
162517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
162617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
162717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
162817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
162917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
163017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			 printf(" 0x%2.2x", rp->features[i]);
163117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
163217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
163317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
163417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm)
1636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_buffer_size_rp *rp = frm->ptr;
1638ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1639ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1640ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1641ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1642ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1643ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1644ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("ACL MTU %d:%d SCO MTU %d:%d\n",
1648120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
1649120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				rp->sco_mtu, btohs(rp->sco_max_pkt));
1650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1653f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_link_quality_dump(int level, struct frame *frm)
1654f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1655f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_link_quality_rp *rp = frm->ptr;
1656f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1657f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1658f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d lq %d\n",
1659120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			rp->status, btohs(rp->handle), rp->link_quality);
1660f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1661f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1662f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1663f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1664f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1665f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1666f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1667f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_rssi_dump(int level, struct frame *frm)
1668f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1669f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_rssi_rp *rp = frm->ptr;
1670f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1671f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1672f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d rssi %d\n",
1673120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				rp->status, btohs(rp->handle), rp->rssi);
1674f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1675f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1676f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1677f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1678f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1679f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1680f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1681f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_afh_map_dump(int level, struct frame *frm)
1682f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1683f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_afh_map_rp *rp = frm->ptr;
1684f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	int i;
1685f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1686f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1687f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d mode %d\n",
1688120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				rp->status, btohs(rp->handle), rp->mode);
1689f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1690f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1691f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1692f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1693f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	} else {
1694f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1695f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("AFH map: 0x");
1696f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		for (i = 0; i < 10; i++)
1697f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			printf("%2.2x", rp->map[i]);
1698f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("\n");
1699f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1700f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1701f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1702f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_clock_dump(int level, struct frame *frm)
1703f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1704f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_rp *rp = frm->ptr;
1705f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1706f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1707f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n",
1708120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					rp->status, btohs(rp->handle),
1709120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					btohl(rp->clock), btohs(rp->accuracy));
1710f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1711f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1712f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1713f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1714f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1715f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1716f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1717d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm)
1718d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1719d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_complete *evt = frm->ptr;
1720d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1721d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
1722d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
1723d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
17247b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
17257b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		return;
17267b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann
1727d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1728d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
1729120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				opcode2str(opcode), ogf, ocf, evt->ncmd);
1730d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1731d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->ptr += EVT_CMD_COMPLETE_SIZE;
1732d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->len -= EVT_CMD_COMPLETE_SIZE;
1733d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
17344f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
17354f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
17364f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
17374f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
17384f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
1739d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (ogf) {
1740ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
1741ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
174217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_INQUIRY_CANCEL:
174317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
174417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
1745d51f2017d006ab5e9ec6f187142ae2ae1cffff8eMarcel Holtmann		case OCF_READ_REMOTE_EXT_FEATURES:
174617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			status_response_dump(level, frm);
174717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
174890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
174990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
1750ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
1751ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
1752ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
1753ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
1754ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1755ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1756ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
175717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1758ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1759ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
1760ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
1761ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
1762d5262a5f39508334f5f54a91702b064b4f7bb134Marcel Holtmann		case OCF_SNIFF_SUBRATE:
1763ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_response_dump(level, frm);
1764ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1765ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
176617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1767ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1768d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_HOST_CTL:
1769d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
177044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_PIN_TYPE:
177144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_pin_type_dump(level, frm);
177244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
177344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
177444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_stored_link_key_dump(level, frm);
177544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
177644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
177744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_stored_link_key_dump(level, frm);
177844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
177944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
178044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			delete_stored_link_key_dump(level, frm);
178144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1782d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_NAME:
1783ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_name_dump(level, frm);
1784ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1785ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLASS_OF_DEV:
1786ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_class_of_dev_dump(level, frm);
1787ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1788ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_VOICE_SETTING:
1789ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_voice_setting_dump(level, frm);
1790ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1791fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_READ_CURRENT_IAC_LAP:
1792fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			read_current_iac_lap_dump(level, frm);
1793fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
179469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_SCAN_ENABLE:
179569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_AUTH_ENABLE:
179669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			read_scan_enable_dump(level, frm);
179769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1798097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_READ_CONN_ACCEPT_TIMEOUT:
1799d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_TIMEOUT:
1800d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_timeout_dump(level, frm);
1801d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1802d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_ACTIVITY:
1803d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_INQ_ACTIVITY:
1804d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_activity_dump(level, frm);
1805d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1806a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_READ_INQUIRY_SCAN_TYPE:
1807a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			read_inquiry_scan_type_dump(level, frm);
1808a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
180969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_ENCRYPT_MODE:
1810f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_INQUIRY_MODE:
1811f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_AFH_MODE:
1812f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			read_inquiry_mode_dump(level, frm);
1813f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
18146eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
18156eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_link_supervision_timeout_dump(level, frm);
18166eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
18176eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
18186eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_transmit_power_level_dump(level, frm);
18196eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
18201a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_READ_EXT_INQUIRY_RESPONSE:
18211a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			read_ext_inquiry_response_dump(level, frm);
18221a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
182344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
18246eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
18256eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_response_dump(level, frm);
18266eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
182744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
182844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
182944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
183044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
183144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
18321577526370e596583b15d68940c24e975e62a502Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1833f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1834f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1835fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
183669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
183769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
183869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1839097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1840d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1841d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1842d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1843a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1844fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1845fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_AFH_MODE:
1846d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_SET_AFH_CLASSIFICATION:
18471a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
1848d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			status_response_dump(level, frm);
1849ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1850d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
185117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1852d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1853d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_INFO_PARAM:
1854d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1855d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_VERSION:
1856ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_version_dump(level, frm);
1857ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
185817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_COMMANDS:
185917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_commands_dump(level, frm);
186017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1861d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_FEATURES:
1862ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_features_dump(level, frm);
1863ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
186417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
186517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_ext_features_dump(level, frm);
186617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1867d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BUFFER_SIZE:
1868ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_buffer_size_dump(level, frm);
1869ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1870d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BD_ADDR:
1871ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1872ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1873d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
187417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1875d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1876d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_STATUS_PARAM:
1877d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1878d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_FAILED_CONTACT_COUNTER:
1879d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_RESET_FAILED_CONTACT_COUNTER:
1880f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			status_response_dump(level, frm);
1881f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1882d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LINK_QUALITY:
1883f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_link_quality_dump(level, frm);
1884f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1885d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_RSSI:
1886f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_rssi_dump(level, frm);
1887f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1888d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_AFH_MAP:
1889f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_afh_map_dump(level, frm);
1890f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1891d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_CLOCK:
1892f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_clock_dump(level, frm);
1893ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1894d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
189517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1896d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1897ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1898ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1899d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1900d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm)
1902d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1903d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_status *evt = frm->ptr;
1904d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
19057b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
19067b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
19077b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann
19087b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR))
19097b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		return;
1910d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1911d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1912d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
19137b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann			opcode2str(opcode), ogf, ocf, evt->status, evt->ncmd);
1914d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1915d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1916d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1917d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1918d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1919d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1920d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1921afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void hardware_error_dump(int level, struct frame *frm)
1922afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1923afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	evt_hardware_error *evt = frm->ptr;
1924afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1925afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1926afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("code %d\n", evt->code);
1927afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1928afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1929d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm)
1930d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1931d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
1932b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
1933d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1934d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1935d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < num; i++) {
1936d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inquiry_info *info = frm->ptr;
1937d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1938bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann		p_ba2str(&info->bdaddr, addr);
1939d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1940d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
194172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n",
194272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
194372e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0]);
1944d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1945d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->ptr += INQUIRY_INFO_SIZE;
1946d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->len -= INQUIRY_INFO_SIZE;
1947d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1948d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1949d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1950d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm)
1951d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1952d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_complete *evt = frm->ptr;
1953d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1954d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1955bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
1956d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1957d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1958d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
1959120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			evt->status, btohs(evt->handle), addr,
1960120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode);
1961d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1962d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1963d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1964d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1965d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1966d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1967d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1968d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm)
1969d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1970d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_request *evt = frm->ptr;
1971d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1972d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1973bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
1974d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1975d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1976d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
1977120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			addr, evt->dev_class[2], evt->dev_class[1],
1978120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann			evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO");
1979d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1980d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1981d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm)
1982d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1983d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_disconn_complete *evt = frm->ptr;
1984d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1985d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1986d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
1987120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				evt->status, btohs(evt->handle), evt->reason);
1988d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1989d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1990d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1991d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1992d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	} else if (evt->reason > 0) {
1993d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1994d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Reason: %s\n", status2str(evt->reason));
1995d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1996d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1997d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1998d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm)
1999d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
2000d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_remote_name_req_complete *evt = frm->ptr;
2001d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18], name[249];
2002d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
2003d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2004bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
2005d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2006d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	memset(name, 0, sizeof(name));
2007d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < 248 && evt->name[i]; i++)
2008d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		if (isprint(evt->name[i]))
2009d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = evt->name[i];
2010d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		else
2011d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = '.';
2012d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2013d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
2014d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name);
2015d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2016d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
2017d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
2018d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2019d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2020d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
2021d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
202217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_complete_dump(int level, struct frame *frm)
202317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
202417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_master_link_key_complete *evt = frm->ptr;
202517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
202617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
202717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d flag %d\n",
2028120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				evt->status, btohs(evt->handle), evt->key_flag);
202917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
203017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
203117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
203217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
203317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
203417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
203517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
2036d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm)
2037d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
2038d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_encrypt_change *evt = frm->ptr;
2039d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2040d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
2041d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
2042120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				evt->status, btohs(evt->handle), evt->encrypt);
2043d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2044d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
2045d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
2046d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2047d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2048d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
2049d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2050ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm)
2051ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2052ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_features_complete *evt = frm->ptr;
2053ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2054ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2056ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2057ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2058ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2059ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
2064ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
2065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
2066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
2067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2068ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2069ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2070ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm)
2071ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_version_complete *evt = frm->ptr;
2073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(evt->manufacturer);
2074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2075ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2080ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
2084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(evt->lmp_ver), evt->lmp_ver,
2085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(evt->lmp_subver));
2086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
2088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
2089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
209211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void qos_setup_complete_dump(int level, struct frame *frm)
209311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
209411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_qos_setup_complete *evt = frm->ptr;
209511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
209611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
209711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("status 0x%2.2x handle %d flags %d\n",
2098120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				evt->status, btohs(evt->handle), evt->flags);
209911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
210011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	if (evt->status > 0) {
210111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
210211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Error: %s\n", status2str(evt->status));
210311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	} else {
210411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
210511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
210611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
210711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
210811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
210911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
211011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
211111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
211211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
211311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
211411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	}
211511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
211611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
2117ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm)
2118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2119ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_role_change *evt = frm->ptr;
2120ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2121ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2122ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2123bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
2124ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
2125120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann						evt->status, addr, evt->role);
2126ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2127ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2130ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Role: %s\n", role2str(evt->role));
2133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm)
2137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2138ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t num = get_u8(frm);
21392374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann	uint16_t handle, packets;
2140ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2141ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2142ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < num; i++) {
21432374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		handle = btohs(htons(get_u16(frm)));
21442374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		packets = btohs(htons(get_u16(frm)));
21452374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann
21462374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		p_indent(level, frm);
21472374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		printf("handle %d packets %d\n", handle, packets);
2148ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2149ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2150ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2151ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm)
2152ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2153ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_mode_change *evt = frm->ptr;
2154ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2155ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2156ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",
2157ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));
2158ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2159ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2160ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2161ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2162ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2163ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2164ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Mode: %s\n", mode2str(evt->mode));
2165ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2166ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2167ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2168ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm)
2169ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2170ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_pin_code_req *evt = frm->ptr;
2171ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2172ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2173ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2174bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
2175ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
2176ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2177ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2178ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm)
2179ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2180ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_link_key_notify *evt = frm->ptr;
2181ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2182ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2183ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2184ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2185bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
218644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
2187ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
2188a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann		if (parser.flags & DUMP_NOVENDOR)
2189a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann			printf("**");
2190a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann		else
2191a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann			printf("%2.2X", evt->link_key[i]);
219244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf(" type %d\n", evt->key_type);
2193ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2194ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
219511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void max_slots_change_dump(int level, struct frame *frm)
219611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
219711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_max_slots_change *evt = frm->ptr;
219811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
219911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
220011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);
220111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
220211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
2203c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmannstatic inline void data_buffer_overflow_dump(int level, struct frame *frm)
2204c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann{
2205c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	evt_data_buffer_overflow *evt = frm->ptr;
2206c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2207c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	p_indent(level, frm);
2208c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO");
2209c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann}
2210c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2211ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm)
2212ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2213ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_clock_offset_complete *evt = frm->ptr;
2214ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2215ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2216ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",
2217ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), btohs(evt->clock_offset));
2218ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2219ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2220ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2222ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2223ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2224ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2225ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm)
2226ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_conn_ptype_changed *evt = frm->ptr;
2228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(evt->ptype);
2229ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
2230ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2231ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2232ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
2233120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				evt->status, btohs(evt->handle), ptype);
2234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2235ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2236ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2237ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2238ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2239ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		str = hci_ptypetostr(ptype);
2240ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (str) {
2241ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			p_indent(level, frm);
2242ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf("Packet type: %s\n", str);
2243ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			free(str);
2244ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
2245ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2246ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2247ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
224811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void pscan_rep_mode_change_dump(int level, struct frame *frm)
224911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
225011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_pscan_rep_mode_change *evt = frm->ptr;
225111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	char addr[18];
225211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
225311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
2254bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
225511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);
225611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
2257ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2258f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmannstatic inline void flow_spec_complete_dump(int level, struct frame *frm)
2259f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann{
2260f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	evt_flow_spec_complete *evt = frm->ptr;
2261f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2262f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	p_indent(level, frm);
2263f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	printf("status 0x%2.2x handle %d flags %d %s\n",
2264120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				evt->status, btohs(evt->handle), evt->flags,
2265120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann				evt->direction == 0 ? "outgoing" : "incoming");
2266f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2267f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	if (evt->status > 0) {
2268f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2269f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2270f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	} else {
2271f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2272f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
2273f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2274f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
2275f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2276f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
2277f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2278f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
2279f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2280f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
2281f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	}
2282f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann}
2283f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2284d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm)
2285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
2286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
2287b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
2288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
2289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2290ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (!num)
2291ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		return;
2292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2293ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
2294ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2295ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr;
2296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2297ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2299bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann			p_ba2str(&info->bdaddr, addr);
2300ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2301ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2302ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2303ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2304ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2305ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2306ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2307ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	} else {
2308ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2309ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi *info = frm->ptr;
2310ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2311ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2312ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2313bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann			p_ba2str(&info->bdaddr, addr);
2314ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2315ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2316ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2317ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2318ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
2319ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
2320ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
2323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
232417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_complete_dump(int level, struct frame *frm)
232517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
232617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_read_remote_ext_features_complete *evt = frm->ptr;
232717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
232817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
232917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
233017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d page %d max %d\n",
2331120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					evt->status, btohs(evt->handle),
2332120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					evt->page_num, evt->max_page_num);
233317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
233417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
233517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
233617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
233717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
233817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
233917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
234017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
234117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
234217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
234317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
234417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
234517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
2346d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_complete_dump(int level, struct frame *frm)
2347d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2348d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_complete *evt = frm->ptr;
2349d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	char addr[18];
2350d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2351bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann	p_ba2str(&evt->bdaddr, addr);
2352d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2353d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2354d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s\n",
2355120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					evt->status, btohs(evt->handle), addr,
2356120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					evt->link_type == 0 ? "SCO" : "eSCO");
2357d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2358d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2359d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2360d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2361d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	} else {
2362d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2363d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Air mode: %s\n", airmode2str(evt->air_mode));
2364d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2365d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2366d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2367d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_changed_dump(int level, struct frame *frm)
2368d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2369d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_changed *evt = frm->ptr;
2370d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2371d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2372120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2373d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2374d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2375d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2376d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2377d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2378d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2379d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2380120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmannstatic inline void sniff_subrate_event_dump(int level, struct frame *frm)
2381120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann{
2382120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	evt_sniff_subrate *evt = frm->ptr;
2383120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
2384120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	p_indent(level, frm);
2385120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2386120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
2387120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	if (evt->status > 0) {
2388120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		p_indent(level, frm);
2389120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2390120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	} else {
2391120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		p_indent(level, frm);
2392f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann		printf("max latency transmit %d receive %d\n",
2393f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann					btohs(evt->max_tx_latency),
2394f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann					btohs(evt->max_rx_latency));
2395120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
2396120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		p_indent(level, frm);
2397120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		printf("min timeout remote %d local %d\n",
2398120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					btohs(evt->min_remote_timeout),
2399120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					btohs(evt->min_local_timeout));
2400120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	}
2401120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann}
2402120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann
2403807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmannstatic inline void extended_inq_result_dump(int level, struct frame *frm)
2404807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann{
2405807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	uint8_t num = get_u8(frm);
2406807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	char addr[18];
2407807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	int i;
2408807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2409807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	for (i = 0; i < num; i++) {
2410807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inquiry_info *info = frm->ptr;
2411807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2412bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann		p_ba2str(&info->bdaddr, addr);
2413807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2414807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		p_indent(level, frm);
241527eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2416807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
241727eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
241827eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
241927eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
242027eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
242127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
2422e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		ext_inquiry_response_dump(level, frm);
2423807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	}
2424807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann}
2425807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2426d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmannstatic inline void link_supervision_timeout_dump(int level, struct frame *frm)
2427d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann{
2428d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	evt_link_supervision_timeout *evt = frm->ptr;
2429d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann
2430d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	p_indent(level, frm);
2431d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	printf("handle %d timeout %d\n",
2432d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann				btohs(evt->handle), btohs(evt->timeout));
2433d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann}
2434d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann
243565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm)
243695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2437174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_event_hdr *hdr = frm->ptr;
2438be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	uint8_t event = hdr->evt;
243965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
244065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (p_filter(FILT_HCI))
244165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		return;
244265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2443d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (event <= EVENT_NUM) {
24447b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		p_indent(level, frm);
2445803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: %s (0x%2.2x) plen %d\n",
24467b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann					event_str[hdr->evt], hdr->evt, hdr->plen);
2447be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_TESTING) {
24487b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		p_indent(level, frm);
2449803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
2450be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_VENDOR) {
2451a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann		uint16_t manufacturer;
2452a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann
24537b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		if (parser.flags & DUMP_NOVENDOR)
24547b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann			return;
24557b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann
24567b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		p_indent(level, frm);
2457803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
24587b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann
2459a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann		manufacturer = get_manufacturer();
2460a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann
2461a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann		switch (manufacturer) {
2462a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann		case 0:
2463a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann		case 48:
2464a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann			frm->ptr += HCI_EVENT_HDR_SIZE;
2465a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann			frm->len -= HCI_EVENT_HDR_SIZE;
2466a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann			ericsson_dump(level + 1, frm);
2467a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann			return;
2468a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann		case 10:
2469be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->ptr += HCI_EVENT_HDR_SIZE;
2470be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->len -= HCI_EVENT_HDR_SIZE;
2471be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			csr_dump(level + 1, frm);
2472be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			return;
2473be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
24747b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	} else {
24757b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		p_indent(level, frm);
247666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
24777b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	}
247865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
247965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_EVENT_HDR_SIZE;
248065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_EVENT_HDR_SIZE;
248165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2482be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (event == EVT_CMD_COMPLETE) {
2483be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		evt_cmd_complete *cc = frm->ptr;
2484be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {
2485be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;
2486be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			manufacturer = rp->manufacturer;
2487be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
2488be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
2489be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
249025554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	if (event == EVT_DISCONN_COMPLETE) {
249125554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		evt_disconn_complete *evt = frm->ptr;
249225554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		l2cap_clear(btohs(evt->handle));
249325554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	}
249425554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann
2495d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
2496d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2497d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
2498d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2499d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2500d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (event) {
2501ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann	case EVT_LOOPBACK_COMMAND:
2502ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		command_dump(level + 1, frm);
2503ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
2504d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_COMPLETE:
2505d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_complete_dump(level + 1, frm);
2506d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2507d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_STATUS:
2508d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_status_dump(level + 1, frm);
2509d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2510afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_HARDWARE_ERROR:
2511afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		hardware_error_dump(level + 1, frm);
2512afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2513afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_FLUSH_OCCURRED:
2514f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_QOS_VIOLATION:
2515afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		handle_response_dump(level + 1, frm);
2516afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2517d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_COMPLETE:
2518d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		status_response_dump(level + 1, frm);
2519d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2520d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT:
2521d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_dump(level + 1, frm);
2522d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2523d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_COMPLETE:
2524d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_complete_dump(level + 1, frm);
2525d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2526d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_REQUEST:
2527d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_request_dump(level + 1, frm);
2528d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2529d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_DISCONN_COMPLETE:
2530d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		disconn_complete_dump(level + 1, frm);
2531d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2532d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_AUTH_COMPLETE:
2533d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
2534d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		generic_response_dump(level + 1, frm);
2535d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
253617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_MASTER_LINK_KEY_COMPLETE:
253717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		master_link_key_complete_dump(level + 1, frm);
253817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2539d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_REMOTE_NAME_REQ_COMPLETE:
2540d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		remote_name_req_complete_dump(level + 1, frm);
2541d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2542d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_ENCRYPT_CHANGE:
2543d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		encrypt_change_dump(level + 1, frm);
2544d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_FEATURES_COMPLETE:
2546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_features_complete_dump(level + 1, frm);
2547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_VERSION_COMPLETE:
2549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_version_complete_dump(level + 1, frm);
2550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_QOS_SETUP_COMPLETE:
255211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		qos_setup_complete_dump(level + 1, frm);
2553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_ROLE_CHANGE:
2555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		role_change_dump(level + 1, frm);
2556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_NUM_COMP_PKTS:
2558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		num_comp_pkts_dump(level + 1, frm);
2559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_MODE_CHANGE:
2561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		mode_change_dump(level + 1, frm);
2562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2563b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	case EVT_RETURN_LINK_KEYS:
2564b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		return_link_keys_dump(level + 1, frm);
2565b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		break;
2566ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_PIN_CODE_REQ:
2567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_REQ:
2568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		pin_code_req_dump(level + 1, frm);
2569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_NOTIFY:
2571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		link_key_notify_dump(level + 1, frm);
2572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2573c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	case EVT_DATA_BUFFER_OVERFLOW:
2574c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		data_buffer_overflow_dump(level + 1, frm);
2575c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		break;
257611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_MAX_SLOTS_CHANGE:
257711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		max_slots_change_dump(level + 1, frm);
257811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_CLOCK_OFFSET_COMPLETE:
2580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_clock_offset_complete_dump(level + 1, frm);
2581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_CONN_PTYPE_CHANGED:
2583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		conn_ptype_changed_dump(level + 1, frm);
2584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
258511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_PSCAN_REP_MODE_CHANGE:
258611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		pscan_rep_mode_change_dump(level + 1, frm);
258711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2588f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_FLOW_SPEC_COMPLETE:
2589f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		flow_spec_complete_dump(level + 1, frm);
2590f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		break;
2591d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT_WITH_RSSI:
2592d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_with_rssi_dump(level + 1, frm);
2593d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
259417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:
259517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		read_remote_ext_features_complete_dump(level + 1, frm);
259617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2597d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_COMPLETE:
2598d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_complete_dump(level + 1, frm);
2599d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2600d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_CHANGED:
2601d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_changed_dump(level + 1, frm);
2602d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2603120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann	case EVT_SNIFF_SUBRATE:
2604120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		sniff_subrate_event_dump(level + 1, frm);
2605120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann		break;
2606807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	case EVT_EXTENDED_INQUIRY_RESULT:
2607807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inq_result_dump(level + 1, frm);
2608807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		break;
2609d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann	case EVT_LINK_SUPERVISION_TIMEOUT:
2610d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann		link_supervision_timeout_dump(level + 1, frm);
2611d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann		break;
2612d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	default:
2613d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2614d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2615d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
261695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
261795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
261865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm)
261995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2620174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_acl_hdr *hdr = (void *) frm->ptr;
26210d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
26220d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t dlen = btohs(hdr->dlen);
26230d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t flags = acl_flags(handle);
262465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
262565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (!p_filter(FILT_HCI)) {
2626ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2627d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",
262865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			acl_handle(handle), flags, dlen);
262965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		level++;
263065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	}
2631e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2632e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->ptr += HCI_ACL_HDR_SIZE;
2633e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->len -= HCI_ACL_HDR_SIZE;
2634f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->flags  = flags;
2635f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->handle = acl_handle(handle);
263665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
263765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (parser.filter & ~FILT_HCI)
263865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		l2cap_dump(level, frm);
263965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	else
264065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
264195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
264295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2643d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm)
2644d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{
2645d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	hci_sco_hdr *hdr = (void *) frm->ptr;
26460d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
26476d3f2066a10cd7d0812fdf97635f1bd77f003493Marcel Holtmann	int len;
2648d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
26499e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann	if (frm->audio_fd > fileno(stderr))
26506d3f2066a10cd7d0812fdf97635f1bd77f003493Marcel Holtmann		len = write(frm->audio_fd, frm->ptr + HCI_SCO_HDR_SIZE, hdr->dlen);
26510033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann
2652d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	if (!p_filter(FILT_SCO)) {
2653ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2654d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("SCO data: handle %d dlen %d\n",
2655120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann					acl_handle(handle), hdr->dlen);
2656d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		level++;
2657d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2658d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->ptr += HCI_SCO_HDR_SIZE;
2659d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->len -= HCI_SCO_HDR_SIZE;
2660d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		raw_dump(level, frm);
2661d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	}
2662d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky}
2663d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2664b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm)
2665b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{
2666b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (p_filter(FILT_HCI))
2667b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2668b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
266938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	if (frm->dev_id == HCI_DEV_NONE) {
2670a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann		uint16_t device = btohs(htons(get_u16(frm)));
2671ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann		uint16_t proto = btohs(htons(get_u16(frm)));
267238acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t type = btohs(htons(get_u16(frm)));
267338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t plen = btohs(htons(get_u16(frm)));
267438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
267538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		p_indent(level, frm);
267638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
2677ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann		printf("System %s: device hci%d proto 0x%2.2x type 0x%2.2x plen %d\n",
2678ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann			frm->in ? "event" : "command", device, proto, type, plen);
267938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
268038acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		raw_dump(level, frm);
268138acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		return;
268238acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	}
268338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
26847b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann	if (parser.flags & DUMP_NOVENDOR)
26857b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann		return;
26867b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann
2687b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (get_manufacturer() == 12) {
2688b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		bpa_dump(level, frm);
2689b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2690b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	}
2691b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
2692b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	p_indent(level, frm);
2693b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	printf("Vendor data: len %d\n", frm->len);
2694b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	raw_dump(level, frm);
2695b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann}
2696b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
2697174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm)
269895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2699d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t type = *(uint8_t *)frm->ptr;
270095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2701174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	frm->ptr++; frm->len--;
2702e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
270395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	switch (type) {
270495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_COMMAND_PKT:
270565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		command_dump(level, frm);
270695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
270795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
270895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_EVENT_PKT:
270965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		event_dump(level, frm);
271095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
271195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
271295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_ACLDATA_PKT:
271365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		acl_dump(level, frm);
271495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
271595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2716d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	case HCI_SCODATA_PKT:
2717d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		sco_dump(level, frm);
2718d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		break;
2719e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2720b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	case HCI_VENDOR_PKT:
2721b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		vendor_dump(level, frm);
2722b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		break;
2723b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
272495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	default:
272565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		if (p_filter(FILT_HCI))
272665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			break;
272765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2728ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2729174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
273065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
273195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
273295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	}
273395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
2734