static void stamp_error(uint32_t cid, uint8_t err) { uint8_t errbuf[HID_PACKET_SIZE]; struct u2f_hid_msg * res = (struct u2f_hid_msg *)errbuf; res->cid = cid; res->pkt.init.cmd = U2FHID_ERROR; res->pkt.init.payload[0] = err; res->pkt.init.bcnth = 0; res->pkt.init.bcntl = 1; usb_write(errbuf, HID_PACKET_SIZE); del_cid(cid); }
static inline void disconn_rsp(int level, struct frame *frm) { l2cap_disconn_rsp *h = frm->ptr; uint16_t dcid = btohs(h->dcid); uint16_t scid = btohs(h->scid); del_cid(frm->in, dcid, scid); if (p_filter(FILT_L2CAP)) return; printf("Disconn rsp: dcid 0x%4.4x scid 0x%4.4x\n", btohs(h->dcid), btohs(h->scid)); }
void u2f_hid_check_timeouts() { uint8_t i; for(i = 0; i < CID_MAX; i++) { if (CIDS[i].busy && ((get_ms() - CIDS[i].last_used) >= 750)) { u2f_printlx("timeout cid ",2,CIDS[i].cid,get_ms()); stamp_error(CIDS[i].cid, ERR_MSG_TIMEOUT); del_cid(CIDS[i].cid); u2f_hid_reset_packet(); } } }
static inline void conn_rsp(int level, struct frame *frm) { l2cap_conn_rsp *h = frm->ptr; uint16_t scid = btohs(h->scid); uint16_t dcid = btohs(h->dcid); uint16_t result = btohs(h->result); uint16_t status = btohs(h->status); uint16_t psm; switch (h->result) { case L2CAP_CR_SUCCESS: if ((psm = get_psm(!frm->in, frm->handle, scid))) add_cid(frm->in, frm->handle, dcid, psm); break; case L2CAP_CR_PEND: break; default: del_cid(frm->in, dcid, scid); break; } if (p_filter(FILT_L2CAP)) return; printf("Connect rsp: dcid 0x%4.4x scid 0x%4.4x result %d status %d\n", dcid, scid, result, status); p_indent(level + 1, frm); printf("%s", connresult2str(result)); if (result == 0x0001) printf(" - %s\n", status2str(status)); else printf("\n"); }