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