static void avrcp_displayable_charset(int level, struct frame *frm, uint8_t ctype, uint16_t len) { uint8_t num; if (ctype > AVC_CTYPE_GENERAL_INQUIRY) return; p_indent(level, frm); if (len < 2) { printf("PDU Malformed\n"); raw_dump(level, frm); return; } num = get_u8(frm); printf("CharsetCount: 0x%02x\n", num); for (; num > 0; num--) { uint16_t charset; p_indent(level, frm); charset = get_u16(frm); printf("CharsetID: 0x%04x (%s)\n", charset, charset2str(charset)); } }
static void info_opt(int level, int type, void *ptr, int len) { uint32_t mask; p_indent(level, 0); switch (type) { case 0x0001: printf("Connectionless MTU %d\n", get_val(ptr, len)); break; case 0x0002: mask = get_val(ptr, len); printf("Extended feature mask 0x%4.4x\n", mask); if (parser.flags & DUMP_VERBOSE) { if (mask & 0x01) { p_indent(level + 1, 0); printf("Flow control mode\n"); } if (mask & 0x02) { p_indent(level + 1, 0); printf("Retransmission mode\n"); } if (mask & 0x04) { p_indent(level + 1, 0); printf("Bi-directional QoS\n"); } } break; default: printf("Unknown (len %d)\n", len); break; } }
static void avrcp_get_play_status_dump(int level, struct frame *frm, uint8_t ctype, uint16_t len) { uint32_t interval; uint8_t status; if (ctype <= AVC_CTYPE_GENERAL_INQUIRY) return; p_indent(level, frm); if (len < 9) { printf("PDU Malformed\n"); raw_dump(level, frm); return; } interval = get_u32(frm); printf("SongLength: 0x%08x (%u miliseconds)\n", interval, interval); p_indent(level, frm); interval = get_u32(frm); printf("SongPosition: 0x%08x (%u miliconds)\n", interval, interval); p_indent(level, frm); status = get_u8(frm); printf("PlayStatus: 0x%02x (%s)\n", status, playstatus2str(status)); }
static inline void mcc_rpn(int level, uint8_t *ptr, unsigned int len, long_frame_head *head, mcc_long_frame_head *mcc_head) { rpn_msg *rpn = (void *) (ptr - STRUCT_END(rpn_msg, mcc_s_head)); printf("RPN %s: ", CR_STR(mcc_head)); print_rfcomm_hdr(head, ptr, len); print_mcc(mcc_head); p_indent(level, 0); printf("dlci %d ", GET_DLCI(rpn->dlci)); /* Assuming that rpn_val is _declared_ as a member of rpn_msg... */ if (len <= STRUCT_OFFSET(rpn_msg, rpn_val) - STRUCT_END(rpn_msg, mcc_s_head)) { printf("\n"); return; } printf("br %d db %d sb %d p %d pt %d xi %d xo %d\n", rpn->rpn_val.bit_rate, rpn->rpn_val.data_bits, rpn->rpn_val.stop_bit, rpn->rpn_val.parity, rpn->rpn_val.parity_type, rpn->rpn_val.xon_input, rpn->rpn_val.xon_output); p_indent(level, 0); printf("rtri %d rtro %d rtci %d rtco %d xon %d xoff %d pm 0x%04x\n", rpn->rpn_val.rtr_input, rpn->rpn_val.rtr_output, rpn->rpn_val.rtc_input, rpn->rpn_val.rtc_output, rpn->rpn_val.xon, rpn->rpn_val.xoff, btohs(rpn->rpn_val.pm)); }
static void att_find_info_resp_dump(int level, struct frame *frm) { uint8_t fmt = get_u8(frm); p_indent(level, frm); if (fmt == 0x01) { printf("format: uuid-16\n"); while (frm->len > 0) { uint16_t handle = btohs(htons(get_u16(frm))); uint16_t uuid = btohs(htons(get_u16(frm))); p_indent(level + 1, frm); printf("handle 0x%4.4x, uuid 0x%4.4x (%s)\n", handle, uuid, uuid2str(uuid)); } } else { printf("format: uuid-128\n"); while (frm->len > 0) { uint16_t handle = btohs(htons(get_u16(frm))); p_indent(level + 1, frm); printf("handle 0x%4.4x, uuid ", handle); print_uuid128(frm); printf("\n"); } } }
static inline void conf_rsp(int level, l2cap_cmd_hdr *cmd, struct frame *frm) { l2cap_conf_rsp *h = frm->ptr; uint16_t scid = btohs(h->scid); uint16_t result = btohs(h->result); int clen = btohs(cmd->len) - L2CAP_CONF_RSP_SIZE; if (p_filter(FILT_L2CAP)) return; printf("Config rsp: scid 0x%4.4x flags 0x%2.2x result %d clen %d\n", scid, btohs(h->flags), result, clen); if (clen > 0) { if (result) { p_indent(level + 1, frm); printf("%s\n", confresult2str(result)); } if (result == 0x0003) conf_list(level + 1, h->data, clen); else conf_opt(level + 1, h->data, clen, frm->in, frm->handle, scid); } else { p_indent(level + 1, frm); printf("%s\n", confresult2str(result)); } }
void hcrp_dump(int level, struct frame *frm) { uint16_t pid, tid, plen, status; uint32_t credits; pid = get_u16(frm); tid = get_u16(frm); plen = get_u16(frm); p_indent(level, frm); printf("HCRP %s %s: tid 0x%x plen %d", pid2str(pid), frm->in ? "rsp" : "cmd", tid, plen); if (frm->in) { status = get_u16(frm); printf(" status %d (%s)\n", status, status2str(status)); } else printf("\n"); if (pid == 0x0001 && !frm->in) { credits = get_u32(frm); p_indent(level + 1, frm); printf("credits %d\n", credits); } if (pid == 0x0002 && frm->in) { credits = get_u32(frm); p_indent(level + 1, frm); printf("credits %d\n", credits); } raw_dump(level + 1, frm); }
static void cmd_connect_active(int level, uint8_t subcmd, struct frame *frm) { uint8_t len; cmd_common(level, subcmd, frm); if (subcmd == 0x82) { len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("Connected number:\n"); hex_dump(level, frm, len); } len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("Connected subaddress:\n"); hex_dump(level, frm, len); } len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("LLC:\n"); hex_dump(level, frm, len); } } }
static void avrcp_set_player_value_dump(int level, struct frame *frm, uint8_t ctype, uint16_t len) { uint8_t num; p_indent(level, frm); if (ctype > AVC_CTYPE_GENERAL_INQUIRY) return; if (len < 1) { printf("PDU Malformed\n"); raw_dump(level, frm); return; } num = get_u8(frm); printf("AttributeCount: 0x%02x\n", num); for (; num > 0; num--) { uint8_t attr, value; p_indent(level, frm); attr = get_u8(frm); printf("AttributeID: 0x%02x (%s)\n", attr, attr2str(attr)); p_indent(level, frm); value = get_u8(frm); printf("ValueID: 0x%02x (%s)\n", value, value2str(attr, value)); } }
static void cmd_common(int level, uint8_t subcmd, struct frame *frm) { uint32_t val; uint16_t info, ncci; uint8_t ctr, plci; val = CAPI_U32(frm); ctr = val & 0xff; plci = (val & 0xff00) >> 8; ncci = (val & 0xffff0000) >> 16; p_indent(level, frm); printf("Controller: %d %s\n", ctr & 0x7f, ctr & 0x80 ? "Ext." : "Int."); if (plci > 0) { p_indent(level, frm); printf("PLCI: 0x%02x\n", plci); } if (ncci > 0) { p_indent(level, frm); printf("NCCI: 0x%04x\n", ncci); } if (subcmd == 0x81) { info = CAPI_U16(frm); p_indent(level, frm); printf("Info: 0x%04x (%s)\n", info, info2str(info)); } }
static void smp_cmd_pairing_failed_dump(int level, struct frame *frm) { uint8_t reason = p_get_u8(frm); p_indent(level, frm); printf("reason 0x%2.2x\n", reason); p_indent(level, frm); printf("Reason %s\n", smpreason2str(reason)); }
static void att_read_multi_req_dump(int level, struct frame *frm) { p_indent(level, frm); printf("Handles\n"); while (frm->len > 0) { p_indent(level, frm); printf("handle 0x%4.4x\n", btohs(htons(get_u16(frm)))); } }
void avrcp_dump(int level, struct frame *frm) { uint8_t ctype, address, subunit, opcode, company[3]; int i; p_indent(level, frm); ctype = get_u8(frm); address = get_u8(frm); opcode = get_u8(frm); printf("AV/C: %s: address 0x%02x opcode 0x%02x\n", ctype2str(ctype), address, opcode); p_indent(level + 1, frm); subunit = address >> 3; printf("Subunit: %s\n", subunit2str(subunit)); p_indent(level + 1, frm); printf("Opcode: %s\n", opcode2str(opcode)); /* Skip non-panel subunit packets */ if (subunit != AVC_SUBUNIT_PANEL) { raw_dump(level, frm); return; } /* Not implemented should not contain any operand */ if (ctype == AVC_CTYPE_NOT_IMPLEMENTED) { raw_dump(level, frm); return; } switch (opcode) { case AVC_OP_PASSTHROUGH: avrcp_passthrough_dump(level + 1, frm); break; case AVC_OP_VENDORDEP: p_indent(level + 1, frm); printf("Company ID: 0x"); for (i = 0; i < 3; i++) { company[i] = get_u8(frm); printf("%02x", company[i]); } printf("\n"); avrcp_pdu_dump(level + 1, frm, ctype); break; default: raw_dump(level, frm); } }
static void att_error_dump(int level, struct frame *frm) { uint8_t op = get_u8(frm); uint16_t handle = btohs(htons(get_u16(frm))); uint8_t err = get_u8(frm); p_indent(level, frm); printf("Error: %s (%d)\n", atterror2str(err), err); p_indent(level, frm); printf("%s (0x%.2x) on handle 0x%4.4x\n", attop2str(op), op, handle); }
static void avrcp_get_capabilities_dump(int level, struct frame *frm, uint16_t len) { uint8_t cap; uint8_t count; p_indent(level, frm); if (len < 1) { printf("PDU Malformed\n"); raw_dump(level, frm); return; } cap = get_u8(frm); printf("CapabilityID: 0x%02x (%s)\n", cap, cap2str(cap)); if (len == 1) return; p_indent(level, frm); count = get_u8(frm); printf("CapabilityCount: 0x%02x\n", count); switch (cap) { case 0x2: for (; count > 0; count--) { int i; p_indent(level, frm); printf("%s: 0x", cap2str(cap)); for (i = 0; i < 3; i++) printf("%02x", get_u8(frm)); printf("\n"); } break; case 0x3: for (; count > 0; count--) { uint8_t event; p_indent(level, frm); event = get_u8(frm); printf("%s: 0x%02x (%s)\n", cap2str(cap), event, event2str(event)); } break; default: raw_dump(level, frm); } }
static void att_handle_notify_dump(int level, struct frame *frm) { uint16_t handle = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("handle 0x%4.4x\n", handle); p_indent(level, frm); printf("value "); while (frm->len > 0) printf("0x%.2x ", get_u8(frm)); printf("\n"); }
static void att_find_by_type_req_dump(int level, struct frame *frm) { uint16_t start = btohs(htons(get_u16(frm))); uint16_t end = btohs(htons(get_u16(frm))); uint16_t uuid = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("start 0x%4.4x, end 0x%4.4x, uuid 0x%4.4x\n", start, end, uuid); p_indent(level, frm); printf("value"); while (frm->len > 0) printf(" 0x%2.2x", get_u8(frm)); printf("\n"); }
static void att_prep_write_dump(int level, struct frame *frm) { uint16_t handle = btohs(htons(get_u16(frm))); uint16_t val_offset = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("attr handle 0x%4.4x, value offset 0x%4.4x\n", handle, val_offset); p_indent(level, frm); printf("part attr value "); while (frm->len > 0) printf(" 0x%2.2x", get_u8(frm)); printf("\n"); }
static void att_read_req_dump(int level, struct frame *frm) { uint16_t handle = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("handle 0x%4.4x\n", handle); }
static inline void complex_dump(int level, char *str, struct frame *frm) { p_indent(level, frm); printf("%s\n", str); raw_dump(level, frm); }
void hidp_dump(int level, struct frame *frm) { uint8_t hdr; char *param; hdr = p_get_u8(frm); switch (hdr & 0xf0) { case 0x00: param = result2str(hdr); break; case 0x10: param = operation2str(hdr); break; case 0x60: case 0x70: param = protocol2str(hdr); break; case 0x40: case 0x50: case 0xa0: case 0xb0: param = report2str(hdr); break; default: param = ""; break; } p_indent(level, frm); printf("HIDP: %s: %s\n", type2str(hdr), param); raw_dump(level, frm); }
static void bnep_eval_extension(int level, struct frame *frm) { uint8_t type = p_get_u8(frm); uint8_t length = p_get_u8(frm); int extension = type & 0x80; p_indent(level, frm); switch (type & 0x7f) { case BNEP_EXTENSION_CONTROL: printf("Ext Control(0x%02x|%s) len 0x%02x\n", type & 0x7f, extension ? "1" : "0", length); bnep_control(level, frm, length); break; default: printf("Ext Unknown(0x%02x|%s) len 0x%02x\n", type & 0x7f, extension ? "1" : "0", length); raw_ndump(level + 1, frm, length); frm->ptr += length; frm->len -= length; } if (extension) bnep_eval_extension(level, frm); }
static void conf_list(int level, uint8_t *list, int len) { int i; p_indent(level, 0); for (i = 0; i < len; i++) { switch (list[i] & 0x7f) { case L2CAP_CONF_MTU: printf("MTU "); break; case L2CAP_CONF_FLUSH_TO: printf("FlushTo "); break; case L2CAP_CONF_QOS: printf("QoS "); break; case L2CAP_CONF_RFC: printf("RFC "); break; case L2CAP_CONF_FCS: printf("FCS "); break; case L2CAP_CONF_EFS: printf("EFS "); break; case L2CAP_CONF_EWS: printf("EWS "); break; default: printf("%2.2x ", list[i] & 0x7f); break; } } printf("\n"); }
static void avrcp_set_addressed_player(int level, struct frame *frm, uint8_t ctype, uint16_t len) { uint16_t id; uint8_t status; p_indent(level, frm); if (ctype > AVC_CTYPE_GENERAL_INQUIRY) goto response; if (len < 2) { printf("PDU Malformed\n"); raw_dump(level, frm); return; } id = get_u16(frm); printf("PlayerID: 0x%04x (%u)", id, id); return; response: if (len < 1) { printf("PDU Malformed\n"); raw_dump(level, frm); return; } status = get_u8(frm); printf("Status: 0x%02x (%s)\n", status, error2str(status)); }
static void smp_cmd_security_req_dump(int level, struct frame *frm) { uint8_t auth = p_get_u8(frm); p_indent(level, frm); printf("auth req 0x%2.2x\n", auth); }
static inline void mcc_pn(int level, uint8_t *ptr, int len, long_frame_head *head, mcc_long_frame_head *mcc_head) { pn_msg *pn = (void*) (ptr - STRUCT_END(pn_msg, mcc_s_head)); printf("PN %s: ", CR_STR(mcc_head)); print_rfcomm_hdr(head, ptr, len); print_mcc(mcc_head); p_indent(level, 0); printf("dlci %d frame_type %d credit_flow %d pri %d ack_timer %d\n", pn->dlci, pn->frame_type, pn->credit_flow, pn->prior, pn->ack_timer); p_indent(level, 0); printf("frame_size %d max_retrans %d credits %d\n", btohs(pn->frame_size), pn->max_nbrof_retrans, pn->credits); }
static void att_mtu_resp_dump(int level, struct frame *frm) { uint16_t server_rx_mtu = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("server rx mtu %d\n", server_rx_mtu); }
static void cmd_connect(int level, uint8_t subcmd, struct frame *frm) { uint16_t cip; uint8_t len; cmd_common(level, subcmd, frm); if (subcmd == 0x81) return; cip = CAPI_U16(frm); p_indent(level, frm); printf("CIP value: 0x%04x\n", cip); len = CAPI_U8(frm); frm->ptr += len; frm->len -= len; len = CAPI_U8(frm); frm->ptr += len; frm->len -= len; len = CAPI_U8(frm); frm->ptr += len; frm->len -= len; len = CAPI_U8(frm); frm->ptr += len; frm->len -= len; raw_dump(level, frm); }
void ext_dump(int level, struct frame *frm, int num) { unsigned char *buf = frm->ptr; register int i, n = 0, size; if ((num < 0) || (num > frm->len)) num = frm->len; while (num > 0) { p_indent(level, frm); printf("%04x: ", n); size = num > 16 ? 16 : num; for (i = 0; i < size; i++) printf("%02x%s", buf[i], (i + 1) % 8 ? " " : " "); for (i = size; i < 16; i++) printf(" %s", (i + 1) % 8 ? " " : " "); for (i = 0; i < size; i++) printf("%1c", isprint(buf[i]) ? buf[i] : '.'); printf("\n"); buf += size; num -= size; n += size; } }
static void att_mtu_req_dump(int level, struct frame *frm) { uint16_t client_rx_mtu = btohs(htons(get_u16(frm))); p_indent(level, frm); printf("client rx mtu %d\n", client_rx_mtu); }