📄 hci.c
字号:
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; p_indent(level, frm); printf("status 0x%2.2x handle %d encrypt 0x%2.2x\n", evt->status, btohs(evt->handle), evt->encrypt); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); }}static inline void read_remote_features_complete_dump(int level, struct frame *frm){ evt_read_remote_features_complete *evt = frm->ptr; int i; 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("Features:"); for (i = 0; i < 8; i++) printf(" 0x%2.2x", evt->features[i]); printf("\n"); }}static inline void read_remote_version_complete_dump(int level, struct frame *frm){ evt_read_remote_version_complete *evt = frm->ptr; uint16_t manufacturer = btohs(evt->manufacturer); 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("LMP Version: %s (0x%x) LMP Subversion: 0x%x\n", lmp_vertostr(evt->lmp_ver), evt->lmp_ver, btohs(evt->lmp_subver)); p_indent(level, frm); printf("Manufacturer: %s (%d)\n", bt_compidtostr(manufacturer), manufacturer); }}static inline void qos_setup_complete_dump(int level, struct frame *frm){ evt_qos_setup_complete *evt = frm->ptr; p_indent(level, frm); printf("status 0x%2.2x handle %d flags %d\n", evt->status, btohs(evt->handle), evt->flags); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); } else { p_indent(level, frm); printf("Service type: %d\n", evt->qos.service_type); p_indent(level, frm); printf("Token rate: %d\n", btohl(evt->qos.token_rate)); p_indent(level, frm); printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); p_indent(level, frm); printf("Latency: %d\n", btohl(evt->qos.latency)); p_indent(level, frm); printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); }}static inline void role_change_dump(int level, struct frame *frm){ evt_role_change *evt = frm->ptr; char addr[18]; 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); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); } else { p_indent(level, frm); printf("Role: %s\n", role2str(evt->role)); }}static inline void num_comp_pkts_dump(int level, struct frame *frm){ uint8_t num = get_u8(frm); int i; p_indent(level, frm); printf("handle%s", num > 1 ? "s" : ""); for (i = 0; i < num; i++) { uint16_t handle = btohs(htons(get_u16(frm))); printf(" %d", handle); } printf("\n");}static inline void mode_change_dump(int level, struct frame *frm){ evt_mode_change *evt = frm->ptr; p_indent(level, frm); printf("status 0x%2.2x handle %d mode 0x%2.2x interval %d\n", evt->status, btohs(evt->handle), evt->mode, btohs(evt->interval)); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); } else { p_indent(level, frm); printf("Mode: %s\n", mode2str(evt->mode)); }}static inline void pin_code_req_dump(int level, struct frame *frm){ evt_pin_code_req *evt = frm->ptr; char addr[18]; p_indent(level, frm); ba2str(&evt->bdaddr, addr); printf("bdaddr %s\n", addr);}static inline void link_key_notify_dump(int level, struct frame *frm){ evt_link_key_notify *evt = frm->ptr; char addr[18]; int i; p_indent(level, frm); ba2str(&evt->bdaddr, addr); printf("bdaddr %s key ", addr); for (i = 0; i < 16; i++) printf("%2.2X", evt->link_key[i]); printf(" type %d\n", evt->key_type);}static inline void max_slots_change_dump(int level, struct frame *frm){ evt_max_slots_change *evt = frm->ptr; p_indent(level, frm); printf("handle %d slots %d\n", btohs(evt->handle), evt->max_slots);}static inline void data_buffer_overflow_dump(int level, struct frame *frm){ evt_data_buffer_overflow *evt = frm->ptr; p_indent(level, frm); printf("type %s\n", evt->link_type == 1 ? "ACL" : "SCO");}static inline void read_clock_offset_complete_dump(int level, struct frame *frm){ evt_read_clock_offset_complete *evt = frm->ptr; p_indent(level, frm); printf("status 0x%2.2x handle %d clkoffset 0x%4.4x\n", evt->status, btohs(evt->handle), btohs(evt->clock_offset)); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); }}static inline void conn_ptype_changed_dump(int level, struct frame *frm){ evt_conn_ptype_changed *evt = frm->ptr; uint16_t ptype = btohs(evt->ptype); char *str; p_indent(level, frm); printf("status 0x%2.2x handle %d ptype 0x%4.4x\n", evt->status, btohs(evt->handle), ptype); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); } else { str = hci_ptypetostr(ptype); if (str) { p_indent(level, frm); printf("Packet type: %s\n", str); free(str); } }}static inline void pscan_rep_mode_change_dump(int level, struct frame *frm){ evt_pscan_rep_mode_change *evt = frm->ptr; char addr[18]; p_indent(level, frm); ba2str(&evt->bdaddr, addr); printf("bdaddr %s mode %d\n", addr, evt->pscan_rep_mode);}static inline void flow_spec_complete_dump(int level, struct frame *frm){ evt_flow_spec_complete *evt = frm->ptr; 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"); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); } else { p_indent(level, frm); printf("Service type: %d\n", evt->qos.service_type); p_indent(level, frm); printf("Token rate: %d\n", btohl(evt->qos.token_rate)); p_indent(level, frm); printf("Peak bandwith: %d\n", btohl(evt->qos.peak_bandwidth)); p_indent(level, frm); printf("Latency: %d\n", btohl(evt->qos.latency)); p_indent(level, frm); printf("Delay variation: %d\n", btohl(evt->qos.delay_variation)); }}static inline void inq_result_with_rssi_dump(int level, struct frame *frm){ uint8_t num = get_u8(frm); char addr[18]; int i; if (!num) return; if (frm->len / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) { for (i = 0; i < num; i++) { inquiry_info_with_rssi_and_pscan_mode *info = frm->ptr; p_indent(level, frm); ba2str(&info->bdaddr, addr); printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", addr, info->pscan_rep_mode, btohs(info->clock_offset), info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); frm->ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; frm->len -= INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE; } } else { for (i = 0; i < num; i++) { inquiry_info_with_rssi *info = frm->ptr; p_indent(level, frm); ba2str(&info->bdaddr, addr); printf("bdaddr %s mode %d clkoffset 0x%4.4x class 0x%2.2x%2.2x%2.2x rssi %d\n", addr, info->pscan_rep_mode, btohs(info->clock_offset), info->dev_class[2], info->dev_class[1], info->dev_class[0], info->rssi); frm->ptr += INQUIRY_INFO_WITH_RSSI_SIZE; frm->len -= INQUIRY_INFO_WITH_RSSI_SIZE; } }}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 sync_conn_complete_dump(int level, struct frame *frm){ evt_sync_conn_complete *evt = frm->ptr; char addr[18]; ba2str(&evt->bdaddr, addr); 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"); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); } else { p_indent(level, frm); printf("Air mode: %s\n", airmode2str(evt->air_mode)); }}static inline void sync_conn_changed_dump(int level, struct frame *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)); if (evt->status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(evt->status)); }}static inline void event_dump(int level, struct frame *frm){ hci_event_hdr *hdr = frm->ptr; uint8_t event = hdr->evt; if (p_filter(FILT_HCI)) return; p_indent(level, frm); if (event <= EVENT_NUM) { printf("HCI Event: %s (0x%2.2x) plen %d\n", event_str[hdr->evt], hdr->evt, hdr->plen); } else if (hdr->evt == EVT_TESTING) { printf("HCI Event: Testing (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); } else if (hdr->evt == EVT_VENDOR) { printf("HCI Event: Vendor (0x%2.2x) plen %d\n", hdr->evt, hdr->plen); if (get_manufacturer() == 10) { frm->ptr += HCI_EVENT_HDR_SIZE; frm->len -= HCI_EVENT_HDR_SIZE; csr_dump(level + 1, frm); return; } } else printf("HCI Event: code 0x%2.2x plen %d\n", hdr->evt, hdr->plen); frm->ptr += HCI_EVENT_HDR_SIZE; frm->len -= HCI_EVENT_HDR_SIZE; if (event == EVT_CMD_COMPLETE) { evt_cmd_complete *cc = frm->ptr; if (cc->opcode == cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_LOCAL_VERSION)) { read_local_version_rp *rp = frm->ptr + EVT_CMD_COMPLETE_SIZE; manufacturer = rp->manufacturer; } } if (event == EVT_DISCONN_COMPLETE) { evt_disconn_complete *evt = frm->ptr; l2cap_clear(btohs(evt->handle)); } if (!(parser.flags & DUMP_VERBOSE)) { raw_dump(level, frm); return; } switch (event) { case EVT_LOOPBACK_COMMAND: command_dump(level + 1, frm); break; case EVT_CMD_COMPLETE: cmd_complete_dump(level + 1, frm); break; case EVT_CMD_STATUS: cmd_status_dump(level + 1, frm); break; case EVT_HARDWARE_ERROR: hardware_error_dump(level + 1, frm); break; case EVT_FLUSH_OCCURRED: case EVT_QOS_VIOLATION: handle_response_dump(level + 1, frm); break; case EVT_INQUIRY_COMPLETE: status_response_dump(level + 1, frm); break; case EVT_INQUIRY_RESULT: inq_result_dump(level + 1, frm); break; case EVT_CONN_COMPLETE: conn_complete_dump(level + 1, frm); break; case EVT_CONN_REQUEST: conn_request_dump(level + 1, frm); break; case EVT_DISCONN_COMPLETE: disconn_complete_dump(level + 1, frm); break; case EVT_AUTH_COMPLETE: 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_ENCRYPT_CHANGE: encrypt_change_dump(level + 1, frm); break; case EVT_READ_REMOTE_FEATURES_COMPLETE: read_remote_features_complete_dump(level + 1, frm); break; case EVT_READ_REMOTE_VERSION_COMPLETE: read_remote_version_complete_dump(level + 1, frm); break; case EVT_QOS_SETUP_COMPLETE: qos_setup_complete_dump(level + 1, frm); break; case EVT_ROLE_CHANGE: role_change_dump(level + 1, frm); break; case EVT_NUM_COMP_PKTS: num_comp_pkts_dump(level + 1, frm); break; case EVT_MODE_CHANGE: mode_change_dump(level + 1, frm); break; case EVT_RETURN_LINK_KEYS: return_link_keys_dump(level + 1, frm); break; case EVT_PIN_CODE_REQ: case EVT_LINK_KEY_REQ: pin_code_req_dump(level + 1, frm); break; case EVT_LINK_KEY_NOTIFY: link_key_notify_dump(level + 1, frm); break; case EVT_DATA_BUFFER_OVERFLOW: data_buffer_overflow_dump(level + 1, frm); break; case EVT_MAX_SLOTS_CHANGE: max_slots_change_dump(level + 1, frm); break; case EVT_READ_CLOCK_OFFSET_COMPLETE: read_clock_offset_complete_dump(level + 1, frm); break; case EVT_CONN_PTYPE_CHANGED: conn_ptype_changed_dump(level + 1, frm); break; case EVT_PSCAN_REP_MODE_CHANGE: pscan_rep_mode_change_dump(level + 1, frm); break; case EVT_FLOW_SPEC_COMPLETE: flow_spec_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; case EVT_SYNC_CONN_COMPLETE: sync_conn_complete_dump(level + 1, frm); break; case EVT_SYNC_CONN_CHANGED: sync_conn_changed_dump(level + 1, frm); break; default: raw_dump(level, frm); break; }}static inline void acl_dump(int level, struct frame *frm){ hci_acl_hdr *hdr = (void *) frm->ptr; uint16_t handle = btohs(hdr->handle); uint16_t dlen = btohs(hdr->dlen); uint8_t flags = acl_flags(handle); if (!p_filter(FILT_HCI)) { p_indent(level, frm); printf("ACL data: handle %d flags 0x%2.2x dlen %d\n", acl_handle(handle), flags, dlen); level++; } frm->ptr += HCI_ACL_HDR_SIZE; frm->len -= HCI_ACL_HDR_SIZE; frm->flags = flags; frm->handle = acl_handle(handle); if (parser.filter & ~FILT_HCI) l2cap_dump(level, frm); else raw_dump(level, frm);}static inline void sco_dump(int level, struct frame *frm){ hci_sco_hdr *hdr = (void *) frm->ptr; uint16_t handle = btohs(hdr->handle); if (!p_filter(FILT_SCO)) { p_indent(level, frm); printf("SCO data: handle %d dlen %d\n", acl_handle(handle), hdr->dlen); level++; frm->ptr += HCI_SCO_HDR_SIZE; frm->len -= HCI_SCO_HDR_SIZE; raw_dump(level, frm); }}static inline void vendor_dump(int level, struct frame *frm){ if (p_filter(FILT_HCI)) return; if (get_manufacturer() == 12) { bpa_dump(level, frm); return; } p_indent(level, frm); printf("Vendor data: len %d\n", frm->len); raw_dump(level, frm);}void hci_dump(int level, struct frame *frm){ uint8_t type = *(uint8_t *)frm->ptr; frm->ptr++; frm->len--; switch (type) { case HCI_COMMAND_PKT: command_dump(level, frm); break; case HCI_EVENT_PKT: event_dump(level, frm); break; case HCI_ACLDATA_PKT: acl_dump(level, frm); break; case HCI_SCODATA_PKT: sco_dump(level, frm); break; case HCI_VENDOR_PKT: vendor_dump(level, frm); break; default: if (p_filter(FILT_HCI)) break; p_indent(level, frm); printf("Unknown: type 0x%2.2x len %d\n", type, frm->len); raw_dump(level, frm); break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -