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.
This commit is contained in:
parent
286548b754
commit
ea5d472424
39
ndhc/dhcp.c
39
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)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user