📄 hci.c
字号:
memset(name, 0, sizeof(name)); for (i = 0; i < 248 && cp->name[i]; i++) if (isprint(cp->name[i])) name[i] = cp->name[i]; else name[i] = '.'; p_indent(level, frm); printf("name \'%s\'\n", name);}static inline void write_class_of_dev_dump(int level, struct frame *frm){ write_class_of_dev_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]);}static inline void write_voice_setting_dump(int level, struct frame *frm){ write_voice_setting_cp *cp = frm->ptr; p_indent(level, frm); printf("voice setting 0x%4.4x\n", btohs(cp->voice_setting));}static inline void write_current_iac_lap_dump(int level, struct frame *frm){ write_current_iac_lap_cp *cp = frm->ptr; int i; for (i = 0; i < cp->num_current_iac; i++) { p_indent(level, frm); printf("IAC 0x%2.2x%2.2x%2.2x", cp->lap[i][2], cp->lap[i][1], cp->lap[i][0]); if (cp->lap[i][2] == 0x9e && cp->lap[i][1] == 0x8b) { switch (cp->lap[i][0]) { case 0x00: printf(" (Limited Inquiry Access Code)"); break; case 0x33: printf(" (General Inquiry Access Code)"); break; } } printf("\n"); }}static inline void write_scan_enable_dump(int level, struct frame *frm){ uint8_t enable = get_u8(frm); p_indent(level, frm); printf("enable %d\n", enable);}static inline void write_page_timeout_dump(int level, struct frame *frm){ write_page_timeout_cp *cp = frm->ptr; p_indent(level, frm); printf("timeout %d\n", btohs(cp->timeout));}static inline void write_page_activity_dump(int level, struct frame *frm){ write_page_activity_cp *cp = frm->ptr; p_indent(level, frm); printf("interval %d window %d\n", btohs(cp->interval), btohs(cp->window));}static inline void write_inquiry_scan_type_dump(int level, struct frame *frm){ write_inquiry_scan_type_cp *cp = frm->ptr; p_indent(level, frm); printf("type %d\n", cp->type);}static inline void write_inquiry_mode_dump(int level, struct frame *frm){ write_inquiry_mode_cp *cp = frm->ptr; p_indent(level, frm); printf("mode %d\n", cp->mode);}static inline void set_afh_classification_dump(int level, struct frame *frm){ set_afh_classification_cp *cp = frm->ptr; int i; p_indent(level, frm); printf("map 0x"); for (i = 0; i < 10; i++) printf("%02x", cp->map[i]); printf("\n");}static inline void write_link_supervision_timeout_dump(int level, struct frame *frm){ write_link_supervision_timeout_cp *cp = frm->ptr; p_indent(level, frm); printf("handle %d timeout %d\n", btohs(cp->handle), btohs(cp->timeout));}static inline void write_ext_inquiry_response_dump(int level, struct frame *frm){ write_ext_inquiry_response_cp *cp = frm->ptr; p_indent(level, frm); printf("fec 0x%2.2x\n", cp->fec); frm->ptr++; frm->len--; ext_inquiry_response_dump(level, frm);}static inline void write_inquiry_transmit_power_level_dump(int level, struct frame *frm){ write_inquiry_transmit_power_level_cp *cp = frm->ptr; p_indent(level, frm); printf("level %d\n", cp->level);}static inline void write_default_error_data_reporting_dump(int level, struct frame *frm){ write_default_error_data_reporting_cp *cp = frm->ptr; p_indent(level, frm); printf("reporting %d\n", cp->reporting);}static inline void enhanced_flush_dump(int level, struct frame *frm){ enhanced_flush_cp *cp = frm->ptr; p_indent(level, frm); printf("handle %d type %d\n", btohs(cp->handle), cp->type);}static inline void send_keypress_notify_dump(int level, struct frame *frm){ send_keypress_notify_cp *cp = frm->ptr; char addr[18]; p_indent(level, frm); p_ba2str(&cp->bdaddr, addr); printf("bdaddr %s type %d\n", addr, cp->type);}static inline void request_transmit_power_level_dump(int level, struct frame *frm){ read_transmit_power_level_cp *cp = frm->ptr; p_indent(level, frm); printf("handle %d type %d (%s)\n", btohs(cp->handle), cp->type, cp->type ? "maximum" : "current");}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 request_clock_dump(int level, struct frame *frm){ read_clock_cp *cp = frm->ptr; p_indent(level, frm); printf("handle %d which %d (%s)\n", btohs(cp->handle), cp->which_clock, cp->which_clock ? "piconet" : "local");}static inline void host_buffer_size_dump(int level, struct frame *frm){ host_buffer_size_cp *cp = frm->ptr; p_indent(level, frm); printf("ACL MTU %d:%d SCO MTU %d:%d\n", btohs(cp->acl_mtu), btohs(cp->acl_max_pkt), cp->sco_mtu, btohs(cp->sco_max_pkt));}static inline void num_comp_pkts_dump(int level, struct frame *frm){ uint8_t num = get_u8(frm); uint16_t handle, packets; int i; for (i = 0; i < num; i++) { handle = btohs(htons(get_u16(frm))); packets = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("handle %d packets %d\n", handle, packets); }}static inline void command_dump(int level, struct frame *frm){ hci_command_hdr *hdr = frm->ptr; uint16_t opcode = btohs(hdr->opcode); uint16_t ogf = cmd_opcode_ogf(opcode); uint16_t ocf = cmd_opcode_ocf(opcode); if (p_filter(FILT_HCI)) return; if (ogf == OGF_VENDOR_CMD && (parser.flags & DUMP_NOVENDOR)) return; p_indent(level, frm); printf("HCI Command: %s (0x%2.2x|0x%4.4x) plen %d\n", opcode2str(opcode), ogf, ocf, hdr->plen); frm->ptr += HCI_COMMAND_HDR_SIZE; frm->len -= HCI_COMMAND_HDR_SIZE; if (ogf == OGF_VENDOR_CMD) { if (ocf == 0 && get_manufacturer() == 10) { csr_dump(level + 1, frm); return; } } if (!(parser.flags & DUMP_VERBOSE)) { raw_dump(level, frm); return; } switch (ogf) { case OGF_LINK_CTL: switch (ocf) { case OCF_INQUIRY: inquiry_dump(level + 1, frm); return; case OCF_PERIODIC_INQUIRY: periodic_inquiry_dump(level + 1, frm); return; case OCF_INQUIRY_CANCEL: case OCF_EXIT_PERIODIC_INQUIRY: return; case OCF_CREATE_CONN: create_conn_dump(level + 1, frm); return; case OCF_DISCONNECT: disconnect_dump(level + 1, frm); return; case OCF_CREATE_CONN_CANCEL: case OCF_REMOTE_NAME_REQ_CANCEL: case OCF_ACCEPT_SYNC_CONN_REQ: bdaddr_command_dump(level + 1, frm); return; case OCF_ADD_SCO: case OCF_SET_CONN_PTYPE: add_sco_dump(level + 1, frm); return; case OCF_ACCEPT_CONN_REQ: accept_conn_req_dump(level + 1, frm); return; case OCF_REJECT_CONN_REQ: case OCF_REJECT_SYNC_CONN_REQ: case OCF_IO_CAPABILITY_NEG_REPLY: reject_conn_req_dump(level + 1, frm); return; case OCF_PIN_CODE_REPLY: pin_code_reply_dump(level + 1, frm); return; case OCF_LINK_KEY_REPLY: link_key_reply_dump(level + 1, frm); return; case OCF_PIN_CODE_NEG_REPLY: case OCF_LINK_KEY_NEG_REPLY: case OCF_USER_CONFIRM_REPLY: case OCF_USER_CONFIRM_NEG_REPLY: case OCF_USER_PASSKEY_NEG_REPLY: case OCF_REMOTE_OOB_DATA_NEG_REPLY: pin_code_neg_reply_dump(level + 1, frm); return; case OCF_USER_PASSKEY_REPLY: user_passkey_reply_dump(level + 1, frm); return; case OCF_REMOTE_OOB_DATA_REPLY: remote_oob_data_reply_dump(level + 1, frm); return; case OCF_IO_CAPABILITY_REPLY: io_capability_reply_dump(level + 1, frm); return; case OCF_SET_CONN_ENCRYPT: set_conn_encrypt_dump(level + 1, frm); return; case OCF_AUTH_REQUESTED: case OCF_CHANGE_CONN_LINK_KEY: case OCF_READ_REMOTE_FEATURES: case OCF_READ_REMOTE_VERSION: case OCF_READ_CLOCK_OFFSET: case OCF_READ_LMP_HANDLE: 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; case OCF_SETUP_SYNC_CONN: setup_sync_conn_dump(level + 1, frm); return; } break; case OGF_LINK_POLICY: switch (ocf) { case OCF_HOLD_MODE: case OCF_PARK_MODE: hold_mode_dump(level + 1, frm); return; case OCF_SNIFF_MODE: sniff_mode_dump(level + 1, frm); return; case OCF_EXIT_SNIFF_MODE: case OCF_EXIT_PARK_MODE: case OCF_ROLE_DISCOVERY: case OCF_READ_LINK_POLICY: generic_command_dump(level + 1, frm); return; case OCF_SWITCH_ROLE: accept_conn_req_dump(level + 1, frm); return; case OCF_QOS_SETUP: qos_setup_dump(level + 1, frm); return; case OCF_WRITE_LINK_POLICY: write_link_policy_dump(level + 1, frm); return; case OCF_SNIFF_SUBRATING: sniff_subrating_dump(level + 1, frm); return; } break; case OGF_HOST_CTL: switch (ocf) { case OCF_RESET: case OCF_CREATE_NEW_UNIT_KEY: return; case OCF_SET_EVENT_MASK: set_event_mask_dump(level + 1, frm); return; case OCF_SET_EVENT_FLT: set_event_flt_dump(level + 1, frm); return; case OCF_WRITE_PIN_TYPE: write_pin_type_dump(level + 1, frm); return; case OCF_READ_STORED_LINK_KEY: case OCF_DELETE_STORED_LINK_KEY: request_stored_link_key_dump(level + 1, frm); return; case OCF_WRITE_STORED_LINK_KEY: return_link_keys_dump(level + 1, frm); return; case OCF_CHANGE_LOCAL_NAME: change_local_name_dump(level + 1, frm); return; case OCF_WRITE_CLASS_OF_DEV: write_class_of_dev_dump(level + 1, frm); return; case OCF_WRITE_VOICE_SETTING: write_voice_setting_dump(level + 1, frm); return; case OCF_WRITE_CURRENT_IAC_LAP: write_current_iac_lap_dump(level + 1, frm); return; case OCF_WRITE_SCAN_ENABLE: case OCF_WRITE_AUTH_ENABLE: case OCF_SET_CONTROLLER_TO_HOST_FC: write_scan_enable_dump(level + 1, frm); return; case OCF_WRITE_CONN_ACCEPT_TIMEOUT: case OCF_WRITE_PAGE_TIMEOUT: write_page_timeout_dump(level + 1, frm); return; case OCF_WRITE_PAGE_ACTIVITY: case OCF_WRITE_INQ_ACTIVITY: write_page_activity_dump(level + 1, frm); return; case OCF_WRITE_INQUIRY_SCAN_TYPE: write_inquiry_scan_type_dump(level + 1, frm); return; case OCF_WRITE_ENCRYPT_MODE: case OCF_WRITE_INQUIRY_MODE: case OCF_WRITE_AFH_MODE: write_inquiry_mode_dump(level + 1, frm); return; case OCF_SET_AFH_CLASSIFICATION: set_afh_classification_dump(level + 1, frm); return; case OCF_READ_TRANSMIT_POWER_LEVEL: request_transmit_power_level_dump(level + 1, frm); return; case OCF_HOST_BUFFER_SIZE: host_buffer_size_dump(level + 1, frm); return; case OCF_HOST_NUM_COMP_PKTS: num_comp_pkts_dump(level + 1, frm); return; case OCF_FLUSH: case OCF_READ_LINK_SUPERVISION_TIMEOUT: case OCF_REFRESH_ENCRYPTION_KEY: generic_command_dump(level + 1, frm); return; case OCF_WRITE_LINK_SUPERVISION_TIMEOUT: write_link_supervision_timeout_dump(level + 1, frm); return; case OCF_WRITE_EXT_INQUIRY_RESPONSE: write_ext_inquiry_response_dump(level + 1, frm); return; case OCF_WRITE_SIMPLE_PAIRING_MODE: generic_write_mode_dump(level + 1, frm); return; case OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL: write_inquiry_transmit_power_level_dump(level + 1, frm); return; case OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING: write_default_error_data_reporting_dump(level + 1, frm); return; case OCF_ENHANCED_FLUSH: enhanced_flush_dump(level + 1, frm); return; case OCF_SEND_KEYPRESS_NOTIFY: send_keypress_notify_dump(level + 1, frm); return; } break; case OGF_INFO_PARAM: switch (ocf) { case OCF_READ_LOCAL_EXT_FEATURES: request_local_ext_features_dump(level + 1, frm); return; } break; case OGF_STATUS_PARAM: switch (ocf) { case OCF_READ_LINK_QUALITY: case OCF_READ_RSSI: case OCF_READ_AFH_MAP: generic_command_dump(level + 1, frm); return; case OCF_READ_CLOCK: request_clock_dump(level + 1, frm); return; } break; case OGF_TESTING_CMD: switch (ocf) { case OCF_WRITE_LOOPBACK_MODE: case OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE: generic_write_mode_dump(level + 1, frm); return; } break; } raw_dump(level, frm);}static inline void status_response_dump(int level, struct frame *frm){ uint8_t status = get_u8(frm); p_indent(level, frm); printf("status 0x%2.2x\n", status); if (status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(status)); } raw_dump(level, frm);}static inline void handle_response_dump(int level, struct frame *frm){ uint16_t handle = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("handle %d\n", handle); raw_dump(level, frm);}static inline void bdaddr_response_dump(int level, struct frame *frm){ uint8_t status = get_u8(frm); bdaddr_t *bdaddr = frm->ptr; char addr[18]; frm->ptr += sizeof(bdaddr_t); frm->len -= sizeof(bdaddr_t); p_indent(level, frm); p_ba2str(bdaddr, addr); printf("status 0x%2.2x bdaddr %s\n", status, addr); if (status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(status)); } raw_dump(level, frm);}static inline void generic_response_dump(int level, struct frame *frm){ uint8_t status = get_u8(frm); uint16_t handle = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("status 0x%2.2x handle %d\n", status, handle); if (status > 0) { p_indent(level, frm); printf("Error: %s\n", status2str(status)); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -