static void print_rfcomm_hdr(long_frame_head* head, uint8_t *ptr, int len) { address_field addr = head->addr; uint8_t ctr = head->control; uint16_t ilen = head->length.bits.len; uint8_t ctr_type,pf,dlci,fcs; dlci = GET_DLCI(addr); pf = GET_PF(ctr); ctr_type = CLR_PF(ctr); fcs = *(ptr + len - 1); printf("cr %d dlci %d pf %d ilen %d fcs 0x%x ", addr.cr, dlci, pf, ilen, fcs); }
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 void print_rfcomm_hdr(struct rfcomm_frame *rfcomm_frame, uint8_t indent) { struct rfcomm_lhdr hdr = rfcomm_frame->hdr; /* Address field */ print_field("%*cAddress: 0x%2.2x cr %d dlci 0x%2.2x", indent, ' ', hdr.address, GET_CR(hdr.address), RFCOMM_GET_DLCI(hdr.address)); /* Control field */ print_field("%*cControl: 0x%2.2x poll/final %d", indent, ' ', hdr.control, GET_PF(hdr.control)); /* Length and FCS */ print_field("%*cLength: %d", indent, ' ', hdr.length); print_field("%*cFCS: 0x%2.2x", indent, ' ', hdr.fcs); }
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; }