static inline void uih_frame(int level, struct frame *frm, long_frame_head *head) { uint32_t proto; if (!head->addr.server_chn) { mcc_frame(level, frm, head); } else { p_indent(level, frm); printf("RFCOMM(d): UIH: "); print_rfcomm_hdr(head, frm->ptr, frm->len); if (GET_PF(head->control)) { printf("credits %d\n", *(uint8_t *)(frm->ptr)); frm->ptr++; frm->len--; } else printf("\n"); frm->len--; frm->dlci = GET_DLCI(head->addr); frm->channel = head->addr.server_chn; proto = get_proto(frm->handle, RFCOMM_PSM, frm->channel); if (frm->len > 0) { switch (proto) { case SDP_UUID_OBEX: if (!p_filter(FILT_OBEX)) obex_dump(level + 1, frm); else raw_dump(level, frm); break; case SDP_UUID_LAN_ACCESS_PPP: case SDP_UUID_DIALUP_NETWORKING: if (!p_filter(FILT_PPP)) ppp_dump(level + 1, frm); else raw_dump(level, frm); break; default: if (p_filter(FILT_RFCOMM)) break; raw_dump(level, frm); break; } } } }
static bool uih_frame(struct rfcomm_frame *rfcomm_frame, uint8_t indent) { uint8_t credits; struct l2cap_frame *frame = &rfcomm_frame->l2cap_frame; struct rfcomm_lhdr *hdr = &rfcomm_frame->hdr; if (!RFCOMM_GET_CHANNEL(hdr->address)) return mcc_frame(rfcomm_frame, indent); /* fetching credits from UIH frame */ if (GET_PF(hdr->control)) { if (!l2cap_frame_get_u8(frame, &credits)) return false; hdr->credits = credits; print_field("%*cCredits: %d", indent, ' ', hdr->credits); } packet_hexdump(frame->data, frame->size); return true; }