Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/next/external/cache/sources/hcitools/monitor/packet.c
Views: 3959
/*1*2* BlueZ - Bluetooth protocol stack for Linux3*4* Copyright (C) 2011-2012 Intel Corporation5* Copyright (C) 2004-2010 Marcel Holtmann <[email protected]>6*7*8* This program is free software; you can redistribute it and/or modify9* it under the terms of the GNU General Public License as published by10* the Free Software Foundation; either version 2 of the License, or11* (at your option) any later version.12*13* This program is distributed in the hope that it will be useful,14* but WITHOUT ANY WARRANTY; without even the implied warranty of15* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the16* GNU General Public License for more details.17*18* You should have received a copy of the GNU General Public License19* along with this program; if not, write to the Free Software20* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA21*22*/2324#ifdef HAVE_CONFIG_H25#include <config.h>26#endif2728#include <stdio.h>29#include <errno.h>30#include <ctype.h>31#include <unistd.h>32#include <stdlib.h>33#include <string.h>34#include <stdbool.h>35#include <inttypes.h>36#include <time.h>37#include <sys/time.h>3839#include <bluetooth/bluetooth.h>40#include <bluetooth/hci.h>41#include <bluetooth/hci_lib.h>4243#include "display.h"44#include "bt.h"45#include "ll.h"46#include "uuid.h"47#include "l2cap.h"48#include "control.h"49#include "btsnoop.h"50#include "vendor.h"51#include "packet.h"5253#define COLOR_INDEX_LABEL COLOR_WHITE54#define COLOR_TIMESTAMP COLOR_YELLOW5556#define COLOR_NEW_INDEX COLOR_GREEN57#define COLOR_DEL_INDEX COLOR_RED5859#define COLOR_HCI_COMMAND COLOR_BLUE60#define COLOR_HCI_COMMAND_UNKNOWN COLOR_WHITE_BG6162#define COLOR_HCI_EVENT COLOR_MAGENTA63#define COLOR_HCI_EVENT_UNKNOWN COLOR_WHITE_BG6465#define COLOR_HCI_ACLDATA COLOR_CYAN66#define COLOR_HCI_SCODATA COLOR_YELLOW6768#define COLOR_UNKNOWN_FEATURE_BIT COLOR_WHITE_BG69#define COLOR_UNKNOWN_EVENT_MASK COLOR_WHITE_BG70#define COLOR_UNKNOWN_LE_STATES COLOR_WHITE_BG71#define COLOR_UNKNOWN_SERVICE_CLASS COLOR_WHITE_BG7273#define COLOR_PHY_PACKET COLOR_BLUE7475static time_t time_offset = ((time_t) -1);76static unsigned long filter_mask = 0;77static bool index_filter = false;78static uint16_t index_number = 0;79static uint16_t index_current = 0;8081#define MAX_CONN 168283struct conn_data {84uint16_t handle;85uint8_t type;86};8788static struct conn_data conn_list[MAX_CONN];8990static void assign_handle(uint16_t handle, uint8_t type)91{92int i;9394for (i = 0; i < MAX_CONN; i++) {95if (conn_list[i].handle == 0x0000) {96conn_list[i].handle = handle;97conn_list[i].type = type;98break;99}100}101}102103static void release_handle(uint16_t handle)104{105int i;106107for (i = 0; i < MAX_CONN; i++) {108if (conn_list[i].handle == handle) {109conn_list[i].handle = 0x0000;110conn_list[i].type = 0x00;111break;112}113}114}115116static uint8_t get_type(uint16_t handle)117{118int i;119120for (i = 0; i < MAX_CONN; i++) {121if (conn_list[i].handle == handle)122return conn_list[i].type;123}124125return 0xff;126}127128void packet_set_filter(unsigned long filter)129{130filter_mask = filter;131}132133void packet_add_filter(unsigned long filter)134{135if (index_filter)136filter &= ~PACKET_FILTER_SHOW_INDEX;137138filter_mask |= filter;139}140141void packet_del_filter(unsigned long filter)142{143filter_mask &= ~filter;144}145146void packet_select_index(uint16_t index)147{148filter_mask &= ~PACKET_FILTER_SHOW_INDEX;149150index_filter = true;151index_number = index;152}153154#define print_space(x) printf("%*c", (x), ' ');155156static void print_packet(struct timeval *tv, uint16_t index, char ident,157const char *color, const char *label,158const char *text, const char *extra)159{160int col = num_columns();161char line[256], ts_str[64];162int n, ts_len = 0, ts_pos = 0, len = 0, pos = 0;163164if (filter_mask & PACKET_FILTER_SHOW_INDEX) {165if (use_color()) {166n = sprintf(ts_str + ts_pos, "%s", COLOR_INDEX_LABEL);167if (n > 0)168ts_pos += n;169}170171n = sprintf(ts_str + ts_pos, " [hci%d]", index);172if (n > 0) {173ts_pos += n;174ts_len += n;175}176}177178if (tv) {179time_t t = tv->tv_sec;180struct tm tm;181182localtime_r(&t, &tm);183184if (use_color()) {185n = sprintf(ts_str + ts_pos, "%s", COLOR_TIMESTAMP);186if (n > 0)187ts_pos += n;188}189190if (filter_mask & PACKET_FILTER_SHOW_DATE) {191n = sprintf(ts_str + ts_pos, " %04d-%02d-%02d",192tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);193if (n > 0) {194ts_pos += n;195ts_len += n;196}197}198199if (filter_mask & PACKET_FILTER_SHOW_TIME) {200n = sprintf(ts_str + ts_pos, " %02d:%02d:%02d.%06lu",201tm.tm_hour, tm.tm_min, tm.tm_sec, tv->tv_usec);202if (n > 0) {203ts_pos += n;204ts_len += n;205}206}207208if (filter_mask & PACKET_FILTER_SHOW_TIME_OFFSET) {209n = sprintf(ts_str + ts_pos, " %lu.%06lu",210tv->tv_sec - time_offset, tv->tv_usec);211if (n > 0) {212ts_pos += n;213ts_len += n;214}215}216}217218if (use_color()) {219n = sprintf(ts_str + ts_pos, "%s", COLOR_OFF);220if (n > 0)221ts_pos += n;222}223224if (use_color()) {225n = sprintf(line + pos, "%s", color);226if (n > 0)227pos += n;228}229230n = sprintf(line + pos, "%c %s", ident, label);231if (n > 0) {232pos += n;233len += n;234}235236if (text) {237int extra_len = extra ? strlen(extra) : 0;238int max_len = col - len - extra_len - ts_len - 3;239240n = snprintf(line + pos, max_len + 1, ": %s", text);241if (n > max_len) {242line[pos + max_len - 1] = '.';243line[pos + max_len - 2] = '.';244if (line[pos + max_len - 3] == ' ')245line[pos + max_len - 3] = '.';246247n = max_len;248}249250if (n > 0) {251pos += n;252len += n;253}254}255256if (use_color()) {257n = sprintf(line + pos, "%s", COLOR_OFF);258if (n > 0)259pos += n;260}261262if (extra) {263n = sprintf(line + pos, " %s", extra);264if (n > 0) {265pos += n;266len += n;267}268}269270if (ts_len > 0) {271printf("%s", line);272if (len < col)273print_space(col - len - ts_len - 1);274printf("%s%s\n", use_color() ? COLOR_TIMESTAMP : "", ts_str);275} else276printf("%s\n", line);277}278279static const struct {280uint8_t error;281const char *str;282} error2str_table[] = {283{ 0x00, "Success" },284{ 0x01, "Unknown HCI Command" },285{ 0x02, "Unknown Connection Identifier" },286{ 0x03, "Hardware Failure" },287{ 0x04, "Page Timeout" },288{ 0x05, "Authentication Failure" },289{ 0x06, "PIN or Key Missing" },290{ 0x07, "Memory Capacity Exceeded" },291{ 0x08, "Connection Timeout" },292{ 0x09, "Connection Limit Exceeded" },293{ 0x0a, "Synchronous Connection Limit to a Device Exceeded" },294{ 0x0b, "ACL Connection Already Exists" },295{ 0x0c, "Command Disallowed" },296{ 0x0d, "Connection Rejected due to Limited Resources" },297{ 0x0e, "Connection Rejected due to Security Reasons" },298{ 0x0f, "Connection Rejected due to Unacceptable BD_ADDR" },299{ 0x10, "Connection Accept Timeout Exceeded" },300{ 0x11, "Unsupported Feature or Parameter Value" },301{ 0x12, "Invalid HCI Command Parameters" },302{ 0x13, "Remote User Terminated Connection" },303{ 0x14, "Remote Device Terminated due to Low Resources" },304{ 0x15, "Remote Device Terminated due to Power Off" },305{ 0x16, "Connection Terminated By Local Host" },306{ 0x17, "Repeated Attempts" },307{ 0x18, "Pairing Not Allowed" },308{ 0x19, "Unknown LMP PDU" },309{ 0x1a, "Unsupported Remote Feature / Unsupported LMP Feature" },310{ 0x1b, "SCO Offset Rejected" },311{ 0x1c, "SCO Interval Rejected" },312{ 0x1d, "SCO Air Mode Rejected" },313{ 0x1e, "Invalid LMP Parameters" },314{ 0x1f, "Unspecified Error" },315{ 0x20, "Unsupported LMP Parameter Value" },316{ 0x21, "Role Change Not Allowed" },317{ 0x22, "LMP Response Timeout / LL Response Timeout" },318{ 0x23, "LMP Error Transaction Collision" },319{ 0x24, "LMP PDU Not Allowed" },320{ 0x25, "Encryption Mode Not Acceptable" },321{ 0x26, "Link Key cannot be Changed" },322{ 0x27, "Requested QoS Not Supported" },323{ 0x28, "Instant Passed" },324{ 0x29, "Pairing With Unit Key Not Supported" },325{ 0x2a, "Different Transaction Collision" },326{ 0x2b, "Reserved" },327{ 0x2c, "QoS Unacceptable Parameter" },328{ 0x2d, "QoS Rejected" },329{ 0x2e, "Channel Classification Not Supported" },330{ 0x2f, "Insufficient Security" },331{ 0x30, "Parameter Out Of Manadatory Range" },332{ 0x31, "Reserved" },333{ 0x32, "Role Switch Pending" },334{ 0x33, "Reserved" },335{ 0x34, "Reserved Slot Violation" },336{ 0x35, "Role Switch Failed" },337{ 0x36, "Extended Inquiry Response Too Large" },338{ 0x37, "Secure Simple Pairing Not Supported By Host" },339{ 0x38, "Host Busy - Pairing" },340{ 0x39, "Connection Rejected due to No Suitable Channel Found" },341{ 0x3a, "Controller Busy" },342{ 0x3b, "Unacceptable Connection Interval" },343{ 0x3c, "Directed Advertising Timeout" },344{ 0x3d, "Connection Terminated due to MIC Failure" },345{ 0x3e, "Connection Failed to be Established" },346{ 0x3f, "MAC Connection Failed" },347{ }348};349350static void print_error(const char *label, uint8_t error)351{352const char *str = "Unknown";353const char *color_on, *color_off;354int i;355356for (i = 0; error2str_table[i].str; i++) {357if (error2str_table[i].error == error) {358str = error2str_table[i].str;359break;360}361}362363if (use_color()) {364if (error)365color_on = COLOR_RED;366else367color_on = COLOR_GREEN;368color_off = COLOR_OFF;369} else {370color_on = "";371color_off = "";372}373374print_field("%s: %s%s%s (0x%2.2x)", label,375color_on, str, color_off, error);376}377378static void print_status(uint8_t status)379{380print_error("Status", status);381}382383static void print_reason(uint8_t reason)384{385print_error("Reason", reason);386}387388static void print_bdaddr(const uint8_t *bdaddr)389{390print_field("Address: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"391" (OUI %2.2X-%2.2X-%2.2X)",392bdaddr[5], bdaddr[4], bdaddr[3],393bdaddr[2], bdaddr[1], bdaddr[0],394bdaddr[5], bdaddr[4], bdaddr[3]);395}396397static void print_addr(const char *label, const uint8_t *addr,398uint8_t addr_type)399{400const char *str;401402switch (addr_type) {403case 0x00:404print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X"405" (OUI %2.2X-%2.2X-%2.2X)", label,406addr[5], addr[4], addr[3],407addr[2], addr[1], addr[0],408addr[5], addr[4], addr[3]);409break;410case 0x01:411switch ((addr[5] & 0xc0) >> 6) {412case 0x00:413str = "Non-Resolvable";414break;415case 0x01:416str = "Resolvable";417break;418case 0x03:419str = "Static";420break;421default:422str = "Reserved";423break;424}425426print_field("%s: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X (%s)",427label, addr[5], addr[4], addr[3],428addr[2], addr[1], addr[0], str);429break;430default:431print_field("%s: %2.2X-%2.2X-%2.2X-%2.2X-%2.2X-%2.2X",432label, addr[5], addr[4], addr[3],433addr[2], addr[1], addr[0]);434break;435}436}437438static void print_addr_type(const char *label, uint8_t addr_type)439{440const char *str;441442switch (addr_type) {443case 0x00:444str = "Public";445break;446case 0x01:447str = "Random";448break;449default:450str = "Reserved";451break;452}453454print_field("%s: %s (0x%2.2x)", label, str, addr_type);455}456457static void print_handle(uint16_t handle)458{459print_field("Handle: %d", btohs(handle));460}461462static void print_phy_handle(uint8_t phy_handle)463{464print_field("Physical handle: %d", phy_handle);465}466467static void print_pkt_type(uint16_t pkt_type)468{469print_field("Packet type: 0x%4.4x", btohs(pkt_type));470}471472static void print_iac(const uint8_t *lap)473{474const char *str = "";475476if (lap[2] == 0x9e && lap[1] == 0x8b) {477switch (lap[0]) {478case 0x33:479str = " (General Inquiry)";480break;481case 0x00:482str = " (Limited Inquiry)";483break;484}485}486487print_field("Access code: 0x%2.2x%2.2x%2.2x%s",488lap[2], lap[1], lap[0], str);489}490491static void print_auth_enable(uint8_t enable)492{493const char *str;494495switch (enable) {496case 0x00:497str = "Authentication not required";498break;499case 0x01:500str = "Authentication required for all connections";501break;502default:503str = "Reserved";504break;505}506507print_field("Enable: %s (0x%2.2x)", str, enable);508}509510static void print_encrypt_mode(uint8_t mode)511{512const char *str;513514switch (mode) {515case 0x00:516str = "Encryption not required";517break;518case 0x01:519str = "Encryption required for all connections";520break;521default:522str = "Reserved";523break;524}525526print_field("Mode: %s (0x%2.2x)", str, mode);527}528529static const struct {530uint8_t bit;531const char *str;532} svc_class_table[] = {533{ 0, "Positioning (Location identification)" },534{ 1, "Networking (LAN, Ad hoc)" },535{ 2, "Rendering (Printing, Speaker)" },536{ 3, "Capturing (Scanner, Microphone)" },537{ 4, "Object Transfer (v-Inbox, v-Folder)" },538{ 5, "Audio (Speaker, Microphone, Headset)" },539{ 6, "Telephony (Cordless telephony, Modem, Headset)" },540{ 7, "Information (WEB-server, WAP-server)" },541{ }542};543544static const struct {545uint8_t val;546const char *str;547} major_class_computer_table[] = {548{ 0x00, "Uncategorized, code for device not assigned" },549{ 0x01, "Desktop workstation" },550{ 0x02, "Server-class computer" },551{ 0x03, "Laptop" },552{ 0x04, "Handheld PC/PDA (clam shell)" },553{ 0x05, "Palm sized PC/PDA" },554{ 0x06, "Wearable computer (Watch sized)" },555{ 0x07, "Tablet" },556{ }557};558559static const char *major_class_computer(uint8_t minor)560{561int i;562563for (i = 0; major_class_computer_table[i].str; i++) {564if (major_class_computer_table[i].val == minor)565return major_class_computer_table[i].str;566}567568return NULL;569}570571static const struct {572uint8_t val;573const char *str;574} major_class_phone_table[] = {575{ 0x00, "Uncategorized, code for device not assigned" },576{ 0x01, "Cellular" },577{ 0x02, "Cordless" },578{ 0x03, "Smart phone" },579{ 0x04, "Wired modem or voice gateway" },580{ 0x05, "Common ISDN Access" },581{ }582};583584static const char *major_class_phone(uint8_t minor)585{586int i;587588for (i = 0; major_class_phone_table[i].str; i++) {589if (major_class_phone_table[i].val == minor)590return major_class_phone_table[i].str;591}592593return NULL;594}595596static const struct {597uint8_t val;598const char *str;599} major_class_av_table[] = {600{ 0x00, "Uncategorized, code for device not assigned" },601{ 0x01, "earable Headset Device" },602{ 0x02, "Hands-free Device" },603{ 0x04, "Microphone" },604{ 0x05, "Loudspeaker" },605{ 0x06, "Headphones" },606{ 0x07, "Portable Audio" },607{ 0x08, "Car audio" },608{ 0x09, "Set-top box" },609{ 0x0a, "HiFi Audio Device" },610{ 0x0b, "VCR" },611{ 0x0c, "Video Camera" },612{ 0x0d, "Camcorder" },613{ 0x0e, "Video Monitor" },614{ 0x0f, "Video Display and Loudspeaker" },615{ 0x10, "Video Conferencing" },616{ 0x12, "Gaming/Toy" },617{ }618};619620static const char *major_class_av(uint8_t minor)621{622int i;623624for (i = 0; major_class_av_table[i].str; i++) {625if (major_class_av_table[i].val == minor)626return major_class_av_table[i].str;627}628629return NULL;630}631632static const struct {633uint8_t val;634const char *str;635} major_class_wearable_table[] = {636{ 0x01, "Wrist Watch" },637{ 0x02, "Pager" },638{ 0x03, "Jacket" },639{ 0x04, "Helmet" },640{ 0x05, "Glasses" },641{ }642};643644static const char *major_class_wearable(uint8_t minor)645{646int i;647648for (i = 0; major_class_wearable_table[i].str; i++) {649if (major_class_wearable_table[i].val == minor)650return major_class_wearable_table[i].str;651}652653return NULL;654}655656static const struct {657uint8_t val;658const char *str;659const char *(*func)(uint8_t minor);660} major_class_table[] = {661{ 0x00, "Miscellaneous" },662{ 0x01, "Computer (desktop, notebook, PDA, organizers)",663major_class_computer },664{ 0x02, "Phone (cellular, cordless, payphone, modem)",665major_class_phone },666{ 0x03, "LAN /Network Access point" },667{ 0x04, "Audio/Video (headset, speaker, stereo, video, vcr)",668major_class_av },669{ 0x05, "Peripheral (mouse, joystick, keyboards)" },670{ 0x06, "Imaging (printing, scanner, camera, display)" },671{ 0x07, "Wearable", major_class_wearable },672{ 0x08, "Toy" },673{ 0x09, "Health" },674{ 0x1f, "Uncategorized, specific device code not specified" },675{ }676};677678static void print_dev_class(const uint8_t *dev_class)679{680uint8_t mask, major_cls, minor_cls;681const char *major_str = NULL;682const char *minor_str = NULL;683int i;684685print_field("Class: 0x%2.2x%2.2x%2.2x",686dev_class[2], dev_class[1], dev_class[0]);687688if ((dev_class[0] & 0x03) != 0x00) {689print_field(" Format type: 0x%2.2x", dev_class[0] & 0x03);690print_text(COLOR_ERROR, " invalid format type");691return;692}693694major_cls = dev_class[1] & 0x1f;695minor_cls = (dev_class[0] & 0xfc) >> 2;696697for (i = 0; major_class_table[i].str; i++) {698if (major_class_table[i].val == major_cls) {699major_str = major_class_table[i].str;700701if (!major_class_table[i].func)702break;703704minor_str = major_class_table[i].func(minor_cls);705break;706}707}708709if (major_str) {710print_field(" Major class: %s", major_str);711if (minor_str)712print_field(" Minor class: %s", minor_str);713else714print_field(" Minor class: 0x%2.2x", minor_cls);715} else {716print_field(" Major class: 0x%2.2x", major_cls);717print_field(" Minor class: 0x%2.2x", minor_cls);718}719720if (dev_class[1] & 0x20)721print_field(" Limited Discoverable Mode");722723if ((dev_class[1] & 0xc0) != 0x00) {724print_text(COLOR_ERROR, " invalid service class");725return;726}727728mask = dev_class[2];729730for (i = 0; svc_class_table[i].str; i++) {731if (dev_class[2] & (1 << svc_class_table[i].bit)) {732print_field(" %s", svc_class_table[i].str);733mask &= ~(1 << svc_class_table[i].bit);734}735}736737if (mask)738print_text(COLOR_UNKNOWN_SERVICE_CLASS,739" Unknown service class (0x%2.2x)", mask);740}741742static void print_voice_setting(uint16_t setting)743{744print_field("Setting: 0x%4.4x", btohs(setting));745}746747static void print_retransmission_effort(uint8_t effort)748{749const char *str;750751switch (effort) {752case 0x00:753str = "No retransmissions";754break;755case 0x01:756str = "Optimize for power consumption";757break;758case 0x02:759str = "Optimize for link quality";760break;761case 0xff:762str = "Don't care";763break;764default:765str = "Reserved";766break;767}768769print_field("Retransmission effort: %s (0x%2.2x)", str, effort);770}771772static void print_scan_enable(uint8_t scan_enable)773{774const char *str;775776switch (scan_enable) {777case 0x00:778str = "No Scans";779break;780case 0x01:781str = "Inquiry Scan";782break;783case 0x02:784str = "Page Scan";785break;786case 0x03:787str = "Inquiry Scan + Page Scan";788break;789default:790str = "Reserved";791break;792}793794print_field("Scan enable: %s (0x%2.2x)", str, scan_enable);795}796797static void print_link_policy(uint16_t link_policy)798{799print_field("Link policy: 0x%4.4x", btohs(link_policy));800}801802static void print_air_mode(uint8_t mode)803{804const char *str;805806switch (mode) {807case 0x00:808str = "u-law log";809break;810case 0x01:811str = "A-law log";812break;813case 0x02:814str = "CVSD";815break;816case 0x03:817str = "Transparent";818break;819default:820str = "Reserved";821break;822}823824print_field("Air mode: %s (0x%2.2x)", str, mode);825}826827static void print_inquiry_mode(uint8_t mode)828{829const char *str;830831switch (mode) {832case 0x00:833str = "Standard Inquiry Result";834break;835case 0x01:836str = "Inquiry Result with RSSI";837break;838case 0x02:839str = "Inquiry Result with RSSI or Extended Inquiry Result";840break;841default:842str = "Reserved";843break;844}845846print_field("Mode: %s (0x%2.2x)", str, mode);847}848849static void print_inquiry_scan_type(uint8_t type)850{851const char *str;852853switch (type) {854case 0x00:855str = "Standard Scan";856break;857case 0x01:858str = "Interlaced Scan";859break;860default:861str = "Reserved";862break;863}864865print_field("Type: %s (0x%2.2x)", str, type);866}867868static void print_pscan_type(uint8_t type)869{870const char *str;871872switch (type) {873case 0x00:874str = "Standard Scan";875break;876case 0x01:877str = "Interlaced Scan";878break;879default:880str = "Reserved";881break;882}883884print_field("Type: %s (0x%2.2x)", str, type);885}886887static void print_afh_mode(uint8_t mode)888{889const char *str;890891switch (mode) {892case 0x00:893str = "Disabled";894break;895case 0x01:896str = "Enabled";897break;898break;899default:900str = "Reserved";901break;902}903904print_field("Mode: %s (0x%2.2x)", str, mode);905}906907static void print_simple_pairing_mode(uint8_t mode)908{909const char *str;910911switch (mode) {912case 0x00:913str = "Disabled";914break;915case 0x01:916str = "Enabled";917break;918default:919str = "Reserved";920break;921}922923print_field("Mode: %s (0x%2.2x)", str, mode);924}925926static void print_pscan_rep_mode(uint8_t pscan_rep_mode)927{928const char *str;929930switch (pscan_rep_mode) {931case 0x00:932str = "R0";933break;934case 0x01:935str = "R1";936break;937case 0x02:938str = "R2";939break;940default:941str = "Reserved";942break;943}944945print_field("Page scan repetition mode: %s (0x%2.2x)",946str, pscan_rep_mode);947}948949static void print_pscan_period_mode(uint8_t pscan_period_mode)950{951const char *str;952953switch (pscan_period_mode) {954case 0x00:955str = "P0";956break;957case 0x01:958str = "P1";959break;960case 0x02:961str = "P2";962break;963default:964str = "Reserved";965break;966}967968print_field("Page period mode: %s (0x%2.2x)", str, pscan_period_mode);969}970971static void print_pscan_mode(uint8_t pscan_mode)972{973const char *str;974975switch (pscan_mode) {976case 0x00:977str = "Mandatory";978break;979case 0x01:980str = "Optional I";981break;982case 0x02:983str = "Optional II";984break;985case 0x03:986str = "Optional III";987break;988default:989str = "Reserved";990break;991}992993print_field("Page scan mode: %s (0x%2.2x)", str, pscan_mode);994}995996static void print_clock_offset(uint16_t clock_offset)997{998print_field("Clock offset: 0x%4.4x", btohs(clock_offset));999}10001001static void print_clock(uint32_t clock)1002{1003print_field("Clock: 0x%8.8x", btohl(clock));1004}10051006static void print_clock_accuracy(uint16_t accuracy)1007{1008if (btohs(accuracy) == 0xffff)1009print_field("Accuracy: Unknown (0x%4.4x)", btohs(accuracy));1010else1011print_field("Accuracy: %.4f msec (0x%4.4x)",1012btohs(accuracy) * 0.3125, btohs(accuracy));1013}10141015static void print_link_type(uint8_t link_type)1016{1017const char *str;10181019switch (link_type) {1020case 0x00:1021str = "SCO";1022break;1023case 0x01:1024str = "ACL";1025break;1026case 0x02:1027str = "eSCO";1028break;1029default:1030str = "Reserved";1031break;1032}10331034print_field("Link type: %s (0x%2.2x)", str, link_type);1035}10361037static void print_encr_mode(uint8_t encr_mode)1038{1039const char *str;10401041switch (encr_mode) {1042case 0x00:1043str = "Disabled";1044break;1045case 0x01:1046str = "Enabled";1047break;1048default:1049str = "Reserved";1050break;1051}10521053print_field("Encryption: %s (0x%2.2x)", str, encr_mode);1054}10551056static void print_encr_mode_change(uint8_t encr_mode, uint16_t handle)1057{1058const char *str;1059uint8_t conn_type;10601061conn_type = get_type(btohs(handle));10621063switch (encr_mode) {1064case 0x00:1065str = "Disabled";1066break;1067case 0x01:1068switch (conn_type) {1069case 0x00:1070str = "Enabled with E0";1071break;1072case 0x01:1073str = "Enabled with AES-CCM";1074break;1075default:1076str = "Enabled";1077break;1078}1079break;1080default:1081str = "Reserved";1082break;1083}10841085print_field("Encryption: %s (0x%2.2x)", str, encr_mode);1086}10871088static void print_pin_type(uint8_t pin_type)1089{1090const char *str;10911092switch (pin_type) {1093case 0x00:1094str = "Variable";1095break;1096case 0x01:1097str = "Fixed";1098break;1099default:1100str = "Reserved";1101break;1102}11031104print_field("PIN type: %s (0x%2.2x)", str, pin_type);1105}11061107static void print_key_flag(uint8_t key_flag)1108{1109const char *str;11101111switch (key_flag) {1112case 0x00:1113str = "Semi-permanent";1114break;1115case 0x01:1116str = "Temporary";1117break;1118default:1119str = "Reserved";1120break;1121}11221123print_field("Key flag: %s (0x%2.2x)", str, key_flag);1124}11251126static void print_key_len(uint8_t key_len)1127{1128const char *str;11291130switch (key_len) {1131case 32:1132str = "802.11 PAL";1133break;1134default:1135str = "Reserved";1136break;1137}11381139print_field("Key length: %s (%d)", str, key_len);1140}11411142static void print_key_type(uint8_t key_type)1143{1144const char *str;11451146switch (key_type) {1147case 0x00:1148str = "Combination key";1149break;1150case 0x01:1151str = "Local Unit key";1152break;1153case 0x02:1154str = "Remote Unit key";1155break;1156case 0x03:1157str = "Debug Combination key";1158break;1159case 0x04:1160str = "Unauthenticated Combination key";1161break;1162case 0x05:1163str = "Authenticated Combination key";1164break;1165case 0x06:1166str = "Changed Combination key";1167break;1168default:1169str = "Reserved";1170break;1171}11721173print_field("Key type: %s (0x%2.2x)", str, key_type);1174}11751176static void print_key_size(uint8_t key_size)1177{1178print_field("Key size: %d", key_size);1179}11801181static void print_hex_field(const char *label, const uint8_t *data,1182uint8_t len)1183{1184char str[len * 2 + 1];1185uint8_t i;11861187str[0] = '\0';11881189for (i = 0; i < len; i++)1190sprintf(str + (i * 2), "%2.2x", data[i]);11911192print_field("%s: %s", label, str);1193}11941195static void print_key(const char *label, const uint8_t *link_key)1196{1197print_hex_field(label, link_key, 16);1198}11991200static void print_link_key(const uint8_t *link_key)1201{1202print_key("Link key", link_key);1203}12041205static void print_pin_code(const uint8_t *pin_code, uint8_t pin_len)1206{1207char str[pin_len + 1];1208uint8_t i;12091210for (i = 0; i < pin_len; i++)1211sprintf(str + i, "%c", (const char) pin_code[i]);12121213print_field("PIN code: %s", str);1214}12151216static void print_hash(const char *label, const uint8_t *hash)1217{1218print_key("Hash C from %s", hash);1219}12201221static void print_randomizer(const char *label, const uint8_t *randomizer)1222{1223print_key("Randomizer R with %s", randomizer);1224}12251226static void print_passkey(uint32_t passkey)1227{1228print_field("Passkey: %06d", btohl(passkey));1229}12301231static void print_io_capability(uint8_t capability)1232{1233const char *str;12341235switch (capability) {1236case 0x00:1237str = "DisplayOnly";1238break;1239case 0x01:1240str = "DisplayYesNo";1241break;1242case 0x02:1243str = "KeyboardOnly";1244break;1245case 0x03:1246str = "NoInputNoOutput";1247break;1248default:1249str = "Reserved";1250break;1251}12521253print_field("IO capability: %s (0x%2.2x)", str, capability);1254}12551256static void print_oob_data(uint8_t oob_data)1257{1258const char *str;12591260switch (oob_data) {1261case 0x00:1262str = "Authentication data not present";1263break;1264case 0x01:1265str = "Authentication data present";1266break;1267default:1268str = "Reserved";1269break;1270}12711272print_field("OOB data: %s (0x%2.2x)", str, oob_data);1273}12741275static void print_authentication(uint8_t authentication)1276{1277const char *str;12781279switch (authentication) {1280case 0x00:1281str = "No Bonding - MITM not required";1282break;1283case 0x01:1284str = "No Bonding - MITM required";1285break;1286case 0x02:1287str = "Dedicated Bonding - MITM not required";1288break;1289case 0x03:1290str = "Dedicated Bonding - MITM required";1291break;1292case 0x04:1293str = "General Bonding - MITM not required";1294break;1295case 0x05:1296str = "General Bonding - MITM required";1297break;1298default:1299str = "Reserved";1300break;1301}13021303print_field("Authentication: %s (0x%2.2x)", str, authentication);1304}13051306static void print_location_domain_aware(uint8_t aware)1307{1308const char *str;13091310switch (aware) {1311case 0x00:1312str = "Regulatory domain unknown";1313break;1314case 0x01:1315str = "Regulatory domain known";1316break;1317default:1318str = "Reserved";1319break;1320}13211322print_field("Domain aware: %s (0x%2.2x)", str, aware);1323}13241325static void print_location_domain(const uint8_t *domain)1326{1327print_field("Domain: %c%c (0x%2.2x%2.2x)",1328(char) domain[0], (char) domain[1], domain[0], domain[1]);1329}13301331static void print_location_domain_options(uint8_t options)1332{1333print_field("Domain options: %c (0x%2.2x)", (char) options, options);1334}13351336static void print_location_options(uint8_t options)1337{1338print_field("Options: 0x%2.2x", options);1339}13401341static void print_flow_control_mode(uint8_t mode)1342{1343const char *str;13441345switch (mode) {1346case 0x00:1347str = "Packet based";1348break;1349case 0x01:1350str = "Data block based";1351break;1352default:1353str = "Reserved";1354break;1355}13561357print_field("Flow control mode: %s (0x%2.2x)", str, mode);1358}13591360static void print_flow_direction(uint8_t direction)1361{1362const char *str;13631364switch (direction) {1365case 0x00:1366str = "Outgoing";1367break;1368case 0x01:1369str = "Incoming";1370break;1371default:1372str = "Reserved";1373break;1374}13751376print_field("Flow direction: %s (0x%2.2x)", str, direction);1377}13781379static void print_service_type(uint8_t service_type)1380{1381const char *str;13821383switch (service_type) {1384case 0x00:1385str = "No Traffic";1386break;1387case 0x01:1388str = "Best Effort";1389break;1390case 0x02:1391str = "Guaranteed";1392break;1393default:1394str = "Reserved";1395break;1396}13971398print_field("Service type: %s (0x%2.2x)", str, service_type);1399}14001401static void print_flow_spec(const char *label, const uint8_t *data)1402{1403const char *str;14041405switch (data[1]) {1406case 0x00:1407str = "No traffic";1408break;1409case 0x01:1410str = "Best effort";1411break;1412case 0x02:1413str = "Guaranteed";1414break;1415default:1416str = "Reserved";1417break;1418}14191420print_field("%s flow spec: 0x%2.2x", label, data[0]);1421print_field(" Service type: %s (0x%2.2x)", str, data[1]);1422print_field(" Maximum SDU size: 0x%4.4x", bt_get_le16(data + 2));1423print_field(" SDU inter-arrival time: 0x%8.8x", bt_get_le32(data + 4));1424print_field(" Access latency: 0x%8.8x", bt_get_le32(data + 8));1425print_field(" Flush timeout: 0x%8.8x", bt_get_le32(data + 12));1426}14271428static void print_short_range_mode(uint8_t mode)1429{1430const char *str;14311432switch (mode) {1433case 0x00:1434str = "Disabled";1435break;1436case 0x01:1437str = "Enabled";1438break;1439default:1440str = "Reserved";1441break;1442}14431444print_field("Short range mode: %s (0x%2.2x)", str, mode);1445}14461447static void print_amp_status(uint8_t amp_status)1448{1449const char *str;14501451switch (amp_status) {1452case 0x00:1453str = "Present";1454break;1455case 0x01:1456str = "Bluetooth only";1457break;1458case 0x02:1459str = "No capacity";1460break;1461case 0x03:1462str = "Low capacity";1463break;1464case 0x04:1465str = "Medium capacity";1466break;1467case 0x05:1468str = "High capacity";1469break;1470case 0x06:1471str = "Full capacity";1472break;1473default:1474str = "Reserved";1475break;1476}14771478print_field("AMP status: %s (0x%2.2x)", str, amp_status);1479}14801481static void print_num_resp(uint8_t num_resp)1482{1483print_field("Num responses: %d", num_resp);1484}14851486static void print_num_reports(uint8_t num_reports)1487{1488print_field("Num reports: %d", num_reports);1489}14901491static void print_rssi(int8_t rssi)1492{1493if ((uint8_t) rssi == 0x99 || rssi == 127)1494print_field("RSSI: invalid (0x%2.2x)", (uint8_t) rssi);1495else1496print_field("RSSI: %d dBm (0x%2.2x)", rssi, (uint8_t) rssi);1497}14981499static void print_slot_625(const char *label, uint16_t value)1500{1501print_field("%s: %.3f msec (0x%4.4x)", label,1502btohs(value) * 0.625, btohs(value));1503}15041505static void print_slot_125(const char *label, uint16_t value)1506{1507print_field("%s: %.2f msec (0x%4.4x)", label,1508btohs(value) * 1.25, btohs(value));1509}15101511static void print_timeout(uint16_t timeout)1512{1513print_slot_625("Timeout", timeout);1514}15151516static void print_interval(uint16_t interval)1517{1518print_slot_625("Interval", interval);1519}15201521static void print_window(uint16_t window)1522{1523print_slot_625("Window", window);1524}15251526static void print_role(uint8_t role)1527{1528const char *str;15291530switch (role) {1531case 0x00:1532str = "Master";1533break;1534case 0x01:1535str = "Slave";1536break;1537default:1538str = "Reserved";1539break;1540}15411542print_field("Role: %s (0x%2.2x)", str, role);1543}15441545static void print_mode(uint8_t mode)1546{1547const char *str;15481549switch (mode) {1550case 0x00:1551str = "Active";1552break;1553case 0x01:1554str = "Hold";1555break;1556case 0x02:1557str = "Sniff";1558break;1559case 0x03:1560str = "Park";1561break;1562default:1563str = "Reserved";1564break;1565}15661567print_field("Mode: %s (0x%2.2x)", str, mode);1568}15691570static void print_name(const uint8_t *name)1571{1572char str[249];15731574memcpy(str, name, 248);1575str[248] = '\0';15761577print_field("Name: %s", str);1578}15791580static void print_channel_map(const uint8_t *map)1581{1582char str[21];1583int i;15841585for (i = 0; i < 10; i++)1586sprintf(str + (i * 2), "%2.2x", map[i]);15871588print_field("Channel map: 0x%s", str);1589}15901591void packet_print_version(const char *label, uint8_t version,1592const char *sublabel, uint16_t subversion)1593{1594const char *str;15951596switch (version) {1597case 0x00:1598str = "Bluetooth 1.0b";1599break;1600case 0x01:1601str = "Bluetooth 1.1";1602break;1603case 0x02:1604str = "Bluetooth 1.2";1605break;1606case 0x03:1607str = "Bluetooth 2.0";1608break;1609case 0x04:1610str = "Bluetooth 2.1";1611break;1612case 0x05:1613str = "Bluetooth 3.0";1614break;1615case 0x06:1616str = "Bluetooth 4.0";1617break;1618case 0x07:1619str = "Bluetooth 4.1";1620break;1621default:1622str = "Reserved";1623break;1624}16251626print_field("%s: %s (0x%2.2x) - %s %d (0x%4.4x)", label, str, version,1627sublabel, subversion, subversion);1628}16291630static void print_hci_version(uint8_t version, uint16_t revision)1631{1632packet_print_version("HCI version", version,1633"Revision", btohs(revision));1634}16351636static void print_lmp_version(uint8_t version, uint16_t subversion)1637{1638packet_print_version("LMP version", version,1639"Subversion", btohs(subversion));1640}16411642static void print_pal_version(uint8_t version, uint16_t subversion)1643{1644const char *str;16451646switch (version) {1647case 0x01:1648str = "Bluetooth 3.0";1649break;1650default:1651str = "Reserved";1652break;1653}16541655print_field("PAL version: %s (0x%2.2x) - Subversion %d (0x%4.4x)",1656str, version, btohs(subversion), btohs(subversion));1657}16581659void packet_print_company(const char *label, uint16_t company)1660{1661print_field("%s: %s (%d)", label, bt_compidtostr(company), company);1662}16631664static void print_manufacturer(uint16_t manufacturer)1665{1666packet_print_company("Manufacturer", btohs(manufacturer));1667}16681669static const char *get_supported_command(int bit);16701671static void print_commands(const uint8_t *commands)1672{1673unsigned int count = 0;1674int i, n;16751676for (i = 0; i < 64; i++) {1677for (n = 0; n < 8; n++) {1678if (commands[i] & (1 << n))1679count++;1680}1681}16821683print_field("Commands: %u entr%s", count, count == 1 ? "y" : "ies");16841685for (i = 0; i < 64; i++) {1686for (n = 0; n < 8; n++) {1687const char *cmd;16881689if (!(commands[i] & (1 << n)))1690continue;16911692cmd = get_supported_command((i * 8) + n);1693print_field(" %s (Octet %d - Bit %d)", cmd, i, n);1694}1695}1696}16971698struct features_data {1699uint8_t bit;1700const char *str;1701};17021703static const struct features_data features_page0[] = {1704{ 0, "3 slot packets" },1705{ 1, "5 slot packets" },1706{ 2, "Encryption" },1707{ 3, "Slot offset" },1708{ 4, "Timing accuracy" },1709{ 5, "Role switch" },1710{ 6, "Hold mode" },1711{ 7, "Sniff mode" },1712{ 8, "Park state" },1713{ 9, "Power control requests" },1714{ 10, "Channel quality driven data rate (CQDDR)"},1715{ 11, "SCO link" },1716{ 12, "HV2 packets" },1717{ 13, "HV3 packets" },1718{ 14, "u-law log synchronous data" },1719{ 15, "A-law log synchronous data" },1720{ 16, "CVSD synchronous data" },1721{ 17, "Paging parameter negotiation" },1722{ 18, "Power control" },1723{ 19, "Transparent synchronous data" },1724{ 20, "Flow control lag (least significant bit)"},1725{ 21, "Flow control lag (middle bit)" },1726{ 22, "Flow control lag (most significant bit)" },1727{ 23, "Broadcast Encryption" },1728{ 25, "Enhanced Data Rate ACL 2 Mbps mode" },1729{ 26, "Enhanced Data Rate ACL 3 Mbps mode" },1730{ 27, "Enhanced inquiry scan" },1731{ 28, "Interlaced inquiry scan" },1732{ 29, "Interlaced page scan" },1733{ 30, "RSSI with inquiry results" },1734{ 31, "Extended SCO link (EV3 packets)" },1735{ 32, "EV4 packets" },1736{ 33, "EV5 packets" },1737{ 35, "AFH capable slave" },1738{ 36, "AFH classification slave" },1739{ 37, "BR/EDR Not Supported" },1740{ 38, "LE Supported (Controller)" },1741{ 39, "3-slot Enhanced Data Rate ACL packets" },1742{ 40, "5-slot Enhanced Data Rate ACL packets" },1743{ 41, "Sniff subrating" },1744{ 42, "Pause encryption" },1745{ 43, "AFH capable master" },1746{ 44, "AFH classification master" },1747{ 45, "Enhanced Data Rate eSCO 2 Mbps mode" },1748{ 46, "Enhanced Data Rate eSCO 3 Mbps mode" },1749{ 47, "3-slot Enhanced Data Rate eSCO packets" },1750{ 48, "Extended Inquiry Response" },1751{ 49, "Simultaneous LE and BR/EDR (Controller)" },1752{ 51, "Secure Simple Pairing" },1753{ 52, "Encapsulated PDU" },1754{ 53, "Erroneous Data Reporting" },1755{ 54, "Non-flushable Packet Boundary Flag" },1756{ 56, "Link Supervision Timeout Changed Event" },1757{ 57, "Inquiry TX Power Level" },1758{ 58, "Enhanced Power Control" },1759{ 63, "Extended features" },1760{ }1761};17621763static const struct features_data features_page1[] = {1764{ 0, "Secure Simple Pairing (Host Support)" },1765{ 1, "LE Supported (Host)" },1766{ 2, "Simultaneous LE and BR/EDR (Host)" },1767{ }1768};17691770static const struct features_data features_page2[] = {1771{ 0, "Connectionless Slave Broadcast - Master" },1772{ 1, "Connectionless Slave Broadcast - Slave" },1773{ 2, "Synchronization Train" },1774{ 3, "Synchronization Scan" },1775{ 4, "Inquiry Response Notification Event" },1776{ }1777};17781779static const struct features_data features_le[] = {1780{ 0, "LE Encryption" },1781{ }1782};17831784static void print_features(uint8_t page, const uint8_t *features_array,1785uint8_t type)1786{1787const struct features_data *features_table = NULL;1788uint64_t mask, features = 0;1789char str[41];1790int i;17911792for (i = 0; i < 8; i++) {1793sprintf(str + (i * 5), " 0x%2.2x", features_array[i]);1794features |= ((uint64_t) features_array[i]) << (i * 8);1795}17961797print_field("Features:%s", str);17981799switch (type) {1800case 0x00:1801switch (page) {1802case 0:1803features_table = features_page0;1804break;1805case 1:1806features_table = features_page1;1807break;1808case 2:1809features_table = features_page2;1810break;1811}1812break;1813case 0x01:1814switch (page) {1815case 0:1816features_table = features_le;1817break;1818}1819break;1820}18211822if (!features_table)1823return;18241825mask = features;18261827for (i = 0; features_table[i].str; i++) {1828if (features & (((uint64_t) 1) << features_table[i].bit)) {1829print_field(" %s", features_table[i].str);1830mask &= ~(((uint64_t) 1) << features_table[i].bit);1831}1832}18331834if (mask)1835print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features "1836"(0x%16.16" PRIx64 ")", mask);1837}18381839void packet_print_features_ll(const uint8_t *features)1840{1841print_features(0, features, 0x01);1842}18431844static const struct {1845uint8_t bit;1846const char *str;1847} le_states_table[] = {1848{ 0, "Non-connectable Advertising State" },1849{ 1, "Scannable Advertising State" },1850{ 2, "Connectable Advertising State" },1851{ 3, "Directed Advertising State" },1852{ 4, "Passive Scanning State" },1853{ 5, "Active Scanning State" },1854{ 6, "Initiating State and Connection State in Master Role" },1855{ 7, "Connection State in Slave Role" },1856{ 8, "Non-connectable Advertising State and "1857"Passive Scanning State combination" },1858{ 9, "Scannable Advertising State and "1859"Passive Scanning State combination" },1860{ 10, "Connectable Advertising State and "1861"Passive Scanning State combination" },1862{ 11, "Directed Advertising State and "1863"Passive Scanning State combination" },1864{ 12, "Non-connectable Advertising State and "1865"Active Scanning State combination" },1866{ 13, "Scannable Advertising State and "1867"Active Scanning State combination" },1868{ 14, "Connectable Advertising State and "1869"Active Scanning State combination" },1870{ 15, "Directed Advertising State and "1871"Active Scanning State combination" },1872{ 16, "Non-connectable Advertising State and "1873"Initiating State combination" },1874{ 17, "Scannable Advertising State and "1875"Initiating State combination" },1876{ 18, "Non-connectable Advertising State and "1877"Mater Role combination" },1878{ 19, "Scannable Advertising State and "1879"Master Role combination" },1880{ 20, "Non-connectable Advertising State and "1881"Slave Role combination" },1882{ 21, "Scannable Advertising State and "1883"Slave Role combination" },1884{ 22, "Passive Scanning State and Initiating State combination" },1885{ 23, "Active Scanning State and Initiating State combination" },1886{ 24, "Passive Scanning State and Master Role combination" },1887{ 25, "Active Scanning State and Master Role combination" },1888{ 26, "Passive Scanning State and Slave Role combination" },1889{ 27, "Active Scanning State and Slave Role combination" },1890{ 28, "Initiating State and Master Role combination" },1891{ }1892};18931894static void print_le_states(const uint8_t *states_array)1895{1896uint64_t mask, states = 0;1897int i;18981899for (i = 0; i < 8; i++)1900states |= ((uint64_t) states_array[i]) << (i * 8);19011902print_field("States: 0x%16.16" PRIx64, states);19031904mask = states;19051906for (i = 0; le_states_table[i].str; i++) {1907if (states & (((uint64_t) 1) << le_states_table[i].bit)) {1908print_field(" %s", le_states_table[i].str);1909mask &= ~(((uint64_t) 1) << le_states_table[i].bit);1910}1911}19121913if (mask)1914print_text(COLOR_UNKNOWN_LE_STATES, " Unknown states "1915"(0x%16.16" PRIx64 ")", mask);1916}19171918static void print_le_channel_map(const uint8_t *map)1919{1920char str[11];1921int i;19221923for (i = 0; i < 5; i++)1924sprintf(str + (i * 2), "%2.2x", map[i]);19251926print_field("Channel map: 0x%s", str);1927}19281929void packet_print_channel_map_ll(const uint8_t *map)1930{1931print_le_channel_map(map);1932}19331934static void print_random_number(const uint8_t *number)1935{1936print_hex_field("Random number", number, 8);1937}19381939static const struct {1940uint8_t bit;1941const char *str;1942} events_table[] = {1943{ 0, "Inquiry Complete" },1944{ 1, "Inquiry Result" },1945{ 2, "Connection Complete" },1946{ 3, "Connection Request" },1947{ 4, "Disconnection Complete" },1948{ 5, "Authentication Complete" },1949{ 6, "Remote Name Request Complete" },1950{ 7, "Encryption Change" },1951{ 8, "Change Connection Link Key Complete" },1952{ 9, "Master Link Key Complete" },1953{ 10, "Read Remote Supported Features Complete" },1954{ 11, "Read Remote Version Information Complete" },1955{ 12, "QoS Setup Complete" },1956{ 13, "Command Complete" },1957{ 14, "Command Status" },1958{ 15, "Hardware Error" },1959{ 16, "Flush Occurred" },1960{ 17, "Role Change" },1961{ 18, "Number of Completed Packets" },1962{ 19, "Mode Change" },1963{ 20, "Return Link Keys" },1964{ 21, "PIN Code Request" },1965{ 22, "Link Key Request" },1966{ 23, "Link Key Notification" },1967{ 24, "Loopback Command" },1968{ 25, "Data Buffer Overflow" },1969{ 26, "Max Slots Change" },1970{ 27, "Read Clock Offset Complete" },1971{ 28, "Connection Packet Type Changed" },1972{ 29, "QoS Violation" },1973{ 30, "Page Scan Mode Change" },1974{ 31, "Page Scan Repetition Mode Change" },1975{ 32, "Flow Specification Complete" },1976{ 33, "Inquiry Result with RSSI" },1977{ 34, "Read Remote Extended Features Complete" },1978{ 43, "Synchronous Connection Complete" },1979{ 44, "Synchronous Connection Changed" },1980{ 45, "Sniff Subrating" },1981{ 46, "Extended Inquiry Result" },1982{ 47, "Encryption Key Refresh Complete" },1983{ 48, "IO Capability Request" },1984{ 49, "IO Capability Request Reply" },1985{ 50, "User Confirmation Request" },1986{ 51, "User Passkey Request" },1987{ 52, "Remote OOB Data Request" },1988{ 53, "Simple Pairing Complete" },1989{ 55, "Link Supervision Timeout Changed" },1990{ 56, "Enhanced Flush Complete" },1991{ 58, "User Passkey Notification" },1992{ 59, "Keypress Notification" },1993{ 60, "Remote Host Supported Features Notification" },1994{ 61, "LE Meta" },1995{ }1996};19971998static void print_event_mask(const uint8_t *events_array)1999{2000uint64_t mask, events = 0;2001int i;20022003for (i = 0; i < 8; i++)2004events |= ((uint64_t) events_array[i]) << (i * 8);20052006print_field("Mask: 0x%16.16" PRIx64, events);20072008mask = events;20092010for (i = 0; events_table[i].str; i++) {2011if (events & (((uint64_t) 1) << events_table[i].bit)) {2012print_field(" %s", events_table[i].str);2013mask &= ~(((uint64_t) 1) << events_table[i].bit);2014}2015}20162017if (mask)2018print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "2019"(0x%16.16" PRIx64 ")", mask);2020}20212022static const struct {2023uint8_t bit;2024const char *str;2025} events_page2_table[] = {2026{ 0, "Physical Link Complete" },2027{ 1, "Channel Selected" },2028{ 2, "Disconnection Physical Link Complete" },2029{ 3, "Physical Link Loss Early Warning" },2030{ 4, "Physical Link Recovery" },2031{ 5, "Logical Link Complete" },2032{ 6, "Disconnection Logical Link Complete" },2033{ 7, "Flow Specification Modify Complete" },2034{ 8, "Number of Completed Data Blocks" },2035{ 9, "AMP Start Test" },2036{ 10, "AMP Test End" },2037{ 11, "AMP Receiver Report" },2038{ 12, "Short Range Mode Change Complete" },2039{ 13, "AMP Status Change" },2040{ 14, "Triggered Clock Capture" },2041{ 15, "Synchronization Train Complete" },2042{ 16, "Synchronization Train Received" },2043{ 17, "Connectionless Slave Broadcast Receive" },2044{ 18, "Connectionless Slave Broadcast Timeout" },2045{ 19, "Truncated Page Complete" },2046{ 20, "Slave Page Response Timeout" },2047{ 21, "Connectionless Slave Broadcast Channel Map Change" },2048{ 22, "Inquiry Response Notification" },2049{ }2050};20512052static void print_event_mask_page2(const uint8_t *events_array)2053{2054uint64_t mask, events = 0;2055int i;20562057for (i = 0; i < 8; i++)2058events |= ((uint64_t) events_array[i]) << (i * 8);20592060print_field("Mask: 0x%16.16" PRIx64, events);20612062mask = events;20632064for (i = 0; events_page2_table[i].str; i++) {2065if (events & (((uint64_t) 1) << events_page2_table[i].bit)) {2066print_field(" %s", events_page2_table[i].str);2067mask &= ~(((uint64_t) 1) << events_page2_table[i].bit);2068}2069}20702071if (mask)2072print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "2073"(0x%16.16" PRIx64 ")", mask);2074}20752076static const struct {2077uint8_t bit;2078const char *str;2079} events_le_table[] = {2080{ 0, "LE Connection Complete" },2081{ 1, "LE Advertising Report" },2082{ 2, "LE Connection Update Complete" },2083{ 3, "LE Read Remote Used Features" },2084{ 4, "LE Long Term Key Request" },2085{ }2086};20872088static void print_event_mask_le(const uint8_t *events_array)2089{2090uint64_t mask, events = 0;2091int i;20922093for (i = 0; i < 8; i++)2094events |= ((uint64_t) events_array[i]) << (i * 8);20952096print_field("Mask: 0x%16.16" PRIx64, events);20972098mask = events;20992100for (i = 0; events_le_table[i].str; i++) {2101if (events & (((uint64_t) 1) << events_le_table[i].bit)) {2102print_field(" %s", events_le_table[i].str);2103mask &= ~(((uint64_t) 1) << events_le_table[i].bit);2104}2105}21062107if (mask)2108print_text(COLOR_UNKNOWN_EVENT_MASK, " Unknown mask "2109"(0x%16.16" PRIx64 ")", mask);2110}21112112static void print_fec(uint8_t fec)2113{2114const char *str;21152116switch (fec) {2117case 0x00:2118str = "Not required";2119break;2120case 0x01:2121str = "Required";2122break;2123default:2124str = "Reserved";2125break;2126}21272128print_field("FEC: %s (0x%02x)", str, fec);2129}21302131#define BT_EIR_FLAGS 0x012132#define BT_EIR_UUID16_SOME 0x022133#define BT_EIR_UUID16_ALL 0x032134#define BT_EIR_UUID32_SOME 0x042135#define BT_EIR_UUID32_ALL 0x052136#define BT_EIR_UUID128_SOME 0x062137#define BT_EIR_UUID128_ALL 0x072138#define BT_EIR_NAME_SHORT 0x082139#define BT_EIR_NAME_COMPLETE 0x092140#define BT_EIR_TX_POWER 0x0a2141#define BT_EIR_CLASS_OF_DEV 0x0d2142#define BT_EIR_SSP_HASH_P192 0x0e2143#define BT_EIR_SSP_RANDOMIZER_P192 0x0f2144#define BT_EIR_DEVICE_ID 0x102145#define BT_EIR_SMP_TK 0x102146#define BT_EIR_SMP_OOB_FLAGS 0x112147#define BT_EIR_SLAVE_CONN_INTERVAL 0x122148#define BT_EIR_SERVICE_UUID16 0x142149#define BT_EIR_SERVICE_UUID128 0x152150#define BT_EIR_SERVICE_DATA 0x162151#define BT_EIR_PUBLIC_ADDRESS 0x172152#define BT_EIR_RANDOM_ADDRESS 0x182153#define BT_EIR_GAP_APPEARANCE 0x192154#define BT_EIR_ADVERTISING_INTERVAL 0x1a2155#define BT_EIR_LE_DEVICE_ADDRESS 0x1b2156#define BT_EIR_LE_ROLE 0x1c2157#define BT_EIR_SSP_HASH_P256 0x1d2158#define BT_EIR_SSP_RANDOMIZER_P256 0x1e2159#define BT_EIR_3D_INFO_DATA 0x3d2160#define BT_EIR_MANUFACTURER_DATA 0xff21612162static void print_manufacturer_apple(const void *data, uint8_t data_len)2163{2164uint8_t type = *((uint8_t *) data);2165uint8_t len;2166const uint8_t *uuid;2167uint16_t minor, major;2168int8_t tx_power;2169char identifier[100];21702171if (data_len < 1)2172return;21732174switch (type) {2175case 0x01:2176snprintf(identifier, sizeof(identifier) - 1, "%s",2177(const char *) (data + 1));2178print_field(" Identifier: %s", identifier);2179break;2180case 0x02:2181len = *((uint8_t *) (data + 1));2182if (len != 0x15) {2183print_hex_field(" Data", data, data_len);2184break;2185}21862187uuid = data + 2;2188print_field(" iBeacon: %8.8x-%4.4x-%4.4x-%4.4x-%8.8x%4.4x",2189bt_get_le32(&uuid[12]), bt_get_le16(&uuid[10]),2190bt_get_le16(&uuid[8]), bt_get_le16(&uuid[6]),2191bt_get_le32(&uuid[2]), bt_get_le16(&uuid[0]));21922193major = bt_get_le16(data + 18);2194minor = bt_get_le16(data + 20);2195print_field(" Version: %u.%u", major, minor);21962197tx_power = *(int8_t *) (data + 22);2198print_field(" TX power: %d dB", tx_power);2199break;2200default:2201print_hex_field(" Data", data, data_len);2202break;2203}2204}22052206static void print_manufacturer_data(const void *data, uint8_t data_len)2207{2208uint16_t company = bt_get_le16(data);22092210packet_print_company("Company", company);22112212switch (company) {2213case 76:2214case 19456:2215print_manufacturer_apple(data + 2, data_len - 2);2216break;2217default:2218print_hex_field(" Data", data + 2, data_len - 2);2219break;2220}2221}22222223static void print_uuid16_list(const char *label, const void *data,2224uint8_t data_len)2225{2226uint8_t count = data_len / sizeof(uint16_t);2227unsigned int i;22282229print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");22302231for (i = 0; i < count; i++) {2232uint16_t uuid = bt_get_le16(data + (i * 2));2233print_field(" %s (0x%4.4x)", uuid16_to_str(uuid), uuid);2234}2235}22362237static void print_uuid32_list(const char *label, const void *data,2238uint8_t data_len)2239{2240uint8_t count = data_len / sizeof(uint32_t);2241unsigned int i;22422243print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");22442245for (i = 0; i < count; i++) {2246uint32_t uuid = bt_get_le32(data + (i * 4));2247print_field(" %s (0x%8.8x)", uuid32_to_str(uuid), uuid);2248}2249}22502251static void print_uuid128_list(const char *label, const void *data,2252uint8_t data_len)2253{2254uint8_t count = data_len / 16;2255unsigned int i;22562257print_field("%s: %u entr%s", label, count, count == 1 ? "y" : "ies");22582259for (i = 0; i < count; i++) {2260const uint8_t *uuid = data + (i * 16);22612262print_field(" %8.8x-%4.4x-%4.4x-%4.4x-%8.8x%4.4x",2263bt_get_le32(&uuid[12]), bt_get_le16(&uuid[10]),2264bt_get_le16(&uuid[8]), bt_get_le16(&uuid[6]),2265bt_get_le32(&uuid[2]), bt_get_le16(&uuid[0]));2266}2267}22682269static const struct {2270uint8_t bit;2271const char *str;2272} eir_flags_table[] = {2273{ 0, "LE Limited Discoverable Mode" },2274{ 1, "LE General Discoverable Mode" },2275{ 2, "BR/EDR Not Supported" },2276{ 3, "Simultaneous LE and BR/EDR (Controller)" },2277{ 4, "Simultaneous LE and BR/EDR (Host)" },2278{ }2279};22802281static const struct {2282uint8_t bit;2283const char *str;2284} eir_3d_table[] = {2285{ 0, "Association Notification" },2286{ 1, "Battery Level Reporting" },2287{ 2, "Send Battery Level Report on Start-up Synchronization" },2288{ 7, "Factory Test Mode" },2289{ }2290};22912292static void print_eir(const uint8_t *eir, uint8_t eir_len, bool le)2293{2294uint16_t len = 0;22952296if (eir_len == 0)2297return;22982299while (len < eir_len - 1) {2300uint8_t field_len = eir[0];2301const uint8_t *data = &eir[2];2302uint8_t data_len;2303char name[239], label[100];2304uint8_t flags, mask;2305int i;23062307/* Check for the end of EIR */2308if (field_len == 0)2309break;23102311len += field_len + 1;23122313/* Do not continue EIR Data parsing if got incorrect length */2314if (len > eir_len) {2315len -= field_len + 1;2316break;2317}23182319data_len = field_len - 1;23202321switch (eir[1]) {2322case BT_EIR_FLAGS:2323flags = *data;2324mask = flags;23252326print_field("Flags: 0x%2.2x", flags);23272328for (i = 0; eir_flags_table[i].str; i++) {2329if (flags & (1 << eir_flags_table[i].bit)) {2330print_field(" %s",2331eir_flags_table[i].str);2332mask &= ~(1 << eir_flags_table[i].bit);2333}2334}23352336if (mask)2337print_text(COLOR_UNKNOWN_SERVICE_CLASS,2338" Unknown flags (0x%2.2x)", mask);2339break;23402341case BT_EIR_UUID16_SOME:2342if (data_len < sizeof(uint16_t))2343break;2344print_uuid16_list("16-bit Service UUIDs (partial)",2345data, data_len);2346break;23472348case BT_EIR_UUID16_ALL:2349if (data_len < sizeof(uint16_t))2350break;2351print_uuid16_list("16-bit Service UUIDs (complete)",2352data, data_len);2353break;23542355case BT_EIR_UUID32_SOME:2356if (data_len < sizeof(uint32_t))2357break;2358print_uuid32_list("32-bit Service UUIDs (partial)",2359data, data_len);2360break;23612362case BT_EIR_UUID32_ALL:2363if (data_len < sizeof(uint32_t))2364break;2365print_uuid32_list("32-bit Service UUIDs (complete)",2366data, data_len);2367break;23682369case BT_EIR_UUID128_SOME:2370if (data_len < 16)2371break;2372print_uuid128_list("128-bit Service UUIDs (partial)",2373data, data_len);2374break;23752376case BT_EIR_UUID128_ALL:2377if (data_len < 16)2378break;2379print_uuid128_list("128-bit Service UUIDs (complete)",2380data, data_len);2381break;23822383case BT_EIR_NAME_SHORT:2384memset(name, 0, sizeof(name));2385memcpy(name, data, data_len);2386print_field("Name (short): %s", name);2387break;23882389case BT_EIR_NAME_COMPLETE:2390memset(name, 0, sizeof(name));2391memcpy(name, data, data_len);2392print_field("Name (complete): %s", name);2393break;23942395case BT_EIR_TX_POWER:2396if (data_len < 1)2397break;2398print_field("TX power: %d dBm", (int8_t) *data);2399break;24002401case BT_EIR_CLASS_OF_DEV:2402if (data_len < 3)2403break;2404print_dev_class(data);2405break;24062407case BT_EIR_SSP_HASH_P192:2408if (data_len < 16)2409break;2410print_hash("P-192", data);2411break;24122413case BT_EIR_SSP_RANDOMIZER_P192:2414if (data_len < 16)2415break;2416print_randomizer("P-192", data);2417break;24182419case BT_EIR_DEVICE_ID:2420/* SMP TK has the same value as Device ID */2421if (le)2422print_hex_field("SMP TK", data, data_len);2423else if (data_len >= 8)2424print_field("Device ID: "2425"Source 0x%4.4x "2426"Vendor 0x%4.4x "2427"Product 0x%4.4x "2428"Version 0x%4.4x",2429bt_get_le16(&data[0]),2430bt_get_le16(&data[2]),2431bt_get_le16(&data[4]),2432bt_get_le16(&data[6]));2433break;24342435case BT_EIR_SMP_OOB_FLAGS:2436print_field("SMP OOB Flags: 0x%2.2x", *data);2437break;24382439case BT_EIR_SLAVE_CONN_INTERVAL:2440if (data_len < 4)2441break;2442print_field("Slave Conn. Interval: 0x%4.4x - 0x%4.4x",2443bt_get_le16(&data[0]),2444bt_get_le16(&data[2]));2445break;24462447case BT_EIR_SERVICE_UUID16:2448if (data_len < sizeof(uint16_t))2449break;2450print_uuid16_list("16-bit Service UUIDs",2451data, data_len);2452break;24532454case BT_EIR_SERVICE_UUID128:2455if (data_len < 16)2456break;2457print_uuid128_list("128-bit Service UUIDs",2458data, data_len);2459break;24602461case BT_EIR_SERVICE_DATA:2462if (data_len < 2)2463break;2464sprintf(label, "Service Data (UUID 0x%4.4x)",2465bt_get_le16(&data[0]));2466print_hex_field(label, &data[2], data_len - 2);2467break;24682469case BT_EIR_RANDOM_ADDRESS:2470if (data_len < 6)2471break;2472print_addr("Random Address", data, 0x01);2473break;24742475case BT_EIR_PUBLIC_ADDRESS:2476if (data_len < 6)2477break;2478print_addr("Public Address", data, 0x00);2479break;24802481case BT_EIR_GAP_APPEARANCE:2482if (data_len < 2)2483break;2484print_field("Appearance: 0x%4.4x", bt_get_le16(data));2485break;24862487case BT_EIR_SSP_HASH_P256:2488if (data_len < 16)2489break;2490print_hash("P-256", data);2491break;24922493case BT_EIR_SSP_RANDOMIZER_P256:2494if (data_len < 16)2495break;2496print_randomizer("P-256", data);2497break;24982499case BT_EIR_3D_INFO_DATA:2500print_hex_field("3D Information Data", data, data_len);2501if (data_len < 2)2502break;25032504flags = *data;2505mask = flags;25062507print_field(" Features: 0x%2.2x", flags);25082509for (i = 0; eir_3d_table[i].str; i++) {2510if (flags & (1 << eir_3d_table[i].bit)) {2511print_field(" %s",2512eir_3d_table[i].str);2513mask &= ~(1 << eir_3d_table[i].bit);2514}2515}25162517if (mask)2518print_text(COLOR_UNKNOWN_FEATURE_BIT,2519" Unknown features (0x%2.2x)", mask);25202521print_field(" Path Loss Threshold: %d", data[1]);2522break;25232524case BT_EIR_MANUFACTURER_DATA:2525if (data_len < 2)2526break;2527print_manufacturer_data(data, data_len);2528break;25292530default:2531sprintf(label, "Unknown EIR field 0x%2.2x", eir[1]);2532print_hex_field(label, data, data_len);2533break;2534}25352536eir += field_len + 1;2537}25382539if (len < eir_len && eir[0] != 0)2540packet_hexdump(eir, eir_len - len);2541}25422543void packet_print_addr(const char *label, const void *data, bool random)2544{2545print_addr(label ? : "Address", data, random ? 0x01 : 0x00);2546}25472548void packet_print_ad(const void *data, uint8_t size)2549{2550print_eir(data, size, true);2551}25522553void packet_hexdump(const unsigned char *buf, uint16_t len)2554{2555static const char hexdigits[] = "0123456789abcdef";2556char str[68];2557uint16_t i;25582559if (!len)2560return;25612562for (i = 0; i < len; i++) {2563str[((i % 16) * 3) + 0] = hexdigits[buf[i] >> 4];2564str[((i % 16) * 3) + 1] = hexdigits[buf[i] & 0xf];2565str[((i % 16) * 3) + 2] = ' ';2566str[(i % 16) + 49] = isprint(buf[i]) ? buf[i] : '.';25672568if ((i + 1) % 16 == 0) {2569str[47] = ' ';2570str[48] = ' ';2571str[65] = '\0';2572print_text(COLOR_WHITE, "%s", str);2573str[0] = ' ';2574}2575}25762577if (i % 16 > 0) {2578uint16_t j;2579for (j = (i % 16); j < 16; j++) {2580str[(j * 3) + 0] = ' ';2581str[(j * 3) + 1] = ' ';2582str[(j * 3) + 2] = ' ';2583str[j + 49] = ' ';2584}2585str[47] = ' ';2586str[48] = ' ';2587str[65] = '\0';2588print_text(COLOR_WHITE, "%s", str);2589}2590}25912592void packet_control(struct timeval *tv, uint16_t index, uint16_t opcode,2593const void *data, uint16_t size)2594{2595if (index_filter && index_number != index)2596return;25972598control_message(opcode, data, size);2599}26002601struct monitor_new_index {2602uint8_t type;2603uint8_t bus;2604bdaddr_t bdaddr;2605char name[8];2606} __attribute__((packed));26072608#define MONITOR_NEW_INDEX_SIZE 1626092610#define MONITOR_DEL_INDEX_SIZE 026112612#define MAX_INDEX 1626132614struct index_data {2615uint8_t type;2616bdaddr_t bdaddr;2617};26182619static struct index_data index_list[MAX_INDEX];26202621void packet_monitor(struct timeval *tv, uint16_t index, uint16_t opcode,2622const void *data, uint16_t size)2623{2624const struct monitor_new_index *ni;2625char str[18], extra_str[24];26262627if (index_filter && index_number != index)2628return;26292630index_current = index;26312632if (tv && time_offset == ((time_t) -1))2633time_offset = tv->tv_sec;26342635switch (opcode) {2636case BTSNOOP_OPCODE_NEW_INDEX:2637ni = data;26382639if (index < MAX_INDEX) {2640index_list[index].type = ni->type;2641bacpy(&index_list[index].bdaddr, &ni->bdaddr);2642}26432644ba2str(&ni->bdaddr, str);2645packet_new_index(tv, index, str, ni->type, ni->bus, ni->name);2646break;2647case BTSNOOP_OPCODE_DEL_INDEX:2648if (index < MAX_INDEX)2649ba2str(&index_list[index].bdaddr, str);2650else2651ba2str(BDADDR_ANY, str);26522653packet_del_index(tv, index, str);2654break;2655case BTSNOOP_OPCODE_COMMAND_PKT:2656packet_hci_command(tv, index, data, size);2657break;2658case BTSNOOP_OPCODE_EVENT_PKT:2659packet_hci_event(tv, index, data, size);2660break;2661case BTSNOOP_OPCODE_ACL_TX_PKT:2662packet_hci_acldata(tv, index, false, data, size);2663break;2664case BTSNOOP_OPCODE_ACL_RX_PKT:2665packet_hci_acldata(tv, index, true, data, size);2666break;2667case BTSNOOP_OPCODE_SCO_TX_PKT:2668packet_hci_scodata(tv, index, false, data, size);2669break;2670case BTSNOOP_OPCODE_SCO_RX_PKT:2671packet_hci_scodata(tv, index, true, data, size);2672break;2673default:2674sprintf(extra_str, "(code %d len %d)", opcode, size);2675print_packet(tv, index, '*', COLOR_ERROR,2676"Unknown packet", NULL, extra_str);2677packet_hexdump(data, size);2678break;2679}2680}26812682void packet_simulator(struct timeval *tv, uint16_t frequency,2683const void *data, uint16_t size)2684{2685char str[10];26862687if (tv && time_offset == ((time_t) -1))2688time_offset = tv->tv_sec;26892690sprintf(str, "%u MHz", frequency);26912692print_packet(tv, 0, '*', COLOR_PHY_PACKET,2693"Physical packet:", NULL, str);26942695ll_packet(frequency, data, size);2696}26972698static void null_cmd(const void *data, uint8_t size)2699{2700}27012702static void status_rsp(const void *data, uint8_t size)2703{2704uint8_t status = *((const uint8_t *) data);27052706print_status(status);2707}27082709static void status_bdaddr_rsp(const void *data, uint8_t size)2710{2711uint8_t status = *((const uint8_t *) data);27122713print_status(status);2714print_bdaddr(data + 1);2715}27162717static void inquiry_cmd(const void *data, uint8_t size)2718{2719const struct bt_hci_cmd_inquiry *cmd = data;27202721print_iac(cmd->lap);2722print_field("Length: %.2fs (0x%2.2x)",2723cmd->length * 1.28, cmd->length);2724print_num_resp(cmd->num_resp);2725}27262727static void periodic_inquiry_cmd(const void *data, uint8_t size)2728{2729const struct bt_hci_cmd_periodic_inquiry *cmd = data;27302731print_field("Max period: %.2fs (0x%2.2x)",2732cmd->max_period * 1.28, cmd->max_period);2733print_field("Min period: %.2fs (0x%2.2x)",2734cmd->min_period * 1.28, cmd->min_period);2735print_iac(cmd->lap);2736print_field("Length: %.2fs (0x%2.2x)",2737cmd->length * 1.28, cmd->length);2738print_num_resp(cmd->num_resp);2739}27402741static void create_conn_cmd(const void *data, uint8_t size)2742{2743const struct bt_hci_cmd_create_conn *cmd = data;2744const char *str;27452746print_bdaddr(cmd->bdaddr);2747print_pkt_type(cmd->pkt_type);2748print_pscan_rep_mode(cmd->pscan_rep_mode);2749print_pscan_mode(cmd->pscan_mode);2750print_clock_offset(cmd->clock_offset);27512752switch (cmd->role_switch) {2753case 0x00:2754str = "Stay master";2755break;2756case 0x01:2757str = "Allow slave";2758break;2759default:2760str = "Reserved";2761break;2762}27632764print_field("Role switch: %s (0x%2.2x)", str, cmd->role_switch);2765}27662767static void disconnect_cmd(const void *data, uint8_t size)2768{2769const struct bt_hci_cmd_disconnect *cmd = data;27702771print_handle(cmd->handle);2772print_reason(cmd->reason);2773}27742775static void add_sco_conn_cmd(const void *data, uint8_t size)2776{2777const struct bt_hci_cmd_add_sco_conn *cmd = data;27782779print_handle(cmd->handle);2780print_pkt_type(cmd->pkt_type);2781}27822783static void create_conn_cancel_cmd(const void *data, uint8_t size)2784{2785const struct bt_hci_cmd_create_conn_cancel *cmd = data;27862787print_bdaddr(cmd->bdaddr);2788}27892790static void accept_conn_request_cmd(const void *data, uint8_t size)2791{2792const struct bt_hci_cmd_accept_conn_request *cmd = data;27932794print_bdaddr(cmd->bdaddr);2795print_role(cmd->role);2796}27972798static void reject_conn_request_cmd(const void *data, uint8_t size)2799{2800const struct bt_hci_cmd_reject_conn_request *cmd = data;28012802print_bdaddr(cmd->bdaddr);2803print_reason(cmd->reason);2804}28052806static void link_key_request_reply_cmd(const void *data, uint8_t size)2807{2808const struct bt_hci_cmd_link_key_request_reply *cmd = data;28092810print_bdaddr(cmd->bdaddr);2811print_link_key(cmd->link_key);2812}28132814static void link_key_request_neg_reply_cmd(const void *data, uint8_t size)2815{2816const struct bt_hci_cmd_link_key_request_neg_reply *cmd = data;28172818print_bdaddr(cmd->bdaddr);2819}28202821static void pin_code_request_reply_cmd(const void *data, uint8_t size)2822{2823const struct bt_hci_cmd_pin_code_request_reply *cmd = data;28242825print_bdaddr(cmd->bdaddr);2826print_field("PIN length: %d", cmd->pin_len);2827print_pin_code(cmd->pin_code, cmd->pin_len);2828}28292830static void pin_code_request_neg_reply_cmd(const void *data, uint8_t size)2831{2832const struct bt_hci_cmd_pin_code_request_neg_reply *cmd = data;28332834print_bdaddr(cmd->bdaddr);2835}28362837static void change_conn_pkt_type_cmd(const void *data, uint8_t size)2838{2839const struct bt_hci_cmd_change_conn_pkt_type *cmd = data;28402841print_handle(cmd->handle);2842print_pkt_type(cmd->pkt_type);2843}28442845static void auth_requested_cmd(const void *data, uint8_t size)2846{2847const struct bt_hci_cmd_auth_requested *cmd = data;28482849print_handle(cmd->handle);2850}28512852static void set_conn_encrypt_cmd(const void *data, uint8_t size)2853{2854const struct bt_hci_cmd_set_conn_encrypt *cmd = data;28552856print_handle(cmd->handle);2857print_encr_mode(cmd->encr_mode);2858}28592860static void change_conn_link_key_cmd(const void *data, uint8_t size)2861{2862const struct bt_hci_cmd_change_conn_link_key *cmd = data;28632864print_handle(cmd->handle);2865}28662867static void master_link_key_cmd(const void *data, uint8_t size)2868{2869const struct bt_hci_cmd_master_link_key *cmd = data;28702871print_key_flag(cmd->key_flag);2872}28732874static void remote_name_request_cmd(const void *data, uint8_t size)2875{2876const struct bt_hci_cmd_remote_name_request *cmd = data;28772878print_bdaddr(cmd->bdaddr);2879print_pscan_rep_mode(cmd->pscan_rep_mode);2880print_pscan_mode(cmd->pscan_mode);2881print_clock_offset(cmd->clock_offset);2882}28832884static void remote_name_request_cancel_cmd(const void *data, uint8_t size)2885{2886const struct bt_hci_cmd_remote_name_request_cancel *cmd = data;28872888print_bdaddr(cmd->bdaddr);2889}28902891static void read_remote_features_cmd(const void *data, uint8_t size)2892{2893const struct bt_hci_cmd_read_remote_features *cmd = data;28942895print_handle(cmd->handle);2896}28972898static void read_remote_ext_features_cmd(const void *data, uint8_t size)2899{2900const struct bt_hci_cmd_read_remote_ext_features *cmd = data;29012902print_handle(cmd->handle);2903print_field("Page: %d", cmd->page);2904}29052906static void read_remote_version_cmd(const void *data, uint8_t size)2907{2908const struct bt_hci_cmd_read_remote_version *cmd = data;29092910print_handle(cmd->handle);2911}29122913static void read_clock_offset_cmd(const void *data, uint8_t size)2914{2915const struct bt_hci_cmd_read_clock_offset *cmd = data;29162917print_handle(cmd->handle);2918}29192920static void read_lmp_handle_cmd(const void *data, uint8_t size)2921{2922const struct bt_hci_cmd_read_lmp_handle *cmd = data;29232924print_handle(cmd->handle);2925}29262927static void read_lmp_handle_rsp(const void *data, uint8_t size)2928{2929const struct bt_hci_rsp_read_lmp_handle *rsp = data;29302931print_status(rsp->status);2932print_handle(rsp->handle);2933print_field("LMP handle: %d", rsp->lmp_handle);2934print_field("Reserved: %d", btohl(rsp->reserved));2935}29362937static void setup_sync_conn_cmd(const void *data, uint8_t size)2938{2939const struct bt_hci_cmd_setup_sync_conn *cmd = data;29402941print_handle(cmd->handle);2942print_field("Transmit bandwidth: %d", btohl(cmd->tx_bandwidth));2943print_field("Receive bandwidth: %d", btohl(cmd->rx_bandwidth));2944print_field("Max latency: %d", btohs(cmd->max_latency));2945print_voice_setting(cmd->voice_setting);2946print_retransmission_effort(cmd->retrans_effort);2947print_pkt_type(cmd->pkt_type);2948}29492950static void accept_sync_conn_cmd(const void *data, uint8_t size)2951{2952const struct bt_hci_cmd_accept_sync_conn *cmd = data;29532954print_bdaddr(cmd->bdaddr);2955print_field("Transmit bandwidth: %d", btohl(cmd->tx_bandwidth));2956print_field("Receive bandwidth: %d", btohl(cmd->rx_bandwidth));2957print_field("Max latency: %d", btohs(cmd->max_latency));2958print_voice_setting(cmd->voice_setting);2959print_retransmission_effort(cmd->retrans_effort);2960print_pkt_type(cmd->pkt_type);2961}29622963static void reject_sync_conn_cmd(const void *data, uint8_t size)2964{2965const struct bt_hci_cmd_reject_sync_conn *cmd = data;29662967print_bdaddr(cmd->bdaddr);2968print_reason(cmd->reason);2969}29702971static void io_capability_request_reply_cmd(const void *data, uint8_t size)2972{2973const struct bt_hci_cmd_io_capability_request_reply *cmd = data;29742975print_bdaddr(cmd->bdaddr);2976print_io_capability(cmd->capability);2977print_oob_data(cmd->oob_data);2978print_authentication(cmd->authentication);2979}29802981static void user_confirm_request_reply_cmd(const void *data, uint8_t size)2982{2983const struct bt_hci_cmd_user_confirm_request_reply *cmd = data;29842985print_bdaddr(cmd->bdaddr);2986}29872988static void user_confirm_request_neg_reply_cmd(const void *data, uint8_t size)2989{2990const struct bt_hci_cmd_user_confirm_request_neg_reply *cmd = data;29912992print_bdaddr(cmd->bdaddr);2993}29942995static void user_passkey_request_reply_cmd(const void *data, uint8_t size)2996{2997const struct bt_hci_cmd_user_passkey_request_reply *cmd = data;29982999print_bdaddr(cmd->bdaddr);3000print_passkey(cmd->passkey);3001}30023003static void user_passkey_request_neg_reply_cmd(const void *data, uint8_t size)3004{3005const struct bt_hci_cmd_user_passkey_request_neg_reply *cmd = data;30063007print_bdaddr(cmd->bdaddr);3008}30093010static void remote_oob_data_request_reply_cmd(const void *data, uint8_t size)3011{3012const struct bt_hci_cmd_remote_oob_data_request_reply *cmd = data;30133014print_bdaddr(cmd->bdaddr);3015print_hash("P-192", cmd->hash);3016print_randomizer("P-192", cmd->randomizer);3017}30183019static void remote_oob_data_request_neg_reply_cmd(const void *data, uint8_t size)3020{3021const struct bt_hci_cmd_remote_oob_data_request_neg_reply *cmd = data;30223023print_bdaddr(cmd->bdaddr);3024}30253026static void io_capability_request_neg_reply_cmd(const void *data, uint8_t size)3027{3028const struct bt_hci_cmd_io_capability_request_neg_reply *cmd = data;30293030print_bdaddr(cmd->bdaddr);3031print_reason(cmd->reason);3032}30333034static void create_phy_link_cmd(const void *data, uint8_t size)3035{3036const struct bt_hci_cmd_create_phy_link *cmd = data;30373038print_phy_handle(cmd->phy_handle);3039print_key_len(cmd->key_len);3040print_key_type(cmd->key_type);30413042packet_hexdump(data + 3, size - 3);3043}30443045static void accept_phy_link_cmd(const void *data, uint8_t size)3046{3047const struct bt_hci_cmd_accept_phy_link *cmd = data;30483049print_phy_handle(cmd->phy_handle);3050print_key_len(cmd->key_len);3051print_key_type(cmd->key_type);30523053packet_hexdump(data + 3, size - 3);3054}30553056static void disconn_phy_link_cmd(const void *data, uint8_t size)3057{3058const struct bt_hci_cmd_disconn_phy_link *cmd = data;30593060print_phy_handle(cmd->phy_handle);3061print_reason(cmd->reason);3062}30633064static void create_logic_link_cmd(const void *data, uint8_t size)3065{3066const struct bt_hci_cmd_create_logic_link *cmd = data;30673068print_phy_handle(cmd->phy_handle);3069print_flow_spec("TX", cmd->tx_flow_spec);3070print_flow_spec("RX", cmd->rx_flow_spec);3071}30723073static void accept_logic_link_cmd(const void *data, uint8_t size)3074{3075const struct bt_hci_cmd_accept_logic_link *cmd = data;30763077print_phy_handle(cmd->phy_handle);3078print_flow_spec("TX", cmd->tx_flow_spec);3079print_flow_spec("RX", cmd->rx_flow_spec);3080}30813082static void disconn_logic_link_cmd(const void *data, uint8_t size)3083{3084const struct bt_hci_cmd_disconn_logic_link *cmd = data;30853086print_handle(cmd->handle);3087}30883089static void logic_link_cancel_cmd(const void *data, uint8_t size)3090{3091const struct bt_hci_cmd_logic_link_cancel *cmd = data;30923093print_phy_handle(cmd->phy_handle);3094print_field("TX flow spec: 0x%2.2x", cmd->flow_spec);3095}30963097static void logic_link_cancel_rsp(const void *data, uint8_t size)3098{3099const struct bt_hci_rsp_logic_link_cancel *rsp = data;31003101print_status(rsp->status);3102print_phy_handle(rsp->phy_handle);3103print_field("TX flow spec: 0x%2.2x", rsp->flow_spec);3104}31053106static void flow_spec_modify_cmd(const void *data, uint8_t size)3107{3108const struct bt_hci_cmd_flow_spec_modify *cmd = data;31093110print_handle(cmd->handle);3111print_flow_spec("TX", cmd->tx_flow_spec);3112print_flow_spec("RX", cmd->rx_flow_spec);3113}31143115static void hold_mode_cmd(const void *data, uint8_t size)3116{3117const struct bt_hci_cmd_hold_mode *cmd = data;31183119print_handle(cmd->handle);3120print_slot_625("Hold max interval", cmd->max_interval);3121print_slot_625("Hold min interval", cmd->min_interval);3122}31233124static void sniff_mode_cmd(const void *data, uint8_t size)3125{3126const struct bt_hci_cmd_sniff_mode *cmd = data;31273128print_handle(cmd->handle);3129print_slot_625("Sniff max interval", cmd->max_interval);3130print_slot_625("Sniff min interval", cmd->min_interval);3131print_slot_125("Sniff attempt", cmd->attempt);3132print_slot_125("Sniff timeout", cmd->timeout);3133}31343135static void exit_sniff_mode_cmd(const void *data, uint8_t size)3136{3137const struct bt_hci_cmd_exit_sniff_mode *cmd = data;31383139print_handle(cmd->handle);3140}31413142static void park_state_cmd(const void *data, uint8_t size)3143{3144const struct bt_hci_cmd_park_state *cmd = data;31453146print_handle(cmd->handle);3147print_slot_625("Beacon max interval", cmd->max_interval);3148print_slot_625("Beacon min interval", cmd->min_interval);3149}31503151static void exit_park_state_cmd(const void *data, uint8_t size)3152{3153const struct bt_hci_cmd_exit_park_state *cmd = data;31543155print_handle(cmd->handle);3156}31573158static void qos_setup_cmd(const void *data, uint8_t size)3159{3160const struct bt_hci_cmd_qos_setup *cmd = data;31613162print_handle(cmd->handle);3163print_field("Flags: 0x%2.2x", cmd->flags);31643165print_service_type(cmd->service_type);31663167print_field("Token rate: %d", btohl(cmd->token_rate));3168print_field("Peak bandwidth: %d", btohl(cmd->peak_bandwidth));3169print_field("Latency: %d", btohl(cmd->latency));3170print_field("Delay variation: %d", btohl(cmd->delay_variation));3171}31723173static void role_discovery_cmd(const void *data, uint8_t size)3174{3175const struct bt_hci_cmd_role_discovery *cmd = data;31763177print_handle(cmd->handle);3178}31793180static void role_discovery_rsp(const void *data, uint8_t size)3181{3182const struct bt_hci_rsp_role_discovery *rsp = data;31833184print_status(rsp->status);3185print_handle(rsp->handle);3186print_role(rsp->role);3187}31883189static void switch_role_cmd(const void *data, uint8_t size)3190{3191const struct bt_hci_cmd_switch_role *cmd = data;31923193print_bdaddr(cmd->bdaddr);3194print_role(cmd->role);3195}31963197static void read_link_policy_cmd(const void *data, uint8_t size)3198{3199const struct bt_hci_cmd_read_link_policy *cmd = data;32003201print_handle(cmd->handle);3202}32033204static void read_link_policy_rsp(const void *data, uint8_t size)3205{3206const struct bt_hci_rsp_read_link_policy *rsp = data;32073208print_status(rsp->status);3209print_handle(rsp->handle);3210print_link_policy(rsp->policy);3211}32123213static void write_link_policy_cmd(const void *data, uint8_t size)3214{3215const struct bt_hci_cmd_write_link_policy *cmd = data;32163217print_handle(cmd->handle);3218print_link_policy(cmd->policy);3219}32203221static void write_link_policy_rsp(const void *data, uint8_t size)3222{3223const struct bt_hci_rsp_write_link_policy *rsp = data;32243225print_status(rsp->status);3226print_handle(rsp->handle);3227}32283229static void read_default_link_policy_rsp(const void *data, uint8_t size)3230{3231const struct bt_hci_rsp_read_default_link_policy *rsp = data;32323233print_status(rsp->status);3234print_link_policy(rsp->policy);3235}32363237static void write_default_link_policy_cmd(const void *data, uint8_t size)3238{3239const struct bt_hci_cmd_write_default_link_policy *cmd = data;32403241print_link_policy(cmd->policy);3242}32433244static void flow_spec_cmd(const void *data, uint8_t size)3245{3246const struct bt_hci_cmd_flow_spec *cmd = data;32473248print_handle(cmd->handle);3249print_field("Flags: 0x%2.2x", cmd->flags);32503251print_flow_direction(cmd->direction);3252print_service_type(cmd->service_type);32533254print_field("Token rate: %d", btohl(cmd->token_rate));3255print_field("Token bucket size: %d", btohl(cmd->token_bucket_size));3256print_field("Peak bandwidth: %d", btohl(cmd->peak_bandwidth));3257print_field("Access latency: %d", btohl(cmd->access_latency));3258}32593260static void sniff_subrating_cmd(const void *data, uint8_t size)3261{3262const struct bt_hci_cmd_sniff_subrating *cmd = data;32633264print_handle(cmd->handle);3265print_slot_625("Max latency", cmd->max_latency);3266print_slot_625("Min remote timeout", cmd->min_remote_timeout);3267print_slot_625("Min local timeout", cmd->min_local_timeout);3268}32693270static void sniff_subrating_rsp(const void *data, uint8_t size)3271{3272const struct bt_hci_rsp_sniff_subrating *rsp = data;32733274print_status(rsp->status);3275print_handle(rsp->handle);3276}32773278static void set_event_mask_cmd(const void *data, uint8_t size)3279{3280const struct bt_hci_cmd_set_event_mask *cmd = data;32813282print_event_mask(cmd->mask);3283}32843285static void set_event_filter_cmd(const void *data, uint8_t size)3286{3287uint8_t type = *((const uint8_t *) data);3288uint8_t filter;3289const char *str;32903291switch (type) {3292case 0x00:3293str = "Clear All Filters";3294break;3295case 0x01:3296str = "Inquiry Result";3297break;3298case 0x02:3299str = "Connection Setup";3300break;3301default:3302str = "Reserved";3303break;3304}33053306print_field("Type: %s (0x%2.2x)", str, type);33073308switch (type) {3309case 0x00:3310if (size > 1) {3311print_text(COLOR_ERROR, " invalid parameter size");3312packet_hexdump(data + 1, size - 1);3313}3314break;33153316case 0x01:3317filter = *((const uint8_t *) (data + 1));33183319switch (filter) {3320case 0x00:3321str = "Return responses from all devices";3322break;3323case 0x01:3324str = "Device with specific Class of Device";3325break;3326case 0x02:3327str = "Device with specific BD_ADDR";3328break;3329default:3330str = "Reserved";3331break;3332}33333334print_field("Filter: %s (0x%2.2x)", str, filter);3335packet_hexdump(data + 2, size - 2);3336break;33373338case 0x02:3339filter = *((const uint8_t *) (data + 1));33403341switch (filter) {3342case 0x00:3343str = "Allow connections all devices";3344break;3345case 0x01:3346str = "Allow connections with specific Class of Device";3347break;3348case 0x02:3349str = "Allow connections with specific BD_ADDR";3350break;3351default:3352str = "Reserved";3353break;3354}33553356print_field("Filter: %s (0x%2.2x)", str, filter);3357packet_hexdump(data + 2, size - 2);3358break;33593360default:3361filter = *((const uint8_t *) (data + 1));33623363print_field("Filter: Reserved (0x%2.2x)", filter);3364packet_hexdump(data + 2, size - 2);3365break;3366}3367}33683369static void flush_cmd(const void *data, uint8_t size)3370{3371const struct bt_hci_cmd_flush *cmd = data;33723373print_handle(cmd->handle);3374}33753376static void flush_rsp(const void *data, uint8_t size)3377{3378const struct bt_hci_rsp_flush *rsp = data;33793380print_status(rsp->status);3381print_handle(rsp->handle);3382}33833384static void read_pin_type_rsp(const void *data, uint8_t size)3385{3386const struct bt_hci_rsp_read_pin_type *rsp = data;33873388print_status(rsp->status);3389print_pin_type(rsp->pin_type);3390}33913392static void write_pin_type_cmd(const void *data, uint8_t size)3393{3394const struct bt_hci_cmd_write_pin_type *cmd = data;33953396print_pin_type(cmd->pin_type);3397}33983399static void read_stored_link_key_cmd(const void *data, uint8_t size)3400{3401const struct bt_hci_cmd_read_stored_link_key *cmd = data;34023403print_bdaddr(cmd->bdaddr);3404print_field("Read all: 0x%2.2x", cmd->read_all);3405}34063407static void read_stored_link_key_rsp(const void *data, uint8_t size)3408{3409const struct bt_hci_rsp_read_stored_link_key *rsp = data;34103411print_status(rsp->status);3412print_field("Max num keys: %d", btohs(rsp->max_num_keys));3413print_field("Num keys: %d", btohs(rsp->num_keys));3414}34153416static void write_stored_link_key_cmd(const void *data, uint8_t size)3417{3418const struct bt_hci_cmd_write_stored_link_key *cmd = data;34193420print_field("Num keys: %d", cmd->num_keys);34213422packet_hexdump(data + 1, size - 1);3423}34243425static void write_stored_link_key_rsp(const void *data, uint8_t size)3426{3427const struct bt_hci_rsp_write_stored_link_key *rsp = data;34283429print_status(rsp->status);3430print_field("Num keys: %d", rsp->num_keys);3431}34323433static void delete_stored_link_key_cmd(const void *data, uint8_t size)3434{3435const struct bt_hci_cmd_delete_stored_link_key *cmd = data;34363437print_bdaddr(cmd->bdaddr);3438print_field("Delete all: 0x%2.2x", cmd->delete_all);3439}34403441static void delete_stored_link_key_rsp(const void *data, uint8_t size)3442{3443const struct bt_hci_rsp_delete_stored_link_key *rsp = data;34443445print_status(rsp->status);3446print_field("Num keys: %d", btohs(rsp->num_keys));3447}34483449static void write_local_name_cmd(const void *data, uint8_t size)3450{3451const struct bt_hci_cmd_write_local_name *cmd = data;34523453print_name(cmd->name);3454}34553456static void read_local_name_rsp(const void *data, uint8_t size)3457{3458const struct bt_hci_rsp_read_local_name *rsp = data;34593460print_status(rsp->status);3461print_name(rsp->name);3462}34633464static void read_conn_accept_timeout_rsp(const void *data, uint8_t size)3465{3466const struct bt_hci_rsp_read_conn_accept_timeout *rsp = data;34673468print_status(rsp->status);3469print_timeout(rsp->timeout);3470}34713472static void write_conn_accept_timeout_cmd(const void *data, uint8_t size)3473{3474const struct bt_hci_cmd_write_conn_accept_timeout *cmd = data;34753476print_timeout(cmd->timeout);3477}34783479static void read_page_timeout_rsp(const void *data, uint8_t size)3480{3481const struct bt_hci_rsp_read_page_timeout *rsp = data;34823483print_status(rsp->status);3484print_timeout(rsp->timeout);3485}34863487static void write_page_timeout_cmd(const void *data, uint8_t size)3488{3489const struct bt_hci_cmd_write_page_timeout *cmd = data;34903491print_timeout(cmd->timeout);3492}34933494static void read_scan_enable_rsp(const void *data, uint8_t size)3495{3496const struct bt_hci_rsp_read_scan_enable *rsp = data;34973498print_status(rsp->status);3499print_scan_enable(rsp->enable);3500}35013502static void write_scan_enable_cmd(const void *data, uint8_t size)3503{3504const struct bt_hci_cmd_write_scan_enable *cmd = data;35053506print_scan_enable(cmd->enable);3507}35083509static void read_page_scan_activity_rsp(const void *data, uint8_t size)3510{3511const struct bt_hci_rsp_read_page_scan_activity *rsp = data;35123513print_status(rsp->status);3514print_interval(rsp->interval);3515print_window(rsp->window);3516}35173518static void write_page_scan_activity_cmd(const void *data, uint8_t size)3519{3520const struct bt_hci_cmd_write_page_scan_activity *cmd = data;35213522print_interval(cmd->interval);3523print_window(cmd->window);3524}35253526static void read_inquiry_scan_activity_rsp(const void *data, uint8_t size)3527{3528const struct bt_hci_rsp_read_inquiry_scan_activity *rsp = data;35293530print_status(rsp->status);3531print_interval(rsp->interval);3532print_window(rsp->window);3533}35343535static void write_inquiry_scan_activity_cmd(const void *data, uint8_t size)3536{3537const struct bt_hci_cmd_write_inquiry_scan_activity *cmd = data;35383539print_interval(cmd->interval);3540print_window(cmd->window);3541}35423543static void read_auth_enable_rsp(const void *data, uint8_t size)3544{3545const struct bt_hci_rsp_read_auth_enable *rsp = data;35463547print_status(rsp->status);3548print_auth_enable(rsp->enable);3549}35503551static void write_auth_enable_cmd(const void *data, uint8_t size)3552{3553const struct bt_hci_cmd_write_auth_enable *cmd = data;35543555print_auth_enable(cmd->enable);3556}35573558static void read_encrypt_mode_rsp(const void *data, uint8_t size)3559{3560const struct bt_hci_rsp_read_encrypt_mode *rsp = data;35613562print_status(rsp->status);3563print_encrypt_mode(rsp->mode);3564}35653566static void write_encrypt_mode_cmd(const void *data, uint8_t size)3567{3568const struct bt_hci_cmd_write_encrypt_mode *cmd = data;35693570print_encrypt_mode(cmd->mode);3571}35723573static void read_class_of_dev_rsp(const void *data, uint8_t size)3574{3575const struct bt_hci_rsp_read_class_of_dev *rsp = data;35763577print_status(rsp->status);3578print_dev_class(rsp->dev_class);3579}35803581static void write_class_of_dev_cmd(const void *data, uint8_t size)3582{3583const struct bt_hci_cmd_write_class_of_dev *cmd = data;35843585print_dev_class(cmd->dev_class);3586}35873588static void read_voice_setting_rsp(const void *data, uint8_t size)3589{3590const struct bt_hci_rsp_read_voice_setting *rsp = data;35913592print_status(rsp->status);3593print_voice_setting(rsp->setting);3594}35953596static void write_voice_setting_cmd(const void *data, uint8_t size)3597{3598const struct bt_hci_cmd_write_voice_setting *cmd = data;35993600print_voice_setting(cmd->setting);3601}36023603static void host_buffer_size_cmd(const void *data, uint8_t size)3604{3605const struct bt_hci_cmd_host_buffer_size *cmd = data;36063607print_field("ACL MTU: %-4d ACL max packet: %d",3608btohs(cmd->acl_mtu), btohs(cmd->acl_max_pkt));3609print_field("SCO MTU: %-4d SCO max packet: %d",3610cmd->sco_mtu, btohs(cmd->sco_max_pkt));3611}36123613static void read_link_supv_timeout_cmd(const void *data, uint8_t size)3614{3615const struct bt_hci_cmd_read_link_supv_timeout *cmd = data;36163617print_handle(cmd->handle);3618}36193620static void read_link_supv_timeout_rsp(const void *data, uint8_t size)3621{3622const struct bt_hci_rsp_read_link_supv_timeout *rsp = data;36233624print_status(rsp->status);3625print_handle(rsp->handle);3626print_timeout(rsp->timeout);3627}36283629static void write_link_supv_timeout_cmd(const void *data, uint8_t size)3630{3631const struct bt_hci_cmd_write_link_supv_timeout *cmd = data;36323633print_handle(cmd->handle);3634print_timeout(cmd->timeout);3635}36363637static void write_link_supv_timeout_rsp(const void *data, uint8_t size)3638{3639const struct bt_hci_rsp_write_link_supv_timeout *rsp = data;36403641print_status(rsp->status);3642print_handle(rsp->handle);3643}36443645static void read_num_supported_iac_rsp(const void *data, uint8_t size)3646{3647const struct bt_hci_rsp_read_num_supported_iac *rsp = data;36483649print_status(rsp->status);3650print_field("Number of IAC: %d", rsp->num_iac);3651}36523653static void read_current_iac_lap_rsp(const void *data, uint8_t size)3654{3655const struct bt_hci_rsp_read_current_iac_lap *rsp = data;3656uint8_t i;36573658print_status(rsp->status);3659print_field("Number of IAC: %d", rsp->num_iac);36603661for (i = 0; i < rsp->num_iac; i++)3662print_iac(rsp->iac_lap + (i * 3));3663}36643665static void write_current_iac_lap_cmd(const void *data, uint8_t size)3666{3667const struct bt_hci_cmd_write_current_iac_lap *cmd = data;3668uint8_t i;36693670print_field("Number of IAC: %d", cmd->num_iac);36713672for (i = 0; i < cmd->num_iac; i++)3673print_iac(cmd->iac_lap + (i * 3));3674}36753676static void read_page_scan_period_mode_rsp(const void *data, uint8_t size)3677{3678const struct bt_hci_rsp_read_page_scan_period_mode *rsp = data;36793680print_status(rsp->status);3681print_pscan_period_mode(rsp->mode);3682}36833684static void write_page_scan_period_mode_cmd(const void *data, uint8_t size)3685{3686const struct bt_hci_cmd_write_page_scan_period_mode *cmd = data;36873688print_pscan_period_mode(cmd->mode);3689}36903691static void read_page_scan_mode_rsp(const void *data, uint8_t size)3692{3693const struct bt_hci_rsp_read_page_scan_mode *rsp = data;36943695print_status(rsp->status);3696print_pscan_mode(rsp->mode);3697}36983699static void write_page_scan_mode_cmd(const void *data, uint8_t size)3700{3701const struct bt_hci_cmd_write_page_scan_mode *cmd = data;37023703print_pscan_mode(cmd->mode);3704}37053706static void set_afh_host_classification_cmd(const void *data, uint8_t size)3707{3708const struct bt_hci_cmd_set_afh_host_classification *cmd = data;37093710print_channel_map(cmd->map);3711}37123713static void read_inquiry_scan_type_rsp(const void *data, uint8_t size)3714{3715const struct bt_hci_rsp_read_inquiry_scan_type *rsp = data;37163717print_status(rsp->status);3718print_inquiry_scan_type(rsp->type);3719}37203721static void write_inquiry_scan_type_cmd(const void *data, uint8_t size)3722{3723const struct bt_hci_cmd_write_inquiry_scan_type *cmd = data;37243725print_inquiry_scan_type(cmd->type);3726}37273728static void read_inquiry_mode_rsp(const void *data, uint8_t size)3729{3730const struct bt_hci_rsp_read_inquiry_mode *rsp = data;37313732print_status(rsp->status);3733print_inquiry_mode(rsp->mode);3734}37353736static void write_inquiry_mode_cmd(const void *data, uint8_t size)3737{3738const struct bt_hci_cmd_write_inquiry_mode *cmd = data;37393740print_inquiry_mode(cmd->mode);3741}37423743static void read_page_scan_type_rsp(const void *data, uint8_t size)3744{3745const struct bt_hci_rsp_read_page_scan_type *rsp = data;37463747print_status(rsp->status);3748print_pscan_type(rsp->type);3749}37503751static void write_page_scan_type_cmd(const void *data, uint8_t size)3752{3753const struct bt_hci_cmd_write_page_scan_type *cmd = data;37543755print_pscan_type(cmd->type);3756}37573758static void read_afh_assessment_mode_rsp(const void *data, uint8_t size)3759{3760const struct bt_hci_rsp_read_afh_assessment_mode *rsp = data;37613762print_status(rsp->status);3763print_afh_mode(rsp->mode);3764}37653766static void write_afh_assessment_mode_cmd(const void *data, uint8_t size)3767{3768const struct bt_hci_cmd_write_afh_assessment_mode *cmd = data;37693770print_afh_mode(cmd->mode);3771}37723773static void read_ext_inquiry_response_rsp(const void *data, uint8_t size)3774{3775const struct bt_hci_rsp_read_ext_inquiry_response *rsp = data;37763777print_status(rsp->status);3778print_fec(rsp->fec);3779print_eir(rsp->data, sizeof(rsp->data), false);3780}37813782static void write_ext_inquiry_response_cmd(const void *data, uint8_t size)3783{3784const struct bt_hci_cmd_write_ext_inquiry_response *cmd = data;37853786print_fec(cmd->fec);3787print_eir(cmd->data, sizeof(cmd->data), false);3788}37893790static void refresh_encrypt_key_cmd(const void *data, uint8_t size)3791{3792const struct bt_hci_cmd_refresh_encrypt_key *cmd = data;37933794print_handle(cmd->handle);3795}37963797static void read_simple_pairing_mode_rsp(const void *data, uint8_t size)3798{3799const struct bt_hci_rsp_read_simple_pairing_mode *rsp = data;38003801print_status(rsp->status);3802print_simple_pairing_mode(rsp->mode);3803}38043805static void write_simple_pairing_mode_cmd(const void *data, uint8_t size)3806{3807const struct bt_hci_cmd_write_simple_pairing_mode *cmd = data;38083809print_simple_pairing_mode(cmd->mode);3810}38113812static void read_local_oob_data_rsp(const void *data, uint8_t size)3813{3814const struct bt_hci_rsp_read_local_oob_data *rsp = data;38153816print_status(rsp->status);3817print_hash("P-192", rsp->hash);3818print_randomizer("P-192", rsp->randomizer);3819}38203821static void read_inquiry_resp_tx_power_rsp(const void *data, uint8_t size)3822{3823const struct bt_hci_rsp_read_inquiry_resp_tx_power *rsp = data;38243825print_status(rsp->status);3826print_field("TX power: %d dBm", rsp->level);3827}38283829static void write_inquiry_tx_power_cmd(const void *data, uint8_t size)3830{3831const struct bt_hci_cmd_write_inquiry_tx_power *cmd = data;38323833print_field("TX power: %d dBm", cmd->level);3834}38353836static void enhanced_flush_cmd(const void *data, uint8_t size)3837{3838const struct bt_hci_cmd_enhanced_flush *cmd = data;3839const char *str;38403841print_handle(cmd->handle);38423843switch (cmd->type) {3844case 0x00:3845str = "Automatic flushable only";3846break;3847default:3848str = "Reserved";3849break;3850}38513852print_field("Type: %s (0x%2.2x)", str, cmd->type);3853}38543855static void set_event_mask_page2_cmd(const void *data, uint8_t size)3856{3857const struct bt_hci_cmd_set_event_mask_page2 *cmd = data;38583859print_event_mask_page2(cmd->mask);3860}38613862static void read_location_data_rsp(const void *data, uint8_t size)3863{3864const struct bt_hci_rsp_read_location_data *rsp = data;38653866print_status(rsp->status);3867print_location_domain_aware(rsp->domain_aware);3868print_location_domain(rsp->domain);3869print_location_domain_options(rsp->domain_options);3870print_location_options(rsp->options);3871}38723873static void write_location_data_cmd(const void *data, uint8_t size)3874{3875const struct bt_hci_cmd_write_location_data *cmd = data;38763877print_location_domain_aware(cmd->domain_aware);3878print_location_domain(cmd->domain);3879print_location_domain_options(cmd->domain_options);3880print_location_options(cmd->options);3881}38823883static void read_flow_control_mode_rsp(const void *data, uint8_t size)3884{3885const struct bt_hci_rsp_read_flow_control_mode *rsp = data;38863887print_status(rsp->status);3888print_flow_control_mode(rsp->mode);3889}38903891static void write_flow_control_mode_cmd(const void *data, uint8_t size)3892{3893const struct bt_hci_cmd_write_flow_control_mode *cmd = data;38943895print_flow_control_mode(cmd->mode);3896}38973898static void read_le_host_supported_rsp(const void *data, uint8_t size)3899{3900const struct bt_hci_rsp_read_le_host_supported *rsp = data;39013902print_status(rsp->status);3903print_field("Supported: 0x%2.2x", rsp->supported);3904print_field("Simultaneous: 0x%2.2x", rsp->simultaneous);3905}39063907static void write_le_host_supported_cmd(const void *data, uint8_t size)3908{3909const struct bt_hci_cmd_write_le_host_supported *cmd = data;39103911print_field("Supported: 0x%2.2x", cmd->supported);3912print_field("Simultaneous: 0x%2.2x", cmd->simultaneous);3913}39143915static void read_sync_train_params_rsp(const void *data, uint8_t size)3916{3917const struct bt_hci_rsp_read_sync_train_params *rsp = data;39183919print_status(rsp->status);3920print_interval(rsp->interval);3921print_field("Timeout: %.3f msec (0x%8.8x)",3922btohl(rsp->timeout) * 0.625, btohl(rsp->timeout));3923print_field("Service Data: 0x%2.2x", rsp->service_data);3924}39253926static void read_local_version_rsp(const void *data, uint8_t size)3927{3928const struct bt_hci_rsp_read_local_version *rsp = data;39293930print_status(rsp->status);3931print_hci_version(rsp->hci_ver, rsp->hci_rev);39323933switch (index_list[index_current].type) {3934case HCI_BREDR:3935print_lmp_version(rsp->lmp_ver, rsp->lmp_subver);3936break;3937case HCI_AMP:3938print_pal_version(rsp->lmp_ver, rsp->lmp_subver);3939break;3940}39413942print_manufacturer(rsp->manufacturer);3943}39443945static void read_local_commands_rsp(const void *data, uint8_t size)3946{3947const struct bt_hci_rsp_read_local_commands *rsp = data;39483949print_status(rsp->status);3950print_commands(rsp->commands);3951}39523953static void read_local_features_rsp(const void *data, uint8_t size)3954{3955const struct bt_hci_rsp_read_local_features *rsp = data;39563957print_status(rsp->status);3958print_features(0, rsp->features, 0x00);3959}39603961static void read_local_ext_features_cmd(const void *data, uint8_t size)3962{3963const struct bt_hci_cmd_read_local_ext_features *cmd = data;39643965print_field("Page: %d", cmd->page);3966}39673968static void read_local_ext_features_rsp(const void *data, uint8_t size)3969{3970const struct bt_hci_rsp_read_local_ext_features *rsp = data;39713972print_status(rsp->status);3973print_field("Page: %d/%d", rsp->page, rsp->max_page);3974print_features(rsp->page, rsp->features, 0x00);3975}39763977static void read_buffer_size_rsp(const void *data, uint8_t size)3978{3979const struct bt_hci_rsp_read_buffer_size *rsp = data;39803981print_status(rsp->status);3982print_field("ACL MTU: %-4d ACL max packet: %d",3983btohs(rsp->acl_mtu), btohs(rsp->acl_max_pkt));3984print_field("SCO MTU: %-4d SCO max packet: %d",3985rsp->sco_mtu, btohs(rsp->sco_max_pkt));3986}39873988static void read_country_code_rsp(const void *data, uint8_t size)3989{3990const struct bt_hci_rsp_read_country_code *rsp = data;3991const char *str;39923993print_status(rsp->status);39943995switch (rsp->code) {3996case 0x00:3997str = "North America, Europe*, Japan";3998break;3999case 0x01:4000str = "France";4001break;4002default:4003str = "Reserved";4004break;4005}40064007print_field("Country code: %s (0x%2.2x)", str, rsp->code);4008}40094010static void read_bd_addr_rsp(const void *data, uint8_t size)4011{4012const struct bt_hci_rsp_read_bd_addr *rsp = data;40134014print_status(rsp->status);4015print_bdaddr(rsp->bdaddr);4016}40174018static void read_data_block_size_rsp(const void *data, uint8_t size)4019{4020const struct bt_hci_rsp_read_data_block_size *rsp = data;40214022print_status(rsp->status);4023print_field("Max ACL length: %d", btohs(rsp->max_acl_len));4024print_field("Block length: %d", btohs(rsp->block_len));4025print_field("Num blocks: %d", btohs(rsp->num_blocks));4026}40274028static void read_failed_contact_counter_cmd(const void *data, uint8_t size)4029{4030const struct bt_hci_cmd_read_failed_contact_counter *cmd = data;40314032print_handle(cmd->handle);4033}40344035static void read_failed_contact_counter_rsp(const void *data, uint8_t size)4036{4037const struct bt_hci_rsp_read_failed_contact_counter *rsp = data;40384039print_status(rsp->status);4040print_handle(rsp->handle);4041print_field("Counter: %u", htobs(rsp->counter));4042}40434044static void reset_failed_contact_counter_cmd(const void *data, uint8_t size)4045{4046const struct bt_hci_cmd_reset_failed_contact_counter *cmd = data;40474048print_handle(cmd->handle);4049}40504051static void reset_failed_contact_counter_rsp(const void *data, uint8_t size)4052{4053const struct bt_hci_rsp_reset_failed_contact_counter *rsp = data;40544055print_status(rsp->status);4056print_handle(rsp->handle);4057}40584059static void read_link_quality_cmd(const void *data, uint8_t size)4060{4061const struct bt_hci_cmd_read_link_quality *cmd = data;40624063print_handle(cmd->handle);4064}40654066static void read_link_quality_rsp(const void *data, uint8_t size)4067{4068const struct bt_hci_rsp_read_link_quality *rsp = data;40694070print_status(rsp->status);4071print_handle(rsp->handle);4072print_field("Link quality: 0x%2.2x", rsp->link_quality);4073}40744075static void read_rssi_cmd(const void *data, uint8_t size)4076{4077const struct bt_hci_cmd_read_rssi *cmd = data;40784079print_handle(cmd->handle);4080}40814082static void read_rssi_rsp(const void *data, uint8_t size)4083{4084const struct bt_hci_rsp_read_rssi *rsp = data;40854086print_status(rsp->status);4087print_handle(rsp->handle);4088print_rssi(rsp->rssi);4089}40904091static void read_afh_channel_map_cmd(const void *data, uint8_t size)4092{4093const struct bt_hci_cmd_read_afh_channel_map *cmd = data;40944095print_handle(cmd->handle);4096}40974098static void read_afh_channel_map_rsp(const void *data, uint8_t size)4099{4100const struct bt_hci_rsp_read_afh_channel_map *rsp = data;41014102print_status(rsp->status);4103print_handle(rsp->handle);4104print_afh_mode(rsp->mode);4105print_channel_map(rsp->map);4106}41074108static void read_clock_cmd(const void *data, uint8_t size)4109{4110const struct bt_hci_cmd_read_clock *cmd = data;4111const char *str;41124113print_handle(cmd->handle);41144115switch (cmd->type) {4116case 0x00:4117str = "Local clock";4118break;4119case 0x01:4120str = "Piconet clock";4121break;4122default:4123str = "Reserved";4124break;4125}41264127print_field("Type: %s (0x%2.2x)", str, cmd->type);4128}41294130static void read_clock_rsp(const void *data, uint8_t size)4131{4132const struct bt_hci_rsp_read_clock *rsp = data;41334134print_status(rsp->status);4135print_handle(rsp->handle);4136print_clock(rsp->clock);4137print_clock_accuracy(rsp->accuracy);4138}41394140static void read_encrypt_key_size_cmd(const void *data, uint8_t size)4141{4142const struct bt_hci_cmd_read_encrypt_key_size *cmd = data;41434144print_handle(cmd->handle);4145}41464147static void read_encrypt_key_size_rsp(const void *data, uint8_t size)4148{4149const struct bt_hci_rsp_read_encrypt_key_size *rsp = data;41504151print_status(rsp->status);4152print_handle(rsp->handle);4153print_key_size(rsp->key_size);4154}41554156static void read_local_amp_info_rsp(const void *data, uint8_t size)4157{4158const struct bt_hci_rsp_read_local_amp_info *rsp = data;4159const char *str;41604161print_status(rsp->status);4162print_amp_status(rsp->amp_status);41634164print_field("Total bandwidth: %d kbps", btohl(rsp->total_bw));4165print_field("Max guaranteed bandwidth: %d kbps", btohl(rsp->max_bw));4166print_field("Min latency: %d", btohl(rsp->min_latency));4167print_field("Max PDU size: %d", btohl(rsp->max_pdu));41684169switch (rsp->amp_type) {4170case 0x00:4171str = "Primary BR/EDR Controller";4172break;4173case 0x01:4174str = "802.11 AMP Controller";4175break;4176default:4177str = "Reserved";4178break;4179}41804181print_field("Controller type: %s (0x%2.2x)", str, rsp->amp_type);41824183print_field("PAL capabilities: 0x%4.4x", btohs(rsp->pal_cap));4184print_field("Max ASSOC length: %d", btohs(rsp->max_assoc_len));4185print_field("Max flush timeout: %d", btohl(rsp->max_flush_to));4186print_field("Best effort flush timeout: %d", btohl(rsp->be_flush_to));4187}41884189static void read_local_amp_assoc_cmd(const void *data, uint8_t size)4190{4191const struct bt_hci_cmd_read_local_amp_assoc *cmd = data;41924193print_phy_handle(cmd->phy_handle);4194print_field("Length so far: %d", btohs(cmd->len_so_far));4195print_field("Max ASSOC length: %d", btohs(cmd->max_assoc_len));4196}41974198static void read_local_amp_assoc_rsp(const void *data, uint8_t size)4199{4200const struct bt_hci_rsp_read_local_amp_assoc *rsp = data;42014202print_status(rsp->status);4203print_phy_handle(rsp->phy_handle);4204print_field("Remaining ASSOC length: %d", btohs(rsp->remain_assoc_len));42054206packet_hexdump(data + 4, size - 4);4207}42084209static void write_remote_amp_assoc_cmd(const void *data, uint8_t size)4210{4211const struct bt_hci_cmd_write_remote_amp_assoc *cmd = data;42124213print_phy_handle(cmd->phy_handle);4214print_field("Length so far: %d", btohs(cmd->len_so_far));4215print_field("Remaining ASSOC length: %d", btohs(cmd->remain_assoc_len));42164217packet_hexdump(data + 5, size - 5);4218}42194220static void write_remote_amp_assoc_rsp(const void *data, uint8_t size)4221{4222const struct bt_hci_rsp_write_remote_amp_assoc *rsp = data;42234224print_status(rsp->status);4225print_phy_handle(rsp->phy_handle);4226}42274228static void le_set_event_mask_cmd(const void *data, uint8_t size)4229{4230const struct bt_hci_cmd_le_set_event_mask *cmd = data;42314232print_event_mask_le(cmd->mask);4233}42344235static void le_read_buffer_size_rsp(const void *data, uint8_t size)4236{4237const struct bt_hci_rsp_le_read_buffer_size *rsp = data;42384239print_status(rsp->status);4240print_field("Data packet length: %d", btohs(rsp->le_mtu));4241print_field("Num data packets: %d", rsp->le_max_pkt);4242}42434244static void le_read_local_features_rsp(const void *data, uint8_t size)4245{4246const struct bt_hci_rsp_le_read_local_features *rsp = data;42474248print_status(rsp->status);4249print_features(0, rsp->features, 0x01);4250}42514252static void le_set_random_address_cmd(const void *data, uint8_t size)4253{4254const struct bt_hci_cmd_le_set_random_address *cmd = data;42554256print_addr("Address", cmd->addr, 0x01);4257}42584259static void le_set_adv_parameters_cmd(const void *data, uint8_t size)4260{4261const struct bt_hci_cmd_le_set_adv_parameters *cmd = data;4262const char *str;42634264print_slot_625("Min advertising interval", cmd->min_interval);4265print_slot_625("Max advertising interval", cmd->max_interval);42664267switch (cmd->type) {4268case 0x00:4269str = "Connectable undirected - ADV_IND";4270break;4271case 0x01:4272str = "Connectable directed - ADV_DIRECT_IND";4273break;4274case 0x02:4275str = "Scannable undirected - ADV_SCAN_IND";4276break;4277case 0x03:4278str = "Non connectable undirect - ADV_NONCONN_IND";4279break;4280default:4281str = "Reserved";4282break;4283}42844285print_field("Type: %s (0x%2.2x)", str, cmd->type);42864287print_addr_type("Own address type", cmd->own_addr_type);4288print_addr_type("Direct address type", cmd->direct_addr_type);4289print_addr("Direct address", cmd->direct_addr, cmd->direct_addr_type);42904291switch (cmd->channel_map) {4292case 0x01:4293str = "37";4294break;4295case 0x02:4296str = "38";4297break;4298case 0x03:4299str = "37, 38";4300break;4301case 0x04:4302str = "39";4303break;4304case 0x05:4305str = "37, 39";4306break;4307case 0x06:4308str = "38, 39";4309break;4310case 0x07:4311str = "37, 38, 39";4312break;4313default:4314str = "Reserved";4315break;4316}43174318print_field("Channel map: %s (0x%2.2x)", str, cmd->channel_map);43194320switch (cmd->filter_policy) {4321case 0x00:4322str = "Allow Scan Request from Any, "4323"Allow Connect Request from Any";4324break;4325case 0x01:4326str = "Allow Scan Request from White List Only, "4327"Allow Connect Request from Any";4328break;4329case 0x02:4330str = "Allow Scan Request from Any, "4331"Allow Connect Request from White List Only";4332break;4333case 0x03:4334str = "Allow Scan Request from White List Only, "4335"Allow Connect Request from White List Only";4336default:4337str = "Reserved";4338break;4339}43404341print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);4342}43434344static void le_read_adv_tx_power_rsp(const void *data, uint8_t size)4345{4346const struct bt_hci_rsp_le_read_adv_tx_power *rsp = data;43474348print_status(rsp->status);4349print_field("TX power: %d dBm", rsp->level);4350}43514352static void le_set_adv_data_cmd(const void *data, uint8_t size)4353{4354const struct bt_hci_cmd_le_set_adv_data *cmd = data;43554356print_field("Length: %d", cmd->len);4357print_eir(cmd->data, cmd->len, true);4358}43594360static void le_set_scan_rsp_data_cmd(const void *data, uint8_t size)4361{4362const struct bt_hci_cmd_le_set_scan_rsp_data *cmd = data;43634364print_field("Length: %d", cmd->len);4365print_eir(cmd->data, cmd->len, true);4366}43674368static void le_set_adv_enable_cmd(const void *data, uint8_t size)4369{4370const struct bt_hci_cmd_le_set_adv_enable *cmd = data;4371const char *str;43724373switch (cmd->enable) {4374case 0x00:4375str = "Disabled";4376break;4377case 0x01:4378str = "Enabled";4379break;4380default:4381str = "Reserved";4382break;4383}43844385print_field("Advertising: %s (0x%2.2x)", str, cmd->enable);4386}43874388static void le_set_scan_parameters_cmd(const void *data, uint8_t size)4389{4390const struct bt_hci_cmd_le_set_scan_parameters *cmd = data;4391const char *str;43924393switch (cmd->type) {4394case 0x00:4395str = "Passive";4396break;4397case 0x01:4398str = "Active";4399break;4400default:4401str = "Reserved";4402break;4403}44044405print_field("Type: %s (0x%2.2x)", str, cmd->type);44064407print_interval(cmd->interval);4408print_window(cmd->window);4409print_addr_type("Own address type", cmd->own_addr_type);44104411switch (cmd->filter_policy) {4412case 0x00:4413str = "Accept all advertisement";4414break;4415case 0x01:4416str = "Ignore not in white list";4417break;4418default:4419str = "Reserved";4420break;4421}44224423print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);4424}44254426static void le_set_scan_enable_cmd(const void *data, uint8_t size)4427{4428const struct bt_hci_cmd_le_set_scan_enable *cmd = data;4429const char *str;44304431switch (cmd->enable) {4432case 0x00:4433str = "Disabled";4434break;4435case 0x01:4436str = "Enabled";4437break;4438default:4439str = "Reserved";4440break;4441}44424443print_field("Scanning: %s (0x%2.2x)", str, cmd->enable);44444445switch (cmd->filter_dup) {4446case 0x00:4447str = "Disabled";4448break;4449case 0x01:4450str = "Enabled";4451break;4452default:4453str = "Reserved";4454break;4455}44564457print_field("Filter duplicates: %s (0x%2.2x)", str, cmd->filter_dup);4458}44594460static void le_create_conn_cmd(const void *data, uint8_t size)4461{4462const struct bt_hci_cmd_le_create_conn *cmd = data;4463const char *str;44644465print_slot_625("Scan interval", cmd->scan_interval);4466print_slot_625("Scan window", cmd->scan_window);44674468switch (cmd->filter_policy) {4469case 0x00:4470str = "White list is not used";4471break;4472case 0x01:4473str = "White list is used";4474break;4475default:4476str = "Reserved";4477break;4478}44794480print_field("Filter policy: %s (0x%2.2x)", str, cmd->filter_policy);44814482print_addr_type("Peer address type", cmd->peer_addr_type);4483print_addr("Peer address", cmd->peer_addr, cmd->peer_addr_type);4484print_addr_type("Own address type", cmd->own_addr_type);44854486print_slot_125("Min connection interval", cmd->min_interval);4487print_slot_125("Max connection interval", cmd->max_interval);4488print_field("Connection latency: 0x%4.4x", btohs(cmd->latency));4489print_field("Supervision timeout: %d msec (0x%4.4x)",4490btohs(cmd->supv_timeout) * 10, btohs(cmd->supv_timeout));4491print_slot_625("Min connection length", cmd->min_length);4492print_slot_625("Max connection length", cmd->max_length);4493}44944495static void le_read_white_list_size_rsp(const void *data, uint8_t size)4496{4497const struct bt_hci_rsp_le_read_white_list_size *rsp = data;44984499print_status(rsp->status);4500print_field("Size: %u", rsp->size);4501}45024503static void le_add_to_white_list_cmd(const void *data, uint8_t size)4504{4505const struct bt_hci_cmd_le_add_to_white_list *cmd = data;45064507print_addr_type("Address type", cmd->addr_type);4508print_addr("Address", cmd->addr, cmd->addr_type);4509}45104511static void le_remove_from_white_list_cmd(const void *data, uint8_t size)4512{4513const struct bt_hci_cmd_le_remove_from_white_list *cmd = data;45144515print_addr_type("Address type", cmd->addr_type);4516print_addr("Address", cmd->addr, cmd->addr_type);4517}45184519static void le_conn_update_cmd(const void *data, uint8_t size)4520{4521const struct bt_hci_cmd_le_conn_update *cmd = data;45224523print_handle(cmd->handle);4524print_slot_125("Min connection interval", cmd->min_interval);4525print_slot_125("Max connection interval", cmd->max_interval);4526print_field("Connection latency: 0x%4.4x", btohs(cmd->latency));4527print_field("Supervision timeout: %d msec (0x%4.4x)",4528btohs(cmd->supv_timeout) * 10, btohs(cmd->supv_timeout));4529print_slot_625("Min connection length", cmd->min_length);4530print_slot_625("Max connection length", cmd->max_length);4531}45324533static void le_set_host_classification_cmd(const void *data, uint8_t size)4534{4535const struct bt_hci_cmd_le_set_host_classification *cmd = data;45364537print_le_channel_map(cmd->map);4538}45394540static void le_read_channel_map_cmd(const void *data, uint8_t size)4541{4542const struct bt_hci_cmd_le_read_channel_map *cmd = data;45434544print_handle(cmd->handle);4545}45464547static void le_read_channel_map_rsp(const void *data, uint8_t size)4548{4549const struct bt_hci_rsp_le_read_channel_map *rsp = data;45504551print_status(rsp->status);4552print_handle(rsp->handle);4553print_le_channel_map(rsp->map);4554}45554556static void le_read_remote_features_cmd(const void *data, uint8_t size)4557{4558const struct bt_hci_cmd_le_read_remote_features *cmd = data;45594560print_handle(cmd->handle);4561}45624563static void le_encrypt_cmd(const void *data, uint8_t size)4564{4565const struct bt_hci_cmd_le_encrypt *cmd = data;45664567print_key("Key", cmd->key);4568print_key("Plaintext data", cmd->plaintext);4569}45704571static void le_encrypt_rsp(const void *data, uint8_t size)4572{4573const struct bt_hci_rsp_le_encrypt *rsp = data;45744575print_status(rsp->status);4576print_key("Encrypted data", rsp->data);4577}45784579static void le_rand_rsp(const void *data, uint8_t size)4580{4581const struct bt_hci_rsp_le_rand *rsp = data;45824583print_status(rsp->status);4584print_random_number(rsp->number);4585}45864587static void le_start_encrypt_cmd(const void *data, uint8_t size)4588{4589const struct bt_hci_cmd_le_start_encrypt *cmd = data;45904591print_handle(cmd->handle);4592print_random_number(cmd->number);4593print_field("Encryption diversifier: 0x%4.4x",4594btohs(cmd->diversifier));4595print_key("Long term key", cmd->ltk);4596}45974598static void le_ltk_req_reply_cmd(const void *data, uint8_t size)4599{4600const struct bt_hci_cmd_le_ltk_req_reply *cmd = data;46014602print_handle(cmd->handle);4603print_key("Long term key", cmd->ltk);4604}46054606static void le_ltk_req_reply_rsp(const void *data, uint8_t size)4607{4608const struct bt_hci_rsp_le_ltk_req_reply *rsp = data;46094610print_status(rsp->status);4611print_handle(rsp->handle);4612}46134614static void le_ltk_req_neg_reply_cmd(const void *data, uint8_t size)4615{4616const struct bt_hci_cmd_le_ltk_req_neg_reply *cmd = data;46174618print_handle(cmd->handle);4619}46204621static void le_ltk_req_neg_reply_rsp(const void *data, uint8_t size)4622{4623const struct bt_hci_rsp_le_ltk_req_neg_reply *rsp = data;46244625print_status(rsp->status);4626print_handle(rsp->handle);4627}46284629static void le_read_supported_states_rsp(const void *data, uint8_t size)4630{4631const struct bt_hci_rsp_le_read_supported_states *rsp = data;46324633print_status(rsp->status);4634print_le_states(rsp->states);4635}46364637static void le_receiver_test_cmd(const void *data, uint8_t size)4638{4639const struct bt_hci_cmd_le_receiver_test *cmd = data;46404641print_field("RX frequency: %d MHz (0x%2.2x)",4642(cmd->frequency * 2) + 2402, cmd->frequency);4643}46444645static void le_transmitter_test_cmd(const void *data, uint8_t size)4646{4647const struct bt_hci_cmd_le_transmitter_test *cmd = data;46484649print_field("TX frequency: %d MHz (0x%2.2x)",4650(cmd->frequency * 2) + 2402, cmd->frequency);4651print_field("Test data length: %d bytes", cmd->data_len);4652print_field("Packet payload: 0x%2.2x", cmd->payload);4653}46544655static void le_test_end_rsp(const void *data, uint8_t size)4656{4657const struct bt_hci_rsp_le_test_end *rsp = data;46584659print_status(rsp->status);4660print_field("Number of packets: %d", btohs(rsp->num_packets));4661}46624663struct opcode_data {4664uint16_t opcode;4665int bit;4666const char *str;4667void (*cmd_func) (const void *data, uint8_t size);4668uint8_t cmd_size;4669bool cmd_fixed;4670void (*rsp_func) (const void *data, uint8_t size);4671uint8_t rsp_size;4672bool rsp_fixed;4673};46744675static const struct opcode_data opcode_table[] = {4676{ 0x0000, -1, "NOP" },46774678/* OGF 1 - Link Control */4679{ 0x0401, 0, "Inquiry",4680inquiry_cmd, 5, true },4681{ 0x0402, 1, "Inquiry Cancel",4682null_cmd, 0, true,4683status_rsp, 1, true },4684{ 0x0403, 2, "Periodic Inquiry Mode",4685periodic_inquiry_cmd, 9, true,4686status_rsp, 1, true },4687{ 0x0404, 3, "Exit Periodic Inquiry Mode",4688null_cmd, 0, true,4689status_rsp, 1, true },4690{ 0x0405, 4, "Create Connection",4691create_conn_cmd, 13, true },4692{ 0x0406, 5, "Disconnect",4693disconnect_cmd, 3, true },4694{ 0x0407, 6, "Add SCO Connection",4695add_sco_conn_cmd, 4, true },4696{ 0x0408, 7, "Create Connection Cancel",4697create_conn_cancel_cmd, 6, true,4698status_bdaddr_rsp, 7, true },4699{ 0x0409, 8, "Accept Connection Request",4700accept_conn_request_cmd, 7, true },4701{ 0x040a, 9, "Reject Connection Request",4702reject_conn_request_cmd, 7, true },4703{ 0x040b, 10, "Link Key Request Reply",4704link_key_request_reply_cmd, 22, true,4705status_bdaddr_rsp, 7, true },4706{ 0x040c, 11, "Link Key Request Negative Reply",4707link_key_request_neg_reply_cmd, 6, true,4708status_bdaddr_rsp, 7, true },4709{ 0x040d, 12, "PIN Code Request Reply",4710pin_code_request_reply_cmd, 23, true,4711status_bdaddr_rsp, 7, true },4712{ 0x040e, 13, "PIN Code Request Negative Reply",4713pin_code_request_neg_reply_cmd, 6, true,4714status_bdaddr_rsp, 7, true },4715{ 0x040f, 14, "Change Connection Packet Type",4716change_conn_pkt_type_cmd, 4, true },4717{ 0x0411, 15, "Authentication Requested",4718auth_requested_cmd, 2, true },4719{ 0x0413, 16, "Set Connection Encryption",4720set_conn_encrypt_cmd, 3, true },4721{ 0x0415, 17, "Change Connection Link Key",4722change_conn_link_key_cmd, 2, true },4723{ 0x0417, 18, "Master Link Key",4724master_link_key_cmd, 1, true },4725{ 0x0419, 19, "Remote Name Request",4726remote_name_request_cmd, 10, true },4727{ 0x041a, 20, "Remote Name Request Cancel",4728remote_name_request_cancel_cmd, 6, true,4729status_bdaddr_rsp, 7, true },4730{ 0x041b, 21, "Read Remote Supported Features",4731read_remote_features_cmd, 2, true },4732{ 0x041c, 22, "Read Remote Extended Features",4733read_remote_ext_features_cmd, 3, true },4734{ 0x041d, 23, "Read Remote Version Information",4735read_remote_version_cmd, 2, true },4736{ 0x041f, 24, "Read Clock Offset",4737read_clock_offset_cmd, 2, true },4738{ 0x0420, 25, "Read LMP Handle",4739read_lmp_handle_cmd, 2, true,4740read_lmp_handle_rsp, 8, true },4741{ 0x0428, 131, "Setup Synchronous Connection",4742setup_sync_conn_cmd, 17, true },4743{ 0x0429, 132, "Accept Synchronous Connection",4744accept_sync_conn_cmd, 21, true },4745{ 0x042a, 133, "Reject Synchronous Connection",4746reject_sync_conn_cmd, 7, true },4747{ 0x042b, 151, "IO Capability Request Reply",4748io_capability_request_reply_cmd, 9, true,4749status_bdaddr_rsp, 7, true },4750{ 0x042c, 152, "User Confirmation Request Reply",4751user_confirm_request_reply_cmd, 6, true,4752status_bdaddr_rsp, 7, true },4753{ 0x042d, 153, "User Confirmation Request Neg Reply",4754user_confirm_request_neg_reply_cmd, 6, true,4755status_bdaddr_rsp, 7, true },4756{ 0x042e, 154, "User Passkey Request Reply",4757user_passkey_request_reply_cmd, 10, true,4758status_bdaddr_rsp, 7, true },4759{ 0x042f, 155, "User Passkey Request Negative Reply",4760user_passkey_request_neg_reply_cmd, 6, true,4761status_bdaddr_rsp, 7, true },4762{ 0x0430, 156, "Remote OOB Data Request Reply",4763remote_oob_data_request_reply_cmd, 38, true,4764status_bdaddr_rsp, 7, true },4765{ 0x0433, 159, "Remote OOB Data Request Neg Reply",4766remote_oob_data_request_neg_reply_cmd, 6, true,4767status_bdaddr_rsp, 7, true },4768{ 0x0434, 163, "IO Capability Request Negative Reply",4769io_capability_request_neg_reply_cmd, 7, true,4770status_bdaddr_rsp, 7, true },4771{ 0x0435, 168, "Create Physical Link",4772create_phy_link_cmd, 3, false },4773{ 0x0436, 169, "Accept Physical Link",4774accept_phy_link_cmd, 3, false },4775{ 0x0437, 170, "Disconnect Physical Link",4776disconn_phy_link_cmd, 2, true },4777{ 0x0438, 171, "Create Logical Link",4778create_logic_link_cmd, 33, true },4779{ 0x0439, 172, "Accept Logical Link",4780accept_logic_link_cmd, 33, true },4781{ 0x043a, 173, "Disconnect Logical Link",4782disconn_logic_link_cmd, 2, true },4783{ 0x043b, 174, "Logical Link Cancel",4784logic_link_cancel_cmd, 2, true,4785logic_link_cancel_rsp, 3, true },4786{ 0x043c, 175, "Flow Specifcation Modify",4787flow_spec_modify_cmd, 34, true },4788{ 0x043d, 235, "Enhanced Setup Synchronous Connection" },4789{ 0x043e, 236, "Enhanced Accept Synchronous Connection" },4790{ 0x043f, 246, "Truncated Page" },4791{ 0x0440, 247, "Truncated Page Cancel" },4792{ 0x0441, 248, "Set Connectionless Slave Broadcast" },4793{ 0x0442, 249, "Set Connectionless Slave Broadcast Receive" },4794{ 0x0443, 250, "Start Synchronization Train" },4795{ 0x0444, 251, "Receive Synchronization Train" },47964797/* OGF 2 - Link Policy */4798{ 0x0801, 33, "Holde Mode",4799hold_mode_cmd, 6, true },4800{ 0x0803, 34, "Sniff Mode",4801sniff_mode_cmd, 10, true },4802{ 0x0804, 35, "Exit Sniff Mode",4803exit_sniff_mode_cmd, 2, true },4804{ 0x0805, 36, "Park State",4805park_state_cmd, 6, true },4806{ 0x0806, 37, "Exit Park State",4807exit_park_state_cmd, 2, true },4808{ 0x0807, 38, "QoS Setup",4809qos_setup_cmd, 20, true },4810{ 0x0809, 39, "Role Discovery",4811role_discovery_cmd, 2, true,4812role_discovery_rsp, 4, true },4813{ 0x080b, 40, "Switch Role",4814switch_role_cmd, 7, true },4815{ 0x080c, 41, "Read Link Policy Settings",4816read_link_policy_cmd, 2, true,4817read_link_policy_rsp, 5, true },4818{ 0x080d, 42, "Write Link Policy Settings",4819write_link_policy_cmd, 4, true,4820write_link_policy_rsp, 3, true },4821{ 0x080e, 43, "Read Default Link Policy Settings",4822null_cmd, 0, true,4823read_default_link_policy_rsp, 3, true },4824{ 0x080f, 44, "Write Default Link Policy Settings",4825write_default_link_policy_cmd, 2, true,4826status_rsp, 1, true },4827{ 0x0810, 45, "Flow Specification",4828flow_spec_cmd, 21, true },4829{ 0x0811, 140, "Sniff Subrating",4830sniff_subrating_cmd, 8, true,4831sniff_subrating_rsp, 3, true },48324833/* OGF 3 - Host Control */4834{ 0x0c01, 46, "Set Event Mask",4835set_event_mask_cmd, 8, true,4836status_rsp, 1, true },4837{ 0x0c03, 47, "Reset",4838null_cmd, 0, true,4839status_rsp, 1, true },4840{ 0x0c05, 48, "Set Event Filter",4841set_event_filter_cmd, 1, false,4842status_rsp, 1, true },4843{ 0x0c08, 49, "Flush",4844flush_cmd, 2, true,4845flush_rsp, 3, true },4846{ 0x0c09, 50, "Read PIN Type",4847null_cmd, 0, true,4848read_pin_type_rsp, 2, true },4849{ 0x0c0a, 51, "Write PIN Type",4850write_pin_type_cmd, 1, true,4851status_rsp, 1, true },4852{ 0x0c0b, 52, "Create New Unit Key",4853null_cmd, 0, true,4854status_rsp, 1, true },4855{ 0x0c0d, 53, "Read Stored Link Key",4856read_stored_link_key_cmd, 7, true,4857read_stored_link_key_rsp, 5, true },4858{ 0x0c11, 54, "Write Stored Link Key",4859write_stored_link_key_cmd, 1, false,4860write_stored_link_key_rsp, 2, true },4861{ 0x0c12, 55, "Delete Stored Link Key",4862delete_stored_link_key_cmd, 7, true,4863delete_stored_link_key_rsp, 3, true },4864{ 0x0c13, 56, "Write Local Name",4865write_local_name_cmd, 248, true,4866status_rsp, 1, true },4867{ 0x0c14, 57, "Read Local Name",4868null_cmd, 0, true,4869read_local_name_rsp, 249, true },4870{ 0x0c15, 58, "Read Connection Accept Timeout",4871null_cmd, 0, true,4872read_conn_accept_timeout_rsp, 3, true },4873{ 0x0c16, 59, "Write Connection Accept Timeout",4874write_conn_accept_timeout_cmd, 2, true,4875status_rsp, 1, true },4876{ 0x0c17, 60, "Read Page Timeout",4877null_cmd, 0, true,4878read_page_timeout_rsp, 3, true },4879{ 0x0c18, 61, "Write Page Timeout",4880write_page_timeout_cmd, 2, true,4881status_rsp, 1, true },4882{ 0x0c19, 62, "Read Scan Enable",4883null_cmd, 0, true,4884read_scan_enable_rsp, 2, true },4885{ 0x0c1a, 63, "Write Scan Enable",4886write_scan_enable_cmd, 1, true,4887status_rsp, 1, true },4888{ 0x0c1b, 64, "Read Page Scan Activity",4889null_cmd, 0, true,4890read_page_scan_activity_rsp, 5, true },4891{ 0x0c1c, 65, "Write Page Scan Activity",4892write_page_scan_activity_cmd, 4, true,4893status_rsp, 1, true },4894{ 0x0c1d, 66, "Read Inquiry Scan Activity",4895null_cmd, 0, true,4896read_inquiry_scan_activity_rsp, 5, true },4897{ 0x0c1e, 67, "Write Inquiry Scan Activity",4898write_inquiry_scan_activity_cmd, 4, true,4899status_rsp, 1, true },4900{ 0x0c1f, 68, "Read Authentication Enable",4901null_cmd, 0, true,4902read_auth_enable_rsp, 2, true },4903{ 0x0c20, 69, "Write Authentication Enable",4904write_auth_enable_cmd, 1, true,4905status_rsp, 1, true },4906{ 0x0c21, 70, "Read Encryption Mode",4907null_cmd, 0, true,4908read_encrypt_mode_rsp, 2, true },4909{ 0x0c22, 71, "Write Encryption Mode",4910write_encrypt_mode_cmd, 1, true,4911status_rsp, 1, true },4912{ 0x0c23, 72, "Read Class of Device",4913null_cmd, 0, true,4914read_class_of_dev_rsp, 4, true },4915{ 0x0c24, 73, "Write Class of Device",4916write_class_of_dev_cmd, 3, true,4917status_rsp, 1, true },4918{ 0x0c25, 74, "Read Voice Setting",4919null_cmd, 0, true,4920read_voice_setting_rsp, 3, true },4921{ 0x0c26, 75, "Write Voice Setting",4922write_voice_setting_cmd, 2, true,4923status_rsp, 1, true },4924{ 0x0c27, 76, "Read Automatic Flush Timeout" },4925{ 0x0c28, 77, "Write Automatic Flush Timeout" },4926{ 0x0c29, 78, "Read Num Broadcast Retransmissions" },4927{ 0x0c2a, 79, "Write Num Broadcast Retransmissions" },4928{ 0x0c2b, 80, "Read Hold Mode Activity" },4929{ 0x0c2c, 81, "Write Hold Mode Activity" },4930{ 0x0c2d, 82, "Read Transmit Power Level" },4931{ 0x0c2e, 83, "Read Sync Flow Control Enable" },4932{ 0x0c2f, 84, "Write Sync Flow Control Enable" },4933{ 0x0c31, 85, "Set Host Controller To Host Flow" },4934{ 0x0c33, 86, "Host Buffer Size",4935host_buffer_size_cmd, 7, true,4936status_rsp, 1, true },4937{ 0x0c35, 87, "Host Number of Completed Packets" },4938{ 0x0c36, 88, "Read Link Supervision Timeout",4939read_link_supv_timeout_cmd, 2, true,4940read_link_supv_timeout_rsp, 5, true },4941{ 0x0c37, 89, "Write Link Supervision Timeout",4942write_link_supv_timeout_cmd, 4, true,4943write_link_supv_timeout_rsp, 3, true },4944{ 0x0c38, 90, "Read Number of Supported IAC",4945null_cmd, 0, true,4946read_num_supported_iac_rsp, 2, true },4947{ 0x0c39, 91, "Read Current IAC LAP",4948null_cmd, 0, true,4949read_current_iac_lap_rsp, 2, false },4950{ 0x0c3a, 92, "Write Current IAC LAP",4951write_current_iac_lap_cmd, 1, false,4952status_rsp, 1, true },4953{ 0x0c3b, 93, "Read Page Scan Period Mode",4954null_cmd, 0, true,4955read_page_scan_period_mode_rsp, 2, true },4956{ 0x0c3c, 94, "Write Page Scan Period Mode",4957write_page_scan_period_mode_cmd, 1, true,4958status_rsp, 1, true },4959{ 0x0c3d, 95, "Read Page Scan Mode",4960null_cmd, 0, true,4961read_page_scan_mode_rsp, 2, true },4962{ 0x0c3e, 96, "Write Page Scan Mode",4963write_page_scan_mode_cmd, 1, true,4964status_rsp, 1, true },4965{ 0x0c3f, 97, "Set AFH Host Channel Classification",4966set_afh_host_classification_cmd, 10, true,4967status_rsp, 1, true },4968{ 0x0c42, 100, "Read Inquiry Scan Type",4969null_cmd, 0, true,4970read_inquiry_scan_type_rsp, 2, true },4971{ 0x0c43, 101, "Write Inquiry Scan Type",4972write_inquiry_scan_type_cmd, 1, true,4973status_rsp, 1, true },4974{ 0x0c44, 102, "Read Inquiry Mode",4975null_cmd, 0, true,4976read_inquiry_mode_rsp, 2, true },4977{ 0x0c45, 103, "Write Inquiry Mode",4978write_inquiry_mode_cmd, 1, true,4979status_rsp, 1, true },4980{ 0x0c46, 104, "Read Page Scan Type",4981null_cmd, 0, true,4982read_page_scan_type_rsp, 2, true },4983{ 0x0c47, 105, "Write Page Scan Type",4984write_page_scan_type_cmd, 1, true,4985status_rsp, 1, true },4986{ 0x0c48, 106, "Read AFH Channel Assessment Mode",4987null_cmd, 0, true,4988read_afh_assessment_mode_rsp, 2, true },4989{ 0x0c49, 107, "Write AFH Channel Assessment Mode",4990write_afh_assessment_mode_cmd, 1, true,4991status_rsp, 1, true },4992{ 0x0c51, 136, "Read Extended Inquiry Response",4993null_cmd, 0, true,4994read_ext_inquiry_response_rsp, 242, true },4995{ 0x0c52, 137, "Write Extended Inquiry Response",4996write_ext_inquiry_response_cmd, 241, true,4997status_rsp, 1, true },4998{ 0x0c53, 138, "Refresh Encryption Key",4999refresh_encrypt_key_cmd, 2, true },5000{ 0x0c55, 141, "Read Simple Pairing Mode",5001null_cmd, 0, true,5002read_simple_pairing_mode_rsp, 2, true },5003{ 0x0c56, 142, "Write Simple Pairing Mode",5004write_simple_pairing_mode_cmd, 1, true,5005status_rsp, 1, true },5006{ 0x0c57, 143, "Read Local OOB Data",5007null_cmd, 0, true,5008read_local_oob_data_rsp, 33, true },5009{ 0x0c58, 144, "Read Inquiry Response TX Power Level",5010null_cmd, 0, true,5011read_inquiry_resp_tx_power_rsp, 2, true },5012{ 0x0c59, 145, "Write Inquiry Transmit Power Level",5013write_inquiry_tx_power_cmd, 1, true,5014status_rsp, 1, true },5015{ 0x0c5a, 146, "Read Default Erroneous Reporting" },5016{ 0x0c5b, 147, "Write Default Erroneous Reporting" },5017{ 0x0c5f, 158, "Enhanced Flush",5018enhanced_flush_cmd, 3, true },5019{ 0x0c60, 162, "Send Keypress Notification" },5020{ 0x0c61, 176, "Read Logical Link Accept Timeout" },5021{ 0x0c62, 177, "Write Logical Link Accept Timeout" },5022{ 0x0c63, 178, "Set Event Mask Page 2",5023set_event_mask_page2_cmd, 8, true,5024status_rsp, 1, true },5025{ 0x0c64, 179, "Read Location Data",5026null_cmd, 0, true,5027read_location_data_rsp, 6, true },5028{ 0x0c65, 180, "Write Location Data",5029write_location_data_cmd, 5, true,5030status_rsp, 1, true },5031{ 0x0c66, 184, "Read Flow Control Mode",5032null_cmd, 0, true,5033read_flow_control_mode_rsp, 2, true },5034{ 0x0c67, 185, "Write Flow Control Mode",5035write_flow_control_mode_cmd, 1, true,5036status_rsp, 1, true },5037{ 0x0c68, 192, "Read Enhanced Transmit Power Level" },5038{ 0x0c69, 194, "Read Best Effort Flush Timeout" },5039{ 0x0c6a, 195, "Write Best Effort Flush Timeout" },5040{ 0x0c6b, 196, "Short Range Mode" },5041{ 0x0c6c, 197, "Read LE Host Supported",5042null_cmd, 0, true,5043read_le_host_supported_rsp, 3, true },5044{ 0x0c6d, 198, "Write LE Host Supported",5045write_le_host_supported_cmd, 2, true,5046status_rsp, 1, true },5047{ 0x0c6e, 238, "Set MWS Channel Parameters" },5048{ 0x0c6f, 239, "Set External Frame Configuration" },5049{ 0x0c70, 240, "Set MWS Signaling" },5050{ 0x0c71, 241, "Set MWS Transport Layer" },5051{ 0x0c72, 242, "Set MWS Scan Frequency Table" },5052{ 0x0c73, 244, "Set MWS Pattern Configuration" },5053{ 0x0c74, 252, "Set Reserved LT_ADDR" },5054{ 0x0c75, 253, "Delete Reserved LT_ADDR" },5055{ 0x0c76, 254, "Set Connectionless Slave Broadcast Data" },5056{ 0x0c77, 255, "Read Synchronization Train Parameters",5057null_cmd, 0, true,5058read_sync_train_params_rsp, 8, true },5059{ 0x0c78, 256, "Write Synchronization Train Parameters" },50605061/* OGF 4 - Information Parameter */5062{ 0x1001, 115, "Read Local Version Information",5063null_cmd, 0, true,5064read_local_version_rsp, 9, true },5065{ 0x1002, 116, "Read Local Supported Commands",5066null_cmd, 0, true,5067read_local_commands_rsp, 65, true },5068{ 0x1003, 117, "Read Local Supported Features",5069null_cmd, 0, true,5070read_local_features_rsp, 9, true },5071{ 0x1004, 118, "Read Local Extended Features",5072read_local_ext_features_cmd, 1, true,5073read_local_ext_features_rsp, 11, true },5074{ 0x1005, 119, "Read Buffer Size",5075null_cmd, 0, true,5076read_buffer_size_rsp, 8, true },5077{ 0x1007, 120, "Read Country Code",5078null_cmd, 0, true,5079read_country_code_rsp, 2, true },5080{ 0x1009, 121, "Read BD ADDR",5081null_cmd, 0, true,5082read_bd_addr_rsp, 7, true },5083{ 0x100a, 186, "Read Data Block Size",5084null_cmd, 0, true,5085read_data_block_size_rsp, 7, true },5086{ 0x100b, 237, "Read Local Supported Codecs" },50875088/* OGF 5 - Status Parameter */5089{ 0x1401, 122, "Read Failed Contact Counter",5090read_failed_contact_counter_cmd, 2, true,5091read_failed_contact_counter_rsp, 5, true },5092{ 0x1402, 123, "Reset Failed Contact Counter",5093reset_failed_contact_counter_cmd, 2, true,5094reset_failed_contact_counter_rsp, 3, true },5095{ 0x1403, 124, "Read Link Quality",5096read_link_quality_cmd, 2, true,5097read_link_quality_rsp, 4, true },5098{ 0x1405, 125, "Read RSSI",5099read_rssi_cmd, 2, true,5100read_rssi_rsp, 4, true },5101{ 0x1406, 126, "Read AFH Channel Map",5102read_afh_channel_map_cmd, 2, true,5103read_afh_channel_map_rsp, 14, true },5104{ 0x1407, 127, "Read Clock",5105read_clock_cmd, 3, true,5106read_clock_rsp, 9, true },5107{ 0x1408, 164, "Read Encryption Key Size",5108read_encrypt_key_size_cmd, 2, true,5109read_encrypt_key_size_rsp, 4, true },5110{ 0x1409, 181, "Read Local AMP Info",5111null_cmd, 0, true,5112read_local_amp_info_rsp, 31, true },5113{ 0x140a, 182, "Read Local AMP ASSOC",5114read_local_amp_assoc_cmd, 5, true,5115read_local_amp_assoc_rsp, 5, false },5116{ 0x140b, 183, "Write Remote AMP ASSOC",5117write_remote_amp_assoc_cmd, 6, false,5118write_remote_amp_assoc_rsp, 2, true },5119{ 0x140c, 243, "Get MWS Transport Layer Configuration" },5120{ 0x140d, 245, "Set Triggered Clock Capture" },51215122/* OGF 6 - Testing */5123{ 0x1801, 128, "Read Loopback Mode" },5124{ 0x1802, 129, "Write Loopback Mode" },5125{ 0x1803, 130, "Enable Device Under Test Mode",5126null_cmd, 0, true,5127status_rsp, 1, true },5128{ 0x1804, 157, "Write Simple Pairing Debug Mode" },5129{ 0x1807, 189, "Enable AMP Receiver Reports" },5130{ 0x1808, 190, "AMP Test End" },5131{ 0x1809, 191, "AMP Test" },51325133/* OGF 8 - LE Control */5134{ 0x2001, 200, "LE Set Event Mask",5135le_set_event_mask_cmd, 8, true,5136status_rsp, 1, true },5137{ 0x2002, 201, "LE Read Buffer Size",5138null_cmd, 0, true,5139le_read_buffer_size_rsp, 4, true },5140{ 0x2003, 202, "LE Read Local Supported Features",5141null_cmd, 0, true,5142le_read_local_features_rsp, 9, true },5143{ 0x2005, 204, "LE Set Random Address",5144le_set_random_address_cmd, 6, true,5145status_rsp, 1, true },5146{ 0x2006, 205, "LE Set Advertising Parameters",5147le_set_adv_parameters_cmd, 15, true,5148status_rsp, 1, true },5149{ 0x2007, 206, "LE Read Advertising Channel TX Power",5150null_cmd, 0, true,5151le_read_adv_tx_power_rsp, 2, true },5152{ 0x2008, 207, "LE Set Advertising Data",5153le_set_adv_data_cmd, 32, true,5154status_rsp, 1, true },5155{ 0x2009, 208, "LE Set Scan Response Data",5156le_set_scan_rsp_data_cmd, 32, true,5157status_rsp, 1, true },5158{ 0x200a, 209, "LE Set Advertise Enable",5159le_set_adv_enable_cmd, 1, true,5160status_rsp, 1, true },5161{ 0x200b, 210, "LE Set Scan Parameters",5162le_set_scan_parameters_cmd, 7, true,5163status_rsp, 1, true },5164{ 0x200c, 211, "LE Set Scan Enable",5165le_set_scan_enable_cmd, 2, true,5166status_rsp, 1, true },5167{ 0x200d, 212, "LE Create Connection",5168le_create_conn_cmd, 25, true },5169{ 0x200e, 213, "LE Create Connection Cancel",5170null_cmd, 0, true,5171status_rsp, 1, true },5172{ 0x200f, 214, "LE Read White List Size",5173null_cmd, 0, true,5174le_read_white_list_size_rsp, 2, true },5175{ 0x2010, 215, "LE Clear White List",5176null_cmd, 0, true,5177status_rsp, 1, true },5178{ 0x2011, 216, "LE Add Device To White List",5179le_add_to_white_list_cmd, 7, true,5180status_rsp, 1, true },5181{ 0x2012, 217, "LE Remove Device From White List",5182le_remove_from_white_list_cmd, 7, true,5183status_rsp, 1, true },5184{ 0x2013, 218, "LE Connection Update",5185le_conn_update_cmd, 14, true },5186{ 0x2014, 219, "LE Set Host Channel Classification",5187le_set_host_classification_cmd, 5, true,5188status_rsp, 1, true },5189{ 0x2015, 220, "LE Read Channel Map",5190le_read_channel_map_cmd, 2, true,5191le_read_channel_map_rsp, 8, true },5192{ 0x2016, 221, "LE Read Remote Used Features",5193le_read_remote_features_cmd, 2, true },5194{ 0x2017, 222, "LE Encrypt",5195le_encrypt_cmd, 32, true,5196le_encrypt_rsp, 17, true },5197{ 0x2018, 223, "LE Rand",5198null_cmd, 0, true,5199le_rand_rsp, 9, true },5200{ 0x2019, 224, "LE Start Encryption",5201le_start_encrypt_cmd, 28, true },5202{ 0x201a, 225, "LE Long Term Key Request Reply",5203le_ltk_req_reply_cmd, 18, true,5204le_ltk_req_reply_rsp, 3, true },5205{ 0x201b, 226, "LE Long Term Key Request Neg Reply",5206le_ltk_req_neg_reply_cmd, 2, true,5207le_ltk_req_neg_reply_rsp, 3, true },5208{ 0x201c, 227, "LE Read Supported States",5209null_cmd, 0, true,5210le_read_supported_states_rsp, 9, true },5211{ 0x201d, 228, "LE Receiver Test",5212le_receiver_test_cmd, 1, true,5213status_rsp, 1, true },5214{ 0x201e, 229, "LE Transmitter Test",5215le_transmitter_test_cmd, 3, true,5216status_rsp, 1, true },5217{ 0x201f, 230, "LE Test End",5218null_cmd, 0, true,5219le_test_end_rsp, 3, true },5220{ }5221};52225223static const char *get_supported_command(int bit)5224{5225int i;52265227for (i = 0; opcode_table[i].str; i++) {5228if (opcode_table[i].bit == bit)5229return opcode_table[i].str;5230}52315232return NULL;5233}52345235static void status_evt(const void *data, uint8_t size)5236{5237uint8_t status = *((uint8_t *) data);52385239print_status(status);5240}52415242static void inquiry_result_evt(const void *data, uint8_t size)5243{5244const struct bt_hci_evt_inquiry_result *evt = data;52455246print_num_resp(evt->num_resp);5247print_bdaddr(evt->bdaddr);5248print_pscan_rep_mode(evt->pscan_rep_mode);5249print_pscan_period_mode(evt->pscan_period_mode);5250print_pscan_mode(evt->pscan_mode);5251print_dev_class(evt->dev_class);5252print_clock_offset(evt->clock_offset);52535254if (size > sizeof(*evt))5255packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));5256}52575258static void conn_complete_evt(const void *data, uint8_t size)5259{5260const struct bt_hci_evt_conn_complete *evt = data;52615262print_status(evt->status);5263print_handle(evt->handle);5264print_bdaddr(evt->bdaddr);5265print_link_type(evt->link_type);5266print_encr_mode(evt->encr_mode);52675268if (evt->status == 0x00)5269assign_handle(btohs(evt->handle), 0x00);5270}52715272static void conn_request_evt(const void *data, uint8_t size)5273{5274const struct bt_hci_evt_conn_request *evt = data;52755276print_bdaddr(evt->bdaddr);5277print_dev_class(evt->dev_class);5278print_link_type(evt->link_type);5279}52805281static void disconnect_complete_evt(const void *data, uint8_t size)5282{5283const struct bt_hci_evt_disconnect_complete *evt = data;52845285print_status(evt->status);5286print_handle(evt->handle);5287print_reason(evt->reason);52885289if (evt->status == 0x00)5290release_handle(btohs(evt->handle));5291}52925293static void auth_complete_evt(const void *data, uint8_t size)5294{5295const struct bt_hci_evt_auth_complete *evt = data;52965297print_status(evt->status);5298print_handle(evt->handle);5299}53005301static void remote_name_request_complete_evt(const void *data, uint8_t size)5302{5303const struct bt_hci_evt_remote_name_request_complete *evt = data;53045305print_status(evt->status);5306print_bdaddr(evt->bdaddr);5307print_name(evt->name);5308}53095310static void encrypt_change_evt(const void *data, uint8_t size)5311{5312const struct bt_hci_evt_encrypt_change *evt = data;53135314print_status(evt->status);5315print_handle(evt->handle);5316print_encr_mode_change(evt->encr_mode, evt->handle);5317}53185319static void change_conn_link_key_complete_evt(const void *data, uint8_t size)5320{5321const struct bt_hci_evt_change_conn_link_key_complete *evt = data;53225323print_status(evt->status);5324print_handle(evt->handle);5325}53265327static void master_link_key_complete_evt(const void *data, uint8_t size)5328{5329const struct bt_hci_evt_master_link_key_complete *evt = data;53305331print_status(evt->status);5332print_handle(evt->handle);5333print_key_flag(evt->key_flag);5334}53355336static void remote_features_complete_evt(const void *data, uint8_t size)5337{5338const struct bt_hci_evt_remote_features_complete *evt = data;53395340print_status(evt->status);5341print_handle(evt->handle);5342print_features(0, evt->features, 0x00);5343}53445345static void remote_version_complete_evt(const void *data, uint8_t size)5346{5347const struct bt_hci_evt_remote_version_complete *evt = data;53485349print_status(evt->status);5350print_handle(evt->handle);5351print_lmp_version(evt->lmp_ver, evt->lmp_subver);5352print_manufacturer(evt->manufacturer);5353}53545355static void qos_setup_complete_evt(const void *data, uint8_t size)5356{5357const struct bt_hci_evt_qos_setup_complete *evt = data;53585359print_status(evt->status);5360print_handle(evt->handle);5361print_field("Flags: 0x%2.2x", evt->flags);53625363print_service_type(evt->service_type);53645365print_field("Token rate: %d", btohl(evt->token_rate));5366print_field("Peak bandwidth: %d", btohl(evt->peak_bandwidth));5367print_field("Latency: %d", btohl(evt->latency));5368print_field("Delay variation: %d", btohl(evt->delay_variation));5369}53705371static void cmd_complete_evt(const void *data, uint8_t size)5372{5373const struct bt_hci_evt_cmd_complete *evt = data;5374uint16_t opcode = btohs(evt->opcode);5375uint16_t ogf = cmd_opcode_ogf(opcode);5376uint16_t ocf = cmd_opcode_ocf(opcode);5377const struct opcode_data *opcode_data = NULL;5378const char *opcode_color, *opcode_str;5379int i;53805381for (i = 0; opcode_table[i].str; i++) {5382if (opcode_table[i].opcode == opcode) {5383opcode_data = &opcode_table[i];5384break;5385}5386}53875388if (opcode_data) {5389if (opcode_data->rsp_func)5390opcode_color = COLOR_HCI_COMMAND;5391else5392opcode_color = COLOR_HCI_COMMAND_UNKNOWN;5393opcode_str = opcode_data->str;5394} else {5395opcode_color = COLOR_HCI_COMMAND_UNKNOWN;5396opcode_str = "Unknown";5397}53985399print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,5400" (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);54015402if (!opcode_data || !opcode_data->rsp_func) {5403packet_hexdump(data + 3, size - 3);5404return;5405}54065407if (opcode_data->rsp_fixed) {5408if (size - 3 != opcode_data->rsp_size) {5409print_text(COLOR_ERROR, "invalid packet size");5410packet_hexdump(data + 3, size - 3);5411return;5412}5413} else {5414if (size - 3 < opcode_data->rsp_size) {5415print_text(COLOR_ERROR, "too short packet");5416packet_hexdump(data + 3, size - 3);5417return;5418}5419}54205421opcode_data->rsp_func(data + 3, size - 3);5422}54235424static void cmd_status_evt(const void *data, uint8_t size)5425{5426const struct bt_hci_evt_cmd_status *evt = data;5427uint16_t opcode = btohs(evt->opcode);5428uint16_t ogf = cmd_opcode_ogf(opcode);5429uint16_t ocf = cmd_opcode_ocf(opcode);5430const struct opcode_data *opcode_data = NULL;5431const char *opcode_color, *opcode_str;5432int i;54335434for (i = 0; opcode_table[i].str; i++) {5435if (opcode_table[i].opcode == opcode) {5436opcode_data = &opcode_table[i];5437break;5438}5439}54405441if (opcode_data) {5442opcode_color = COLOR_HCI_COMMAND;5443opcode_str = opcode_data->str;5444} else {5445opcode_color = COLOR_HCI_COMMAND_UNKNOWN;5446opcode_str = "Unknown";5447}54485449print_indent(6, opcode_color, "", opcode_str, COLOR_OFF,5450" (0x%2.2x|0x%4.4x) ncmd %d", ogf, ocf, evt->ncmd);54515452print_status(evt->status);5453}54545455static void hardware_error_evt(const void *data, uint8_t size)5456{5457const struct bt_hci_evt_hardware_error *evt = data;54585459print_field("Code: 0x%2.2x", evt->code);5460}54615462static void flush_occurred_evt(const void *data, uint8_t size)5463{5464const struct bt_hci_evt_flush_occurred *evt = data;54655466print_handle(evt->handle);5467}54685469static void role_change_evt(const void *data, uint8_t size)5470{5471const struct bt_hci_evt_role_change *evt = data;54725473print_status(evt->status);5474print_bdaddr(evt->bdaddr);5475print_role(evt->role);5476}54775478static void num_completed_packets_evt(const void *data, uint8_t size)5479{5480const struct bt_hci_evt_num_completed_packets *evt = data;54815482print_field("Num handles: %d", evt->num_handles);5483print_handle(evt->handle);5484print_field("Count: %d", btohs(evt->count));54855486if (size > sizeof(*evt))5487packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));5488}54895490static void mode_change_evt(const void *data, uint8_t size)5491{5492const struct bt_hci_evt_mode_change *evt = data;54935494print_status(evt->status);5495print_handle(evt->handle);5496print_mode(evt->mode);5497print_interval(evt->interval);5498}54995500static void return_link_keys_evt(const void *data, uint8_t size)5501{5502uint8_t num_keys = *((uint8_t *) data);55035504print_field("Num keys: %d", num_keys);55055506packet_hexdump(data + 1, size - 1);5507}55085509static void pin_code_request_evt(const void *data, uint8_t size)5510{5511const struct bt_hci_evt_pin_code_request *evt = data;55125513print_bdaddr(evt->bdaddr);5514}55155516static void link_key_request_evt(const void *data, uint8_t size)5517{5518const struct bt_hci_evt_link_key_request *evt = data;55195520print_bdaddr(evt->bdaddr);5521}55225523static void link_key_notify_evt(const void *data, uint8_t size)5524{5525const struct bt_hci_evt_link_key_notify *evt = data;55265527print_bdaddr(evt->bdaddr);5528print_link_key(evt->link_key);5529print_key_type(evt->key_type);5530}55315532static void loopback_command_evt(const void *data, uint8_t size)5533{5534packet_hexdump(data, size);5535}55365537static void data_buffer_overflow_evt(const void *data, uint8_t size)5538{5539const struct bt_hci_evt_data_buffer_overflow *evt = data;55405541print_link_type(evt->link_type);5542}55435544static void max_slots_change_evt(const void *data, uint8_t size)5545{5546const struct bt_hci_evt_max_slots_change *evt = data;55475548print_handle(evt->handle);5549print_field("Max slots: %d", evt->max_slots);5550}55515552static void clock_offset_complete_evt(const void *data, uint8_t size)5553{5554const struct bt_hci_evt_clock_offset_complete *evt = data;55555556print_status(evt->status);5557print_handle(evt->handle);5558print_clock_offset(evt->clock_offset);5559}55605561static void conn_pkt_type_changed_evt(const void *data, uint8_t size)5562{5563const struct bt_hci_evt_conn_pkt_type_changed *evt = data;55645565print_status(evt->status);5566print_handle(evt->handle);5567print_pkt_type(evt->pkt_type);5568}55695570static void qos_violation_evt(const void *data, uint8_t size)5571{5572const struct bt_hci_evt_qos_violation *evt = data;55735574print_handle(evt->handle);5575}55765577static void pscan_mode_change_evt(const void *data, uint8_t size)5578{5579const struct bt_hci_evt_pscan_mode_change *evt = data;55805581print_bdaddr(evt->bdaddr);5582print_pscan_mode(evt->pscan_mode);5583}55845585static void pscan_rep_mode_change_evt(const void *data, uint8_t size)5586{5587const struct bt_hci_evt_pscan_rep_mode_change *evt = data;55885589print_bdaddr(evt->bdaddr);5590print_pscan_rep_mode(evt->pscan_rep_mode);5591}55925593static void flow_spec_complete_evt(const void *data, uint8_t size)5594{5595const struct bt_hci_evt_flow_spec_complete *evt = data;55965597print_status(evt->status);5598print_handle(evt->handle);5599print_field("Flags: 0x%2.2x", evt->flags);56005601print_flow_direction(evt->direction);5602print_service_type(evt->service_type);56035604print_field("Token rate: %d", btohl(evt->token_rate));5605print_field("Token bucket size: %d", btohl(evt->token_bucket_size));5606print_field("Peak bandwidth: %d", btohl(evt->peak_bandwidth));5607print_field("Access latency: %d", btohl(evt->access_latency));5608}56095610static void inquiry_result_with_rssi_evt(const void *data, uint8_t size)5611{5612const struct bt_hci_evt_inquiry_result_with_rssi *evt = data;56135614print_num_resp(evt->num_resp);5615print_bdaddr(evt->bdaddr);5616print_pscan_rep_mode(evt->pscan_rep_mode);5617print_pscan_period_mode(evt->pscan_period_mode);5618print_dev_class(evt->dev_class);5619print_clock_offset(evt->clock_offset);5620print_rssi(evt->rssi);56215622if (size > sizeof(*evt))5623packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));5624}56255626static void remote_ext_features_complete_evt(const void *data, uint8_t size)5627{5628const struct bt_hci_evt_remote_ext_features_complete *evt = data;56295630print_status(evt->status);5631print_handle(evt->handle);5632print_field("Page: %d/%d", evt->page, evt->max_page);5633print_features(evt->page, evt->features, 0x00);5634}56355636static void sync_conn_complete_evt(const void *data, uint8_t size)5637{5638const struct bt_hci_evt_sync_conn_complete *evt = data;56395640print_status(evt->status);5641print_handle(evt->handle);5642print_bdaddr(evt->bdaddr);5643print_link_type(evt->link_type);5644print_field("Transmission interval: 0x%2.2x", evt->tx_interval);5645print_field("Retransmission window: 0x%2.2x", evt->retrans_window);5646print_field("RX packet length: %d", btohs(evt->rx_pkt_len));5647print_field("TX packet length: %d", btohs(evt->tx_pkt_len));5648print_air_mode(evt->air_mode);5649}56505651static void sync_conn_changed_evt(const void *data, uint8_t size)5652{5653const struct bt_hci_evt_sync_conn_changed *evt = data;56545655print_status(evt->status);5656print_handle(evt->handle);5657print_field("Transmission interval: 0x%2.2x", evt->tx_interval);5658print_field("Retransmission window: 0x%2.2x", evt->retrans_window);5659print_field("RX packet length: %d", btohs(evt->rx_pkt_len));5660print_field("TX packet length: %d", btohs(evt->tx_pkt_len));5661}56625663static void sniff_subrating_evt(const void *data, uint8_t size)5664{5665const struct bt_hci_evt_sniff_subrating *evt = data;56665667print_status(evt->status);5668print_handle(evt->handle);5669print_slot_625("Max transmit latency", evt->max_tx_latency);5670print_slot_625("Max receive latency", evt->max_rx_latency);5671print_slot_625("Min remote timeout", evt->min_remote_timeout);5672print_slot_625("Min local timeout", evt->min_local_timeout);5673}56745675static void ext_inquiry_result_evt(const void *data, uint8_t size)5676{5677const struct bt_hci_evt_ext_inquiry_result *evt = data;56785679print_num_resp(evt->num_resp);5680print_bdaddr(evt->bdaddr);5681print_pscan_rep_mode(evt->pscan_rep_mode);5682print_pscan_period_mode(evt->pscan_period_mode);5683print_dev_class(evt->dev_class);5684print_clock_offset(evt->clock_offset);5685print_rssi(evt->rssi);5686print_eir(evt->data, sizeof(evt->data), false);5687}56885689static void encrypt_key_refresh_complete_evt(const void *data, uint8_t size)5690{5691const struct bt_hci_evt_encrypt_key_refresh_complete *evt = data;56925693print_status(evt->status);5694print_handle(evt->handle);5695}56965697static void io_capability_request_evt(const void *data, uint8_t size)5698{5699const struct bt_hci_evt_io_capability_request *evt = data;57005701print_bdaddr(evt->bdaddr);5702}57035704static void io_capability_response_evt(const void *data, uint8_t size)5705{5706const struct bt_hci_evt_io_capability_response *evt = data;57075708print_bdaddr(evt->bdaddr);5709print_io_capability(evt->capability);5710print_oob_data(evt->oob_data);5711print_authentication(evt->authentication);5712}57135714static void user_confirm_request_evt(const void *data, uint8_t size)5715{5716const struct bt_hci_evt_user_confirm_request *evt = data;57175718print_bdaddr(evt->bdaddr);5719print_passkey(evt->passkey);5720}57215722static void user_passkey_request_evt(const void *data, uint8_t size)5723{5724const struct bt_hci_evt_user_passkey_request *evt = data;57255726print_bdaddr(evt->bdaddr);5727}57285729static void remote_oob_data_request_evt(const void *data, uint8_t size)5730{5731const struct bt_hci_evt_remote_oob_data_request *evt = data;57325733print_bdaddr(evt->bdaddr);5734}57355736static void simple_pairing_complete_evt(const void *data, uint8_t size)5737{5738const struct bt_hci_evt_simple_pairing_complete *evt = data;57395740print_status(evt->status);5741print_bdaddr(evt->bdaddr);5742}57435744static void link_supv_timeout_changed_evt(const void *data, uint8_t size)5745{5746const struct bt_hci_evt_link_supv_timeout_changed *evt = data;57475748print_handle(evt->handle);5749print_timeout(evt->timeout);5750}57515752static void enhanced_flush_complete_evt(const void *data, uint8_t size)5753{5754const struct bt_hci_evt_enhanced_flush_complete *evt = data;57555756print_handle(evt->handle);5757}57585759static void user_passkey_notify_evt(const void *data, uint8_t size)5760{5761const struct bt_hci_evt_user_passkey_notify *evt = data;57625763print_bdaddr(evt->bdaddr);5764print_passkey(evt->passkey);5765}57665767static void keypress_notify_evt(const void *data, uint8_t size)5768{5769const struct bt_hci_evt_keypress_notify *evt = data;5770const char *str;57715772print_bdaddr(evt->bdaddr);57735774switch (evt->type) {5775case 0x00:5776str = "Passkey entry started";5777break;5778case 0x01:5779str = "Passkey digit entered";5780break;5781case 0x02:5782str = "Passkey digit erased";5783break;5784case 0x03:5785str = "Passkey clared";5786break;5787case 0x04:5788str = "Passkey entry completed";5789break;5790default:5791str = "Reserved";5792break;5793}57945795print_field("Notification type: %s (0x%2.2x)", str, evt->type);5796}57975798static void remote_host_features_notify_evt(const void *data, uint8_t size)5799{5800const struct bt_hci_evt_remote_host_features_notify *evt = data;58015802print_bdaddr(evt->bdaddr);5803print_features(1, evt->features, 0x00);5804}58055806static void phy_link_complete_evt(const void *data, uint8_t size)5807{5808const struct bt_hci_evt_phy_link_complete *evt = data;58095810print_status(evt->status);5811print_phy_handle(evt->phy_handle);5812}58135814static void channel_selected_evt(const void *data, uint8_t size)5815{5816const struct bt_hci_evt_channel_selected *evt = data;58175818print_phy_handle(evt->phy_handle);5819}58205821static void disconn_phy_link_complete_evt(const void *data, uint8_t size)5822{5823const struct bt_hci_evt_disconn_phy_link_complete *evt = data;58245825print_status(evt->status);5826print_phy_handle(evt->phy_handle);5827print_reason(evt->reason);5828}58295830static void phy_link_loss_early_warning_evt(const void *data, uint8_t size)5831{5832const struct bt_hci_evt_phy_link_loss_early_warning *evt = data;5833const char *str;58345835print_phy_handle(evt->phy_handle);58365837switch (evt->reason) {5838case 0x00:5839str = "Unknown";5840break;5841case 0x01:5842str = "Range related";5843break;5844case 0x02:5845str = "Bandwidth related";5846break;5847case 0x03:5848str = "Resolving conflict";5849break;5850case 0x04:5851str = "Interference";5852break;5853default:5854str = "Reserved";5855break;5856}58575858print_field("Reason: %s (0x%2.2x)", str, evt->reason);5859}58605861static void phy_link_recovery_evt(const void *data, uint8_t size)5862{5863const struct bt_hci_evt_phy_link_recovery *evt = data;58645865print_phy_handle(evt->phy_handle);5866}58675868static void logic_link_complete_evt(const void *data, uint8_t size)5869{5870const struct bt_hci_evt_logic_link_complete *evt = data;58715872print_status(evt->status);5873print_handle(evt->handle);5874print_phy_handle(evt->phy_handle);5875print_field("TX flow spec: 0x%2.2x", evt->flow_spec);5876}58775878static void disconn_logic_link_complete_evt(const void *data, uint8_t size)5879{5880const struct bt_hci_evt_disconn_logic_link_complete *evt = data;58815882print_status(evt->status);5883print_handle(evt->handle);5884print_reason(evt->reason);5885}58865887static void flow_spec_modify_complete_evt(const void *data, uint8_t size)5888{5889const struct bt_hci_evt_flow_spec_modify_complete *evt = data;58905891print_status(evt->status);5892print_handle(evt->handle);5893}58945895static void num_completed_data_blocks_evt(const void *data, uint8_t size)5896{5897const struct bt_hci_evt_num_completed_data_blocks *evt = data;58985899print_field("Total num data blocks: %d", btohs(evt->total_num_blocks));5900print_field("Num handles: %d", evt->num_handles);5901print_handle(evt->handle);5902print_field("Num packets: %d", evt->num_packets);5903print_field("Num blocks: %d", evt->num_blocks);59045905if (size > sizeof(*evt))5906packet_hexdump(data + sizeof(*evt), size - sizeof(*evt));5907}59085909static void short_range_mode_change_evt(const void *data, uint8_t size)5910{5911const struct bt_hci_evt_short_range_mode_change *evt = data;59125913print_status(evt->status);5914print_phy_handle(evt->phy_handle);5915print_short_range_mode(evt->mode);5916}59175918static void amp_status_change_evt(const void *data, uint8_t size)5919{5920const struct bt_hci_evt_amp_status_change *evt = data;59215922print_status(evt->status);5923print_amp_status(evt->amp_status);5924}59255926static void le_conn_complete_evt(const void *data, uint8_t size)5927{5928const struct bt_hci_evt_le_conn_complete *evt = data;59295930print_status(evt->status);5931print_handle(evt->handle);5932print_role(evt->role);5933print_addr_type("Peer address type", evt->peer_addr_type);5934print_addr("Peer address", evt->peer_addr, evt->peer_addr_type);5935print_slot_125("Connection interval", evt->interval);5936print_slot_125("Connection latency", evt->latency);5937print_field("Supervision timeout: %d msec (0x%4.4x)",5938btohs(evt->supv_timeout) * 10, btohs(evt->supv_timeout));5939print_field("Master clock accuracy: 0x%2.2x", evt->clock_accuracy);59405941if (evt->status == 0x00)5942assign_handle(btohs(evt->handle), 0x01);5943}59445945static void le_adv_report_evt(const void *data, uint8_t size)5946{5947const struct bt_hci_evt_le_adv_report *evt = data;5948const char *str;5949uint8_t evt_len;5950int8_t *rssi;59515952print_num_reports(evt->num_reports);59535954switch (evt->event_type) {5955case 0x00:5956str = "Connectable undirected - ADV_IND";5957break;5958case 0x01:5959str = "Connectable directed - ADV_DIRECT_IND";5960break;5961case 0x02:5962str = "Scannable undirected - ADV_SCAN_IND";5963break;5964case 0x03:5965str = "Non connectable undirected - ADV_NONCONN_IND";5966break;5967case 0x04:5968str = "Scan response - SCAN_RSP";5969break;5970default:5971str = "Reserved";5972break;5973}59745975print_field("Event type: %s (0x%2.2x)", str, evt->event_type);5976print_addr_type("Address type", evt->addr_type);5977print_addr("Address", evt->addr, evt->addr_type);5978print_field("Data length: %d", evt->data_len);5979print_eir(evt->data, evt->data_len, true);59805981rssi = (int8_t *) (evt->data + evt->data_len);5982print_rssi(*rssi);59835984evt_len = sizeof(*evt) + evt->data_len + 1;59855986if (size > evt_len)5987packet_hexdump(data + evt_len, size - evt_len);5988}59895990static void le_conn_update_complete_evt(const void *data, uint8_t size)5991{5992const struct bt_hci_evt_le_conn_update_complete *evt = data;59935994print_status(evt->status);5995print_handle(evt->handle);5996print_slot_125("Connection interval", evt->interval);5997print_slot_125("Connection latency", evt->latency);5998print_field("Supervision timeout: %d msec (0x%4.4x)",5999btohs(evt->supv_timeout) * 10, btohs(evt->supv_timeout));6000}60016002static void le_remote_features_complete_evt(const void *data, uint8_t size)6003{6004const struct bt_hci_evt_le_remote_features_complete *evt = data;60056006print_status(evt->status);6007print_handle(evt->handle);6008print_features(0, evt->features, 0x01);6009}60106011static void le_long_term_key_request_evt(const void *data, uint8_t size)6012{6013const struct bt_hci_evt_le_long_term_key_request *evt = data;60146015print_handle(evt->handle);6016print_random_number(evt->number);6017print_field("Encryption diversifier: 0x%4.4x",6018btohs(evt->diversifier));6019}60206021struct subevent_data {6022uint8_t subevent;6023const char *str;6024void (*func) (const void *data, uint8_t size);6025uint8_t size;6026bool fixed;6027};60286029static const struct subevent_data subevent_table[] = {6030{ 0x01, "LE Connection Complete",6031le_conn_complete_evt, 18, true },6032{ 0x02, "LE Advertising Report",6033le_adv_report_evt, 1, false },6034{ 0x03, "LE Connection Update Complete",6035le_conn_update_complete_evt, 9, true },6036{ 0x04, "LE Read Remote Used Features",6037le_remote_features_complete_evt, 11, true },6038{ 0x05, "LE Long Term Key Request",6039le_long_term_key_request_evt, 12, true },6040{ }6041};60426043static void le_meta_event_evt(const void *data, uint8_t size)6044{6045uint8_t subevent = *((const uint8_t *) data);6046const struct subevent_data *subevent_data = NULL;6047const char *subevent_color, *subevent_str;6048int i;60496050for (i = 0; subevent_table[i].str; i++) {6051if (subevent_table[i].subevent == subevent) {6052subevent_data = &subevent_table[i];6053break;6054}6055}60566057if (subevent_data) {6058if (subevent_data->func)6059subevent_color = COLOR_HCI_EVENT;6060else6061subevent_color = COLOR_HCI_EVENT_UNKNOWN;6062subevent_str = subevent_data->str;6063} else {6064subevent_color = COLOR_HCI_EVENT_UNKNOWN;6065subevent_str = "Unknown";6066}60676068print_indent(6, subevent_color, "", subevent_str, COLOR_OFF,6069" (0x%2.2x)", subevent);60706071if (!subevent_data || !subevent_data->func) {6072packet_hexdump(data + 1, size - 1);6073return;6074}60756076if (subevent_data->fixed) {6077if (size - 1 != subevent_data->size) {6078print_text(COLOR_ERROR, "invalid packet size");6079packet_hexdump(data + 1, size - 1);6080return;6081}6082} else {6083if (size - 1 < subevent_data->size) {6084print_text(COLOR_ERROR, "too short packet");6085packet_hexdump(data + 1, size - 1);6086return;6087}6088}60896090subevent_data->func(data + 1, size - 1);6091}60926093static void vendor_evt(const void *data, uint8_t size)6094{6095vendor_event(0xffff, data, size);6096}60976098struct event_data {6099uint8_t event;6100const char *str;6101void (*func) (const void *data, uint8_t size);6102uint8_t size;6103bool fixed;6104};61056106static const struct event_data event_table[] = {6107{ 0x01, "Inquiry Complete",6108status_evt, 1, true },6109{ 0x02, "Inquiry Result",6110inquiry_result_evt, 1, false },6111{ 0x03, "Connect Complete",6112conn_complete_evt, 11, true },6113{ 0x04, "Connect Request",6114conn_request_evt, 10, true },6115{ 0x05, "Disconnect Complete",6116disconnect_complete_evt, 4, true },6117{ 0x06, "Auth Complete",6118auth_complete_evt, 3, true },6119{ 0x07, "Remote Name Req Complete",6120remote_name_request_complete_evt, 255, true },6121{ 0x08, "Encryption Change",6122encrypt_change_evt, 4, true },6123{ 0x09, "Change Connection Link Key Complete",6124change_conn_link_key_complete_evt, 3, true },6125{ 0x0a, "Master Link Key Complete",6126master_link_key_complete_evt, 4, true },6127{ 0x0b, "Read Remote Supported Features",6128remote_features_complete_evt, 11, true },6129{ 0x0c, "Read Remote Version Complete",6130remote_version_complete_evt, 8, true },6131{ 0x0d, "QoS Setup Complete",6132qos_setup_complete_evt, 21, true },6133{ 0x0e, "Command Complete",6134cmd_complete_evt, 3, false },6135{ 0x0f, "Command Status",6136cmd_status_evt, 4, true },6137{ 0x10, "Hardware Error",6138hardware_error_evt, 1, true },6139{ 0x11, "Flush Occurred",6140flush_occurred_evt, 2, true },6141{ 0x12, "Role Change",6142role_change_evt, 8, true },6143{ 0x13, "Number of Completed Packets",6144num_completed_packets_evt, 1, false },6145{ 0x14, "Mode Change",6146mode_change_evt, 6, true },6147{ 0x15, "Return Link Keys",6148return_link_keys_evt, 1, false },6149{ 0x16, "PIN Code Request",6150pin_code_request_evt, 6, true },6151{ 0x17, "Link Key Request",6152link_key_request_evt, 6, true },6153{ 0x18, "Link Key Notification",6154link_key_notify_evt, 23, true },6155{ 0x19, "Loopback Command",6156loopback_command_evt, 3, false },6157{ 0x1a, "Data Buffer Overflow",6158data_buffer_overflow_evt, 1, true },6159{ 0x1b, "Max Slots Change",6160max_slots_change_evt, 3, true },6161{ 0x1c, "Read Clock Offset Complete",6162clock_offset_complete_evt, 5, true },6163{ 0x1d, "Connection Packet Type Changed",6164conn_pkt_type_changed_evt, 5, true },6165{ 0x1e, "QoS Violation",6166qos_violation_evt, 2, true },6167{ 0x1f, "Page Scan Mode Change",6168pscan_mode_change_evt, 7, true },6169{ 0x20, "Page Scan Repetition Mode Change",6170pscan_rep_mode_change_evt, 7, true },6171{ 0x21, "Flow Specification Complete",6172flow_spec_complete_evt, 22, true },6173{ 0x22, "Inquiry Result with RSSI",6174inquiry_result_with_rssi_evt, 1, false },6175{ 0x23, "Read Remote Extended Features",6176remote_ext_features_complete_evt, 13, true },6177{ 0x2c, "Synchronous Connect Complete",6178sync_conn_complete_evt, 17, true },6179{ 0x2d, "Synchronous Connect Changed",6180sync_conn_changed_evt, 9, true },6181{ 0x2e, "Sniff Subrating",6182sniff_subrating_evt, 11, true },6183{ 0x2f, "Extended Inquiry Result",6184ext_inquiry_result_evt, 1, false },6185{ 0x30, "Encryption Key Refresh Complete",6186encrypt_key_refresh_complete_evt, 3, true },6187{ 0x31, "IO Capability Request",6188io_capability_request_evt, 6, true },6189{ 0x32, "IO Capability Response",6190io_capability_response_evt, 9, true },6191{ 0x33, "User Confirmation Request",6192user_confirm_request_evt, 10, true },6193{ 0x34, "User Passkey Request",6194user_passkey_request_evt, 6, true },6195{ 0x35, "Remote OOB Data Request",6196remote_oob_data_request_evt, 6, true },6197{ 0x36, "Simple Pairing Complete",6198simple_pairing_complete_evt, 7, true },6199{ 0x38, "Link Supervision Timeout Changed",6200link_supv_timeout_changed_evt, 4, true },6201{ 0x39, "Enhanced Flush Complete",6202enhanced_flush_complete_evt, 2, true },6203{ 0x3b, "User Passkey Notification",6204user_passkey_notify_evt, 10, true },6205{ 0x3c, "Keypress Notification",6206keypress_notify_evt, 7, true },6207{ 0x3d, "Remote Host Supported Features",6208remote_host_features_notify_evt, 14, true },6209{ 0x3e, "LE Meta Event",6210le_meta_event_evt, 1, false },6211{ 0x40, "Physical Link Complete",6212phy_link_complete_evt, 2, true },6213{ 0x41, "Channel Selected",6214channel_selected_evt, 1, true },6215{ 0x42, "Disconnect Physical Link Complete",6216disconn_phy_link_complete_evt, 3, true },6217{ 0x43, "Physical Link Loss Early Warning",6218phy_link_loss_early_warning_evt, 2, true },6219{ 0x44, "Physical Link Recovery",6220phy_link_recovery_evt, 1, true },6221{ 0x45, "Logical Link Complete",6222logic_link_complete_evt, 5, true },6223{ 0x46, "Disconnect Logical Link Complete",6224disconn_logic_link_complete_evt, 4, true },6225{ 0x47, "Flow Specification Modify Complete",6226flow_spec_modify_complete_evt, 3, true },6227{ 0x48, "Number of Completed Data Blocks",6228num_completed_data_blocks_evt, 3, false },6229{ 0x49, "AMP Start Test" },6230{ 0x4a, "AMP Test End" },6231{ 0x4b, "AMP Receiver Report" },6232{ 0x4c, "Short Range Mode Change Complete",6233short_range_mode_change_evt, 3, true },6234{ 0x4d, "AMP Status Change",6235amp_status_change_evt, 2, true },6236{ 0xfe, "Testing" },6237{ 0xff, "Vendor", vendor_evt, 0, false },6238{ }6239};62406241void packet_new_index(struct timeval *tv, uint16_t index, const char *label,6242uint8_t type, uint8_t bus, const char *name)6243{6244char details[48];62456246sprintf(details, "(%s,%s,%s)", hci_typetostr(type),6247hci_bustostr(bus), name);62486249print_packet(tv, index, '=', COLOR_NEW_INDEX, "New Index",6250label, details);6251}62526253void packet_del_index(struct timeval *tv, uint16_t index, const char *label)6254{6255print_packet(tv, index, '=', COLOR_DEL_INDEX, "Delete Index",6256label, NULL);6257}62586259void packet_hci_command(struct timeval *tv, uint16_t index,6260const void *data, uint16_t size)6261{6262const hci_command_hdr *hdr = data;6263uint16_t opcode = btohs(hdr->opcode);6264uint16_t ogf = cmd_opcode_ogf(opcode);6265uint16_t ocf = cmd_opcode_ocf(opcode);6266const struct opcode_data *opcode_data = NULL;6267const char *opcode_color, *opcode_str;6268char extra_str[25];6269int i;62706271if (size < HCI_COMMAND_HDR_SIZE) {6272sprintf(extra_str, "(len %d)", size);6273print_packet(tv, index, '*', COLOR_ERROR,6274"Malformed HCI Command packet", NULL, extra_str);6275packet_hexdump(data, size);6276return;6277}62786279data += HCI_COMMAND_HDR_SIZE;6280size -= HCI_COMMAND_HDR_SIZE;62816282for (i = 0; opcode_table[i].str; i++) {6283if (opcode_table[i].opcode == opcode) {6284opcode_data = &opcode_table[i];6285break;6286}6287}62886289if (opcode_data) {6290if (opcode_data->cmd_func)6291opcode_color = COLOR_HCI_COMMAND;6292else6293opcode_color = COLOR_HCI_COMMAND_UNKNOWN;6294opcode_str = opcode_data->str;6295} else {6296opcode_color = COLOR_HCI_COMMAND_UNKNOWN;6297opcode_str = "Unknown";6298}62996300sprintf(extra_str, "(0x%2.2x|0x%4.4x) plen %d", ogf, ocf, hdr->plen);63016302print_packet(tv, index, '<', opcode_color, "HCI Command",6303opcode_str, extra_str);63046305if (!opcode_data || !opcode_data->cmd_func) {6306packet_hexdump(data, size);6307return;6308}63096310if (opcode_data->cmd_fixed) {6311if (hdr->plen != opcode_data->cmd_size) {6312print_text(COLOR_ERROR, "invalid packet size");6313packet_hexdump(data, size);6314return;6315}6316} else {6317if (hdr->plen < opcode_data->cmd_size) {6318print_text(COLOR_ERROR, "too short packet");6319packet_hexdump(data, size);6320return;6321}6322}63236324opcode_data->cmd_func(data, hdr->plen);6325}63266327void packet_hci_event(struct timeval *tv, uint16_t index,6328const void *data, uint16_t size)6329{6330const hci_event_hdr *hdr = data;6331const struct event_data *event_data = NULL;6332const char *event_color, *event_str;6333char extra_str[25];6334int i;63356336if (size < HCI_EVENT_HDR_SIZE) {6337sprintf(extra_str, "(len %d)", size);6338print_packet(tv, index, '*', COLOR_ERROR,6339"Malformed HCI Event packet", NULL, extra_str);6340packet_hexdump(data, size);6341return;6342}63436344data += HCI_EVENT_HDR_SIZE;6345size -= HCI_EVENT_HDR_SIZE;63466347for (i = 0; event_table[i].str; i++) {6348if (event_table[i].event == hdr->evt) {6349event_data = &event_table[i];6350break;6351}6352}63536354if (event_data) {6355if (event_data->func)6356event_color = COLOR_HCI_EVENT;6357else6358event_color = COLOR_HCI_EVENT_UNKNOWN;6359event_str = event_data->str;6360} else {6361event_color = COLOR_HCI_EVENT_UNKNOWN;6362event_str = "Unknown";6363}63646365sprintf(extra_str, "(0x%2.2x) plen %d", hdr->evt, hdr->plen);63666367print_packet(tv, index, '>', event_color, "HCI Event",6368event_str, extra_str);63696370if (!event_data || !event_data->func) {6371packet_hexdump(data, size);6372return;6373}63746375if (event_data->fixed) {6376if (hdr->plen != event_data->size) {6377print_text(COLOR_ERROR, "invalid packet size");6378packet_hexdump(data, size);6379return;6380}6381} else {6382if (hdr->plen < event_data->size) {6383print_text(COLOR_ERROR, "too short packet");6384packet_hexdump(data, size);6385return;6386}6387}63886389event_data->func(data, hdr->plen);6390}63916392void packet_hci_acldata(struct timeval *tv, uint16_t index, bool in,6393const void *data, uint16_t size)6394{6395const struct bt_hci_acl_hdr *hdr = data;6396uint16_t handle = btohs(hdr->handle);6397uint16_t dlen = btohs(hdr->dlen);6398uint8_t flags = acl_flags(handle);6399char handle_str[16], extra_str[32];64006401if (size < sizeof(*hdr)) {6402if (in)6403print_packet(tv, index, '*', COLOR_ERROR,6404"Malformed ACL Data RX packet", NULL, NULL);6405else6406print_packet(tv, index, '*', COLOR_ERROR,6407"Malformed ACL Data TX packet", NULL, NULL);6408packet_hexdump(data, size);6409return;6410}64116412data += sizeof(*hdr);6413size -= sizeof(*hdr);64146415sprintf(handle_str, "Handle %d", acl_handle(handle));6416sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, dlen);64176418print_packet(tv, index, in ? '>' : '<', COLOR_HCI_ACLDATA,6419in ? "ACL Data RX" : "ACL Data TX",6420handle_str, extra_str);64216422if (size != dlen) {6423print_text(COLOR_ERROR, "invalid packet size (%d != %d)",6424size, dlen);6425packet_hexdump(data, size);6426return;6427}64286429if (filter_mask & PACKET_FILTER_SHOW_ACL_DATA)6430packet_hexdump(data, size);64316432l2cap_packet(index, in, acl_handle(handle), flags, data, size);6433}64346435void packet_hci_scodata(struct timeval *tv, uint16_t index, bool in,6436const void *data, uint16_t size)6437{6438const hci_sco_hdr *hdr = data;6439uint16_t handle = btohs(hdr->handle);6440uint8_t flags = acl_flags(handle);6441char handle_str[16], extra_str[32];64426443if (size < HCI_SCO_HDR_SIZE) {6444if (in)6445print_packet(tv, index, '*', COLOR_ERROR,6446"Malformed SCO Data RX packet", NULL, NULL);6447else6448print_packet(tv, index, '*', COLOR_ERROR,6449"Malformed SCO Data TX packet", NULL, NULL);6450packet_hexdump(data, size);6451return;6452}64536454data += HCI_SCO_HDR_SIZE;6455size -= HCI_SCO_HDR_SIZE;64566457sprintf(handle_str, "Handle %d", acl_handle(handle));6458sprintf(extra_str, "flags 0x%2.2x dlen %d", flags, hdr->dlen);64596460print_packet(tv, index, in ? '>' : '<', COLOR_HCI_SCODATA,6461in ? "SCO Data RX" : "SCO Data TX",6462handle_str, extra_str);64636464if (size != hdr->dlen) {6465print_text(COLOR_ERROR, "invalid packet size (%d != %d)",6466size, hdr->dlen);6467packet_hexdump(data, size);6468return;6469}64706471if (filter_mask & PACKET_FILTER_SHOW_SCO_DATA)6472packet_hexdump(data, size);6473}647464756476