hci.c revision 1a5f2bff835728b9df12114adf87c704a1e9b6b8
195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/*
2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
3e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Bluetooth packet analyzer - HCI parser
4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Copyright (C) 2000-2002  Maxim Krasnyansky <maxk@qualcomm.com>
6d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann *  Copyright (C) 2003-2005  Marcel Holtmann <marcel@holtmann.org>
7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is free software; you can redistribute it and/or modify
10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  it under the terms of the GNU General Public License as published by
11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  the Free Software Foundation; either version 2 of the License, or
12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  (at your option) any later version.
13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  This program is distributed in the hope that it will be useful,
15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  GNU General Public License for more details.
18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  You should have received a copy of the GNU General Public License
20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  along with this program; if not, write to the Free Software
21e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
23e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *
24e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann *  $Id$
2595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky */
2695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdio.h>
28e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#include <errno.h>
29d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#include <ctype.h>
3095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdlib.h>
3195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <unistd.h>
3295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <string.h>
3395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/types.h>
350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <sys/socket.h>
360d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <netinet/in.h>
3795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/bluetooth.h>
3995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/hci.h>
40ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann#include <bluetooth/hci_lib.h>
4195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
4295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include "parser.h"
4395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
44be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic uint16_t manufacturer = DEFAULT_COMPID;
45be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
46be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic inline uint16_t get_manufacturer(void)
47be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann{
48be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer);
49be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann}
50be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
51d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *event_str[] = {
5266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Unknown",
5366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Complete",
5466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Result",
5566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Complete",
5666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Request",
5766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Disconn Complete",
5866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Auth Complete",
5966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Remote Name Req Complete",
60d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	"Encrypt Change",
6166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Change Connection Link Key Complete",
6266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Master Link Key Complete",
6366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Supported Features",
6466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Ver Info Complete",
6566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Setup Complete",
6666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Complete",
6766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Status",
6866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Hardware Error",
6966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Flush Occurred",
7066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Role Change",
7166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Number of Completed Packets",
7266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Mode Change",
7366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Return Link Keys",
7466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"PIN Code Request",
7566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Request",
7666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Notification",
7766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Loopback Command",
7866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Data Buffer Overflow",
7966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Max Slots Change",
8066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Clock Offset Complete",
8166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connection Packet Type Changed",
8266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Violation",
8366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Page Scan Mode Change",
84328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Page Scan Repetition Mode Change",
85328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Flow Specification Complete",
86328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Inquiry Result with RSSI",
87328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
88328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
89328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
90328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
91328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
92328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
93328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
94328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
95328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
96328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Synchronous Connect Complete",
97328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Synchronous Connect Changed"
9866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky};
99328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define EVENT_NUM 43
1002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
101d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_linkctl_str[] = {
1022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry",
1042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry Cancel",
1052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Periodic Inquiry Mode",
1062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Periodic Inquiry Mode",
1072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create Connection",
1082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Disconnect",
1092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Add SCO Connection",
110328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Create Connection Cancel",
1112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Accept Connection Request",
1122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reject Connection Request",
1132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Reply",
1142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Negative Reply",
1152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Reply",
1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Negative Reply",
1172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Packet Type",
118f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Authentication Requested",
120f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Connection Encryption",
122f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Link Key",
124f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Master Link Key",
126f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Remote Name Request",
128328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Remote Name Request Cancel",
1292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Supported Features",
130328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Remote Extended Features",
1312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Version Information",
132f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
133328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Clock Offset",
134328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read LMP Handle"
135328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
136328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
137328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
138328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
139328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
140328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
141328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
142328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Setup Synchronous Connection",
143328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Accept Synchronous Connection",
144328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Reject Synchronous Connection"
1452bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
146328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_LINKCTL_NUM 42
1472bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
148d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_linkpol_str[] = {
1492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1502bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Hold Mode",
151f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Sniff Mode",
1532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Sniff Mode",
154328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Park State",
155328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Exit Park State",
1562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"QoS Setup",
157f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Role Discovery",
159f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Switch Role",
1612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Policy Settings",
162328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Link Policy Settings",
163328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Default Link Policy Settings",
164328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Default Link Policy Settings",
165328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Flow Specification"
1662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
167328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_LINKPOL_NUM 16
1682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
169d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_hostctl_str[] = {
1702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Mask",
172f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset",
174f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Filter",
176f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
177f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Flush",
1792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read PIN Type ",
1802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write PIN Type",
1812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create New Unit Key",
182f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Stored Link Key",
184f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
185f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
186f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Stored Link Key",
1882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Delete Stored Link Key",
189328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Local Name",
1902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Name",
1912bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Connection Accept Timeout",
1922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Connection Accept Timeout",
1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Timeout",
1942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Timeout",
1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Scan Enable",
1962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Scan Enable",
1972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Activity",
1982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Activity",
1992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Inquiry Scan Activity",
2002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Inquiry Scan Activity",
2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Authentication Enable",
2022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Authentication Enable",
2032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Encryption Mode",
2042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Encryption Mode",
2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Class of Device",
2062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Class of Device",
2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Voice Setting",
2082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Voice Setting",
2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Automatic Flush Timeout",
2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Automatic Flush Timeout",
2112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Num Broadcast Retransmissions",
2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Num Broadcast Retransmissions",
2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Hold Mode Activity ",
2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Hold Mode Activity",
2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Transmit Power Level",
216328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Synchronous Flow Control Enable",
217328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Synchronous Flow Control Enable",
218f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Host Controller To Host Flow Control",
220f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Buffer Size",
222f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Number of Completed Packets",
2242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Supervision Timeout",
2252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Link Supervision Timeout",
2262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Number of Supported IAC",
2272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Current IAC LAP",
2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Current IAC LAP",
2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Period Mode",
2302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Period Mode",
2312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Mode",
232328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Mode",
233328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Set AFH Host Channel Classification",
234328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
235328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Unknown",
236328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Scan Type",
237328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Scan Type",
238328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Inquiry Mode",
239328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Inquiry Mode",
240328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Page Scan Type",
241328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write Page Scan Type",
242328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Assessment Mode",
243328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Write AFH Channel Assessment Mode"
2442bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
245328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_HOSTCTL_NUM 73
2462bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
247d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_info_str[] = {
2482bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Version Information",
250328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Supported Commands",
2512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Supported Features",
252328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Local Extended Features",
2532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Buffer Size",
254f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Country Code",
256f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2572bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read BD ADDR"
2582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
259f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky#define CMD_INFO_NUM 9
2602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
261d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_status_str[] = {
2622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Failed Contact Counter",
2642bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset Failed Contact Counter",
265328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Link Quality",
266f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
267328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read RSSI",
268328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read AFH Channel Map",
269328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann	"Read Clock"
2702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
271328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_STATUS_NUM 7
27266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky
273d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *error_code_str[] = {
274d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Success",
275d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown HCI Command",
276d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown Connection Identifier",
277d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Hardware Failure",
278d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Page Timeout",
279d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Authentication Failure",
280d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"PIN or Key Missing",
281d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Memory Capacity Exceeded",
282d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Timeout",
283d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Limit Exceeded",
284d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Synchronous Connection to a Device Exceeded",
285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"ACL Connection Already Exists",
286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Command Disallowed",
287d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Limited Resources",
288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Security Reasons",
289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Rejected due to Unacceptable BD_ADDR",
290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Accept Timeout Exceeded",
291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Feature or Parameter Value",
292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid HCI Command Parameters",
293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote User Teminated Connection",
294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Low Resources",
295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Remote Device Terminated Connection due to Power Off",
296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Connection Terminated by Local Host",
297fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Repeated Attempts",
298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Pairing Not Allowed",
299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unknown LMP PDU",
300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported Remote Feature / Unsupported LMP Feature",
301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Offset Rejected",
302d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Interval Rejected",
303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"SCO Air Mode Rejected",
304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Invalid LMP Parameters",
305d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unspecified Error",
306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Unsupported LMP Parameter Value",
307d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Change Not Allowed",
308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Response Timeout",
309d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP Error Transaction Collision",
310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"LMP PDU Not Allowed",
311d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Encryption Mode Not Acceptable",
312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Link Key Can Not be Changed",
313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Requested QoS Not Supported",
314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Instant Passed",
315fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	"Pairing with Unit Key Not Supported",
316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Different Transaction Collision",
317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Unacceptable Parameter",
319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"QoS Rejected",
320d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Channel Classification Not Supported",
321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Insufficient Security",
322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Parameter out of Mandatory Range",
323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Switch Pending",
325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved",
326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Reserved Slot Violation",
327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	"Role Switch Failed"
328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann};
329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#define ERROR_CODE_NUM 53
330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *status2str(uint8_t status)
332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char *str;
334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status <= ERROR_CODE_NUM)
336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = error_code_str[status];
337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	else
338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		str = "Unknown";
339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return str;
341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *opcode2str(uint16_t opcode)
34495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
3450d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
3460d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
3472bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	char *cmd;
34895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	switch (ogf) {
3502bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_INFO_PARAM:
3512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_INFO_NUM)
352d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_info_str[ocf];
3532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3572bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_HOST_CTL:
3582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_HOSTCTL_NUM)
359d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_hostctl_str[ocf];
3602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3642bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_CTL:
3652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKCTL_NUM)
366d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkctl_str[ocf];
3672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_POLICY:
3722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKPOL_NUM)
373d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_linkpol_str[ocf];
3742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
3782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_STATUS_PARAM:
3792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_STATUS_NUM)
380d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			cmd = cmd_status_str[ocf];
3812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
3822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
3832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
385cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_TESTING_CMD:
386cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Testing";
387cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
388cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
389cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann	case OGF_VENDOR_CMD:
390cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		cmd = "Vendor";
391cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann		break;
392cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann
3932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	default:
3942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		cmd = "Unknown";
3952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
3962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	}
3972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
398d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	return cmd;
399d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
400d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
401ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *role2str(uint8_t role)
402ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
403ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (role) {
404ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
405ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Master";
406ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
407ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Slave";
408ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
409ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
410ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
411ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *mode2str(uint8_t mode)
414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (mode) {
416ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x00:
417ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Active";
418ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x01:
419ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Hold";
420ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x02:
421ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Sniff";
422ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case 0x03:
423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Park";
424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	default:
425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		return "Unknown";
426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void generic_command_dump(int level, struct frame *frm)
430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d\n", handle);
435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
438ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void inquiry_dump(int level, struct frame *frm)
440ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
441ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	inquiry_cp *cp = frm->ptr;
442ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
443ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
444ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
445ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void periodic_inquiry_dump(int level, struct frame *frm)
449ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	periodic_inquiry_cp *cp = frm->ptr;
451ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
452ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
453ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n",
454ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		btohs(cp->max_period), btohs(cp->min_period),
455ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp);
456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void create_conn_dump(int level, struct frame *frm)
459ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
460ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	create_conn_cp *cp = frm->ptr;
461ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
462ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
463ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], *str;
464ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
465ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
466ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
467ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n",
468ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		addr, ptype, cp->role_switch,
469ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
470ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
471ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
472ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
473ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
474ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
475ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
476ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
477ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
478ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
479ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void disconnect_dump(int level, struct frame *frm)
480ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
481ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	disconnect_cp *cp = frm->ptr;
482ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
483ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
484ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason);
485ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
486ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
487ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
488ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
489ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
490ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void add_sco_dump(int level, struct frame *frm)
491ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
492ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	add_sco_cp *cp = frm->ptr;
493ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(cp->pkt_type);
494ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
495ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
496ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
497ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype);
498ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
499ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_ptypetostr(ptype);
500ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
501ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
502ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Packet type: %s\n", str);
503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
505ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
506ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
507ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void accept_conn_req_dump(int level, struct frame *frm)
508ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
509ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	accept_conn_req_cp *cp = frm->ptr;
510ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
511ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
512ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
513ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s role 0x%2.2x\n", addr, cp->role);
515ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
516ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
517ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Role: %s\n", role2str(cp->role));
518ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
519ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
520ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void reject_conn_req_dump(int level, struct frame *frm)
521ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
522ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	reject_conn_req_cp *cp = frm->ptr;
523ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
524ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
525ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
526ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
527ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason);
528ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
529ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
530ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Reason: %s\n", status2str(cp->reason));
531ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
532ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
533ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_reply_dump(int level, struct frame *frm)
534ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
535ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	pin_code_reply_cp *cp = frm->ptr;
536ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18], pin[17];
537ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
538ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(pin, 0, sizeof(pin));
541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memcpy(pin, cp->pin_code, cp->pin_len);
542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin);
543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_reply_dump(int level, struct frame *frm)
546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	link_key_reply_cp *cp = frm->ptr;
548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Link key: ");
557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("%2.2x", cp->link_key[i]);
559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("\n");
560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_neg_reply_dump(int level, struct frame *frm)
563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
564ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
565ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
566ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void set_conn_encrypt_dump(int level, struct frame *frm)
573ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
574ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	set_conn_encrypt_cp *cp = frm->ptr;
575ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
576ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
577ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt);
578ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void remote_name_req_dump(int level, struct frame *frm)
581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	remote_name_req_cp *cp = frm->ptr;
583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t clkoffset = btohs(cp->clock_offset);
584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&cp->bdaddr, addr);
588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s clkoffset 0x%4.4x%s\n",
589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		addr, clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_link_policy_dump(int level, struct frame *frm)
593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_link_policy_cp *cp = frm->ptr;
595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t policy = btohs(cp->policy);
596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy);
600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	str = hci_lptostr(policy);
602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (str) {
603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Link policy: %s\n", str);
605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		free(str);
606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void change_local_name_dump(int level, struct frame *frm)
610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	change_local_name_cp *cp = frm->ptr;
612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
613ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && cp->name[i]; i++)
617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(cp->name[i]))
618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = cp->name[i];
619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
621ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
622ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
623ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("name \'%s\'\n", name);
624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
626ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_class_of_dev_dump(int level, struct frame *frm)
627ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
628ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_class_of_dev_cp *cp = frm->ptr;
629ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
631ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("class 0x%2.2x%2.2x%2.2x\n",
632ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
633ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
634ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_voice_setting_dump(int level, struct frame *frm)
636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	write_voice_setting_cp *cp = frm->ptr;
638ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
639ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
640ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));
641ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
642ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
643fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void write_current_iac_lap_dump(int level, struct frame *frm)
644fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
645fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	write_current_iac_lap_cp *cp = frm->ptr;
646fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
647fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
648fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < cp->num_current_iac; i++) {
649fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
650fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]);
651fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) {
652fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (cp->lap[i][0]) {
653fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
654fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
655fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
656fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
657fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
658fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
659fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
660fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
661fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
662fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
663fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
664fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
665d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm)
666d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
667d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	hci_command_hdr *hdr = frm->ptr;
668d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(hdr->opcode);
669d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
670d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
671d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
672d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (p_filter(FILT_HCI))
673d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
674d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
675ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
67665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
677803752117135528b1adebf0fa045596e188a996dMarcel Holtmann	printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
678d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, hdr->plen);
67965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
68065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_COMMAND_HDR_SIZE;
68165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_COMMAND_HDR_SIZE;
68265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
683be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (ogf == OGF_VENDOR_CMD && ocf == 0 && get_manufacturer() == 10) {
684be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		csr_dump(level + 1, frm);
685be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		return;
686be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
687be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
688ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	switch (ogf) {
689ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
690ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
691ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY:
692ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			inquiry_dump(level + 1, frm);
693ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
694ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PERIODIC_INQUIRY:
695ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			periodic_inquiry_dump(level + 1, frm);
696ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
697ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_INQUIRY_CANCEL:
698ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PERIODIC_INQUIRY:
699ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
700ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CREATE_CONN:
701ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			create_conn_dump(level + 1, frm);
702ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
703ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_DISCONNECT:
704ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			disconnect_dump(level + 1, frm);
705ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
706ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ADD_SCO:
707ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_PTYPE:
708ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			add_sco_dump(level + 1, frm);
709ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			break;
710ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ACCEPT_CONN_REQ:
711ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
712ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
713ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REJECT_CONN_REQ:
714ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			reject_conn_req_dump(level + 1, frm);
715ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
716ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
717ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_reply_dump(level + 1, frm);
718ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
719ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
720ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			link_key_reply_dump(level + 1, frm);
721ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
722ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
723ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
724ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			pin_code_neg_reply_dump(level + 1, frm);
725ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
726ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SET_CONN_ENCRYPT:
727ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			set_conn_encrypt_dump(level + 1, frm);
728ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
729ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_AUTH_REQUESTED:
730ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_CONN_LINK_KEY:
731ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_FEATURES:
732ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_REMOTE_VERSION:
733ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLOCK_OFFSET:
734ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
735ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
736ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_REMOTE_NAME_REQ:
737ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			remote_name_req_dump(level + 1, frm);
738ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
739ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
740ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
741ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
742ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
743ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_SNIFF_MODE:
744ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_EXIT_PARK_MODE:
745ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_ROLE_DISCOVERY:
746ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_LINK_POLICY:
747ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_command_dump(level + 1, frm);
748ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
749ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_SWITCH_ROLE:
750ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			accept_conn_req_dump(level + 1, frm);
751ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
752ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
753ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_link_policy_dump(level + 1, frm);
754ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
755ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
756ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
757ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_HOST_CTL:
758ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
759ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_CHANGE_LOCAL_NAME:
760ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			change_local_name_dump(level + 1, frm);
761ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
762ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_CLASS_OF_DEV:
763ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_class_of_dev_dump(level + 1, frm);
764ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
765ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_VOICE_SETTING:
766ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			write_voice_setting_dump(level + 1, frm);
767ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
768fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
769fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			write_current_iac_lap_dump(level + 1, frm);
770fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
771ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
772ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
773ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
77465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	raw_dump(level, frm);
77595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
77695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
777d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm)
778d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
779d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
780d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
781d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
782d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x\n", status);
783d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
784d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
785d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
786d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
787d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
788d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
789d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
790d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
791d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
792ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm)
793ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
794ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t status = get_u8(frm);
795ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	bdaddr_t *bdaddr = frm->ptr;
796ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
797ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
798ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->ptr += sizeof(bdaddr_t);
799ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	frm->len -= sizeof(bdaddr_t);
800ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
801ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
802ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(bdaddr, addr);
803ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s\n", status, addr);
804ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
805ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (status > 0) {
806ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
807ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(status));
808ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
809ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
810ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
811ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
812ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
813d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm)
814d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
815d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t status = get_u8(frm);
816d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t handle = btohs(htons(get_u16(frm)));
817d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
818d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
819d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d\n", status, handle);
820d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
821d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (status > 0) {
822d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
823d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(status));
824d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
825d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
826d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	raw_dump(level, frm);
827d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
828d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
829ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm)
830ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
831ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_name_rp *rp = frm->ptr;
832ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char name[249];
833ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
834ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
835ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	memset(name, 0, sizeof(name));
836ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 248 && rp->name[i]; i++)
837ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (isprint(rp->name[i]))
838ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = rp->name[i];
839ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		else
840ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			name[i] = '.';
841ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
842ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
843ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x name \'%s\'\n", rp->status, name);
844ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
845ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
846ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
847ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
848ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
849ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
850ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
851ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm)
852ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
853ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_class_of_dev_rp *rp = frm->ptr;
854ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
855ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
856ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
857ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
858ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
859ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
860ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
861ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
862ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
863ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
864ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
865ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm)
866ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
867ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_voice_setting_rp *rp = frm->ptr;
868ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
869ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
870ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x voice setting 0x%4.4x\n",
871ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		rp->status, btohs(rp->voice_setting));
872ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
873ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
874ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
875ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
876ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
877ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
878ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
879fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm)
880fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{
881fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	read_current_iac_lap_rp *rp = frm->ptr;
882fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	int i;
883fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
884fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	for (i = 0; i < rp->num_current_iac; i++) {
885fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		p_indent(level, frm);
886fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]);
887fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) {
888fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			switch (rp->lap[i][0]) {
889fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x00:
890fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (Limited Inquiry Access Code)");
891fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
892fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			case 0x33:
893fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				printf(" (General Inquiry Access Code)");
894fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann				break;
895fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			}
896fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		}
897fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		printf("\n");
898fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann	}
899fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann}
900fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann
901ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm)
902ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
903ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_version_rp *rp = frm->ptr;
904ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(rp->manufacturer);
905ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
906ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
907ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
908ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
909ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
910ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
911ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
912ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
913ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
9141a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann		printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
915ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			hci_vertostr(rp->hci_ver), rp->hci_ver,
916ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->hci_rev));
917ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
918ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
919ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(rp->lmp_ver), rp->lmp_ver,
920ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->lmp_subver));
921ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
922ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
923ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
924ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
925ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
926ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
927ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm)
928ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
929ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_local_features_rp *rp = frm->ptr;
930ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
931ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
932ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
933ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
934ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
935ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
936ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
937ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
938ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
939ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
940ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
941ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
942ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", rp->features[i]);
943ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
944ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
945ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
946ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
947ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm)
948ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
949ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	read_buffer_size_rp *rp = frm->ptr;
950ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
951ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
952ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x\n", rp->status);
953ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
954ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (rp->status > 0) {
955ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
956ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(rp->status));
957ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
958ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
959ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("ACL MTU %d:%d SCO MTU %d:%d\n",
960ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
961ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			rp->sco_mtu, btohs(rp->sco_max_pkt));
962ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
963ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
964ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
965d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm)
966d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
967d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_complete *evt = frm->ptr;
968d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
969d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ogf = cmd_opcode_ogf(opcode);
970d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t ocf = cmd_opcode_ocf(opcode);
971d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
972d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
973d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
974d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode), ogf, ocf, evt->ncmd);
975d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
976d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->ptr += EVT_CMD_COMPLETE_SIZE;
977d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	frm->len -= EVT_CMD_COMPLETE_SIZE;
978d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
979d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (ogf) {
980ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_CTL:
981ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
982ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_REPLY:
983ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_REPLY:
984ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_PIN_CODE_NEG_REPLY:
985ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_LINK_KEY_NEG_REPLY:
986ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
987ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
988ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
989ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
990ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case OGF_LINK_POLICY:
991ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		switch (ocf) {
992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_WRITE_LINK_POLICY:
993ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			generic_response_dump(level, frm);
994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
997d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_HOST_CTL:
998d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
999d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_NAME:
1000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_name_dump(level, frm);
1001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_CLASS_OF_DEV:
1003ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_class_of_dev_dump(level, frm);
1004ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1005ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		case OCF_READ_VOICE_SETTING:
1006ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_voice_setting_dump(level, frm);
1007ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1008fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_READ_CURRENT_IAC_LAP:
1009fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			read_current_iac_lap_dump(level, frm);
1010fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann			return;
1011fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_CURRENT_IAC_LAP:
1012fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_INQUIRY_MODE:
1013fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann		case OCF_WRITE_AFH_MODE:
1014d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_PAGE_TIMEOUT:
1015d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_PAGE_ACTIVITY:
1016d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_INQ_ACTIVITY:
1017d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_TRANSMIT_POWER_LEVEL:
1018d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LINK_SUPERVISION_TIMEOUT:
1019d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_SET_AFH_CLASSIFICATION:
1020d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_INQUIRY_MODE:
1021d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_AFH_MODE:
1022d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			status_response_dump(level, frm);
1023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1024d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
1025d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1026d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_INFO_PARAM:
1027d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1028d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_VERSION:
1029ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_version_dump(level, frm);
1030ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1031d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LOCAL_FEATURES:
1032ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_local_features_dump(level, frm);
1033ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1034d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BUFFER_SIZE:
1035ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			read_buffer_size_dump(level, frm);
1036ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1037d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_BD_ADDR:
1038ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bdaddr_response_dump(level, frm);
1039ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1040d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
1041d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1042d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case OGF_STATUS_PARAM:
1043d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		switch (ocf) {
1044d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_FAILED_CONTACT_COUNTER:
1045d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_RESET_FAILED_CONTACT_COUNTER:
1046d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_LINK_QUALITY:
1047d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_RSSI:
1048d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_AFH_MAP:
1049d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		case OCF_READ_CLOCK:
1050d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			status_response_dump(level, frm);
1051ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			return;
1052d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		}
1053d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1054ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	raw_dump(level, frm);
1056d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1057d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1058d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm)
1059d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1060d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_cmd_status *evt = frm->ptr;
1061d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint16_t opcode = btohs(evt->opcode);
1062d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1063d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1064d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
1065d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		opcode2str(opcode),
1066d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_opcode_ogf(opcode), cmd_opcode_ocf(opcode),
1067d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, evt->ncmd);
1068d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1069d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1070d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1071d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1072d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1073d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1074d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1075d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm)
1076d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1077d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
1078d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1079d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1080d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < num; i++) {
1081d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inquiry_info *info = frm->ptr;
1082d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		char addr[18];
1083d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1084d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		ba2str(&info->bdaddr, addr);
1085d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1086d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1087d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("bdaddr %s clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n",
1088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			addr, btohs(info->clock_offset), info->dev_class[2],
1089d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			info->dev_class[1], info->dev_class[0]);
1090d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1091d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->ptr += INQUIRY_INFO_SIZE;
1092d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->len -= INQUIRY_INFO_SIZE;
1093d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1094d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1095d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1096d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm)
1097d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1098d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_complete *evt = frm->ptr;
1099d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1100d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1101d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1102d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1103d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1104d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
1105d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), addr,
1106d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode);
1107d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1108d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1109d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1110d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1111d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1112d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1113d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1114d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm)
1115d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1116d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_conn_request *evt = frm->ptr;
1117d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18];
1118d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1119d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1120d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1121d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1122d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
1123d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		addr, evt->dev_class[2], evt->dev_class[1],
1124d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO");
1125d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1126d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1127d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm)
1128d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1129d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_disconn_complete *evt = frm->ptr;
1130d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1131d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1132d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
1133d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->reason);
1134d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1135d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1136d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1137d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1138d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	} else if (evt->reason > 0) {
1139d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1140d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Reason: %s\n", status2str(evt->reason));
1141d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1142d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1143d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1144d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm)
1145d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1146d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_remote_name_req_complete *evt = frm->ptr;
1147d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	char addr[18], name[249];
1148d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1149d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1150d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1151d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1152d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	memset(name, 0, sizeof(name));
1153d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < 248 && evt->name[i]; i++)
1154d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		if (isprint(evt->name[i]))
1155d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = evt->name[i];
1156d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		else
1157d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			name[i] = '.';
1158d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1159d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1160d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name);
1161d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1162d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1163d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1164d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1165d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1166d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1167d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1168d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm)
1169d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1170d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	evt_encrypt_change *evt = frm->ptr;
1171d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1172d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	p_indent(level, frm);
1173d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
1174d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		evt->status, btohs(evt->handle), evt->encrypt);
1175d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1176d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (evt->status > 0) {
1177d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1178d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1179d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1180d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1181d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1182ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm)
1183ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1184ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_features_complete *evt = frm->ptr;
1185ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1186ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1187ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1188ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
1189ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1190ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1191ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1192ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1193ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1194ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1195ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Features:");
1196ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		for (i = 0; i < 8; i++)
1197ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf(" 0x%2.2x", evt->features[i]);
1198ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("\n");
1199ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1200ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1201ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1202ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm)
1203ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1204ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_remote_version_complete *evt = frm->ptr;
1205ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t manufacturer = btohs(evt->manufacturer);
1206ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1207ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1208ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
1209ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1211ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1212ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1213ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1214ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1215ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
1216ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			lmp_vertostr(evt->lmp_ver), evt->lmp_ver,
1217ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			btohs(evt->lmp_subver));
1218ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1219ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Manufacturer: %s (%d)\n",
1220ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			bt_compidtostr(manufacturer), manufacturer);
1221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1222ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1223ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1224ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm)
1225ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1226ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_role_change *evt = frm->ptr;
1227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1229ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1230ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1231ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
1232ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, addr, evt->role);
1233ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1235ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1236ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1237ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1238ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1239ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Role: %s\n", role2str(evt->role));
1240ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1241ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1242ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1243ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm)
1244ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1245ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint8_t num = get_u8(frm);
1246ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1247ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1248ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1249ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("handle%s", num > 1 ? "s" : "");
1250ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < num; i++) {
1251ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		uint16_t handle = btohs(htons(get_u16(frm)));
1252ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf(" %d", handle);
1253ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1254ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("\n");
1255ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1256ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1257ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm)
1258ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1259ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_mode_change *evt = frm->ptr;
1260ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1261ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1262ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n",
1263ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval));
1264ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1265ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1266ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1267ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1268ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1269ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1270ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Mode: %s\n", mode2str(evt->mode));
1271ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1272ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1273ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1274ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm)
1275ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1276ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_pin_code_req *evt = frm->ptr;
1277ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1278ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1279ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1280ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1281ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s\n", addr);
1282ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1283ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1284ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm)
1285ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1286ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_link_key_notify *evt = frm->ptr;
1287ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char addr[18];
1288ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	int i;
1289ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1290ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1291ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	ba2str(&evt->bdaddr, addr);
1292ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("bdaddr %s type 0x%2.2x\n", addr, evt->key_type);
1293ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1294ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1295ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("Link key: ");
1296ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	for (i = 0; i < 16; i++)
1297ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("%2.2x", evt->link_key[i]);
1298ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("\n");
1299ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1300ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1301ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm)
1302ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1303ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_read_clock_offset_complete *evt = frm->ptr;
1304ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1305ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1306ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n",
1307ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), btohs(evt->clock_offset));
1308ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1309ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1310ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1311ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1312ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1313ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1314ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1315ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm)
1316ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{
1317ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	evt_conn_ptype_changed *evt = frm->ptr;
1318ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	uint16_t ptype = btohs(evt->ptype);
1319ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	char *str;
1320ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1321ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	p_indent(level, frm);
1322ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
1323ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		evt->status, btohs(evt->handle), ptype);
1324ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1325ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	if (evt->status > 0) {
1326ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		p_indent(level, frm);
1327ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		printf("Error: %s\n", status2str(evt->status));
1328ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	} else {
1329ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		str = hci_ptypetostr(ptype);
1330ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		if (str) {
1331ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			p_indent(level, frm);
1332ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			printf("Packet type: %s\n", str);
1333ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			free(str);
1334ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		}
1335ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	}
1336ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann}
1337ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann
1338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm)
1339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{
1340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t num = get_u8(frm);
1341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	int i;
1342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	for (i = 0; i < num; i++) {
1344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inquiry_info_with_rssi *info = frm->ptr;
1345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		char addr[18];
1346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1347d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		p_indent(level, frm);
1348d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1349d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		ba2str(&info->bdaddr, addr);
1350d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("bdaddr %s clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n",
1351ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann			addr, btohs(info->clock_offset), info->dev_class[2],
1352d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			info->dev_class[1], info->dev_class[0], info->rssi);
1353d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1354d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
1355d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE;
1356d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1357d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}
1358d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
135965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm)
136095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
1361174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_event_hdr *hdr = frm->ptr;
1362be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	uint8_t event = hdr->evt;
136365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
136465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (p_filter(FILT_HCI))
136565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		return;
136665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
1367ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky	p_indent(level, frm);
136895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1369d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (event <= EVENT_NUM) {
1370803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: %s (0x%2.2x) plen %d\n",
1371d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann			event_str[hdr->evt], hdr->evt, hdr->plen);
1372be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_TESTING) {
1373803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
1374be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else if (hdr->evt == EVT_VENDOR) {
1375803752117135528b1adebf0fa045596e188a996dMarcel Holtmann		printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen);
1376be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (get_manufacturer() == 10) {
1377be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->ptr += HCI_EVENT_HDR_SIZE;
1378be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			frm->len -= HCI_EVENT_HDR_SIZE;
1379be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			csr_dump(level + 1, frm);
1380be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			return;
1381be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
1382be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	} else
138366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
138465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
138565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_EVENT_HDR_SIZE;
138665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_EVENT_HDR_SIZE;
138765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
1388be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	if (event == EVT_CMD_COMPLETE) {
1389be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		evt_cmd_complete *cc = frm->ptr;
1390be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) {
1391be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE;
1392be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann			manufacturer = rp->manufacturer;
1393be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann		}
1394be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann	}
1395be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann
1396d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	if (!(parser.flags & DUMP_VERBOSE)) {
1397d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
1398d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		return;
1399d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
1400d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann
1401d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	switch (event) {
1402d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_COMPLETE:
1403d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_complete_dump(level + 1, frm);
1404d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1405d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CMD_STATUS:
1406d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		cmd_status_dump(level + 1, frm);
1407d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1408d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_COMPLETE:
1409d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		status_response_dump(level + 1, frm);
1410d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1411d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT:
1412d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_dump(level + 1, frm);
1413d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1414d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_COMPLETE:
1415d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_complete_dump(level + 1, frm);
1416d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1417d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CONN_REQUEST:
1418d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		conn_request_dump(level + 1, frm);
1419d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1420d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_DISCONN_COMPLETE:
1421d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		disconn_complete_dump(level + 1, frm);
1422d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1423d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_AUTH_COMPLETE:
1424d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
1425d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		generic_response_dump(level + 1, frm);
1426d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1427d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_REMOTE_NAME_REQ_COMPLETE:
1428d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		remote_name_req_complete_dump(level + 1, frm);
1429d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1430d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_ENCRYPT_CHANGE:
1431d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		encrypt_change_dump(level + 1, frm);
1432d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_FEATURES_COMPLETE:
1434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_features_complete_dump(level + 1, frm);
1435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_REMOTE_VERSION_COMPLETE:
1437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_remote_version_complete_dump(level + 1, frm);
1438ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_QOS_SETUP_COMPLETE:
1440ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		generic_response_dump(level + 1, frm);
1441ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1442ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_ROLE_CHANGE:
1443ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		role_change_dump(level + 1, frm);
1444ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1445ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_NUM_COMP_PKTS:
1446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		num_comp_pkts_dump(level + 1, frm);
1447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_MODE_CHANGE:
1449ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		mode_change_dump(level + 1, frm);
1450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1451ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_PIN_CODE_REQ:
1452ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_REQ:
1453ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		pin_code_req_dump(level + 1, frm);
1454ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1455ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_LINK_KEY_NOTIFY:
1456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		link_key_notify_dump(level + 1, frm);
1457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_READ_CLOCK_OFFSET_COMPLETE:
1459ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		read_clock_offset_complete_dump(level + 1, frm);
1460ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1461ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann	case EVT_CONN_PTYPE_CHANGED:
1462ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		conn_ptype_changed_dump(level + 1, frm);
1463ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann		break;
1464d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	case EVT_INQUIRY_RESULT_WITH_RSSI:
1465d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		inq_result_with_rssi_dump(level + 1, frm);
1466d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1467d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	default:
1468d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		raw_dump(level, frm);
1469d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		break;
1470d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	}
147195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
147295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
147365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm)
147495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
1475174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_acl_hdr *hdr = (void *) frm->ptr;
14760d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
14770d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t dlen = btohs(hdr->dlen);
14780d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint8_t flags = acl_flags(handle);
147965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
148065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (!p_filter(FILT_HCI)) {
1481ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
1482d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("ACL data: handle %d flags 0x%2.2x dlen %d\n",
148365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			acl_handle(handle), flags, dlen);
148465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		level++;
148565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	}
1486e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
1487e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->ptr += HCI_ACL_HDR_SIZE;
1488e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann	frm->len -= HCI_ACL_HDR_SIZE;
1489f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->flags  = flags;
1490f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->handle = acl_handle(handle);
149165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
149265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (parser.filter & ~FILT_HCI)
149365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		l2cap_dump(level, frm);
149465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	else
149565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
149695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
149795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1498d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm)
1499d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{
1500d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	hci_sco_hdr *hdr = (void *) frm->ptr;
15010d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann	uint16_t handle = btohs(hdr->handle);
1502d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
1503d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	if (!p_filter(FILT_SCO)) {
1504ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
1505d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann		printf("SCO data: handle %d dlen %d\n",
1506d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky			acl_handle(handle), hdr->dlen);
1507d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		level++;
1508d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
1509d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->ptr += HCI_SCO_HDR_SIZE;
1510d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		frm->len -= HCI_SCO_HDR_SIZE;
1511d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		raw_dump(level, frm);
1512d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	}
1513d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky}
1514d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky
1515b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm)
1516b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{
1517b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (p_filter(FILT_HCI))
1518b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
1519b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
1520b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	if (get_manufacturer() == 12) {
1521b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		bpa_dump(level, frm);
1522b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann		return;
1523b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann	}
1524b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann
1525b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	p_indent(level, frm);
1526b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	printf("Vendor data: len %d\n", frm->len);
1527b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	raw_dump(level, frm);
1528b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann}
1529b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
1530174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm)
153195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
1532d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann	uint8_t type = *(uint8_t *)frm->ptr;
153395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1534174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	frm->ptr++; frm->len--;
1535e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
153695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	switch (type) {
153795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_COMMAND_PKT:
153865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		command_dump(level, frm);
153995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
154095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
154195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_EVENT_PKT:
154265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		event_dump(level, frm);
154395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
154495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
154595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_ACLDATA_PKT:
154665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		acl_dump(level, frm);
154795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
154895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1549d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky	case HCI_SCODATA_PKT:
1550d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		sco_dump(level, frm);
1551d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky		break;
1552e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann
1553b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann	case HCI_VENDOR_PKT:
1554b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		vendor_dump(level, frm);
1555b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann		break;
1556b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann
155795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	default:
155865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		if (p_filter(FILT_HCI))
155965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			break;
156065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
1561ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky		p_indent(level, frm);
1562174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
156365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
156495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
156595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	}
156695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
1567