[Dhcp-agent-commits] CVS: dhcp-agent CAVEATS,1.1.1.1,1.2 Makefile.am,1.5,1.6 Makefile.in,1.5,1.6 dhc
Status: Alpha
Brought to you by:
actmodern
From: Thamer Al-H. <act...@us...> - 2002-02-01 18:31:21
|
Update of /cvsroot/dhcp-agent/dhcp-agent In directory usw-pr-cvs1:/tmp/cvs-serv7929 Modified Files: CAVEATS Makefile.am Makefile.in dhcp-agent.h dhcp-arp.c dhcp-client-states.c dhcp-eth.c dhcp-interface.c dhcp-net.c dhcp-sysconf.c Log Message: added arp construction; cleaned up dhcp-interface.c; Index: CAVEATS =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/CAVEATS,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** CAVEATS 2002/01/29 18:04:59 1.1.1.1 --- CAVEATS 2002/02/01 18:31:17 1.2 *************** *** 5,6 **** --- 5,9 ---- needs to be fixed. It currently does not overload bootp fields to make up for this. + + -- dhcpclient spoofing mac address may not work on all systems or + NICs. test to be sure. Index: Makefile.am =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/Makefile.am,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Makefile.am 2002/01/31 23:15:44 1.5 --- Makefile.am 2002/02/01 18:31:17 1.6 *************** *** 1,3 **** ! CFLAGS = -s -Wall -O2 AUTOMAKE_OPTIONS = gnu --- 1,3 ---- ! CFLAGS = -Wall -g AUTOMAKE_OPTIONS = gnu Index: Makefile.in =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/Makefile.in,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Makefile.in 2002/01/31 23:15:44 1.5 --- Makefile.in 2002/02/01 18:31:17 1.6 *************** *** 69,73 **** VERSION = @VERSION@ ! CFLAGS = -s -Wall -O2 AUTOMAKE_OPTIONS = foreign --- 69,73 ---- VERSION = @VERSION@ ! CFLAGS = -Wall -g AUTOMAKE_OPTIONS = foreign Index: dhcp-agent.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-agent.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** dhcp-agent.h 2002/01/31 23:15:44 1.10 --- dhcp-agent.h 2002/02/01 18:31:17 1.11 *************** *** 449,453 **** * * * * * * * * * * * */ ! /* Net/Socket routines. */ extern int port_for_service(const char *serv, const char *proto); --- 449,453 ---- * * * * * * * * * * * */ ! /* Net/Rawnet routines. */ extern int port_for_service(const char *serv, const char *proto); *************** *** 464,467 **** --- 464,475 ---- extern void rawnet_build_dhcp_discover(rawnet_t *net, uint32_t xid, time_t secs, list_t *options); extern void rawnet_build_dhcp_request(rawnet_t *net, uint32_t xid, time_t secs, list_t *options); + extern void rawnet_build_arp_reply_broadcast(rawnet_t *net, uint32_t source_addr, + eth_addr_t source_hw_addr); + extern void rawnet_build_arp_reply(rawnet_t *net, + uint32_t source_addr, + uint32_t dest_addr, + eth_addr_t source_hw_addr, + eth_addr_t dest_hw_addr); + extern void rawnet_dhcp_update(rawnet_t *net, time_t seconds); extern int rawnet_wait(rawnet_t *net, struct timeval tm); *************** *** 618,622 **** extern void eth_set_src_address(eth_obj *eth, eth_addr_t addr); extern void eth_set_dst_address(eth_obj *eth, eth_addr_t addr); - extern void eth_set_dst_address_broadcast(eth_obj *eth); extern void eth_set_type(eth_obj *eth, uint16_t type); --- 626,629 ---- *************** *** 647,658 **** extern arp_obj *arp_create(void); extern void arp_destroy(arp_obj *arp); ! extern void arp_set_format_hardware_addr(arp_obj *arp, uint16_t hdr_addr); ! extern void arp_set_format_protocol_address(arp_obj *arp, uint16_t pro); ! extern void arp_set_hw_len(arp_obj *arp, uint8_t len); extern void arp_set_op(arp_obj *arp, uint8_t op); ! extern void arp_set_sender_hardware_address(arp_obj *arp, unsigned char *addr); ! extern void arp_set_sender_protocol_address(arp_obj *arp, unsigned char *addr); ! extern void arp_set_target_hardware_address(arp_obj *arp, unsigned char *addr); ! extern void arp_set_target_protocol_address(arp_obj *arp, unsigned char *addr); /* UDP obj routines. */ --- 654,666 ---- extern arp_obj *arp_create(void); extern void arp_destroy(arp_obj *arp); ! 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); ! extern void arp_set_hardware_len(arp_obj *arp, uint8_t len); ! extern void arp_set_protocol_len(arp_obj *arp, uint8_t len); extern void arp_set_op(arp_obj *arp, uint8_t op); ! extern void arp_set_sender_hardware_address(arp_obj *arp, eth_addr_t addr); ! extern void arp_set_sender_protocol_address(arp_obj *arp, uint32_t addr); ! extern void arp_set_target_hardware_address(arp_obj *arp, eth_addr_t addr); ! extern void arp_set_target_protocol_address(arp_obj *arp, uint32_t addr); /* UDP obj routines. */ Index: dhcp-arp.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-arp.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-arp.c 2002/01/31 23:15:44 1.2 --- dhcp-arp.c 2002/02/01 18:31:17 1.3 *************** *** 40,58 **** } ! void arp_set_format_hardware_addr(arp_obj *arp, uint16_t hdr_addr) { ! memcpy(&arp->header.ar_hrd, &hdr_addr, sizeof(uint16_t)); return; } ! void arp_set_format_protocol_address(arp_obj *arp, uint16_t pro) { ! memcpy(&arp->header.ar_pro, &pro, sizeof(uint16_t)); return; } ! void arp_set_hw_len(arp_obj *arp, uint8_t len) { ! memcpy(&arp->header.ar_pro, &len, sizeof(uint8_t)); return; } --- 40,63 ---- } ! void arp_set_hardware_type(arp_obj *arp, uint16_t hdr_addr) { ! arp->header.ar_hrd = htons(hdr_addr); return; } ! void arp_set_protocol_type(arp_obj *arp, uint16_t pro) { ! arp->header.ar_pro = htons(pro); return; } ! void arp_set_hardware_len(arp_obj *arp, uint8_t len) { ! arp->header.ar_hln = len; ! return; ! } ! void arp_set_protocol_len(arp_obj *arp, uint8_t len) ! { ! arp->header.ar_pln = len; return; } *************** *** 60,88 **** void arp_set_op(arp_obj *arp, uint8_t op) { ! memcpy(&arp->header.ar_op, &op, sizeof(uint8_t)); return; } ! void arp_set_sender_hardware_address(arp_obj *arp, unsigned char *addr) { ! memcpy(&arp->arp_data.ar_sha, addr, ETH_ADDR_LEN); return; } ! void arp_set_sender_protocol_address(arp_obj *arp, unsigned char *addr) { ! memcpy(&arp->arp_data.ar_spa, addr, IP_ADDR_LEN); return; } ! void arp_set_target_hardware_address(arp_obj *arp, unsigned char *addr) { ! memcpy(&arp->arp_data.ar_tha, addr, ETH_ADDR_LEN); return; } ! void arp_set_target_protocol_address(arp_obj *arp, unsigned char *addr) { ! memcpy(&arp->arp_data.ar_tpa, addr, IP_ADDR_LEN); return; } --- 65,125 ---- void arp_set_op(arp_obj *arp, uint8_t op) { ! arp->header.ar_op = op; return; } ! void arp_set_sender_hardware_address(arp_obj *arp, eth_addr_t addr) { ! memcpy(&arp->arp_data.ar_sha, &addr.data, ETH_ADDR_LEN); return; } ! void arp_set_sender_protocol_address(arp_obj *arp, uint32_t addr) { ! memcpy(&arp->arp_data.ar_spa, &addr, IP_ADDR_LEN); return; } ! void arp_set_target_hardware_address(arp_obj *arp, eth_addr_t addr) { ! memcpy(&arp->arp_data.ar_tha, &addr.data, ETH_ADDR_LEN); return; } ! void arp_set_target_protocol_address(arp_obj *arp, uint32_t addr) { ! memcpy(&arp->arp_data.ar_tpa, &addr, IP_ADDR_LEN); return; } + + void arp_write_packet_image(arp_obj *arp, unsigned char *packet) + { + memcpy(packet, &arp->header.ar_hrd, sizeof(arp->header.ar_hrd)); + packet += sizeof(arp->header.ar_hrd); + + memcpy(packet, &arp->header.ar_pro, sizeof(arp->header.ar_pro)); + packet += sizeof(arp->header.ar_pro); + + memcpy(packet, &arp->header.ar_hln, sizeof(arp->header.ar_hln)); + packet += sizeof(arp->header.ar_hln); + + memcpy(packet, &arp->header.ar_pln, sizeof(arp->header.ar_pln)); + packet += sizeof(arp->header.ar_pln); + + memcpy(packet, &arp->header.ar_op, sizeof(arp->header.ar_op)); + packet += sizeof(arp->header.ar_op); + + memcpy(packet, &arp->arp_data.ar_sha, sizeof(arp->arp_data.ar_sha)); + packet += sizeof(arp->arp_data.ar_sha); + + memcpy(packet, &arp->arp_data.ar_spa, sizeof(arp->arp_data.ar_spa)); + packet += sizeof(arp->arp_data.ar_spa); + + memcpy(packet, &arp->arp_data.ar_tha, sizeof(arp->arp_data.ar_tha)); + packet += sizeof(arp->arp_data.ar_tha); + + memcpy(packet, &arp->arp_data.ar_tpa, sizeof(arp->arp_data.ar_tpa)); + + return; + } + Index: dhcp-client-states.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-client-states.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** dhcp-client-states.c 2002/01/31 12:37:24 1.6 --- dhcp-client-states.c 2002/02/01 18:31:17 1.7 *************** *** 88,91 **** --- 88,104 ---- } + /* + * Use this to send out a broadcast reply claiming that we own the + * IP. To prevent a poisoned cache we use the actual interface hw + * addr as opposed to any fake one we may have been passed. + * + */ + + static void client_broadcast_arp_reply(dhcp_client_control_t *dc) + { + + return; + } + /* Send and wait for reply. */ Index: dhcp-eth.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-eth.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-eth.c 2002/01/30 16:06:46 1.2 --- dhcp-eth.c 2002/02/01 18:31:17 1.3 *************** *** 63,72 **** } - void eth_set_dst_address_broadcast(eth_obj *eth) - { - memcpy(ð->header.eth_dst.data, ETH_ADDR_BROADCAST, ETH_ADDR_LEN); - return; - } - void eth_set_dst_address(eth_obj *eth, eth_addr_t addr) { --- 63,66 ---- Index: dhcp-interface.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-interface.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** dhcp-interface.c 2002/01/31 23:15:44 1.4 --- dhcp-interface.c 2002/02/01 18:31:17 1.5 *************** *** 26,29 **** --- 26,53 ---- #include <dhcp-agent.h> + static struct intf_info info; + + /* Internal utilities */ + + static int interface_get_info(interface_control_t *ic, char *name) + { + if(intf_get(ic, name, &info) < 0) { + error_message("could not lookup interface %s : %d", name, strerror(errno)); + return -1; + } + + return 0; + } + + static int interface_set_info(interface_control_t *ic, char *name) + { + if(intf_set(ic, name, &info) < 0) { + error_message("could not lookup interface %s : %d", name, strerror(errno)); + return -1; + } + + return 0; + } + /* Initialize interface handle. */ *************** *** 48,57 **** int interface_is_up(interface_control_t *ic, char *name) { ! struct intf_info info; ! ! if(intf_get(ic, name, &info) < 0) { ! error_message("could not acquire interface %s", name); ! return -1; ! } return(info.intf_flags&INTF_FLAG_UP); --- 72,78 ---- int interface_is_up(interface_control_t *ic, char *name) { ! ! if(interface_get_info(ic, name)) ! return 0; return(info.intf_flags&INTF_FLAG_UP); *************** *** 63,83 **** int mtu) { ! struct intf_info info; ! ! if(intf_get(ic, name, &info) < 0) { ! error_message("could not lookup interface %s : %d", name, strerror(errno)); return -1; - } /* Set address if needed. */ if(addr != INADDR_ANY) { info.intf_addr.addr_type = ADDR_TYPE_IP; - info.intf_addr.addr_bits = 0; addr_mtob(&netmask, IP_ADDR_LEN, &info.intf_addr.addr_bits); ! memcpy(&info.intf_addr.addr_ip, &addr, 4); info.intf_info |= INTF_INFO_ADDR; ! } ! /* Set mtu to default if not passed. */ --- 84,102 ---- int mtu) { ! if(interface_get_info(ic, name)) return -1; /* Set address if needed. */ if(addr != INADDR_ANY) { + info.intf_addr.addr_type = ADDR_TYPE_IP; addr_mtob(&netmask, IP_ADDR_LEN, &info.intf_addr.addr_bits); ! memcpy(&info.intf_addr.addr_ip, &addr, IP_ADDR_LEN); info.intf_info |= INTF_INFO_ADDR; ! ! } else ! info.intf_info &= ~(INTF_INFO_ADDR); ! /* Set mtu to default if not passed. */ *************** *** 91,98 **** info.intf_flags |= INTF_FLAG_UP; ! if(intf_set(ic, name, &info) < 0) { ! error_message("could not bring interface up %s : %s", name, strerror(errno)); return -1; - } return 0; --- 110,115 ---- info.intf_flags |= INTF_FLAG_UP; ! if(interface_set_info(ic, name)) return -1; return 0; *************** *** 102,117 **** { struct intf_info info; ! ! if(intf_get(ic, name, &info) < 0) { ! error_message("could not lookup interface %s : %d", name, strerror(errno)); return -1; - } ! info.intf_flags &= ~(INTF_FLAG_UP&info.intf_flags); ! if(intf_set(ic, name, &info) < 0) { ! error_message("could not lookup interface %s : %d", name, strerror(errno)); return -1; - } return 0; --- 119,130 ---- { struct intf_info info; ! ! if(interface_get_info(ic, name)) return -1; ! info.intf_flags &= ~(INTF_FLAG_UP); ! if(interface_set_info(ic, name)) return -1; return 0; Index: dhcp-net.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-net.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dhcp-net.c 2002/01/31 14:43:22 1.5 --- dhcp-net.c 2002/02/01 18:31:17 1.6 *************** *** 63,66 **** --- 63,71 ---- #include <dhcp-agent.h> + /* constants we need. */ + + static const eth_addr_t eth_broadcast = { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }; + static const uint32_t ip_addr_broadcast = 0xffffffff; + /* Get port number for named service. */ *************** *** 409,417 **** * we need. */ static void build_eth_broadcast(rawnet_t *net, eth_addr_t client_hw_addr, uint16_t type) { ! eth_set_dst_address_broadcast(net->ether_p); eth_set_src_address(net->ether_p, client_hw_addr); eth_set_type(net->ether_p, type); --- 414,444 ---- * 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) + { + + arp_set_hardware_type(net->arp_p, DLT_EN10MB); + arp_set_protocol_type(net->arp_p, ETH_TYPE_IP); + arp_set_hardware_len(net->arp_p, ETH_ADDR_LEN); + arp_set_protocol_len(net->arp_p, IP_ADDR_LEN); + arp_set_op(net->arp_p, opcode); + arp_set_sender_hardware_address(net->arp_p, sender_hw_addr); + arp_set_sender_protocol_address(net->arp_p, sender_ip_addr); + arp_set_target_hardware_address(net->arp_p, target_hw_addr); + arp_set_target_protocol_address(net->arp_p, target_ip_addr); + + return; + } + static void build_eth_broadcast(rawnet_t *net, eth_addr_t client_hw_addr, uint16_t type) + { ! eth_set_dst_address(net->ether_p, eth_broadcast); eth_set_src_address(net->ether_p, client_hw_addr); eth_set_type(net->ether_p, type); *************** *** 433,437 **** ip_set_source_addr(net->ip_p, 0); ! ip_set_dest_addr(net->ip_p, 0xffffffff); return; --- 460,464 ---- ip_set_source_addr(net->ip_p, 0); ! ip_set_dest_addr(net->ip_p, ip_addr_broadcast); return; *************** *** 571,574 **** --- 598,620 ---- rawnet_write_packet(net, ip_len); + return; + } + + + void rawnet_build_arp_reply(rawnet_t *net, + uint32_t source_addr, + uint32_t dest_addr, + eth_addr_t source_hw_addr, + eth_addr_t dest_hw_addr) + { + build_arp_proc(net, ARP_OP_REPLY, source_hw_addr, source_addr, dest_hw_addr, dest_addr); + return; + } + + void rawnet_build_arp_reply_broadcast(rawnet_t *net, uint32_t source_addr, eth_addr_t source_hw_addr) + { + + rawnet_build_arp_reply(net, source_addr, ip_addr_broadcast, + source_hw_addr, eth_broadcast); return; } Index: dhcp-sysconf.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-sysconf.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dhcp-sysconf.c 2002/01/30 16:06:46 1.3 --- dhcp-sysconf.c 2002/02/01 18:31:17 1.4 *************** *** 226,230 **** if(interface_up(dc->interface_control, dc->interface, addr, netmask, mtu)) fatal_error("could not bring up interface: %s", dc->interface); ! return; } --- 226,230 ---- if(interface_up(dc->interface_control, dc->interface, addr, netmask, mtu)) fatal_error("could not bring up interface: %s", dc->interface); ! return; } |