[Dhcp-agent-commits] CVS: dhcp-agent dhcp-agent.h,1.23,1.24 dhcp-align.c,1.3,1.4 dhcp-client-states.
Status: Alpha
Brought to you by:
actmodern
From: Thamer Al-H. <act...@us...> - 2002-02-12 15:38:07
|
Update of /cvsroot/dhcp-agent/dhcp-agent In directory usw-pr-cvs1:/tmp/cvs-serv27877 Modified Files: dhcp-agent.h dhcp-align.c dhcp-client-states.c dhcp-icmp.c Log Message: icmp echo routines added; fixed up timeout logging to be more brief; Index: dhcp-agent.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-agent.h,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** dhcp-agent.h 11 Feb 2002 18:02:24 -0000 1.23 --- dhcp-agent.h 12 Feb 2002 15:23:59 -0000 1.24 *************** *** 720,723 **** --- 720,731 ---- extern icmp_obj *icmp_create(void); extern void icmp_destroy(icmp_obj *icmp); + extern void icmp_set_type(icmp_obj *icmp, uint8_t type); + extern void icmp_set_code(icmp_obj *icmp, uint8_t code); + extern void icmp_set_cksum(icmp_obj *icmp, uint16_t cksum); + extern void icmp_mask_set_id(icmp_obj *icmp, uint32_t id); + extern void icmp_mask_set_seq(icmp_obj *icmp, uint32_t seq); + extern void icmp_mask_set_mask(icmp_obj *icmp, uint32_t mask); + extern void icmp_echo_set_id(icmp_obj *icmp, uint32_t id); + extern void icmp_echo_set_seq(icmp_obj *icmp, uint32_t seq); /* Alignment functions. */ *************** *** 727,730 **** --- 735,741 ---- extern void align_udp(const unsigned char *data, struct udp_hdr *udp); extern void align_dhcphdr(const unsigned char *data, dhcphdr *dhcp); + extern void align_icmp(const unsigned char *data, struct icmp_hdr *header); + extern void align_icmp_mask(const unsigned char *data, struct icmp_msg_mask *header); + extern void align_icmp_echo(const unsigned char *data, struct icmp_msg_echo *header); /* Linked List routines. */ Index: dhcp-align.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-align.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** dhcp-align.c 3 Feb 2002 16:56:00 -0000 1.3 --- dhcp-align.c 12 Feb 2002 15:23:59 -0000 1.4 *************** *** 159,160 **** --- 159,196 ---- return; } + + void align_icmp(const unsigned char *data, struct icmp_hdr *header) + { + memcpy(&header->icmp_type, data, sizeof(header->icmp_type)); + data += sizeof(header->icmp_type); + + memcpy(&header->icmp_code, data, sizeof(header->icmp_code)); + data += sizeof(header->icmp_code); + + memcpy(&header->icmp_cksum, data, sizeof(header->icmp_cksum)); + + return; + } + + void align_icmp_mask(const unsigned char *data, struct icmp_msg_mask *header) + { + memcpy(&header->icmp_id, data, sizeof(header->icmp_id)); + data += sizeof(header->icmp_id); + + memcpy(&header->icmp_seq, data, sizeof(header->icmp_seq)); + data += sizeof(header->icmp_seq); + + memcpy(&header->icmp_mask, data, sizeof(header->icmp_mask)); + + return; + } + + void align_icmp_echo(const unsigned char *data, struct icmp_msg_echo *header) + { + memcpy(&header->icmp_id, data, sizeof(header->icmp_id)); + data += sizeof(header->icmp_id); + + memcpy(&header->icmp_seq, data, sizeof(header->icmp_seq)); + + return; + } Index: dhcp-client-states.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-client-states.c,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** dhcp-client-states.c 9 Feb 2002 16:48:49 -0000 1.14 --- dhcp-client-states.c 12 Feb 2002 15:23:59 -0000 1.15 *************** *** 35,39 **** static RETSIGTYPE handle_alarm(int i) { ! have_alarm = 1; return (RETSIGTYPE) 0; } --- 35,39 ---- static RETSIGTYPE handle_alarm(int i) { ! have_alarm= 1; return (RETSIGTYPE) 0; } *************** *** 324,328 **** return -1; } ! do_sysconf(options, dc); cache_entry_purge_list(options); --- 324,333 ---- return -1; } ! ! /* Before doing a sysconf, let's make sure no one on the ! * local subnet is using our address. Do an ARP request ! * on the local subnet. and check to see if the address ! * is already taken. */ ! do_sysconf(options, dc); cache_entry_purge_list(options); *************** *** 377,384 **** options = client_build_option_list(NULL, DHCP_RELEASE_TM, dc->client_id, dc->class_id); cache_options = client_cache_load_option_network_list(dc->cache, 0); ! if(cache_options == NULL) { ! error_message("Could not load cache! This is not good!"); return -1; - } options = join_lists(options, cache_options); --- 382,389 ---- options = client_build_option_list(NULL, DHCP_RELEASE_TM, dc->client_id, dc->class_id); cache_options = client_cache_load_option_network_list(dc->cache, 0); ! if(cache_options == NULL) ! /* if we have no cache we probably timed out ! * somewhere. Just return. */ return -1; options = join_lists(options, cache_options); Index: dhcp-icmp.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/dhcp-icmp.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-icmp.c 9 Feb 2002 23:29:37 -0000 1.2 --- dhcp-icmp.c 12 Feb 2002 15:23:59 -0000 1.3 *************** *** 49,53 **** } ! void icmp_set_cksum(icmp_obj *icmp, uint16_t cksum) { icmp->icmp_header.icmp_cksum = cksum; --- 49,53 ---- } ! void icmp_clear_cksum(icmp_obj *icmp, uint16_t cksum) { icmp->icmp_header.icmp_cksum = cksum; *************** *** 69,72 **** --- 69,82 ---- } + void icmp_echo_set_id(icmp_obj *icmp, uint32_t id) + { + icmp->icmp_msg.echo.icmp_id = htonl(id); + } + + void icmp_echo_set_seq(icmp_obj *icmp, uint32_t seq) + { + icmp->icmp_msg.echo.icmp_seq = htonl(seq); + } + static void icmp_write_mask_packet_image(icmp_obj *icmp, unsigned char *packet) { *************** *** 85,88 **** --- 95,110 ---- } + static void icmp_write_echo_packet_image(icmp_obj *icmp, unsigned char *packet) + { + memcpy(packet, &icmp->icmp_msg.echo.icmp_id, + sizeof(icmp->icmp_msg.echo.icmp_id)); + packet += sizeof(icmp->icmp_msg.echo.icmp_id); + + memcpy(packet, &icmp->icmp_msg.echo.icmp_seq, + sizeof(icmp->icmp_msg.echo.icmp_seq)); + + return; + } + void icmp_write_packet_image(icmp_obj *icmp, unsigned char *packet) { *************** *** 90,94 **** memcpy(packet, &icmp->icmp_header.icmp_type, sizeof(icmp->icmp_header.icmp_type)); packet += sizeof(icmp->icmp_header.icmp_type); ! memcpy(packet, &icmp->icmp_header.icmp_code, sizeof(icmp->icmp_header.icmp_code)); packet += sizeof(icmp->icmp_header.icmp_code); --- 112,116 ---- memcpy(packet, &icmp->icmp_header.icmp_type, sizeof(icmp->icmp_header.icmp_type)); packet += sizeof(icmp->icmp_header.icmp_type); ! memcpy(packet, &icmp->icmp_header.icmp_code, sizeof(icmp->icmp_header.icmp_code)); packet += sizeof(icmp->icmp_header.icmp_code); *************** *** 99,103 **** switch(ntohl(icmp->icmp_header.icmp_type)) { ! /* both mask types have the same construction. */ case ICMP_MASK: /* fall through. */ --- 121,130 ---- switch(ntohl(icmp->icmp_header.icmp_type)) { ! ! case ICMP_ECHO: /* fall through */ ! case ICMP_ECHOREPLY: ! ! icmp_write_echo_packet_image(icmp, packet); ! break; case ICMP_MASK: /* fall through. */ *************** *** 114,115 **** --- 141,170 ---- return; } + + void icmp_read_packet_image(icmp_obj *icmp, const unsigned char *packet) + { + align_icmp(packet, &icmp->icmp_header); + packet += ICMP_HDR_LEN; + + switch(icmp->icmp_header.icmp_type) { + + case ICMP_ECHO: + case ICMP_ECHOREPLY: + + align_icmp_echo(packet, &icmp->icmp_msg.echo); + break; + + case ICMP_MASK: + case ICMP_MASKREPLY: + + align_icmp_mask(packet, &icmp->icmp_msg.mask); + break; + + default: + /* can't handle any other type. */ + break; + } + + return; + } + |