hci.c revision 994875fdee06bd4c8a902db513ab6482371c0795
195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/* 2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 3aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann * BlueZ - Bluetooth protocol stack for Linux 4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * Copyright (C) 2000-2002 Maxim Krasnyansky <maxk@qualcomm.com> 6fa3dc8fee8b3525e53b8b2513b57abfc8bf93927Marcel Holtmann * Copyright (C) 2003-2006 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 21aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 2395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky */ 2495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 25aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#ifdef HAVE_CONFIG_H 26aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <config.h> 27aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#endif 28aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann 2995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdio.h> 30e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#include <errno.h> 31d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#include <ctype.h> 3295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <unistd.h> 33aace363653bba5b4b20648014a5b4103723d5991Marcel Holtmann#include <stdlib.h> 3495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <string.h> 3595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 3695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/types.h> 370d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <sys/socket.h> 380d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <netinet/in.h> 3995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 4095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/bluetooth.h> 4195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/hci.h> 42ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann#include <bluetooth/hci_lib.h> 4395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 4495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include "parser.h" 4595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 46be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic uint16_t manufacturer = DEFAULT_COMPID; 47be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 48be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic inline uint16_t get_manufacturer(void) 49be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann{ 50be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer); 51be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann} 52be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 53d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann#define EVENT_NUM 55 5413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *event_str[EVENT_NUM + 1] = { 5566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Unknown", 5666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Inquiry Complete", 5766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Inquiry Result", 5866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Connect Complete", 5966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Connect Request", 6066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Disconn Complete", 6166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Auth Complete", 6266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Remote Name Req Complete", 63d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky "Encrypt Change", 6466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Change Connection Link Key Complete", 6566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Master Link Key Complete", 6666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Read Remote Supported Features", 6766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Read Remote Ver Info Complete", 6866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "QoS Setup Complete", 6966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Command Complete", 7066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Command Status", 7166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Hardware Error", 7266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Flush Occurred", 7366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Role Change", 7466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Number of Completed Packets", 7566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Mode Change", 7666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Return Link Keys", 7766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "PIN Code Request", 7866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Link Key Request", 7966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Link Key Notification", 8066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Loopback Command", 8166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Data Buffer Overflow", 8266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Max Slots Change", 8366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Read Clock Offset Complete", 8466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Connection Packet Type Changed", 8566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "QoS Violation", 8666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Page Scan Mode Change", 87328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Page Scan Repetition Mode Change", 88328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Flow Specification Complete", 89328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Inquiry Result with RSSI", 90328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Remote Extended Features", 91328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 92328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 93328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 94328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 95328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 96328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 97328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 98328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 99328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Synchronous Connect Complete", 1001a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Synchronous Connect Changed", 101120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann "Sniff Subrate", 1021a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Extended Inquiry Result", 103d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Unknown", 104d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Unknown", 105d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Unknown", 106d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Unknown", 107d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Unknown", 108d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Unknown", 109d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Unknown", 110d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann "Link Supervision Timeout Change", 11166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky}; 1122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 11313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_LINKCTL_NUM 41 11413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkctl_str[CMD_LINKCTL_NUM + 1] = { 1152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Inquiry", 1172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Inquiry Cancel", 1182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Periodic Inquiry Mode", 1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Exit Periodic Inquiry Mode", 1202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Create Connection", 1212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Disconnect", 1222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Add SCO Connection", 123328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Create Connection Cancel", 1242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Accept Connection Request", 1252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Reject Connection Request", 1262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Link Key Request Reply", 1272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Link Key Request Negative Reply", 1282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "PIN Code Request Reply", 1292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "PIN Code Request Negative Reply", 1302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Change Connection Packet Type", 131f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Authentication Requested", 133f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1342bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Connection Encryption", 135f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1362bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Change Connection Link Key", 137f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1382bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Master Link Key", 139f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1402bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Remote Name Request", 141328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Remote Name Request Cancel", 1422bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Remote Supported Features", 143328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Remote Extended Features", 1442bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Remote Version Information", 145f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 146328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Clock Offset", 147328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read LMP Handle" 148328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 149328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 150328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 151328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 152328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 153328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 154328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 155328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Setup Synchronous Connection", 156328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Accept Synchronous Connection", 1571a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Reject Synchronous Connection", 1582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 1592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 160120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann#define CMD_LINKPOL_NUM 17 16113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_linkpol_str[CMD_LINKPOL_NUM + 1] = { 1622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 1632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Hold Mode", 164f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Sniff Mode", 1662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Exit Sniff Mode", 167328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Park State", 168328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Exit Park State", 1692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "QoS Setup", 170f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Role Discovery", 172f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Switch Role", 1742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Link Policy Settings", 175328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Link Policy Settings", 176328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Default Link Policy Settings", 177328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Default Link Policy Settings", 1781a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Flow Specification", 179120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann "Sniff Subrate", 1802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 1812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 18213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_HOSTCTL_NUM 82 18313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_hostctl_str[CMD_HOSTCTL_NUM + 1] = { 1842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 1852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Event Mask", 186f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Reset", 188f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Event Filter", 190f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 191f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Flush", 1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read PIN Type ", 1942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write PIN Type", 1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Create New Unit Key", 196f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Stored Link Key", 198f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 199f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 200f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Stored Link Key", 2022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Delete Stored Link Key", 203328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Local Name", 2042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Local Name", 2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Connection Accept Timeout", 2062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Connection Accept Timeout", 2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Timeout", 2082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Page Timeout", 2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Scan Enable", 2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Scan Enable", 2112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Scan Activity", 2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Page Scan Activity", 2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Inquiry Scan Activity", 2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Inquiry Scan Activity", 2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Authentication Enable", 2162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Authentication Enable", 2172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Encryption Mode", 2182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Encryption Mode", 2192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Class of Device", 2202bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Class of Device", 2212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Voice Setting", 2222bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Voice Setting", 2232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Automatic Flush Timeout", 2242bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Automatic Flush Timeout", 2252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Num Broadcast Retransmissions", 2262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Num Broadcast Retransmissions", 2272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Hold Mode Activity ", 2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Hold Mode Activity", 2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Transmit Power Level", 230328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Synchronous Flow Control Enable", 231328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Synchronous Flow Control Enable", 232f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Host Controller To Host Flow Control", 234f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2352bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Host Buffer Size", 236f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2372bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Host Number of Completed Packets", 2382bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Link Supervision Timeout", 2392bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Link Supervision Timeout", 2402bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Number of Supported IAC", 2412bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Current IAC LAP", 2422bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Current IAC LAP", 2432bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Scan Period Mode", 2442bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Page Scan Period Mode", 2452bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Scan Mode", 246328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Page Scan Mode", 247328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Set AFH Host Channel Classification", 248328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 249328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 250328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Inquiry Scan Type", 251328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Inquiry Scan Type", 252328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Inquiry Mode", 253328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Inquiry Mode", 254328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Page Scan Type", 255328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Page Scan Type", 256328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read AFH Channel Assessment Mode", 2571a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Write AFH Channel Assessment Mode", 2581a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Unknown", 25913acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann "Unknown", 26013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann "Unknown", 26113acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann "Unknown", 26213acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann "Unknown", 26313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann "Unknown", 26413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann "Unknown", 2651a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Read Extended Inquiry Response", 2661a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Write Extended Inquiry Response", 2672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 2682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 26913acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_INFO_NUM 9 27013acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_info_str[CMD_INFO_NUM + 1] = { 2712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 2722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Local Version Information", 273328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Local Supported Commands", 2742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Local Supported Features", 275328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Local Extended Features", 2762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Buffer Size", 277f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Country Code", 279f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2801a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Read BD ADDR", 2812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 2822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 28313acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define CMD_STATUS_NUM 7 28413acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *cmd_status_str[CMD_STATUS_NUM + 1] = { 2852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 2862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Failed Contact Counter", 2872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Reset Failed Contact Counter", 288328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Link Quality", 289f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 290328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read RSSI", 291328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read AFH Channel Map", 2921a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Read Clock", 2932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 29466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky 29513acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmann#define ERROR_CODE_NUM 53 29613acd00538e98ea31757ea1146fb579b767bc58cMarcel Holtmannstatic char *error_code_str[ERROR_CODE_NUM + 1] = { 297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Success", 298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unknown HCI Command", 299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unknown Connection Identifier", 300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Hardware Failure", 301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Page Timeout", 302d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Authentication Failure", 303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "PIN or Key Missing", 304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Memory Capacity Exceeded", 305d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Timeout", 306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Limit Exceeded", 307d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Synchronous Connection to a Device Exceeded", 308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "ACL Connection Already Exists", 309d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Command Disallowed", 310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Rejected due to Limited Resources", 311d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Rejected due to Security Reasons", 312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Rejected due to Unacceptable BD_ADDR", 313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Accept Timeout Exceeded", 314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unsupported Feature or Parameter Value", 315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Invalid HCI Command Parameters", 31660864ce9e77ec159d0914fe8d938565493f08eebMarcel Holtmann "Remote User Terminated Connection", 317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Remote Device Terminated Connection due to Low Resources", 318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Remote Device Terminated Connection due to Power Off", 319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Terminated by Local Host", 320fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann "Repeated Attempts", 321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Pairing Not Allowed", 322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unknown LMP PDU", 323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unsupported Remote Feature / Unsupported LMP Feature", 324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "SCO Offset Rejected", 325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "SCO Interval Rejected", 326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "SCO Air Mode Rejected", 327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Invalid LMP Parameters", 328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unspecified Error", 329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unsupported LMP Parameter Value", 330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Role Change Not Allowed", 331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "LMP Response Timeout", 332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "LMP Error Transaction Collision", 333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "LMP PDU Not Allowed", 334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Encryption Mode Not Acceptable", 335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Link Key Can Not be Changed", 336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Requested QoS Not Supported", 337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Instant Passed", 338fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann "Pairing with Unit Key Not Supported", 339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Different Transaction Collision", 340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved", 341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "QoS Unacceptable Parameter", 342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "QoS Rejected", 343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Channel Classification Not Supported", 344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Insufficient Security", 345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Parameter out of Mandatory Range", 346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved", 347d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Role Switch Pending", 348d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved", 349d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved Slot Violation", 3501a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Role Switch Failed", 351d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}; 352d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 353d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *status2str(uint8_t status) 354d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 355d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char *str; 356d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 357d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (status <= ERROR_CODE_NUM) 358d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann str = error_code_str[status]; 359d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann else 360d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann str = "Unknown"; 361d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 362d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return str; 363d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 364d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 365d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *opcode2str(uint16_t opcode) 36695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 3670d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 3680d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 3692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky char *cmd; 37095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 3712bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky switch (ogf) { 3722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_INFO_PARAM: 3732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_INFO_NUM) 374d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_info_str[ocf]; 3752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3782bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 3792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_HOST_CTL: 3802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_HOSTCTL_NUM) 381d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_hostctl_str[ocf]; 3822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 3862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_LINK_CTL: 3872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_LINKCTL_NUM) 388d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_linkctl_str[ocf]; 3892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3912bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 3932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_LINK_POLICY: 3942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_LINKPOL_NUM) 395d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_linkpol_str[ocf]; 3962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 4002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_STATUS_PARAM: 4012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_STATUS_NUM) 402d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_status_str[ocf]; 4032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 4042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 4052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 4062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 407cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann case OGF_TESTING_CMD: 408cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann cmd = "Testing"; 409cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann break; 410cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann 411cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann case OGF_VENDOR_CMD: 412cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann cmd = "Vendor"; 413cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann break; 414cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann 4152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky default: 4162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 4172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 4182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky } 4192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 420d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return cmd; 421d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 422d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *role2str(uint8_t role) 424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (role) { 426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x00: 427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Master"; 428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x01: 429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Slave"; 430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann default: 431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Unknown"; 432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *mode2str(uint8_t mode) 436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (mode) { 438ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x00: 439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Active"; 440ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x01: 441ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Hold"; 442ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x02: 443ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Sniff"; 444ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x03: 445ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Park"; 446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann default: 447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Unknown"; 448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 449ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 451d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic char *airmode2str(uint8_t mode) 452d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 453d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann switch (mode) { 454d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x00: 455d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "u-law log"; 456d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x01: 457d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "A-law log"; 458d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x02: 459d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "CVSD"; 460d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x04: 461d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "Transparent data"; 462d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann default: 463d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "Reserved"; 464d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 465d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 466d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 467e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmannstatic inline void ext_inquiry_response_dump(int level, struct frame *frm) 468e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann{ 469e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann void *ptr = frm->ptr; 470e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann uint32_t len = frm->len; 471e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann uint8_t type, length; 472e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann char *str; 473e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann int i; 474e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 475e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann length = get_u8(frm); 476e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 477e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann while (length > 0) { 478e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann type = get_u8(frm); 479e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann length--; 480e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 481e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann switch (type) { 482e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann case 0x08: 483e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann case 0x09: 484e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann str = malloc(length + 1); 485e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann if (str) { 486ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann snprintf(str, length + 1, "%s", (char *) frm->ptr); 487e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann for (i = 0; i < length; i++) 488e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann if (!isprint(str[i])) 489e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann str[i] = '.'; 490e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann p_indent(level, frm); 491e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann printf("%s local name: \'%s\'\n", 492e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann type == 0x08 ? "Shortened" : "Complete", str); 493e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann free(str); 494e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann } 495e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann break; 496e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 497e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann default: 498e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann p_indent(level, frm); 499e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann printf("Unknown type 0x%02x with %d bytes data\n", 500e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann type, length); 501e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann break; 502e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann } 503e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 504e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann frm->ptr += length; 505e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann frm->len -= length; 506e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 507e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann length = get_u8(frm); 508e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann } 509e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 510e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann frm->ptr = ptr + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE); 511e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann frm->len = len + (EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE); 512e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann} 513e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann 514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void generic_command_dump(int level, struct frame *frm) 515ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 516ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 517ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 518ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 519ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d\n", handle); 520ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 521ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 522ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 523ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 52490480219be366c65e68ae8612de7a361027e751aMarcel Holtmannstatic inline void bdaddr_command_dump(int level, struct frame *frm) 52590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann{ 52690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann bdaddr_t *bdaddr = frm->ptr; 52790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann char addr[18]; 52890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 52990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann frm->ptr += sizeof(bdaddr_t); 53090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann frm->len -= sizeof(bdaddr_t); 53190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 53290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann p_indent(level, frm); 533bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(bdaddr, addr); 534e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann printf("bdaddr %s\n", addr); 53590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 53690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann raw_dump(level, frm); 53790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann} 53890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void inquiry_dump(int level, struct frame *frm) 540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann inquiry_cp *cp = frm->ptr; 542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n", 545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp); 546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void periodic_inquiry_dump(int level, struct frame *frm) 549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann periodic_inquiry_cp *cp = frm->ptr; 551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n", 554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(cp->max_period), btohs(cp->min_period), 555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp); 556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void create_conn_dump(int level, struct frame *frm) 559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann create_conn_cp *cp = frm->ptr; 561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t ptype = btohs(cp->pkt_type); 562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t clkoffset = btohs(cp->clock_offset); 563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18], *str; 564ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 565ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 566bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&cp->bdaddr, addr); 567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n", 568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann addr, ptype, cp->role_switch, 569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : ""); 570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_ptypetostr(ptype); 572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 573ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 574ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Packet type: %s\n", str); 575ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 576ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 577ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 578ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void disconnect_dump(int level, struct frame *frm) 580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann disconnect_cp *cp = frm->ptr; 582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason); 585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Reason: %s\n", status2str(cp->reason)); 588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void add_sco_dump(int level, struct frame *frm) 591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann add_sco_cp *cp = frm->ptr; 593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t ptype = btohs(cp->pkt_type); 594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char *str; 595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype); 598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_ptypetostr(ptype); 600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Packet type: %s\n", str); 603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void accept_conn_req_dump(int level, struct frame *frm) 608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_cp *cp = frm->ptr; 610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 613bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&cp->bdaddr, addr); 614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s role 0x%2.2x\n", addr, cp->role); 615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Role: %s\n", role2str(cp->role)); 618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void reject_conn_req_dump(int level, struct frame *frm) 621ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 622ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann reject_conn_req_cp *cp = frm->ptr; 623ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 626bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&cp->bdaddr, addr); 627ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason); 628ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 629ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Reason: %s\n", status2str(cp->reason)); 631ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 632ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 633ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_reply_dump(int level, struct frame *frm) 634ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_reply_cp *cp = frm->ptr; 636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18], pin[17]; 637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 638ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 639bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&cp->bdaddr, addr); 640ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memset(pin, 0, sizeof(pin)); 641a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann if (parser.flags & DUMP_NOVENDOR) 642a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann memset(pin, '*', cp->pin_len); 643a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann else 644a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann memcpy(pin, cp->pin_code, cp->pin_len); 645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin); 646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_reply_dump(int level, struct frame *frm) 649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_reply_cp *cp = frm->ptr; 651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 654ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 655bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&cp->bdaddr, addr); 65644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s key ", addr); 657ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 16; i++) 658a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann if (parser.flags & DUMP_NOVENDOR) 659a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("**"); 660a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann else 661a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("%2.2X", cp->link_key[i]); 662ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 663ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 664ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 665ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_neg_reply_dump(int level, struct frame *frm) 666ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 667ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_t *bdaddr = frm->ptr; 668ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 669ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 670ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 671bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(bdaddr, addr); 672ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s\n", addr); 673ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 674ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 675ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void set_conn_encrypt_dump(int level, struct frame *frm) 676ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 677ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann set_conn_encrypt_cp *cp = frm->ptr; 678ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 679ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 680ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt); 681ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 682ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 683ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void remote_name_req_dump(int level, struct frame *frm) 684ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 685ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann remote_name_req_cp *cp = frm->ptr; 686ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t clkoffset = btohs(cp->clock_offset); 687ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 688ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 689ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 690bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&cp->bdaddr, addr); 69172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n", 69272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann addr, cp->pscan_rep_mode, 69372e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : ""); 694ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 695ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 69617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_dump(int level, struct frame *frm) 69717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 69817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_cp *cp = frm->ptr; 69917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 70017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 70117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("flag %d\n", cp->key_flag); 70217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 70317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 70417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_dump(int level, struct frame *frm) 70517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 70617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_cp *cp = frm->ptr; 70717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 708e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann p_indent(level, frm); 709e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann printf("handle %d page %d\n", btohs(cp->handle), cp->page_num); 71017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 71117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 7129ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmannstatic inline void hold_mode_dump(int level, struct frame *frm) 7139ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann{ 7149ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann hold_mode_cp *cp = frm->ptr; 7159ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann 7169ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann p_indent(level, frm); 7179ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann printf("handle %d max %d min %d\n", btohs(cp->handle), 7189ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann btohs(cp->max_interval), btohs(cp->min_interval)); 7199ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann} 7209ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann 7219ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmannstatic inline void sniff_mode_dump(int level, struct frame *frm) 7229ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann{ 7239ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann sniff_mode_cp *cp = frm->ptr; 7249ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann 7259ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann p_indent(level, frm); 7269ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann printf("handle %d max %d min %d attempt %d timeout %d\n", 7279ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann btohs(cp->handle), btohs(cp->max_interval), 7289ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann btohs(cp->min_interval), btohs(cp->attempt), btohs(cp->timeout)); 7299ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann} 7309ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann 731ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_link_policy_dump(int level, struct frame *frm) 732ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 733ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_link_policy_cp *cp = frm->ptr; 734ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t policy = btohs(cp->policy); 735ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char *str; 736ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 737ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 738ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy); 739ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 740ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_lptostr(policy); 741ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 742ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 743ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Link policy: %s\n", str); 744ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 745ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 746ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 747ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 748120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmannstatic inline void sniff_subrate_dump(int level, struct frame *frm) 749120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann{ 750120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann sniff_subrate_cp *cp = frm->ptr; 751120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 752120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 753120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("handle %d\n", btohs(cp->handle)); 754120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 755120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 756f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann printf("max latency %d\n", btohs(cp->max_latency)); 757120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 758120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 759120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("min timeout remote %d local %d\n", 760120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(cp->min_remote_timeout), btohs(cp->min_local_timeout)); 761120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann} 762120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 76344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_mask_dump(int level, struct frame *frm) 76444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 76544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_mask_cp *cp = frm->ptr; 76644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann int i; 76744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 76844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 76944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Mask: 0x"); 77044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann for (i = 0; i < 8; i++) 77144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("%2.2x", cp->mask[i]); 77244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 77344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 77444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 77544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_flt_dump(int level, struct frame *frm) 77644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 77744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_flt_cp *cp = frm->ptr; 778cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann uint8_t dev_class[3], dev_mask[3]; 779cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann char addr[18]; 78044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 78144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 782662fd6cd30f3adbfef7c39e2bfcfb1107d96ebbbMarcel Holtmann printf("type %d condition %d\n", cp->flt_type, 783662fd6cd30f3adbfef7c39e2bfcfb1107d96ebbbMarcel Holtmann (cp->flt_type == 0) ? 0 : cp->cond_type); 78444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 78544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann switch (cp->flt_type) { 78644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case FLT_CLEAR_ALL: 78751c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann p_indent(level, frm); 78844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Clear all filters\n"); 78944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 79044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case FLT_INQ_RESULT: 79151c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann p_indent(level, frm); 79244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Inquiry result"); 79344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann switch (cp->cond_type) { 79444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case INQ_RESULT_RETURN_ALL: 795cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann printf(" for all devices\n"); 796cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann break; 79744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case INQ_RESULT_RETURN_CLASS: 798cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann memcpy(dev_class, cp->condition, 3); 799cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann memcpy(dev_mask, cp->condition + 3, 3); 800cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann printf(" with class 0x%2.2x%2.2x%2.2x mask 0x%2.2x%2.2x%2.2x\n", 801cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann dev_class[2], dev_class[1], dev_class[0], 802cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann dev_mask[2], dev_mask[1], dev_mask[0]); 803cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann break; 80444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case INQ_RESULT_RETURN_BDADDR: 805bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str((bdaddr_t *) cp->condition, addr); 806cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann printf(" with bdaddr %s\n", addr); 807cfdc4bc6b3f7bd814049e31d11c901f8ad95f9a1Marcel Holtmann break; 80844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann default: 80944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 81044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 81144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 81244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 81344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case FLT_CONN_SETUP: 81451c927b7eb7f8f78d31d3e8cfe218649c29eb44dMarcel Holtmann p_indent(level, frm); 81544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Connection setup"); 81644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann switch (cp->cond_type) { 81744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case CONN_SETUP_ALLOW_ALL: 81844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case CONN_SETUP_ALLOW_CLASS: 81944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case CONN_SETUP_ALLOW_BDADDR: 82044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann default: 82144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 82244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 82344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 82444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 82544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 82644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 82744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 82844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_pin_type_dump(int level, struct frame *frm) 82944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 83044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_pin_type_cp *cp = frm->ptr; 83144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 83244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 83344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("type %d\n", cp->pin_type); 83444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 83544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 83644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void request_stored_link_key_dump(int level, struct frame *frm) 83744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 83844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_cp *cp = frm->ptr; 83944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann char addr[18]; 84044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 84144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 842bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&cp->bdaddr, addr); 84344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s all %d\n", addr, cp->read_all); 84444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 84544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 84644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void return_link_keys_dump(int level, struct frame *frm) 84744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 84844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann uint8_t num = get_u8(frm); 84944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann uint8_t key[16]; 85044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann char addr[18]; 85144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann int i, n; 85244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 85344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann for (n = 0; n < num; n++) { 854bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(frm->ptr, addr); 85544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann memcpy(key, frm->ptr + 6, 16); 85644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 85744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 85844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s key ", addr); 85944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann for (i = 0; i < 16; i++) 860a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann if (parser.flags & DUMP_NOVENDOR) 861a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("**"); 862a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann else 863a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("%2.2X", key[i]); 86444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 86544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 86644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann frm->ptr += 2; 86744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann frm->len -= 2; 86844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 86944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 87044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 871ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void change_local_name_dump(int level, struct frame *frm) 872ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 873ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann change_local_name_cp *cp = frm->ptr; 874ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char name[249]; 875ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 876ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 877ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memset(name, 0, sizeof(name)); 878ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 248 && cp->name[i]; i++) 879ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (isprint(cp->name[i])) 880ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = cp->name[i]; 881ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann else 882ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = '.'; 883ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 884ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 885ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("name \'%s\'\n", name); 886ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 887ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 888ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_class_of_dev_dump(int level, struct frame *frm) 889ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 890ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_class_of_dev_cp *cp = frm->ptr; 891ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 892ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 893ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("class 0x%2.2x%2.2x%2.2x\n", 894120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]); 895ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 896ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 897ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_voice_setting_dump(int level, struct frame *frm) 898ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 899ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_voice_setting_cp *cp = frm->ptr; 900ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 901ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 902ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting)); 903ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 904ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 905fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void write_current_iac_lap_dump(int level, struct frame *frm) 906fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{ 907fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann write_current_iac_lap_cp *cp = frm->ptr; 908fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann int i; 909fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 910fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann for (i = 0; i < cp->num_current_iac; i++) { 911fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann p_indent(level, frm); 912fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]); 913fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) { 914fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann switch (cp->lap[i][0]) { 915fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x00: 916fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (Limited Inquiry Access Code)"); 917fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 918fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x33: 919fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (General Inquiry Access Code)"); 920fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 921fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 922fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 923fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("\n"); 924fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 925fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann} 926fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 92769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void write_scan_enable_dump(int level, struct frame *frm) 92869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{ 92969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t enable = get_u8(frm); 93069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 93169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 93269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("enable %d\n", enable); 93369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann} 93469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 935d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_timeout_dump(int level, struct frame *frm) 936d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 937d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_timeout_cp *cp = frm->ptr; 938d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 939d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 940d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("timeout %d\n", btohs(cp->timeout)); 941d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 942d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 943d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_activity_dump(int level, struct frame *frm) 944d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 945d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_activity_cp *cp = frm->ptr; 946d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 947d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 948d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window)); 949d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 950d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 951a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void write_inquiry_scan_type_dump(int level, struct frame *frm) 952a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{ 953a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann write_inquiry_scan_type_cp *cp = frm->ptr; 954a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 955a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 956a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("type %d\n", cp->type); 957a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann} 958a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 959f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmannstatic inline void write_inquiry_mode_dump(int level, struct frame *frm) 960f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann{ 961f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann write_inquiry_mode_cp *cp = frm->ptr; 962f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann 963f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann p_indent(level, frm); 964f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann printf("mode %d\n", cp->mode); 965f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann} 966f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann 967994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmannstatic inline void set_afh_classification_dump(int level, struct frame *frm) 968994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann{ 969994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann set_afh_classification_cp *cp = frm->ptr; 970994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann int i; 971994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann 972994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann p_indent(level, frm); 973994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann printf("map 0x"); 974994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann for (i = 0; i < 10; i++) 975994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann printf("%02x", cp->map[i]); 976994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann printf("\n"); 977994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann} 978994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann 9796eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void write_link_supervision_timeout_dump(int level, struct frame *frm) 9806eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 9816eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann write_link_supervision_timeout_cp *cp = frm->ptr; 9826eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 9836eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 9846eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("handle %d timeout %d\n", 985d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann btohs(cp->handle), btohs(cp->timeout)); 9866eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 9876eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 9881a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void write_ext_inquiry_response_dump(int level, struct frame *frm) 9891a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{ 9901a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann write_ext_inquiry_response_cp *cp = frm->ptr; 9911a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 9921a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 9931a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("fec 0x%2.2x\n", cp->fec); 994f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann 995f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->ptr++; 996f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->len--; 997f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann 998e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann ext_inquiry_response_dump(level, frm); 9991a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann} 10001a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 10016eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void request_transmit_power_level_dump(int level, struct frame *frm) 10026eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 10036eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_cp *cp = frm->ptr; 10046eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 10056eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 10066eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("handle %d type %d (%s)\n", 1007120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(cp->handle), cp->type, 1008120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann cp->type ? "maximum" : "current"); 10096eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 10106eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 101117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void request_local_ext_features_dump(int level, struct frame *frm) 101217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 101317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_cp *cp = frm->ptr; 101417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 101517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 101617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("page %d\n", cp->page_num); 101717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 101817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1019f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void request_clock_dump(int level, struct frame *frm) 1020f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1021f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_cp *cp = frm->ptr; 1022f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1023f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1024f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("handle %d which %d (%s)\n", 1025120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(cp->handle), cp->which_clock, 1026120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann cp->which_clock ? "piconet" : "local"); 1027f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1028f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 10292315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmannstatic inline void host_buffer_size_dump(int level, struct frame *frm) 10302315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann{ 10312315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann host_buffer_size_cp *cp = frm->ptr; 10322315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann 10332315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann p_indent(level, frm); 10342315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann printf("ACL MTU %d:%d SCO MTU %d:%d\n", 10352315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann btohs(cp->acl_mtu), btohs(cp->acl_max_pkt), 10362315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann cp->sco_mtu, btohs(cp->sco_max_pkt)); 10372315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann} 10382315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann 10391b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm) 10401b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann{ 10411b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann uint8_t num = get_u8(frm); 10421b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann uint16_t handle, packets; 10431b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann int i; 10441b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann 10451b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann for (i = 0; i < num; i++) { 10461b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann handle = btohs(htons(get_u16(frm))); 10471b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann packets = btohs(htons(get_u16(frm))); 10481b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann 10491b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann p_indent(level, frm); 10501b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann printf("handle %d packets %d\n", handle, packets); 10511b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann } 10521b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann} 10531b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann 1054d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm) 1055d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1056d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann hci_command_hdr *hdr = frm->ptr; 1057d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(hdr->opcode); 1058d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 1059d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 1060d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1061d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (p_filter(FILT_HCI)) 1062d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return; 1063d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 10647b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR)) 10657b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 106665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 10677b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 1068803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n", 1069120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann opcode2str(opcode), ogf, ocf, hdr->plen); 107065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 107165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->ptr += HCI_COMMAND_HDR_SIZE; 107265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->len -= HCI_COMMAND_HDR_SIZE; 107365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 10747b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD) { 10757b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ocf == 0 && get_manufacturer() == 10) { 10767b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann csr_dump(level + 1, frm); 10777b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 10787b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann } 1079be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 1080be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 10814f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 10824f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann raw_dump(level, frm); 10834f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann return; 10844f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann } 10854f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann 1086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ogf) { 1087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_CTL: 1088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 1089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_INQUIRY: 1090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann inquiry_dump(level + 1, frm); 1091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1092ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PERIODIC_INQUIRY: 1093ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann periodic_inquiry_dump(level + 1, frm); 1094ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1095ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_INQUIRY_CANCEL: 1096ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_PERIODIC_INQUIRY: 1097ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1098ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CREATE_CONN: 1099ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann create_conn_dump(level + 1, frm); 1100ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1101ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_DISCONNECT: 1102ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann disconnect_dump(level + 1, frm); 1103ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 110490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_CREATE_CONN_CANCEL: 110590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REMOTE_NAME_REQ_CANCEL: 110690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_ACCEPT_SYNC_CONN_REQ: 110790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann bdaddr_command_dump(level + 1, frm); 110890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann return; 1109ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ADD_SCO: 1110ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SET_CONN_PTYPE: 1111ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann add_sco_dump(level + 1, frm); 1112acc2322e0bed89e8ada2564359a1a6d293c9d514Marcel Holtmann return; 1113ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ACCEPT_CONN_REQ: 1114ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_dump(level + 1, frm); 1115ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1116ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_REJECT_CONN_REQ: 111790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REJECT_SYNC_CONN_REQ: 1118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann reject_conn_req_dump(level + 1, frm); 1119ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1120ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_REPLY: 1121ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_reply_dump(level + 1, frm); 1122ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1123ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_REPLY: 1124ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_reply_dump(level + 1, frm); 1125ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1126ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_NEG_REPLY: 1127ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_NEG_REPLY: 1128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_neg_reply_dump(level + 1, frm); 1129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1130ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SET_CONN_ENCRYPT: 1131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann set_conn_encrypt_dump(level + 1, frm); 1132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_AUTH_REQUESTED: 1134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CHANGE_CONN_LINK_KEY: 1135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_REMOTE_FEATURES: 1136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_REMOTE_VERSION: 1137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_CLOCK_OFFSET: 113890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_READ_LMP_HANDLE: 113990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_SETUP_SYNC_CONN: 1140ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_command_dump(level + 1, frm); 1141ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 114217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_MASTER_LINK_KEY: 114317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_dump(level + 1, frm); 114417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 114517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_REMOTE_EXT_FEATURES: 114617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_dump(level + 1, frm); 114717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1148ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_REMOTE_NAME_REQ: 1149ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann remote_name_req_dump(level + 1, frm); 1150ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1151ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1152ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1153ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1154ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_POLICY: 1155ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 11569ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann case OCF_HOLD_MODE: 11579ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann case OCF_PARK_MODE: 11589ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann hold_mode_dump(level + 1, frm); 11599ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann return; 11609ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann case OCF_SNIFF_MODE: 11619ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann sniff_mode_dump(level + 1, frm); 11629ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann return; 1163ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_SNIFF_MODE: 1164ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_PARK_MODE: 1165ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ROLE_DISCOVERY: 1166ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_LINK_POLICY: 1167ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_command_dump(level + 1, frm); 1168ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1169ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SWITCH_ROLE: 1170ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_dump(level + 1, frm); 1171ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1172ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_LINK_POLICY: 1173ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_link_policy_dump(level + 1, frm); 1174ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1175120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann case OCF_SNIFF_SUBRATE: 1176120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann sniff_subrate_dump(level + 1, frm); 1177120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann return; 1178ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1179ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1180ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1181ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_HOST_CTL: 1182ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 118344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_RESET: 118444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_CREATE_NEW_UNIT_KEY: 118544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 118644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_MASK: 118744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_mask_dump(level + 1, frm); 118844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 118944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_FLT: 119044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_flt_dump(level + 1, frm); 119144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 119244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_PIN_TYPE: 119344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_pin_type_dump(level + 1, frm); 119444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 119544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_STORED_LINK_KEY: 119644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_DELETE_STORED_LINK_KEY: 119744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann request_stored_link_key_dump(level + 1, frm); 119844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 119944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_STORED_LINK_KEY: 120044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return_link_keys_dump(level + 1, frm); 120144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 1202ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CHANGE_LOCAL_NAME: 1203ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann change_local_name_dump(level + 1, frm); 1204ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1205ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_CLASS_OF_DEV: 1206ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_class_of_dev_dump(level + 1, frm); 1207ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1208ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_VOICE_SETTING: 1209ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_voice_setting_dump(level + 1, frm); 1210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1211fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_CURRENT_IAC_LAP: 1212fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann write_current_iac_lap_dump(level + 1, frm); 1213fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann return; 121469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_SCAN_ENABLE: 121569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_AUTH_ENABLE: 12168583de68ea3be3ada739dcc84d811fc752d45a03Marcel Holtmann case OCF_SET_CONTROLLER_TO_HOST_FC: 121769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann write_scan_enable_dump(level + 1, frm); 121869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann return; 1219097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_WRITE_CONN_ACCEPT_TIMEOUT: 1220d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_TIMEOUT: 1221d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_timeout_dump(level + 1, frm); 1222d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1223d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_ACTIVITY: 1224d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_INQ_ACTIVITY: 1225d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_activity_dump(level + 1, frm); 1226d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1227a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_WRITE_INQUIRY_SCAN_TYPE: 1228a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann write_inquiry_scan_type_dump(level + 1, frm); 1229a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann return; 123069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_ENCRYPT_MODE: 1231f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_INQUIRY_MODE: 1232f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_AFH_MODE: 1233f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann write_inquiry_mode_dump(level + 1, frm); 1234f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann return; 1235994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann case OCF_SET_AFH_CLASSIFICATION: 1236994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann set_afh_classification_dump(level + 1, frm); 1237994875fdee06bd4c8a902db513ab6482371c0795Marcel Holtmann return; 12386eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_TRANSMIT_POWER_LEVEL: 12396eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann request_transmit_power_level_dump(level + 1, frm); 12406eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 12412315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann case OCF_HOST_BUFFER_SIZE: 12422315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann host_buffer_size_dump(level + 1, frm); 12432315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann return; 12441b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann case OCF_HOST_NUM_COMP_PKTS: 12451b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann num_comp_pkts_dump(level + 1, frm); 12461b932dc7a7a586b3fdfb09dab10c116ec6f96324Marcel Holtmann return; 124744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_FLUSH: 12486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_LINK_SUPERVISION_TIMEOUT: 12496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann generic_command_dump(level + 1, frm); 12506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 12516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_WRITE_LINK_SUPERVISION_TIMEOUT: 12526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann write_link_supervision_timeout_dump(level + 1, frm); 12536eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 12541a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_WRITE_EXT_INQUIRY_RESPONSE: 12551a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann write_ext_inquiry_response_dump(level + 1, frm); 12561a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann return; 1257ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1258ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 125917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 126017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OGF_INFO_PARAM: 126117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann switch (ocf) { 126217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_EXT_FEATURES: 126317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann request_local_ext_features_dump(level + 1, frm); 126417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 126517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 1266ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1267f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1268f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OGF_STATUS_PARAM: 1269f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann switch (ocf) { 1270f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_LINK_QUALITY: 1271f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_RSSI: 1272f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_AFH_MAP: 1273f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann generic_command_dump(level + 1, frm); 1274f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1275f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_CLOCK: 1276f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann request_clock_dump(level + 1, frm); 1277f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1278f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1279f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann break; 1280ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1281ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 128265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 128395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 128495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 1285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm) 1286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1287d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t status = get_u8(frm); 1288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x\n", status); 1291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (status > 0) { 1293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(status)); 1295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 1298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1300afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void handle_response_dump(int level, struct frame *frm) 1301afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{ 1302afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 1303afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1304afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann p_indent(level, frm); 1305afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann printf("handle %d\n", handle); 1306afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1307afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann raw_dump(level, frm); 1308afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann} 1309afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1310ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm) 1311ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1312ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint8_t status = get_u8(frm); 1313ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_t *bdaddr = frm->ptr; 1314ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 1315ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1316ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann frm->ptr += sizeof(bdaddr_t); 1317ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann frm->len -= sizeof(bdaddr_t); 1318ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1319ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1320bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(bdaddr, addr); 1321ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x bdaddr %s\n", status, addr); 1322ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1323ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (status > 0) { 1324ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1325ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(status)); 1326ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1327ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1328ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 1329ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1330ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm) 1332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t status = get_u8(frm); 1334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 1335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d\n", status, handle); 1338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (status > 0) { 1340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(status)); 1342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 1345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 134744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_pin_type_dump(int level, struct frame *frm) 134844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 134944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_pin_type_rp *rp = frm->ptr; 135044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 135144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 135244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type); 135344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 135444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 135544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 135644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 135744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 135844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 135944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 136044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_stored_link_key_dump(int level, struct frame *frm) 136144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 136244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_rp *rp = frm->ptr; 136344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 136444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 136544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x max %d num %d\n", 1366120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, rp->max_keys, rp->num_keys); 136744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 136844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 136944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 137044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 137144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 137244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 137344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 137444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_stored_link_key_dump(int level, struct frame *frm) 137544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 137644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_stored_link_key_rp *rp = frm->ptr; 137744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 137844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 137944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys); 138044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 138144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 138244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 138344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 138444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 138544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 138644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 138744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void delete_stored_link_key_dump(int level, struct frame *frm) 138844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 138944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann delete_stored_link_key_rp *rp = frm->ptr; 139044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 139144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 139244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys)); 139344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 139444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 139544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 139644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 139744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 139844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 139944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 1400ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm) 1401ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1402ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_name_rp *rp = frm->ptr; 1403ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char name[249]; 1404ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1405ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1406ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memset(name, 0, sizeof(name)); 1407ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 248 && rp->name[i]; i++) 1408ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (isprint(rp->name[i])) 1409ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = rp->name[i]; 1410ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann else 1411ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = '.'; 1412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x name \'%s\'\n", rp->status, name); 1415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1416ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1417ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1418ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1419ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1420ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1421ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1422ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm) 1423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_class_of_dev_rp *rp = frm->ptr; 1425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status, 1428120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]); 1429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1434ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1435ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1436ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm) 1437ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1438ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_voice_setting_rp *rp = frm->ptr; 1439ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1440ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1441ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x voice setting 0x%4.4x\n", 1442120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->voice_setting)); 1443ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1444ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1445ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1449ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1450fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm) 1451fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{ 1452fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann read_current_iac_lap_rp *rp = frm->ptr; 1453fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann int i; 1454fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 1455fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann for (i = 0; i < rp->num_current_iac; i++) { 1456fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann p_indent(level, frm); 1457fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]); 1458fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) { 1459fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann switch (rp->lap[i][0]) { 1460fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x00: 1461fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (Limited Inquiry Access Code)"); 1462fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 1463fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x33: 1464fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (General Inquiry Access Code)"); 1465fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 1466fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1467fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1468fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("\n"); 1469fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1470fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann} 1471fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 147269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void read_scan_enable_dump(int level, struct frame *frm) 147369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{ 147469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t status = get_u8(frm); 147569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t enable = get_u8(frm); 147669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 147769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 147869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("status 0x%2.2x enable %d\n", status, enable); 147969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 148069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann if (status > 0) { 148169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 148269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("Error: %s\n", status2str(status)); 148369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann } 148469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann} 148569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 1486d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_timeout_dump(int level, struct frame *frm) 1487d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 1488d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_timeout_rp *rp = frm->ptr; 1489d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1490d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1491d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout)); 1492d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1493d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann if (rp->status > 0) { 1494d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1495d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1496d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann } 1497d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 1498d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1499d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_activity_dump(int level, struct frame *frm) 1500d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 1501d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_activity_rp *rp = frm->ptr; 1502d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1503d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1504d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("status 0x%2.2x interval %d window %d\n", 1505120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->interval), btohs(rp->window)); 1506d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1507d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann if (rp->status > 0) { 1508d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1509d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1510d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann } 1511d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 1512d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1513a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void read_inquiry_scan_type_dump(int level, struct frame *frm) 1514a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{ 1515a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann read_inquiry_scan_type_rp *rp = frm->ptr; 1516a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 1517a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 1518a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("status 0x%2.2x type %d\n", rp->status, rp->type); 1519a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 1520a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann if (rp->status > 0) { 1521a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 1522a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1523a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann } 1524a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann} 1525a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 15266eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_inquiry_mode_dump(int level, struct frame *frm) 15276eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 15286eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_inquiry_mode_rp *rp = frm->ptr; 15296eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15306eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15316eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x mode %d\n", rp->status, rp->mode); 15326eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15336eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 15346eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15356eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 15366eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 15376eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 15386eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15396eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_link_supervision_timeout_dump(int level, struct frame *frm) 15406eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 15416eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_link_supervision_timeout_rp *rp = frm->ptr; 15426eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x handle %d timeout %d\n", 1545d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann rp->status, btohs(rp->handle), btohs(rp->timeout)); 15466eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 15486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 15506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 15516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 15526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15536eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_transmit_power_level_dump(int level, struct frame *frm) 15546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 15556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_rp *rp = frm->ptr; 15566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15576eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x handle %d level %d\n", 1559120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->level); 15606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 15626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 15646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 15656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 15666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15671a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void read_ext_inquiry_response_dump(int level, struct frame *frm) 15681a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{ 15691a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann read_ext_inquiry_response_rp *rp = frm->ptr; 15701a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 15711a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 15721a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec); 15731a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 15741a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann if (rp->status > 0) { 15751a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 15761a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1577f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann } else { 1578f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->ptr += 2; 1579f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->len -= 2; 1580f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann 1581e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann ext_inquiry_response_dump(level, frm); 15821a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann } 15831a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann} 15841a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 1585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm) 1586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_version_rp *rp = frm->ptr; 1588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t manufacturer = btohs(rp->manufacturer); 1589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 15981a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n", 1599120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann hci_vertostr(rp->hci_ver), 1600120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->hci_ver, btohs(rp->hci_rev)); 1601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n", 1603120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann lmp_vertostr(rp->lmp_ver), 1604120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->lmp_ver, btohs(rp->lmp_subver)); 1605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Manufacturer: %s (%d)\n", 1607120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann bt_compidtostr(manufacturer), manufacturer); 1608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 161117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_commands_dump(int level, struct frame *frm) 161217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 161317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_commands_rp *rp = frm->ptr; 161417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i, max = 0; 161517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 161617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 161717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 161817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 161917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->status > 0) { 162017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 162117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 162217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 162317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 64; i++) 162417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->commands[i]) 162517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann max = i + 1; 162617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 162717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Commands: "); 162817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < (max > 32 ? 32 : max); i++) 162917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("%2.2x", rp->commands[i]); 163017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 163117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (max > 32) { 163217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 163317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" "); 163417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 32; i < max; i++) 163517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("%2.2x", rp->commands[i]); 163617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 163717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 163817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 163917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 164017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1641ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm) 1642ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1643ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_features_rp *rp = frm->ptr; 1644ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1654ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Features:"); 1655ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 8; i++) 1656ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf(" 0x%2.2x", rp->features[i]); 1657ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 1658ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1659ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1660ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 166117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_ext_features_dump(int level, struct frame *frm) 166217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 166317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_rp *rp = frm->ptr; 166417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i; 166517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 166617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 166717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x page %d max %d\n", 166817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann rp->status, rp->page_num, rp->max_page_num); 166917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 167017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->status > 0) { 167117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 167217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 167317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 167417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 167517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Features:"); 167617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 8; i++) 167717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" 0x%2.2x", rp->features[i]); 167817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 167917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 168017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 168117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1682ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm) 1683ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1684ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_buffer_size_rp *rp = frm->ptr; 1685ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1686ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1687ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1688ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1689ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1690ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1691ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1692ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1693ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1694ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("ACL MTU %d:%d SCO MTU %d:%d\n", 1695120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(rp->acl_mtu), btohs(rp->acl_max_pkt), 1696120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->sco_mtu, btohs(rp->sco_max_pkt)); 1697ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1698ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1699ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1700f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_link_quality_dump(int level, struct frame *frm) 1701f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1702f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_link_quality_rp *rp = frm->ptr; 1703f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1704f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1705f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d lq %d\n", 1706120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->link_quality); 1707f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1708f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1709f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1710f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1711f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1712f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1713f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1714f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_rssi_dump(int level, struct frame *frm) 1715f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1716f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_rssi_rp *rp = frm->ptr; 1717f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1718f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1719f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d rssi %d\n", 1720120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->rssi); 1721f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1722f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1723f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1724f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1725f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1726f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1727f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1728f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_afh_map_dump(int level, struct frame *frm) 1729f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1730f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_afh_map_rp *rp = frm->ptr; 1731f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann int i; 1732f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1733f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1734f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d mode %d\n", 1735120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->mode); 1736f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1737f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1738f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1739f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1740f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } else { 1741f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1742f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("AFH map: 0x"); 1743f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann for (i = 0; i < 10; i++) 1744f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("%2.2x", rp->map[i]); 1745f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("\n"); 1746f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1747f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1748f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1749f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_clock_dump(int level, struct frame *frm) 1750f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1751f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_rp *rp = frm->ptr; 1752f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1753f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1754f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n", 1755120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), 1756120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohl(rp->clock), btohs(rp->accuracy)); 1757f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1758f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1759f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1760f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1761f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1762f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1763f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1764d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm) 1765d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1766d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_cmd_complete *evt = frm->ptr; 1767d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(evt->opcode); 1768d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 1769d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 1770d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 17717b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR)) 17727b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 17737b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 1774d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1775d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n", 1776120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann opcode2str(opcode), ogf, ocf, evt->ncmd); 1777d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1778d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->ptr += EVT_CMD_COMPLETE_SIZE; 1779d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->len -= EVT_CMD_COMPLETE_SIZE; 1780d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 17814f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 17824f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann raw_dump(level, frm); 17834f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann return; 17844f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann } 17854f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann 1786d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ogf) { 1787ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_CTL: 1788ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 178917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_INQUIRY_CANCEL: 179017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_PERIODIC_INQUIRY: 179117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_EXIT_PERIODIC_INQUIRY: 1792d51f2017d006ab5e9ec6f187142ae2ae1cffff8eMarcel Holtmann case OCF_READ_REMOTE_EXT_FEATURES: 179317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann status_response_dump(level, frm); 179417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 179590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_CREATE_CONN_CANCEL: 179690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REMOTE_NAME_REQ_CANCEL: 1797ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_REPLY: 1798ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_REPLY: 1799ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_NEG_REPLY: 1800ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_NEG_REPLY: 1801ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_response_dump(level, frm); 1802ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1803ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 180417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1805ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1806ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_POLICY: 1807ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 1808ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_LINK_POLICY: 1809d5262a5f39508334f5f54a91702b064b4f7bb134Marcel Holtmann case OCF_SNIFF_SUBRATE: 1810ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_response_dump(level, frm); 1811ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1812ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 181317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1814ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1815d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_HOST_CTL: 1816d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 181744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_PIN_TYPE: 181844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_pin_type_dump(level, frm); 181944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 182044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_STORED_LINK_KEY: 182144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_dump(level, frm); 182244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 182344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_STORED_LINK_KEY: 182444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_stored_link_key_dump(level, frm); 182544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 182644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_DELETE_STORED_LINK_KEY: 182744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann delete_stored_link_key_dump(level, frm); 182844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 1829d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_NAME: 1830ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_name_dump(level, frm); 1831ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1832ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_CLASS_OF_DEV: 1833ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_class_of_dev_dump(level, frm); 1834ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1835ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_VOICE_SETTING: 1836ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_voice_setting_dump(level, frm); 1837ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1838fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_READ_CURRENT_IAC_LAP: 1839fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann read_current_iac_lap_dump(level, frm); 1840fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann return; 184169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_SCAN_ENABLE: 184269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_AUTH_ENABLE: 184369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann read_scan_enable_dump(level, frm); 184469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann return; 1845097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_READ_CONN_ACCEPT_TIMEOUT: 1846d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_PAGE_TIMEOUT: 1847d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_timeout_dump(level, frm); 1848d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1849d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_PAGE_ACTIVITY: 1850d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_INQ_ACTIVITY: 1851d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_activity_dump(level, frm); 1852d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1853a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_READ_INQUIRY_SCAN_TYPE: 1854a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann read_inquiry_scan_type_dump(level, frm); 1855a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann return; 185669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_ENCRYPT_MODE: 1857f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_READ_INQUIRY_MODE: 1858f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_READ_AFH_MODE: 1859f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann read_inquiry_mode_dump(level, frm); 1860f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann return; 18616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_LINK_SUPERVISION_TIMEOUT: 18626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_link_supervision_timeout_dump(level, frm); 18636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 18646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_TRANSMIT_POWER_LEVEL: 18656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_dump(level, frm); 18666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 18671a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_READ_EXT_INQUIRY_RESPONSE: 18681a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann read_ext_inquiry_response_dump(level, frm); 18691a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann return; 187044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_FLUSH: 18716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_WRITE_LINK_SUPERVISION_TIMEOUT: 18726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann generic_response_dump(level, frm); 18736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 187444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_RESET: 187544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_MASK: 187644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_FLT: 187744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_PIN_TYPE: 187844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_CREATE_NEW_UNIT_KEY: 18791577526370e596583b15d68940c24e975e62a502Marcel Holtmann case OCF_CHANGE_LOCAL_NAME: 1880f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_CLASS_OF_DEV: 1881f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_VOICE_SETTING: 1882fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_CURRENT_IAC_LAP: 188369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_SCAN_ENABLE: 188469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_AUTH_ENABLE: 188569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_ENCRYPT_MODE: 1886097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_WRITE_CONN_ACCEPT_TIMEOUT: 1887d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_TIMEOUT: 1888d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_ACTIVITY: 1889d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_INQ_ACTIVITY: 1890a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_WRITE_INQUIRY_SCAN_TYPE: 1891fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_INQUIRY_MODE: 1892fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_AFH_MODE: 1893d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_SET_AFH_CLASSIFICATION: 18941a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_WRITE_EXT_INQUIRY_RESPONSE: 18958583de68ea3be3ada739dcc84d811fc752d45a03Marcel Holtmann case OCF_SET_CONTROLLER_TO_HOST_FC: 18962315ac9e430b8cd8c42777e6ec7b4bb10870458bMarcel Holtmann case OCF_HOST_BUFFER_SIZE: 1897d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann status_response_dump(level, frm); 1898ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1899d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 190017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1902d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_INFO_PARAM: 1903d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 1904d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_VERSION: 1905ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_version_dump(level, frm); 1906ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 190717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_COMMANDS: 190817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_commands_dump(level, frm); 190917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1910d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_FEATURES: 1911ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_features_dump(level, frm); 1912ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 191317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_EXT_FEATURES: 191417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_dump(level, frm); 191517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1916d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_BUFFER_SIZE: 1917ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_buffer_size_dump(level, frm); 1918ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1919d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_BD_ADDR: 1920ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_response_dump(level, frm); 1921ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1922d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 192317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1924d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1925d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_STATUS_PARAM: 1926d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 1927d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_FAILED_CONTACT_COUNTER: 1928d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_RESET_FAILED_CONTACT_COUNTER: 1929f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann status_response_dump(level, frm); 1930f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1931d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LINK_QUALITY: 1932f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_link_quality_dump(level, frm); 1933f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1934d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_RSSI: 1935f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_rssi_dump(level, frm); 1936f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1937d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_AFH_MAP: 1938f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_afh_map_dump(level, frm); 1939f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1940d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_CLOCK: 1941f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_dump(level, frm); 1942ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1943d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 194417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1945d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1946ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1947ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 1948d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1949d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1950d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm) 1951d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1952d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_cmd_status *evt = frm->ptr; 1953d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(evt->opcode); 19547b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 19557b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 19567b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 19577b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR)) 19587b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 1959d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1960d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1961d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n", 19627b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann opcode2str(opcode), ogf, ocf, evt->status, evt->ncmd); 1963d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1964d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1965d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1966d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1967d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1968d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1969d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1970afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void hardware_error_dump(int level, struct frame *frm) 1971afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{ 1972afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann evt_hardware_error *evt = frm->ptr; 1973afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1974afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann p_indent(level, frm); 1975afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann printf("code %d\n", evt->code); 1976afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann} 1977afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1978d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm) 1979d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1980d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t num = get_u8(frm); 1981b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann char addr[18]; 1982d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 1983d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1984d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann for (i = 0; i < num; i++) { 1985d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inquiry_info *info = frm->ptr; 1986d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1987bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 1988d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1989d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 199072e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n", 199172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 199272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0]); 1993d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1994d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->ptr += INQUIRY_INFO_SIZE; 1995d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->len -= INQUIRY_INFO_SIZE; 1996d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1997d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1998d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1999d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm) 2000d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2001d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_conn_complete *evt = frm->ptr; 2002d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18]; 2003d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2004bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2005d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2006d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2007d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n", 2008120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), addr, 2009120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode); 2010d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2011d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 2012d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2013d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2014d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2015d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2016d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2017d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm) 2018d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2019d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_conn_request *evt = frm->ptr; 2020d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18]; 2021d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2022bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2023d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2024d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2025d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n", 2026120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann addr, evt->dev_class[2], evt->dev_class[1], 2027120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO"); 2028d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2029d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2030d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm) 2031d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2032d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_disconn_complete *evt = frm->ptr; 2033d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2034d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2035d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d reason 0x%2.2x\n", 2036120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->reason); 2037d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2038d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 2039d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2040d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2041d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } else if (evt->reason > 0) { 2042d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2043d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Reason: %s\n", status2str(evt->reason)); 2044d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2045d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2046d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2047d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm) 2048d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2049d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_remote_name_req_complete *evt = frm->ptr; 2050d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18], name[249]; 2051d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 2052d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2053bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2054d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2055d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann memset(name, 0, sizeof(name)); 2056d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann for (i = 0; i < 248 && evt->name[i]; i++) 2057d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (isprint(evt->name[i])) 2058d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann name[i] = evt->name[i]; 2059d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann else 2060d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann name[i] = '.'; 2061d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2062d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2063d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name); 2064d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2065d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 2066d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2067d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2068d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2069d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2070d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 207117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_complete_dump(int level, struct frame *frm) 207217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 207317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt_master_link_key_complete *evt = frm->ptr; 207417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 207517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 207617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x handle %d flag %d\n", 2077120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->key_flag); 207817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 207917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (evt->status > 0) { 208017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 208117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 208217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 208317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 208417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 2085d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm) 2086d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2087d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_encrypt_change *evt = frm->ptr; 2088d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2089d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2090d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n", 2091120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->encrypt); 2092d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2093d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 2094d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2095d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2096d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2097d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2098d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2099ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm) 2100ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2101ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_remote_features_complete *evt = frm->ptr; 2102ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 2103ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2104ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2105ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2106ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2107ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2108ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2109ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2110ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2111ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2112ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Features:"); 2113ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 8; i++) 2114ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf(" 0x%2.2x", evt->features[i]); 2115ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 2116ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2117ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2119ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm) 2120ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2121ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_remote_version_complete *evt = frm->ptr; 2122ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t manufacturer = btohs(evt->manufacturer); 2123ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2124ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2125ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2126ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2127ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2130ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n", 2133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann lmp_vertostr(evt->lmp_ver), evt->lmp_ver, 2134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(evt->lmp_subver)); 2135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Manufacturer: %s (%d)\n", 2137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bt_compidtostr(manufacturer), manufacturer); 2138ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2139ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2140ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 214111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void qos_setup_complete_dump(int level, struct frame *frm) 214211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 214311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_qos_setup_complete *evt = frm->ptr; 214411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 214511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 214611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("status 0x%2.2x handle %d flags %d\n", 2147120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->flags); 214811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 214911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann if (evt->status > 0) { 215011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 215111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Error: %s\n", status2str(evt->status)); 215211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann } else { 215311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 215411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Service type: %d\n", evt->qos.service_type); 215511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 215611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Token rate: %d\n", btohl(evt->qos.token_rate)); 215711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 215811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); 215911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 216011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Latency: %d\n", btohl(evt->qos.latency)); 216111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 216211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); 216311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann } 216411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 216511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 2166ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm) 2167ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2168ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_role_change *evt = frm->ptr; 2169ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2170ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2171ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2172bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2173ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n", 2174120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, addr, evt->role); 2175ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2176ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2177ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2178ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2179ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2180ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2181ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Role: %s\n", role2str(evt->role)); 2182ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2183ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2184ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2185ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm) 2186ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2187ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_mode_change *evt = frm->ptr; 2188ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2189ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2190ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n", 2191ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval)); 2192ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2193ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2194ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2195ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2196ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2197ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2198ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Mode: %s\n", mode2str(evt->mode)); 2199ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2200ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2201ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2202ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm) 2203ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2204ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_pin_code_req *evt = frm->ptr; 2205ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2206ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2207ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2208bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2209ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s\n", addr); 2210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2211ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2212ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm) 2213ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2214ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_link_key_notify *evt = frm->ptr; 2215ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2216ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 2217ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2218ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2219bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 222044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s key ", addr); 2221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 16; i++) 2222a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann if (parser.flags & DUMP_NOVENDOR) 2223a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("**"); 2224a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann else 2225a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("%2.2X", evt->link_key[i]); 222644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf(" type %d\n", evt->key_type); 2227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 222911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void max_slots_change_dump(int level, struct frame *frm) 223011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 223111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_max_slots_change *evt = frm->ptr; 223211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 223311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 223411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots); 223511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 223611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 2237c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmannstatic inline void data_buffer_overflow_dump(int level, struct frame *frm) 2238c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann{ 2239c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann evt_data_buffer_overflow *evt = frm->ptr; 2240c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann 2241c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann p_indent(level, frm); 2242c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO"); 2243c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann} 2244c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann 2245ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm) 2246ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2247ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_clock_offset_complete *evt = frm->ptr; 2248ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2249ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2250ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n", 2251ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, btohs(evt->handle), btohs(evt->clock_offset)); 2252ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2253ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2254ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2255ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2256ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2257ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2258ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2259ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm) 2260ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2261ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_conn_ptype_changed *evt = frm->ptr; 2262ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t ptype = btohs(evt->ptype); 2263ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char *str; 2264ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2265ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2266ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d ptype 0x%4.4x\n", 2267120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), ptype); 2268ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2269ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2270ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2271ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2272ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2273ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_ptypetostr(ptype); 2274ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 2275ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2276ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Packet type: %s\n", str); 2277ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 2278ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2279ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2280ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2281ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 228211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void pscan_rep_mode_change_dump(int level, struct frame *frm) 228311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 228411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_pscan_rep_mode_change *evt = frm->ptr; 228511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann char addr[18]; 228611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 228711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 2288bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 228911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode); 229011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 2291ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2292f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmannstatic inline void flow_spec_complete_dump(int level, struct frame *frm) 2293f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann{ 2294f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann evt_flow_spec_complete *evt = frm->ptr; 2295f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2296f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2297f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("status 0x%2.2x handle %d flags %d %s\n", 2298120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->flags, 2299120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->direction == 0 ? "outgoing" : "incoming"); 2300f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2301f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann if (evt->status > 0) { 2302f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2303f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2304f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann } else { 2305f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2306f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Service type: %d\n", evt->qos.service_type); 2307f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2308f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Token rate: %d\n", btohl(evt->qos.token_rate)); 2309f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2310f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); 2311f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2312f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Latency: %d\n", btohl(evt->qos.latency)); 2313f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2314f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); 2315f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann } 2316f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann} 2317f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm) 2319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2320d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t num = get_u8(frm); 2321b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann char addr[18]; 2322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 2323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2324ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann if (!num) 2325ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann return; 2326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2327ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) { 2328ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann for (i = 0; i < num; i++) { 2329ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr; 2330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2331ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann p_indent(level, frm); 2332d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2333bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 2334ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2335ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 2336ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 2337ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2338ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; 2339ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; 2340ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } 2341ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } else { 2342ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann for (i = 0; i < num; i++) { 2343ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann inquiry_info_with_rssi *info = frm->ptr; 2344ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2345ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann p_indent(level, frm); 2346ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2347bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 2348ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2349ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 2350ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 2351ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2352ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE; 2353ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE; 2354ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } 2355d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2356d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2357d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 235817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_complete_dump(int level, struct frame *frm) 235917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 236017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt_read_remote_ext_features_complete *evt = frm->ptr; 236117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i; 236217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 236317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 236417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x handle %d page %d max %d\n", 2365120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), 2366120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->page_num, evt->max_page_num); 236717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 236817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (evt->status > 0) { 236917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 237017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 237117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 237217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 237317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Features:"); 237417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 8; i++) 237517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" 0x%2.2x", evt->features[i]); 237617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 237717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 237817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 237917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 2380d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_complete_dump(int level, struct frame *frm) 2381d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 2382d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt_sync_conn_complete *evt = frm->ptr; 2383d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann char addr[18]; 2384d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2385bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2386d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2387d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2388d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("status 0x%2.2x handle %d bdaddr %s type %s\n", 2389120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), addr, 2390120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->link_type == 0 ? "SCO" : "eSCO"); 2391d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2392d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann if (evt->status > 0) { 2393d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2394d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2395d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } else { 2396d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2397d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Air mode: %s\n", airmode2str(evt->air_mode)); 2398d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 2399d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 2400d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2401d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_changed_dump(int level, struct frame *frm) 2402d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 2403d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt_sync_conn_changed *evt = frm->ptr; 2404d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2405d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2406120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2407d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2408d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann if (evt->status > 0) { 2409d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2410d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2411d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 2412d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 2413d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2414120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmannstatic inline void sniff_subrate_event_dump(int level, struct frame *frm) 2415120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann{ 2416120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt_sniff_subrate *evt = frm->ptr; 2417120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2418120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2419120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2420120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2421120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann if (evt->status > 0) { 2422120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2423120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2424120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann } else { 2425120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2426f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann printf("max latency transmit %d receive %d\n", 2427f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann btohs(evt->max_tx_latency), 2428f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann btohs(evt->max_rx_latency)); 2429120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2430120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2431120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("min timeout remote %d local %d\n", 2432120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(evt->min_remote_timeout), 2433120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(evt->min_local_timeout)); 2434120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann } 2435120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann} 2436120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2437807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmannstatic inline void extended_inq_result_dump(int level, struct frame *frm) 2438807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann{ 2439807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann uint8_t num = get_u8(frm); 2440807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann char addr[18]; 2441807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann int i; 2442807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2443807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann for (i = 0; i < num; i++) { 2444807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann extended_inquiry_info *info = frm->ptr; 2445807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2446bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 2447807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2448807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann p_indent(level, frm); 244927eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2450807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 245127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 245227eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann 245327eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE; 245427eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE; 245527eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann 2456e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann ext_inquiry_response_dump(level, frm); 2457807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann } 2458807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann} 2459807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 246059a173312fca00f7a01abca0c60713334f48d7c9Marcel Holtmannstatic inline void link_supervision_timeout_change_dump(int level, struct frame *frm) 2461d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann{ 246259a173312fca00f7a01abca0c60713334f48d7c9Marcel Holtmann evt_link_supervision_timeout_change *evt = frm->ptr; 2463d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann 2464d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann p_indent(level, frm); 2465d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann printf("handle %d timeout %d\n", 2466d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann btohs(evt->handle), btohs(evt->timeout)); 2467d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann} 2468d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann 246965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm) 247095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2471174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky hci_event_hdr *hdr = frm->ptr; 2472be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann uint8_t event = hdr->evt; 247365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 247465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (p_filter(FILT_HCI)) 247565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky return; 247665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2477d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (event <= EVENT_NUM) { 24787b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 2479803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: %s (0x%2.2x) plen %d\n", 24807b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann event_str[hdr->evt], hdr->evt, hdr->plen); 2481be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } else if (hdr->evt == EVT_TESTING) { 24827b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 2483803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); 2484be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } else if (hdr->evt == EVT_VENDOR) { 2485a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann uint16_t manufacturer; 2486a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann 24877b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (parser.flags & DUMP_NOVENDOR) 24887b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 24897b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 24907b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 2491803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); 24927b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 2493a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann manufacturer = get_manufacturer(); 2494a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann 2495a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann switch (manufacturer) { 2496a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann case 0: 2497e1e8e8d65fe211c133b53cf8af8883caf7936314Marcel Holtmann case 37: 2498a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann case 48: 2499a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann frm->ptr += HCI_EVENT_HDR_SIZE; 2500a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann frm->len -= HCI_EVENT_HDR_SIZE; 2501a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann ericsson_dump(level + 1, frm); 2502a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann return; 2503a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann case 10: 2504be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann frm->ptr += HCI_EVENT_HDR_SIZE; 2505be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann frm->len -= HCI_EVENT_HDR_SIZE; 2506be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann csr_dump(level + 1, frm); 2507be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann return; 2508be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 25097b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann } else { 25107b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 251166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen); 25127b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann } 251365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 251465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->ptr += HCI_EVENT_HDR_SIZE; 251565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->len -= HCI_EVENT_HDR_SIZE; 251665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2517be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (event == EVT_CMD_COMPLETE) { 2518be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann evt_cmd_complete *cc = frm->ptr; 2519be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) { 2520be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE; 2521be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann manufacturer = rp->manufacturer; 2522be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 2523be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 2524be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 252525554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann if (event == EVT_DISCONN_COMPLETE) { 252625554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann evt_disconn_complete *evt = frm->ptr; 252725554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann l2cap_clear(btohs(evt->handle)); 252825554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann } 252925554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann 2530d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 2531d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 2532d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return; 2533d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2534d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2535d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (event) { 2536ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann case EVT_LOOPBACK_COMMAND: 2537ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann command_dump(level + 1, frm); 2538ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 2539d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CMD_COMPLETE: 2540d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd_complete_dump(level + 1, frm); 2541d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2542d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CMD_STATUS: 2543d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd_status_dump(level + 1, frm); 2544d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2545afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann case EVT_HARDWARE_ERROR: 2546afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann hardware_error_dump(level + 1, frm); 2547afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann break; 2548afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann case EVT_FLUSH_OCCURRED: 2549f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann case EVT_QOS_VIOLATION: 2550afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann handle_response_dump(level + 1, frm); 2551afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann break; 2552d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_COMPLETE: 2553d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann status_response_dump(level + 1, frm); 2554d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2555d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_RESULT: 2556d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inq_result_dump(level + 1, frm); 2557d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2558d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CONN_COMPLETE: 2559d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann conn_complete_dump(level + 1, frm); 2560d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2561d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CONN_REQUEST: 2562d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann conn_request_dump(level + 1, frm); 2563d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2564d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_DISCONN_COMPLETE: 2565d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann disconn_complete_dump(level + 1, frm); 2566d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2567d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_AUTH_COMPLETE: 2568d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CHANGE_CONN_LINK_KEY_COMPLETE: 2569d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann generic_response_dump(level + 1, frm); 2570d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 257117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case EVT_MASTER_LINK_KEY_COMPLETE: 257217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_complete_dump(level + 1, frm); 257317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 2574d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_REMOTE_NAME_REQ_COMPLETE: 2575d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann remote_name_req_complete_dump(level + 1, frm); 2576d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2577d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_ENCRYPT_CHANGE: 2578d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann encrypt_change_dump(level + 1, frm); 2579d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_REMOTE_FEATURES_COMPLETE: 2581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_remote_features_complete_dump(level + 1, frm); 2582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_REMOTE_VERSION_COMPLETE: 2584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_remote_version_complete_dump(level + 1, frm); 2585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_QOS_SETUP_COMPLETE: 258711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann qos_setup_complete_dump(level + 1, frm); 2588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_ROLE_CHANGE: 2590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann role_change_dump(level + 1, frm); 2591ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_NUM_COMP_PKTS: 2593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann num_comp_pkts_dump(level + 1, frm); 2594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_MODE_CHANGE: 2596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann mode_change_dump(level + 1, frm); 2597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2598b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann case EVT_RETURN_LINK_KEYS: 2599b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann return_link_keys_dump(level + 1, frm); 2600b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann break; 2601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_PIN_CODE_REQ: 2602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_LINK_KEY_REQ: 2603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_req_dump(level + 1, frm); 2604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_LINK_KEY_NOTIFY: 2606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_notify_dump(level + 1, frm); 2607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2608c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann case EVT_DATA_BUFFER_OVERFLOW: 2609c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann data_buffer_overflow_dump(level + 1, frm); 2610c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann break; 261111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann case EVT_MAX_SLOTS_CHANGE: 261211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann max_slots_change_dump(level + 1, frm); 261311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann break; 2614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_CLOCK_OFFSET_COMPLETE: 2615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_clock_offset_complete_dump(level + 1, frm); 2616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_CONN_PTYPE_CHANGED: 2618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann conn_ptype_changed_dump(level + 1, frm); 2619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 262011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann case EVT_PSCAN_REP_MODE_CHANGE: 262111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann pscan_rep_mode_change_dump(level + 1, frm); 262211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann break; 2623f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann case EVT_FLOW_SPEC_COMPLETE: 2624f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann flow_spec_complete_dump(level + 1, frm); 2625f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann break; 2626d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_RESULT_WITH_RSSI: 2627d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inq_result_with_rssi_dump(level + 1, frm); 2628d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 262917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE: 263017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_complete_dump(level + 1, frm); 263117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 2632d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case EVT_SYNC_CONN_COMPLETE: 2633d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann sync_conn_complete_dump(level + 1, frm); 2634d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann break; 2635d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case EVT_SYNC_CONN_CHANGED: 2636d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann sync_conn_changed_dump(level + 1, frm); 2637d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann break; 2638120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann case EVT_SNIFF_SUBRATE: 2639120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann sniff_subrate_event_dump(level + 1, frm); 2640120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann break; 2641807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann case EVT_EXTENDED_INQUIRY_RESULT: 2642807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann extended_inq_result_dump(level + 1, frm); 2643807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann break; 264459a173312fca00f7a01abca0c60713334f48d7c9Marcel Holtmann case EVT_LINK_SUPERVISION_TIMEOUT_CHANGE: 264559a173312fca00f7a01abca0c60713334f48d7c9Marcel Holtmann link_supervision_timeout_change_dump(level + 1, frm); 2646d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann break; 2647d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann default: 2648d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 2649d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2650d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 265195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 265295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 265365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm) 265495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2655174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky hci_acl_hdr *hdr = (void *) frm->ptr; 26560d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t handle = btohs(hdr->handle); 26570d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t dlen = btohs(hdr->dlen); 26580d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t flags = acl_flags(handle); 265965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 266065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (!p_filter(FILT_HCI)) { 2661ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2662d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("ACL data: handle %d flags 0x%2.2x dlen %d\n", 266365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky acl_handle(handle), flags, dlen); 266465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky level++; 266565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky } 2666e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 2667e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann frm->ptr += HCI_ACL_HDR_SIZE; 2668e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann frm->len -= HCI_ACL_HDR_SIZE; 2669f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky frm->flags = flags; 2670f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky frm->handle = acl_handle(handle); 267165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 267265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (parser.filter & ~FILT_HCI) 267365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky l2cap_dump(level, frm); 267465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky else 267565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 267695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 267795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2678d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm) 2679d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{ 2680d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky hci_sco_hdr *hdr = (void *) frm->ptr; 26810d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t handle = btohs(hdr->handle); 26826d3f2066a10cd7d0812fdf97635f1bd77f003493Marcel Holtmann int len; 2683d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 26849e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann if (frm->audio_fd > fileno(stderr)) 26856d3f2066a10cd7d0812fdf97635f1bd77f003493Marcel Holtmann len = write(frm->audio_fd, frm->ptr + HCI_SCO_HDR_SIZE, hdr->dlen); 26860033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann 2687d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky if (!p_filter(FILT_SCO)) { 2688ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2689d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("SCO data: handle %d dlen %d\n", 2690120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann acl_handle(handle), hdr->dlen); 2691d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky level++; 2692d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 2693d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky frm->ptr += HCI_SCO_HDR_SIZE; 2694d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky frm->len -= HCI_SCO_HDR_SIZE; 2695d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky raw_dump(level, frm); 2696d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky } 2697d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky} 2698d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 2699b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm) 2700b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{ 2701b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann if (p_filter(FILT_HCI)) 2702b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann return; 2703b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann 270438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann if (frm->dev_id == HCI_DEV_NONE) { 2705a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann uint16_t device = btohs(htons(get_u16(frm))); 2706ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann uint16_t proto = btohs(htons(get_u16(frm))); 270738acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann uint16_t type = btohs(htons(get_u16(frm))); 270838acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann uint16_t plen = btohs(htons(get_u16(frm))); 270938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 271038acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann p_indent(level, frm); 271138acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 2712ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann printf("System %s: device hci%d proto 0x%2.2x type 0x%2.2x plen %d\n", 2713ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann frm->in ? "event" : "command", device, proto, type, plen); 271438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 271538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann raw_dump(level, frm); 271638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann return; 271738acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann } 271838acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 27197b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (parser.flags & DUMP_NOVENDOR) 27207b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 27217b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 2722b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann if (get_manufacturer() == 12) { 2723b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann bpa_dump(level, frm); 2724b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann return; 2725b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann } 2726b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann 2727b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann p_indent(level, frm); 2728b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann printf("Vendor data: len %d\n", frm->len); 2729b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann raw_dump(level, frm); 2730b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann} 2731b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann 2732174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm) 273395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2734d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t type = *(uint8_t *)frm->ptr; 273595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2736174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky frm->ptr++; frm->len--; 2737e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 273895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky switch (type) { 273995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_COMMAND_PKT: 274065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky command_dump(level, frm); 274195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 274295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 274395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_EVENT_PKT: 274465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky event_dump(level, frm); 274595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 274695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 274795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_ACLDATA_PKT: 274865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky acl_dump(level, frm); 274995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 275095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2751d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky case HCI_SCODATA_PKT: 2752d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky sco_dump(level, frm); 2753d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky break; 2754e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 2755b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann case HCI_VENDOR_PKT: 2756b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann vendor_dump(level, frm); 2757b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann break; 2758b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann 275995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky default: 276065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (p_filter(FILT_HCI)) 276165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky break; 276265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2763ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2764174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky printf("Unknown: type 0x%2.2x len %d\n", type, frm->len); 276565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 276695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 276795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky } 276895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 2769