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); }
void rfcomm_dump(int level, struct frame *frm) { uint8_t hdr_size, ctr_type; short_frame_head *short_head_p = (void *) frm->ptr; long_frame_head head; if (short_head_p->length.ea == EA) { head.addr = short_head_p->addr; head.control = short_head_p->control; head.length.bits.len = short_head_p->length.len; hdr_size = sizeof(short_frame_head); } else { head = *(long_frame_head *) frm->ptr; head.length.val = btohs(head.length.val); hdr_size = sizeof(long_frame_head); } frm->ptr += hdr_size; frm->len -= hdr_size; ctr_type = CLR_PF(head.control); if (ctr_type == UIH) { uih_frame(level, frm, &head); } else { p_indent(level, frm); printf("RFCOMM(s): "); switch (ctr_type) { case SABM: printf("SABM: "); break; case UA: printf("UA: "); break; case DM: printf("DM: "); break; case DISC: printf("DISC: "); del_frame(frm->handle, GET_DLCI(head.addr)); break; default: printf("ERR: "); } print_rfcomm_hdr(&head, frm->ptr, frm->len); printf("\n"); } }
static int ts27010_uart_control_send_loop(struct ts0710_con *ts0710, u8 *data, int len) { struct short_frame *pkt = (struct short_frame *)(data + ADDRESS_OFFSET); switch (CLR_PF(data[CONTROL_OFFSET])) { case SABM: case DISC: {/* send UA */ #ifdef TS27010_UART_RETRAN u8 frame[TS0710_FRAME_SIZE(0)] = { 0xf9, 0x03, 0x73, 0x00, 0x01, 0x35, 0xf9, }; ts27010_sequence_number_lock(s_ap_received_sn); frame[3] = ts27010_sequence_number_get( s_ap_received_sn); /* SN */ ts27010_sequence_number_unlock(s_ap_received_sn); frame[5] = ts0710_uart_crc_data( frame + ADDRESS_OFFSET, 4); /* FCS */ #else u8 frame[TS0710_FRAME_SIZE(0)] = { 0xf9, 0x03, 0x73, 0x01, 0x35, 0xf9, }; frame[1] = data[ADDRESS_OFFSET]; /* DLCI */ #endif /* simulate a UART IPC rx interrupt */ ts27010_ldisc_uart_receive(ts27010mux_uart_tty, frame, NULL, TS0710_FRAME_SIZE(0)); } break; case UIH: {/* echo PN */ u8 type; type = pkt->data[0]; switch (type >> 2) { case PN: pkt->h.addr.cr = 0; ((struct mcc_short_frame *)pkt->data)->h.type.cr = 0; #ifdef TS27010_UART_RETRAN ts27010_sequence_number_lock(s_ap_received_sn); pkt->h.sn = ts27010_sequence_number_get( s_ap_received_sn);/* SN */ ts27010_sequence_number_unlock( s_ap_received_sn); data[len - 2] = ts0710_uart_crc_data( data + ADDRESS_OFFSET, len - FCS_SIZE - FLAG_SIZE);/* FCS */ #endif BUG_ON(TS0710_MCC_FRAME_SIZE( sizeof(struct pn_msg_data)) != len); ts27010_ldisc_uart_receive( ts27010mux_uart_tty, data, NULL, len); break; default: break; } } break; default: break; } return len; }