int IOProxyHandler::handle_request( Stream *s ) { char line[CHIRP_LINE_MAX]; ReliSock *r = (ReliSock *) s; if(r->get_line_raw(line,CHIRP_LINE_MAX)>0) { if( got_cookie ) { handle_standard_request(r,line); } else { handle_cookie_request(r,line); } return KEEP_STREAM; } else { dprintf(D_FULLDEBUG,"IOProxyHandler: closing connection to %s\n",r->peer_ip_str()); delete this; return ~KEEP_STREAM; } }
static void handle_setup_packet(unsigned ep) { void (*fn_ptr)(unsigned a0, unsigned a1, unsigned a2, unsigned a3); unsigned type = (setup_packet.bmRequestType >> 5) & 0x3; unsigned pkt_cnt; prev_cmd = cmd; cmd = -1; switch (type) { case 0: handle_standard_request(); break; case 2: handle_vendor_request(); break; } if (in_data.size) { pkt_cnt = DIV_ROUND_UP(in_data.size, dwc2_max_packet_size(ep)); set_diep_size(ep, (pkt_cnt << 19) | in_data.size); set_diep_empmsk(1 << ep); } else { set_diep_size(ep, DOEPSIZE0_PKTCNT_BIT); } set_diep_ctl(ep, DEP_ENA_BIT | DEP_CLEAR_NAK); if (out_data.size) set_doep_ctl(ep, DEP_ENA_BIT | DEP_CLEAR_NAK); if (cmd == FW_REQ_JUMP) { fn_ptr = (void *)cmd_data.jump.addr; fn_ptr(0, 0, 0, 0); } }