hci.c revision 51c927b7eb7f8f78d31d3e8cfe218649c29eb44d
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>
6d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann *  Copyright (C) 2003-2005  Marcel Holtmann <marcel@holtmann.org>
7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is free software; you can redistribute it and/or modify
10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  it under the terms of the GNU General Public License as published by
11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  the Free Software Foundation; either version 2 of the License, or
12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  (at your option) any later version.
13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is distributed in the hope that it will be useful,
15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  GNU General Public License for more details.
18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  You should have received a copy of the GNU General Public License
20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  along with this program; if not, write to the Free Software
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
5313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define EVENT_NUM 47
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",
1011a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Unknown",
1021a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Extended Inquiry Result",
10366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky};
1042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
10513acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_LINKCTL_NUM 41
10613acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkctl_str[CMD_LINKCTL_NUM + 1] = {
1072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry",
1092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry Cancel",
1102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Periodic Inquiry Mode",
1112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Periodic Inquiry Mode",
1122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create Connection",
1132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Disconnect",
1142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Add SCO Connection",
115328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Create Connection Cancel",
1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Accept Connection Request",
1172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reject Connection Request",
1182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Reply",
1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Negative Reply",
1202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Reply",
1212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Negative Reply",
1222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Packet Type",
123f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Authentication Requested",
125f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Connection Encryption",
127f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Link Key",
129f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Master Link Key",
131f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Remote Name Request",
133328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Remote Name Request Cancel",
1342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Supported Features",
135328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
1362bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Version Information",
137f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
138328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Clock Offset",
139328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read LMP Handle"
140328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
141328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
142328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
143328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
144328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
145328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
146328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
147328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Setup Synchronous Connection",
148328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Accept Synchronous Connection",
1491a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Reject Synchronous Connection",
1502bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
1512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
15213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_LINKPOL_NUM 16
15313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkpol_str[CMD_LINKPOL_NUM + 1] = {
1542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Hold Mode",
156f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1572bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Sniff Mode",
1582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Sniff Mode",
159328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Park State",
160328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Exit Park State",
1612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"QoS Setup",
162f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Role Discovery",
164f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Switch Role",
1662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Policy Settings",
167328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Link Policy Settings",
168328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Default Link Policy Settings",
169328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Default Link Policy Settings",
1701a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Flow Specification",
1712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
1722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
17313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_HOSTCTL_NUM 82
17413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_hostctl_str[CMD_HOSTCTL_NUM + 1] = {
1752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Mask",
177f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset",
179f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Filter",
181f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
182f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Flush",
1842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read PIN Type ",
1852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write PIN Type",
1862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create New Unit Key",
187f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Stored Link Key",
189f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
190f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
191f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Stored Link Key",
1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Delete Stored Link Key",
194328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Local Name",
1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Name",
1962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Connection Accept Timeout",
1972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Connection Accept Timeout",
1982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Timeout",
1992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Timeout",
2002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Scan Enable",
2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Scan Enable",
2022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Activity",
2032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Activity",
2042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Inquiry Scan Activity",
2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Inquiry Scan Activity",
2062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Authentication Enable",
2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Authentication Enable",
2082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Encryption Mode",
2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Encryption Mode",
2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Class of Device",
2112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Class of Device",
2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Voice Setting",
2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Voice Setting",
2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Automatic Flush Timeout",
2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Automatic Flush Timeout",
2162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Num Broadcast Retransmissions",
2172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Num Broadcast Retransmissions",
2182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Hold Mode Activity ",
2192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Hold Mode Activity",
2202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Transmit Power Level",
221328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Synchronous Flow Control Enable",
222328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Synchronous Flow Control Enable",
223f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Host Controller To Host Flow Control",
225f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Buffer Size",
227f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Number of Completed Packets",
2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Supervision Timeout",
2302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Link Supervision Timeout",
2312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Number of Supported IAC",
2322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Current IAC LAP",
2332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Current IAC LAP",
2342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Period Mode",
2352bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Period Mode",
2362bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Mode",
237328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Mode",
238328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Set AFH Host Channel Classification",
239328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
240328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
241328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Scan Type",
242328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Scan Type",
243328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Mode",
244328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Mode",
245328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Page Scan Type",
246328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Type",
247328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Assessment Mode",
2481a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write AFH Channel Assessment Mode",
2491a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Unknown",
25013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25513acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
2561a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Extended Inquiry Response",
2571a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write Extended Inquiry Response",
2582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
26013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_INFO_NUM 9
26113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_info_str[CMD_INFO_NUM + 1] = {
2622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Version Information",
264328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Supported Commands",
2652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Supported Features",
266328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Extended Features",
2672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Buffer Size",
268f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Country Code",
270f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2711a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read BD ADDR",
2722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
27413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_STATUS_NUM 7
27513acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_status_str[CMD_STATUS_NUM + 1] = {
2762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Failed Contact Counter",
2782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset Failed Contact Counter",
279328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Link Quality",
280f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
281328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read RSSI",
282328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Map",
2831a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Clock",
2842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
28566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky
28613acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define ERROR_CODE_NUM 53
28713acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *error_code_str[ERROR_CODE_NUM + 1] = {
288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Success",
289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown HCI Command",
290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown Connection Identifier",
291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Hardware Failure",
292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Page Timeout",
293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Authentication Failure",
294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"PIN or Key Missing",
295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Memory Capacity Exceeded",
296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Timeout",
297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Limit Exceeded",
298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Synchronous Connection to a Device Exceeded",
299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"ACL Connection Already Exists",
300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Command Disallowed",
301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Limited Resources",
302d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Security Reasons",
303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Unacceptable BD_ADDR",
304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Accept Timeout Exceeded",
305d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Feature or Parameter Value",
306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid HCI Command Parameters",
30760864ce9e77ec159d0914fe8d938565493f08eebMarcel Holtmann	"Remote User Terminated Connection",
308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Low Resources",
309d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Power Off",
310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Terminated by Local Host",
311fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Repeated Attempts",
312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Pairing Not Allowed",
313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown LMP PDU",
314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Remote Feature / Unsupported LMP Feature",
315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Offset Rejected",
316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Interval Rejected",
317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Air Mode Rejected",
318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid LMP Parameters",
319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unspecified Error",
320d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported LMP Parameter Value",
321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Change Not Allowed",
322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Response Timeout",
323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Error Transaction Collision",
324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP PDU Not Allowed",
325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Encryption Mode Not Acceptable",
326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Link Key Can Not be Changed",
327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Requested QoS Not Supported",
328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Instant Passed",
329fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Pairing with Unit Key Not Supported",
330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Different Transaction Collision",
331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Unacceptable Parameter",
333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Rejected",
334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Channel Classification Not Supported",
335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Insufficient Security",
336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Parameter out of Mandatory Range",
337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Switch Pending",
339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved Slot Violation",
3411a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Role Switch Failed",
342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann};
343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *status2str(uint8_t status)
345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char *str;
347d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
348d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status <= ERROR_CODE_NUM)
349d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = error_code_str[status];
350d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	else
351d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = "Unknown";
352d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
353d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return str;
354d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
355d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
356d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *opcode2str(uint16_t opcode)
35795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
3580d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
3590d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
3602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	char *cmd;
36195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	switch (ogf) {
3632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_INFO_PARAM:
3642bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_INFO_NUM)
365d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_info_str[ocf];
3662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_HOST_CTL:
3712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_HOSTCTL_NUM)
372d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_hostctl_str[ocf];
3732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_CTL:
3782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKCTL_NUM)
379d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkctl_str[ocf];
3802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_POLICY:
3852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKPOL_NUM)
386d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkpol_str[ocf];
3872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3912bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_STATUS_PARAM:
3922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_STATUS_NUM)
393d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_status_str[ocf];
3942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
398cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_TESTING_CMD:
399cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Testing";
400cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
401cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
402cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_VENDOR_CMD:
403cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Vendor";
404cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
405cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
4062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	default:
4072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		cmd = "Unknown";
4082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
4092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	}
4102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
411d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return cmd;
412d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
413d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *role2str(uint8_t role)
415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
416ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (role) {
417ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
418ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Master";
419ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
420ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Slave";
421ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
422ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *mode2str(uint8_t mode)
427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (mode) {
429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Active";
431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Hold";
433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x02:
434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Sniff";
435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x03:
436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Park";
437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
438ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
440ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
441ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
442d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic char *airmode2str(uint8_t mode)
443d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
444d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	switch (mode) {
445d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x00:
446d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "u-law log";
447d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x01:
448d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "A-law log";
449d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x02:
450d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "CVSD";
451d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x04:
452d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Transparent data";
453d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	default:
454d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Reserved";
455d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
456d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
457d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
458e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmannstatic inline void ext_inquiry_response_dump(int level, struct frame *frm)
459e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann{
460e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	void *ptr = frm->ptr;
461e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	uint32_t len = frm->len;
462e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	uint8_t type, length;
463e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	char *str;
464e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	int i;
465e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
466e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	length = get_u8(frm);
467e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
468e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	while (length > 0) {
469e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		type = get_u8(frm);
470e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		length--;
471e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
472e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		switch (type) {
473e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		case 0x08:
474e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		case 0x09:
475e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			str = malloc(length + 1);
476e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			if (str) {
477ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann				snprintf(str, length + 1, "%s", (char *) frm->ptr);
478e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				for (i = 0; i < length; i++)
479e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				if (!isprint(str[i]))
480e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann					str[i] = '.';
481e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				p_indent(level, frm);
482e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				printf("%s local name: \'%s\'\n",
483e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann					type == 0x08 ? "Shortened" : "Complete", str);
484e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann				free(str);
485e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			}
486e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			break;
487e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
488e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		default:
489e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			p_indent(level, frm);
490e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			printf("Unknown type 0x%02x with %d bytes data\n",
491e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann								type, length);
492e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann			break;
493e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		}
494e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
495e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		frm->ptr += length;
496e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		frm->len -= length;
497e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
498e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		length = get_u8(frm);
499e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	}
500e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
501e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	frm->ptr = ptr + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
502e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	frm->len = len + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE);
503e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann}
504e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann
505ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void generic_command_dump(int level, struct frame *frm)
506ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
507ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
508ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
509ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
510ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d\n", handle);
511ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
512ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
513ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
51590480219be366c65e68ae8612de7a361027e751aMarcel Holtmannstatic inline void bdaddr_command_dump(int level, struct frame *frm)
51690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann{
51790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
51890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	char addr[18];
51990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
52090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->ptr += sizeof(bdaddr_t);
52190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->len -= sizeof(bdaddr_t);
52290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
52390480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	p_indent(level, frm);
52490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	ba2str(bdaddr, addr);
525e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	printf("bdaddr %s\n", addr);
52690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
52790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	raw_dump(level, frm);
52890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann}
52990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
530ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void inquiry_dump(int level, struct frame *frm)
531ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
532ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	inquiry_cp *cp = frm->ptr;
533ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
534ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
535ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
536ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
537ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
538ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void periodic_inquiry_dump(int level, struct frame *frm)
540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	periodic_inquiry_cp *cp = frm->ptr;
542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		btohs(cp->max_period), btohs(cp->min_period),
546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void create_conn_dump(int level, struct frame *frm)
550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	create_conn_cp *cp = frm->ptr;
552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], *str;
555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n",
559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		addr, ptype, cp->role_switch,
560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
564ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
565ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
566ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void disconnect_dump(int level, struct frame *frm)
571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	disconnect_cp *cp = frm->ptr;
573ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
574ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
575ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason);
576ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
577ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
578ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void add_sco_dump(int level, struct frame *frm)
582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	add_sco_cp *cp = frm->ptr;
584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype);
589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void accept_conn_req_dump(int level, struct frame *frm)
599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	accept_conn_req_cp *cp = frm->ptr;
601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s role 0x%2.2x\n", addr, cp->role);
606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Role: %s\n", role2str(cp->role));
609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void reject_conn_req_dump(int level, struct frame *frm)
612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
613ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	reject_conn_req_cp *cp = frm->ptr;
614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason);
619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
621ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
622ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
623ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_reply_dump(int level, struct frame *frm)
625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
626ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	pin_code_reply_cp *cp = frm->ptr;
627ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], pin[17];
628ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
629ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
631ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(pin, 0, sizeof(pin));
632ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memcpy(pin, cp->pin_code, cp->pin_len);
633ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin);
634ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_reply_dump(int level, struct frame *frm)
637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
638ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	link_key_reply_cp *cp = frm->ptr;
639ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
640ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
641ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
642ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
643ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
64444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
64644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2X", cp->link_key[i]);
647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("\n");
648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_neg_reply_dump(int level, struct frame *frm)
651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
654ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
655ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
656ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
657ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
658ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
659ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
660ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void set_conn_encrypt_dump(int level, struct frame *frm)
661ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
662ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	set_conn_encrypt_cp *cp = frm->ptr;
663ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
664ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
665ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt);
666ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
667ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
668ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void remote_name_req_dump(int level, struct frame *frm)
669ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
670ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	remote_name_req_cp *cp = frm->ptr;
671ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
672ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
673ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
674ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
675ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
67672e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann	printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n",
67772e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		addr, cp->pscan_rep_mode,
67872e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
679ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
680ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
68117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_dump(int level, struct frame *frm)
68217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
68317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	master_link_key_cp *cp = frm->ptr;
68417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
68517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
68617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("flag %d\n", cp->key_flag);
68717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
68817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
68917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_dump(int level, struct frame *frm)
69017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
69117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_remote_ext_features_cp *cp = frm->ptr;
69217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
693e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	p_indent(level, frm);
694e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	printf("handle %d page %d\n", btohs(cp->handle), cp->page_num);
69517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
69617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
6979ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmannstatic inline void hold_mode_dump(int level, struct frame *frm)
6989ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann{
6999ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	hold_mode_cp *cp = frm->ptr;
7009ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
7019ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	p_indent(level, frm);
7029ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	printf("handle %d max %d min %d\n", btohs(cp->handle),
7039ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			btohs(cp->max_interval), btohs(cp->min_interval));
7049ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann}
7059ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
7069ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmannstatic inline void sniff_mode_dump(int level, struct frame *frm)
7079ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann{
7089ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	sniff_mode_cp *cp = frm->ptr;
7099ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
7109ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	p_indent(level, frm);
7119ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann	printf("handle %d max %d min %d attempt %d timeout %d\n",
7129ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		btohs(cp->handle), btohs(cp->max_interval),
7139ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		btohs(cp->min_interval), btohs(cp->attempt), btohs(cp->timeout));
7149ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann}
7159ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann
716ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_link_policy_dump(int level, struct frame *frm)
717ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
718ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_link_policy_cp *cp = frm->ptr;
719ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t policy = btohs(cp->policy);
720ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
721ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
722ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
723ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy);
724ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
725ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_lptostr(policy);
726ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
727ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
728ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Link policy: %s\n", str);
729ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
730ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
731ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
732ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
73344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_mask_dump(int level, struct frame *frm)
73444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
73544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_mask_cp *cp = frm->ptr;
73644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i;
73744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
73844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
73944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("Mask: 0x");
74044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (i = 0; i < 8; i++)
74144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2x", cp->mask[i]);
74244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("\n");
74344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
74444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
74544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_flt_dump(int level, struct frame *frm)
74644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
74744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_flt_cp *cp = frm->ptr;
74844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
74944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
75044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("type %d condition %d\n", cp->flt_type, cp->cond_type);
75144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
75244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	switch (cp->flt_type) {
75344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CLEAR_ALL:
75451c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann		p_indent(level, frm);
75544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Clear all filters\n");
75644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
75744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_INQ_RESULT:
75851c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann		p_indent(level, frm);
75944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Inquiry result");
76044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
76144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_ALL:
76244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_CLASS:
76344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_BDADDR:
76444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
76544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
76644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
76744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
76844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
76944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CONN_SETUP:
77051c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann		p_indent(level, frm);
77144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Connection setup");
77244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
77344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_ALL:
77444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_CLASS:
77544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_BDADDR:
77644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
77744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
77844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
77944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
78044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
78144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
78244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
78344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
78444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_pin_type_dump(int level, struct frame *frm)
78544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
78644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_pin_type_cp *cp = frm->ptr;
78744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
78844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
78944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("type %d\n", cp->pin_type);
79044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
79144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
79244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void request_stored_link_key_dump(int level, struct frame *frm)
79344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
79444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_cp *cp = frm->ptr;
79544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
79644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
79744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
79844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	ba2str(&cp->bdaddr, addr);
79944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s all %d\n", addr, cp->read_all);
80044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
80144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
80244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void return_link_keys_dump(int level, struct frame *frm)
80344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
80444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t num = get_u8(frm);
80544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t key[16];
80644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
80744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i, n;
80844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
80944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (n = 0; n < num; n++) {
81044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		ba2str(frm->ptr, addr);
81144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		memcpy(key, frm->ptr + 6, 16);
81244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
81344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
81444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("bdaddr %s key ", addr);
81544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		for (i = 0; i < 16; i++)
81644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("%2.2X", key[i]);
81744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("\n");
81844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
81944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->ptr += 2;
82044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->len -= 2;
82144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
82244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
82344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
824ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void change_local_name_dump(int level, struct frame *frm)
825ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
826ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	change_local_name_cp *cp = frm->ptr;
827ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
828ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
829ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
830ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
831ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && cp->name[i]; i++)
832ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(cp->name[i]))
833ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = cp->name[i];
834ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
835ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
836ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
837ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
838ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("name \'%s\'\n", name);
839ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
840ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
841ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_class_of_dev_dump(int level, struct frame *frm)
842ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
843ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_class_of_dev_cp *cp = frm->ptr;
844ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
845ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
846ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("class 0x%2.2x%2.2x%2.2x\n",
847ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
848ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
849ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
850ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_voice_setting_dump(int level, struct frame *frm)
851ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
852ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_voice_setting_cp *cp = frm->ptr;
853ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
854ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
855ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));
856ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
857ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
858fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void write_current_iac_lap_dump(int level, struct frame *frm)
859fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
860fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	write_current_iac_lap_cp *cp = frm->ptr;
861fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
862fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
863fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < cp->num_current_iac; i++) {
864fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
865fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]);
866fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) {
867fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (cp->lap[i][0]) {
868fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
869fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
870fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
871fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
872fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
873fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
874fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
875fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
876fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
877fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
878fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
879fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
88069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void write_scan_enable_dump(int level, struct frame *frm)
88169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
88269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
88369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
88469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
88569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("enable %d\n", enable);
88669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
88769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
888d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_timeout_dump(int level, struct frame *frm)
889d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
890d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_timeout_cp *cp = frm->ptr;
891d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
892d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
893d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("timeout %d\n", btohs(cp->timeout));
894d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
895d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
896d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_activity_dump(int level, struct frame *frm)
897d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
898d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_activity_cp *cp = frm->ptr;
899d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
900d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
901d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window));
902d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
903d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
904a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void write_inquiry_scan_type_dump(int level, struct frame *frm)
905a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
906a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	write_inquiry_scan_type_cp *cp = frm->ptr;
907a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
908a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
909a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("type %d\n", cp->type);
910a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
911a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
912f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmannstatic inline void write_inquiry_mode_dump(int level, struct frame *frm)
913f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann{
914f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	write_inquiry_mode_cp *cp = frm->ptr;
915f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
916f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	p_indent(level, frm);
917f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	printf("mode %d\n", cp->mode);
918f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann}
919f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
9206eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void write_link_supervision_timeout_dump(int level, struct frame *frm)
9216eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
9226eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	write_link_supervision_timeout_cp *cp = frm->ptr;
9236eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
9246eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
9256eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d timeout %d\n",
9266eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		btohs(cp->handle), btohs(cp->link_sup_to));
9276eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
9286eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
9291a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void write_ext_inquiry_response_dump(int level, struct frame *frm)
9301a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
9311a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	write_ext_inquiry_response_cp *cp = frm->ptr;
9321a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
9331a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
9341a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("fec 0x%2.2x\n", cp->fec);
935f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
936f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	frm->ptr++;
937f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	frm->len--;
938f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
939e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann	ext_inquiry_response_dump(level, frm);
9401a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
9411a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
9426eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void request_transmit_power_level_dump(int level, struct frame *frm)
9436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
9446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_cp *cp = frm->ptr;
9456eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
9466eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
9476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d type %d (%s)\n",
9486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		btohs(cp->handle), cp->type,
9496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		cp->type ? "maximum" : "current");
9506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
9516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
95217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void request_local_ext_features_dump(int level, struct frame *frm)
95317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
95417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_cp *cp = frm->ptr;
95517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
95617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
95717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("page %d\n", cp->page_num);
95817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
95917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
960f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void request_clock_dump(int level, struct frame *frm)
961f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
962f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_cp *cp = frm->ptr;
963f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
964f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
965f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("handle %d which %d (%s)\n",
966f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		btohs(cp->handle), cp->which_clock,
967f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		cp->which_clock ? "piconet" : "local");
968f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
969f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
970d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm)
971d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
972d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	hci_command_hdr *hdr = frm->ptr;
973d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(hdr->opcode);
974d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
975d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
976d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
977d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (p_filter(FILT_HCI))
978d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
979d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
980ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
98165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
982803752117135528b1adebf0fa045596e188a996dMarcel Holtmann	printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
983d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, hdr->plen);
98465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
98565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_COMMAND_HDR_SIZE;
98665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_COMMAND_HDR_SIZE;
98765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
988be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (ogf == OGF_VENDOR_CMD && ocf == 0 && get_manufacturer() == 10) {
989be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		csr_dump(level + 1, frm);
990be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		return;
991be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
992be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
9934f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
9944f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
9954f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
9964f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
9974f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (ogf) {
999ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
1000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
1001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY:
1002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			inquiry_dump(level + 1, frm);
1003ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1004ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
1005ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			periodic_inquiry_dump(level + 1, frm);
1006ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1007ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY_CANCEL:
1008ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
1009ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1010ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CREATE_CONN:
1011ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			create_conn_dump(level + 1, frm);
1012ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1013ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_DISCONNECT:
1014ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			disconnect_dump(level + 1, frm);
1015ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
101690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
101790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
101890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_ACCEPT_SYNC_CONN_REQ:
101990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			bdaddr_command_dump(level + 1, frm);
102090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			return;
1021ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ADD_SCO:
1022ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_PTYPE:
1023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			add_sco_dump(level + 1, frm);
1024acc2322e0bed89e8ada2564359a1a6d293c9d514Marcel Holtmann			return;
1025ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ACCEPT_CONN_REQ:
1026ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
1027ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1028ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REJECT_CONN_REQ:
102990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REJECT_SYNC_CONN_REQ:
1030ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			reject_conn_req_dump(level + 1, frm);
1031ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1032ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
1033ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_reply_dump(level + 1, frm);
1034ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1035ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
1036ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			link_key_reply_dump(level + 1, frm);
1037ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1038ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
1039ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
1040ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_neg_reply_dump(level + 1, frm);
1041ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1042ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_ENCRYPT:
1043ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			set_conn_encrypt_dump(level + 1, frm);
1044ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1045ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_AUTH_REQUESTED:
1046ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_CONN_LINK_KEY:
1047ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_FEATURES:
1048ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_VERSION:
1049ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLOCK_OFFSET:
105090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_READ_LMP_HANDLE:
105190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_SETUP_SYNC_CONN:
1052ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
1053ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
105417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_MASTER_LINK_KEY:
105517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			master_link_key_dump(level + 1, frm);
105617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
105717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_REMOTE_EXT_FEATURES:
105817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_remote_ext_features_dump(level + 1, frm);
105917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REMOTE_NAME_REQ:
1061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			remote_name_req_dump(level + 1, frm);
1062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1064ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
1067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
10689ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		case OCF_HOLD_MODE:
10699ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		case OCF_PARK_MODE:
10709ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			hold_mode_dump(level + 1, frm);
10719ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			return;
10729ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann		case OCF_SNIFF_MODE:
10739ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			sniff_mode_dump(level + 1, frm);
10749ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann			return;
1075ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_SNIFF_MODE:
1076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PARK_MODE:
1077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ROLE_DISCOVERY:
1078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_LINK_POLICY:
1079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
1080ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SWITCH_ROLE:
1082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
1083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
1085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_link_policy_dump(level + 1, frm);
1086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1088ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_HOST_CTL:
1091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
109244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
109344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
109444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
109544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
109644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_mask_dump(level + 1, frm);
109744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
109844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
109944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_flt_dump(level + 1, frm);
110044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
110144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
110244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_pin_type_dump(level + 1, frm);
110344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
110444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
110544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
110644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			request_stored_link_key_dump(level + 1, frm);
110744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
110844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
110944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return_link_keys_dump(level + 1, frm);
111044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1111ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1112ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			change_local_name_dump(level + 1, frm);
1113ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1114ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1115ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_class_of_dev_dump(level + 1, frm);
1116ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1117ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_voice_setting_dump(level + 1, frm);
1119ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1120fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
1121fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			write_current_iac_lap_dump(level + 1, frm);
1122fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
112369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
112469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
112569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			write_scan_enable_dump(level + 1, frm);
112669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1127097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1128d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1129d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_timeout_dump(level + 1, frm);
1130d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1131d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1132d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1133d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_activity_dump(level + 1, frm);
1134d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1135a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1136a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			write_inquiry_scan_type_dump(level + 1, frm);
1137a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
113869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1139f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1140f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_AFH_MODE:
1141f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			write_inquiry_mode_dump(level + 1, frm);
1142f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
11436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
11446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			request_transmit_power_level_dump(level + 1, frm);
11456eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
114644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
11476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
11486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_command_dump(level + 1, frm);
11496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
11506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
11516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			write_link_supervision_timeout_dump(level + 1, frm);
11526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
11531a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
11541a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			write_ext_inquiry_response_dump(level + 1, frm);
11551a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
1156ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1157ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
115817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
115917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case OGF_INFO_PARAM:
116017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		switch (ocf) {
116117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
116217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			request_local_ext_features_dump(level + 1, frm);
116317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
116417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
1165ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1166f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1167f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	case OGF_STATUS_PARAM:
1168f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		switch (ocf) {
1169f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_LINK_QUALITY:
1170f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_RSSI:
1171f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_AFH_MAP:
1172f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			generic_command_dump(level + 1, frm);
1173f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1174f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_CLOCK:
1175f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			request_clock_dump(level + 1, frm);
1176f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1177f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		}
1178f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		break;
1179ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1180ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
118165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	raw_dump(level, frm);
118295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
118395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1184d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm)
1185d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1186d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1187d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1188d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1189d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x\n", status);
1190d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1191d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1192d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1193d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1194d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1195d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1196d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1197d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1198d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1199afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void handle_response_dump(int level, struct frame *frm)
1200afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1201afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1202afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1203afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1204afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("handle %d\n", handle);
1205afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1206afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	raw_dump(level, frm);
1207afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1208afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1209ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm)
1210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1211ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t status = get_u8(frm);
1212ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
1213ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1214ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1215ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->ptr += sizeof(bdaddr_t);
1216ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->len -= sizeof(bdaddr_t);
1217ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1218ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1219ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
1220ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s\n", status, addr);
1221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1222ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (status > 0) {
1223ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1224ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(status));
1225ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1226ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1229ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1230d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm)
1231d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1232d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1233d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1234d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1235d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1236d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d\n", status, handle);
1237d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1238d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1239d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1240d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1241d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1242d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1243d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1244d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1245d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
124644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_pin_type_dump(int level, struct frame *frm)
124744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
124844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_pin_type_rp *rp = frm->ptr;
124944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
125044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
125144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type);
125244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
125344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
125444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
125544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
125644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
125744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
125844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
125944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_stored_link_key_dump(int level, struct frame *frm)
126044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
126144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_rp *rp = frm->ptr;
126244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
126344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
126444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x max %d num %d\n",
126544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		rp->status, rp->max_keys, rp->num_keys);
126644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
126744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
126844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
126944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
127044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
127144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
127244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
127344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_stored_link_key_dump(int level, struct frame *frm)
127444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
127544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_stored_link_key_rp *rp = frm->ptr;
127644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
127744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
127844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys);
127944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
128044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
128144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
128244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
128344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
128444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
128544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
128644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void delete_stored_link_key_dump(int level, struct frame *frm)
128744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
128844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	delete_stored_link_key_rp *rp = frm->ptr;
128944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
129044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
129144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys));
129244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
129344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
129444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
129544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
129644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
129744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
129844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
1299ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm)
1300ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1301ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_name_rp *rp = frm->ptr;
1302ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
1303ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1304ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1305ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
1306ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && rp->name[i]; i++)
1307ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(rp->name[i]))
1308ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = rp->name[i];
1309ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
1310ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
1311ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1312ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1313ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x name \'%s\'\n", rp->status, name);
1314ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1315ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1316ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1317ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1318ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1319ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1320ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1321ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm)
1322ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1323ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_class_of_dev_rp *rp = frm->ptr;
1324ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1325ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1326ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
1327ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
1328ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1329ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1330ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1331ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1332ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1333ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1334ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1335ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm)
1336ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1337ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_voice_setting_rp *rp = frm->ptr;
1338ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1339ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1340ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x voice setting 0x%4.4x\n",
1341ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->status, btohs(rp->voice_setting));
1342ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1343ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1344ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1345ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1346ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1347ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1348ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1349fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm)
1350fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
1351fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	read_current_iac_lap_rp *rp = frm->ptr;
1352fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
1353fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
1354fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < rp->num_current_iac; i++) {
1355fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
1356fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]);
1357fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) {
1358fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (rp->lap[i][0]) {
1359fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
1360fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
1361fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1362fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
1363fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
1364fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1365fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
1366fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
1367fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
1368fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
1369fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
1370fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
137169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void read_scan_enable_dump(int level, struct frame *frm)
137269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
137369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t status = get_u8(frm);
137469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
137569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
137669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
137769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("status 0x%2.2x enable %d\n", status, enable);
137869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
137969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	if (status > 0) {
138069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		p_indent(level, frm);
138169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		printf("Error: %s\n", status2str(status));
138269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	}
138369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
138469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
1385d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_timeout_dump(int level, struct frame *frm)
1386d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1387d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_timeout_rp *rp = frm->ptr;
1388d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1389d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1390d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout));
1391d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1392d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1393d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1394d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1395d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1396d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1397d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1398d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_activity_dump(int level, struct frame *frm)
1399d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1400d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_activity_rp *rp = frm->ptr;
1401d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1402d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1403d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x interval %d window %d\n",
1404d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		rp->status, btohs(rp->interval), btohs(rp->window));
1405d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1406d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1407d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1408d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1409d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1410d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1411d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1412a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void read_inquiry_scan_type_dump(int level, struct frame *frm)
1413a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
1414a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	read_inquiry_scan_type_rp *rp = frm->ptr;
1415a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1416a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
1417a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->type);
1418a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1419a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	if (rp->status > 0) {
1420a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		p_indent(level, frm);
1421a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1422a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	}
1423a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
1424a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
14256eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_inquiry_mode_dump(int level, struct frame *frm)
14266eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
14276eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_inquiry_mode_rp *rp = frm->ptr;
14286eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14296eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
14306eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x mode %d\n", rp->status, rp->mode);
14316eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14326eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
14336eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
14346eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
14356eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
14366eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
14376eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14386eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_link_supervision_timeout_dump(int level, struct frame *frm)
14396eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
14406eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_link_supervision_timeout_rp *rp = frm->ptr;
14416eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14426eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
14436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d timeout %d\n",
14446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		rp->status, btohs(rp->handle), btohs(rp->link_sup_to));
14456eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14466eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
14476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
14486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
14496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
14506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
14516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_transmit_power_level_dump(int level, struct frame *frm)
14536eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
14546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_rp *rp = frm->ptr;
14556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
14576eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d level %d\n",
14586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		rp->status, btohs(rp->handle), rp->level);
14596eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
14616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
14626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
14636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
14646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
14656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
14661a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void read_ext_inquiry_response_dump(int level, struct frame *frm)
14671a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
14681a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	read_ext_inquiry_response_rp *rp = frm->ptr;
14691a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
14701a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
14711a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec);
14721a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
14731a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	if (rp->status > 0) {
14741a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		p_indent(level, frm);
14751a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1476f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	} else {
1477f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann		frm->ptr += 2;
1478f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann		frm->len -= 2;
1479f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
1480e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		ext_inquiry_response_dump(level, frm);
14811a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	}
14821a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
14831a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
1484ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm)
1485ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1486ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_version_rp *rp = frm->ptr;
1487ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(rp->manufacturer);
1488ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1489ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1490ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1491ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1492ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1493ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1494ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1495ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1496ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
14971a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann		printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
1498ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			hci_vertostr(rp->hci_ver), rp->hci_ver,
1499ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->hci_rev));
1500ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1501ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
1502ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(rp->lmp_ver), rp->lmp_ver,
1503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->lmp_subver));
1504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1505ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
1506ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
1507ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1508ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1509ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
151017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_commands_dump(int level, struct frame *frm)
151117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
151217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_commands_rp *rp = frm->ptr;
151317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i, max = 0;
151417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
151517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
151617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
151717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
151817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
151917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
152017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
152117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
152217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 64; i++)
152317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			if (rp->commands[i])
152417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				max = i + 1;
152517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
152617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Commands: ");
152717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < (max > 32 ? 32 : max); i++)
152817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("%2.2x", rp->commands[i]);
152917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
153017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		if (max > 32) {
153117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			p_indent(level, frm);
153217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("          ");
153317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			for (i = 32; i < max; i++)
153417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				printf("%2.2x", rp->commands[i]);
153517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("\n");
153617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
153717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
153817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
153917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm)
1541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_features_rp *rp = frm->ptr;
1543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
1554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
1555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", rp->features[i]);
1556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
1557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
156017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_ext_features_dump(int level, struct frame *frm)
156117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
156217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_rp *rp = frm->ptr;
156317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
156417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
156517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
156617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x page %d max %d\n",
156717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		rp->status, rp->page_num, rp->max_page_num);
156817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
156917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
157017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
157117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
157217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
157317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
157417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
157517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
157617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			 printf(" 0x%2.2x", rp->features[i]);
157717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
157817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
157917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
158017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm)
1582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_buffer_size_rp *rp = frm->ptr;
1584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("ACL MTU %d:%d SCO MTU %d:%d\n",
1594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
1595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			rp->sco_mtu, btohs(rp->sco_max_pkt));
1596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1599f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_link_quality_dump(int level, struct frame *frm)
1600f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1601f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_link_quality_rp *rp = frm->ptr;
1602f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1603f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1604f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d lq %d\n",
1605f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->link_quality);
1606f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1607f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1608f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1609f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1610f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1611f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1612f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1613f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_rssi_dump(int level, struct frame *frm)
1614f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1615f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_rssi_rp *rp = frm->ptr;
1616f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1617f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1618f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d rssi %d\n",
1619f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->rssi);
1620f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1621f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1622f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1623f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1624f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1625f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1626f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1627f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_afh_map_dump(int level, struct frame *frm)
1628f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1629f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_afh_map_rp *rp = frm->ptr;
1630f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	int i;
1631f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1632f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1633f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d mode %d\n",
1634f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->mode);
1635f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1636f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1637f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1638f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1639f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	} else {
1640f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1641f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("AFH map: 0x");
1642f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		for (i = 0; i < 10; i++)
1643f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			printf("%2.2x", rp->map[i]);
1644f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("\n");
1645f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1646f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1647f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1648f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_clock_dump(int level, struct frame *frm)
1649f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1650f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_rp *rp = frm->ptr;
1651f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1652f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1653f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n",
1654f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle),
1655f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		btohl(rp->clock), btohs(rp->accuracy));
1656f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1657f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1658f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1659f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1660f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1661f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1662f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1663d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm)
1664d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1665d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_complete *evt = frm->ptr;
1666d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1667d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
1668d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
1669d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1670d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1671d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
1672d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, evt->ncmd);
1673d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1674d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->ptr += EVT_CMD_COMPLETE_SIZE;
1675d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->len -= EVT_CMD_COMPLETE_SIZE;
1676d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
16774f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
16784f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
16794f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
16804f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
16814f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
1682d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (ogf) {
1683ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
1684ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
168517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_INQUIRY_CANCEL:
168617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
168717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
168817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			status_response_dump(level, frm);
168917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
169090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
169190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
1692ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
1693ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
1694ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
1695ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
1696ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1697ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1698ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
169917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1700ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1701ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
1702ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
1703ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
1704ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_response_dump(level, frm);
1705ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1706ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
170717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1708ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1709d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_HOST_CTL:
1710d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
171144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_PIN_TYPE:
171244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_pin_type_dump(level, frm);
171344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
171444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
171544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_stored_link_key_dump(level, frm);
171644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
171744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
171844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_stored_link_key_dump(level, frm);
171944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
172044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
172144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			delete_stored_link_key_dump(level, frm);
172244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1723d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_NAME:
1724ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_name_dump(level, frm);
1725ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1726ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLASS_OF_DEV:
1727ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_class_of_dev_dump(level, frm);
1728ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1729ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_VOICE_SETTING:
1730ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_voice_setting_dump(level, frm);
1731ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1732fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_READ_CURRENT_IAC_LAP:
1733fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			read_current_iac_lap_dump(level, frm);
1734fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
173569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_SCAN_ENABLE:
173669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_AUTH_ENABLE:
173769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			read_scan_enable_dump(level, frm);
173869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1739097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_READ_CONN_ACCEPT_TIMEOUT:
1740d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_TIMEOUT:
1741d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_timeout_dump(level, frm);
1742d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1743d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_ACTIVITY:
1744d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_INQ_ACTIVITY:
1745d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_activity_dump(level, frm);
1746d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1747a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_READ_INQUIRY_SCAN_TYPE:
1748a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			read_inquiry_scan_type_dump(level, frm);
1749a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
175069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_ENCRYPT_MODE:
1751f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_INQUIRY_MODE:
1752f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_AFH_MODE:
1753f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			read_inquiry_mode_dump(level, frm);
1754f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
17556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
17566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_link_supervision_timeout_dump(level, frm);
17576eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
17586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
17596eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_transmit_power_level_dump(level, frm);
17606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
17611a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_READ_EXT_INQUIRY_RESPONSE:
17621a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			read_ext_inquiry_response_dump(level, frm);
17631a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
176444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
17656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
17666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_response_dump(level, frm);
17676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
176844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
176944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
177044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
177144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
177244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
17731577526370e596583b15d68940c24e975e62a502Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1774f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1775f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1776fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
177769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
177869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
177969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1780097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1781d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1782d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1783d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1784a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1785fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1786fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_AFH_MODE:
1787d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_SET_AFH_CLASSIFICATION:
17881a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
1789d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			status_response_dump(level, frm);
1790ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1791d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
179217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1793d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1794d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_INFO_PARAM:
1795d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1796d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_VERSION:
1797ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_version_dump(level, frm);
1798ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
179917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_COMMANDS:
180017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_commands_dump(level, frm);
180117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1802d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_FEATURES:
1803ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_features_dump(level, frm);
1804ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
180517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
180617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_ext_features_dump(level, frm);
180717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1808d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BUFFER_SIZE:
1809ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_buffer_size_dump(level, frm);
1810ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1811d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BD_ADDR:
1812ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1813ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1814d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
181517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1816d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1817d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_STATUS_PARAM:
1818d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1819d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_FAILED_CONTACT_COUNTER:
1820d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_RESET_FAILED_CONTACT_COUNTER:
1821f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			status_response_dump(level, frm);
1822f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1823d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LINK_QUALITY:
1824f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_link_quality_dump(level, frm);
1825f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1826d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_RSSI:
1827f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_rssi_dump(level, frm);
1828f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1829d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_AFH_MAP:
1830f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_afh_map_dump(level, frm);
1831f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1832d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_CLOCK:
1833f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_clock_dump(level, frm);
1834ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1835d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
183617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1837d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1838ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1839ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1840d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1841d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1842d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm)
1843d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1844d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_status *evt = frm->ptr;
1845d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1846d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1847d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1848d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
1849d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode),
1850d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_opcode_ogf(opcode), cmd_opcode_ocf(opcode),
1851d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, evt->ncmd);
1852d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1853d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1854d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1855d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1856d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1857d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1858d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1859afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void hardware_error_dump(int level, struct frame *frm)
1860afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1861afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	evt_hardware_error *evt = frm->ptr;
1862afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1863afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1864afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("code %d\n", evt->code);
1865afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1866afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1867d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm)
1868d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1869d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
1870b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
1871d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1872d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1873d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < num; i++) {
1874d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inquiry_info *info = frm->ptr;
1875d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1876d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		ba2str(&info->bdaddr, addr);
1877d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1878d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
187972e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n",
188072e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
188172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0]);
1882d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1883d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->ptr += INQUIRY_INFO_SIZE;
1884d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->len -= INQUIRY_INFO_SIZE;
1885d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1886d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1887d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1888d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm)
1889d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1890d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_complete *evt = frm->ptr;
1891d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1892d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1893d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1894d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1895d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1896d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
1897d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), addr,
1898d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode);
1899d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1900d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1902d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1903d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1904d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1905d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1906d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm)
1907d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1908d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_request *evt = frm->ptr;
1909d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1910d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1911d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1912d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1913d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1914d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
1915d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		addr, evt->dev_class[2], evt->dev_class[1],
1916d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO");
1917d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1918d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1919d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm)
1920d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1921d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_disconn_complete *evt = frm->ptr;
1922d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1923d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1924d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
1925d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->reason);
1926d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1927d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1928d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1929d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1930d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	} else if (evt->reason > 0) {
1931d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1932d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Reason: %s\n", status2str(evt->reason));
1933d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1934d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1935d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1936d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm)
1937d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1938d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_remote_name_req_complete *evt = frm->ptr;
1939d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18], name[249];
1940d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1941d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1942d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1943d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1944d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	memset(name, 0, sizeof(name));
1945d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < 248 && evt->name[i]; i++)
1946d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		if (isprint(evt->name[i]))
1947d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = evt->name[i];
1948d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		else
1949d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = '.';
1950d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1951d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1952d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name);
1953d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1954d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1955d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1956d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1957d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1958d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1959d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
196017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_complete_dump(int level, struct frame *frm)
196117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
196217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_master_link_key_complete *evt = frm->ptr;
196317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
196417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
196517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d flag %d\n",
196617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->status, btohs(evt->handle), evt->key_flag);
196717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
196817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
196917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
197017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
197117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
197217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
197317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1974d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm)
1975d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1976d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_encrypt_change *evt = frm->ptr;
1977d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1978d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1979d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
1980d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->encrypt);
1981d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1982d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1983d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1984d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1985d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1986d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1987d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1988ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm)
1989ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1990ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_features_complete *evt = frm->ptr;
1991ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1993ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
1995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1997ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1999ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
2002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
2003ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
2004ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
2005ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2006ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2007ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2008ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm)
2009ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2010ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_version_complete *evt = frm->ptr;
2011ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(evt->manufacturer);
2012ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2013ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2014ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
2015ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2016ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2017ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2018ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2019ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2020ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2021ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
2022ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(evt->lmp_ver), evt->lmp_ver,
2023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(evt->lmp_subver));
2024ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2025ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
2026ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
2027ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2028ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2029ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
203011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void qos_setup_complete_dump(int level, struct frame *frm)
203111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
203211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_qos_setup_complete *evt = frm->ptr;
203311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
203411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
203511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("status 0x%2.2x handle %d flags %d\n",
203611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		evt->status, btohs(evt->handle), evt->flags);
203711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
203811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	if (evt->status > 0) {
203911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
204011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Error: %s\n", status2str(evt->status));
204111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	} else {
204211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
204311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
204411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
204511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
204611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
204711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
204811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
204911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
205011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
205111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
205211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	}
205311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
205411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
2055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm)
2056ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2057ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_role_change *evt = frm->ptr;
2058ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2059ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
2062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
2063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, addr, evt->role);
2064ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2068ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2069ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2070ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Role: %s\n", role2str(evt->role));
2071ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm)
2075ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t num = get_u8(frm);
20772374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann	uint16_t handle, packets;
2078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2080ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < num; i++) {
20812374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		handle = btohs(htons(get_u16(frm)));
20822374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		packets = btohs(htons(get_u16(frm)));
20832374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann
20842374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		p_indent(level, frm);
20852374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		printf("handle %d packets %d\n", handle, packets);
2086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm)
2090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_mode_change *evt = frm->ptr;
2092ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2093ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2094ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",
2095ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));
2096ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2097ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2098ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2099ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2100ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2101ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2102ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Mode: %s\n", mode2str(evt->mode));
2103ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2104ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2105ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2106ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm)
2107ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2108ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_pin_code_req *evt = frm->ptr;
2109ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2110ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2111ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2112ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
2113ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
2114ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2115ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2116ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm)
2117ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_link_key_notify *evt = frm->ptr;
2119ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2120ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2121ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2122ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2123ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
212444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
2125ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
212644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2X", evt->link_key[i]);
212744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf(" type %d\n", evt->key_type);
2128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
213011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void max_slots_change_dump(int level, struct frame *frm)
213111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
213211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_max_slots_change *evt = frm->ptr;
213311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
213411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
213511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);
213611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
213711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
2138c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmannstatic inline void data_buffer_overflow_dump(int level, struct frame *frm)
2139c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann{
2140c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	evt_data_buffer_overflow *evt = frm->ptr;
2141c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2142c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	p_indent(level, frm);
2143c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO");
2144c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann}
2145c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2146ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm)
2147ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2148ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_clock_offset_complete *evt = frm->ptr;
2149ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2150ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2151ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",
2152ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), btohs(evt->clock_offset));
2153ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2154ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2155ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2156ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2157ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2158ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2159ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2160ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm)
2161ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2162ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_conn_ptype_changed *evt = frm->ptr;
2163ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(evt->ptype);
2164ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
2165ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2166ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2167ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
2168ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), ptype);
2169ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2170ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2171ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2172ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2173ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2174ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		str = hci_ptypetostr(ptype);
2175ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (str) {
2176ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			p_indent(level, frm);
2177ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf("Packet type: %s\n", str);
2178ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			free(str);
2179ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
2180ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2181ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2182ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
218311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void pscan_rep_mode_change_dump(int level, struct frame *frm)
218411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
218511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_pscan_rep_mode_change *evt = frm->ptr;
218611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	char addr[18];
218711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
218811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
218911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	ba2str(&evt->bdaddr, addr);
219011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);
219111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
2192ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2193f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmannstatic inline void flow_spec_complete_dump(int level, struct frame *frm)
2194f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann{
2195f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	evt_flow_spec_complete *evt = frm->ptr;
2196f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2197f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	p_indent(level, frm);
2198f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	printf("status 0x%2.2x handle %d flags %d %s\n",
2199f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		evt->status, btohs(evt->handle), evt->flags,
2200f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		evt->direction == 0 ? "outgoing" : "incoming");
2201f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2202f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	if (evt->status > 0) {
2203f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2204f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2205f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	} else {
2206f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2207f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
2208f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2209f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
2210f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2211f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
2212f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2213f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
2214f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2215f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
2216f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	}
2217f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann}
2218f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2219d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm)
2220d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
2221d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
2222b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
2223d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
2224d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2225ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (!num)
2226ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		return;
2227d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2228ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
2229ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2230ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr;
2231d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2232ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2233d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2234ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			ba2str(&info->bdaddr, addr);
2235ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2236ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2237ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2238ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2239ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2240ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2241ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2242ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	} else {
2243ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2244ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi *info = frm->ptr;
2245ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2246ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2247ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2248ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			ba2str(&info->bdaddr, addr);
2249ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2250ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2251ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2252ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2253ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
2254ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
2255ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2256d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2257d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
2258d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
225917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_complete_dump(int level, struct frame *frm)
226017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
226117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_read_remote_ext_features_complete *evt = frm->ptr;
226217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
226317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
226417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
226517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d page %d max %d\n",
226617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->status, btohs(evt->handle),
226717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->page_num, evt->max_page_num);
226817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
226917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
227017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
227117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
227217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
227317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
227417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
227517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
227617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
227717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
227817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
227917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
228017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
2281d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_complete_dump(int level, struct frame *frm)
2282d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2283d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_complete *evt = frm->ptr;
2284d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	char addr[18];
2285d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2286d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	ba2str(&evt->bdaddr, addr);
2287d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2288d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2289d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s\n",
2290d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->status, btohs(evt->handle), addr,
2291d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->link_type == 0 ? "SCO" : "eSCO");
2292d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2293d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2294d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2295d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2296d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	} else {
2297d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2298d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Air mode: %s\n", airmode2str(evt->air_mode));
2299d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2300d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2301d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2302d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_changed_dump(int level, struct frame *frm)
2303d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2304d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_changed *evt = frm->ptr;
2305d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2306d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2307d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	printf("status 0x%2.2x handle %d\n",
2308d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->status, btohs(evt->handle));
2309d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2310d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2311d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2312d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2313d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2314d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2315d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2316807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmannstatic inline void extended_inq_result_dump(int level, struct frame *frm)
2317807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann{
2318807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	uint8_t num = get_u8(frm);
2319807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	char addr[18];
2320807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	int i;
2321807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2322807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	for (i = 0; i < num; i++) {
2323807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inquiry_info *info = frm->ptr;
2324807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2325807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		ba2str(&info->bdaddr, addr);
2326807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2327807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		p_indent(level, frm);
232827eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2329807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
233027eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
233127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
233227eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
233327eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
233427eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
2335e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann		ext_inquiry_response_dump(level, frm);
2336807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	}
2337807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann}
2338807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
233965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm)
234095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2341174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_event_hdr *hdr = frm->ptr;
2342be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	uint8_t event = hdr->evt;
234365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
234465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (p_filter(FILT_HCI))
234565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		return;
234665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2347ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
234895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2349d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (event <= EVENT_NUM) {
2350803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: %s (0x%2.2x) plen %d\n",
2351d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			event_str[hdr->evt], hdr->evt, hdr->plen);
2352be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_TESTING) {
2353803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
2354be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_VENDOR) {
2355803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
2356be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (get_manufacturer() == 10) {
2357be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->ptr += HCI_EVENT_HDR_SIZE;
2358be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->len -= HCI_EVENT_HDR_SIZE;
2359be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			csr_dump(level + 1, frm);
2360be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			return;
2361be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
2362be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else
236366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
236465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
236565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_EVENT_HDR_SIZE;
236665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_EVENT_HDR_SIZE;
236765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2368be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (event == EVT_CMD_COMPLETE) {
2369be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		evt_cmd_complete *cc = frm->ptr;
2370be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {
2371be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;
2372be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			manufacturer = rp->manufacturer;
2373be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
2374be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
2375be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
237625554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	if (event == EVT_DISCONN_COMPLETE) {
237725554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		evt_disconn_complete *evt = frm->ptr;
237825554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		l2cap_clear(btohs(evt->handle));
237925554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	}
238025554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann
2381d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
2382d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2383d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
2384d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2385d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2386d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (event) {
2387ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann	case EVT_LOOPBACK_COMMAND:
2388ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		command_dump(level + 1, frm);
2389ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
2390d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_COMPLETE:
2391d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_complete_dump(level + 1, frm);
2392d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2393d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_STATUS:
2394d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_status_dump(level + 1, frm);
2395d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2396afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_HARDWARE_ERROR:
2397afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		hardware_error_dump(level + 1, frm);
2398afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2399afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_FLUSH_OCCURRED:
2400f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_QOS_VIOLATION:
2401afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		handle_response_dump(level + 1, frm);
2402afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2403d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_COMPLETE:
2404d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		status_response_dump(level + 1, frm);
2405d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2406d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT:
2407d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_dump(level + 1, frm);
2408d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2409d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_COMPLETE:
2410d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_complete_dump(level + 1, frm);
2411d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2412d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_REQUEST:
2413d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_request_dump(level + 1, frm);
2414d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2415d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_DISCONN_COMPLETE:
2416d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		disconn_complete_dump(level + 1, frm);
2417d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2418d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_AUTH_COMPLETE:
2419d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
2420d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		generic_response_dump(level + 1, frm);
2421d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
242217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_MASTER_LINK_KEY_COMPLETE:
242317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		master_link_key_complete_dump(level + 1, frm);
242417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2425d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_REMOTE_NAME_REQ_COMPLETE:
2426d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		remote_name_req_complete_dump(level + 1, frm);
2427d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2428d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_ENCRYPT_CHANGE:
2429d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		encrypt_change_dump(level + 1, frm);
2430d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_FEATURES_COMPLETE:
2432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_features_complete_dump(level + 1, frm);
2433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_VERSION_COMPLETE:
2435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_version_complete_dump(level + 1, frm);
2436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_QOS_SETUP_COMPLETE:
243811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		qos_setup_complete_dump(level + 1, frm);
2439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2440ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_ROLE_CHANGE:
2441ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		role_change_dump(level + 1, frm);
2442ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2443ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_NUM_COMP_PKTS:
2444ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		num_comp_pkts_dump(level + 1, frm);
2445ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_MODE_CHANGE:
2447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		mode_change_dump(level + 1, frm);
2448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2449b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	case EVT_RETURN_LINK_KEYS:
2450b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		return_link_keys_dump(level + 1, frm);
2451b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		break;
2452ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_PIN_CODE_REQ:
2453ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_REQ:
2454ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		pin_code_req_dump(level + 1, frm);
2455ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_NOTIFY:
2457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		link_key_notify_dump(level + 1, frm);
2458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2459c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	case EVT_DATA_BUFFER_OVERFLOW:
2460c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		data_buffer_overflow_dump(level + 1, frm);
2461c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		break;
246211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_MAX_SLOTS_CHANGE:
246311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		max_slots_change_dump(level + 1, frm);
246411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2465ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_CLOCK_OFFSET_COMPLETE:
2466ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_clock_offset_complete_dump(level + 1, frm);
2467ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2468ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_CONN_PTYPE_CHANGED:
2469ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		conn_ptype_changed_dump(level + 1, frm);
2470ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
247111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_PSCAN_REP_MODE_CHANGE:
247211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		pscan_rep_mode_change_dump(level + 1, frm);
247311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2474f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_FLOW_SPEC_COMPLETE:
2475f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		flow_spec_complete_dump(level + 1, frm);
2476f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		break;
2477d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT_WITH_RSSI:
2478d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_with_rssi_dump(level + 1, frm);
2479d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
248017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:
248117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		read_remote_ext_features_complete_dump(level + 1, frm);
248217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2483d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_COMPLETE:
2484d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_complete_dump(level + 1, frm);
2485d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2486d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_CHANGED:
2487d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_changed_dump(level + 1, frm);
2488d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2489807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	case EVT_EXTENDED_INQUIRY_RESULT:
2490807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inq_result_dump(level + 1, frm);
2491807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		break;
2492d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	default:
2493d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2494d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2495d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
249695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
249795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
249865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm)
249995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2500174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_acl_hdr *hdr = (void *) frm->ptr;
25010d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
25020d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t dlen = btohs(hdr->dlen);
25030d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t flags = acl_flags(handle);
250465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
250565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (!p_filter(FILT_HCI)) {
2506ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2507d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",
250865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			acl_handle(handle), flags, dlen);
250965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		level++;
251065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	}
2511e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2512e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->ptr += HCI_ACL_HDR_SIZE;
2513e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->len -= HCI_ACL_HDR_SIZE;
2514f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->flags  = flags;
2515f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->handle = acl_handle(handle);
251665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
251765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (parser.filter & ~FILT_HCI)
251865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		l2cap_dump(level, frm);
251965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	else
252065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
252195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
252295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2523d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm)
2524d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{
2525d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	hci_sco_hdr *hdr = (void *) frm->ptr;
25260d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
2527d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
25280033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann	if (frm->audio_fd > 2)
25290033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann		write(frm->audio_fd, frm->ptr + HCI_SCO_HDR_SIZE, hdr->dlen);
25300033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann
2531d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	if (!p_filter(FILT_SCO)) {
2532ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2533d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("SCO data: handle %d dlen %d\n",
2534d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky			acl_handle(handle), hdr->dlen);
2535d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		level++;
2536d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2537d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->ptr += HCI_SCO_HDR_SIZE;
2538d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->len -= HCI_SCO_HDR_SIZE;
2539d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		raw_dump(level, frm);
2540d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	}
2541d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky}
2542d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2543b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm)
2544b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{
2545b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (p_filter(FILT_HCI))
2546b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2547b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
254838acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	if (frm->dev_id == HCI_DEV_NONE) {
2549a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann		uint16_t device = btohs(htons(get_u16(frm)));
2550ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann		uint16_t proto = btohs(htons(get_u16(frm)));
255138acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t type = btohs(htons(get_u16(frm)));
255238acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t plen = btohs(htons(get_u16(frm)));
255338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
255438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		p_indent(level, frm);
255538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
2556ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann		printf("System %s: device hci%d proto 0x%2.2x type 0x%2.2x plen %d\n",
2557ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann			frm->in ? "event" : "command", device, proto, type, plen);
255838acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
255938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		raw_dump(level, frm);
256038acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		return;
256138acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	}
256238acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
2563b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (get_manufacturer() == 12) {
2564b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		bpa_dump(level, frm);
2565b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2566b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	}
2567b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
2568b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	p_indent(level, frm);
2569b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	printf("Vendor data: len %d\n", frm->len);
2570b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	raw_dump(level, frm);
2571b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann}
2572b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
2573174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm)
257495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2575d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t type = *(uint8_t *)frm->ptr;
257695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2577174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	frm->ptr++; frm->len--;
2578e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
257995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	switch (type) {
258095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_COMMAND_PKT:
258165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		command_dump(level, frm);
258295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
258395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
258495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_EVENT_PKT:
258565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		event_dump(level, frm);
258695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
258795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
258895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_ACLDATA_PKT:
258965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		acl_dump(level, frm);
259095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
259195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2592d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	case HCI_SCODATA_PKT:
2593d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		sco_dump(level, frm);
2594d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		break;
2595e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2596b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	case HCI_VENDOR_PKT:
2597b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		vendor_dump(level, frm);
2598b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		break;
2599b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
260095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	default:
260165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		if (p_filter(FILT_HCI))
260265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			break;
260365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2604ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2605174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
260665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
260795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
260895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	}
260995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
2610