Example #1
0
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;
	}
}
Example #2
0
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);
	}
}