hci.c revision d6821ff2b800acae15702935d84a0b3cbbf04c6c
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 9676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void write_link_supervision_timeout_dump(int level, struct frame *frm) 9686eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 9696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann write_link_supervision_timeout_cp *cp = frm->ptr; 9706eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 9716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 9726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("handle %d timeout %d\n", 973d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann btohs(cp->handle), btohs(cp->timeout)); 9746eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 9756eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 9761a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void write_ext_inquiry_response_dump(int level, struct frame *frm) 9771a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{ 9781a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann write_ext_inquiry_response_cp *cp = frm->ptr; 9791a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 9801a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 9811a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("fec 0x%2.2x\n", cp->fec); 982f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann 983f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->ptr++; 984f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->len--; 985f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann 986e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann ext_inquiry_response_dump(level, frm); 9871a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann} 9881a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 9896eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void request_transmit_power_level_dump(int level, struct frame *frm) 9906eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 9916eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_cp *cp = frm->ptr; 9926eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 9936eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 9946eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("handle %d type %d (%s)\n", 995120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(cp->handle), cp->type, 996120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann cp->type ? "maximum" : "current"); 9976eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 9986eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 99917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void request_local_ext_features_dump(int level, struct frame *frm) 100017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 100117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_cp *cp = frm->ptr; 100217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 100317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 100417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("page %d\n", cp->page_num); 100517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 100617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1007f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void request_clock_dump(int level, struct frame *frm) 1008f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1009f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_cp *cp = frm->ptr; 1010f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1011f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1012f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("handle %d which %d (%s)\n", 1013120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(cp->handle), cp->which_clock, 1014120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann cp->which_clock ? "piconet" : "local"); 1015f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1016f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1017d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm) 1018d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1019d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann hci_command_hdr *hdr = frm->ptr; 1020d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(hdr->opcode); 1021d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 1022d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 1023d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1024d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (p_filter(FILT_HCI)) 1025d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return; 1026d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 10277b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR)) 10287b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 102965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 10307b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 1031803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n", 1032120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann opcode2str(opcode), ogf, ocf, hdr->plen); 103365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 103465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->ptr += HCI_COMMAND_HDR_SIZE; 103565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->len -= HCI_COMMAND_HDR_SIZE; 103665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 10377b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD) { 10387b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ocf == 0 && get_manufacturer() == 10) { 10397b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann csr_dump(level + 1, frm); 10407b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 10417b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann } 1042be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 1043be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 10444f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 10454f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann raw_dump(level, frm); 10464f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann return; 10474f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann } 10484f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann 1049ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ogf) { 1050ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_CTL: 1051ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 1052ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_INQUIRY: 1053ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann inquiry_dump(level + 1, frm); 1054ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PERIODIC_INQUIRY: 1056ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann periodic_inquiry_dump(level + 1, frm); 1057ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1058ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_INQUIRY_CANCEL: 1059ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_PERIODIC_INQUIRY: 1060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CREATE_CONN: 1062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann create_conn_dump(level + 1, frm); 1063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1064ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_DISCONNECT: 1065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann disconnect_dump(level + 1, frm); 1066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 106790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_CREATE_CONN_CANCEL: 106890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REMOTE_NAME_REQ_CANCEL: 106990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_ACCEPT_SYNC_CONN_REQ: 107090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann bdaddr_command_dump(level + 1, frm); 107190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann return; 1072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ADD_SCO: 1073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SET_CONN_PTYPE: 1074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann add_sco_dump(level + 1, frm); 1075acc2322e0bed89e8ada2564359a1a6d293c9d514Marcel Holtmann return; 1076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ACCEPT_CONN_REQ: 1077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_dump(level + 1, frm); 1078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_REJECT_CONN_REQ: 108090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REJECT_SYNC_CONN_REQ: 1081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann reject_conn_req_dump(level + 1, frm); 1082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_REPLY: 1084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_reply_dump(level + 1, frm); 1085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_REPLY: 1087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_reply_dump(level + 1, frm); 1088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_NEG_REPLY: 1090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_NEG_REPLY: 1091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_neg_reply_dump(level + 1, frm); 1092ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1093ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SET_CONN_ENCRYPT: 1094ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann set_conn_encrypt_dump(level + 1, frm); 1095ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1096ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_AUTH_REQUESTED: 1097ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CHANGE_CONN_LINK_KEY: 1098ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_REMOTE_FEATURES: 1099ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_REMOTE_VERSION: 1100ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_CLOCK_OFFSET: 110190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_READ_LMP_HANDLE: 110290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_SETUP_SYNC_CONN: 1103ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_command_dump(level + 1, frm); 1104ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 110517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_MASTER_LINK_KEY: 110617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_dump(level + 1, frm); 110717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 110817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_REMOTE_EXT_FEATURES: 110917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_dump(level + 1, frm); 111017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1111ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_REMOTE_NAME_REQ: 1112ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann remote_name_req_dump(level + 1, frm); 1113ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1114ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1115ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1116ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1117ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_POLICY: 1118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 11199ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann case OCF_HOLD_MODE: 11209ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann case OCF_PARK_MODE: 11219ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann hold_mode_dump(level + 1, frm); 11229ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann return; 11239ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann case OCF_SNIFF_MODE: 11249ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann sniff_mode_dump(level + 1, frm); 11259ec015999c457ba1ff49925708d5c93d4b0c2c20Marcel Holtmann return; 1126ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_SNIFF_MODE: 1127ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_PARK_MODE: 1128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ROLE_DISCOVERY: 1129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_LINK_POLICY: 1130ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_command_dump(level + 1, frm); 1131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SWITCH_ROLE: 1133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_dump(level + 1, frm); 1134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_LINK_POLICY: 1136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_link_policy_dump(level + 1, frm); 1137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1138120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann case OCF_SNIFF_SUBRATE: 1139120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann sniff_subrate_dump(level + 1, frm); 1140120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann return; 1141ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1142ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1143ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1144ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_HOST_CTL: 1145ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 114644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_RESET: 114744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_CREATE_NEW_UNIT_KEY: 114844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 114944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_MASK: 115044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_mask_dump(level + 1, frm); 115144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 115244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_FLT: 115344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_flt_dump(level + 1, frm); 115444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 115544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_PIN_TYPE: 115644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_pin_type_dump(level + 1, frm); 115744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 115844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_STORED_LINK_KEY: 115944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_DELETE_STORED_LINK_KEY: 116044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann request_stored_link_key_dump(level + 1, frm); 116144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 116244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_STORED_LINK_KEY: 116344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return_link_keys_dump(level + 1, frm); 116444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 1165ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CHANGE_LOCAL_NAME: 1166ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann change_local_name_dump(level + 1, frm); 1167ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1168ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_CLASS_OF_DEV: 1169ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_class_of_dev_dump(level + 1, frm); 1170ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1171ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_VOICE_SETTING: 1172ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_voice_setting_dump(level + 1, frm); 1173ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1174fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_CURRENT_IAC_LAP: 1175fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann write_current_iac_lap_dump(level + 1, frm); 1176fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann return; 117769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_SCAN_ENABLE: 117869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_AUTH_ENABLE: 117969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann write_scan_enable_dump(level + 1, frm); 118069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann return; 1181097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_WRITE_CONN_ACCEPT_TIMEOUT: 1182d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_TIMEOUT: 1183d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_timeout_dump(level + 1, frm); 1184d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1185d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_ACTIVITY: 1186d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_INQ_ACTIVITY: 1187d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_activity_dump(level + 1, frm); 1188d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1189a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_WRITE_INQUIRY_SCAN_TYPE: 1190a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann write_inquiry_scan_type_dump(level + 1, frm); 1191a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann return; 119269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_ENCRYPT_MODE: 1193f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_INQUIRY_MODE: 1194f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_AFH_MODE: 1195f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann write_inquiry_mode_dump(level + 1, frm); 1196f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann return; 11976eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_TRANSMIT_POWER_LEVEL: 11986eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann request_transmit_power_level_dump(level + 1, frm); 11996eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 120044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_FLUSH: 12016eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_LINK_SUPERVISION_TIMEOUT: 12026eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann generic_command_dump(level + 1, frm); 12036eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 12046eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_WRITE_LINK_SUPERVISION_TIMEOUT: 12056eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann write_link_supervision_timeout_dump(level + 1, frm); 12066eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 12071a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_WRITE_EXT_INQUIRY_RESPONSE: 12081a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann write_ext_inquiry_response_dump(level + 1, frm); 12091a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann return; 1210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1211ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 121217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 121317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OGF_INFO_PARAM: 121417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann switch (ocf) { 121517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_EXT_FEATURES: 121617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann request_local_ext_features_dump(level + 1, frm); 121717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 121817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 1219ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1220f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1221f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OGF_STATUS_PARAM: 1222f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann switch (ocf) { 1223f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_LINK_QUALITY: 1224f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_RSSI: 1225f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_AFH_MAP: 1226f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann generic_command_dump(level + 1, frm); 1227f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1228f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_CLOCK: 1229f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann request_clock_dump(level + 1, frm); 1230f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1231f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1232f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann break; 1233ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 123565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 123695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 123795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 1238d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm) 1239d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1240d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t status = get_u8(frm); 1241d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1242d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1243d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x\n", status); 1244d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1245d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (status > 0) { 1246d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1247d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(status)); 1248d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1249d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1250d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 1251d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1252d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1253afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void handle_response_dump(int level, struct frame *frm) 1254afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{ 1255afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 1256afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1257afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann p_indent(level, frm); 1258afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann printf("handle %d\n", handle); 1259afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1260afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann raw_dump(level, frm); 1261afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann} 1262afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1263ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm) 1264ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1265ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint8_t status = get_u8(frm); 1266ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_t *bdaddr = frm->ptr; 1267ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 1268ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1269ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann frm->ptr += sizeof(bdaddr_t); 1270ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann frm->len -= sizeof(bdaddr_t); 1271ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1272ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1273bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(bdaddr, addr); 1274ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x bdaddr %s\n", status, addr); 1275ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1276ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (status > 0) { 1277ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1278ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(status)); 1279ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1280ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1281ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 1282ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1283ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1284d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm) 1285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t status = get_u8(frm); 1287d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 1288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d\n", status, handle); 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 130044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_pin_type_dump(int level, struct frame *frm) 130144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 130244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_pin_type_rp *rp = frm->ptr; 130344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 130444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 130544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type); 130644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 130744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 130844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 130944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 131044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 131144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 131244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 131344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_stored_link_key_dump(int level, struct frame *frm) 131444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 131544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_rp *rp = frm->ptr; 131644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 131744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 131844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x max %d num %d\n", 1319120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, rp->max_keys, rp->num_keys); 132044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 132144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 132244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 132344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 132444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 132544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 132644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 132744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_stored_link_key_dump(int level, struct frame *frm) 132844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 132944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_stored_link_key_rp *rp = frm->ptr; 133044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 133144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 133244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys); 133344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 133444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 133544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 133644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 133744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 133844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 133944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 134044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void delete_stored_link_key_dump(int level, struct frame *frm) 134144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 134244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann delete_stored_link_key_rp *rp = frm->ptr; 134344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 134444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 134544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys)); 134644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 134744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 134844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 134944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 135044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 135144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 135244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 1353ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm) 1354ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1355ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_name_rp *rp = frm->ptr; 1356ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char name[249]; 1357ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1358ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1359ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memset(name, 0, sizeof(name)); 1360ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 248 && rp->name[i]; i++) 1361ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (isprint(rp->name[i])) 1362ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = rp->name[i]; 1363ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann else 1364ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = '.'; 1365ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1366ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1367ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x name \'%s\'\n", rp->status, name); 1368ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1369ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1370ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1371ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1372ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1373ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1374ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1375ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm) 1376ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1377ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_class_of_dev_rp *rp = frm->ptr; 1378ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1379ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1380ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status, 1381120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]); 1382ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1383ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1384ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1385ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1386ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1387ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1388ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1389ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm) 1390ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1391ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_voice_setting_rp *rp = frm->ptr; 1392ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1393ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1394ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x voice setting 0x%4.4x\n", 1395120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->voice_setting)); 1396ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1397ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1398ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1399ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1400ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1401ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1402ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1403fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm) 1404fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{ 1405fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann read_current_iac_lap_rp *rp = frm->ptr; 1406fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann int i; 1407fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 1408fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann for (i = 0; i < rp->num_current_iac; i++) { 1409fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann p_indent(level, frm); 1410fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]); 1411fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) { 1412fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann switch (rp->lap[i][0]) { 1413fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x00: 1414fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (Limited Inquiry Access Code)"); 1415fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 1416fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x33: 1417fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (General Inquiry Access Code)"); 1418fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 1419fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1420fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1421fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("\n"); 1422fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1423fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann} 1424fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 142569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void read_scan_enable_dump(int level, struct frame *frm) 142669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{ 142769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t status = get_u8(frm); 142869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t enable = get_u8(frm); 142969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 143069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 143169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("status 0x%2.2x enable %d\n", status, enable); 143269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 143369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann if (status > 0) { 143469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 143569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("Error: %s\n", status2str(status)); 143669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann } 143769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann} 143869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 1439d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_timeout_dump(int level, struct frame *frm) 1440d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 1441d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_timeout_rp *rp = frm->ptr; 1442d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1443d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1444d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout)); 1445d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1446d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann if (rp->status > 0) { 1447d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1448d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1449d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann } 1450d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 1451d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1452d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_activity_dump(int level, struct frame *frm) 1453d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 1454d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_activity_rp *rp = frm->ptr; 1455d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1456d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1457d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("status 0x%2.2x interval %d window %d\n", 1458120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->interval), btohs(rp->window)); 1459d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1460d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann if (rp->status > 0) { 1461d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1462d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1463d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann } 1464d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 1465d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1466a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void read_inquiry_scan_type_dump(int level, struct frame *frm) 1467a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{ 1468a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann read_inquiry_scan_type_rp *rp = frm->ptr; 1469a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 1470a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 1471a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("status 0x%2.2x type %d\n", rp->status, rp->type); 1472a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 1473a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann if (rp->status > 0) { 1474a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 1475a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1476a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann } 1477a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann} 1478a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 14796eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_inquiry_mode_dump(int level, struct frame *frm) 14806eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 14816eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_inquiry_mode_rp *rp = frm->ptr; 14826eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 14836eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 14846eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x mode %d\n", rp->status, rp->mode); 14856eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 14866eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 14876eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 14886eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 14896eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 14906eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 14916eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 14926eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_link_supervision_timeout_dump(int level, struct frame *frm) 14936eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 14946eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_link_supervision_timeout_rp *rp = frm->ptr; 14956eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 14966eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 14976eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x handle %d timeout %d\n", 1498d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann rp->status, btohs(rp->handle), btohs(rp->timeout)); 14996eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15006eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 15016eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15026eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 15036eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 15046eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 15056eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15066eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_transmit_power_level_dump(int level, struct frame *frm) 15076eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 15086eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_rp *rp = frm->ptr; 15096eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15106eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15116eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x handle %d level %d\n", 1512120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->level); 15136eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15146eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 15156eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 15166eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 15176eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 15186eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 15196eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 15201a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void read_ext_inquiry_response_dump(int level, struct frame *frm) 15211a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{ 15221a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann read_ext_inquiry_response_rp *rp = frm->ptr; 15231a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 15241a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 15251a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec); 15261a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 15271a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann if (rp->status > 0) { 15281a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 15291a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1530f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann } else { 1531f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->ptr += 2; 1532f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann frm->len -= 2; 1533f2328fe0a0b690214e3d1df32606a561ec2a9896Marcel Holtmann 1534e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann ext_inquiry_response_dump(level, frm); 15351a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann } 15361a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann} 15371a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 1538ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm) 1539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_version_rp *rp = frm->ptr; 1541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t manufacturer = btohs(rp->manufacturer); 1542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 15511a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n", 1552120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann hci_vertostr(rp->hci_ver), 1553120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->hci_ver, btohs(rp->hci_rev)); 1554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n", 1556120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann lmp_vertostr(rp->lmp_ver), 1557120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->lmp_ver, btohs(rp->lmp_subver)); 1558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Manufacturer: %s (%d)\n", 1560120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann bt_compidtostr(manufacturer), manufacturer); 1561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 156417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_commands_dump(int level, struct frame *frm) 156517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 156617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_commands_rp *rp = frm->ptr; 156717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i, max = 0; 156817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 156917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 157017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 157117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 157217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->status > 0) { 157317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 157417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 157517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 157617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 64; i++) 157717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->commands[i]) 157817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann max = i + 1; 157917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 158017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Commands: "); 158117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < (max > 32 ? 32 : max); i++) 158217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("%2.2x", rp->commands[i]); 158317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 158417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (max > 32) { 158517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 158617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" "); 158717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 32; i < max; i++) 158817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("%2.2x", rp->commands[i]); 158917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 159017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 159117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 159217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 159317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm) 1595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_features_rp *rp = frm->ptr; 1597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Features:"); 1608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 8; i++) 1609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf(" 0x%2.2x", rp->features[i]); 1610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 1611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1613ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 161417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_ext_features_dump(int level, struct frame *frm) 161517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 161617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_rp *rp = frm->ptr; 161717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i; 161817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 161917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 162017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x page %d max %d\n", 162117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann rp->status, rp->page_num, rp->max_page_num); 162217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 162317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->status > 0) { 162417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 162517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 162617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 162717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 162817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Features:"); 162917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 8; i++) 163017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" 0x%2.2x", rp->features[i]); 163117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 163217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 163317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 163417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm) 1636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_buffer_size_rp *rp = frm->ptr; 1638ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1639ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1640ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1641ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1642ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1643ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1644ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("ACL MTU %d:%d SCO MTU %d:%d\n", 1648120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(rp->acl_mtu), btohs(rp->acl_max_pkt), 1649120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->sco_mtu, btohs(rp->sco_max_pkt)); 1650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1653f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_link_quality_dump(int level, struct frame *frm) 1654f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1655f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_link_quality_rp *rp = frm->ptr; 1656f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1657f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1658f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d lq %d\n", 1659120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->link_quality); 1660f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1661f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1662f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1663f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1664f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1665f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1666f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1667f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_rssi_dump(int level, struct frame *frm) 1668f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1669f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_rssi_rp *rp = frm->ptr; 1670f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1671f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1672f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d rssi %d\n", 1673120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->rssi); 1674f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1675f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1676f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1677f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1678f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1679f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1680f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1681f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_afh_map_dump(int level, struct frame *frm) 1682f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1683f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_afh_map_rp *rp = frm->ptr; 1684f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann int i; 1685f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1686f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1687f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d mode %d\n", 1688120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), rp->mode); 1689f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1690f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1691f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1692f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1693f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } else { 1694f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1695f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("AFH map: 0x"); 1696f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann for (i = 0; i < 10; i++) 1697f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("%2.2x", rp->map[i]); 1698f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("\n"); 1699f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1700f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1701f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1702f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_clock_dump(int level, struct frame *frm) 1703f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1704f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_rp *rp = frm->ptr; 1705f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1706f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1707f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n", 1708120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann rp->status, btohs(rp->handle), 1709120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohl(rp->clock), btohs(rp->accuracy)); 1710f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1711f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1712f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1713f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1714f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1715f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1716f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1717d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm) 1718d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1719d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_cmd_complete *evt = frm->ptr; 1720d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(evt->opcode); 1721d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 1722d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 1723d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 17247b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR)) 17257b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 17267b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 1727d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1728d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n", 1729120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann opcode2str(opcode), ogf, ocf, evt->ncmd); 1730d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1731d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->ptr += EVT_CMD_COMPLETE_SIZE; 1732d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->len -= EVT_CMD_COMPLETE_SIZE; 1733d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 17344f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 17354f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann raw_dump(level, frm); 17364f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann return; 17374f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann } 17384f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann 1739d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ogf) { 1740ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_CTL: 1741ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 174217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_INQUIRY_CANCEL: 174317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_PERIODIC_INQUIRY: 174417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_EXIT_PERIODIC_INQUIRY: 1745d51f2017d006ab5e9ec6f187142ae2ae1cffff8eMarcel Holtmann case OCF_READ_REMOTE_EXT_FEATURES: 174617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann status_response_dump(level, frm); 174717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 174890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_CREATE_CONN_CANCEL: 174990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REMOTE_NAME_REQ_CANCEL: 1750ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_REPLY: 1751ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_REPLY: 1752ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_NEG_REPLY: 1753ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_NEG_REPLY: 1754ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_response_dump(level, frm); 1755ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1756ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 175717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1758ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1759ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_POLICY: 1760ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 1761ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_LINK_POLICY: 1762d5262a5f39508334f5f54a91702b064b4f7bb134Marcel Holtmann case OCF_SNIFF_SUBRATE: 1763ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_response_dump(level, frm); 1764ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1765ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 176617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1767ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1768d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_HOST_CTL: 1769d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 177044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_PIN_TYPE: 177144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_pin_type_dump(level, frm); 177244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 177344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_STORED_LINK_KEY: 177444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_dump(level, frm); 177544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 177644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_STORED_LINK_KEY: 177744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_stored_link_key_dump(level, frm); 177844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 177944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_DELETE_STORED_LINK_KEY: 178044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann delete_stored_link_key_dump(level, frm); 178144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 1782d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_NAME: 1783ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_name_dump(level, frm); 1784ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1785ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_CLASS_OF_DEV: 1786ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_class_of_dev_dump(level, frm); 1787ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1788ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_VOICE_SETTING: 1789ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_voice_setting_dump(level, frm); 1790ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1791fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_READ_CURRENT_IAC_LAP: 1792fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann read_current_iac_lap_dump(level, frm); 1793fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann return; 179469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_SCAN_ENABLE: 179569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_AUTH_ENABLE: 179669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann read_scan_enable_dump(level, frm); 179769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann return; 1798097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_READ_CONN_ACCEPT_TIMEOUT: 1799d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_PAGE_TIMEOUT: 1800d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_timeout_dump(level, frm); 1801d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1802d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_PAGE_ACTIVITY: 1803d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_INQ_ACTIVITY: 1804d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_activity_dump(level, frm); 1805d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1806a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_READ_INQUIRY_SCAN_TYPE: 1807a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann read_inquiry_scan_type_dump(level, frm); 1808a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann return; 180969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_ENCRYPT_MODE: 1810f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_READ_INQUIRY_MODE: 1811f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_READ_AFH_MODE: 1812f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann read_inquiry_mode_dump(level, frm); 1813f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann return; 18146eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_LINK_SUPERVISION_TIMEOUT: 18156eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_link_supervision_timeout_dump(level, frm); 18166eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 18176eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_TRANSMIT_POWER_LEVEL: 18186eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_dump(level, frm); 18196eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 18201a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_READ_EXT_INQUIRY_RESPONSE: 18211a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann read_ext_inquiry_response_dump(level, frm); 18221a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann return; 182344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_FLUSH: 18246eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_WRITE_LINK_SUPERVISION_TIMEOUT: 18256eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann generic_response_dump(level, frm); 18266eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 182744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_RESET: 182844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_MASK: 182944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_FLT: 183044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_PIN_TYPE: 183144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_CREATE_NEW_UNIT_KEY: 18321577526370e596583b15d68940c24e975e62a502Marcel Holtmann case OCF_CHANGE_LOCAL_NAME: 1833f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_CLASS_OF_DEV: 1834f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_VOICE_SETTING: 1835fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_CURRENT_IAC_LAP: 183669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_SCAN_ENABLE: 183769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_AUTH_ENABLE: 183869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_ENCRYPT_MODE: 1839097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_WRITE_CONN_ACCEPT_TIMEOUT: 1840d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_TIMEOUT: 1841d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_ACTIVITY: 1842d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_INQ_ACTIVITY: 1843a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_WRITE_INQUIRY_SCAN_TYPE: 1844fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_INQUIRY_MODE: 1845fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_AFH_MODE: 1846d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_SET_AFH_CLASSIFICATION: 18471a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_WRITE_EXT_INQUIRY_RESPONSE: 1848d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann status_response_dump(level, frm); 1849ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1850d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 185117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1852d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1853d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_INFO_PARAM: 1854d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 1855d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_VERSION: 1856ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_version_dump(level, frm); 1857ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 185817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_COMMANDS: 185917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_commands_dump(level, frm); 186017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1861d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_FEATURES: 1862ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_features_dump(level, frm); 1863ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 186417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_EXT_FEATURES: 186517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_dump(level, frm); 186617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1867d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_BUFFER_SIZE: 1868ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_buffer_size_dump(level, frm); 1869ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1870d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_BD_ADDR: 1871ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_response_dump(level, frm); 1872ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1873d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 187417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1875d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1876d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_STATUS_PARAM: 1877d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 1878d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_FAILED_CONTACT_COUNTER: 1879d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_RESET_FAILED_CONTACT_COUNTER: 1880f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann status_response_dump(level, frm); 1881f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1882d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LINK_QUALITY: 1883f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_link_quality_dump(level, frm); 1884f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1885d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_RSSI: 1886f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_rssi_dump(level, frm); 1887f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1888d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_AFH_MAP: 1889f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_afh_map_dump(level, frm); 1890f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1891d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_CLOCK: 1892f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_dump(level, frm); 1893ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1894d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 189517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1896d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1897ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1898ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 1899d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1900d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm) 1902d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1903d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_cmd_status *evt = frm->ptr; 1904d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(evt->opcode); 19057b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 19067b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 19077b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 19087b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR)) 19097b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 1910d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1911d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1912d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n", 19137b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann opcode2str(opcode), ogf, ocf, evt->status, evt->ncmd); 1914d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1915d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1916d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1917d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1918d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1919d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1920d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1921afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void hardware_error_dump(int level, struct frame *frm) 1922afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{ 1923afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann evt_hardware_error *evt = frm->ptr; 1924afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1925afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann p_indent(level, frm); 1926afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann printf("code %d\n", evt->code); 1927afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann} 1928afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1929d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm) 1930d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1931d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t num = get_u8(frm); 1932b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann char addr[18]; 1933d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 1934d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1935d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann for (i = 0; i < num; i++) { 1936d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inquiry_info *info = frm->ptr; 1937d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1938bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 1939d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1940d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 194172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n", 194272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 194372e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0]); 1944d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1945d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->ptr += INQUIRY_INFO_SIZE; 1946d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->len -= INQUIRY_INFO_SIZE; 1947d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1948d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1949d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1950d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm) 1951d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1952d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_conn_complete *evt = frm->ptr; 1953d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18]; 1954d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1955bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 1956d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1957d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1958d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n", 1959120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), addr, 1960120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode); 1961d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1962d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1963d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1964d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1965d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1966d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1967d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1968d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm) 1969d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1970d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_conn_request *evt = frm->ptr; 1971d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18]; 1972d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1973bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 1974d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1975d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1976d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n", 1977120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann addr, evt->dev_class[2], evt->dev_class[1], 1978120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO"); 1979d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1980d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1981d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm) 1982d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1983d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_disconn_complete *evt = frm->ptr; 1984d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1985d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1986d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d reason 0x%2.2x\n", 1987120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->reason); 1988d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1989d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1990d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1991d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1992d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } else if (evt->reason > 0) { 1993d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1994d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Reason: %s\n", status2str(evt->reason)); 1995d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1996d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1997d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1998d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm) 1999d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2000d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_remote_name_req_complete *evt = frm->ptr; 2001d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18], name[249]; 2002d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 2003d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2004bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2005d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2006d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann memset(name, 0, sizeof(name)); 2007d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann for (i = 0; i < 248 && evt->name[i]; i++) 2008d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (isprint(evt->name[i])) 2009d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann name[i] = evt->name[i]; 2010d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann else 2011d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann name[i] = '.'; 2012d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2013d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2014d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name); 2015d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2016d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 2017d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2018d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2019d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2020d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2021d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 202217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_complete_dump(int level, struct frame *frm) 202317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 202417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt_master_link_key_complete *evt = frm->ptr; 202517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 202617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 202717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x handle %d flag %d\n", 2028120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->key_flag); 202917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 203017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (evt->status > 0) { 203117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 203217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 203317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 203417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 203517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 2036d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm) 2037d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2038d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_encrypt_change *evt = frm->ptr; 2039d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2040d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2041d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n", 2042120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->encrypt); 2043d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2044d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 2045d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 2046d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2047d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2048d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2049d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2050ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm) 2051ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2052ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_remote_features_complete *evt = frm->ptr; 2053ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 2054ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2056ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2057ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2058ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2059ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Features:"); 2064ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 8; i++) 2065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf(" 0x%2.2x", evt->features[i]); 2066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 2067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2068ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2069ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2070ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm) 2071ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_remote_version_complete *evt = frm->ptr; 2073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t manufacturer = btohs(evt->manufacturer); 2074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2075ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2080ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n", 2084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann lmp_vertostr(evt->lmp_ver), evt->lmp_ver, 2085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(evt->lmp_subver)); 2086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Manufacturer: %s (%d)\n", 2088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bt_compidtostr(manufacturer), manufacturer); 2089ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 209211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void qos_setup_complete_dump(int level, struct frame *frm) 209311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 209411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_qos_setup_complete *evt = frm->ptr; 209511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 209611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 209711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("status 0x%2.2x handle %d flags %d\n", 2098120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->flags); 209911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 210011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann if (evt->status > 0) { 210111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 210211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Error: %s\n", status2str(evt->status)); 210311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann } else { 210411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 210511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Service type: %d\n", evt->qos.service_type); 210611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 210711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Token rate: %d\n", btohl(evt->qos.token_rate)); 210811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 210911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); 211011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 211111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Latency: %d\n", btohl(evt->qos.latency)); 211211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 211311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); 211411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann } 211511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 211611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 2117ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm) 2118ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2119ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_role_change *evt = frm->ptr; 2120ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2121ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2122ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2123bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2124ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n", 2125120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, addr, evt->role); 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("Role: %s\n", role2str(evt->role)); 2133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm) 2137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2138ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint8_t num = get_u8(frm); 21392374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann uint16_t handle, packets; 2140ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 2141ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2142ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < num; i++) { 21432374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann handle = btohs(htons(get_u16(frm))); 21442374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann packets = btohs(htons(get_u16(frm))); 21452374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann 21462374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann p_indent(level, frm); 21472374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann printf("handle %d packets %d\n", handle, packets); 2148ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2149ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2150ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2151ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm) 2152ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2153ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_mode_change *evt = frm->ptr; 2154ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2155ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2156ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n", 2157ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval)); 2158ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2159ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2160ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2161ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2162ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2163ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2164ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Mode: %s\n", mode2str(evt->mode)); 2165ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2166ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2167ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2168ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm) 2169ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2170ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_pin_code_req *evt = frm->ptr; 2171ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2172ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2173ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2174bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2175ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s\n", addr); 2176ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2177ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2178ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm) 2179ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2180ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_link_key_notify *evt = frm->ptr; 2181ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2182ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 2183ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2184ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2185bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 218644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s key ", addr); 2187ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 16; i++) 2188a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann if (parser.flags & DUMP_NOVENDOR) 2189a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("**"); 2190a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann else 2191a82beb6911e6ef88e5f83617bfca59985d98a7d8Marcel Holtmann printf("%2.2X", evt->link_key[i]); 219244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf(" type %d\n", evt->key_type); 2193ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2194ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 219511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void max_slots_change_dump(int level, struct frame *frm) 219611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 219711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_max_slots_change *evt = frm->ptr; 219811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 219911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 220011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots); 220111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 220211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 2203c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmannstatic inline void data_buffer_overflow_dump(int level, struct frame *frm) 2204c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann{ 2205c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann evt_data_buffer_overflow *evt = frm->ptr; 2206c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann 2207c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann p_indent(level, frm); 2208c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO"); 2209c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann} 2210c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann 2211ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm) 2212ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2213ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_clock_offset_complete *evt = frm->ptr; 2214ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2215ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2216ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n", 2217ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, btohs(evt->handle), btohs(evt->clock_offset)); 2218ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2219ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2220ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2222ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2223ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2224ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2225ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm) 2226ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_conn_ptype_changed *evt = frm->ptr; 2228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t ptype = btohs(evt->ptype); 2229ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char *str; 2230ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2231ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2232ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d ptype 0x%4.4x\n", 2233120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), ptype); 2234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2235ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2236ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2237ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2238ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2239ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_ptypetostr(ptype); 2240ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 2241ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2242ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Packet type: %s\n", str); 2243ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 2244ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2245ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2246ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2247ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 224811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void pscan_rep_mode_change_dump(int level, struct frame *frm) 224911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 225011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_pscan_rep_mode_change *evt = frm->ptr; 225111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann char addr[18]; 225211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 225311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 2254bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 225511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode); 225611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 2257ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2258f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmannstatic inline void flow_spec_complete_dump(int level, struct frame *frm) 2259f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann{ 2260f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann evt_flow_spec_complete *evt = frm->ptr; 2261f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2262f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2263f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("status 0x%2.2x handle %d flags %d %s\n", 2264120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), evt->flags, 2265120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->direction == 0 ? "outgoing" : "incoming"); 2266f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2267f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann if (evt->status > 0) { 2268f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2269f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2270f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann } else { 2271f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2272f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Service type: %d\n", evt->qos.service_type); 2273f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2274f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Token rate: %d\n", btohl(evt->qos.token_rate)); 2275f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2276f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); 2277f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2278f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Latency: %d\n", btohl(evt->qos.latency)); 2279f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2280f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); 2281f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann } 2282f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann} 2283f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2284d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm) 2285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t num = get_u8(frm); 2287b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann char addr[18]; 2288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 2289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2290ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann if (!num) 2291ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann return; 2292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2293ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) { 2294ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann for (i = 0; i < num; i++) { 2295ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr; 2296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2297ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann p_indent(level, frm); 2298d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2299bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 2300ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2301ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 2302ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 2303ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2304ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; 2305ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; 2306ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } 2307ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } else { 2308ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann for (i = 0; i < num; i++) { 2309ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann inquiry_info_with_rssi *info = frm->ptr; 2310ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2311ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann p_indent(level, frm); 2312ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2313bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 2314ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2315ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 2316ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 2317ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2318ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE; 2319ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE; 2320ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } 2321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 232417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_complete_dump(int level, struct frame *frm) 232517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 232617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt_read_remote_ext_features_complete *evt = frm->ptr; 232717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i; 232817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 232917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 233017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x handle %d page %d max %d\n", 2331120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), 2332120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->page_num, evt->max_page_num); 233317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 233417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (evt->status > 0) { 233517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 233617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 233717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 233817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 233917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Features:"); 234017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 8; i++) 234117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" 0x%2.2x", evt->features[i]); 234217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 234317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 234417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 234517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 2346d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_complete_dump(int level, struct frame *frm) 2347d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 2348d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt_sync_conn_complete *evt = frm->ptr; 2349d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann char addr[18]; 2350d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2351bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&evt->bdaddr, addr); 2352d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2353d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2354d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("status 0x%2.2x handle %d bdaddr %s type %s\n", 2355120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->status, btohs(evt->handle), addr, 2356120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt->link_type == 0 ? "SCO" : "eSCO"); 2357d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2358d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann if (evt->status > 0) { 2359d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2360d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2361d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } else { 2362d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2363d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Air mode: %s\n", airmode2str(evt->air_mode)); 2364d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 2365d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 2366d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2367d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_changed_dump(int level, struct frame *frm) 2368d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 2369d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt_sync_conn_changed *evt = frm->ptr; 2370d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2371d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2372120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2373d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2374d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann if (evt->status > 0) { 2375d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2376d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2377d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 2378d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 2379d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2380120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmannstatic inline void sniff_subrate_event_dump(int level, struct frame *frm) 2381120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann{ 2382120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann evt_sniff_subrate *evt = frm->ptr; 2383120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2384120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2385120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 2386120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2387120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann if (evt->status > 0) { 2388120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2389120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2390120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann } else { 2391120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2392f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann printf("max latency transmit %d receive %d\n", 2393f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann btohs(evt->max_tx_latency), 2394f6c497efadbb0173986eb3da2d8982474a1da9caMarcel Holtmann btohs(evt->max_rx_latency)); 2395120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2396120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann p_indent(level, frm); 2397120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann printf("min timeout remote %d local %d\n", 2398120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(evt->min_remote_timeout), 2399120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann btohs(evt->min_local_timeout)); 2400120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann } 2401120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann} 2402120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann 2403807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmannstatic inline void extended_inq_result_dump(int level, struct frame *frm) 2404807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann{ 2405807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann uint8_t num = get_u8(frm); 2406807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann char addr[18]; 2407807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann int i; 2408807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2409807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann for (i = 0; i < num; i++) { 2410807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann extended_inquiry_info *info = frm->ptr; 2411807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2412bda29c1eba75f38240df570735d3e4bfc9c5a4d6Marcel Holtmann p_ba2str(&info->bdaddr, addr); 2413807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2414807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann p_indent(level, frm); 241527eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2416807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 241727eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 241827eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann 241927eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE; 242027eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE; 242127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann 2422e6bc40f4895cbd256bfa15922d8df2ebf37b4b09Marcel Holtmann ext_inquiry_response_dump(level, frm); 2423807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann } 2424807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann} 2425807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2426d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmannstatic inline void link_supervision_timeout_dump(int level, struct frame *frm) 2427d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann{ 2428d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann evt_link_supervision_timeout *evt = frm->ptr; 2429d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann 2430d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann p_indent(level, frm); 2431d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann printf("handle %d timeout %d\n", 2432d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann btohs(evt->handle), btohs(evt->timeout)); 2433d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann} 2434d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann 243565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm) 243695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2437174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky hci_event_hdr *hdr = frm->ptr; 2438be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann uint8_t event = hdr->evt; 243965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 244065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (p_filter(FILT_HCI)) 244165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky return; 244265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2443d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (event <= EVENT_NUM) { 24447b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 2445803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: %s (0x%2.2x) plen %d\n", 24467b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann event_str[hdr->evt], hdr->evt, hdr->plen); 2447be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } else if (hdr->evt == EVT_TESTING) { 24487b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 2449803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); 2450be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } else if (hdr->evt == EVT_VENDOR) { 2451a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann uint16_t manufacturer; 2452a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann 24537b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (parser.flags & DUMP_NOVENDOR) 24547b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 24557b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 24567b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 2457803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); 24587b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 2459a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann manufacturer = get_manufacturer(); 2460a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann 2461a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann switch (manufacturer) { 2462a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann case 0: 2463a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann case 48: 2464a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann frm->ptr += HCI_EVENT_HDR_SIZE; 2465a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann frm->len -= HCI_EVENT_HDR_SIZE; 2466a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann ericsson_dump(level + 1, frm); 2467a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann return; 2468a6f87c461a00bacaa481084418ed0a94f6b06b51Marcel Holtmann case 10: 2469be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann frm->ptr += HCI_EVENT_HDR_SIZE; 2470be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann frm->len -= HCI_EVENT_HDR_SIZE; 2471be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann csr_dump(level + 1, frm); 2472be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann return; 2473be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 24747b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann } else { 24757b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann p_indent(level, frm); 247666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen); 24777b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann } 247865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 247965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->ptr += HCI_EVENT_HDR_SIZE; 248065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->len -= HCI_EVENT_HDR_SIZE; 248165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2482be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (event == EVT_CMD_COMPLETE) { 2483be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann evt_cmd_complete *cc = frm->ptr; 2484be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) { 2485be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE; 2486be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann manufacturer = rp->manufacturer; 2487be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 2488be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 2489be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 249025554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann if (event == EVT_DISCONN_COMPLETE) { 249125554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann evt_disconn_complete *evt = frm->ptr; 249225554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann l2cap_clear(btohs(evt->handle)); 249325554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann } 249425554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann 2495d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 2496d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 2497d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return; 2498d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2499d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2500d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (event) { 2501ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann case EVT_LOOPBACK_COMMAND: 2502ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann command_dump(level + 1, frm); 2503ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 2504d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CMD_COMPLETE: 2505d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd_complete_dump(level + 1, frm); 2506d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2507d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CMD_STATUS: 2508d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd_status_dump(level + 1, frm); 2509d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2510afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann case EVT_HARDWARE_ERROR: 2511afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann hardware_error_dump(level + 1, frm); 2512afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann break; 2513afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann case EVT_FLUSH_OCCURRED: 2514f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann case EVT_QOS_VIOLATION: 2515afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann handle_response_dump(level + 1, frm); 2516afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann break; 2517d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_COMPLETE: 2518d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann status_response_dump(level + 1, frm); 2519d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2520d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_RESULT: 2521d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inq_result_dump(level + 1, frm); 2522d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2523d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CONN_COMPLETE: 2524d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann conn_complete_dump(level + 1, frm); 2525d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2526d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CONN_REQUEST: 2527d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann conn_request_dump(level + 1, frm); 2528d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2529d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_DISCONN_COMPLETE: 2530d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann disconn_complete_dump(level + 1, frm); 2531d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2532d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_AUTH_COMPLETE: 2533d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CHANGE_CONN_LINK_KEY_COMPLETE: 2534d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann generic_response_dump(level + 1, frm); 2535d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 253617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case EVT_MASTER_LINK_KEY_COMPLETE: 253717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_complete_dump(level + 1, frm); 253817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 2539d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_REMOTE_NAME_REQ_COMPLETE: 2540d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann remote_name_req_complete_dump(level + 1, frm); 2541d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2542d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_ENCRYPT_CHANGE: 2543d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann encrypt_change_dump(level + 1, frm); 2544d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_REMOTE_FEATURES_COMPLETE: 2546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_remote_features_complete_dump(level + 1, frm); 2547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_REMOTE_VERSION_COMPLETE: 2549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_remote_version_complete_dump(level + 1, frm); 2550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_QOS_SETUP_COMPLETE: 255211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann qos_setup_complete_dump(level + 1, frm); 2553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_ROLE_CHANGE: 2555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann role_change_dump(level + 1, frm); 2556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_NUM_COMP_PKTS: 2558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann num_comp_pkts_dump(level + 1, frm); 2559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_MODE_CHANGE: 2561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann mode_change_dump(level + 1, frm); 2562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2563b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann case EVT_RETURN_LINK_KEYS: 2564b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann return_link_keys_dump(level + 1, frm); 2565b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann break; 2566ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_PIN_CODE_REQ: 2567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_LINK_KEY_REQ: 2568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_req_dump(level + 1, frm); 2569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_LINK_KEY_NOTIFY: 2571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_notify_dump(level + 1, frm); 2572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2573c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann case EVT_DATA_BUFFER_OVERFLOW: 2574c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann data_buffer_overflow_dump(level + 1, frm); 2575c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann break; 257611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann case EVT_MAX_SLOTS_CHANGE: 257711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann max_slots_change_dump(level + 1, frm); 257811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann break; 2579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_CLOCK_OFFSET_COMPLETE: 2580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_clock_offset_complete_dump(level + 1, frm); 2581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_CONN_PTYPE_CHANGED: 2583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann conn_ptype_changed_dump(level + 1, frm); 2584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 258511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann case EVT_PSCAN_REP_MODE_CHANGE: 258611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann pscan_rep_mode_change_dump(level + 1, frm); 258711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann break; 2588f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann case EVT_FLOW_SPEC_COMPLETE: 2589f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann flow_spec_complete_dump(level + 1, frm); 2590f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann break; 2591d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_RESULT_WITH_RSSI: 2592d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inq_result_with_rssi_dump(level + 1, frm); 2593d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 259417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE: 259517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_complete_dump(level + 1, frm); 259617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 2597d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case EVT_SYNC_CONN_COMPLETE: 2598d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann sync_conn_complete_dump(level + 1, frm); 2599d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann break; 2600d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case EVT_SYNC_CONN_CHANGED: 2601d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann sync_conn_changed_dump(level + 1, frm); 2602d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann break; 2603120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann case EVT_SNIFF_SUBRATE: 2604120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann sniff_subrate_event_dump(level + 1, frm); 2605120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann break; 2606807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann case EVT_EXTENDED_INQUIRY_RESULT: 2607807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann extended_inq_result_dump(level + 1, frm); 2608807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann break; 2609d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann case EVT_LINK_SUPERVISION_TIMEOUT: 2610d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann link_supervision_timeout_dump(level + 1, frm); 2611d6821ff2b800acae15702935d84a0b3cbbf04c6cMarcel Holtmann break; 2612d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann default: 2613d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 2614d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2615d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 261695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 261795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 261865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm) 261995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2620174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky hci_acl_hdr *hdr = (void *) frm->ptr; 26210d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t handle = btohs(hdr->handle); 26220d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t dlen = btohs(hdr->dlen); 26230d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t flags = acl_flags(handle); 262465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 262565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (!p_filter(FILT_HCI)) { 2626ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2627d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("ACL data: handle %d flags 0x%2.2x dlen %d\n", 262865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky acl_handle(handle), flags, dlen); 262965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky level++; 263065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky } 2631e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 2632e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann frm->ptr += HCI_ACL_HDR_SIZE; 2633e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann frm->len -= HCI_ACL_HDR_SIZE; 2634f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky frm->flags = flags; 2635f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky frm->handle = acl_handle(handle); 263665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 263765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (parser.filter & ~FILT_HCI) 263865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky l2cap_dump(level, frm); 263965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky else 264065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 264195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 264295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2643d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm) 2644d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{ 2645d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky hci_sco_hdr *hdr = (void *) frm->ptr; 26460d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t handle = btohs(hdr->handle); 26476d3f2066a10cd7d0812fdf97635f1bd77f003493Marcel Holtmann int len; 2648d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 26499e216633a0f902b7d069c08939c67e03dd4ee516Marcel Holtmann if (frm->audio_fd > fileno(stderr)) 26506d3f2066a10cd7d0812fdf97635f1bd77f003493Marcel Holtmann len = write(frm->audio_fd, frm->ptr + HCI_SCO_HDR_SIZE, hdr->dlen); 26510033462dddb3b4adf56ea28680c1f135f25a4387Marcel Holtmann 2652d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky if (!p_filter(FILT_SCO)) { 2653ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2654d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("SCO data: handle %d dlen %d\n", 2655120063f07f207a7d1f349d1b199a4e06a12d6635Marcel Holtmann acl_handle(handle), hdr->dlen); 2656d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky level++; 2657d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 2658d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky frm->ptr += HCI_SCO_HDR_SIZE; 2659d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky frm->len -= HCI_SCO_HDR_SIZE; 2660d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky raw_dump(level, frm); 2661d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky } 2662d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky} 2663d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 2664b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm) 2665b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{ 2666b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann if (p_filter(FILT_HCI)) 2667b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann return; 2668b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann 266938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann if (frm->dev_id == HCI_DEV_NONE) { 2670a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann uint16_t device = btohs(htons(get_u16(frm))); 2671ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann uint16_t proto = btohs(htons(get_u16(frm))); 267238acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann uint16_t type = btohs(htons(get_u16(frm))); 267338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann uint16_t plen = btohs(htons(get_u16(frm))); 267438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 267538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann p_indent(level, frm); 267638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 2677ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann printf("System %s: device hci%d proto 0x%2.2x type 0x%2.2x plen %d\n", 2678ef55fce5a5a981237ed3d6fd3b0bfd09d9e2c20aMarcel Holtmann frm->in ? "event" : "command", device, proto, type, plen); 267938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 268038acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann raw_dump(level, frm); 268138acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann return; 268238acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann } 268338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 26847b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann if (parser.flags & DUMP_NOVENDOR) 26857b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann return; 26867b569efa1aca959152329631d0fc9f9bf70bc49bMarcel Holtmann 2687b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann if (get_manufacturer() == 12) { 2688b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann bpa_dump(level, frm); 2689b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann return; 2690b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann } 2691b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann 2692b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann p_indent(level, frm); 2693b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann printf("Vendor data: len %d\n", frm->len); 2694b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann raw_dump(level, frm); 2695b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann} 2696b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann 2697174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm) 269895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2699d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t type = *(uint8_t *)frm->ptr; 270095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2701174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky frm->ptr++; frm->len--; 2702e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 270395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky switch (type) { 270495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_COMMAND_PKT: 270565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky command_dump(level, frm); 270695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 270795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 270895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_EVENT_PKT: 270965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky event_dump(level, frm); 271095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 271195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 271295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_ACLDATA_PKT: 271365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky acl_dump(level, frm); 271495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 271595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2716d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky case HCI_SCODATA_PKT: 2717d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky sco_dump(level, frm); 2718d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky break; 2719e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 2720b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann case HCI_VENDOR_PKT: 2721b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann vendor_dump(level, frm); 2722b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann break; 2723b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann 272495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky default: 272565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (p_filter(FILT_HCI)) 272665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky break; 272765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2728ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2729174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky printf("Unknown: type 0x%2.2x len %d\n", type, frm->len); 273065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 273195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 273295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky } 273395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 2734