diff --git a/tools/parser/hci.c b/tools/parser/hci.c
index a3f001b..b9e8d28 100644
--- a/tools/parser/hci.c
+++ b/tools/parser/hci.c
return (manufacturer == DEFAULT_COMPID ? parser.defcompid : manufacturer);
}
-#define EVENT_NUM 61
+#define EVENT_NUM 76
static char *event_str[EVENT_NUM + 1] = {
"Unknown",
"Inquiry Complete",
"User Passkey Notification",
"Keypress Notification",
"Remote Host Supported Features Notification",
+ "LE Meta Event",
+ "Physical Link Complete",
+ "Channel Selected",
+ "Disconnection Physical Link Complete",
+ "Physical Link Loss Early Warning",
+ "Physical Link Recovery",
+ "Logical Link Complete",
+ "Disconnection Logical Link Complete",
+ "Flow Spec Modify Complete",
+ "Number Of Completed Data Blocks",
+ "AMP Start Test",
+ "AMP Test End",
+ "AMP Receiver Report",
+ "Short Range Mode Change Complete",
+ "AMP Status Change",
+};
+
+#define LE_EV_NUM 5
+static char *ev_le_meta_str[LE_EV_NUM + 1] = {
+ "Unknown",
+ "LE Connection Complete",
+ "LE Advertising Report",
+ "LE Connection Update Complete",
+ "LE Read Remote Used Features Complete",
+ "LE Long Term Key Request",
};
#define CMD_LINKCTL_NUM 52
"Sniff Subrating",
};
-#define CMD_HOSTCTL_NUM 95
+#define CMD_HOSTCTL_NUM 109
static char *cmd_hostctl_str[CMD_HOSTCTL_NUM + 1] = {
"Unknown",
"Set Event Mask",
"Unknown",
"Unknown",
"Unknown",
- "Enhanced Flush"
+ "Enhanced Flush",
"Unknown",
+ "Read Logical Link Accept Timeout",
+ "Write Logical Link Accept Timeout",
+ "Set Event Mask Page 2",
+ "Read Location Data",
+ "Write Location Data",
+ "Read Flow Control Mode",
+ "Write Flow Control Mode",
+ "Read Enhanced Transmit Power Level",
+ "Read Best Effort Flush Timeout",
+ "Write Best Effort Flush Timeout",
+ "Short Range Mode",
+ "Read LE Host Supported",
+ "Write LE Host Supported",
};
#define CMD_INFO_NUM 9
"Unknown",
};
+#define CMD_LE_NUM 30
+static char *cmd_le_str[CMD_LE_NUM + 1] = {
+ "Unknown",
+ "LE Set Event Mask",
+ "LE Read Buffer Size",
+ "LE Read Local Supported Features",
+ "Unknown",
+ "LE Set Random Address",
+ "LE Set Advertising Parameters",
+ "LE Read Advertising Channel Tx Power",
+ "LE Set Advertising Data",
+ "LE Set Scan Response Data",
+ "LE Set Advertise Enable",
+ "LE Set Scan Parameters",
+ "LE Set Scan Enable",
+ "LE Create Connection",
+ "LE Create Connection Cancel",
+ "LE Read White List Size",
+ "LE Clear White List",
+ "LE Add Device To White List",
+ "LE Remove Device From White List",
+ "LE Connection Update",
+ "LE Set Host Channel Classification"
+ "LE Read Channel Map",
+ "LE Read Remote Used Features",
+ "LE Encrypt",
+ "LE Rand",
+ "LE Start Encryption",
+ "LE Long Term Key Request Reply",
+ "LE Long Term Key Request Negative Reply",
+ "LE Read Supported States",
+ "LE Receiver Test",
+ "LE Transmitter Test",
+ "LE Test End",
+};
+
#define ERROR_CODE_NUM 56
static char *error_code_str[ERROR_CODE_NUM + 1] = {
"Success",
cmd = "Unknown";
break;
+ case OGF_LE_CTL:
+ if (ocf <= CMD_LE_NUM)
+ cmd = cmd_le_str[ocf];
+ else
+ cmd = "Unknown";
+ break;
+
case OGF_VENDOR_CMD:
cmd = "Vendor";
break;
}
}
+static inline void le_create_connection_dump(int level, struct frame *frm)
+{
+ char addr[18];
+ le_create_connection_cp *cp = frm->ptr;
+
+ p_indent(level, frm);
+ p_ba2str(&cp->peer_bdaddr, addr);
+ printf("bdaddr %s type %d\n", addr, cp->peer_bdaddr_type);
+}
+
static inline void command_dump(int level, struct frame *frm)
{
hci_command_hdr *hdr = frm->ptr;
return;
}
break;
+
+ case OGF_LE_CTL:
+ switch (ocf) {
+ case OCF_LE_CREATE_CONN:
+ le_create_connection_dump(level + 1, frm);
+ return;
+ }
+ break;
}
raw_dump(level, frm);
printf("\n");
}
+static inline void evt_le_conn_complete_dump(int level, struct frame *frm)
+{
+ evt_le_connection_complete *evt = frm->ptr;
+
+ p_indent(level, frm);
+ printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
+}
+
+static inline void le_meta_ev_dump(int level, struct frame *frm)
+{
+ evt_le_meta_event *mevt = frm->ptr;
+ uint8_t subevent;
+
+ subevent = mevt->subevent;
+
+ frm->ptr += EVT_LE_META_EVENT_SIZE;
+ frm->len -= EVT_LE_META_EVENT_SIZE;
+
+ p_indent(level, frm);
+ printf("%s\n", ev_le_meta_str[subevent]);
+
+ switch (mevt->subevent) {
+ case EVT_LE_CONN_COMPLETE:
+ evt_le_conn_complete_dump(level + 1, frm);
+ break;
+ default:
+ raw_dump(level, frm);
+ break;
+ }
+}
+
static inline void event_dump(int level, struct frame *frm)
{
hci_event_hdr *hdr = frm->ptr;
case EVT_REMOTE_HOST_FEATURES_NOTIFY:
remote_host_features_notify_dump(level + 1, frm);
break;
+ case EVT_LE_META_EVENT:
+ le_meta_ev_dump(level + 1, frm);
+ break;
default:
raw_dump(level, frm);
break;