static bool avrcp_get_capabilities(struct avctp_frame *avctp_frame, uint8_t ctype, uint8_t len, uint8_t indent) { struct l2cap_frame *frame = &avctp_frame->l2cap_frame; uint8_t cap, count; int i; if (!l2cap_frame_get_u8(frame, &cap)) return false; print_field("%*cCapabilityID: 0x%02x (%s)", (indent - 8), ' ', cap, cap2str(cap)); if (len == 1) return true; if (!l2cap_frame_get_u8(frame, &count)) return false; print_field("%*cCapabilityCount: 0x%02x", (indent - 8), ' ', count); switch (cap) { case 0x2: for (; count > 0; count--) { uint8_t company[3]; if (!l2cap_frame_get_u8(frame, &company[0]) || !l2cap_frame_get_u8(frame, &company[1]) || !l2cap_frame_get_u8(frame, &company[2])) return false; print_field("%*c%s: 0x%02x%02x%02x", (indent - 8), ' ', cap2str(cap), company[0], company[1], company[2]); } break; case 0x3: for (i = 0; count > 0; count--, i++) { uint8_t event; if (!l2cap_frame_get_u8(frame, &event)) return false; print_field("%*c%s: 0x%02x (%s)", (indent - 8), ' ', cap2str(cap), event, event2str(event)); } break; default: packet_hexdump(frame->data, frame->size); } return true; }
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 print_caps(int caps) { int i, need_coma; need_coma = 0; printf("<"); for (i = 0; i < 32; i++) { if (caps & (1 << i)) { if (need_coma) printf(","); printf("%s", cap2str(1 << i)); need_coma = 1; } } printf(">"); }