hci.c revision 27eb1cb2512b886662cab125e53305ca6d779e7f
195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky/* 2e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 3e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * Bluetooth packet analyzer - HCI parser 4e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 5e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * Copyright (C) 2000-2002 Maxim Krasnyansky <maxk@qualcomm.com> 6d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann * Copyright (C) 2003-2005 Marcel Holtmann <marcel@holtmann.org> 7e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 8e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 9e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * This program is free software; you can redistribute it and/or modify 10e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * it under the terms of the GNU General Public License as published by 11e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * the Free Software Foundation; either version 2 of the License, or 12e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * (at your option) any later version. 13e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 14e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * This program is distributed in the hope that it will be useful, 15e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * but WITHOUT ANY WARRANTY; without even the implied warranty of 16e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * GNU General Public License for more details. 18e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 19e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * You should have received a copy of the GNU General Public License 20e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * along with this program; if not, write to the Free Software 21e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 23e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * 24e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann * $Id$ 2595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky */ 2695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdio.h> 28e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann#include <errno.h> 29d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#include <ctype.h> 3095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <stdlib.h> 3195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <unistd.h> 3295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <string.h> 3395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 3495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <sys/types.h> 350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <sys/socket.h> 360d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann#include <netinet/in.h> 3795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 3895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/bluetooth.h> 3995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include <bluetooth/hci.h> 40ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann#include <bluetooth/hci_lib.h> 4195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 4295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky#include "parser.h" 4395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 44be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic uint16_t manufacturer = DEFAULT_COMPID; 45be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 46be9be844106d677ec77acee68935bc9e66772123Marcel Holtmannstatic inline uint16_t get_manufacturer(void) 47be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann{ 48be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer); 49be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann} 50be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 51d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *event_str[] = { 5266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Unknown", 5366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Inquiry Complete", 5466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Inquiry Result", 5566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Connect Complete", 5666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Connect Request", 5766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Disconn Complete", 5866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Auth Complete", 5966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Remote Name Req Complete", 60d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky "Encrypt Change", 6166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Change Connection Link Key Complete", 6266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Master Link Key Complete", 6366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Read Remote Supported Features", 6466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Read Remote Ver Info Complete", 6566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "QoS Setup Complete", 6666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Command Complete", 6766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Command Status", 6866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Hardware Error", 6966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Flush Occurred", 7066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Role Change", 7166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Number of Completed Packets", 7266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Mode Change", 7366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Return Link Keys", 7466f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "PIN Code Request", 7566f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Link Key Request", 7666f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Link Key Notification", 7766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Loopback Command", 7866f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Data Buffer Overflow", 7966f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Max Slots Change", 8066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Read Clock Offset Complete", 8166f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Connection Packet Type Changed", 8266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "QoS Violation", 8366f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky "Page Scan Mode Change", 84328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Page Scan Repetition Mode Change", 85328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Flow Specification Complete", 86328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Inquiry Result with RSSI", 87328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Remote Extended Features", 88328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 89328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 90328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 91328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 92328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 93328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 94328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 95328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 96328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Synchronous Connect Complete", 971a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Synchronous Connect Changed", 981a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Unknown", 991a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Extended Inquiry Result", 10066f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky}; 10127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann#define EVENT_NUM 47 1022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 103d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_linkctl_str[] = { 1042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 1052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Inquiry", 1062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Inquiry Cancel", 1072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Periodic Inquiry Mode", 1082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Exit Periodic Inquiry Mode", 1092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Create Connection", 1102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Disconnect", 1112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Add SCO Connection", 112328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Create Connection Cancel", 1132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Accept Connection Request", 1142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Reject Connection Request", 1152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Link Key Request Reply", 1162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Link Key Request Negative Reply", 1172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "PIN Code Request Reply", 1182bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "PIN Code Request Negative Reply", 1192bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Change Connection Packet Type", 120f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Authentication Requested", 122f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Connection Encryption", 124f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Change Connection Link Key", 126f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Master Link Key", 128f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Remote Name Request", 130328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Remote Name Request Cancel", 1312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Remote Supported Features", 132328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Remote Extended Features", 1332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Remote Version Information", 134f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 135328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Clock Offset", 136328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read LMP Handle" 137328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 138328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 139328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 140328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 141328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 142328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 143328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 144328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Setup Synchronous Connection", 145328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Accept Synchronous Connection", 1461a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Reject Synchronous Connection", 1472bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 148328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_LINKCTL_NUM 42 1492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 150d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_linkpol_str[] = { 1512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 1522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Hold Mode", 153f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Sniff Mode", 1552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Exit Sniff Mode", 156328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Park State", 157328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Exit Park State", 1582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "QoS Setup", 159f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Role Discovery", 161f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Switch Role", 1632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Link Policy Settings", 164328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Link Policy Settings", 165328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Default Link Policy Settings", 166328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Default Link Policy Settings", 1671a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Flow Specification", 1682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 169328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_LINKPOL_NUM 16 1702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 171d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_hostctl_str[] = { 1722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 1732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Event Mask", 174f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Reset", 176f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Event Filter", 178f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 179f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Flush", 1812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read PIN Type ", 1822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write PIN Type", 1832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Create New Unit Key", 184f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1852bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Stored Link Key", 186f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 187f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 188f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 1892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Stored Link Key", 1902bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Delete Stored Link Key", 191328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Local Name", 1922bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Local Name", 1932bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Connection Accept Timeout", 1942bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Connection Accept Timeout", 1952bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Timeout", 1962bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Page Timeout", 1972bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Scan Enable", 1982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Scan Enable", 1992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Scan Activity", 2002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Page Scan Activity", 2012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Inquiry Scan Activity", 2022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Inquiry Scan Activity", 2032bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Authentication Enable", 2042bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Authentication Enable", 2052bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Encryption Mode", 2062bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Encryption Mode", 2072bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Class of Device", 2082bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Class of Device", 2092bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Voice Setting", 2102bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Voice Setting", 2112bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Automatic Flush Timeout", 2122bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Automatic Flush Timeout", 2132bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Num Broadcast Retransmissions", 2142bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Num Broadcast Retransmissions", 2152bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Hold Mode Activity ", 2162bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Hold Mode Activity", 2172bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Transmit Power Level", 218328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Synchronous Flow Control Enable", 219328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Synchronous Flow Control Enable", 220f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2212bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Set Host Controller To Host Flow Control", 222f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2232bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Host Buffer Size", 224f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2252bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Host Number of Completed Packets", 2262bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Link Supervision Timeout", 2272bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Link Supervision Timeout", 2282bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Number of Supported IAC", 2292bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Current IAC LAP", 2302bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Current IAC LAP", 2312bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Scan Period Mode", 2322bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Write Page Scan Period Mode", 2332bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Page Scan Mode", 234328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Page Scan Mode", 235328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Set AFH Host Channel Classification", 236328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 237328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Unknown", 238328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Inquiry Scan Type", 239328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Inquiry Scan Type", 240328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Inquiry Mode", 241328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Inquiry Mode", 242328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Page Scan Type", 243328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Write Page Scan Type", 244328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read AFH Channel Assessment Mode", 2451a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Write AFH Channel Assessment Mode", 2461a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Unknown", 2471a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Read Extended Inquiry Response", 2481a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Write Extended Inquiry Response", 2492bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 2501a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann#define CMD_HOSTCTL_NUM 76 2512bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 252d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_info_str[] = { 2532bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 2542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Local Version Information", 255328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Local Supported Commands", 2562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Local Supported Features", 257328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Local Extended Features", 2582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Buffer Size", 259f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Country Code", 261f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 2621a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Read BD ADDR", 2632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 264f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky#define CMD_INFO_NUM 9 2652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 266d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *cmd_status_str[] = { 2672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Unknown", 2682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Read Failed Contact Counter", 2692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky "Reset Failed Contact Counter", 270328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read Link Quality", 271f8af6e30983794741e5d45b32c8d6b2f79ff7e1cMax Krasnyansky "Unknown", 272328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read RSSI", 273328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann "Read AFH Channel Map", 2741a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Read Clock", 2752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky}; 276328789cab8eae78c87d97fa0f2859956e674ca5dMarcel Holtmann#define CMD_STATUS_NUM 7 27766f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky 278d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *error_code_str[] = { 279d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Success", 280d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unknown HCI Command", 281d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unknown Connection Identifier", 282d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Hardware Failure", 283d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Page Timeout", 284d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Authentication Failure", 285d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "PIN or Key Missing", 286d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Memory Capacity Exceeded", 287d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Timeout", 288d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Limit Exceeded", 289d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Synchronous Connection to a Device Exceeded", 290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "ACL Connection Already Exists", 291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Command Disallowed", 292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Rejected due to Limited Resources", 293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Rejected due to Security Reasons", 294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Rejected due to Unacceptable BD_ADDR", 295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Accept Timeout Exceeded", 296d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unsupported Feature or Parameter Value", 297d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Invalid HCI Command Parameters", 29860864ce9e77ec159d0914fe8d938565493f08eebMarcel Holtmann "Remote User Terminated Connection", 299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Remote Device Terminated Connection due to Low Resources", 300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Remote Device Terminated Connection due to Power Off", 301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Connection Terminated by Local Host", 302fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann "Repeated Attempts", 303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Pairing Not Allowed", 304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unknown LMP PDU", 305d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unsupported Remote Feature / Unsupported LMP Feature", 306d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "SCO Offset Rejected", 307d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "SCO Interval Rejected", 308d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "SCO Air Mode Rejected", 309d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Invalid LMP Parameters", 310d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unspecified Error", 311d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Unsupported LMP Parameter Value", 312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Role Change Not Allowed", 313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "LMP Response Timeout", 314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "LMP Error Transaction Collision", 315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "LMP PDU Not Allowed", 316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Encryption Mode Not Acceptable", 317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Link Key Can Not be Changed", 318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Requested QoS Not Supported", 319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Instant Passed", 320fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann "Pairing with Unit Key Not Supported", 321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Different Transaction Collision", 322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved", 323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "QoS Unacceptable Parameter", 324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "QoS Rejected", 325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Channel Classification Not Supported", 326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Insufficient Security", 327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Parameter out of Mandatory Range", 328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved", 329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Role Switch Pending", 330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved", 331d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann "Reserved Slot Violation", 3321a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann "Role Switch Failed", 333d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann}; 334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann#define ERROR_CODE_NUM 53 335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *status2str(uint8_t status) 337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char *str; 339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 340d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (status <= ERROR_CODE_NUM) 341d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann str = error_code_str[status]; 342d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann else 343d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann str = "Unknown"; 344d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 345d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return str; 346d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 347d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 348d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic char *opcode2str(uint16_t opcode) 34995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 3500d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 3510d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 3522bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky char *cmd; 35395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 3542bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky switch (ogf) { 3552bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_INFO_PARAM: 3562bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_INFO_NUM) 357d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_info_str[ocf]; 3582bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3592bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3602bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3612bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 3622bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_HOST_CTL: 3632bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_HOSTCTL_NUM) 364d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_hostctl_str[ocf]; 3652bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3662bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3672bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3682bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 3692bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_LINK_CTL: 3702bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_LINKCTL_NUM) 371d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_linkctl_str[ocf]; 3722bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3732bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3742bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3752bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 3762bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_LINK_POLICY: 3772bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_LINKPOL_NUM) 378d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_linkpol_str[ocf]; 3792bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3802bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3812bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3822bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 3832bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky case OGF_STATUS_PARAM: 3842bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky if (ocf <= CMD_STATUS_NUM) 385d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd = cmd_status_str[ocf]; 3862bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky else 3872bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 3882bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 3892bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 390cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann case OGF_TESTING_CMD: 391cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann cmd = "Testing"; 392cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann break; 393cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann 394cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann case OGF_VENDOR_CMD: 395cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann cmd = "Vendor"; 396cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann break; 397cb24bb6a44ae526d0631fcd36075776f66690e2aMarcel Holtmann 3982bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky default: 3992bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky cmd = "Unknown"; 4002bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky break; 4012bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky } 4022bb451888267740621e80a89abf15ad2821c8619Max Krasnyansky 403d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return cmd; 404d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 405d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 406ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *role2str(uint8_t role) 407ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 408ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (role) { 409ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x00: 410ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Master"; 411ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x01: 412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Slave"; 413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann default: 414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Unknown"; 415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 416ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 417ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 418ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic char *mode2str(uint8_t mode) 419ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 420ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (mode) { 421ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x00: 422ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Active"; 423ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x01: 424ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Hold"; 425ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x02: 426ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Sniff"; 427ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case 0x03: 428ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Park"; 429ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann default: 430ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return "Unknown"; 431ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 432ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 433ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 434d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic char *airmode2str(uint8_t mode) 435d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 436d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann switch (mode) { 437d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x00: 438d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "u-law log"; 439d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x01: 440d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "A-law log"; 441d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x02: 442d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "CVSD"; 443d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case 0x04: 444d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "Transparent data"; 445d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann default: 446d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann return "Reserved"; 447d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 448d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 449d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void generic_command_dump(int level, struct frame *frm) 451ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 452ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 453ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 454ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 455ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d\n", handle); 456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 459ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 46090480219be366c65e68ae8612de7a361027e751aMarcel Holtmannstatic inline void bdaddr_command_dump(int level, struct frame *frm) 46190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann{ 46290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann bdaddr_t *bdaddr = frm->ptr; 46390480219be366c65e68ae8612de7a361027e751aMarcel Holtmann char addr[18]; 46490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 46590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann frm->ptr += sizeof(bdaddr_t); 46690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann frm->len -= sizeof(bdaddr_t); 46790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 46890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann p_indent(level, frm); 46990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann ba2str(bdaddr, addr); 47090480219be366c65e68ae8612de7a361027e751aMarcel Holtmann printf("bdaddr %s\n", addr); 47190480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 47290480219be366c65e68ae8612de7a361027e751aMarcel Holtmann raw_dump(level, frm); 47390480219be366c65e68ae8612de7a361027e751aMarcel Holtmann} 47490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann 475ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void inquiry_dump(int level, struct frame *frm) 476ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 477ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann inquiry_cp *cp = frm->ptr; 478ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 479ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 480ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("lap 0x%2.2x%2.2x%2.2x len %d num %d\n", 481ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp); 482ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 483ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 484ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void periodic_inquiry_dump(int level, struct frame *frm) 485ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 486ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann periodic_inquiry_cp *cp = frm->ptr; 487ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 488ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 489ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("max %d min %d lap 0x%2.2x%2.2x%2.2x len %d num %d\n", 490ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(cp->max_period), btohs(cp->min_period), 491ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann cp->lap[2], cp->lap[1], cp->lap[0], cp->length, cp->num_rsp); 492ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 493ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 494ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void create_conn_dump(int level, struct frame *frm) 495ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 496ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann create_conn_cp *cp = frm->ptr; 497ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t ptype = btohs(cp->pkt_type); 498ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t clkoffset = btohs(cp->clock_offset); 499ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18], *str; 500ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 501ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 502ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&cp->bdaddr, addr); 503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s ptype 0x%4.4x rswitch 0x%2.2x clkoffset 0x%4.4x%s\n", 504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann addr, ptype, cp->role_switch, 505ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : ""); 506ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 507ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_ptypetostr(ptype); 508ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 509ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 510ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Packet type: %s\n", str); 511ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 512ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 513ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 514ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 515ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void disconnect_dump(int level, struct frame *frm) 516ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 517ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann disconnect_cp *cp = frm->ptr; 518ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 519ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 520ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d reason 0x%2.2x\n", btohs(cp->handle), cp->reason); 521ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 522ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 523ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Reason: %s\n", status2str(cp->reason)); 524ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 525ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 526ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void add_sco_dump(int level, struct frame *frm) 527ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 528ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann add_sco_cp *cp = frm->ptr; 529ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t ptype = btohs(cp->pkt_type); 530ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char *str; 531ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 532ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 533ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d ptype 0x%4.4x\n", btohs(cp->handle), ptype); 534ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 535ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_ptypetostr(ptype); 536ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 537ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 538ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Packet type: %s\n", str); 539ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 540ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 541ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 542ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 543ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void accept_conn_req_dump(int level, struct frame *frm) 544ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 545ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_cp *cp = frm->ptr; 546ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 547ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 548ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 549ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&cp->bdaddr, addr); 550ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s role 0x%2.2x\n", addr, cp->role); 551ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 552ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 553ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Role: %s\n", role2str(cp->role)); 554ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 555ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 556ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void reject_conn_req_dump(int level, struct frame *frm) 557ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 558ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann reject_conn_req_cp *cp = frm->ptr; 559ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 560ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 561ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 562ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&cp->bdaddr, addr); 563ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s reason 0x%2.2x\n", addr, cp->reason); 564ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 565ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 566ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Reason: %s\n", status2str(cp->reason)); 567ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 568ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 569ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_reply_dump(int level, struct frame *frm) 570ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 571ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_reply_cp *cp = frm->ptr; 572ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18], pin[17]; 573ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 574ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 575ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&cp->bdaddr, addr); 576ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memset(pin, 0, sizeof(pin)); 577ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memcpy(pin, cp->pin_code, cp->pin_len); 578ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s len %d pin \'%s\'\n", addr, cp->pin_len, pin); 579ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 580ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 581ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_reply_dump(int level, struct frame *frm) 582ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 583ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_reply_cp *cp = frm->ptr; 584ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 585ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 586ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 587ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 588ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&cp->bdaddr, addr); 58944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s key ", addr); 590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 16; i++) 59144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("%2.2X", cp->link_key[i]); 592ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 593ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 594ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 595ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_neg_reply_dump(int level, struct frame *frm) 596ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 597ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_t *bdaddr = frm->ptr; 598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(bdaddr, addr); 602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s\n", addr); 603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 605ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void set_conn_encrypt_dump(int level, struct frame *frm) 606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann set_conn_encrypt_cp *cp = frm->ptr; 608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d encrypt 0x%2.2x\n", btohs(cp->handle), cp->encrypt); 611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 613ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void remote_name_req_dump(int level, struct frame *frm) 614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 615ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann remote_name_req_cp *cp = frm->ptr; 616ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t clkoffset = btohs(cp->clock_offset); 617ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 618ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 619ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 620ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&cp->bdaddr, addr); 62172e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x%s\n", 62272e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann addr, cp->pscan_rep_mode, 62372e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : ""); 624ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 625ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 62617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_dump(int level, struct frame *frm) 62717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 62817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_cp *cp = frm->ptr; 62917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 63017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 63117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("flag %d\n", cp->key_flag); 63217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 63317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 63417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_dump(int level, struct frame *frm) 63517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 63617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_cp *cp = frm->ptr; 63717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 63817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 639b7aa4c8a065d56e738d352cc491262313c01ef98Marcel Holtmann printf("handle %d page %d\n", btohs(cp->handle), cp->page_num); 64017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 64117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 642ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_link_policy_dump(int level, struct frame *frm) 643ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 644ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_link_policy_cp *cp = frm->ptr; 645ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t policy = btohs(cp->policy); 646ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char *str; 647ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 648ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 649ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("handle %d policy 0x%2.2x\n", btohs(cp->handle), policy); 650ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 651ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_lptostr(policy); 652ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 653ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 654ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Link policy: %s\n", str); 655ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 656ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 657ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 658ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 65944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_mask_dump(int level, struct frame *frm) 66044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 66144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_mask_cp *cp = frm->ptr; 66244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann int i; 66344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 66444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 66544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Mask: 0x"); 66644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann for (i = 0; i < 8; i++) 66744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("%2.2x", cp->mask[i]); 66844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 66944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 67044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 67144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void set_event_flt_dump(int level, struct frame *frm) 67244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 67344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_flt_cp *cp = frm->ptr; 67444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 67544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 67644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("type %d condition %d\n", cp->flt_type, cp->cond_type); 67744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 67844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann switch (cp->flt_type) { 67944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case FLT_CLEAR_ALL: 68044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Clear all filters\n"); 68144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 68244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case FLT_INQ_RESULT: 68344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Inquiry result"); 68444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann switch (cp->cond_type) { 68544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case INQ_RESULT_RETURN_ALL: 68644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case INQ_RESULT_RETURN_CLASS: 68744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case INQ_RESULT_RETURN_BDADDR: 68844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann default: 68944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 69044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 69144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 69244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 69344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case FLT_CONN_SETUP: 69444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Connection setup"); 69544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann switch (cp->cond_type) { 69644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case CONN_SETUP_ALLOW_ALL: 69744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case CONN_SETUP_ALLOW_CLASS: 69844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case CONN_SETUP_ALLOW_BDADDR: 69944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann default: 70044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 70144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 70244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 70344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann break; 70444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 70544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 70644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 70744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_pin_type_dump(int level, struct frame *frm) 70844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 70944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_pin_type_cp *cp = frm->ptr; 71044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 71144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 71244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("type %d\n", cp->pin_type); 71344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 71444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 71544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void request_stored_link_key_dump(int level, struct frame *frm) 71644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 71744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_cp *cp = frm->ptr; 71844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann char addr[18]; 71944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 72044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 72144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann ba2str(&cp->bdaddr, addr); 72244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s all %d\n", addr, cp->read_all); 72344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 72444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 72544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void return_link_keys_dump(int level, struct frame *frm) 72644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 72744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann uint8_t num = get_u8(frm); 72844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann uint8_t key[16]; 72944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann char addr[18]; 73044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann int i, n; 73144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 73244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann for (n = 0; n < num; n++) { 73344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann ba2str(frm->ptr, addr); 73444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann memcpy(key, frm->ptr + 6, 16); 73544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 73644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 73744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s key ", addr); 73844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann for (i = 0; i < 16; i++) 73944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("%2.2X", key[i]); 74044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("\n"); 74144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 74244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann frm->ptr += 2; 74344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann frm->len -= 2; 74444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 74544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 74644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 747ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void change_local_name_dump(int level, struct frame *frm) 748ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 749ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann change_local_name_cp *cp = frm->ptr; 750ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char name[249]; 751ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 752ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 753ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memset(name, 0, sizeof(name)); 754ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 248 && cp->name[i]; i++) 755ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (isprint(cp->name[i])) 756ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = cp->name[i]; 757ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann else 758ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = '.'; 759ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 760ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 761ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("name \'%s\'\n", name); 762ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 763ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 764ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_class_of_dev_dump(int level, struct frame *frm) 765ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 766ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_class_of_dev_cp *cp = frm->ptr; 767ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 768ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 769ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("class 0x%2.2x%2.2x%2.2x\n", 770ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]); 771ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 772ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 773ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void write_voice_setting_dump(int level, struct frame *frm) 774ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 775ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_voice_setting_cp *cp = frm->ptr; 776ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 777ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 778ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting)); 779ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 780ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 781fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void write_current_iac_lap_dump(int level, struct frame *frm) 782fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{ 783fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann write_current_iac_lap_cp *cp = frm->ptr; 784fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann int i; 785fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 786fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann for (i = 0; i < cp->num_current_iac; i++) { 787fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann p_indent(level, frm); 788fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]); 789fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) { 790fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann switch (cp->lap[i][0]) { 791fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x00: 792fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (Limited Inquiry Access Code)"); 793fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 794fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x33: 795fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (General Inquiry Access Code)"); 796fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 797fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 798fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 799fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("\n"); 800fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 801fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann} 802fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 80369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void write_scan_enable_dump(int level, struct frame *frm) 80469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{ 80569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t enable = get_u8(frm); 80669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 80769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 80869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("enable %d\n", enable); 80969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann} 81069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 811d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_timeout_dump(int level, struct frame *frm) 812d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 813d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_timeout_cp *cp = frm->ptr; 814d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 815d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 816d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("timeout %d\n", btohs(cp->timeout)); 817d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 818d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 819d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void write_page_activity_dump(int level, struct frame *frm) 820d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 821d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_activity_cp *cp = frm->ptr; 822d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 823d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 824d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window)); 825d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 826d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 827a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void write_inquiry_scan_type_dump(int level, struct frame *frm) 828a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{ 829a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann write_inquiry_scan_type_cp *cp = frm->ptr; 830a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 831a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 832a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("type %d\n", cp->type); 833a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann} 834a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 835f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmannstatic inline void write_inquiry_mode_dump(int level, struct frame *frm) 836f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann{ 837f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann write_inquiry_mode_cp *cp = frm->ptr; 838f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann 839f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann p_indent(level, frm); 840f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann printf("mode %d\n", cp->mode); 841f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann} 842f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann 8436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void write_link_supervision_timeout_dump(int level, struct frame *frm) 8446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 8456eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann write_link_supervision_timeout_cp *cp = frm->ptr; 8466eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 8476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 8486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("handle %d timeout %d\n", 8496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann btohs(cp->handle), btohs(cp->link_sup_to)); 8506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 8516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 8521a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void write_ext_inquiry_response_dump(int level, struct frame *frm) 8531a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{ 8541a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann write_ext_inquiry_response_cp *cp = frm->ptr; 8551a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 8561a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 8571a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("fec 0x%2.2x\n", cp->fec); 8581a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann} 8591a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 8606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void request_transmit_power_level_dump(int level, struct frame *frm) 8616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 8626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_cp *cp = frm->ptr; 8636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 8646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 8656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("handle %d type %d (%s)\n", 8666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann btohs(cp->handle), cp->type, 8676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann cp->type ? "maximum" : "current"); 8686eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 8696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 87017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void request_local_ext_features_dump(int level, struct frame *frm) 87117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 87217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_cp *cp = frm->ptr; 87317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 87417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 87517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("page %d\n", cp->page_num); 87617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 87717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 878f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void request_clock_dump(int level, struct frame *frm) 879f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 880f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_cp *cp = frm->ptr; 881f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 882f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 883f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("handle %d which %d (%s)\n", 884f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann btohs(cp->handle), cp->which_clock, 885f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann cp->which_clock ? "piconet" : "local"); 886f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 887f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 888d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void command_dump(int level, struct frame *frm) 889d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 890d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann hci_command_hdr *hdr = frm->ptr; 891d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(hdr->opcode); 892d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 893d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 894d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 895d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (p_filter(FILT_HCI)) 896d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return; 897d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 898ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 89965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 900803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n", 901d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann opcode2str(opcode), ogf, ocf, hdr->plen); 90265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 90365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->ptr += HCI_COMMAND_HDR_SIZE; 90465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->len -= HCI_COMMAND_HDR_SIZE; 90565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 906be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (ogf == OGF_VENDOR_CMD && ocf == 0 && get_manufacturer() == 10) { 907be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann csr_dump(level + 1, frm); 908be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann return; 909be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 910be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 9114f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 9124f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann raw_dump(level, frm); 9134f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann return; 9144f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann } 9154f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann 916ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ogf) { 917ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_CTL: 918ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 919ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_INQUIRY: 920ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann inquiry_dump(level + 1, frm); 921ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 922ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PERIODIC_INQUIRY: 923ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann periodic_inquiry_dump(level + 1, frm); 924ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 925ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_INQUIRY_CANCEL: 926ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_PERIODIC_INQUIRY: 927ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 928ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CREATE_CONN: 929ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann create_conn_dump(level + 1, frm); 930ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 931ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_DISCONNECT: 932ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann disconnect_dump(level + 1, frm); 933ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 93490480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_CREATE_CONN_CANCEL: 93590480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REMOTE_NAME_REQ_CANCEL: 93690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_ACCEPT_SYNC_CONN_REQ: 93790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann bdaddr_command_dump(level + 1, frm); 93890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann return; 939ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ADD_SCO: 940ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SET_CONN_PTYPE: 941ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann add_sco_dump(level + 1, frm); 942acc2322e0bed89e8ada2564359a1a6d293c9d514Marcel Holtmann return; 943ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ACCEPT_CONN_REQ: 944ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_dump(level + 1, frm); 945ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 946ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_REJECT_CONN_REQ: 94790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REJECT_SYNC_CONN_REQ: 948ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann reject_conn_req_dump(level + 1, frm); 949ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 950ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_REPLY: 951ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_reply_dump(level + 1, frm); 952ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 953ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_REPLY: 954ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_reply_dump(level + 1, frm); 955ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 956ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_NEG_REPLY: 957ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_NEG_REPLY: 958ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_neg_reply_dump(level + 1, frm); 959ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 960ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SET_CONN_ENCRYPT: 961ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann set_conn_encrypt_dump(level + 1, frm); 962ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 963ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_AUTH_REQUESTED: 964ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CHANGE_CONN_LINK_KEY: 965ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_REMOTE_FEATURES: 966ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_REMOTE_VERSION: 967ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_CLOCK_OFFSET: 96890480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_READ_LMP_HANDLE: 96990480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_SETUP_SYNC_CONN: 970ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_command_dump(level + 1, frm); 971ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 97217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_MASTER_LINK_KEY: 97317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_dump(level + 1, frm); 97417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 97517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_REMOTE_EXT_FEATURES: 97617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_dump(level + 1, frm); 97717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 978ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_REMOTE_NAME_REQ: 979ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann remote_name_req_dump(level + 1, frm); 980ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 981ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 982ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 983ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 984ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_POLICY: 985ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 986ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_SNIFF_MODE: 987ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_EXIT_PARK_MODE: 988ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_ROLE_DISCOVERY: 989ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_LINK_POLICY: 990ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_command_dump(level + 1, frm); 991ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_SWITCH_ROLE: 993ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann accept_conn_req_dump(level + 1, frm); 994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_LINK_POLICY: 996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_link_policy_dump(level + 1, frm); 997ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 999ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_HOST_CTL: 1002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 100344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_RESET: 100444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_CREATE_NEW_UNIT_KEY: 100544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 100644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_MASK: 100744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_mask_dump(level + 1, frm); 100844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 100944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_FLT: 101044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann set_event_flt_dump(level + 1, frm); 101144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 101244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_PIN_TYPE: 101344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_pin_type_dump(level + 1, frm); 101444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 101544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_STORED_LINK_KEY: 101644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_DELETE_STORED_LINK_KEY: 101744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann request_stored_link_key_dump(level + 1, frm); 101844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 101944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_STORED_LINK_KEY: 102044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return_link_keys_dump(level + 1, frm); 102144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 1022ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_CHANGE_LOCAL_NAME: 1023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann change_local_name_dump(level + 1, frm); 1024ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1025ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_CLASS_OF_DEV: 1026ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_class_of_dev_dump(level + 1, frm); 1027ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1028ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_VOICE_SETTING: 1029ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann write_voice_setting_dump(level + 1, frm); 1030ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1031fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_CURRENT_IAC_LAP: 1032fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann write_current_iac_lap_dump(level + 1, frm); 1033fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann return; 103469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_SCAN_ENABLE: 103569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_AUTH_ENABLE: 103669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann write_scan_enable_dump(level + 1, frm); 103769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann return; 1038097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_WRITE_CONN_ACCEPT_TIMEOUT: 1039d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_TIMEOUT: 1040d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_timeout_dump(level + 1, frm); 1041d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1042d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_ACTIVITY: 1043d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_INQ_ACTIVITY: 1044d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann write_page_activity_dump(level + 1, frm); 1045d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1046a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_WRITE_INQUIRY_SCAN_TYPE: 1047a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann write_inquiry_scan_type_dump(level + 1, frm); 1048a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann return; 104969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_ENCRYPT_MODE: 1050f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_INQUIRY_MODE: 1051f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_AFH_MODE: 1052f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann write_inquiry_mode_dump(level + 1, frm); 1053f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann return; 10546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_TRANSMIT_POWER_LEVEL: 10556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann request_transmit_power_level_dump(level + 1, frm); 10566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 105744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_FLUSH: 10586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_LINK_SUPERVISION_TIMEOUT: 10596eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann generic_command_dump(level + 1, frm); 10606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 10616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_WRITE_LINK_SUPERVISION_TIMEOUT: 10626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann write_link_supervision_timeout_dump(level + 1, frm); 10636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 10641a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_WRITE_EXT_INQUIRY_RESPONSE: 10651a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann write_ext_inquiry_response_dump(level + 1, frm); 10661a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann return; 1067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1068ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 106917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 107017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OGF_INFO_PARAM: 107117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann switch (ocf) { 107217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_EXT_FEATURES: 107317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann request_local_ext_features_dump(level + 1, frm); 107417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 107517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 1076ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 1077f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1078f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OGF_STATUS_PARAM: 1079f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann switch (ocf) { 1080f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_LINK_QUALITY: 1081f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_RSSI: 1082f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_AFH_MAP: 1083f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann generic_command_dump(level + 1, frm); 1084f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1085f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann case OCF_READ_CLOCK: 1086f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann request_clock_dump(level + 1, frm); 1087f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1088f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1089f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann break; 1090ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1091ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 109265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 109395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 109495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 1095d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void status_response_dump(int level, struct frame *frm) 1096d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1097d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t status = get_u8(frm); 1098d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1099d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1100d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x\n", status); 1101d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1102d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (status > 0) { 1103d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1104d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(status)); 1105d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1106d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1107d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 1108d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1109d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1110afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void handle_response_dump(int level, struct frame *frm) 1111afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{ 1112afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 1113afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1114afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann p_indent(level, frm); 1115afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann printf("handle %d\n", handle); 1116afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1117afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann raw_dump(level, frm); 1118afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann} 1119afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1120ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void bdaddr_response_dump(int level, struct frame *frm) 1121ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1122ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint8_t status = get_u8(frm); 1123ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_t *bdaddr = frm->ptr; 1124ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 1125ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1126ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann frm->ptr += sizeof(bdaddr_t); 1127ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann frm->len -= sizeof(bdaddr_t); 1128ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1129ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1130ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(bdaddr, addr); 1131ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x bdaddr %s\n", status, addr); 1132ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1133ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (status > 0) { 1134ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1135ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(status)); 1136ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1137ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1138ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 1139ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1140ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1141d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void generic_response_dump(int level, struct frame *frm) 1142d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1143d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t status = get_u8(frm); 1144d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t handle = btohs(htons(get_u16(frm))); 1145d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1146d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1147d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d\n", status, handle); 1148d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1149d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (status > 0) { 1150d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1151d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(status)); 1152d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1153d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1154d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 1155d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1156d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 115744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_pin_type_dump(int level, struct frame *frm) 115844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 115944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_pin_type_rp *rp = frm->ptr; 116044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 116144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 116244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x type %d\n", rp->status, rp->pin_type); 116344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 116444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 116544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 116644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 116744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 116844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 116944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 117044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void read_stored_link_key_dump(int level, struct frame *frm) 117144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 117244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_rp *rp = frm->ptr; 117344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 117444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 117544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x max %d num %d\n", 117644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann rp->status, rp->max_keys, rp->num_keys); 117744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 117844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 117944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 118044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 118144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 118244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 118344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 118444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void write_stored_link_key_dump(int level, struct frame *frm) 118544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 118644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_stored_link_key_rp *rp = frm->ptr; 118744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 118844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 118944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x written %d\n", rp->status, rp->num_keys); 119044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 119144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 119244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 119344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 119444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 119544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 119644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 119744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmannstatic inline void delete_stored_link_key_dump(int level, struct frame *frm) 119844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann{ 119944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann delete_stored_link_key_rp *rp = frm->ptr; 120044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 120144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 120244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("status 0x%2.2x deleted %d\n", rp->status, btohs(rp->num_keys)); 120344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 120444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann if (rp->status > 0) { 120544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann p_indent(level, frm); 120644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 120744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann } 120844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann} 120944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann 1210ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_name_dump(int level, struct frame *frm) 1211ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1212ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_name_rp *rp = frm->ptr; 1213ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char name[249]; 1214ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1215ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1216ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann memset(name, 0, sizeof(name)); 1217ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 248 && rp->name[i]; i++) 1218ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (isprint(rp->name[i])) 1219ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = rp->name[i]; 1220ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann else 1221ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann name[i] = '.'; 1222ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1223ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1224ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x name \'%s\'\n", rp->status, name); 1225ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1226ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1227ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1228ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1229ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1230ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1231ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1232ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_class_of_dev_dump(int level, struct frame *frm) 1233ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1234ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_class_of_dev_rp *rp = frm->ptr; 1235ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1236ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1237ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status, 1238ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]); 1239ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1240ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1241ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1242ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1243ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1244ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1245ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1246ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_voice_setting_dump(int level, struct frame *frm) 1247ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1248ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_voice_setting_rp *rp = frm->ptr; 1249ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1250ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1251ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x voice setting 0x%4.4x\n", 1252ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann rp->status, btohs(rp->voice_setting)); 1253ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1254ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1255ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1256ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1257ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1258ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1259ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1260fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmannstatic inline void read_current_iac_lap_dump(int level, struct frame *frm) 1261fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann{ 1262fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann read_current_iac_lap_rp *rp = frm->ptr; 1263fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann int i; 1264fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 1265fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann for (i = 0; i < rp->num_current_iac; i++) { 1266fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann p_indent(level, frm); 1267fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("IAC 0x%2.2x%2.2x%2.2x", rp->lap[i][2], rp->lap[i][1], rp->lap[i][0]); 1268fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann if (rp->lap[i][2] == 0x9e && rp->lap[i][1] == 0x8b) { 1269fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann switch (rp->lap[i][0]) { 1270fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x00: 1271fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (Limited Inquiry Access Code)"); 1272fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 1273fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case 0x33: 1274fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf(" (General Inquiry Access Code)"); 1275fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann break; 1276fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1277fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1278fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann printf("\n"); 1279fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann } 1280fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann} 1281fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann 128269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmannstatic inline void read_scan_enable_dump(int level, struct frame *frm) 128369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann{ 128469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t status = get_u8(frm); 128569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann uint8_t enable = get_u8(frm); 128669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 128769ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 128869ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("status 0x%2.2x enable %d\n", status, enable); 128969ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 129069ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann if (status > 0) { 129169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann p_indent(level, frm); 129269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann printf("Error: %s\n", status2str(status)); 129369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann } 129469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann} 129569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann 1296d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_timeout_dump(int level, struct frame *frm) 1297d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 1298d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_timeout_rp *rp = frm->ptr; 1299d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1300d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1301d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("status 0x%2.2x timeout %d\n", rp->status, btohs(rp->timeout)); 1302d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1303d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann if (rp->status > 0) { 1304d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1305d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1306d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann } 1307d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 1308d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1309d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmannstatic inline void read_page_activity_dump(int level, struct frame *frm) 1310d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann{ 1311d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_activity_rp *rp = frm->ptr; 1312d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1313d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1314d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("status 0x%2.2x interval %d window %d\n", 1315d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann rp->status, btohs(rp->interval), btohs(rp->window)); 1316d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1317d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann if (rp->status > 0) { 1318d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann p_indent(level, frm); 1319d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1320d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann } 1321d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann} 1322d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann 1323a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmannstatic inline void read_inquiry_scan_type_dump(int level, struct frame *frm) 1324a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann{ 1325a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann read_inquiry_scan_type_rp *rp = frm->ptr; 1326a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 1327a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 1328a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("status 0x%2.2x type %d\n", rp->status, rp->type); 1329a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 1330a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann if (rp->status > 0) { 1331a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann p_indent(level, frm); 1332a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1333a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann } 1334a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann} 1335a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann 13366eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_inquiry_mode_dump(int level, struct frame *frm) 13376eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 13386eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_inquiry_mode_rp *rp = frm->ptr; 13396eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13406eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 13416eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x mode %d\n", rp->status, rp->mode); 13426eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13436eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 13446eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 13456eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 13466eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 13476eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 13486eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13496eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_link_supervision_timeout_dump(int level, struct frame *frm) 13506eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 13516eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_link_supervision_timeout_rp *rp = frm->ptr; 13526eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13536eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 13546eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x handle %d timeout %d\n", 13556eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann rp->status, btohs(rp->handle), btohs(rp->link_sup_to)); 13566eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13576eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 13586eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 13596eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 13606eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 13616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 13626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmannstatic inline void read_transmit_power_level_dump(int level, struct frame *frm) 13646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann{ 13656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_rp *rp = frm->ptr; 13666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13676eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 13686eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("status 0x%2.2x handle %d level %d\n", 13696eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann rp->status, btohs(rp->handle), rp->level); 13706eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann if (rp->status > 0) { 13726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann p_indent(level, frm); 13736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 13746eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann } 13756eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann} 13766eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann 13771a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmannstatic inline void read_ext_inquiry_response_dump(int level, struct frame *frm) 13781a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann{ 13791a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann read_ext_inquiry_response_rp *rp = frm->ptr; 13801a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 13811a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 13821a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("status 0x%2.2x fec 0x%2.2x\n", rp->status, rp->fec); 13831a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 13841a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann if (rp->status > 0) { 13851a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann p_indent(level, frm); 13861a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 13871a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann } 13881a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann} 13891a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann 1390ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_version_dump(int level, struct frame *frm) 1391ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1392ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_version_rp *rp = frm->ptr; 1393ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t manufacturer = btohs(rp->manufacturer); 1394ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1395ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1396ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1397ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1398ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1399ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1400ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1401ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1402ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 14031a5f2bff835728b9df12114adf87c704a1e9b6b8Marcel Holtmann printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n", 1404ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann hci_vertostr(rp->hci_ver), rp->hci_ver, 1405ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(rp->hci_rev)); 1406ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1407ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n", 1408ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann lmp_vertostr(rp->lmp_ver), rp->lmp_ver, 1409ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(rp->lmp_subver)); 1410ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1411ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Manufacturer: %s (%d)\n", 1412ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bt_compidtostr(manufacturer), manufacturer); 1413ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1414ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1415ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 141617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_commands_dump(int level, struct frame *frm) 141717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 141817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_commands_rp *rp = frm->ptr; 141917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i, max = 0; 142017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 142117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 142217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 142317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 142417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->status > 0) { 142517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 142617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 142717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 142817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 64; i++) 142917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->commands[i]) 143017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann max = i + 1; 143117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 143217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Commands: "); 143317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < (max > 32 ? 32 : max); i++) 143417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("%2.2x", rp->commands[i]); 143517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 143617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (max > 32) { 143717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 143817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" "); 143917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 32; i < max; i++) 144017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("%2.2x", rp->commands[i]); 144117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 144217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 144317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 144417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 144517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1446ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_local_features_dump(int level, struct frame *frm) 1447ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1448ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_features_rp *rp = frm->ptr; 1449ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1450ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1451ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1452ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1453ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1454ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1455ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1456ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1457ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1458ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1459ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Features:"); 1460ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 8; i++) 1461ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf(" 0x%2.2x", rp->features[i]); 1462ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 1463ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1464ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1465ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 146617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_local_ext_features_dump(int level, struct frame *frm) 146717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 146817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_rp *rp = frm->ptr; 146917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i; 147017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 147117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 147217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x page %d max %d\n", 147317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann rp->status, rp->page_num, rp->max_page_num); 147417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 147517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (rp->status > 0) { 147617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 147717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 147817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 147917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 148017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Features:"); 148117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 8; i++) 148217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" 0x%2.2x", rp->features[i]); 148317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 148417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 148517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 148617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1487ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_buffer_size_dump(int level, struct frame *frm) 1488ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1489ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_buffer_size_rp *rp = frm->ptr; 1490ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1491ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1492ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x\n", rp->status); 1493ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1494ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (rp->status > 0) { 1495ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1496ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1497ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1498ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1499ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("ACL MTU %d:%d SCO MTU %d:%d\n", 1500ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(rp->acl_mtu), btohs(rp->acl_max_pkt), 1501ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann rp->sco_mtu, btohs(rp->sco_max_pkt)); 1502ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1503ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1504ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1505f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_link_quality_dump(int level, struct frame *frm) 1506f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1507f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_link_quality_rp *rp = frm->ptr; 1508f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1509f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1510f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d lq %d\n", 1511f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann rp->status, btohs(rp->handle), rp->link_quality); 1512f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1513f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1514f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1515f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1516f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1517f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1518f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1519f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_rssi_dump(int level, struct frame *frm) 1520f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1521f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_rssi_rp *rp = frm->ptr; 1522f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1523f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1524f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d rssi %d\n", 1525f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann rp->status, btohs(rp->handle), rp->rssi); 1526f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1527f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1528f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1529f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1530f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1531f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1532f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1533f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_afh_map_dump(int level, struct frame *frm) 1534f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1535f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_afh_map_rp *rp = frm->ptr; 1536f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann int i; 1537f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1538f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1539f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d mode %d\n", 1540f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann rp->status, btohs(rp->handle), rp->mode); 1541f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1542f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1543f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1544f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1545f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } else { 1546f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1547f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("AFH map: 0x"); 1548f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann for (i = 0; i < 10; i++) 1549f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("%2.2x", rp->map[i]); 1550f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("\n"); 1551f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1552f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1553f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1554f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmannstatic inline void read_clock_dump(int level, struct frame *frm) 1555f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann{ 1556f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_rp *rp = frm->ptr; 1557f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1558f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1559f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n", 1560f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann rp->status, btohs(rp->handle), 1561f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann btohl(rp->clock), btohs(rp->accuracy)); 1562f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1563f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann if (rp->status > 0) { 1564f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann p_indent(level, frm); 1565f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann printf("Error: %s\n", status2str(rp->status)); 1566f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann } 1567f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann} 1568f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann 1569d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_complete_dump(int level, struct frame *frm) 1570d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1571d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_cmd_complete *evt = frm->ptr; 1572d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(evt->opcode); 1573d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ogf = cmd_opcode_ogf(opcode); 1574d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t ocf = cmd_opcode_ocf(opcode); 1575d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1576d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1577d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n", 1578d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann opcode2str(opcode), ogf, ocf, evt->ncmd); 1579d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1580d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->ptr += EVT_CMD_COMPLETE_SIZE; 1581d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->len -= EVT_CMD_COMPLETE_SIZE; 1582d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 15834f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 15844f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann raw_dump(level, frm); 15854f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann return; 15864f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann } 15874f25b38c95c6ef0d89af93fe385023bc627747adMarcel Holtmann 1588d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ogf) { 1589ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_CTL: 1590ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 159117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_INQUIRY_CANCEL: 159217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_PERIODIC_INQUIRY: 159317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_EXIT_PERIODIC_INQUIRY: 159417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann status_response_dump(level, frm); 159517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 159690480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_CREATE_CONN_CANCEL: 159790480219be366c65e68ae8612de7a361027e751aMarcel Holtmann case OCF_REMOTE_NAME_REQ_CANCEL: 1598ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_REPLY: 1599ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_REPLY: 1600ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_PIN_CODE_NEG_REPLY: 1601ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_LINK_KEY_NEG_REPLY: 1602ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_response_dump(level, frm); 1603ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1604ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 160517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1606ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1607ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OGF_LINK_POLICY: 1608ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann switch (ocf) { 1609ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_WRITE_LINK_POLICY: 1610ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann generic_response_dump(level, frm); 1611ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1612ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 161317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1614ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1615d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_HOST_CTL: 1616d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 161744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_PIN_TYPE: 161844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_pin_type_dump(level, frm); 161944ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 162044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_READ_STORED_LINK_KEY: 162144ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann read_stored_link_key_dump(level, frm); 162244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 162344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_STORED_LINK_KEY: 162444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann write_stored_link_key_dump(level, frm); 162544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 162644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_DELETE_STORED_LINK_KEY: 162744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann delete_stored_link_key_dump(level, frm); 162844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann return; 1629d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_NAME: 1630ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_name_dump(level, frm); 1631ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1632ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_CLASS_OF_DEV: 1633ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_class_of_dev_dump(level, frm); 1634ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1635ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case OCF_READ_VOICE_SETTING: 1636ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_voice_setting_dump(level, frm); 1637ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1638fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_READ_CURRENT_IAC_LAP: 1639fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann read_current_iac_lap_dump(level, frm); 1640fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann return; 164169ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_SCAN_ENABLE: 164269ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_AUTH_ENABLE: 164369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann read_scan_enable_dump(level, frm); 164469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann return; 1645097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_READ_CONN_ACCEPT_TIMEOUT: 1646d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_PAGE_TIMEOUT: 1647d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_timeout_dump(level, frm); 1648d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1649d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_PAGE_ACTIVITY: 1650d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_READ_INQ_ACTIVITY: 1651d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann read_page_activity_dump(level, frm); 1652d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann return; 1653a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_READ_INQUIRY_SCAN_TYPE: 1654a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann read_inquiry_scan_type_dump(level, frm); 1655a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann return; 165669ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_READ_ENCRYPT_MODE: 1657f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_READ_INQUIRY_MODE: 1658f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_READ_AFH_MODE: 1659f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann read_inquiry_mode_dump(level, frm); 1660f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann return; 16616eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_LINK_SUPERVISION_TIMEOUT: 16626eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_link_supervision_timeout_dump(level, frm); 16636eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 16646eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_READ_TRANSMIT_POWER_LEVEL: 16656eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann read_transmit_power_level_dump(level, frm); 16666eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 16671a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_READ_EXT_INQUIRY_RESPONSE: 16681a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann read_ext_inquiry_response_dump(level, frm); 16691a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann return; 167044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_FLUSH: 16716eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann case OCF_WRITE_LINK_SUPERVISION_TIMEOUT: 16726eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann generic_response_dump(level, frm); 16736eb2fe8fbd65261409f7fb3bffd7fee2c2e59471Marcel Holtmann return; 167444ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_RESET: 167544ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_MASK: 167644ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_SET_EVENT_FLT: 167744ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_WRITE_PIN_TYPE: 167844ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann case OCF_CREATE_NEW_UNIT_KEY: 16791577526370e596583b15d68940c24e975e62a502Marcel Holtmann case OCF_CHANGE_LOCAL_NAME: 1680f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_CLASS_OF_DEV: 1681f78da84489a5505c3fd7dc82e12440791c67d75fMarcel Holtmann case OCF_WRITE_VOICE_SETTING: 1682fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_CURRENT_IAC_LAP: 168369ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_SCAN_ENABLE: 168469ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_AUTH_ENABLE: 168569ba8ac696c4c302ba555b4521f5a62deff9861aMarcel Holtmann case OCF_WRITE_ENCRYPT_MODE: 1686097e546707e1f6ce7a2339f8f9348a840e9617b3Marcel Holtmann case OCF_WRITE_CONN_ACCEPT_TIMEOUT: 1687d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_TIMEOUT: 1688d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_PAGE_ACTIVITY: 1689d4276e6224edc7bf6ba0a5453d4ece24160690cbMarcel Holtmann case OCF_WRITE_INQ_ACTIVITY: 1690a781bd700183ce0ddce9010ce3314ef96c87b929Marcel Holtmann case OCF_WRITE_INQUIRY_SCAN_TYPE: 1691fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_INQUIRY_MODE: 1692fb1bd2e479aa5f4031d8f6704b392c34eb241e91Marcel Holtmann case OCF_WRITE_AFH_MODE: 1693d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_SET_AFH_CLASSIFICATION: 16941a750e04b93ee975b43108852a3e6ecb1326fe5aMarcel Holtmann case OCF_WRITE_EXT_INQUIRY_RESPONSE: 1695d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann status_response_dump(level, frm); 1696ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1697d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 169817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1699d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1700d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_INFO_PARAM: 1701d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 1702d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_VERSION: 1703ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_version_dump(level, frm); 1704ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 170517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_COMMANDS: 170617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_commands_dump(level, frm); 170717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1708d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LOCAL_FEATURES: 1709ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_local_features_dump(level, frm); 1710ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 171117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case OCF_READ_LOCAL_EXT_FEATURES: 171217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_local_ext_features_dump(level, frm); 171317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann return; 1714d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_BUFFER_SIZE: 1715ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_buffer_size_dump(level, frm); 1716ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1717d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_BD_ADDR: 1718ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bdaddr_response_dump(level, frm); 1719ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1720d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 172117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1722d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1723d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OGF_STATUS_PARAM: 1724d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (ocf) { 1725d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_FAILED_CONTACT_COUNTER: 1726d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_RESET_FAILED_CONTACT_COUNTER: 1727f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann status_response_dump(level, frm); 1728f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1729d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_LINK_QUALITY: 1730f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_link_quality_dump(level, frm); 1731f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1732d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_RSSI: 1733f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_rssi_dump(level, frm); 1734f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1735d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_AFH_MAP: 1736f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_afh_map_dump(level, frm); 1737f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann return; 1738d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case OCF_READ_CLOCK: 1739f14ea6555d5ccd5ffee3564c0eaaaa304024c83fMarcel Holtmann read_clock_dump(level, frm); 1740ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann return; 1741d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 174217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 1743d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1744ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1745ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann raw_dump(level, frm); 1746d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1747d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1748d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void cmd_status_dump(int level, struct frame *frm) 1749d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1750d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_cmd_status *evt = frm->ptr; 1751d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint16_t opcode = btohs(evt->opcode); 1752d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1753d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1754d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n", 1755d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann opcode2str(opcode), 1756d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd_opcode_ogf(opcode), cmd_opcode_ocf(opcode), 1757d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt->status, evt->ncmd); 1758d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1759d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1760d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1761d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1762d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1763d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1764d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1765afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmannstatic inline void hardware_error_dump(int level, struct frame *frm) 1766afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann{ 1767afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann evt_hardware_error *evt = frm->ptr; 1768afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1769afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann p_indent(level, frm); 1770afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann printf("code %d\n", evt->code); 1771afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann} 1772afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann 1773d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_dump(int level, struct frame *frm) 1774d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1775d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t num = get_u8(frm); 1776b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann char addr[18]; 1777d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 1778d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1779d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann for (i = 0; i < num; i++) { 1780d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inquiry_info *info = frm->ptr; 1781d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1782d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann ba2str(&info->bdaddr, addr); 1783d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1784d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 178572e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x\n", 178672e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 178772e332140c186ebca02d7744f4264cfd0718201aMarcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0]); 1788d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1789d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->ptr += INQUIRY_INFO_SIZE; 1790d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann frm->len -= INQUIRY_INFO_SIZE; 1791d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1792d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1793d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1794d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_complete_dump(int level, struct frame *frm) 1795d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1796d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_conn_complete *evt = frm->ptr; 1797d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18]; 1798d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1799d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann ba2str(&evt->bdaddr, addr); 1800d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1801d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1802d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n", 1803d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt->status, btohs(evt->handle), addr, 1804d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode); 1805d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1806d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1807d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1808d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1809d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1810d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1811d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1812d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void conn_request_dump(int level, struct frame *frm) 1813d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1814d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_conn_request *evt = frm->ptr; 1815d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18]; 1816d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1817d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann ba2str(&evt->bdaddr, addr); 1818d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1819d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1820d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n", 1821d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann addr, evt->dev_class[2], evt->dev_class[1], 1822d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO"); 1823d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1824d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1825d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void disconn_complete_dump(int level, struct frame *frm) 1826d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1827d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_disconn_complete *evt = frm->ptr; 1828d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1829d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1830d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d reason 0x%2.2x\n", 1831d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt->status, btohs(evt->handle), evt->reason); 1832d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1833d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1834d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1835d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1836d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } else if (evt->reason > 0) { 1837d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1838d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Reason: %s\n", status2str(evt->reason)); 1839d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1840d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1841d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1842d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void remote_name_req_complete_dump(int level, struct frame *frm) 1843d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1844d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_remote_name_req_complete *evt = frm->ptr; 1845d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann char addr[18], name[249]; 1846d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 1847d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1848d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann ba2str(&evt->bdaddr, addr); 1849d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1850d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann memset(name, 0, sizeof(name)); 1851d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann for (i = 0; i < 248 && evt->name[i]; i++) 1852d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (isprint(evt->name[i])) 1853d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann name[i] = evt->name[i]; 1854d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann else 1855d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann name[i] = '.'; 1856d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1857d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1858d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x bdaddr %s name '%s'\n", evt->status, addr, name); 1859d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1860d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1861d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1862d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1863d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1864d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1865d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 186617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void master_link_key_complete_dump(int level, struct frame *frm) 186717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 186817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt_master_link_key_complete *evt = frm->ptr; 186917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 187017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 187117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x handle %d flag %d\n", 187217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt->status, btohs(evt->handle), evt->key_flag); 187317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 187417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (evt->status > 0) { 187517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 187617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 187717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 187817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 187917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 1880d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void encrypt_change_dump(int level, struct frame *frm) 1881d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 1882d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt_encrypt_change *evt = frm->ptr; 1883d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1884d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1885d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n", 1886d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann evt->status, btohs(evt->handle), evt->encrypt); 1887d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1888d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (evt->status > 0) { 1889d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann p_indent(level, frm); 1890d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1891d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 1892d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 1893d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 1894ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_features_complete_dump(int level, struct frame *frm) 1895ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1896ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_remote_features_complete *evt = frm->ptr; 1897ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1898ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1899ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1900ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 1901ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1902ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 1903ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1904ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1905ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1906ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1907ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Features:"); 1908ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 8; i++) 1909ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf(" 0x%2.2x", evt->features[i]); 1910ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("\n"); 1911ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1912ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1913ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1914ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_remote_version_complete_dump(int level, struct frame *frm) 1915ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1916ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_remote_version_complete *evt = frm->ptr; 1917ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t manufacturer = btohs(evt->manufacturer); 1918ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1919ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1920ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle)); 1921ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1922ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 1923ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1924ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1925ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1926ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1927ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n", 1928ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann lmp_vertostr(evt->lmp_ver), evt->lmp_ver, 1929ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann btohs(evt->lmp_subver)); 1930ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1931ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Manufacturer: %s (%d)\n", 1932ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann bt_compidtostr(manufacturer), manufacturer); 1933ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1934ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1935ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 193611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void qos_setup_complete_dump(int level, struct frame *frm) 193711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 193811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_qos_setup_complete *evt = frm->ptr; 193911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 194011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 194111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("status 0x%2.2x handle %d flags %d\n", 194211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt->status, btohs(evt->handle), evt->flags); 194311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 194411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann if (evt->status > 0) { 194511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 194611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Error: %s\n", status2str(evt->status)); 194711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann } else { 194811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 194911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Service type: %d\n", evt->qos.service_type); 195011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 195111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Token rate: %d\n", btohl(evt->qos.token_rate)); 195211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 195311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); 195411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 195511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Latency: %d\n", btohl(evt->qos.latency)); 195611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 195711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); 195811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann } 195911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 196011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 1961ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void role_change_dump(int level, struct frame *frm) 1962ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1963ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_role_change *evt = frm->ptr; 1964ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 1965ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1966ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1967ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&evt->bdaddr, addr); 1968ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n", 1969ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, addr, evt->role); 1970ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1971ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 1972ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1973ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 1974ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 1975ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 1976ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Role: %s\n", role2str(evt->role)); 1977ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1978ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1979ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1980ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void num_comp_pkts_dump(int level, struct frame *frm) 1981ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1982ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint8_t num = get_u8(frm); 19832374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann uint16_t handle, packets; 1984ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 1985ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1986ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < num; i++) { 19872374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann handle = btohs(htons(get_u16(frm))); 19882374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann packets = btohs(htons(get_u16(frm))); 19892374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann 19902374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann p_indent(level, frm); 19912374dcc283f6d12aefa7eb59dc17758a2580837bMarcel Holtmann printf("handle %d packets %d\n", handle, packets); 1992ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 1993ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 1994ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1995ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void mode_change_dump(int level, struct frame *frm) 1996ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 1997ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_mode_change *evt = frm->ptr; 1998ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 1999ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2000ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n", 2001ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval)); 2002ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2003ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2004ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2005ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2006ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2007ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2008ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Mode: %s\n", mode2str(evt->mode)); 2009ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2010ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2011ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2012ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void pin_code_req_dump(int level, struct frame *frm) 2013ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2014ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_pin_code_req *evt = frm->ptr; 2015ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2016ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2017ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2018ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&evt->bdaddr, addr); 2019ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("bdaddr %s\n", addr); 2020ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2021ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2022ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void link_key_notify_dump(int level, struct frame *frm) 2023ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2024ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_link_key_notify *evt = frm->ptr; 2025ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char addr[18]; 2026ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann int i; 2027ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2028ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2029ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann ba2str(&evt->bdaddr, addr); 203044ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("bdaddr %s key ", addr); 2031ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann for (i = 0; i < 16; i++) 203244ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf("%2.2X", evt->link_key[i]); 203344ae5fbcbf615898849e30305d565d45bb3b768bMarcel Holtmann printf(" type %d\n", evt->key_type); 2034ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2035ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 203611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void max_slots_change_dump(int level, struct frame *frm) 203711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 203811c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_max_slots_change *evt = frm->ptr; 203911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 204011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 204111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots); 204211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 204311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 2044c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmannstatic inline void data_buffer_overflow_dump(int level, struct frame *frm) 2045c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann{ 2046c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann evt_data_buffer_overflow *evt = frm->ptr; 2047c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann 2048c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann p_indent(level, frm); 2049c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO"); 2050c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann} 2051c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann 2052ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void read_clock_offset_complete_dump(int level, struct frame *frm) 2053ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2054ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_read_clock_offset_complete *evt = frm->ptr; 2055ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2056ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2057ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n", 2058ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, btohs(evt->handle), btohs(evt->clock_offset)); 2059ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2060ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2061ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2062ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2063ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2064ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2065ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2066ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmannstatic inline void conn_ptype_changed_dump(int level, struct frame *frm) 2067ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann{ 2068ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt_conn_ptype_changed *evt = frm->ptr; 2069ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann uint16_t ptype = btohs(evt->ptype); 2070ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann char *str; 2071ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2072ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2073ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("status 0x%2.2x handle %d ptype 0x%4.4x\n", 2074ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann evt->status, btohs(evt->handle), ptype); 2075ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 2076ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (evt->status > 0) { 2077ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2078ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2079ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } else { 2080ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann str = hci_ptypetostr(ptype); 2081ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann if (str) { 2082ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann p_indent(level, frm); 2083ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann printf("Packet type: %s\n", str); 2084ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann free(str); 2085ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2086ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann } 2087ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann} 2088ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann 208911c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmannstatic inline void pscan_rep_mode_change_dump(int level, struct frame *frm) 209011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann{ 209111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann evt_pscan_rep_mode_change *evt = frm->ptr; 209211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann char addr[18]; 209311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann 209411c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann p_indent(level, frm); 209511c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann ba2str(&evt->bdaddr, addr); 209611c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode); 209711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann} 2098ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2099f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmannstatic inline void flow_spec_complete_dump(int level, struct frame *frm) 2100f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann{ 2101f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann evt_flow_spec_complete *evt = frm->ptr; 2102f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2103f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2104f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("status 0x%2.2x handle %d flags %d %s\n", 2105f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann evt->status, btohs(evt->handle), evt->flags, 2106f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann evt->direction == 0 ? "outgoing" : "incoming"); 2107f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2108f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann if (evt->status > 0) { 2109f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2110f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2111f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann } else { 2112f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2113f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Service type: %d\n", evt->qos.service_type); 2114f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2115f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Token rate: %d\n", btohl(evt->qos.token_rate)); 2116f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2117f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); 2118f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2119f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Latency: %d\n", btohl(evt->qos.latency)); 2120f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann p_indent(level, frm); 2121f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); 2122f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann } 2123f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann} 2124f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann 2125d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmannstatic inline void inq_result_with_rssi_dump(int level, struct frame *frm) 2126d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann{ 2127d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t num = get_u8(frm); 2128b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann char addr[18]; 2129d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann int i; 2130d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2131ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann if (!num) 2132ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann return; 2133d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2134ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) { 2135ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann for (i = 0; i < num; i++) { 2136ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr; 2137d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2138ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann p_indent(level, frm); 2139d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2140ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann ba2str(&info->bdaddr, addr); 2141ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2142ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 2143ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 2144ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2145ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; 2146ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; 2147ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } 2148ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } else { 2149ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann for (i = 0; i < num; i++) { 2150ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann inquiry_info_with_rssi *info = frm->ptr; 2151ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2152ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann p_indent(level, frm); 2153ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2154ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann ba2str(&info->bdaddr, addr); 2155ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2156ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 2157ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 2158ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann 2159ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE; 2160ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE; 2161ee6e41bf8cacd36a0558bf685d34617660a58e90Marcel Holtmann } 2162d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2163d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann} 2164d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 216517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmannstatic inline void read_remote_ext_features_complete_dump(int level, struct frame *frm) 216617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann{ 216717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt_read_remote_ext_features_complete *evt = frm->ptr; 216817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann int i; 216917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 217017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 217117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("status 0x%2.2x handle %d page %d max %d\n", 217217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt->status, btohs(evt->handle), 217317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann evt->page_num, evt->max_page_num); 217417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 217517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann if (evt->status > 0) { 217617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 217717658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 217817658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } else { 217917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann p_indent(level, frm); 218017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("Features:"); 218117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann for (i = 0; i < 8; i++) 218217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf(" 0x%2.2x", evt->features[i]); 218317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann printf("\n"); 218417658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann } 218517658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann} 218617658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann 2187d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_complete_dump(int level, struct frame *frm) 2188d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 2189d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt_sync_conn_complete *evt = frm->ptr; 2190d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann char addr[18]; 2191d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2192d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann ba2str(&evt->bdaddr, addr); 2193d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2194d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2195d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("status 0x%2.2x handle %d bdaddr %s type %s\n", 2196d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt->status, btohs(evt->handle), addr, 2197d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt->link_type == 0 ? "SCO" : "eSCO"); 2198d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2199d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann if (evt->status > 0) { 2200d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2201d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2202d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } else { 2203d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2204d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Air mode: %s\n", airmode2str(evt->air_mode)); 2205d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 2206d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 2207d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2208d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmannstatic inline void sync_conn_changed_dump(int level, struct frame *frm) 2209d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann{ 2210d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt_sync_conn_changed *evt = frm->ptr; 2211d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2212d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2213d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("status 0x%2.2x handle %d\n", 2214d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann evt->status, btohs(evt->handle)); 2215d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2216d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann if (evt->status > 0) { 2217d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann p_indent(level, frm); 2218d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann printf("Error: %s\n", status2str(evt->status)); 2219d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann } 2220d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann} 2221d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann 2222807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmannstatic inline void extended_inq_result_dump(int level, struct frame *frm) 2223807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann{ 2224807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann uint8_t num = get_u8(frm); 2225807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann char addr[18]; 2226807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann int i; 2227807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2228807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann for (i = 0; i < num; i++) { 2229807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann extended_inquiry_info *info = frm->ptr; 2230807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2231807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann ba2str(&info->bdaddr, addr); 2232807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 2233807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann p_indent(level, frm); 223427eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", 2235807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann addr, info->pscan_rep_mode, btohs(info->clock_offset), 223627eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); 223727eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann 223827eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE; 223927eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE; 224027eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann 224127eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann raw_dump(level, frm); 2242807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 224327eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->ptr += EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE; 224427eb1cb2512b886662cab125e53305ca6d779e7fMarcel Holtmann frm->len -= EXTENDED_INQUIRY_INFO_SIZE - INQUIRY_INFO_WITH_RSSI_SIZE; 2245807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann } 2246807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann} 2247807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann 224865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void event_dump(int level, struct frame *frm) 224995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2250174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky hci_event_hdr *hdr = frm->ptr; 2251be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann uint8_t event = hdr->evt; 225265eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 225365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (p_filter(FILT_HCI)) 225465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky return; 225565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2256ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 225795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2258d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (event <= EVENT_NUM) { 2259803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: %s (0x%2.2x) plen %d\n", 2260d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann event_str[hdr->evt], hdr->evt, hdr->plen); 2261be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } else if (hdr->evt == EVT_TESTING) { 2262803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); 2263be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } else if (hdr->evt == EVT_VENDOR) { 2264803752117135528b1adebf0fa045596e188a996dMarcel Holtmann printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); 2265be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (get_manufacturer() == 10) { 2266be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann frm->ptr += HCI_EVENT_HDR_SIZE; 2267be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann frm->len -= HCI_EVENT_HDR_SIZE; 2268be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann csr_dump(level + 1, frm); 2269be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann return; 2270be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 2271be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } else 227266f5420f4bf345b06f5b2f651d505b57afa6628cMax Krasnyansky printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen); 227365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 227465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->ptr += HCI_EVENT_HDR_SIZE; 227565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky frm->len -= HCI_EVENT_HDR_SIZE; 227665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2277be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (event == EVT_CMD_COMPLETE) { 2278be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann evt_cmd_complete *cc = frm->ptr; 2279be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) { 2280be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE; 2281be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann manufacturer = rp->manufacturer; 2282be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 2283be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann } 2284be9be844106d677ec77acee68935bc9e66772123Marcel Holtmann 228525554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann if (event == EVT_DISCONN_COMPLETE) { 228625554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann evt_disconn_complete *evt = frm->ptr; 228725554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann l2cap_clear(btohs(evt->handle)); 228825554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann } 228925554b7695f8c13c5ff4da1305109d2746b28021Marcel Holtmann 2290d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann if (!(parser.flags & DUMP_VERBOSE)) { 2291d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 2292d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann return; 2293d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 2294d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann 2295d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann switch (event) { 2296ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann case EVT_LOOPBACK_COMMAND: 2297ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann command_dump(level + 1, frm); 2298ed75dab3ba0fdb777c1620b3a2a997519c91889aMarcel Holtmann break; 2299d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CMD_COMPLETE: 2300d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd_complete_dump(level + 1, frm); 2301d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2302d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CMD_STATUS: 2303d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann cmd_status_dump(level + 1, frm); 2304d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2305afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann case EVT_HARDWARE_ERROR: 2306afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann hardware_error_dump(level + 1, frm); 2307afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann break; 2308afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann case EVT_FLUSH_OCCURRED: 2309f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann case EVT_QOS_VIOLATION: 2310afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann handle_response_dump(level + 1, frm); 2311afc1d860f072974b6c5f605251f34b3318a4060aMarcel Holtmann break; 2312d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_COMPLETE: 2313d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann status_response_dump(level + 1, frm); 2314d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2315d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_RESULT: 2316d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inq_result_dump(level + 1, frm); 2317d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2318d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CONN_COMPLETE: 2319d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann conn_complete_dump(level + 1, frm); 2320d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2321d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CONN_REQUEST: 2322d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann conn_request_dump(level + 1, frm); 2323d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2324d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_DISCONN_COMPLETE: 2325d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann disconn_complete_dump(level + 1, frm); 2326d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2327d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_AUTH_COMPLETE: 2328d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_CHANGE_CONN_LINK_KEY_COMPLETE: 2329d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann generic_response_dump(level + 1, frm); 2330d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 233117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case EVT_MASTER_LINK_KEY_COMPLETE: 233217658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann master_link_key_complete_dump(level + 1, frm); 233317658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 2334d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_REMOTE_NAME_REQ_COMPLETE: 2335d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann remote_name_req_complete_dump(level + 1, frm); 2336d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2337d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_ENCRYPT_CHANGE: 2338d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann encrypt_change_dump(level + 1, frm); 2339d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2340ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_REMOTE_FEATURES_COMPLETE: 2341ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_remote_features_complete_dump(level + 1, frm); 2342ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2343ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_REMOTE_VERSION_COMPLETE: 2344ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_remote_version_complete_dump(level + 1, frm); 2345ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2346ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_QOS_SETUP_COMPLETE: 234711c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann qos_setup_complete_dump(level + 1, frm); 2348ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2349ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_ROLE_CHANGE: 2350ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann role_change_dump(level + 1, frm); 2351ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2352ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_NUM_COMP_PKTS: 2353ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann num_comp_pkts_dump(level + 1, frm); 2354ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2355ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_MODE_CHANGE: 2356ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann mode_change_dump(level + 1, frm); 2357ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2358b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann case EVT_RETURN_LINK_KEYS: 2359b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann return_link_keys_dump(level + 1, frm); 2360b25b9075df78236f81d8018727dd55708c9ee3edMarcel Holtmann break; 2361ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_PIN_CODE_REQ: 2362ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_LINK_KEY_REQ: 2363ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann pin_code_req_dump(level + 1, frm); 2364ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2365ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_LINK_KEY_NOTIFY: 2366ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann link_key_notify_dump(level + 1, frm); 2367ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2368c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann case EVT_DATA_BUFFER_OVERFLOW: 2369c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann data_buffer_overflow_dump(level + 1, frm); 2370c2441f0f7171f370271ef66592b81c5276576697Marcel Holtmann break; 237111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann case EVT_MAX_SLOTS_CHANGE: 237211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann max_slots_change_dump(level + 1, frm); 237311c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann break; 2374ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_READ_CLOCK_OFFSET_COMPLETE: 2375ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann read_clock_offset_complete_dump(level + 1, frm); 2376ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 2377ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann case EVT_CONN_PTYPE_CHANGED: 2378ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann conn_ptype_changed_dump(level + 1, frm); 2379ee919f458b664daf179fb00548378ad851f89d02Marcel Holtmann break; 238011c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann case EVT_PSCAN_REP_MODE_CHANGE: 238111c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann pscan_rep_mode_change_dump(level + 1, frm); 238211c1fc83f077dc7fda24c5b26e78ea2b0bd2d19fMarcel Holtmann break; 2383f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann case EVT_FLOW_SPEC_COMPLETE: 2384f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann flow_spec_complete_dump(level + 1, frm); 2385f5e58ed78f6328182cbf2dd23c326251492bb945Marcel Holtmann break; 2386d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann case EVT_INQUIRY_RESULT_WITH_RSSI: 2387d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann inq_result_with_rssi_dump(level + 1, frm); 2388d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 238917658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE: 239017658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann read_remote_ext_features_complete_dump(level + 1, frm); 239117658e63399e2e2bba842322a1ccb543a9040cc4Marcel Holtmann break; 2392d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case EVT_SYNC_CONN_COMPLETE: 2393d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann sync_conn_complete_dump(level + 1, frm); 2394d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann break; 2395d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann case EVT_SYNC_CONN_CHANGED: 2396d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann sync_conn_changed_dump(level + 1, frm); 2397d9cfcf1c719f5be05f731d421d664bed00ca5d04Marcel Holtmann break; 2398807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann case EVT_EXTENDED_INQUIRY_RESULT: 2399807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann extended_inq_result_dump(level + 1, frm); 2400807e20593d2c2c0b9475e31f43bec75d2796a2ddMarcel Holtmann break; 2401d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann default: 2402d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann raw_dump(level, frm); 2403d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann break; 2404d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann } 240595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 240695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 240765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyanskystatic inline void acl_dump(int level, struct frame *frm) 240895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2409174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky hci_acl_hdr *hdr = (void *) frm->ptr; 24100d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t handle = btohs(hdr->handle); 24110d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t dlen = btohs(hdr->dlen); 24120d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint8_t flags = acl_flags(handle); 241365eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 241465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (!p_filter(FILT_HCI)) { 2415ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2416d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("ACL data: handle %d flags 0x%2.2x dlen %d\n", 241765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky acl_handle(handle), flags, dlen); 241865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky level++; 241965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky } 2420e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 2421e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann frm->ptr += HCI_ACL_HDR_SIZE; 2422e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann frm->len -= HCI_ACL_HDR_SIZE; 2423f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky frm->flags = flags; 2424f52b57b5f26caf9b8d2a8cc9c01c8f6027a16d1fMax Krasnyansky frm->handle = acl_handle(handle); 242565eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 242665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (parser.filter & ~FILT_HCI) 242765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky l2cap_dump(level, frm); 242865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky else 242965eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 243095e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 243195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2432d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyanskystatic inline void sco_dump(int level, struct frame *frm) 2433d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky{ 2434d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky hci_sco_hdr *hdr = (void *) frm->ptr; 24350d93444945039e6acf74a874053d07fb0114fee7Marcel Holtmann uint16_t handle = btohs(hdr->handle); 2436d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 2437d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky if (!p_filter(FILT_SCO)) { 2438ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2439d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann printf("SCO data: handle %d dlen %d\n", 2440d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky acl_handle(handle), hdr->dlen); 2441d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky level++; 2442d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 2443d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky frm->ptr += HCI_SCO_HDR_SIZE; 2444d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky frm->len -= HCI_SCO_HDR_SIZE; 2445d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky raw_dump(level, frm); 2446d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky } 2447d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky} 2448d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky 2449b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmannstatic inline void vendor_dump(int level, struct frame *frm) 2450b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann{ 2451b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann if (p_filter(FILT_HCI)) 2452b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann return; 2453b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann 245438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann if (frm->dev_id == HCI_DEV_NONE) { 2455a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann uint16_t device = btohs(htons(get_u16(frm))); 245638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann uint16_t type = btohs(htons(get_u16(frm))); 245738acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann uint16_t plen = btohs(htons(get_u16(frm))); 245838acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 245938acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann p_indent(level, frm); 246038acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 2461a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann printf("System %s: device hci%d type 0x%2.2x plen %d\n", 2462a4d60061ed080704f1e1c076d59ac0b03aaa0fd1Marcel Holtmann frm->in ? "event" : "command", device, type, plen); 246338acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 246438acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann raw_dump(level, frm); 246538acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann return; 246638acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann } 246738acf6c4b654265055359f113f5a301115ca0947Marcel Holtmann 2468b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann if (get_manufacturer() == 12) { 2469b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann bpa_dump(level, frm); 2470b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann return; 2471b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann } 2472b87fd61b9db5ae801fd257e1613028e35e9dcae2Marcel Holtmann 2473b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann p_indent(level, frm); 2474b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann printf("Vendor data: len %d\n", frm->len); 2475b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann raw_dump(level, frm); 2476b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann} 2477b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann 2478174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyanskyvoid hci_dump(int level, struct frame *frm) 247995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky{ 2480d56313fb721793c92a1618eeb4d155e8561226b8Marcel Holtmann uint8_t type = *(uint8_t *)frm->ptr; 248195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2482174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky frm->ptr++; frm->len--; 2483e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 248495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky switch (type) { 248595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_COMMAND_PKT: 248665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky command_dump(level, frm); 248795e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 248895e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 248995e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_EVENT_PKT: 249065eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky event_dump(level, frm); 249195e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 249295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 249395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky case HCI_ACLDATA_PKT: 249465eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky acl_dump(level, frm); 249595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 249695e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky 2497d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky case HCI_SCODATA_PKT: 2498d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky sco_dump(level, frm); 2499d467427f3634db7678a6d8e9ff1aecd1b76f66c3Max Krasnyansky break; 2500e918e1383e6e80ba4e4808404999521f984f0b5cMarcel Holtmann 2501b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann case HCI_VENDOR_PKT: 2502b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann vendor_dump(level, frm); 2503b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann break; 2504b1953d7820f5fdbdde4951c7ad4047aa63a31644Marcel Holtmann 250595e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky default: 250665eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky if (p_filter(FILT_HCI)) 250765eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky break; 250865eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky 2509ac107582bff10f3b4c80b2f158ec4281476c2b2fMax Krasnyansky p_indent(level, frm); 2510174f39016a9aa77cda60ee578f535c8c026ef787Max Krasnyansky printf("Unknown: type 0x%2.2x len %d\n", type, frm->len); 251165eccecf5c288b7b1bc8bf985fa59d3dd4ce0cfbMax Krasnyansky raw_dump(level, frm); 251295e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky break; 251395e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky } 251495e558b9f6fd21e1b60b35ea86fcb502f333954aMax Krasnyansky} 2515