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; 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 // Initialize a DHCP client packet that will be sent to a server
static void init_packet(struct dhcpmsg packet[static 1], char type) 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_reqip(&packet, cs->clientAddr);
add_option_maxsize(&packet); add_option_maxsize(&packet);
add_option_request_list(&packet); add_option_request_list(&packet);
add_option_vendor(&packet); add_options_vendor_hostname(&packet);
add_option_hostname(&packet);
log_line("%s: Discovering DHCP servers...", client_config.interface); log_line("%s: Discovering DHCP servers...", client_config.interface);
return send_dhcp_raw(&packet); 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_serverid(&packet, cs->serverAddr);
add_option_maxsize(&packet); add_option_maxsize(&packet);
add_option_request_list(&packet); add_option_request_list(&packet);
add_option_vendor(&packet); add_options_vendor_hostname(&packet);
add_option_hostname(&packet);
inet_ntop(AF_INET, &(struct in_addr){.s_addr = cs->clientAddr}, inet_ntop(AF_INET, &(struct in_addr){.s_addr = cs->clientAddr},
clibuf, sizeof clibuf); clibuf, sizeof clibuf);
log_line("%s: Sending a selection request for %s...", 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; packet.ciaddr = cs->clientAddr;
add_option_maxsize(&packet); add_option_maxsize(&packet);
add_option_request_list(&packet); add_option_request_list(&packet);
add_option_vendor(&packet); add_options_vendor_hostname(&packet);
add_option_hostname(&packet);
log_line("%s: Sending a renew request...", client_config.interface); log_line("%s: Sending a renew request...", client_config.interface);
return send_dhcp_unicast(cs, &packet); 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_reqip(&packet, cs->clientAddr);
add_option_maxsize(&packet); add_option_maxsize(&packet);
add_option_request_list(&packet); add_option_request_list(&packet);
add_option_vendor(&packet); add_options_vendor_hostname(&packet);
add_option_hostname(&packet);
log_line("%s: Sending a rebind request...", client_config.interface); log_line("%s: Sending a rebind request...", client_config.interface);
return send_dhcp_raw(&packet); 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))); 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 (vsize)
if (len) add_option_string(packet, DCODE_VENDOR, vendor, vsize);
add_option_string(packet, DCODE_VENDOR, client_config.vendor, len);
else
add_option_string(packet, DCODE_VENDOR, "ndhc", sizeof "ndhc" - 1);
} }
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 (hsize)
if (len) add_option_string(packet, DCODE_HOSTNAME, hostname, hsize);
add_option_string(packet, DCODE_HOSTNAME, client_config.hostname, len);
} }
#endif #endif

View File

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