hci.c revision 65eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfb
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
22365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void command_dump(int level, struct frame *frm)
22495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
225174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_command_hdr *hdr = frm->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
23165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (p_filter(FILT_HCI))
23265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		return;
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
27565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	p_indent(level, frm->in);
27665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
27765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	printf("HCI Command: %s(0x%2.2x|0x%4.4x) plen %d\n",
27865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		cmd, ogf, ocf, hdr->plen);
27965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
28065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_COMMAND_HDR_SIZE;
28165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_COMMAND_HDR_SIZE;
28265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
28365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	raw_dump(level, frm);
28495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
28595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
28665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm)
28795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
288174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_event_hdr *hdr = frm->ptr;
28965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
29065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (p_filter(FILT_HCI))
29165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		return;
29265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
29365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	p_indent(level, frm->in);
29495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
2952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky	if (hdr->evt <= EVENT_NUM)
29666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: %s(0x%2.2x) plen %d\n",
29766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky			event_map[hdr->evt], hdr->evt, hdr->plen);
29866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky	else
29966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky		printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen);
30065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
30165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->ptr += HCI_EVENT_HDR_SIZE;
30265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	frm->len -= HCI_EVENT_HDR_SIZE;
30365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
30465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	raw_dump(level, frm);
30595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
30695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
30765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm)
30895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
309174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	hci_acl_hdr *hdr = (void *) frm->ptr;
31095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	__u16 handle = __le16_to_cpu(hdr->handle);
31195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	__u16 dlen = __le16_to_cpu(hdr->dlen);
3120acc29e48dbb65c22a7aa4e6d20ebe30275a763aMax Krasnyansky	__u8 flags = acl_flags(handle);
31365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
31465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (!p_filter(FILT_HCI)) {
31565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		p_indent(level, frm->in);
31665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		printf("ACL data: handle 0x%4.4x flags 0x%2.2x dlen %d\n",
31765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			acl_handle(handle), flags, dlen);
31865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		level++;
31965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	}
32065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
321f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->ptr  += HCI_ACL_HDR_SIZE;
322f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->len  -= HCI_ACL_HDR_SIZE;
323f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->flags  = flags;
324f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky	frm->handle = acl_handle(handle);
32565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
32665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	if (parser.filter & ~FILT_HCI)
32765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		l2cap_dump(level, frm);
32865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky	else
32965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
33095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
33195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
332174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm)
33395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{
334174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	__u8 type = *(__u8 *)frm->ptr;
33595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
336174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky	frm->ptr++; frm->len--;
33795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
33895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	switch (type) {
33995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_COMMAND_PKT:
34065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		command_dump(level, frm);
34195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
34295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
34395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_EVENT_PKT:
34465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		event_dump(level, frm);
34595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
34695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
34795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	case HCI_ACLDATA_PKT:
34865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		acl_dump(level, frm);
34995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
35095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky
35195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	default:
35265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		if (p_filter(FILT_HCI))
35365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky			break;
35465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky
35565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		p_indent(level, frm->in);
356174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky		printf("Unknown: type 0x%2.2x len %d\n", type, frm->len);
35765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky		raw_dump(level, frm);
35895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky		break;
35995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky	}
36095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky}
361