hci.c revision f8af6e30983794741e5d45b32c8d6b2f79ff7e1c
195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/*
295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	HCIDump - HCI packet analyzer
395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	Copyright (C) 2000-2001 Maxim Krasnyansky <maxk@qualcomm.com>
495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	This program is free software; you can redistribute it and/or modify
695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	it under the terms of the GNU General Public License version 2 as
795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	published by the Free Software Foundation;
895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
1295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
1395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
1495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
1595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
1695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	USE OR PERFORMANCE OF THIS SOFTWARE.
1795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
1895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
1995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
2095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky*/
2195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/*
2395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky * $Id$
2495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky */
2595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdio.h>
2795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdlib.h>
2895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <unistd.h>
2995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <errno.h>
3095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <string.h>
3195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/socket.h>
3395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/types.h>
3495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <asm/types.h>
3595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/bluetooth.h>
3795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/hci.h>
3895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
3995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include "parser.h"
4095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
4166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyanskychar *event_map[] = {
4266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Unknown",
4366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Complete",
4466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Inquiry Result",
4566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Complete",
4666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connect Request",
4766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Disconn Complete",
4866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Auth Complete",
4966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Remote Name Req Complete",
5066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Encryp Change",
5166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Change Connection Link Key Complete",
5266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Master Link Key Complete",
5366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Supported Features",
5466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Remote Ver Info Complete",
5566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Setup Complete",
5666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Complete",
5766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Command Status",
5866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Hardware Error",
5966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Flush Occurred",
6066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Role Change",
6166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Number of Completed Packets",
6266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Mode Change",
6366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Return Link Keys",
6466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"PIN Code Request",
6566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Request",
6666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Link Key Notification",
6766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Loopback Command",
6866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Data Buffer Overflow",
6966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Max Slots Change",
7066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Read Clock Offset Complete",
7166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Connection Packet Type Changed",
7266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"QoS Violation",
7366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Page Scan Mode Change",
7466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	"Page Scan Repetition Mode Change"
7566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky};
762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky#define EVENT_NUM	32
772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
782bb451888267740621e80a89abf15ad2821c8619Max Krasnyanskychar *cmd_linkctl_map[] = {
792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry",
812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Inquiry Cancel",
822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Periodic Inquiry Mode",
832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Periodic Inquiry Mode",
842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create Connection",
852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Disconnect",
862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Add SCO Connection",
87d664d7b02955258fd2e42bf9764753ae78ab38d2Max Krasnyansky	"Unknown",
882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Accept Connection Request",
892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reject Connection Request",
902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Reply",
912bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Link Key Request Negative Reply",
922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Reply",
932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"PIN Code Request Negative Reply",
942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Packet Type",
95f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Authentication Requested",
97f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Connection Encryption",
99f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Connection Link Key",
101f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Master Link Key",
103f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Remote Name Request",
105f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Supported Features",
107f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Remote Version Information",
109f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Clock offset"
1112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
112f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky#define CMD_LINKCTL_NUM	31
1132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
1142bb451888267740621e80a89abf15ad2821c8619Max Krasnyanskychar *cmd_linkpol_map[] = {
1152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Hold Mode",
117f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Sniff Mode",
1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Sniff Mode",
1202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Park Mode",
1212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Exit Park Mode",
1222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"QoS Setup",
123f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Role Discovery",
125f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Switch Role",
1272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Policy Settings",
1282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Link Policy Settings"
1292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
130f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky#define CMD_LINKPOL_NUM 13
1312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
1322bb451888267740621e80a89abf15ad2821c8619Max Krasnyanskychar *cmd_hostctl_map[] = {
1332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
1342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Mask",
135f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1362bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset",
137f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1382bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Event Filter",
139f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
140f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1412bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Flush",
1422bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read PIN Type ",
1432bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write PIN Type",
1442bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Create New Unit Key",
145f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1462bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Stored Link Key",
147f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
148f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
149f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1502bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Stored Link Key",
1512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Delete Stored Link Key",
1522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Change Local Name",
1532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Name",
1542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Connection Accept Timeout",
1552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Connection Accept Timeout",
1562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Timeout",
1572bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Timeout",
1582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Scan Enable",
1592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Scan Enable",
1602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Activity",
1612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Activity",
1622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Inquiry Scan Activity",
1632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Inquiry Scan Activity",
1642bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Authentication Enable",
1652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Authentication Enable",
1662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Encryption Mode",
1672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Encryption Mode",
1682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Class of Device",
1692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Class of Device",
1702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Voice Setting",
1712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Voice Setting",
1722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Automatic Flush Timeout",
1732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Automatic Flush Timeout",
1742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Num Broadcast Retransmissions",
1752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Num Broadcast Retransmissions",
1762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Hold Mode Activity ",
1772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Hold Mode Activity",
1782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Transmit Power Level",
1792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read SCO Flow Control Enable",
1802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write SCO Flow Control Enable",
181f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Set Host Controller To Host Flow Control",
183f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Buffer Size",
185f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
1862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Host Number of Completed Packets",
1872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Link Supervision Timeout",
1882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Link Supervision Timeout",
1892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Number of Supported IAC",
1902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Current IAC LAP",
1912bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Current IAC LAP",
1922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Period Mode",
1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Period Mode",
1942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Page Scan Mode",
1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Write Page Scan Mode"
1962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
197f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky#define CMD_HOSTCTL_NUM 62
1982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
1992bb451888267740621e80a89abf15ad2821c8619Max Krasnyanskychar *cmd_info_map[] = {
2002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Version Information",
202f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Local Supported Features",
204f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Buffer Size",
206f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Country Code",
208f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read BD ADDR"
2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
211f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky#define CMD_INFO_NUM 9
2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyanskychar *cmd_status_map[] = {
2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Unknown",
2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read Failed Contact Counter",
2162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Reset Failed Contact Counter",
2172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Get Link Quality",
218f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky	"Unknown",
2192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	"Read RSSI"
2202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky};
2212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky#define CMD_STATUS_NUM 5
22266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky
22395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyanskystatic inline void command_dump(void *ptr, int len)
22495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
22595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	hci_command_hdr *hdr = ptr;
22695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	__u16 opcode = __le16_to_cpu(hdr->opcode);
2272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	__u16 ogf = cmd_opcode_ogf(opcode);
2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	__u16 ocf = cmd_opcode_ocf(opcode);
2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	char *cmd;
23095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
23195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	ptr += HCI_COMMAND_HDR_SIZE;
23295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	len -= HCI_COMMAND_HDR_SIZE;
23395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	switch (ogf) {
2352bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_INFO_PARAM:
2362bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_INFO_NUM)
2372bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = cmd_info_map[ocf];
2382bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
2392bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
2402bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
2412bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
2422bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_HOST_CTL:
2432bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_HOSTCTL_NUM)
2442bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = cmd_hostctl_map[ocf];
2452bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
2462bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
2472bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
2482bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
2492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_CTL:
2502bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKCTL_NUM)
2512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = cmd_linkctl_map[ocf];
2522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
2532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
2542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
2552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
2562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_LINK_POLICY:
2572bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_LINKPOL_NUM)
2582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = cmd_linkpol_map[ocf];
2592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
2602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
2612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
2622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
2632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	case OGF_STATUS_PARAM:
2642bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		if (ocf <= CMD_STATUS_NUM)
2652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = cmd_status_map[ocf];
2662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		else
2672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky			cmd = "Unknown";
2682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
2692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
2702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	default:
2712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		cmd = "Unknown";
2722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky		break;
2732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	}
2742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky
2752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	printf("HCI Command: %s(0x%2.2x|0x%4.4x) plen %d\n", cmd, ogf, ocf, hdr->plen);
27695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	raw_dump(1, ptr, len);
27795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
27895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
27995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyanskystatic inline void event_dump(void *ptr, int len)
28095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
28195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	hci_event_hdr *hdr = ptr;
28295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
28395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	ptr += HCI_EVENT_HDR_SIZE;
28495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	len -= HCI_EVENT_HDR_SIZE;
28595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	if (hdr->evt <= EVENT_NUM)
28766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: %s(0x%2.2x) plen %d\n",
28866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky			event_map[hdr->evt], hdr->evt, hdr->plen);
28966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	else
29066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
29195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	raw_dump(1, ptr, len);
29295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
29395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
29495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyanskystatic inline void acl_dump(void *ptr, int len)
29595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
29695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	hci_acl_hdr *hdr = ptr;
29795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	__u16 handle = __le16_to_cpu(hdr->handle);
29895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	__u16 dlen = __le16_to_cpu(hdr->dlen);
2990acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky	__u8 flags = acl_flags(handle);
3000acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky
3010acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky	printf("ACL data: handle 0x%4.4x flags 0x%2.2x dlen %d\n",
3020acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky		acl_handle(handle), flags, dlen);
30395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
30495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	ptr += HCI_ACL_HDR_SIZE;
30595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	len -= HCI_ACL_HDR_SIZE;
3060acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky
3070acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky	if (flags & ACL_START) {
3080acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky		l2cap_dump(1, ptr, len, flags);
3090acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky	} else {
3100acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky		raw_dump(1, ptr, len);
3110acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky	}
31295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
31395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
31495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyanskyvoid hci_dump(int level, __u8 *data, int len)
31595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
31695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	unsigned char *ptr = data;
31795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	__u8 type;
31895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
31995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	type = *ptr++; len--;
32095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
32195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	switch (type) {
32295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_COMMAND_PKT:
32395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		command_dump(ptr, len);
32495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
32595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
32695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_EVENT_PKT:
32795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		event_dump(ptr, len);
32895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
32995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
33095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_ACLDATA_PKT:
33195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		acl_dump(ptr, len);
33295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
33395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
33495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	default:
33595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		printf("Unknown: type 0x%2.2x len %d\n", type, len);
33695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		raw_dump(1, ptr, len);
33795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
33895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	}
33995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
340