gdhcp: Use data size specific option setting function
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Thu, 11 Oct 2012 07:11:52 +0000 (10:11 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 11 Oct 2012 13:31:43 +0000 (15:31 +0200)
Instead of using dhcp_add_simple_option() the gdhcp now uses
three functions for setting uint8, uint16 and uint32 values.

gdhcp/client.c
gdhcp/common.c
gdhcp/common.h
gdhcp/server.c

index 7340f3a..b023c6d 100644 (file)
@@ -363,11 +363,11 @@ static int send_discover(GDHCPClient *dhcp_client, uint32_t requested)
        packet.secs = dhcp_attempt_secs(dhcp_client);
 
        if (requested)
-               dhcp_add_simple_option(&packet, DHCP_REQUESTED_IP, requested);
+               dhcp_add_option_uint32(&packet, DHCP_REQUESTED_IP, requested);
 
        /* Explicitly saying that we want RFC-compliant packets helps
         * some buggy DHCP servers to NOT send bigger packets */
-       dhcp_add_simple_option(&packet, DHCP_MAX_SIZE, 576);
+       dhcp_add_option_uint16(&packet, DHCP_MAX_SIZE, 576);
 
        add_request_options(dhcp_client, &packet);
 
@@ -389,9 +389,10 @@ static int send_select(GDHCPClient *dhcp_client)
        packet.xid = dhcp_client->xid;
        packet.secs = dhcp_attempt_secs(dhcp_client);
 
-       dhcp_add_simple_option(&packet, DHCP_REQUESTED_IP,
-                                       dhcp_client->requested_ip);
-       dhcp_add_simple_option(&packet, DHCP_SERVER_ID, dhcp_client->server_ip);
+       dhcp_add_option_uint32(&packet, DHCP_REQUESTED_IP,
+                                               dhcp_client->requested_ip);
+       dhcp_add_option_uint32(&packet, DHCP_SERVER_ID,
+                                               dhcp_client->server_ip);
 
        add_request_options(dhcp_client, &packet);
 
@@ -451,7 +452,7 @@ static int send_release(GDHCPClient *dhcp_client,
        packet.xid = rand();
        packet.ciaddr = htonl(ciaddr);
 
-       dhcp_add_simple_option(&packet, DHCP_SERVER_ID, server);
+       dhcp_add_option_uint32(&packet, DHCP_SERVER_ID, server);
 
        return dhcp_send_kernel_packet(&packet, ciaddr, CLIENT_PORT,
                                                server, SERVER_PORT);
index 55fddcb..ed27e43 100644 (file)
@@ -266,34 +266,69 @@ void dhcpv6_add_binary_option(struct dhcpv6_packet *packet, uint16_t max_len,
        *pkt_len += len;
 }
 
-void dhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code,
-                                                       uint32_t data)
+static GDHCPOptionType check_option(uint8_t code, uint8_t data_len)
 {
-       uint8_t option[6], len;
        GDHCPOptionType type = dhcp_get_code_type(code);
+       uint8_t len;
 
        if (type == OPTION_UNKNOWN)
+               return type;
+
+       len = dhcp_option_lengths[type & OPTION_TYPE_MASK];
+       if (len != data_len) {
+               printf("Invalid option len %d (expecting %d) for code 0x%x\n",
+                       data_len, len, code);
+               return OPTION_UNKNOWN;
+       }
+
+       return type;
+}
+
+void dhcp_add_option_uint32(struct dhcp_packet *packet, uint8_t code,
+                                                       uint32_t data)
+{
+       uint8_t option[6];
+
+       if (check_option(code, sizeof(data)) == OPTION_UNKNOWN)
                return;
 
        option[OPT_CODE] = code;
+       option[OPT_LEN] = sizeof(data);
+       put_be32(data, option + OPT_DATA);
 
-       len = dhcp_option_lengths[type & OPTION_TYPE_MASK];
-       option[OPT_LEN] = len;
-
-       switch (len) {
-       case 1:
-               option[OPT_DATA] = data;
-               break;
-       case 2:
-               put_be16(data, option + OPT_DATA);
-               break;
-       case 4:
-               put_be32(data, option + OPT_DATA);
-               break;
-       default:
-               printf("Invalid option len %d for code 0x%x\n", len, code);
+       dhcp_add_binary_option(packet, option);
+
+       return;
+}
+
+void dhcp_add_option_uint16(struct dhcp_packet *packet, uint8_t code,
+                                                       uint16_t data)
+{
+       uint8_t option[6];
+
+       if (check_option(code, sizeof(data)) == OPTION_UNKNOWN)
                return;
-       }
+
+       option[OPT_CODE] = code;
+       option[OPT_LEN] = sizeof(data);
+       put_be16(data, option + OPT_DATA);
+
+       dhcp_add_binary_option(packet, option);
+
+       return;
+}
+
+void dhcp_add_option_uint8(struct dhcp_packet *packet, uint8_t code,
+                                                       uint8_t data)
+{
+       uint8_t option[6];
+
+       if (check_option(code, sizeof(data)) == OPTION_UNKNOWN)
+               return;
+
+       option[OPT_CODE] = code;
+       option[OPT_LEN] = sizeof(data);
+       option[OPT_DATA] = data;
 
        dhcp_add_binary_option(packet, option);
 
@@ -318,7 +353,7 @@ void dhcp_init_header(struct dhcp_packet *packet, char type)
        packet->cookie = htonl(DHCP_MAGIC);
        packet->options[0] = DHCP_END;
 
-       dhcp_add_simple_option(packet, DHCP_MESSAGE_TYPE, type);
+       dhcp_add_option_uint8(packet, DHCP_MESSAGE_TYPE, type);
 }
 
 void dhcpv6_init_header(struct dhcpv6_packet *packet, uint8_t type)
index e2bfc6c..740eb9c 100644 (file)
@@ -179,7 +179,11 @@ int dhcp_end_option(uint8_t *optionptr);
 void dhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt);
 void dhcpv6_add_binary_option(struct dhcpv6_packet *packet, uint16_t max_len,
                                uint16_t *pkt_len, uint8_t *addopt);
-void dhcp_add_simple_option(struct dhcp_packet *packet,
+void dhcp_add_option_uint8(struct dhcp_packet *packet,
+                               uint8_t code, uint8_t data);
+void dhcp_add_option_uint16(struct dhcp_packet *packet,
+                               uint8_t code, uint16_t data);
+void dhcp_add_option_uint32(struct dhcp_packet *packet,
                                uint8_t code, uint32_t data);
 GDHCPOptionType dhcp_get_code_type(uint8_t code);
 GDHCPOptionType dhcpv6_get_code_type(uint16_t code);
index 2de7db6..0c5f295 100644 (file)
@@ -449,7 +449,8 @@ static void init_packet(GDHCPServer *dhcp_server, struct dhcp_packet *packet,
        packet->flags = client_packet->flags;
        packet->gateway_nip = client_packet->gateway_nip;
        packet->ciaddr = client_packet->ciaddr;
-       dhcp_add_simple_option(packet, DHCP_SERVER_ID, dhcp_server->server_nip);
+       dhcp_add_option_uint32(packet, DHCP_SERVER_ID,
+                                               dhcp_server->server_nip);
 }
 
 static void add_option(gpointer key, gpointer value, gpointer user_data)
@@ -469,7 +470,7 @@ static void add_option(gpointer key, gpointer value, gpointer user_data)
                if (inet_aton(option_value, &nip) == 0)
                        return;
 
-               dhcp_add_simple_option(packet, (uint8_t) option_code,
+               dhcp_add_option_uint32(packet, (uint8_t) option_code,
                                                        ntohl(nip.s_addr));
                break;
        default:
@@ -564,7 +565,7 @@ static void send_offer(GDHCPServer *dhcp_server,
                return;
        }
 
-       dhcp_add_simple_option(&packet, DHCP_LEASE_TIME,
+       dhcp_add_option_uint32(&packet, DHCP_LEASE_TIME,
                                                dhcp_server->lease_seconds);
        add_server_options(dhcp_server, &packet);
 
@@ -600,7 +601,7 @@ static void send_ACK(GDHCPServer *dhcp_server,
 
        lease_time_sec = dhcp_server->lease_seconds;
 
-       dhcp_add_simple_option(&packet, DHCP_LEASE_TIME, lease_time_sec);
+       dhcp_add_option_uint32(&packet, DHCP_LEASE_TIME, lease_time_sec);
 
        add_server_options(dhcp_server, &packet);