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; }
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)); } }
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; }