[Dhcp-agent-commits] CVS: dhcp-agent dhcp-agent.h,1.11,1.12 dhcp-client-control.c,1.5,1.6 dhcp-clien
Status: Alpha
Brought to you by:
actmodern
From: Thamer Al-H. <act...@us...> - 2002-02-01 19:56:14
|
Update of /cvsroot/dhcp-agent/dhcp-agent In directory usw-pr-cvs1:/tmp/cvs-serv31489 Modified Files: dhcp-agent.h dhcp-client-control.c dhcp-client-states.c dhcp-interface.c dhcp-net.c Log Message: arp-reply send implemented in client_setup() it doesn't work though :-); Index: dhcp-agent.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-agent.h,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** dhcp-agent.h 2002/02/01 18:31:17 1.11 --- dhcp-agent.h 2002/02/01 19:56:10 1.12 *************** *** 457,461 **** extern void rawnet_destroy(rawnet_t *net); extern int rawnet_get_packet(rawnet_t *net); ! extern unsigned char *rawnet_get_interface_addr(rawnet_t *net); extern char *rawnet_strerror(rawnet_t *net); extern int rawnet_send_packet(rawnet_t *net); --- 457,461 ---- extern void rawnet_destroy(rawnet_t *net); extern int rawnet_get_packet(rawnet_t *net); ! extern int rawnet_get_interface_hw_addr(rawnet_t *net, eth_addr_t *addr); extern char *rawnet_strerror(rawnet_t *net); extern int rawnet_send_packet(rawnet_t *net); *************** *** 654,657 **** --- 654,659 ---- extern arp_obj *arp_create(void); extern void arp_destroy(arp_obj *arp); + extern void arp_write_packet_image(arp_obj *arp, unsigned char *packet); + extern void arp_set_hardware_type(arp_obj *arp, uint16_t hdr_addr); extern void arp_set_protocol_type(arp_obj *arp, uint16_t pro); *************** *** 754,757 **** --- 756,760 ---- extern int interface_down(interface_control_t *ic, char *name); extern void destroy_interface_control(interface_control_t *ic); + extern int interface_get_ip_addr(interface_control_t *ic, char *name, uint32_t *addr); /* client states */ Index: dhcp-client-control.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-client-control.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dhcp-client-control.c 2002/01/31 14:43:22 1.5 --- dhcp-client-control.c 2002/02/01 19:56:10 1.6 *************** *** 54,58 **** } ! static unsigned char *create_client_id(unsigned char *interface_address) { unsigned char *s; --- 54,58 ---- } ! static unsigned char *create_client_id(eth_addr_t interface_address) { unsigned char *s; *************** *** 61,65 **** *s = DLT_EN10MB; s++; ! memcpy(s, interface_address, ETH_ADDR_LEN); s--; --- 61,65 ---- *s = DLT_EN10MB; s++; ! memcpy(s, interface_address.data, ETH_ADDR_LEN); s--; *************** *** 72,76 **** int dport, sport; char filter_buff[GENERIC_BUFFSIZE]; ! unsigned char *interface_addr; #ifdef HAVE_UNAME --- 72,76 ---- int dport, sport; char filter_buff[GENERIC_BUFFSIZE]; ! eth_addr_t interface_addr; #ifdef HAVE_UNAME *************** *** 148,154 **** #endif /* HAVE_UNAME */ ! interface_addr = rawnet_get_interface_addr(dc->rawnet); dc->client_id = create_client_id(interface_addr); - xfree(interface_addr); return dc; --- 148,158 ---- #endif /* HAVE_UNAME */ ! if(rawnet_get_interface_hw_addr(dc->rawnet, &interface_addr)) { ! error_message("could not acquire interface address"); ! destroy_dhcp_client_control(dc); ! return NULL; ! } ! dc->client_id = create_client_id(interface_addr); return dc; Index: dhcp-client-states.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-client-states.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dhcp-client-states.c 2002/02/01 18:31:17 1.7 --- dhcp-client-states.c 2002/02/01 19:56:10 1.8 *************** *** 97,101 **** static void client_broadcast_arp_reply(dhcp_client_control_t *dc) { ! return; } --- 97,119 ---- static void client_broadcast_arp_reply(dhcp_client_control_t *dc) { ! uint32_t ip_addr; ! eth_addr_t hw_addr; ! ! /* Get our IP address from rawnet. ! * We don't get it from the cache. ! * This is quicker, and since it should be ! * setup it's more correct. ! */ ! ! if(rawnet_get_interface_hw_addr(dc->rawnet, &hw_addr) || ! interface_get_ip_addr(dc->interface_control, dc->interface, &ip_addr)) { ! error_message("warning: could get get hardware and ip addresses to generate arp reply. this is bad, but i'll keep going."); ! return; ! } ! ! rawnet_build_arp_reply_broadcast(dc->rawnet, ip_addr, hw_addr); ! if(rawnet_send_packet(dc->rawnet)) ! error_message("warning: could not send arp reply: %s", strerror(errno)); ! return; } *************** *** 280,283 **** --- 298,303 ---- cache_entry_purge_list(options); + client_broadcast_arp_reply(dc); + return STATE_WAIT; } Index: dhcp-interface.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-interface.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dhcp-interface.c 2002/02/01 18:31:17 1.5 --- dhcp-interface.c 2002/02/01 19:56:10 1.6 *************** *** 130,131 **** --- 130,141 ---- return 0; } + + int interface_get_ip_addr(interface_control_t *ic, char *name, uint32_t *addr) + { + if(interface_get_info(ic, name)) + return -1; + + memcpy(addr, &info.intf_addr.addr_ip, IP_ADDR_LEN); + + return 0; + } Index: dhcp-net.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-net.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** dhcp-net.c 2002/02/01 18:31:17 1.6 --- dhcp-net.c 2002/02/01 19:56:10 1.7 *************** *** 110,126 **** } ! unsigned char *rawnet_get_interface_addr(rawnet_t *net) { ! char *addr; ! eth_addr_t eth_addr; ! ! addr = malloc(ETH_HDR_LEN); ! eth_get(net->eth, ð_addr); ! memcpy(addr, ð_addr.data, ETH_HDR_LEN); ! ! return addr; } - /* * Initialization of packet capturing device. --- 110,118 ---- } ! int rawnet_get_interface_hw_addr(rawnet_t *net, eth_addr_t *addr) { ! return(eth_get(net->eth, addr)); } /* * Initialization of packet capturing device. *************** *** 230,239 **** } ! void rawnet_use_fake_hw_addr(rawnet_t *raw, char *mac_string) { unsigned char *mac_addr; ! if(raw->client_hw_addr != NULL) ! xfree(raw->client_hw_addr); mac_addr = xmalloc(ETH_ADDR_LEN); --- 222,231 ---- } ! void rawnet_use_fake_hw_addr(rawnet_t *net, char *mac_string) { unsigned char *mac_addr; ! if(net->client_hw_addr != NULL) ! xfree(net->client_hw_addr); mac_addr = xmalloc(ETH_ADDR_LEN); *************** *** 241,245 **** fatal_error("malformed mac_string for fake client hw addr. please check mac address."); ! raw->client_hw_addr = mac_addr; return; --- 233,237 ---- fatal_error("malformed mac_string for fake client hw addr. please check mac address."); ! net->client_hw_addr = mac_addr; return; *************** *** 414,423 **** * we need. */ ! static void build_arp_proc(rawnet_t *net, ! uint16_t opcode, ! eth_addr_t sender_hw_addr, ! uint32_t sender_ip_addr, ! eth_addr_t target_hw_addr, ! uint32_t target_ip_addr) { --- 406,415 ---- * we need. */ ! static void build_arp(rawnet_t *net, ! uint16_t opcode, ! eth_addr_t sender_hw_addr, ! uint32_t sender_ip_addr, ! eth_addr_t target_hw_addr, ! uint32_t target_ip_addr) { *************** *** 516,523 **** } ! static void rawnet_write_packet(rawnet_t *net, uint16_t ip_len) { char *packet_ptr; ! /* Dump packet images. */ --- 508,515 ---- } ! static void rawnet_write_packet_dhcp(rawnet_t *net) { char *packet_ptr; ! /* Dump packet images. */ *************** *** 538,544 **** /* Run the IP checksum routine. */ ! ip_checksum((net->packet_data + ETH_HDR_LEN), ip_len); } static void rawnet_build_dhcp_proc(rawnet_t *net, uint32_t xid, time_t secs, uint32_t ciaddr, uint32_t yiaddr, uint32_t siaddr, --- 530,577 ---- /* Run the IP checksum routine. */ ! ip_checksum((net->packet_data + ETH_HDR_LEN), (net->packet_len - ETH_HDR_LEN)); ! ! return; } + static void rawnet_write_packet_arp(rawnet_t *net) + { + char *packet_ptr; + + /* Dump packet images. */ + + packet_ptr = net->packet_data; + memset(packet_ptr, 0, DEFAULT_MTU); /* fixme: fix the default mtu issue! */ + + eth_write_packet_image(net->ether_p, packet_ptr); + packet_ptr += ETH_HDR_LEN; + + arp_write_packet_image(net->arp_p, packet_ptr); + + return; + } + + static void rawnet_write_packet(rawnet_t *net) + { + + switch(net->type) { + + case RAWNET_DHCP: + rawnet_write_packet_dhcp(net); + break; + + case RAWNET_ARP: + rawnet_write_packet_arp(net); + break; + + default: + error_message("warning: invalid send type"); + break; + } + + return; + } + + static void rawnet_build_dhcp_proc(rawnet_t *net, uint32_t xid, time_t secs, uint32_t ciaddr, uint32_t yiaddr, uint32_t siaddr, *************** *** 596,604 **** net->packet_len = total_len; ! rawnet_write_packet(net, ip_len); return; } void rawnet_build_arp_reply(rawnet_t *net, --- 629,653 ---- net->packet_len = total_len; ! rawnet_write_packet(net); return; } + static void build_arp_proc(rawnet_t *net, + uint16_t opcode, + eth_addr_t sender_hw_addr, + uint32_t sender_ip_addr, + eth_addr_t target_hw_addr, + uint32_t target_ip_addr) + { + build_eth_broadcast(net, sender_hw_addr, ETH_TYPE_ARP); + build_arp(net, opcode, sender_hw_addr, sender_ip_addr, target_hw_addr, target_ip_addr); + + net->type = RAWNET_ARP; + net->packet_len = ETH_HDR_LEN + ARP_ETHIP_LEN; + + rawnet_write_packet(net); + return; + } void rawnet_build_arp_reply(rawnet_t *net, |