[systemd-commits] 3 commits - src/libsystemd-network

Patrik Flykt pflykt at kemper.freedesktop.org
Thu Mar 20 01:58:15 PDT 2014


 src/libsystemd-network/sd-dhcp-client.c   |   22 +++++++++++++---------
 src/libsystemd-network/test-dhcp-client.c |   17 +++++++++++++++++
 2 files changed, 30 insertions(+), 9 deletions(-)

New commits:
commit d790d3f17325df9004b1a6cc4f5a107d5eeec7d8
Author: Patrik Flykt <patrik.flykt at linux.intel.com>
Date:   Thu Mar 20 10:31:49 2014 +0200

    libsystemd-dhcp: Update client test case for client id and end option
    
    Check that the client identifier is formatted as suggested in the
    RFC and that the messages sent ends with an end option.

diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c
index 1eb4648..ca44cfb 100644
--- a/src/libsystemd-network/test-dhcp-client.c
+++ b/src/libsystemd-network/test-dhcp-client.c
@@ -128,6 +128,17 @@ static void test_checksum(void)
 static int check_options(uint8_t code, uint8_t len, const uint8_t *option,
                 void *user_data)
 {
+        switch(code) {
+        case DHCP_OPTION_CLIENT_IDENTIFIER:
+                assert_se(len == 7);
+                assert_se(option[0] == 0x01);
+                assert_se(memcmp(&option[1], &mac_addr, ETH_ALEN) == 0);
+                break;
+
+        default:
+                break;
+        }
+
         return 0;
 }
 
@@ -370,12 +381,15 @@ static void test_addr_acq_acquired(sd_dhcp_client *client, int event,
 static int test_addr_acq_recv_request(size_t size, DHCPMessage *request)
 {
         uint16_t udp_check = 0;
+        uint8_t *msg_bytes = (uint8_t *)request;
         int res;
 
         res = dhcp_option_parse(request, size, check_options, NULL);
         assert_se(res == DHCP_REQUEST);
         assert_se(xid == request->xid);
 
+        assert_se(msg_bytes[size - 1] == DHCP_OPTION_END);
+
         if (verbose)
                 printf("  recv DHCP Request  0x%08x\n", be32toh(xid));
 
@@ -399,11 +413,14 @@ static int test_addr_acq_recv_request(size_t size, DHCPMessage *request)
 static int test_addr_acq_recv_discover(size_t size, DHCPMessage *discover)
 {
         uint16_t udp_check = 0;
+        uint8_t *msg_bytes = (uint8_t *)discover;
         int res;
 
         res = dhcp_option_parse(discover, size, check_options, NULL);
         assert_se(res == DHCP_DISCOVER);
 
+        assert_se(msg_bytes[size - 1] == DHCP_OPTION_END);
+
         xid = discover->xid;
 
         if (verbose)

commit 9d7bf1d58c2ce7f383f256a5beb1f5fc4ee843f5
Author: Patrik Flykt <patrik.flykt at linux.intel.com>
Date:   Wed Mar 19 14:38:59 2014 +0200

    libsystemd-network: Don't unnecessarily send too long packets
    
    Since the length used by options is known, send packets with no
    extra padding.

diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index 1a57939..9052b84 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -315,7 +315,7 @@ static int client_send_discover(sd_dhcp_client *client, uint16_t secs) {
         if (err < 0)
                 return err;
 
-        err = dhcp_client_send_raw(client, discover, len);
+        err = dhcp_client_send_raw(client, discover, len - optlen);
         if (err < 0)
                 return err;
 
@@ -385,9 +385,9 @@ static int client_send_request(sd_dhcp_client *client, uint16_t secs) {
                                                    client->lease->server_address,
                                                    DHCP_PORT_SERVER,
                                                    &request->dhcp,
-                                                   len - DHCP_IP_UDP_SIZE);
+                                                   len - optlen - DHCP_IP_UDP_SIZE);
         } else {
-                err = dhcp_client_send_raw(client, request, len);
+                err = dhcp_client_send_raw(client, request, len - optlen);
         }
         if (err < 0)
                 return err;

commit 715c6a9acd6ce4cce4fdfe8a62a32dc8f552e1d7
Author: Patrik Flykt <patrik.flykt at linux.intel.com>
Date:   Wed Mar 19 13:53:02 2014 +0200

    libsystemd-network: Prepend hardware type byte to client identifier
    
    Even though client identifiers SHOULD be treated as opaque objects by
    DHCP servers, follow the recommendation of a hardware type field with
    value 0x01 (ethernet) followed by the hardware address as described in
    RFC 2132.

diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index ce375dd..1a57939 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -46,7 +46,10 @@ struct sd_dhcp_client {
         size_t req_opts_allocated;
         size_t req_opts_size;
         be32_t last_addr;
-        struct ether_addr mac_addr;
+        struct {
+                uint8_t type;
+                struct ether_addr mac_addr;
+        } _packed_ client_id;
         uint32_t xid;
         usec_t start_time;
         uint16_t secs;
@@ -152,7 +155,8 @@ int sd_dhcp_client_set_mac(sd_dhcp_client *client,
                         addr->ether_addr_octet[4],
                         addr->ether_addr_octet[5]);
 
-        memcpy(&client->mac_addr, addr, ETH_ALEN);
+        memcpy(&client->client_id.mac_addr, addr, ETH_ALEN);
+        client->client_id.type = 0x01;
 
         return 0;
 }
@@ -233,7 +237,7 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
            refuse to issue an DHCP lease if 'secs' is set to zero */
         message->secs = htobe16(secs);
 
-        memcpy(&message->chaddr, &client->mac_addr, ETH_ALEN);
+        memcpy(&message->chaddr, &client->client_id.mac_addr, ETH_ALEN);
 
         if (client->state == DHCP_STATE_RENEWING ||
             client->state == DHCP_STATE_REBINDING)
@@ -242,7 +246,7 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
         /* Some DHCP servers will refuse to issue an DHCP lease if the Client
            Identifier option is not set */
         r = dhcp_option_append(opt, optlen, DHCP_OPTION_CLIENT_IDENTIFIER,
-                               ETH_ALEN, &client->mac_addr);
+                               sizeof(client->client_id), &client->client_id);
         if (r < 0)
                 return r;
 
@@ -852,8 +856,8 @@ static int client_handle_message(sd_dhcp_client *client, DHCPMessage *message,
                 return 0;
         }
 
-        if (memcmp(&message->chaddr[0], &client->mac_addr.ether_addr_octet,
-                   ETHER_ADDR_LEN)) {
+        if (memcmp(&message->chaddr[0], &client->client_id.mac_addr,
+                   ETH_ALEN)) {
                 log_dhcp_client(client, "received chaddr does not match "
                                 "expected: ignoring");
                 return 0;



More information about the systemd-commits mailing list