diff --git a/tools/parser/hci.c b/tools/parser/hci.c
index ece8016..6c28201 100644
--- a/tools/parser/hci.c
+++ b/tools/parser/hci.c
clkoffset & 0x7fff, clkoffset & 0x8000 ? " (valid)" : "");
}
+static inline void master_link_key_dump(int level, struct frame *frm)
+{
+ master_link_key_cp *cp = frm->ptr;
+
+ p_indent(level, frm);
+ printf("flag %d\n", cp->key_flag);
+}
+
+static inline void read_remote_ext_features_dump(int level, struct frame *frm)
+{
+ read_remote_ext_features_cp *cp = frm->ptr;
+
+ p_indent(level, frm);
+ printf("handle %d\n page %d", btohs(cp->handle), cp->page_num);
+}
+
static inline void write_link_policy_dump(int level, struct frame *frm)
{
write_link_policy_cp *cp = frm->ptr;
}
}
+static inline void request_local_ext_features_dump(int level, struct frame *frm)
+{
+ read_local_ext_features_cp *cp = frm->ptr;
+
+ p_indent(level, frm);
+ printf("page %d\n", cp->page_num);
+}
+
static inline void command_dump(int level, struct frame *frm)
{
hci_command_hdr *hdr = frm->ptr;
case OCF_READ_CLOCK_OFFSET:
generic_command_dump(level + 1, frm);
return;
+ case OCF_MASTER_LINK_KEY:
+ master_link_key_dump(level + 1, frm);
+ return;
+ case OCF_READ_REMOTE_EXT_FEATURES:
+ read_remote_ext_features_dump(level + 1, frm);
+ return;
case OCF_REMOTE_NAME_REQ:
remote_name_req_dump(level + 1, frm);
return;
write_current_iac_lap_dump(level + 1, frm);
return;
}
+
+ case OGF_INFO_PARAM:
+ switch (ocf) {
+ case OCF_READ_LOCAL_EXT_FEATURES:
+ request_local_ext_features_dump(level + 1, frm);
+ return;
+ }
}
raw_dump(level, frm);
}
}
+static inline void read_local_commands_dump(int level, struct frame *frm)
+{
+ read_local_commands_rp *rp = frm->ptr;
+ int i, max = 0;
+
+ p_indent(level, frm);
+ printf("status 0x%2.2x\n", rp->status);
+
+ if (rp->status > 0) {
+ p_indent(level, frm);
+ printf("Error: %s\n", status2str(rp->status));
+ } else {
+ for (i = 0; i < 64; i++)
+ if (rp->commands[i])
+ max = i + 1;
+ p_indent(level, frm);
+ printf("Commands: ");
+ for (i = 0; i < (max > 32 ? 32 : max); i++)
+ printf("%2.2x", rp->commands[i]);
+ printf("\n");
+ if (max > 32) {
+ p_indent(level, frm);
+ printf(" ");
+ for (i = 32; i < max; i++)
+ printf("%2.2x", rp->commands[i]);
+ printf("\n");
+ }
+ }
+}
+
static inline void read_local_features_dump(int level, struct frame *frm)
{
read_local_features_rp *rp = frm->ptr;
}
}
+static inline void read_local_ext_features_dump(int level, struct frame *frm)
+{
+ read_local_ext_features_rp *rp = frm->ptr;
+ int i;
+
+ p_indent(level, frm);
+ printf("status 0x%2.2x page %d max %d\n",
+ rp->status, rp->page_num, rp->max_page_num);
+
+ if (rp->status > 0) {
+ p_indent(level, frm);
+ printf("Error: %s\n", status2str(rp->status));
+ } else {
+ p_indent(level, frm);
+ printf("Features:");
+ for (i = 0; i < 8; i++)
+ printf(" 0x%2.2x", rp->features[i]);
+ printf("\n");
+ }
+}
+
static inline void read_buffer_size_dump(int level, struct frame *frm)
{
read_buffer_size_rp *rp = frm->ptr;
switch (ogf) {
case OGF_LINK_CTL:
switch (ocf) {
+ case OCF_INQUIRY_CANCEL:
+ case OCF_PERIODIC_INQUIRY:
+ case OCF_EXIT_PERIODIC_INQUIRY:
+ status_response_dump(level, frm);
+ return;
case OCF_PIN_CODE_REPLY:
case OCF_LINK_KEY_REPLY:
case OCF_PIN_CODE_NEG_REPLY:
bdaddr_response_dump(level, frm);
return;
}
+ break;
case OGF_LINK_POLICY:
switch (ocf) {
generic_response_dump(level, frm);
return;
}
+ break;
case OGF_HOST_CTL:
switch (ocf) {
status_response_dump(level, frm);
return;
}
+ break;
case OGF_INFO_PARAM:
switch (ocf) {
case OCF_READ_LOCAL_VERSION:
read_local_version_dump(level, frm);
return;
+ case OCF_READ_LOCAL_COMMANDS:
+ read_local_commands_dump(level, frm);
+ return;
case OCF_READ_LOCAL_FEATURES:
read_local_features_dump(level, frm);
return;
+ case OCF_READ_LOCAL_EXT_FEATURES:
+ read_local_ext_features_dump(level, frm);
+ return;
case OCF_READ_BUFFER_SIZE:
read_buffer_size_dump(level, frm);
return;
bdaddr_response_dump(level, frm);
return;
}
+ break;
case OGF_STATUS_PARAM:
switch (ocf) {
status_response_dump(level, frm);
return;
}
+ break;
}
raw_dump(level, frm);
}
}
+static inline void master_link_key_complete_dump(int level, struct frame *frm)
+{
+ evt_master_link_key_complete *evt = frm->ptr;
+
+ p_indent(level, frm);
+ printf("status 0x%2.2x handle %d flag %d\n",
+ evt->status, btohs(evt->handle), evt->key_flag);
+
+ if (evt->status > 0) {
+ p_indent(level, frm);
+ printf("Error: %s\n", status2str(evt->status));
+ }
+}
+
static inline void encrypt_change_dump(int level, struct frame *frm)
{
evt_encrypt_change *evt = frm->ptr;
}
}
+static inline void read_remote_ext_features_complete_dump(int level, struct frame *frm)
+{
+ evt_read_remote_ext_features_complete *evt = frm->ptr;
+ int i;
+
+ p_indent(level, frm);
+ printf("status 0x%2.2x handle %d page %d max %d\n",
+ evt->status, btohs(evt->handle),
+ evt->page_num, evt->max_page_num);
+
+ if (evt->status > 0) {
+ p_indent(level, frm);
+ printf("Error: %s\n", status2str(evt->status));
+ } else {
+ p_indent(level, frm);
+ printf("Features:");
+ for (i = 0; i < 8; i++)
+ printf(" 0x%2.2x", evt->features[i]);
+ printf("\n");
+ }
+}
+
static inline void event_dump(int level, struct frame *frm)
{
hci_event_hdr *hdr = frm->ptr;
case EVT_CHANGE_CONN_LINK_KEY_COMPLETE:
generic_response_dump(level + 1, frm);
break;
+ case EVT_MASTER_LINK_KEY_COMPLETE:
+ master_link_key_complete_dump(level + 1, frm);
+ break;
case EVT_REMOTE_NAME_REQ_COMPLETE:
remote_name_req_complete_dump(level + 1, frm);
break;
case EVT_INQUIRY_RESULT_WITH_RSSI:
inq_result_with_rssi_dump(level + 1, frm);
break;
+ case EVT_READ_REMOTE_EXT_FEATURES_COMPLETE:
+ read_remote_ext_features_complete_dump(level + 1, frm);
+ break;
default:
raw_dump(level, frm);
break;