From ea5d47242478772e86efaa416b8a676068925f68 Mon Sep 17 00:00:00 2001 From: "Nicholas J. Kain" Date: Mon, 25 Jul 2011 23:48:35 -0400 Subject: [PATCH] Encapsulate all string option additions into options.c. Note that these functions already existed, but were in dhcp.c -- this is just code motion between compilation units. --- ndhc/dhcp.c | 39 ++------------------------------------- ndhc/options.c | 39 +++++++++++++++++++++++++++++++++++++-- ndhc/options.h | 6 ++++-- 3 files changed, 43 insertions(+), 41 deletions(-) diff --git a/ndhc/dhcp.c b/ndhc/dhcp.c index 2fef189..af8b176 100644 --- a/ndhc/dhcp.c +++ b/ndhc/dhcp.c @@ -146,7 +146,7 @@ static int send_dhcp_cooked(struct client_state_t *cs, struct dhcpmsg *payload) ssize_t endloc = get_end_option_idx(payload); if (endloc < 0) { - log_error("send_dhcp_cooked: Attempt to send packet with no DCODE_END."); + log_error("send_dhcp_cooked: No end marker. Not sending."); goto out_fd; } size_t payload_len = @@ -407,7 +407,7 @@ static int send_dhcp_raw(struct dhcpmsg *payload) // and drop packets that are longer than 562 bytes. ssize_t endloc = get_end_option_idx(payload); if (endloc < 0) { - log_error("send_dhcp_raw: Attempt to send packet with no DCODE_END."); + log_error("send_dhcp_raw: No end marker. Not sending."); close(fd); return ret; } @@ -538,41 +538,6 @@ void handle_packet(struct client_state_t *cs) packet_action(cs, &packet, msgtype); } -static void add_option_vendor(struct dhcpmsg *packet) -{ - 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); -} - -static void add_option_clientid(struct dhcpmsg *packet) -{ - char buf[sizeof client_config.clientid + 1]; - size_t len = 6; - buf[0] = 1; // Ethernet MAC - if (!client_config.clientid_mac) { - size_t slen = strlen(client_config.clientid); - if (!slen) { - memcpy(buf+1, client_config.arp, len); - } else { - buf[0] = 0; // Not a hardware address - len = slen; - memcpy(buf+1, client_config.clientid, slen); - } - } else - memcpy(buf+1, client_config.clientid, len); - add_option_string(packet, DCODE_CLIENT_ID, buf, len+1); -} - -static void add_option_hostname(struct dhcpmsg *packet) -{ - size_t len = strlen(client_config.hostname); - if (len) - add_option_string(packet, DCODE_HOSTNAME, client_config.hostname, len); -} - // Initialize a DHCP client packet that will be sent to a server static struct dhcpmsg init_packet(char type, uint32_t xid) { diff --git a/ndhc/options.c b/ndhc/options.c index 924eefc..786f870 100644 --- a/ndhc/options.c +++ b/ndhc/options.c @@ -217,8 +217,8 @@ ssize_t get_end_option_idx(struct dhcpmsg *packet) // add an option string to the options (an option string contains an option // code, length, then data) -size_t add_option_string(struct dhcpmsg *packet, uint8_t code, char *str, - size_t slen) +static size_t add_option_string(struct dhcpmsg *packet, uint8_t code, + char *str, size_t slen) { size_t len = sizeof_option(code, slen); if (slen > 255 || len != slen + 2) { @@ -337,3 +337,38 @@ void add_option_serverid(struct dhcpmsg *packet, uint32_t sid) add_u32_option(packet, DCODE_SERVER_ID, sid); } +void add_option_vendor(struct dhcpmsg *packet) +{ + 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); +} + +void add_option_clientid(struct dhcpmsg *packet) +{ + char buf[sizeof client_config.clientid + 1]; + size_t len = 6; + buf[0] = 1; // Ethernet MAC + if (!client_config.clientid_mac) { + size_t slen = strlen(client_config.clientid); + if (!slen) { + memcpy(buf+1, client_config.arp, len); + } else { + buf[0] = 0; // Not a hardware address + len = slen; + memcpy(buf+1, client_config.clientid, slen); + } + } else + memcpy(buf+1, client_config.clientid, len); + add_option_string(packet, DCODE_CLIENT_ID, buf, len+1); +} + +void add_option_hostname(struct dhcpmsg *packet) +{ + size_t len = strlen(client_config.hostname); + if (len) + add_option_string(packet, DCODE_HOSTNAME, client_config.hostname, len); +} + diff --git a/ndhc/options.h b/ndhc/options.h index 448460e..9ae31a1 100644 --- a/ndhc/options.h +++ b/ndhc/options.h @@ -72,12 +72,14 @@ int option_valid_list(uint8_t code); uint8_t *get_option_data(struct dhcpmsg *packet, int code, ssize_t *optlen); ssize_t get_end_option_idx(struct dhcpmsg *packet); -size_t add_option_string(struct dhcpmsg *packet, uint8_t code, char *str, - size_t slen); size_t add_option_request_list(struct dhcpmsg *packet); + void add_option_msgtype(struct dhcpmsg *packet, uint8_t type); void add_option_reqip(struct dhcpmsg *packet, uint32_t ip); void add_option_maxsize(struct dhcpmsg *packet); void add_option_serverid(struct dhcpmsg *packet, uint32_t sid); +void add_option_vendor(struct dhcpmsg *packet); +void add_option_clientid(struct dhcpmsg *packet); +void add_option_hostname(struct dhcpmsg *packet); #endif