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:
		
							
								
								
									
										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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user