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