void avctp_dump(int level, struct frame *frm, uint16_t psm) { uint8_t hdr; uint16_t pid; p_indent(level, frm); hdr = get_u8(frm); pid = get_u16(frm); printf("AVCTP %s: %s %s: pt 0x%02x transaction %d pid 0x%04x\n", psm == 23 ? "Control" : "Browsing", hdr & 0x02 ? "Response" : "Command", pt2str(hdr), hdr & 0x0c, hdr >> 4, pid); if (pid == SDP_UUID_AV_REMOTE || pid == SDP_UUID_AV_REMOTE_TARGET) avrcp_dump(level + 1, frm, hdr, psm); else raw_dump(level + 1, frm); }
static bool avrcp_pdu_packet(struct avctp_frame *avctp_frame, uint8_t ctype, uint8_t indent) { struct l2cap_frame *frame = &avctp_frame->l2cap_frame; uint8_t pduid; uint16_t len; int i; const struct avrcp_ctrl_pdu_data *ctrl_pdu_data = NULL; if (!l2cap_frame_get_u8(frame, &pduid)) return false; if (!l2cap_frame_get_u8(frame, &avctp_frame->pt)) return false; if (!l2cap_frame_get_be16(frame, &len)) return false; print_indent(indent, COLOR_OFF, "AVRCP: ", pdu2str(pduid), COLOR_OFF, " pt %s len 0x%04x", pt2str(avctp_frame->pt), len); if (frame->size != len) return false; if (ctype == 0xA) return avrcp_rejected_packet(frame, indent + 2); for (i = 0; avrcp_ctrl_pdu_table[i].func; i++) { if (avrcp_ctrl_pdu_table[i].pduid == pduid) { ctrl_pdu_data = &avrcp_ctrl_pdu_table[i]; break; } } if (!ctrl_pdu_data || !ctrl_pdu_data->func) { packet_hexdump(frame->data, frame->size); return true; } return ctrl_pdu_data->func(avctp_frame, ctype, len, indent + 2); }
static void avrcp_pdu_dump(int level, struct frame *frm, uint8_t ctype) { uint8_t pduid, pt; uint16_t len; p_indent(level, frm); pduid = get_u8(frm); pt = get_u8(frm); len = get_u16(frm); printf("AVRCP: %s: pt %s len 0x%04x\n", pdu2str(pduid), pt2str(pt), len); if (len != frm->len) { p_indent(level, frm); printf("PDU Malformed\n"); raw_dump(level, frm); return; } if (ctype == AVC_CTYPE_REJECTED) { avrcp_rejected_dump(level + 1, frm, len); return; } switch (pduid) { case AVRCP_GET_CAPABILITIES: avrcp_get_capabilities_dump(level + 1, frm, len); break; case AVRCP_LIST_PLAYER_ATTRIBUTES: avrcp_list_player_attributes_dump(level + 1, frm, len); break; case AVRCP_LIST_PLAYER_VALUES: avrcp_list_player_values_dump(level + 1, frm, ctype, len); break; case AVRCP_GET_CURRENT_PLAYER_VALUE: avrcp_get_current_player_value_dump(level + 1, frm, ctype, len); break; case AVRCP_SET_PLAYER_VALUE: avrcp_set_player_value_dump(level + 1, frm, ctype, len); break; case AVRCP_GET_PLAYER_ATTRIBUTE_TEXT: avrcp_get_player_attribute_text_dump(level + 1, frm, ctype, len); break; case AVRCP_GET_PLAYER_VALUE_TEXT: avrcp_get_player_value_text_dump(level + 1, frm, ctype, len); break; case AVRCP_DISPLAYABLE_CHARSET: avrcp_displayable_charset(level + 1, frm, ctype, len); break; case AVRCP_CT_BATTERY_STATUS: avrcp_ct_battery_status_dump(level + 1, frm, ctype, len); break; case AVRCP_GET_ELEMENT_ATTRIBUTES: avrcp_get_element_attributes_dump(level + 1, frm, ctype, len, pt); break; case AVRCP_GET_PLAY_STATUS: avrcp_get_play_status_dump(level + 1, frm, ctype, len); break; case AVRCP_REGISTER_NOTIFICATION: avrcp_register_notification_dump(level + 1, frm, ctype, len); break; case AVRCP_SET_ABSOLUTE_VOLUME: avrcp_set_absolute_volume_dump(level + 1, frm, ctype, len); break; case AVRCP_SET_ADDRESSED_PLAYER: avrcp_set_addressed_player(level + 1, frm, ctype, len); break; case AVRCP_SET_BROWSED_PLAYER: avrcp_set_browsed_player(level + 1, frm, ctype, len); break; default: raw_dump(level, frm); } }
void avdtp_dump(int level, struct frame *frm) { uint8_t hdr, sid, nsp, type; uint16_t seqn; uint32_t time, ssrc; switch (frm->num) { case 1: p_indent(level, frm); hdr = get_u8(frm); nsp = (hdr & 0x0c) == 0x04 ? get_u8(frm) : 0; sid = hdr & 0x08 ? 0x00 : get_u8(frm); printf("AVDTP(s): %s %s: transaction %d nsp 0x%02x\n", hdr & 0x08 ? pt2str(hdr) : si2str(sid), mt2str(hdr), hdr >> 4, nsp); switch (sid & 0x7f) { case 0x01: discover(level + 1, hdr, frm); break; case 0x02: case 0x0c: get_capabilities(level + 1, hdr, frm); break; case 0x03: set_configuration(level + 1, hdr, frm); break; case 0x04: get_configuration(level + 1, hdr, frm); break; case 0x05: reconfigure(level + 1, hdr, frm); break; case 0x06: open_close_stream(level + 1, hdr, frm); break; case 0x07: start_suspend_stream(level + 1, hdr, frm); break; case 0x08: open_close_stream(level + 1, hdr, frm); break; case 0x09: start_suspend_stream(level + 1, hdr, frm); break; case 0x0a: abort_streaming(level + 1, hdr, frm); break; case 0x0b: security(level + 1, hdr, frm); break; case 0x0d: delay_report(level + 1, hdr, frm); break; } break; case 2: p_indent(level, frm); hdr = get_u8(frm); type = get_u8(frm); seqn = get_u16(frm); time = get_u32(frm); ssrc = get_u32(frm); printf("AVDTP(m): ver %d %s%scc %d %spt %d seqn %d time %d ssrc %d\n", hdr >> 6, hdr & 0x20 ? "pad " : "", hdr & 0x10 ? "ext " : "", hdr & 0xf, type & 0x80 ? "mark " : "", type & 0x7f, seqn, time, ssrc); break; } raw_dump(level, frm); }