Ejemplo n.º 1
0
void loopback_udp(uint8 ch, uint16 port)
{
    int ret;
    uint32 destip = 0;
    uint16 destport;

    ret = UDPRecv(ch, data_buf, TX_RX_MAX_BUF_SIZE, (uint8*)&destip, &destport);

    if(ret > 0) {				// Received
        ret = UDPSend(ch, data_buf, ret, (uint8*)&destip ,destport);

        if(ret == ERROR_TIME_OUT) {
            ERR("Timeout");
            UDPClose(ch);
            DBG("UDP Socket Close");
        }

    } else if(ret == ERROR_NOT_UDP_SOCKET) {	// Not UDP Socket, It's TCP Socket
        DBG("TCP Socket Close");
        TCPClose(ch);
    } else if(ret == ERROR_CLOSED) {		// Socket Closed
        LOGA("UDP Loop-Back Started - ch(%d)",(uint16)ch);
        UDPOpen(ch, port);
    }
}
Ejemplo n.º 2
0
int NET::RecvBlock(void * dest, int destsize, int timeout)
{
	int r = UDPRecv(pin, 0, timeout);
	
	Uint8 * destdata = (Uint8 *) dest;
	
	if (r == UDP_SUCCESS)
	{
		int i;
		int mins = pin->len;
		if (destsize < mins)
		{
			mins = destsize;
			if (NET_DEBUG)
				cout << "net:  RecvBlock:  overflow (" << pin->len << ">" << destsize << endl;
		}
		for (i = 0; i < mins; i++)
		{
			destdata[i] = pin->data[i];
		}
		return mins;
	}
	else
		return r;
}
Ejemplo n.º 3
0
bool NET::ClientHandshake()
{
	string handshake = HANDSHAKESTR;
	string handshake_reply = HANDSHAKEREPLYSTR;
	int timeout = HANDSHAKETIMEOUT;
	
	bool err = false;
	
	WriteToPacket(pout, CONTROL_HANDSHAKE, (void *) handshake.c_str(), handshake.length());
	UDPSend(pout, 0);
	int ret = UDPRecv(pin, 0, timeout);
	if (ret == UDP_SUCCESS)
	{
		if (IsEqualToPacket(pin, CONTROL_HANDSHAKE, (void *) handshake_reply.c_str(), handshake_reply.length()))
		{
			connected = true;
			if (NET_DEBUG)
				cout << "net:  Connection complete." << endl;
		}
		else 
		{
			if (NET_DEBUG)
				cout << "net:  Invalid handshake reply." << endl;
			err = true;
		}
	}
	if (ret == UDP_TIMEOUT)
	{
		err = true;
		if (NET_DEBUG)
				cout << "net:  Handshake timeout, couldn't connect" << endl;
	}
	if (ret == UDP_FAILURE)
	{
		err = true;
		if (NET_DEBUG)
				cout << "net:  Handshake error." << endl;
	}
	
	return err;
}
Ejemplo n.º 4
0
/**
 * SNMP Process Handler.
 * UDP Socket and SNMP transaction handling. 
 *
 * @param none
 * @return none
 */
void SnmpXDaemon_process(void)
{
    int32 len = 0;
    
	uint8 svr_addr[6];
	uint16  svr_port;
    
	//UDPOpen(SOCK_SNMP, 161);
    
    //if ( (len = getSn_RX_RSR(SOCK_SNMP)) > 0)
    if((len = GetSocketRxRecvBufferSize(SOCK_SNMP)) > 0)
    {
        request_msg.len= UDPRecv(SOCK_SNMP, (int8 *)&request_msg.buffer[0], len, svr_addr, &svr_port);
    }
    else
    {
        request_msg.len = 0;
        //continue;
    }

    if (request_msg.len > 0)
    {
        dumpCode("\r\n[Request]\r\n", "\r\n", request_msg.buffer, request_msg.len);

        request_msg.index = 0;
        response_msg.index = 0;
        errorStatus = errorIndex = 0;

        if (parseSNMPMessage() != -1)
        {

            UDPSend(SOCK_SNMP, (int8 *)response_msg.buffer, response_msg.index, svr_addr, svr_port);
        
        }
        
        dumpCode("\r\n[Response]\r\n", "\r\n", response_msg.buffer, response_msg.index);      
    }
    
	//UDPClose(SOCK_SNMP);	
}
Ejemplo n.º 5
0
void act_nrecv(int8 sock, uint16 maxlen)
{
	uint8 dstip[4], i;
	uint16 dstport;
	int32 len;
 DBGA("Asock(%d)", sock);
	if(sock == VAL_NONE) {
		if(recvnum == 0) CMD_RESP_RET(RET_NO_DATA, VAL_NONE);
		for(i=ATC_SOCK_NUM_START; i<=ATC_SOCK_NUM_END; i++) {
			if(recvord[i] == recvnum) {
				sock = i;
				break;
			}
		}
	}DBGA("Bsock(%d)", sock);

	if(sockstat[sock] == SOCK_STAT_IDLE) CMD_RESP_RET(RET_SOCK_CLS, VAL_NONE);
	if(sockstat[sock] & SOCK_STAT_TCP_MASK) {	// TCP
		if(!(sockstat[sock] & SOCK_STAT_CONNECTED)) CMD_RESP_RET(RET_NOT_CONN, VAL_NONE);
		if(GetSocketRxRecvBufferSize(sock) == 0) CMD_RESP_RET(RET_NO_DATA, VAL_NONE);
		len = TCPRecv(sock, atci.recvbuf, maxlen);
	} else {									// UDP
		if(GetSocketRxRecvBufferSize(sock) == 0) CMD_RESP_RET(RET_NO_DATA, VAL_NONE);
		len = UDPRecv(sock, atci.recvbuf, maxlen, dstip, &dstport);
		if(len == 0) CMD_RESP_RET(RET_NO_DATA, VAL_NONE);
		else if(len == SOCKERR_CLOSED) CMD_RESP_RET(RET_SOCK_CLS, VAL_NONE);
		else if(len < 0) CMD_RESP_RET(RET_UNSPECIFIED, VAL_NONE);
	}
	atci.recvbuf[len] = 0;

	MAKE_TCMD_DIGIT(atci.tcmd.arg1, len);
	MAKE_TCMD_ADDR(atci.tcmd.arg2, dstip[0], dstip[1], dstip[2], dstip[3]);
	MAKE_TCMD_DIGIT(atci.tcmd.arg3, dstport);
	cmd_resp(RET_RECV, sock);
	printf("%s\r\n", atci.recvbuf);

	sockwatch_set(sock, WATCH_SOCK_RECV);
}
Ejemplo n.º 6
0
static int8 recv_handler(void)
{
	uint8 *cur, *end;
	uint8 recv_ip[4], opt_len, msg_type;
	int32 recv_len;
	uint16 recv_port;

	recv_len = GetSocketRxRecvBufferSize(di.sock);
	if(recv_len == 0) return RET_NOK;
	else memset(&dm, 0, sizeof(struct dhcp_msg));

	recv_len = UDPRecv(di.sock, (int8*)&dm, sizeof(struct dhcp_msg), recv_ip, &recv_port);
	if(recv_len < 0) {
		ERRA("UDPRecv fail - ret(%d)", recv_len);
		return RET_NOK;
	}

	//DBGFUNC(print_dump(&dm, sizeof(dm)));	// For debugging received packet
	DBGA("DHCP_SIP:%d.%d.%d.%d",di.srv_ip[0],di.srv_ip[1],di.srv_ip[2],di.srv_ip[3]);
	DBGA("DHCP_RIP:%d.%d.%d.%d",di.srv_ip_real[0],di.srv_ip_real[1],di.srv_ip_real[2],di.srv_ip_real[3]);
	DBGA("recv_ip:%d.%d.%d.%d",recv_ip[0],recv_ip[1],recv_ip[2],recv_ip[3]);
	
	if(dm.op != DHCP_BOOTREPLY || recv_port != DHCP_SERVER_PORT) {
		if(dm.op != DHCP_BOOTREPLY) DBG("DHCP : NO DHCP MSG");
		if(recv_port != DHCP_SERVER_PORT)  DBG("DHCP : WRONG PORT");
		return RET_NOK;
	}

	if(memcmp(dm.chaddr, storage.mac, 6) != 0 || dm.xid != htonl(di.xid)) {
		DBG("No My DHCP Message. This message is ignored.");
		DBGA("SRC_MAC_ADDR(%02X:%02X:%02X:%02X:%02X:%02X)", 
			storage.mac[0], storage.mac[1], storage.mac[2], 
			storage.mac[3], storage.mac[4], storage.mac[5]);
		DBGA("chaddr(%02X:%02X:%02X:%02X:%02X:%02X)", dm.chaddr[0], 
			dm.chaddr[1], dm.chaddr[2], dm.chaddr[3], dm.chaddr[4], dm.chaddr[5]);
		DBGA("DHCP_XID(%08lX), xid(%08lX), yiaddr(%d.%d.%d.%d)", htonl(di.xid), 
			dm.xid, dm.yiaddr[0], dm.yiaddr[1], dm.yiaddr[2], dm.yiaddr[3]);
		return RET_NOK;
	}

	if( *((uint32*)di.srv_ip) != 0x00000000 ) {
		if( *((uint32*)di.srv_ip_real) != *((uint32*)recv_ip) && 
										*((uint32*)di.srv_ip) != *((uint32*)recv_ip) ) 	{
			DBG("Another DHCP sever send a response message. This is ignored.");
			DBGA("IP:%d.%d.%d.%d",recv_ip[0],recv_ip[1],recv_ip[2],recv_ip[3]);
			return RET_NOK;
		}
	}
	
	memcpy(workinfo.ip, dm.yiaddr, 4);
	DBG("DHCP MSG received..");
	DBGA("yiaddr : %d.%d.%d.%d",workinfo.ip[0],workinfo.ip[1],workinfo.ip[2],workinfo.ip[3]);

	msg_type = 0;
	cur = (uint8 *)(&dm.op);
	cur = cur + 240;
	end = cur + (recv_len - 240);	//printf("cur : 0x%08X  end : 0x%08X  recv_len : %d\r\n", cur, end, recv_len);
	while ( cur < end ) 
	{
		switch ( *cur++ ) 
		{
		case padOption:
			break;
		case endOption:
			return msg_type;
		case dhcpMessageType:
			opt_len = *cur++;
			msg_type = *cur;
			DBGA("dhcpMessageType : %x", msg_type);
			break;
		case subnetMask:
			opt_len =* cur++;
			memcpy(workinfo.sn,cur,4);
			DBGA("subnetMask : %d.%d.%d.%d",
				workinfo.sn[0],workinfo.sn[1],workinfo.sn[2],workinfo.sn[3]);
			break;
		case routersOnSubnet:
			opt_len = *cur++;
			memcpy(workinfo.gw,cur,4);
			DBGA("routersOnSubnet : %d.%d.%d.%d",
				workinfo.gw[0],workinfo.gw[1],workinfo.gw[2],workinfo.gw[3]);
			break;
		case dns:
			opt_len = *cur++;
			memcpy(workinfo.dns,cur,4);
			break;
		case dhcpIPaddrLeaseTime:
			opt_len = *cur++;
			di.lease_time = ntohl(*((uint32*)cur));
			di.renew_time = di.lease_time / 2;			// 0.5
			di.rebind_time = di.lease_time / 8 * 7;		// 0.875
			DBGA("lease(%d), renew(%d), rebind(%d)", di.lease_time, di.renew_time, di.rebind_time);
			break;
		case dhcpServerIdentifier:
			opt_len = *cur++;
			DBGA("DHCP_SIP : %d.%d.%d.%d", di.srv_ip[0], di.srv_ip[1], di.srv_ip[2], di.srv_ip[3]);
			if( *((uint32*)di.srv_ip) == 0 || *((uint32*)di.srv_ip_real) == *((uint32*)recv_ip) || 
													*((uint32*)di.srv_ip) == *((uint32*)recv_ip) ) {
				memcpy(di.srv_ip,cur,4);
				memcpy(di.srv_ip_real,recv_ip,4);	// Copy the real ip address of my DHCP server
				DBGA("My dhcpServerIdentifier : %d.%d.%d.%d", 
					di.srv_ip[0], di.srv_ip[1], di.srv_ip[2], di.srv_ip[3]);
				DBGA("My DHCP server real IP address : %d.%d.%d.%d", 
					di.srv_ip_real[0], di.srv_ip_real[1], di.srv_ip_real[2], di.srv_ip_real[3]);
			} else {
				DBGA("Another dhcpServerIdentifier : MY(%d.%d.%d.%d)", 
					di.srv_ip[0], di.srv_ip[1], di.srv_ip[2], di.srv_ip[3]);
				DBGA("Another(%d.%d.%d.%d)", recv_ip[0], recv_ip[1], recv_ip[2], recv_ip[3]);
			}
			break;
		default:
			opt_len = *cur++;
			DBGA("opt_len : %d", opt_len);
			break;
		} // switch
		cur+=opt_len;
	} // while

	return RET_NOK;
}