[dhcp-agent-commits] dhcp-agent/src dhcp-rawnet.c,1.14,1.15
Status: Alpha
Brought to you by:
actmodern
From: <act...@us...> - 2003-08-05 04:53:22
|
Update of /cvsroot/dhcp-agent/dhcp-agent/src In directory sc8-pr-cvs1:/tmp/cvs-serv25527/src Modified Files: dhcp-rawnet.c Log Message: added routine to do raw processing on udp socket Index: dhcp-rawnet.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-rawnet.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** dhcp-rawnet.c 25 Jul 2003 02:36:21 -0000 1.14 --- dhcp-rawnet.c 5 Aug 2003 04:53:19 -0000 1.15 *************** *** 473,476 **** --- 473,530 ---- } + /* read a packet from a udp socket, and run it through our stack appropriately. */ + int rawnet_get_packet_udp_socket(int sockd, rawnet_t *rawnet) + { + int retval; + ip_addr_t ip_addr; + + retval = udp_sock_recv(sockd, rawnet->packet_data, rawnet->mtu, &ip_addr); + + if(retval == -1 || retval == 0) { + /* error receiving packet. */ + return RAWNET_ERROR; + } + + /* update our raw network objects as best we can. if someone + * is calling us then they cannot expect to get the hardware + * address, and everything starts from the IP layer. */ + + /* just update protocol and address information for the IP layer. */ + ip_set_proto(rawnet->ip_p, IPPROTO_UDP); + ip_set_src_addr(rawnet->ip_p, ip_addr); + ip_set_dst_addr(rawnet->ip_p, rawnet_get_ip_addr(rawnet)); + + /* update information for the dhcp packet. */ + dhcp_purge(rawnet->dhcp_p); + + /* read image. */ + if(dhcp_read_packet_image(rawnet->dhcp_p, rawnet->packet_data, retval)) { + return RAWNET_MALFORMED_PACKET; + } + + /* that's it. we're done. */ + return RAWNET_OK; + } + + int rawnet_send_packet_udp_socket_unicast(int sockd, rawnet_t *rawnet, ip_addr_t ip_addr) + { + if(udp_sock_send(sockd, (rawnet->packet_data + IP_HDR_LEN + UDP_HDR_LEN), + (udp_get_len(rawnet->udp_p) - UDP_HDR_LEN), + ip_addr, udp_get_dst_port(rawnet->udp_p))) + return RAWNET_ERROR; + + return RAWNET_OK; + } + + int rawnet_send_packet_udp_socket_broadcast(int sockd, rawnet_t *rawnet) + { + if(udp_sock_send(sockd, (rawnet->packet_data + IP_HDR_LEN + UDP_HDR_LEN), + (udp_get_len(rawnet->udp_p) - UDP_HDR_LEN), + ip_addr_broadcast, udp_get_dst_port(rawnet->udp_p))) + return RAWNET_ERROR; + + return RAWNET_OK; + } + /* * rawnet get packet: |