Beispiel #1
0
ER dhcp_offer(DHCP *dhcp)
{
    ER         ercd;
    T_IPV4EP   p_dstaddr;
	T_IN4_ADDR tipaddr;
    static UB  ipaddr[sizeof("000.000.000.000") + 1];

    p_dstaddr.ipaddr = BROADCAST_ADDR;
    p_dstaddr.portno = BROADCAST_PORT;

    ercd = udp_rcv_dat(UDP_CLIENT_CEPID, &p_dstaddr, (VP)&udp_rbuf, sizeof(DHCP_PACKET), TIMEOUT);
                                                                 /* タイムアウトは2秒を指定 */
    syslog(LOG_NOTICE, "[dhcp_offer] ercd = %d", ercd);
    if(ercd > 0){
        if((dhcp_packet->transaction_id == htonl(TRANSACTION_ID)) &&
          (dhcp_packet->options.message_type1[0] == 0x35) &&     /* DHCP Message */
          (dhcp_packet->options.message_type1[1] == 0x01) &&     /* Option Data Length */
          (dhcp_packet->options.message_type2 == DHCP_OFFER)) {  /* DHCP Offer */
            memcpy((VP)dhcp->ipaddr, (const VP)dhcp_packet->user_ip, 4);
			tipaddr = htonl(*((UW *)dhcp->ipaddr));				/* for endian */
            ip2str(ipaddr, (const T_IN4_ADDR *)&tipaddr);
            syslog(LOG_NOTICE, "[dhcp_offer] ip_addr = %s", ipaddr);
        }
    }

    return ercd;
}
Beispiel #2
0
void
usrv_task(intptr_t exinf)
{
	static uint8_t buffer[BUF_SIZE];

	T_IPV4EP	dst;
	T_IN4_ADDR	addr;
	ER_UINT		len;
	ID		tskid;

	get_tid(&tskid);
	addr = IPV4_ADDR_LOCAL;
	syslog(LOG_NOTICE, "[UDP ECHO SRV:%d,%d] started, IP Address: %s.", 
	                   tskid, (ID)exinf, ip2str(NULL, &addr));
	while (true) {
		if ((len = udp_rcv_dat((ID)exinf, &dst, buffer, sizeof(buffer), 20 * 1000)) >= 0) {
			buffer[len] = '\0';
			syslog(LOG_NOTICE, "[UDP ECHO SRV] recv, addr: %s:%d, len: %d, msg: '%s'",
			                   ip2str(NULL, &dst.ipaddr), dst.portno, len, buffer);
			if ((int)len > 0) {
				if ((len = udp_snd_dat((ID)exinf, &dst, buffer, len, TMO_FEVR)) < 0)
					syslog(LOG_NOTICE, "[UDP ECHO SRV] send, error: %s", itron_strerror(len));
				}
			}
		else
			syslog(LOG_NOTICE, "[UDP ECHO SRV] recv, error: %s", itron_strerror(len));
		}
	}
Beispiel #3
0
ER dhcp_ack(DHCP *dhcp)
{
    UB       *option;
    ER       ercd;
    T_IPV4EP p_dstaddr;

    p_dstaddr.ipaddr = BROADCAST_ADDR;
    p_dstaddr.portno = BROADCAST_PORT;

    ercd = udp_rcv_dat(UDP_CLIENT_CEPID, &p_dstaddr, (VP)&udp_rbuf, sizeof(DHCP_PACKET), TIMEOUT);
                                                            /* タイムアウトは2秒を指定 */
    syslog(LOG_NOTICE, "[dhcp_ack] ercd = %d", ercd);
    if(ercd > 0){
        if((dhcp_packet->transaction_id != htonl(TRANSACTION_ID)) ||
           (dhcp_packet->options.message_type1[0] != 0x35) ||
           (dhcp_packet->options.message_type1[1] != 0x01) ||
           (dhcp_packet->options.message_type2 != DHCP_PACK)) return E_SYS;
      
    }

    option = (UB *)&dhcp_packet->options.message_type1;
    while(*option != 0xff){ /* End */
        switch(*option){
            case 0:         /* Pad */
                while(*option == 0) option++;
            case 1:         /* Subnet Mask */
                memcpy(dhcp->maskaddr, option + 2, 4);
                break;
            case 3:         /* Router */
                memcpy(dhcp->gwaddr, option + 2, 4);
                break;
            case 6:         /* Domain Server */
                memcpy(dhcp->dnsaddr, option + 2, 4);
                break;
            case 15:        /* Domain Name */
                memcpy(dhcp->domain, option + 2, *(option+1));
                dhcp->domain[*(option+1)] = '\0';
                break;
            case 54:        /* DHCP Server Id */
                memcpy(dhcp->dhcpsrvaddr, option + 2, 4);
                break;
            default:
                break;
        }
        option += *(option+1) + 2;
    }

    return ercd;
}
int cg_socket_recv(CgSocket *sock, CgDatagramPacket *dgmPkt)
{
	int recvLen = 0;
	char recvBuf[CG_NET_SOCKET_DGRAM_RECV_BUFSIZE+1];
	char remoteAddr[CG_NET_SOCKET_MAXHOST];
	char remotePort[CG_NET_SOCKET_MAXSERV];
	char *localAddr;

#if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO))
	struct sockaddr_in from;
	W fromLen = sizeof(from);
	recvLen = so_recvfrom(sock->id, recvBuf, sizeof(recvBuf)-1, 0, (struct sockaddr *)&from, &fromLen);
#elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO)
	struct sockaddr_in from;
	int fromLen = sizeof(from);
	recvLen = ka_recvfrom(sock->id, recvBuf, sizeof(recvBuf)-1, 0, (struct sockaddr *)&from, &fromLen);
#elif defined(ITRON)
	T_IPV4EP remoteHost;
	recvLen = udp_rcv_dat(sock->id, &remoteHost, recvBuf, sizeof(recvBuf)-1, TMO_FEVR);
#else
	struct sockaddr_storage from;
	socklen_t fromLen = sizeof(from);
	recvLen = recvfrom(sock->id, recvBuf, sizeof(recvBuf)-1, 0, (struct sockaddr *)&from, &fromLen);
#endif

	cg_log_debug_l4("Entering...\n");

        if (recvLen <= 0)
                return 0;
        recvBuf[recvLen] = '\0';
        cg_socket_datagram_packet_setdata(dgmPkt, recvBuf);

        cg_socket_datagram_packet_setlocalport(dgmPkt, cg_socket_getport(sock));
        cg_socket_datagram_packet_setremoteaddress(dgmPkt, "");
        cg_socket_datagram_packet_setremoteport(dgmPkt, 0);

#if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO))
	cg_socket_datagram_packet_setlocaladdress(dgmPkt, cg_socket_getaddress(sock));
	cg_socket_datagram_packet_setremoteaddress(dgmPkt, inet_ntoa(from.sin_addr));
	cg_socket_datagram_packet_setremoteport(dgmPkt, ntohl(from.sin_port));
#elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO)
	cg_socket_datagram_packet_setlocaladdress(dgmPkt, cg_socket_getaddress(sock));
	ka_tfInetToAscii((unsigned long)from.sin_addr.s_addr, remoteAddr);
	cg_socket_datagram_packet_setremoteaddress(dgmPkt, remoteAddr);
	cg_socket_datagram_packet_setremoteport(dgmPkt, ka_ntohl(from.sin_port));
#elif defined(ITRON)
	cg_socket_datagram_packet_setlocaladdress(dgmPkt, cg_socket_getaddress(sock));
	ipaddr_to_ascii(remoteAddr, remoteHost.ipaddr);
	cg_socket_datagram_packet_setremoteaddress(dgmPkt, remoteAddr);
	cg_socket_datagram_packet_setremoteport(dgmPkt, ntohs(remoteHost.portno));
#else

	if (getnameinfo((struct sockaddr *)&from, fromLen, remoteAddr, sizeof(remoteAddr), remotePort, sizeof(remotePort), NI_NUMERICHOST | NI_NUMERICSERV) == 0) {
                cg_socket_datagram_packet_setremoteaddress(dgmPkt, remoteAddr);
                cg_socket_datagram_packet_setremoteport(dgmPkt, atol(remotePort));
        }

	cg_log_debug_s("From pointer %p\n", &from);
	localAddr = cg_net_selectaddr((struct sockaddr *)&from);
	cg_socket_datagram_packet_setlocaladdress(dgmPkt, localAddr);
	free(localAddr);

#endif

	cg_log_debug_l4("Leaving...\n");

	return recvLen;
}