Make add_option_(vendor|hostname)() not use ndhc internals.

This change makes it easier to fuzz test, but should have no
functional effect on ndhc's behavior.
This commit is contained in:
Nicholas J. Kain 2015-02-20 03:58:25 -05:00
parent 646931a2bf
commit 6c136c3f85
3 changed files with 27 additions and 20 deletions

View File

@ -403,6 +403,17 @@ bool dhcp_packet_get(struct client_state_t cs[static 1],
return true;
}
static void add_options_vendor_hostname(struct dhcpmsg packet[static 1])
{
size_t vlen = strlen(client_config.vendor);
size_t hlen = strlen(client_config.hostname);
if (vlen)
add_option_vendor(packet, client_config.vendor, vlen);
else
add_option_vendor(packet, "ndhc", sizeof "ndhc" - 1);
add_option_hostname(packet, client_config.hostname, hlen);
}
// Initialize a DHCP client packet that will be sent to a server
static void init_packet(struct dhcpmsg packet[static 1], char type)
{
@ -425,8 +436,7 @@ ssize_t send_discover(struct client_state_t cs[static 1])
add_option_reqip(&packet, cs->clientAddr);
add_option_maxsize(&packet);
add_option_request_list(&packet);
add_option_vendor(&packet);
add_option_hostname(&packet);
add_options_vendor_hostname(&packet);
log_line("%s: Discovering DHCP servers...", client_config.interface);
return send_dhcp_raw(&packet);
}
@ -440,8 +450,7 @@ ssize_t send_selecting(struct client_state_t cs[static 1])
add_option_serverid(&packet, cs->serverAddr);
add_option_maxsize(&packet);
add_option_request_list(&packet);
add_option_vendor(&packet);
add_option_hostname(&packet);
add_options_vendor_hostname(&packet);
inet_ntop(AF_INET, &(struct in_addr){.s_addr = cs->clientAddr},
clibuf, sizeof clibuf);
log_line("%s: Sending a selection request for %s...",
@ -456,8 +465,7 @@ ssize_t send_renew(struct client_state_t cs[static 1])
packet.ciaddr = cs->clientAddr;
add_option_maxsize(&packet);
add_option_request_list(&packet);
add_option_vendor(&packet);
add_option_hostname(&packet);
add_options_vendor_hostname(&packet);
log_line("%s: Sending a renew request...", client_config.interface);
return send_dhcp_unicast(cs, &packet);
}
@ -470,8 +478,7 @@ ssize_t send_rebind(struct client_state_t cs[static 1])
add_option_reqip(&packet, cs->clientAddr);
add_option_maxsize(&packet);
add_option_request_list(&packet);
add_option_vendor(&packet);
add_option_hostname(&packet);
add_options_vendor_hostname(&packet);
log_line("%s: Sending a rebind request...", client_config.interface);
return send_dhcp_raw(&packet);
}

View File

@ -287,20 +287,18 @@ void add_option_maxsize(struct dhcpmsg *packet)
htons(sizeof(struct ip_udp_dhcp_packet)));
}
void add_option_vendor(struct dhcpmsg *packet)
void add_option_vendor(struct dhcpmsg *packet, const char * const vendor,
size_t vsize)
{
size_t len = strlen(client_config.vendor);
if (len)
add_option_string(packet, DCODE_VENDOR, client_config.vendor, len);
else
add_option_string(packet, DCODE_VENDOR, "ndhc", sizeof "ndhc" - 1);
if (vsize)
add_option_string(packet, DCODE_VENDOR, vendor, vsize);
}
void add_option_hostname(struct dhcpmsg *packet)
void add_option_hostname(struct dhcpmsg *packet, const char * const hostname,
size_t hsize)
{
size_t len = strlen(client_config.hostname);
if (len)
add_option_string(packet, DCODE_HOSTNAME, client_config.hostname, len);
if (hsize)
add_option_string(packet, DCODE_HOSTNAME, hostname, hsize);
}
#endif

View File

@ -78,8 +78,10 @@ void add_option_clientid(struct dhcpmsg *packet,
const char * const clientid, size_t clen);
#ifndef NDHS_BUILD
void add_option_maxsize(struct dhcpmsg *packet);
void add_option_vendor(struct dhcpmsg *packet);
void add_option_hostname(struct dhcpmsg *packet);
void add_option_vendor(struct dhcpmsg *packet, const char * const vendor,
size_t vsize);
void add_option_hostname(struct dhcpmsg *packet, const char * const hostname,
size_t hsize);
#endif
uint32_t get_option_router(const struct dhcpmsg * const packet);
uint8_t get_option_msgtype(const struct dhcpmsg * const packet);