diff --git a/dhtest.c b/dhtest.c index 1676726..0a0fd09 100644 --- a/dhtest.c +++ b/dhtest.c @@ -55,6 +55,9 @@ 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; +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 }; @@ -104,6 +107,9 @@ 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, " -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"); } @@ -138,13 +144,16 @@ 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'}, + { "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: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; @@ -268,6 +277,22 @@ 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 'g': + giaddr = optarg; + break; + + case 'S': + server_addr = optarg; + break; + case 'p': padding_flag = 1; break; diff --git a/functions.c b/functions.c index 7e76cdd..661d805 100644 --- a/functions.c +++ b/functions.c @@ -43,6 +43,9 @@ 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 u_char *giaddr; +extern u_char *server_addr; extern struct ethernet_hdr *eth_hg; extern struct vlan_hdr *vlan_hg; @@ -630,12 +633,12 @@ 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); - 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); @@ -652,7 +655,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*/ @@ -697,12 +700,12 @@ 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); - 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); @@ -719,7 +722,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*/ @@ -768,8 +771,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); @@ -786,7 +789,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*/ @@ -888,7 +891,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 +902,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 +916,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 +928,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) {