From 6a0d88ae44814802670927659f53232a96717564 Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Wed, 23 Oct 2013 15:44:14 +0200 Subject: [PATCH 1/3] Added -P port, so that we can test on different ports We may want to do DHCP testing on a "live" network, and not break existing DHCP clients and servers. --- dhtest.c | 13 ++++++++++++- functions.c | 21 +++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/dhtest.c b/dhtest.c index 1676726..86b64c9 100644 --- a/dhtest.c +++ b/dhtest.c @@ -55,6 +55,7 @@ u_int16_t fqdn_flag = 0; u_int16_t fqdn_n = 0; u_int16_t fqdn_s = 0; u_int32_t option51_lease_time = 0; +u_int32_t port = 67; /* Pointers for all layer data structures */ struct ethernet_hdr *eth_hg = { 0 }; @@ -104,6 +105,7 @@ void print_help(char *cmd) fprintf(stdout, " -n, --fqdn-server-not-update\t\t# Sets FQDN server not update flag\n"); fprintf(stdout, " -s, --fqdn-server-update-a\t\t# Sets FQDN server update flag\n"); fprintf(stdout, " -p, --padding\t\t\t\t# Add padding to packet to be at least 300 bytes\n"); + fprintf(stdout, " -P, --port\t\t[ port ]\t# Use port instead of 67\n"); fprintf(stdout, " -V, --verbose\t\t\t\t# Prints DHCP offer and ack details\n"); fprintf(stdout, " dhtest version 1.2\n"); } @@ -138,13 +140,14 @@ int main(int argc, char *argv[]) { "fqdn-server-update-a", no_argument, 0, 's'}, { "fqdn-domain-name", required_argument, 0, 'd'}, { "padding", no_argument, 0, 'p'}, + { "port", required_argument, 0, 'P'}, { "release", no_argument, 0, 'r'}, { 0, 0, 0, 0 } }; /*getopt routine to get command line arguments*/ while(get_tmp < argc) { - get_cmd = getopt_long(argc, argv, "m:i:v:t:bfVrpT:I:o:k:L:h:n:s:d:",\ + get_cmd = getopt_long(argc, argv, "m:i:v:t:bfVrpT:P:I:o:k:L:h:n:s:d:",\ long_options, &option_index); if(get_cmd == -1 ) { break; @@ -268,6 +271,14 @@ int main(int argc, char *argv[]) timeout = atoi(optarg); break; + case 'P': + if(atoi(optarg) <=0 || atoi(optarg) > 65535) { + fprintf(stdout, "Invalid portt value. Range 1 to 65535\n"); + exit(1); + } + port = atoi(optarg); + break; + case 'p': padding_flag = 1; break; diff --git a/functions.c b/functions.c index 7e76cdd..6d8fd87 100644 --- a/functions.c +++ b/functions.c @@ -43,6 +43,7 @@ extern u_int8_t vci_buff[256]; extern u_int8_t hostname_buff[256]; extern u_int8_t fqdn_buff[256]; extern u_int32_t option51_lease_time; +extern u_int32_t port; extern struct ethernet_hdr *eth_hg; extern struct vlan_hdr *vlan_hg; @@ -634,8 +635,8 @@ int build_dhpacket(int pkt_type) iph->check = ipchksum((u_int16_t *)(dhcp_packet_disc + l2_hdr_size), iph->ihl << 1); struct udphdr *uh = (struct udphdr *) (dhcp_packet_disc + l2_hdr_size + l3_hdr_size); - uh->source = htons(68); - uh->dest = htons(67); + uh->source = htons(port + 1); + uh->dest = htons(port); u_int16_t l4_proto = 17; u_int16_t l4_len = (l4_hdr_size + dhcp_hdr_size + dhopt_size); uh->len = htons(l4_len); @@ -701,8 +702,8 @@ int build_dhpacket(int pkt_type) iph->check = ipchksum((u_int16_t *)(dhcp_packet_request + l2_hdr_size), iph->ihl << 1); struct udphdr *uh = (struct udphdr *) (dhcp_packet_request + l2_hdr_size + l3_hdr_size); - uh->source = htons(68); - uh->dest = htons(67); + uh->source = htons(port + 1); + uh->dest = htons(port); u_int16_t l4_proto = 17; u_int16_t l4_len = (l4_hdr_size + dhcp_hdr_size + dhopt_size); uh->len = htons(l4_len); @@ -768,8 +769,8 @@ int build_dhpacket(int pkt_type) iph->check = ipchksum((u_int16_t *)(dhcp_packet_release + l2_hdr_size), iph->ihl << 1); struct udphdr *uh = (struct udphdr *) (dhcp_packet_release + l2_hdr_size + l3_hdr_size); - uh->source = htons(68); - uh->dest = htons(67); + uh->source = htons(port + 1); + uh->dest = htons(port); u_int16_t l4_proto = 17; u_int16_t l4_len = (l4_hdr_size + dhcp_hdr_size + dhopt_size); uh->len = htons(l4_len); @@ -888,7 +889,7 @@ int check_packet(int pkt_type) { if(pkt_type == DHCP_MSGOFFER && vlan != 0) { map_all_layer_ptr(DHCP_MSGOFFER); - if(ntohs(vlan_hg->vlan_priority_c_vid) == vlan && ntohs(vlan_hg->vlan_tpi) == ETHERTYPE_VLAN && iph_g->protocol == 17 && uh_g->source == htons(67) && uh_g->dest == htons(68)) { + if(ntohs(vlan_hg->vlan_priority_c_vid) == vlan && ntohs(vlan_hg->vlan_tpi) == ETHERTYPE_VLAN && iph_g->protocol == 17 && uh_g->source == htons(port) && uh_g->dest == htons(port + 1)) { if(*(dhopt_pointer_g + 2) == DHCP_MSGOFFER && htonl(dhcph_g->dhcp_xid) == dhcp_xid) { return DHCP_OFFR_RCVD; } else { @@ -899,7 +900,7 @@ int check_packet(int pkt_type) } } else if (pkt_type == DHCP_MSGACK && vlan != 0){ map_all_layer_ptr(DHCP_MSGACK); - if(ntohs(vlan_hg->vlan_priority_c_vid) == vlan && ntohs(vlan_hg->vlan_tpi) == ETHERTYPE_VLAN && iph_g->protocol == 17 && uh_g->source == htons(67) && uh_g->dest == htons(68)) { + if(ntohs(vlan_hg->vlan_priority_c_vid) == vlan && ntohs(vlan_hg->vlan_tpi) == ETHERTYPE_VLAN && iph_g->protocol == 17 && uh_g->source == htons(port) && uh_g->dest == htons(port + 1)) { if(*(dhopt_pointer_g + 2) == DHCP_MSGACK && htonl(dhcph_g->dhcp_xid) == dhcp_xid) { return DHCP_ACK_RCVD; } else if(*(dhopt_pointer_g + 2) == DHCP_MSGNACK && htonl(dhcph_g->dhcp_xid) == dhcp_xid){ @@ -913,7 +914,7 @@ int check_packet(int pkt_type) } } else if (pkt_type == DHCP_MSGOFFER) { map_all_layer_ptr(DHCP_MSGOFFER); - if(eth_hg->ether_type == htons(ETHERTYPE_IP) && iph_g->protocol == 17 && uh_g->source == htons(67) && uh_g->dest == htons(68)) { + if(eth_hg->ether_type == htons(ETHERTYPE_IP) && iph_g->protocol == 17 && uh_g->source == htons(port) && uh_g->dest == htons(port + 1)) { if(*(dhopt_pointer_g + 2) == DHCP_MSGOFFER && htonl(dhcph_g->dhcp_xid) == dhcp_xid) { return DHCP_OFFR_RCVD; } else { @@ -925,7 +926,7 @@ int check_packet(int pkt_type) } else if (pkt_type == DHCP_MSGACK) { map_all_layer_ptr(DHCP_MSGACK); - if(eth_hg->ether_type == htons(ETHERTYPE_IP) && iph_g->protocol == 17 && uh_g->source == htons(67) && uh_g->dest == htons(68)) { + if(eth_hg->ether_type == htons(ETHERTYPE_IP) && iph_g->protocol == 17 && uh_g->source == htons(port) && uh_g->dest == htons(port + 1)) { if(*(dhopt_pointer_g + 2) == DHCP_MSGACK && htonl(dhcph_g->dhcp_xid) == dhcp_xid) { return DHCP_ACK_RCVD; } else if(*(dhopt_pointer_g + 2) == DHCP_MSGNACK && htonl(dhcph_g->dhcp_xid) == dhcp_xid) { From 3bef88f7e5bd2ad9c4250a0f6873ba6113bd002f Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Wed, 23 Oct 2013 07:14:19 -0700 Subject: [PATCH 2/3] Added giaddr option --- dhtest.c | 9 ++++++++- functions.c | 7 ++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/dhtest.c b/dhtest.c index 86b64c9..13700f3 100644 --- a/dhtest.c +++ b/dhtest.c @@ -56,6 +56,7 @@ u_int16_t fqdn_n = 0; u_int16_t fqdn_s = 0; u_int32_t option51_lease_time = 0; u_int32_t port = 67; +u_char *giaddr = "0.0.0.0"; /* Pointers for all layer data structures */ struct ethernet_hdr *eth_hg = { 0 }; @@ -106,6 +107,7 @@ void print_help(char *cmd) fprintf(stdout, " -s, --fqdn-server-update-a\t\t# Sets FQDN server update flag\n"); fprintf(stdout, " -p, --padding\t\t\t\t# Add padding to packet to be at least 300 bytes\n"); fprintf(stdout, " -P, --port\t\t[ port ]\t# Use port instead of 67\n"); + fprintf(stdout, " -g, --giaddr\t\t[ giaddr ]\t# Use giaddr instead of 0.0.0.0\n"); fprintf(stdout, " -V, --verbose\t\t\t\t# Prints DHCP offer and ack details\n"); fprintf(stdout, " dhtest version 1.2\n"); } @@ -141,13 +143,14 @@ int main(int argc, char *argv[]) { "fqdn-domain-name", required_argument, 0, 'd'}, { "padding", no_argument, 0, 'p'}, { "port", required_argument, 0, 'P'}, + { "giaddr", required_argument, 0, 'g'}, { "release", no_argument, 0, 'r'}, { 0, 0, 0, 0 } }; /*getopt routine to get command line arguments*/ while(get_tmp < argc) { - get_cmd = getopt_long(argc, argv, "m:i:v:t:bfVrpT:P:I:o:k:L:h:n:s:d:",\ + get_cmd = getopt_long(argc, argv, "m:i:v:t:bfVrpT:P:g:I:o:k:L:h:n:s:d:",\ long_options, &option_index); if(get_cmd == -1 ) { break; @@ -279,6 +282,10 @@ int main(int argc, char *argv[]) port = atoi(optarg); break; + case 'g': + giaddr = optarg; + break; + case 'p': padding_flag = 1; break; diff --git a/functions.c b/functions.c index 6d8fd87..6b0dc37 100644 --- a/functions.c +++ b/functions.c @@ -44,6 +44,7 @@ extern u_int8_t hostname_buff[256]; extern u_int8_t fqdn_buff[256]; extern u_int32_t option51_lease_time; extern u_int32_t port; +extern u_char *giaddr; extern struct ethernet_hdr *eth_hg; extern struct vlan_hdr *vlan_hg; @@ -653,7 +654,7 @@ int build_dhpacket(int pkt_type) dhpointer->dhcp_cip = 0; dhpointer->dhcp_yip = 0; dhpointer->dhcp_sip = 0; - dhpointer->dhcp_gip = 0; + dhpointer->dhcp_gip = inet_addr(giaddr); memcpy(dhpointer->dhcp_chaddr, dhmac, ETHER_ADDR_LEN); /*dhpointer->dhcp_sname dhpointer->dhcp_file*/ @@ -720,7 +721,7 @@ int build_dhpacket(int pkt_type) dhpointer->dhcp_cip = 0; dhpointer->dhcp_yip = 0; dhpointer->dhcp_sip = 0; - dhpointer->dhcp_gip = 0; + dhpointer->dhcp_gip = inet_addr(giaddr); memcpy(dhpointer->dhcp_chaddr, dhmac, ETHER_ADDR_LEN); /*dhpointer->dhcp_sname dhpointer->dhcp_file*/ @@ -787,7 +788,7 @@ int build_dhpacket(int pkt_type) dhpointer->dhcp_cip = option50_ip; dhpointer->dhcp_yip = 0; dhpointer->dhcp_sip = 0; - dhpointer->dhcp_gip = 0; + dhpointer->dhcp_gip = inet_addr(giaddr); memcpy(dhpointer->dhcp_chaddr, dhmac, ETHER_ADDR_LEN); /*dhpointer->dhcp_sname dhpointer->dhcp_file*/ From f2a94bfda48e287618b9f4eb89337bcf81e1dcba Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Wed, 23 Oct 2013 07:21:37 -0700 Subject: [PATCH 3/3] Added -S for server address packets are still sent from 0.0.0.0 for now --- dhtest.c | 9 ++++++++- functions.c | 5 +++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/dhtest.c b/dhtest.c index 13700f3..0a0fd09 100644 --- a/dhtest.c +++ b/dhtest.c @@ -57,6 +57,7 @@ u_int16_t fqdn_s = 0; u_int32_t option51_lease_time = 0; u_int32_t port = 67; u_char *giaddr = "0.0.0.0"; +u_char *server_addr = "255.255.255.255"; /* Pointers for all layer data structures */ struct ethernet_hdr *eth_hg = { 0 }; @@ -108,6 +109,7 @@ void print_help(char *cmd) fprintf(stdout, " -p, --padding\t\t\t\t# Add padding to packet to be at least 300 bytes\n"); fprintf(stdout, " -P, --port\t\t[ port ]\t# Use port instead of 67\n"); fprintf(stdout, " -g, --giaddr\t\t[ giaddr ]\t# Use giaddr instead of 0.0.0.0\n"); + fprintf(stdout, " -S, --server\t\t[ address ]\t# Use server address instead of 255.255.255.255\n"); fprintf(stdout, " -V, --verbose\t\t\t\t# Prints DHCP offer and ack details\n"); fprintf(stdout, " dhtest version 1.2\n"); } @@ -144,13 +146,14 @@ int main(int argc, char *argv[]) { "padding", no_argument, 0, 'p'}, { "port", required_argument, 0, 'P'}, { "giaddr", required_argument, 0, 'g'}, + { "server", required_argument, 0, 'S'}, { "release", no_argument, 0, 'r'}, { 0, 0, 0, 0 } }; /*getopt routine to get command line arguments*/ while(get_tmp < argc) { - get_cmd = getopt_long(argc, argv, "m:i:v:t:bfVrpT:P:g:I:o:k:L:h:n:s:d:",\ + get_cmd = getopt_long(argc, argv, "m:i:v:t:bfVrpT:P:g:S:I:o:k:L:h:n:s:d:",\ long_options, &option_index); if(get_cmd == -1 ) { break; @@ -286,6 +289,10 @@ int main(int argc, char *argv[]) giaddr = optarg; break; + case 'S': + server_addr = optarg; + break; + case 'p': padding_flag = 1; break; diff --git a/functions.c b/functions.c index 6b0dc37..661d805 100644 --- a/functions.c +++ b/functions.c @@ -45,6 +45,7 @@ extern u_int8_t fqdn_buff[256]; extern u_int32_t option51_lease_time; extern u_int32_t port; extern u_char *giaddr; +extern u_char *server_addr; extern struct ethernet_hdr *eth_hg; extern struct vlan_hdr *vlan_hg; @@ -632,7 +633,7 @@ int build_dhpacket(int pkt_type) iph->protocol = 17; iph->check = 0; // Filled later; iph->saddr = inet_addr("0.0.0.0"); - iph->daddr = inet_addr("255.255.255.255"); + iph->daddr = inet_addr(server_addr); iph->check = ipchksum((u_int16_t *)(dhcp_packet_disc + l2_hdr_size), iph->ihl << 1); struct udphdr *uh = (struct udphdr *) (dhcp_packet_disc + l2_hdr_size + l3_hdr_size); @@ -699,7 +700,7 @@ int build_dhpacket(int pkt_type) iph->protocol = 17; iph->check = 0; // Filled later; iph->saddr = inet_addr("0.0.0.0"); - iph->daddr = inet_addr("255.255.255.255"); + iph->daddr = inet_addr(server_addr); iph->check = ipchksum((u_int16_t *)(dhcp_packet_request + l2_hdr_size), iph->ihl << 1); struct udphdr *uh = (struct udphdr *) (dhcp_packet_request + l2_hdr_size + l3_hdr_size);