hci.c revision 0033462dddb3b4adf56ea28680c1f135f25a4387
195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/*
2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
3e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Bluetooth packet analyzer - HCI parser
4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Copyright (C) 2000-2002  Maxim Krasnyansky <maxk@qualcomm.com>
6d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann *  Copyright (C) 2003-2005  Marcel Holtmann <marcel@holtmann.org>
7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is free software; you can redistribute it and/or modify
10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  it under the terms of the GNU General Public License as published by
11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  the Free Software Foundation; either version 2 of the License, or
12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  (at your option) any later version.
13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is distributed in the hope that it will be useful,
15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  GNU General Public License for more details.
18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  You should have received a copy of the GNU General Public License
20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  along with this program; if not, write to the Free Software
21e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
23e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
24e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  $Id$
2595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky */
2695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdio.h>
28e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#include <errno.h>
29d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#include <ctype.h>
3095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdlib.h>
3195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <unistd.h>
3295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <string.h>
3395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/types.h>
350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <sys/socket.h>
360d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <netinet/in.h>
3795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/bluetooth.h>
3995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/hci.h>
40ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann#include <bluetooth/hci_lib.h>
4195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
4295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include "parser.h"
4395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
44be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic uint16_t manufacturer = DEFAULT_COMPID;
45be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
46be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic inline uint16_t get_manufacturer(void)
47be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann{
48be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer);
49be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann}
50be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
5113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define EVENT_NUM 47
5213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *event_str[EVENT_NUM + 1] = {
5366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Unknown",
5466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Complete",
5566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Result",
5666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Complete",
5766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Request",
5866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Disconn Complete",
5966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Auth Complete",
6066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Remote Name Req Complete",
61d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	"Encrypt Change",
6266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Change Connection Link Key Complete",
6366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Master Link Key Complete",
6466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Supported Features",
6566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Ver Info Complete",
6666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Setup Complete",
6766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Complete",
6866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Status",
6966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Hardware Error",
7066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Flush Occurred",
7166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Role Change",
7266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Number of Completed Packets",
7366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Mode Change",
7466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Return Link Keys",
7566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"PIN Code Request",
7666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Request",
7766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Notification",
7866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Loopback Command",
7966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Data Buffer Overflow",
8066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Max Slots Change",
8166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Clock Offset Complete",
8266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connection Packet Type Changed",
8366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Violation",
8466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Page Scan Mode Change",
85328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Page Scan Repetition Mode Change",
86328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Flow Specification Complete",
87328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Inquiry Result with RSSI",
88328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
89328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
90328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
91328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
92328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
93328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
94328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
95328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
96328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
97328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Synchronous Connect Complete",
981a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Synchronous Connect Changed",
991a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Unknown",
1001a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Extended Inquiry Result",
10166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky};
1022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
10313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_LINKCTL_NUM 41
10413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkctl_str[CMD_LINKCTL_NUM + 1] = {
1052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry",
1072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry Cancel",
1082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Periodic Inquiry Mode",
1092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Periodic Inquiry Mode",
1102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create Connection",
1112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Disconnect",
1122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Add SCO Connection",
113328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Create Connection Cancel",
1142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Accept Connection Request",
1152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reject Connection Request",
1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Reply",
1172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Negative Reply",
1182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Reply",
1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Negative Reply",
1202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Packet Type",
121f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Authentication Requested",
123f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Connection Encryption",
125f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Link Key",
127f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Master Link Key",
129f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Remote Name Request",
131328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Remote Name Request Cancel",
1322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Supported Features",
133328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
1342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Version Information",
135f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
136328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Clock Offset",
137328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read LMP Handle"
138328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
139328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
140328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
141328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
142328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
143328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
144328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
145328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Setup Synchronous Connection",
146328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Accept Synchronous Connection",
1471a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Reject Synchronous Connection",
1482bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
1492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
15013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_LINKPOL_NUM 16
15113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkpol_str[CMD_LINKPOL_NUM + 1] = {
1522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Hold Mode",
154f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Sniff Mode",
1562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Sniff Mode",
157328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Park State",
158328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Exit Park State",
1592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"QoS Setup",
160f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Role Discovery",
162f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Switch Role",
1642bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Policy Settings",
165328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Link Policy Settings",
166328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Default Link Policy Settings",
167328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Default Link Policy Settings",
1681a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Flow Specification",
1692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
1702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
17113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_HOSTCTL_NUM 82
17213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_hostctl_str[CMD_HOSTCTL_NUM + 1] = {
1732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Mask",
175f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset",
177f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Filter",
179f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
180f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Flush",
1822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read PIN Type ",
1832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write PIN Type",
1842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create New Unit Key",
185f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Stored Link Key",
187f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
188f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
189f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Stored Link Key",
1912bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Delete Stored Link Key",
192328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Local Name",
1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Name",
1942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Connection Accept Timeout",
1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Connection Accept Timeout",
1962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Timeout",
1972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Timeout",
1982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Scan Enable",
1992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Scan Enable",
2002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Activity",
2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Activity",
2022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Inquiry Scan Activity",
2032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Inquiry Scan Activity",
2042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Authentication Enable",
2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Authentication Enable",
2062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Encryption Mode",
2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Encryption Mode",
2082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Class of Device",
2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Class of Device",
2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Voice Setting",
2112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Voice Setting",
2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Automatic Flush Timeout",
2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Automatic Flush Timeout",
2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Num Broadcast Retransmissions",
2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Num Broadcast Retransmissions",
2162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Hold Mode Activity ",
2172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Hold Mode Activity",
2182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Transmit Power Level",
219328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Synchronous Flow Control Enable",
220328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Synchronous Flow Control Enable",
221f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Host Controller To Host Flow Control",
223f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Buffer Size",
225f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Number of Completed Packets",
2272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Supervision Timeout",
2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Link Supervision Timeout",
2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Number of Supported IAC",
2302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Current IAC LAP",
2312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Current IAC LAP",
2322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Period Mode",
2332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Period Mode",
2342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Mode",
235328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Mode",
236328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Set AFH Host Channel Classification",
237328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
238328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
239328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Scan Type",
240328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Scan Type",
241328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Mode",
242328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Mode",
243328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Page Scan Type",
244328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Type",
245328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Assessment Mode",
2461a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write AFH Channel Assessment Mode",
2471a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Unknown",
24813acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
24913acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
25313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann	"Unknown",
2541a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Extended Inquiry Response",
2551a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Write Extended Inquiry Response",
2562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2572bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
25813acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_INFO_NUM 9
25913acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_info_str[CMD_INFO_NUM + 1] = {
2602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Version Information",
262328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Supported Commands",
2632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Supported Features",
264328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Extended Features",
2652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Buffer Size",
266f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Country Code",
268f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2691a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read BD ADDR",
2702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
27213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_STATUS_NUM 7
27313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_status_str[CMD_STATUS_NUM + 1] = {
2742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Failed Contact Counter",
2762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset Failed Contact Counter",
277328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Link Quality",
278f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
279328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read RSSI",
280328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Map",
2811a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Read Clock",
2822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
28366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky
28413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define ERROR_CODE_NUM 53
28513acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *error_code_str[ERROR_CODE_NUM + 1] = {
286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Success",
287d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown HCI Command",
288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown Connection Identifier",
289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Hardware Failure",
290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Page Timeout",
291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Authentication Failure",
292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"PIN or Key Missing",
293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Memory Capacity Exceeded",
294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Timeout",
295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Limit Exceeded",
296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Synchronous Connection to a Device Exceeded",
297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"ACL Connection Already Exists",
298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Command Disallowed",
299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Limited Resources",
300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Security Reasons",
301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Unacceptable BD_ADDR",
302d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Accept Timeout Exceeded",
303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Feature or Parameter Value",
304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid HCI Command Parameters",
30560864ce9e77ec159d0914fe8d938565493f08eebMarcel Holtmann	"Remote User Terminated Connection",
306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Low Resources",
307d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Power Off",
308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Terminated by Local Host",
309fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Repeated Attempts",
310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Pairing Not Allowed",
311d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown LMP PDU",
312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Remote Feature / Unsupported LMP Feature",
313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Offset Rejected",
314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Interval Rejected",
315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Air Mode Rejected",
316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid LMP Parameters",
317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unspecified Error",
318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported LMP Parameter Value",
319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Change Not Allowed",
320d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Response Timeout",
321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Error Transaction Collision",
322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP PDU Not Allowed",
323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Encryption Mode Not Acceptable",
324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Link Key Can Not be Changed",
325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Requested QoS Not Supported",
326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Instant Passed",
327fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Pairing with Unit Key Not Supported",
328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Different Transaction Collision",
329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Unacceptable Parameter",
331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Rejected",
332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Channel Classification Not Supported",
333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Insufficient Security",
334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Parameter out of Mandatory Range",
335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Switch Pending",
337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved Slot Violation",
3391a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	"Role Switch Failed",
340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann};
341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *status2str(uint8_t status)
343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char *str;
345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status <= ERROR_CODE_NUM)
347d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = error_code_str[status];
348d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	else
349d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = "Unknown";
350d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
351d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return str;
352d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
353d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
354d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *opcode2str(uint16_t opcode)
35595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
3560d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
3570d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
3582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	char *cmd;
35995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	switch (ogf) {
3612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_INFO_PARAM:
3622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_INFO_NUM)
363d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_info_str[ocf];
3642bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_HOST_CTL:
3692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_HOSTCTL_NUM)
370d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_hostctl_str[ocf];
3712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_CTL:
3762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKCTL_NUM)
377d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkctl_str[ocf];
3782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_POLICY:
3832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKPOL_NUM)
384d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkpol_str[ocf];
3852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_STATUS_PARAM:
3902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_STATUS_NUM)
391d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_status_str[ocf];
3922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
396cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_TESTING_CMD:
397cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Testing";
398cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
399cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
400cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_VENDOR_CMD:
401cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Vendor";
402cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
403cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
4042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	default:
4052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		cmd = "Unknown";
4062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
4072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	}
4082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
409d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return cmd;
410d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
411d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *role2str(uint8_t role)
413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (role) {
415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
416ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Master";
417ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
418ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Slave";
419ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
420ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
421ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
422ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *mode2str(uint8_t mode)
425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (mode) {
427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Active";
429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Hold";
431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x02:
432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Sniff";
433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x03:
434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Park";
435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
438ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
440d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic char *airmode2str(uint8_t mode)
441d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
442d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	switch (mode) {
443d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x00:
444d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "u-law log";
445d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x01:
446d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "A-law log";
447d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x02:
448d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "CVSD";
449d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case 0x04:
450d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Transparent data";
451d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	default:
452d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		return "Reserved";
453d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
454d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
455d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void generic_command_dump(int level, struct frame *frm)
457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
459ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
460ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
461ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d\n", handle);
462ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
463ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
464ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
465ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
46690480219be366c65e68ae8612de7a361027e751aMarcel Holtmannstatic inline void bdaddr_command_dump(int level, struct frame *frm)
46790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann{
46890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
46990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	char addr[18];
47090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
47190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->ptr += sizeof(bdaddr_t);
47290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	frm->len -= sizeof(bdaddr_t);
47390480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
47490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	p_indent(level, frm);
47590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	ba2str(bdaddr, addr);
47690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann        printf("bdaddr %s\n", addr);
47790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
47890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann	raw_dump(level, frm);
47990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann}
48090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann
481ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void inquiry_dump(int level, struct frame *frm)
482ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
483ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	inquiry_cp *cp = frm->ptr;
484ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
485ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
486ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
487ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
488ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
489ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
490ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void periodic_inquiry_dump(int level, struct frame *frm)
491ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
492ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	periodic_inquiry_cp *cp = frm->ptr;
493ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
494ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
495ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
496ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		btohs(cp->max_period), btohs(cp->min_period),
497ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
498ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
499ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
500ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void create_conn_dump(int level, struct frame *frm)
501ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
502ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	create_conn_cp *cp = frm->ptr;
503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
505ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], *str;
506ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
507ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
508ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
509ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n",
510ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		addr, ptype, cp->role_switch,
511ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
512ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
513ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
515ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
516ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
517ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
518ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
519ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
520ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
521ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void disconnect_dump(int level, struct frame *frm)
522ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
523ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	disconnect_cp *cp = frm->ptr;
524ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
525ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
526ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason);
527ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
528ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
529ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
530ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
531ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
532ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void add_sco_dump(int level, struct frame *frm)
533ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
534ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	add_sco_cp *cp = frm->ptr;
535ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
536ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
537ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
538ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype);
540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void accept_conn_req_dump(int level, struct frame *frm)
550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	accept_conn_req_cp *cp = frm->ptr;
552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s role 0x%2.2x\n", addr, cp->role);
557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Role: %s\n", role2str(cp->role));
560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void reject_conn_req_dump(int level, struct frame *frm)
563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
564ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	reject_conn_req_cp *cp = frm->ptr;
565ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
566ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason);
570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
573ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
574ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
575ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_reply_dump(int level, struct frame *frm)
576ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
577ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	pin_code_reply_cp *cp = frm->ptr;
578ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], pin[17];
579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(pin, 0, sizeof(pin));
583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memcpy(pin, cp->pin_code, cp->pin_len);
584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin);
585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_reply_dump(int level, struct frame *frm)
588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	link_key_reply_cp *cp = frm->ptr;
590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
59544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
59744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2X", cp->link_key[i]);
598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("\n");
599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_neg_reply_dump(int level, struct frame *frm)
602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void set_conn_encrypt_dump(int level, struct frame *frm)
612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
613ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	set_conn_encrypt_cp *cp = frm->ptr;
614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt);
617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void remote_name_req_dump(int level, struct frame *frm)
620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
621ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	remote_name_req_cp *cp = frm->ptr;
622ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
623ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
626ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
62772e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann	printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n",
62872e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		addr, cp->pscan_rep_mode,
62972e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
631ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
63217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_dump(int level, struct frame *frm)
63317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
63417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	master_link_key_cp *cp = frm->ptr;
63517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
63617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
63717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("flag %d\n", cp->key_flag);
63817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
63917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
64017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_dump(int level, struct frame *frm)
64117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
64217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_remote_ext_features_cp *cp = frm->ptr;
64317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
64417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann        p_indent(level, frm);
645b7aa4c8a065d56e738d352cc491262313c01ef98Marcel Holtmann        printf("handle %d page %d\n", btohs(cp->handle), cp->page_num);
64617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
64717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_link_policy_dump(int level, struct frame *frm)
649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_link_policy_cp *cp = frm->ptr;
651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t policy = btohs(cp->policy);
652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
654ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
655ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy);
656ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
657ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_lptostr(policy);
658ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
659ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
660ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Link policy: %s\n", str);
661ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
662ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
663ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
664ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
66544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_mask_dump(int level, struct frame *frm)
66644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
66744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_mask_cp *cp = frm->ptr;
66844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i;
66944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
67044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
67144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("Mask: 0x");
67244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (i = 0; i < 8; i++)
67344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2x", cp->mask[i]);
67444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("\n");
67544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
67644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
67744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_flt_dump(int level, struct frame *frm)
67844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
67944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	set_event_flt_cp *cp = frm->ptr;
68044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
68144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
68244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("type %d condition %d\n", cp->flt_type, cp->cond_type);
68344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
68444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	switch (cp->flt_type) {
68544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CLEAR_ALL:
68644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Clear all filters\n");
68744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
68844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_INQ_RESULT:
68944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Inquiry result");
69044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
69144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_ALL:
69244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_CLASS:
69344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case INQ_RESULT_RETURN_BDADDR:
69444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
69544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
69644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
69744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
69844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
69944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	case FLT_CONN_SETUP:
70044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Connection setup");
70144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		switch (cp->cond_type) {
70244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_ALL:
70344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_CLASS:
70444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case CONN_SETUP_ALLOW_BDADDR:
70544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		default:
70644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("\n");
70744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			break;
70844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		}
70944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		break;
71044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
71144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
71244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
71344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_pin_type_dump(int level, struct frame *frm)
71444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
71544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_pin_type_cp *cp = frm->ptr;
71644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
71744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
71844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("type %d\n", cp->pin_type);
71944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
72044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
72144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void request_stored_link_key_dump(int level, struct frame *frm)
72244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
72344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_cp *cp = frm->ptr;
72444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
72544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
72644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
72744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	ba2str(&cp->bdaddr, addr);
72844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s all %d\n", addr, cp->read_all);
72944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
73044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
73144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void return_link_keys_dump(int level, struct frame *frm)
73244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
73344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t num = get_u8(frm);
73444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	uint8_t key[16];
73544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	char addr[18];
73644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	int i, n;
73744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
73844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	for (n = 0; n < num; n++) {
73944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		ba2str(frm->ptr, addr);
74044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		memcpy(key, frm->ptr + 6, 16);
74144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
74244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
74344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("bdaddr %s key ", addr);
74444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		for (i = 0; i < 16; i++)
74544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			printf("%2.2X", key[i]);
74644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("\n");
74744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
74844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->ptr += 2;
74944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		frm->len -= 2;
75044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
75144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
75244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
753ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void change_local_name_dump(int level, struct frame *frm)
754ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
755ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	change_local_name_cp *cp = frm->ptr;
756ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
757ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
758ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
759ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
760ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && cp->name[i]; i++)
761ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(cp->name[i]))
762ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = cp->name[i];
763ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
764ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
765ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
766ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
767ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("name \'%s\'\n", name);
768ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
769ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
770ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_class_of_dev_dump(int level, struct frame *frm)
771ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
772ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_class_of_dev_cp *cp = frm->ptr;
773ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
774ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
775ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("class 0x%2.2x%2.2x%2.2x\n",
776ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
777ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
778ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
779ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_voice_setting_dump(int level, struct frame *frm)
780ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
781ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_voice_setting_cp *cp = frm->ptr;
782ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
783ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
784ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));
785ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
786ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
787fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void write_current_iac_lap_dump(int level, struct frame *frm)
788fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
789fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	write_current_iac_lap_cp *cp = frm->ptr;
790fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
791fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
792fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < cp->num_current_iac; i++) {
793fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
794fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]);
795fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) {
796fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (cp->lap[i][0]) {
797fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
798fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
799fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
800fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
801fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
802fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
803fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
804fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
805fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
806fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
807fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
808fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
80969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void write_scan_enable_dump(int level, struct frame *frm)
81069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
81169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
81269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
81369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
81469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("enable %d\n", enable);
81569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
81669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
817d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_timeout_dump(int level, struct frame *frm)
818d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
819d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_timeout_cp *cp = frm->ptr;
820d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
821d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
822d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("timeout %d\n", btohs(cp->timeout));
823d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
824d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
825d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_activity_dump(int level, struct frame *frm)
826d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
827d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	write_page_activity_cp *cp = frm->ptr;
828d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
829d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
830d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window));
831d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
832d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
833a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void write_inquiry_scan_type_dump(int level, struct frame *frm)
834a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
835a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	write_inquiry_scan_type_cp *cp = frm->ptr;
836a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
837a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
838a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("type %d\n", cp->type);
839a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
840a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
841f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmannstatic inline void write_inquiry_mode_dump(int level, struct frame *frm)
842f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann{
843f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	write_inquiry_mode_cp *cp = frm->ptr;
844f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
845f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	p_indent(level, frm);
846f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann	printf("mode %d\n", cp->mode);
847f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann}
848f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann
8496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void write_link_supervision_timeout_dump(int level, struct frame *frm)
8506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
8516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	write_link_supervision_timeout_cp *cp = frm->ptr;
8526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
8536eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
8546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d timeout %d\n",
8556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		btohs(cp->handle), btohs(cp->link_sup_to));
8566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
8576eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
8581a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void write_ext_inquiry_response_dump(int level, struct frame *frm)
8591a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
8601a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	write_ext_inquiry_response_cp *cp = frm->ptr;
8611a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
8621a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
8631a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("fec 0x%2.2x\n", cp->fec);
864f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
865f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	frm->ptr++;
866f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	frm->len--;
867f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
868f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	raw_dump(level, frm);
8691a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
8701a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
8716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void request_transmit_power_level_dump(int level, struct frame *frm)
8726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
8736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_cp *cp = frm->ptr;
8746eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
8756eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
8766eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("handle %d type %d (%s)\n",
8776eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		btohs(cp->handle), cp->type,
8786eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		cp->type ? "maximum" : "current");
8796eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
8806eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
88117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void request_local_ext_features_dump(int level, struct frame *frm)
88217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
88317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_cp *cp = frm->ptr;
88417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
88517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
88617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("page %d\n", cp->page_num);
88717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
88817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
889f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void request_clock_dump(int level, struct frame *frm)
890f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
891f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_cp *cp = frm->ptr;
892f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
893f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
894f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("handle %d which %d (%s)\n",
895f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		btohs(cp->handle), cp->which_clock,
896f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		cp->which_clock ? "piconet" : "local");
897f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
898f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
899d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm)
900d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	hci_command_hdr *hdr = frm->ptr;
902d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(hdr->opcode);
903d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
904d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
905d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
906d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (p_filter(FILT_HCI))
907d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
908d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
909ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
91065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
911803752117135528b1adebf0fa045596e188a996dMarcel Holtmann	printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
912d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, hdr->plen);
91365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
91465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_COMMAND_HDR_SIZE;
91565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_COMMAND_HDR_SIZE;
91665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
917be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (ogf == OGF_VENDOR_CMD && ocf == 0 && get_manufacturer() == 10) {
918be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		csr_dump(level + 1, frm);
919be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		return;
920be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
921be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
9224f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
9234f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
9244f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
9254f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
9264f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
927ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (ogf) {
928ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
929ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
930ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY:
931ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			inquiry_dump(level + 1, frm);
932ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
933ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
934ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			periodic_inquiry_dump(level + 1, frm);
935ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
936ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY_CANCEL:
937ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
938ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
939ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CREATE_CONN:
940ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			create_conn_dump(level + 1, frm);
941ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
942ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_DISCONNECT:
943ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			disconnect_dump(level + 1, frm);
944ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
94590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
94690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
94790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_ACCEPT_SYNC_CONN_REQ:
94890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			bdaddr_command_dump(level + 1, frm);
94990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann			return;
950ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ADD_SCO:
951ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_PTYPE:
952ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			add_sco_dump(level + 1, frm);
953acc2322e0bed89e8ada2564359a1a6d293c9d514Marcel Holtmann			return;
954ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ACCEPT_CONN_REQ:
955ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
956ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
957ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REJECT_CONN_REQ:
95890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REJECT_SYNC_CONN_REQ:
959ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			reject_conn_req_dump(level + 1, frm);
960ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
961ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
962ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_reply_dump(level + 1, frm);
963ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
964ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
965ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			link_key_reply_dump(level + 1, frm);
966ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
967ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
968ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
969ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_neg_reply_dump(level + 1, frm);
970ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
971ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_ENCRYPT:
972ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			set_conn_encrypt_dump(level + 1, frm);
973ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
974ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_AUTH_REQUESTED:
975ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_CONN_LINK_KEY:
976ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_FEATURES:
977ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_VERSION:
978ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLOCK_OFFSET:
97990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_READ_LMP_HANDLE:
98090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_SETUP_SYNC_CONN:
981ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
982ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
98317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_MASTER_LINK_KEY:
98417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			master_link_key_dump(level + 1, frm);
98517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
98617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_REMOTE_EXT_FEATURES:
98717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_remote_ext_features_dump(level + 1, frm);
98817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
989ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REMOTE_NAME_REQ:
990ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			remote_name_req_dump(level + 1, frm);
991ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
993ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
997ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_SNIFF_MODE:
998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PARK_MODE:
999ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ROLE_DISCOVERY:
1000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_LINK_POLICY:
1001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
1002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1003ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SWITCH_ROLE:
1004ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
1005ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1006ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
1007ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_link_policy_dump(level + 1, frm);
1008ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1009ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1010ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1011ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1012ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_HOST_CTL:
1013ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
101444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
101544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
101644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
101744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
101844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_mask_dump(level + 1, frm);
101944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
102044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
102144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			set_event_flt_dump(level + 1, frm);
102244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
102344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
102444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_pin_type_dump(level + 1, frm);
102544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
102644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
102744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
102844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			request_stored_link_key_dump(level + 1, frm);
102944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
103044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
103144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return_link_keys_dump(level + 1, frm);
103244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1033ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1034ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			change_local_name_dump(level + 1, frm);
1035ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1036ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1037ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_class_of_dev_dump(level + 1, frm);
1038ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1039ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1040ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_voice_setting_dump(level + 1, frm);
1041ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1042fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
1043fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			write_current_iac_lap_dump(level + 1, frm);
1044fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
104569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
104669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
104769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			write_scan_enable_dump(level + 1, frm);
104869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1049097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1050d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1051d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_timeout_dump(level + 1, frm);
1052d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1053d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1054d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1055d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			write_page_activity_dump(level + 1, frm);
1056d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1057a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1058a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			write_inquiry_scan_type_dump(level + 1, frm);
1059a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
106069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1061f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1062f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_AFH_MODE:
1063f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			write_inquiry_mode_dump(level + 1, frm);
1064f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
10656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
10666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			request_transmit_power_level_dump(level + 1, frm);
10676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
106844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
10696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
10706eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_command_dump(level + 1, frm);
10716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
10726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
10736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			write_link_supervision_timeout_dump(level + 1, frm);
10746eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
10751a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
10761a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			write_ext_inquiry_response_dump(level + 1, frm);
10771a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
1078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1079ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
108017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
108117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case OGF_INFO_PARAM:
108217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		switch (ocf) {
108317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
108417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			request_local_ext_features_dump(level + 1, frm);
108517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
108617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
1087ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
1088f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1089f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	case OGF_STATUS_PARAM:
1090f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		switch (ocf) {
1091f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_LINK_QUALITY:
1092f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_RSSI:
1093f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_AFH_MAP:
1094f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			generic_command_dump(level + 1, frm);
1095f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1096f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		case OCF_READ_CLOCK:
1097f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			request_clock_dump(level + 1, frm);
1098f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1099f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		}
1100f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		break;
1101ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1102ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
110365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	raw_dump(level, frm);
110495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
110595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1106d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm)
1107d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1108d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1109d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1110d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1111d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x\n", status);
1112d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1113d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1114d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1115d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1116d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1117d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1118d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1119d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1120d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1121afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void handle_response_dump(int level, struct frame *frm)
1122afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1123afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1124afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1125afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1126afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("handle %d\n", handle);
1127afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1128afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	raw_dump(level, frm);
1129afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1130afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm)
1132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t status = get_u8(frm);
1134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
1135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->ptr += sizeof(bdaddr_t);
1138ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->len -= sizeof(bdaddr_t);
1139ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1140ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1141ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
1142ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s\n", status, addr);
1143ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1144ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (status > 0) {
1145ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1146ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(status));
1147ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1148ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1149ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1150ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1151ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1152d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm)
1153d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1154d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
1155d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
1156d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1157d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1158d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d\n", status, handle);
1159d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1160d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
1161d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1162d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
1163d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1164d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1165d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
1166d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1167d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
116844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_pin_type_dump(int level, struct frame *frm)
116944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
117044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_pin_type_rp *rp = frm->ptr;
117144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
117244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
117344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type);
117444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
117544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
117644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
117744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
117844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
117944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
118044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
118144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_stored_link_key_dump(int level, struct frame *frm)
118244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
118344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	read_stored_link_key_rp *rp = frm->ptr;
118444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
118544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
118644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x max %d num %d\n",
118744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		rp->status, rp->max_keys, rp->num_keys);
118844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
118944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
119044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
119144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
119244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
119344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
119444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
119544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_stored_link_key_dump(int level, struct frame *frm)
119644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
119744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	write_stored_link_key_rp *rp = frm->ptr;
119844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
119944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
120044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys);
120144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
120244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
120344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
120444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
120544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
120644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
120744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
120844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void delete_stored_link_key_dump(int level, struct frame *frm)
120944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{
121044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	delete_stored_link_key_rp *rp = frm->ptr;
121144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
121244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	p_indent(level, frm);
121344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys));
121444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
121544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	if (rp->status > 0) {
121644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		p_indent(level, frm);
121744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
121844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	}
121944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann}
122044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann
1221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm)
1222ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1223ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_name_rp *rp = frm->ptr;
1224ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
1225ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1226ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
1228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && rp->name[i]; i++)
1229ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(rp->name[i]))
1230ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = rp->name[i];
1231ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
1232ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
1233ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1235ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x name \'%s\'\n", rp->status, name);
1236ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1237ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1238ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1239ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1240ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1241ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1242ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1243ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm)
1244ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1245ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_class_of_dev_rp *rp = frm->ptr;
1246ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1247ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1248ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
1249ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
1250ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1251ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1252ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1253ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1254ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1255ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1256ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1257ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm)
1258ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1259ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_voice_setting_rp *rp = frm->ptr;
1260ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1261ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1262ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x voice setting 0x%4.4x\n",
1263ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->status, btohs(rp->voice_setting));
1264ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1265ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1266ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1267ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1268ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1269ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1270ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1271fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm)
1272fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
1273fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	read_current_iac_lap_rp *rp = frm->ptr;
1274fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
1275fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
1276fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < rp->num_current_iac; i++) {
1277fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
1278fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]);
1279fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) {
1280fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (rp->lap[i][0]) {
1281fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
1282fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
1283fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1284fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
1285fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
1286fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
1287fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
1288fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
1289fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
1290fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
1291fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
1292fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
129369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void read_scan_enable_dump(int level, struct frame *frm)
129469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{
129569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t status = get_u8(frm);
129669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	uint8_t enable = get_u8(frm);
129769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
129869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	p_indent(level, frm);
129969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	printf("status 0x%2.2x enable %d\n", status, enable);
130069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
130169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	if (status > 0) {
130269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		p_indent(level, frm);
130369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		printf("Error: %s\n", status2str(status));
130469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann	}
130569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann}
130669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann
1307d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_timeout_dump(int level, struct frame *frm)
1308d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1309d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_timeout_rp *rp = frm->ptr;
1310d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1311d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1312d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout));
1313d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1314d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1315d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1316d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1317d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1318d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1319d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1320d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_activity_dump(int level, struct frame *frm)
1321d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{
1322d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	read_page_activity_rp *rp = frm->ptr;
1323d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1324d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	p_indent(level, frm);
1325d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	printf("status 0x%2.2x interval %d window %d\n",
1326d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		rp->status, btohs(rp->interval), btohs(rp->window));
1327d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1328d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	if (rp->status > 0) {
1329d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		p_indent(level, frm);
1330d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1331d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann	}
1332d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann}
1333d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann
1334a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void read_inquiry_scan_type_dump(int level, struct frame *frm)
1335a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{
1336a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	read_inquiry_scan_type_rp *rp = frm->ptr;
1337a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1338a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	p_indent(level, frm);
1339a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	printf("status 0x%2.2x type %d\n", rp->status, rp->type);
1340a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
1341a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	if (rp->status > 0) {
1342a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		p_indent(level, frm);
1343a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1344a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann	}
1345a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann}
1346a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann
13476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_inquiry_mode_dump(int level, struct frame *frm)
13486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
13496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_inquiry_mode_rp *rp = frm->ptr;
13506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
13526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x mode %d\n", rp->status, rp->mode);
13536eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
13556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
13566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
13576eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
13586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
13596eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_link_supervision_timeout_dump(int level, struct frame *frm)
13616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
13626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_link_supervision_timeout_rp *rp = frm->ptr;
13636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
13656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d timeout %d\n",
13666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		rp->status, btohs(rp->handle), btohs(rp->link_sup_to));
13676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13686eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
13696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
13706eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
13716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
13726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
13736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13746eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_transmit_power_level_dump(int level, struct frame *frm)
13756eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{
13766eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	read_transmit_power_level_rp *rp = frm->ptr;
13776eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13786eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	p_indent(level, frm);
13796eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	printf("status 0x%2.2x handle %d level %d\n",
13806eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		rp->status, btohs(rp->handle), rp->level);
13816eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13826eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	if (rp->status > 0) {
13836eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		p_indent(level, frm);
13846eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
13856eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann	}
13866eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann}
13876eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann
13881a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void read_ext_inquiry_response_dump(int level, struct frame *frm)
13891a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{
13901a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	read_ext_inquiry_response_rp *rp = frm->ptr;
13911a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
13921a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	p_indent(level, frm);
13931a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec);
13941a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
13951a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	if (rp->status > 0) {
13961a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		p_indent(level, frm);
13971a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1398f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann	} else {
1399f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann		frm->ptr += 2;
1400f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann		frm->len -= 2;
1401f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann
1402f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann		raw_dump(level, frm);
14031a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann	}
14041a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann}
14051a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann
1406ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm)
1407ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1408ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_version_rp *rp = frm->ptr;
1409ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(rp->manufacturer);
1410ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1411ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1416ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1417ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1418ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
14191a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann		printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
1420ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			hci_vertostr(rp->hci_ver), rp->hci_ver,
1421ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->hci_rev));
1422ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
1424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(rp->lmp_ver), rp->lmp_ver,
1425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->lmp_subver));
1426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
1428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
1429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
143217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_commands_dump(int level, struct frame *frm)
143317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
143417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_commands_rp *rp = frm->ptr;
143517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i, max = 0;
143617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
143717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
143817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
143917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
144017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
144117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
144217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
144317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
144417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 64; i++)
144517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			if (rp->commands[i])
144617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				max = i + 1;
144717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
144817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Commands: ");
144917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < (max > 32 ? 32 : max); i++)
145017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("%2.2x", rp->commands[i]);
145117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
145217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		if (max > 32) {
145317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			p_indent(level, frm);
145417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("          ");
145517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			for (i = 32; i < max; i++)
145617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann				printf("%2.2x", rp->commands[i]);
145717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf("\n");
145817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		}
145917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
146017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
146117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1462ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm)
1463ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1464ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_features_rp *rp = frm->ptr;
1465ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1466ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1467ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1468ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1469ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1470ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1471ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1472ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1473ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1474ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1475ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
1476ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
1477ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", rp->features[i]);
1478ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
1479ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1480ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1481ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
148217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_ext_features_dump(int level, struct frame *frm)
148317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
148417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	read_local_ext_features_rp *rp = frm->ptr;
148517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
148617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
148717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
148817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x page %d max %d\n",
148917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		rp->status, rp->page_num, rp->max_page_num);
149017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
149117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (rp->status > 0) {
149217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
149317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
149417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
149517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
149617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
149717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
149817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			 printf(" 0x%2.2x", rp->features[i]);
149917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
150017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
150117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
150217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm)
1504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1505ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_buffer_size_rp *rp = frm->ptr;
1506ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1507ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1508ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
1509ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1510ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
1511ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1512ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1513ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1515ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("ACL MTU %d:%d SCO MTU %d:%d\n",
1516ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
1517ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			rp->sco_mtu, btohs(rp->sco_max_pkt));
1518ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1519ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1520ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1521f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_link_quality_dump(int level, struct frame *frm)
1522f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1523f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_link_quality_rp *rp = frm->ptr;
1524f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1525f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1526f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d lq %d\n",
1527f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->link_quality);
1528f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1529f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1530f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1531f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1532f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1533f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1534f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1535f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_rssi_dump(int level, struct frame *frm)
1536f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1537f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_rssi_rp *rp = frm->ptr;
1538f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1539f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1540f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d rssi %d\n",
1541f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->rssi);
1542f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1543f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1544f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1545f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1546f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1547f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1548f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1549f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_afh_map_dump(int level, struct frame *frm)
1550f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1551f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_afh_map_rp *rp = frm->ptr;
1552f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	int i;
1553f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1554f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1555f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d mode %d\n",
1556f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle), rp->mode);
1557f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1558f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1559f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1560f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1561f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	} else {
1562f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1563f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("AFH map: 0x");
1564f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		for (i = 0; i < 10; i++)
1565f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			printf("%2.2x", rp->map[i]);
1566f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("\n");
1567f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1568f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1569f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1570f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_clock_dump(int level, struct frame *frm)
1571f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{
1572f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	read_clock_rp *rp = frm->ptr;
1573f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1574f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	p_indent(level, frm);
1575f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n",
1576f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		rp->status, btohs(rp->handle),
1577f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		btohl(rp->clock), btohs(rp->accuracy));
1578f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1579f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	if (rp->status > 0) {
1580f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		p_indent(level, frm);
1581f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann		printf("Error: %s\n", status2str(rp->status));
1582f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann	}
1583f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann}
1584f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann
1585d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm)
1586d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1587d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_complete *evt = frm->ptr;
1588d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1589d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
1590d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
1591d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1592d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1593d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
1594d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, evt->ncmd);
1595d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1596d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->ptr += EVT_CMD_COMPLETE_SIZE;
1597d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->len -= EVT_CMD_COMPLETE_SIZE;
1598d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
15994f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
16004f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		raw_dump(level, frm);
16014f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann		return;
16024f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann	}
16034f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann
1604d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (ogf) {
1605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
1606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
160717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_INQUIRY_CANCEL:
160817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
160917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
161017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			status_response_dump(level, frm);
161117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
161290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_CREATE_CONN_CANCEL:
161390480219be366c65e68ae8612de7a361027e751aMarcel Holtmann		case OCF_REMOTE_NAME_REQ_CANCEL:
1614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
1615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
1616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
1617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
1618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
162117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1622ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1623ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
1624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
1625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
1626ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_response_dump(level, frm);
1627ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1628ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
162917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1631d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_HOST_CTL:
1632d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
163344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_PIN_TYPE:
163444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_pin_type_dump(level, frm);
163544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
163644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_READ_STORED_LINK_KEY:
163744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			read_stored_link_key_dump(level, frm);
163844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
163944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_STORED_LINK_KEY:
164044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			write_stored_link_key_dump(level, frm);
164144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
164244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_DELETE_STORED_LINK_KEY:
164344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			delete_stored_link_key_dump(level, frm);
164444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann			return;
1645d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_NAME:
1646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_name_dump(level, frm);
1647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLASS_OF_DEV:
1649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_class_of_dev_dump(level, frm);
1650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_VOICE_SETTING:
1652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_voice_setting_dump(level, frm);
1653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1654fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_READ_CURRENT_IAC_LAP:
1655fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			read_current_iac_lap_dump(level, frm);
1656fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
165769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_SCAN_ENABLE:
165869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_AUTH_ENABLE:
165969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			read_scan_enable_dump(level, frm);
166069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann			return;
1661097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_READ_CONN_ACCEPT_TIMEOUT:
1662d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_TIMEOUT:
1663d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_timeout_dump(level, frm);
1664d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1665d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_PAGE_ACTIVITY:
1666d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_READ_INQ_ACTIVITY:
1667d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			read_page_activity_dump(level, frm);
1668d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann			return;
1669a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_READ_INQUIRY_SCAN_TYPE:
1670a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			read_inquiry_scan_type_dump(level, frm);
1671a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann			return;
167269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_READ_ENCRYPT_MODE:
1673f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_INQUIRY_MODE:
1674f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_READ_AFH_MODE:
1675f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			read_inquiry_mode_dump(level, frm);
1676f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann			return;
16776eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
16786eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_link_supervision_timeout_dump(level, frm);
16796eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
16806eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
16816eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			read_transmit_power_level_dump(level, frm);
16826eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
16831a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_READ_EXT_INQUIRY_RESPONSE:
16841a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			read_ext_inquiry_response_dump(level, frm);
16851a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann			return;
168644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_FLUSH:
16876eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann		case OCF_WRITE_LINK_SUPERVISION_TIMEOUT:
16886eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			generic_response_dump(level, frm);
16896eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann			return;
169044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_RESET:
169144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_MASK:
169244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_SET_EVENT_FLT:
169344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_WRITE_PIN_TYPE:
169444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		case OCF_CREATE_NEW_UNIT_KEY:
16951577526370e596583b15d68940c24e975e62a502Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
1696f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
1697f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann		case OCF_WRITE_VOICE_SETTING:
1698fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
169969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_SCAN_ENABLE:
170069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_AUTH_ENABLE:
170169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann		case OCF_WRITE_ENCRYPT_MODE:
1702097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann		case OCF_WRITE_CONN_ACCEPT_TIMEOUT:
1703d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_TIMEOUT:
1704d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_PAGE_ACTIVITY:
1705d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann		case OCF_WRITE_INQ_ACTIVITY:
1706a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann		case OCF_WRITE_INQUIRY_SCAN_TYPE:
1707fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1708fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_AFH_MODE:
1709d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_SET_AFH_CLASSIFICATION:
17101a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann		case OCF_WRITE_EXT_INQUIRY_RESPONSE:
1711d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			status_response_dump(level, frm);
1712ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1713d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
171417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1715d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1716d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_INFO_PARAM:
1717d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1718d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_VERSION:
1719ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_version_dump(level, frm);
1720ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
172117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_COMMANDS:
172217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_commands_dump(level, frm);
172317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1724d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_FEATURES:
1725ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_features_dump(level, frm);
1726ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
172717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		case OCF_READ_LOCAL_EXT_FEATURES:
172817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			read_local_ext_features_dump(level, frm);
172917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			return;
1730d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BUFFER_SIZE:
1731ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_buffer_size_dump(level, frm);
1732ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1733d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BD_ADDR:
1734ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1735ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1736d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
173717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1738d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1739d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_STATUS_PARAM:
1740d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1741d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_FAILED_CONTACT_COUNTER:
1742d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_RESET_FAILED_CONTACT_COUNTER:
1743f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			status_response_dump(level, frm);
1744f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1745d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LINK_QUALITY:
1746f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_link_quality_dump(level, frm);
1747f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1748d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_RSSI:
1749f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_rssi_dump(level, frm);
1750f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1751d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_AFH_MAP:
1752f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_afh_map_dump(level, frm);
1753f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			return;
1754d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_CLOCK:
1755f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann			read_clock_dump(level, frm);
1756ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1757d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
175817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
1759d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1760ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1761ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1762d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1763d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1764d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm)
1765d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1766d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_status *evt = frm->ptr;
1767d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1768d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1769d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1770d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
1771d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode),
1772d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_opcode_ogf(opcode), cmd_opcode_ocf(opcode),
1773d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, evt->ncmd);
1774d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1775d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1776d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1777d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1778d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1779d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1780d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1781afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void hardware_error_dump(int level, struct frame *frm)
1782afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{
1783afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	evt_hardware_error *evt = frm->ptr;
1784afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1785afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	p_indent(level, frm);
1786afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	printf("code %d\n", evt->code);
1787afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann}
1788afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann
1789d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm)
1790d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1791d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
1792b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
1793d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1794d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1795d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < num; i++) {
1796d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inquiry_info *info = frm->ptr;
1797d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1798d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		ba2str(&info->bdaddr, addr);
1799d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1800d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
180172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n",
180272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
180372e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0]);
1804d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1805d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->ptr += INQUIRY_INFO_SIZE;
1806d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->len -= INQUIRY_INFO_SIZE;
1807d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1808d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1809d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1810d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm)
1811d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1812d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_complete *evt = frm->ptr;
1813d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1814d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1815d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1816d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1817d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1818d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
1819d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), addr,
1820d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode);
1821d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1822d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1823d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1824d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1825d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1826d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1827d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1828d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm)
1829d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1830d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_request *evt = frm->ptr;
1831d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1832d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1833d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1834d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1835d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1836d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
1837d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		addr, evt->dev_class[2], evt->dev_class[1],
1838d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO");
1839d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1840d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1841d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm)
1842d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1843d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_disconn_complete *evt = frm->ptr;
1844d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1845d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1846d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
1847d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->reason);
1848d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1849d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1850d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1851d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1852d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	} else if (evt->reason > 0) {
1853d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1854d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Reason: %s\n", status2str(evt->reason));
1855d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1856d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1857d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1858d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm)
1859d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1860d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_remote_name_req_complete *evt = frm->ptr;
1861d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18], name[249];
1862d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1863d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1864d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1865d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1866d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	memset(name, 0, sizeof(name));
1867d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < 248 && evt->name[i]; i++)
1868d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		if (isprint(evt->name[i]))
1869d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = evt->name[i];
1870d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		else
1871d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = '.';
1872d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1873d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1874d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name);
1875d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1876d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1877d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1878d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1879d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1880d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1881d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
188217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_complete_dump(int level, struct frame *frm)
188317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
188417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_master_link_key_complete *evt = frm->ptr;
188517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
188617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
188717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d flag %d\n",
188817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->status, btohs(evt->handle), evt->key_flag);
188917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
189017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
189117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
189217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
189317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
189417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
189517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
1896d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm)
1897d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1898d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_encrypt_change *evt = frm->ptr;
1899d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1900d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
1902d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->encrypt);
1903d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1904d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1905d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1906d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1907d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1908d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1909d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1910ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm)
1911ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1912ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_features_complete *evt = frm->ptr;
1913ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1914ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1915ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1916ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
1917ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1918ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1919ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1920ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1921ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1922ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1923ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
1924ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
1925ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
1926ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
1927ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1928ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1929ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1930ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm)
1931ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1932ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_version_complete *evt = frm->ptr;
1933ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(evt->manufacturer);
1934ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1935ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1936ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
1937ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1938ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1939ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1940ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1941ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1942ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1943ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
1944ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(evt->lmp_ver), evt->lmp_ver,
1945ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(evt->lmp_subver));
1946ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1947ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
1948ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
1949ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1950ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1951ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
195211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void qos_setup_complete_dump(int level, struct frame *frm)
195311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
195411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_qos_setup_complete *evt = frm->ptr;
195511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
195611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
195711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("status 0x%2.2x handle %d flags %d\n",
195811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		evt->status, btohs(evt->handle), evt->flags);
195911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
196011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	if (evt->status > 0) {
196111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
196211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Error: %s\n", status2str(evt->status));
196311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	} else {
196411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
196511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
196611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
196711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
196811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
196911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
197011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
197111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
197211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		p_indent(level, frm);
197311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
197411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	}
197511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
197611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
1977ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm)
1978ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1979ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_role_change *evt = frm->ptr;
1980ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1981ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1982ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1983ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1984ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
1985ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, addr, evt->role);
1986ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1987ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1988ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1989ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1990ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1991ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Role: %s\n", role2str(evt->role));
1993ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm)
1997ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t num = get_u8(frm);
19992374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann	uint16_t handle, packets;
2000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < num; i++) {
20032374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		handle = btohs(htons(get_u16(frm)));
20042374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		packets = btohs(htons(get_u16(frm)));
20052374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann
20062374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		p_indent(level, frm);
20072374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann		printf("handle %d packets %d\n", handle, packets);
2008ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2009ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2010ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2011ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm)
2012ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2013ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_mode_change *evt = frm->ptr;
2014ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2015ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2016ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",
2017ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));
2018ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2019ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2020ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2021ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2022ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2024ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Mode: %s\n", mode2str(evt->mode));
2025ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2026ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2027ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2028ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm)
2029ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2030ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_pin_code_req *evt = frm->ptr;
2031ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2032ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2033ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2034ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
2035ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
2036ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2037ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2038ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm)
2039ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2040ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_link_key_notify *evt = frm->ptr;
2041ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
2042ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
2043ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2044ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2045ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
204644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf("bdaddr %s key ", addr);
2047ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
204844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann		printf("%2.2X", evt->link_key[i]);
204944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann	printf(" type %d\n", evt->key_type);
2050ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2051ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
205211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void max_slots_change_dump(int level, struct frame *frm)
205311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
205411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_max_slots_change *evt = frm->ptr;
205511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
205611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
205711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);
205811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
205911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
2060c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmannstatic inline void data_buffer_overflow_dump(int level, struct frame *frm)
2061c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann{
2062c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	evt_data_buffer_overflow *evt = frm->ptr;
2063c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2064c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	p_indent(level, frm);
2065c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO");
2066c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann}
2067c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann
2068ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm)
2069ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2070ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_clock_offset_complete *evt = frm->ptr;
2071ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",
2074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), btohs(evt->clock_offset));
2075ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2080ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm)
2083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
2084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_conn_ptype_changed *evt = frm->ptr;
2085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(evt->ptype);
2086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
2087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
2089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
2090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), ptype);
2091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
2092ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
2093ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
2094ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2095ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
2096ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		str = hci_ptypetostr(ptype);
2097ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (str) {
2098ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			p_indent(level, frm);
2099ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf("Packet type: %s\n", str);
2100ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			free(str);
2101ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
2102ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
2103ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
2104ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
210511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void pscan_rep_mode_change_dump(int level, struct frame *frm)
210611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{
210711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	evt_pscan_rep_mode_change *evt = frm->ptr;
210811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	char addr[18];
210911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann
211011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	p_indent(level, frm);
211111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	ba2str(&evt->bdaddr, addr);
211211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);
211311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann}
2114ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2115f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmannstatic inline void flow_spec_complete_dump(int level, struct frame *frm)
2116f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann{
2117f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	evt_flow_spec_complete *evt = frm->ptr;
2118f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2119f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	p_indent(level, frm);
2120f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	printf("status 0x%2.2x handle %d flags %d %s\n",
2121f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		evt->status, btohs(evt->handle), evt->flags,
2122f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		evt->direction == 0 ? "outgoing" : "incoming");
2123f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2124f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	if (evt->status > 0) {
2125f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2126f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2127f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	} else {
2128f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2129f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Service type: %d\n", evt->qos.service_type);
2130f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2131f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Token rate: %d\n", btohl(evt->qos.token_rate));
2132f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2133f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth));
2134f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2135f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Latency: %d\n", btohl(evt->qos.latency));
2136f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		p_indent(level, frm);
2137f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		printf("Delay variation: %d\n", btohl(evt->qos.delay_variation));
2138f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	}
2139f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann}
2140f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann
2141d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm)
2142d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
2143d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
2144b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	char addr[18];
2145d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
2146d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2147ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (!num)
2148ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		return;
2149d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2150ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
2151ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2152ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr;
2153d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2154ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2155d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2156ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			ba2str(&info->bdaddr, addr);
2157ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2158ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2159ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2160ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2161ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2162ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
2163ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2164ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann	} else {
2165ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		for (i = 0; i < num; i++) {
2166ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			inquiry_info_with_rssi *info = frm->ptr;
2167ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2168ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			p_indent(level, frm);
2169ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2170ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			ba2str(&info->bdaddr, addr);
2171ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2172ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				addr, info->pscan_rep_mode, btohs(info->clock_offset),
2173ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann				info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
2174ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann
2175ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
2176ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann			frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
2177ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann		}
2178d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2179d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
2180d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
218117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_complete_dump(int level, struct frame *frm)
218217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{
218317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	evt_read_remote_ext_features_complete *evt = frm->ptr;
218417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	int i;
218517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
218617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	p_indent(level, frm);
218717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	printf("status 0x%2.2x handle %d page %d max %d\n",
218817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->status, btohs(evt->handle),
218917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		evt->page_num, evt->max_page_num);
219017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
219117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	if (evt->status > 0) {
219217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
219317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
219417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	} else {
219517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		p_indent(level, frm);
219617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("Features:");
219717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		for (i = 0; i < 8; i++)
219817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
219917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		printf("\n");
220017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	}
220117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann}
220217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann
2203d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_complete_dump(int level, struct frame *frm)
2204d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2205d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_complete *evt = frm->ptr;
2206d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	char addr[18];
2207d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2208d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	ba2str(&evt->bdaddr, addr);
2209d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2210d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2211d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s\n",
2212d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->status, btohs(evt->handle), addr,
2213d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->link_type == 0 ? "SCO" : "eSCO");
2214d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2215d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2216d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2217d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2218d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	} else {
2219d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2220d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Air mode: %s\n", airmode2str(evt->air_mode));
2221d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2222d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2223d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2224d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_changed_dump(int level, struct frame *frm)
2225d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{
2226d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	evt_sync_conn_changed *evt = frm->ptr;
2227d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2228d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	p_indent(level, frm);
2229d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	printf("status 0x%2.2x handle %d\n",
2230d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		evt->status, btohs(evt->handle));
2231d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2232d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	if (evt->status > 0) {
2233d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		p_indent(level, frm);
2234d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
2235d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	}
2236d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann}
2237d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann
2238807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmannstatic inline void extended_inq_result_dump(int level, struct frame *frm)
2239807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann{
2240807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	uint8_t num = get_u8(frm);
2241807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	char addr[18];
2242807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	int i;
2243807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2244807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	for (i = 0; i < num; i++) {
2245807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inquiry_info *info = frm->ptr;
2246807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2247807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		ba2str(&info->bdaddr, addr);
2248807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
2249807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		p_indent(level, frm);
225027eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
2251807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann			addr, info->pscan_rep_mode, btohs(info->clock_offset),
225227eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann			info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi);
225327eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
225427eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
225527eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
225627eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann
225727eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		raw_dump(level, frm);
2258807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
225927eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->ptr += EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE;
226027eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann		frm->len -= EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE;
2261807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	}
2262807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann}
2263807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann
226465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm)
226595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2266174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_event_hdr *hdr = frm->ptr;
2267be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	uint8_t event = hdr->evt;
226865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
226965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (p_filter(FILT_HCI))
227065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		return;
227165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2272ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
227395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2274d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (event <= EVENT_NUM) {
2275803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: %s (0x%2.2x) plen %d\n",
2276d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			event_str[hdr->evt], hdr->evt, hdr->plen);
2277be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_TESTING) {
2278803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
2279be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_VENDOR) {
2280803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
2281be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (get_manufacturer() == 10) {
2282be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->ptr += HCI_EVENT_HDR_SIZE;
2283be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->len -= HCI_EVENT_HDR_SIZE;
2284be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			csr_dump(level + 1, frm);
2285be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			return;
2286be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
2287be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else
228866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
228965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
229065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_EVENT_HDR_SIZE;
229165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_EVENT_HDR_SIZE;
229265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2293be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (event == EVT_CMD_COMPLETE) {
2294be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		evt_cmd_complete *cc = frm->ptr;
2295be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {
2296be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;
2297be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			manufacturer = rp->manufacturer;
2298be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
2299be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
2300be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
230125554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	if (event == EVT_DISCONN_COMPLETE) {
230225554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		evt_disconn_complete *evt = frm->ptr;
230325554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann		l2cap_clear(btohs(evt->handle));
230425554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann	}
230525554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann
2306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
2307d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
2309d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
2310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
2311d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (event) {
2312ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann	case EVT_LOOPBACK_COMMAND:
2313ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		command_dump(level + 1, frm);
2314ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann		break;
2315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_COMPLETE:
2316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_complete_dump(level + 1, frm);
2317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_STATUS:
2319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_status_dump(level + 1, frm);
2320d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2321afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_HARDWARE_ERROR:
2322afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		hardware_error_dump(level + 1, frm);
2323afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2324afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann	case EVT_FLUSH_OCCURRED:
2325f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_QOS_VIOLATION:
2326afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		handle_response_dump(level + 1, frm);
2327afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann		break;
2328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_COMPLETE:
2329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		status_response_dump(level + 1, frm);
2330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT:
2332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_dump(level + 1, frm);
2333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_COMPLETE:
2335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_complete_dump(level + 1, frm);
2336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_REQUEST:
2338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_request_dump(level + 1, frm);
2339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_DISCONN_COMPLETE:
2341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		disconn_complete_dump(level + 1, frm);
2342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_AUTH_COMPLETE:
2344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
2345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		generic_response_dump(level + 1, frm);
2346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
234717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_MASTER_LINK_KEY_COMPLETE:
234817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		master_link_key_complete_dump(level + 1, frm);
234917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2350d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_REMOTE_NAME_REQ_COMPLETE:
2351d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		remote_name_req_complete_dump(level + 1, frm);
2352d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2353d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_ENCRYPT_CHANGE:
2354d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		encrypt_change_dump(level + 1, frm);
2355d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2356ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_FEATURES_COMPLETE:
2357ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_features_complete_dump(level + 1, frm);
2358ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2359ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_VERSION_COMPLETE:
2360ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_version_complete_dump(level + 1, frm);
2361ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2362ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_QOS_SETUP_COMPLETE:
236311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		qos_setup_complete_dump(level + 1, frm);
2364ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2365ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_ROLE_CHANGE:
2366ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		role_change_dump(level + 1, frm);
2367ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2368ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_NUM_COMP_PKTS:
2369ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		num_comp_pkts_dump(level + 1, frm);
2370ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2371ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_MODE_CHANGE:
2372ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		mode_change_dump(level + 1, frm);
2373ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2374b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann	case EVT_RETURN_LINK_KEYS:
2375b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		return_link_keys_dump(level + 1, frm);
2376b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann		break;
2377ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_PIN_CODE_REQ:
2378ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_REQ:
2379ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		pin_code_req_dump(level + 1, frm);
2380ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2381ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_NOTIFY:
2382ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		link_key_notify_dump(level + 1, frm);
2383ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2384c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann	case EVT_DATA_BUFFER_OVERFLOW:
2385c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		data_buffer_overflow_dump(level + 1, frm);
2386c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann		break;
238711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_MAX_SLOTS_CHANGE:
238811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		max_slots_change_dump(level + 1, frm);
238911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2390ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_CLOCK_OFFSET_COMPLETE:
2391ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_clock_offset_complete_dump(level + 1, frm);
2392ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
2393ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_CONN_PTYPE_CHANGED:
2394ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		conn_ptype_changed_dump(level + 1, frm);
2395ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
239611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann	case EVT_PSCAN_REP_MODE_CHANGE:
239711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		pscan_rep_mode_change_dump(level + 1, frm);
239811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann		break;
2399f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann	case EVT_FLOW_SPEC_COMPLETE:
2400f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		flow_spec_complete_dump(level + 1, frm);
2401f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann		break;
2402d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT_WITH_RSSI:
2403d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_with_rssi_dump(level + 1, frm);
2404d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
240517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann	case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:
240617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		read_remote_ext_features_complete_dump(level + 1, frm);
240717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann		break;
2408d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_COMPLETE:
2409d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_complete_dump(level + 1, frm);
2410d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2411d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann	case EVT_SYNC_CONN_CHANGED:
2412d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		sync_conn_changed_dump(level + 1, frm);
2413d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann		break;
2414807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann	case EVT_EXTENDED_INQUIRY_RESULT:
2415807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		extended_inq_result_dump(level + 1, frm);
2416807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann		break;
2417d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	default:
2418d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
2419d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
2420d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
242195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
242295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
242365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm)
242495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2425174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_acl_hdr *hdr = (void *) frm->ptr;
24260d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
24270d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t dlen = btohs(hdr->dlen);
24280d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t flags = acl_flags(handle);
242965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
243065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (!p_filter(FILT_HCI)) {
2431ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2432d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",
243365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			acl_handle(handle), flags, dlen);
243465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		level++;
243565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	}
2436e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2437e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->ptr += HCI_ACL_HDR_SIZE;
2438e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->len -= HCI_ACL_HDR_SIZE;
2439f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->flags  = flags;
2440f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->handle = acl_handle(handle);
244165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
244265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (parser.filter & ~FILT_HCI)
244365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		l2cap_dump(level, frm);
244465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	else
244565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
244695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
244795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2448d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm)
2449d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{
2450d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	hci_sco_hdr *hdr = (void *) frm->ptr;
24510d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
2452d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
24530033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann	if (frm->audio_fd > 2)
24540033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann		write(frm->audio_fd, frm->ptr + HCI_SCO_HDR_SIZE, hdr->dlen);
24550033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann
2456d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	if (!p_filter(FILT_SCO)) {
2457ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2458d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("SCO data: handle %d dlen %d\n",
2459d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky			acl_handle(handle), hdr->dlen);
2460d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		level++;
2461d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2462d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->ptr += HCI_SCO_HDR_SIZE;
2463d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->len -= HCI_SCO_HDR_SIZE;
2464d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		raw_dump(level, frm);
2465d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	}
2466d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky}
2467d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
2468b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm)
2469b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{
2470b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (p_filter(FILT_HCI))
2471b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2472b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
247338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	if (frm->dev_id == HCI_DEV_NONE) {
2474a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann		uint16_t device = btohs(htons(get_u16(frm)));
247538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t type = btohs(htons(get_u16(frm)));
247638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		uint16_t plen = btohs(htons(get_u16(frm)));
247738acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
247838acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		p_indent(level, frm);
247938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
2480a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann		printf("System %s: device hci%d type 0x%2.2x plen %d\n",
2481a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann			frm->in ? "event" : "command", device, type, plen);
248238acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
248338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		raw_dump(level, frm);
248438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann		return;
248538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann	}
248638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann
2487b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (get_manufacturer() == 12) {
2488b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		bpa_dump(level, frm);
2489b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
2490b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	}
2491b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
2492b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	p_indent(level, frm);
2493b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	printf("Vendor data: len %d\n", frm->len);
2494b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	raw_dump(level, frm);
2495b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann}
2496b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
2497174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm)
249895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
2499d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t type = *(uint8_t *)frm->ptr;
250095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2501174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	frm->ptr++; frm->len--;
2502e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
250395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	switch (type) {
250495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_COMMAND_PKT:
250565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		command_dump(level, frm);
250695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
250795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
250895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_EVENT_PKT:
250965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		event_dump(level, frm);
251095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
251195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
251295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_ACLDATA_PKT:
251365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		acl_dump(level, frm);
251495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
251595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2516d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	case HCI_SCODATA_PKT:
2517d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		sco_dump(level, frm);
2518d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		break;
2519e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
2520b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	case HCI_VENDOR_PKT:
2521b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		vendor_dump(level, frm);
2522b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		break;
2523b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
252495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	default:
252565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		if (p_filter(FILT_HCI))
252665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			break;
252765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
2528ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
2529174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
253065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
253195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
253295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	}
253395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
2534