diff --git a/tools/parser/hci.c b/tools/parser/hci.c
index 05b4e14..bc21ec2 100644
--- a/tools/parser/hci.c
+++ b/tools/parser/hci.c
"Unknown",
"Synchronous Connect Complete",
"Synchronous Connect Changed",
- "Unknown",
+ "Sniff Subrate",
"Extended Inquiry Result",
};
"Reject Synchronous Connection",
};
-#define CMD_LINKPOL_NUM 16
+#define CMD_LINKPOL_NUM 17
static char *cmd_linkpol_str[CMD_LINKPOL_NUM + 1] = {
"Unknown",
"Hold Mode",
"Read Default Link Policy Settings",
"Write Default Link Policy Settings",
"Flow Specification",
+ "Sniff Subrate",
};
#define CMD_HOSTCTL_NUM 82
}
}
+static inline void sniff_subrate_dump(int level, struct frame *frm)
+{
+ sniff_subrate_cp *cp = frm->ptr;
+
+ p_indent(level, frm);
+ printf("handle %d\n", btohs(cp->handle));
+
+ p_indent(level, frm);
+ printf("max latency remote %d local %d\n",
+ btohs(cp->max_remote_latency), btohs(cp->max_local_latency));
+
+ p_indent(level, frm);
+ printf("min timeout remote %d local %d\n",
+ btohs(cp->min_remote_timeout), btohs(cp->min_local_timeout));
+}
+
static inline void set_event_mask_dump(int level, struct frame *frm)
{
set_event_mask_cp *cp = frm->ptr;
p_indent(level, frm);
printf("class 0x%2.2x%2.2x%2.2x\n",
- cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
+ cp->dev_class[2], cp->dev_class[1], cp->dev_class[0]);
}
static inline void write_voice_setting_dump(int level, struct frame *frm)
p_indent(level, frm);
printf("handle %d timeout %d\n",
- btohs(cp->handle), btohs(cp->link_sup_to));
+ btohs(cp->handle), btohs(cp->link_sup_to));
}
static inline void write_ext_inquiry_response_dump(int level, struct frame *frm)
p_indent(level, frm);
printf("handle %d type %d (%s)\n",
- btohs(cp->handle), cp->type,
- cp->type ? "maximum" : "current");
+ btohs(cp->handle), cp->type,
+ cp->type ? "maximum" : "current");
}
static inline void request_local_ext_features_dump(int level, struct frame *frm)
p_indent(level, frm);
printf("handle %d which %d (%s)\n",
- btohs(cp->handle), cp->which_clock,
- cp->which_clock ? "piconet" : "local");
+ btohs(cp->handle), cp->which_clock,
+ cp->which_clock ? "piconet" : "local");
}
static inline void command_dump(int level, struct frame *frm)
p_indent(level, frm);
printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n",
- opcode2str(opcode), ogf, ocf, hdr->plen);
+ opcode2str(opcode), ogf, ocf, hdr->plen);
frm->ptr += HCI_COMMAND_HDR_SIZE;
frm->len -= HCI_COMMAND_HDR_SIZE;
case OCF_WRITE_LINK_POLICY:
write_link_policy_dump(level + 1, frm);
return;
+ case OCF_SNIFF_SUBRATE:
+ sniff_subrate_dump(level + 1, frm);
+ return;
}
break;
p_indent(level, frm);
printf("status 0x%2.2x max %d num %d\n",
- rp->status, rp->max_keys, rp->num_keys);
+ rp->status, rp->max_keys, rp->num_keys);
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x class 0x%2.2x%2.2x%2.2x\n", rp->status,
- rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
+ rp->dev_class[2], rp->dev_class[1], rp->dev_class[0]);
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x voice setting 0x%4.4x\n",
- rp->status, btohs(rp->voice_setting));
+ rp->status, btohs(rp->voice_setting));
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x interval %d window %d\n",
- rp->status, btohs(rp->interval), btohs(rp->window));
+ rp->status, btohs(rp->interval), btohs(rp->window));
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d timeout %d\n",
- rp->status, btohs(rp->handle), btohs(rp->link_sup_to));
+ rp->status, btohs(rp->handle), btohs(rp->link_sup_to));
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d level %d\n",
- rp->status, btohs(rp->handle), rp->level);
+ rp->status, btohs(rp->handle), rp->level);
if (rp->status > 0) {
p_indent(level, frm);
} else {
p_indent(level, frm);
printf("HCI Version: %s (0x%x) HCI Revision: 0x%x\n",
- hci_vertostr(rp->hci_ver), rp->hci_ver,
- btohs(rp->hci_rev));
+ hci_vertostr(rp->hci_ver),
+ rp->hci_ver, btohs(rp->hci_rev));
p_indent(level, frm);
printf("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n",
- lmp_vertostr(rp->lmp_ver), rp->lmp_ver,
- btohs(rp->lmp_subver));
+ lmp_vertostr(rp->lmp_ver),
+ rp->lmp_ver, btohs(rp->lmp_subver));
p_indent(level, frm);
printf("Manufacturer: %s (%d)\n",
- bt_compidtostr(manufacturer), manufacturer);
+ bt_compidtostr(manufacturer), manufacturer);
}
}
} else {
p_indent(level, frm);
printf("ACL MTU %d:%d SCO MTU %d:%d\n",
- btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
- rp->sco_mtu, btohs(rp->sco_max_pkt));
+ btohs(rp->acl_mtu), btohs(rp->acl_max_pkt),
+ rp->sco_mtu, btohs(rp->sco_max_pkt));
}
}
p_indent(level, frm);
printf("status 0x%2.2x handle %d lq %d\n",
- rp->status, btohs(rp->handle), rp->link_quality);
+ rp->status, btohs(rp->handle), rp->link_quality);
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d rssi %d\n",
- rp->status, btohs(rp->handle), rp->rssi);
+ rp->status, btohs(rp->handle), rp->rssi);
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d mode %d\n",
- rp->status, btohs(rp->handle), rp->mode);
+ rp->status, btohs(rp->handle), rp->mode);
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d clock 0x%4.4x accuracy %d\n",
- rp->status, btohs(rp->handle),
- btohl(rp->clock), btohs(rp->accuracy));
+ rp->status, btohs(rp->handle),
+ btohl(rp->clock), btohs(rp->accuracy));
if (rp->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("%s (0x%2.2x|0x%4.4x) ncmd %d\n",
- opcode2str(opcode), ogf, ocf, evt->ncmd);
+ opcode2str(opcode), ogf, ocf, evt->ncmd);
frm->ptr += EVT_CMD_COMPLETE_SIZE;
frm->len -= EVT_CMD_COMPLETE_SIZE;
p_indent(level, frm);
printf("%s (0x%2.2x|0x%4.4x) status 0x%2.2x ncmd %d\n",
- opcode2str(opcode),
- cmd_opcode_ogf(opcode), cmd_opcode_ocf(opcode),
- evt->status, evt->ncmd);
+ opcode2str(opcode), cmd_opcode_ogf(opcode),
+ cmd_opcode_ocf(opcode), evt->status, evt->ncmd);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d bdaddr %s type %s encrypt 0x%2.2x\n",
- evt->status, btohs(evt->handle), addr,
- evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode);
+ evt->status, btohs(evt->handle), addr,
+ evt->link_type == 1 ? "ACL" : "SCO", evt->encr_mode);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("bdaddr %s class 0x%2.2x%2.2x%2.2x type %s\n",
- addr, evt->dev_class[2], evt->dev_class[1],
- evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO");
+ addr, evt->dev_class[2], evt->dev_class[1],
+ evt->dev_class[0], evt->link_type == 1 ? "ACL" : "SCO");
}
static inline void disconn_complete_dump(int level, struct frame *frm)
p_indent(level, frm);
printf("status 0x%2.2x handle %d reason 0x%2.2x\n",
- evt->status, btohs(evt->handle), evt->reason);
+ evt->status, btohs(evt->handle), evt->reason);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d flag %d\n",
- evt->status, btohs(evt->handle), evt->key_flag);
+ evt->status, btohs(evt->handle), evt->key_flag);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n",
- evt->status, btohs(evt->handle), evt->encrypt);
+ evt->status, btohs(evt->handle), evt->encrypt);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d flags %d\n",
- evt->status, btohs(evt->handle), evt->flags);
+ evt->status, btohs(evt->handle), evt->flags);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
ba2str(&evt->bdaddr, addr);
printf("status 0x%2.2x bdaddr %s role 0x%2.2x\n",
- evt->status, addr, evt->role);
+ evt->status, addr, evt->role);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d ptype 0x%4.4x\n",
- evt->status, btohs(evt->handle), ptype);
+ evt->status, btohs(evt->handle), ptype);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d flags %d %s\n",
- evt->status, btohs(evt->handle), evt->flags,
- evt->direction == 0 ? "outgoing" : "incoming");
+ evt->status, btohs(evt->handle), evt->flags,
+ evt->direction == 0 ? "outgoing" : "incoming");
if (evt->status > 0) {
p_indent(level, frm);
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);
+ evt->status, btohs(evt->handle),
+ evt->page_num, evt->max_page_num);
if (evt->status > 0) {
p_indent(level, frm);
p_indent(level, frm);
printf("status 0x%2.2x handle %d bdaddr %s type %s\n",
- evt->status, btohs(evt->handle), addr,
- evt->link_type == 0 ? "SCO" : "eSCO");
+ evt->status, btohs(evt->handle), addr,
+ evt->link_type == 0 ? "SCO" : "eSCO");
if (evt->status > 0) {
p_indent(level, frm);
evt_sync_conn_changed *evt = frm->ptr;
p_indent(level, frm);
- printf("status 0x%2.2x handle %d\n",
- evt->status, btohs(evt->handle));
+ printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
if (evt->status > 0) {
p_indent(level, frm);
}
}
+static inline void sniff_subrate_event_dump(int level, struct frame *frm)
+{
+ evt_sniff_subrate *evt = frm->ptr;
+
+ p_indent(level, frm);
+ printf("status 0x%2.2x handle %d\n", evt->status, btohs(evt->handle));
+
+ if (evt->status > 0) {
+ p_indent(level, frm);
+ printf("Error: %s\n", status2str(evt->status));
+ } else {
+ p_indent(level, frm);
+ printf("max latency remote %d local %d\n",
+ btohs(evt->max_remote_latency),
+ btohs(evt->max_local_latency));
+
+ p_indent(level, frm);
+ printf("min timeout remote %d local %d\n",
+ btohs(evt->min_remote_timeout),
+ btohs(evt->min_local_timeout));
+ }
+}
+
static inline void extended_inq_result_dump(int level, struct frame *frm)
{
uint8_t num = get_u8(frm);
case EVT_SYNC_CONN_CHANGED:
sync_conn_changed_dump(level + 1, frm);
break;
+ case EVT_SNIFF_SUBRATE:
+ sniff_subrate_event_dump(level + 1, frm);
+ break;
case EVT_EXTENDED_INQUIRY_RESULT:
extended_inq_result_dump(level + 1, frm);
break;
if (!p_filter(FILT_SCO)) {
p_indent(level, frm);
printf("SCO data: handle %d dlen %d\n",
- acl_handle(handle), hdr->dlen);
+ acl_handle(handle), hdr->dlen);
level++;
frm->ptr += HCI_SCO_HDR_SIZE;