Zbigniew Jędrzejewski-Szmek 62fe94
From ebe207d4acf38165adbc45298662982eecdb9e9f Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: Tom Gundersen <teg@jklm.no>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Thu, 2 Oct 2014 16:04:20 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] sd-dhcp6: specify the type explicitly when setting custom
Zbigniew Jędrzejewski-Szmek 62fe94
 DUID
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
This would make it simple to verify that the data is on the right format when
Zbigniew Jędrzejewski-Szmek 62fe94
the type is known.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/libsystemd-network/sd-dhcp6-client.c | 33 +++++++++++++++++---------------
Zbigniew Jędrzejewski-Szmek 62fe94
 src/systemd/sd-dhcp6-client.h            |  2 +-
Zbigniew Jędrzejewski-Szmek 62fe94
 2 files changed, 19 insertions(+), 16 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c
Zbigniew Jędrzejewski-Szmek 62fe94
index ad6c5eb4d8..42ad41887d 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/libsystemd-network/sd-dhcp6-client.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/libsystemd-network/sd-dhcp6-client.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -67,7 +67,17 @@ struct sd_dhcp6_client {
Zbigniew Jędrzejewski-Szmek 62fe94
         sd_event_source *timeout_resend_expire;
Zbigniew Jędrzejewski-Szmek 62fe94
         sd_dhcp6_client_cb_t cb;
Zbigniew Jędrzejewski-Szmek 62fe94
         void *userdata;
Zbigniew Jędrzejewski-Szmek 62fe94
-        uint8_t duid[MAX_DUID_LEN];
Zbigniew Jędrzejewski-Szmek 62fe94
+        union {
Zbigniew Jędrzejewski-Szmek 62fe94
+                struct {
Zbigniew Jędrzejewski-Szmek 62fe94
+                        uint16_t type; /* DHCP6_DUID_EN */
Zbigniew Jędrzejewski-Szmek 62fe94
+                        uint32_t pen;
Zbigniew Jędrzejewski-Szmek 62fe94
+                        uint8_t id[8];
Zbigniew Jędrzejewski-Szmek 62fe94
+                } _packed_ en;
Zbigniew Jędrzejewski-Szmek 62fe94
+                struct {
Zbigniew Jędrzejewski-Szmek 62fe94
+                        uint16_t type;
Zbigniew Jędrzejewski-Szmek 62fe94
+                        uint8_t data[MAX_DUID_LEN];
Zbigniew Jędrzejewski-Szmek 62fe94
+                } _packed_ raw;
Zbigniew Jędrzejewski-Szmek 62fe94
+        } duid;
Zbigniew Jędrzejewski-Szmek 62fe94
         size_t duid_len;
Zbigniew Jędrzejewski-Szmek 62fe94
 };
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -148,14 +158,15 @@ int sd_dhcp6_client_set_mac(sd_dhcp6_client *client,
Zbigniew Jędrzejewski-Szmek 62fe94
         return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, uint8_t *duid,
Zbigniew Jędrzejewski-Szmek 62fe94
+int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, uint16_t type, uint8_t *duid,
Zbigniew Jędrzejewski-Szmek 62fe94
                              size_t duid_len)
Zbigniew Jędrzejewski-Szmek 62fe94
 {
Zbigniew Jędrzejewski-Szmek 62fe94
         assert_return(client, -EINVAL);
Zbigniew Jędrzejewski-Szmek 62fe94
         assert_return(duid, -EINVAL);
Zbigniew Jędrzejewski-Szmek 62fe94
         assert_return(duid_len > 0 && duid_len <= MAX_DUID_LEN, -EINVAL);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        memcpy(&client->duid, duid, duid_len);
Zbigniew Jędrzejewski-Szmek 62fe94
+        client->duid.raw.type = htobe16(type);
Zbigniew Jędrzejewski-Szmek 62fe94
+        memcpy(&client->duid.raw.data, duid, duid_len);
Zbigniew Jędrzejewski-Szmek 62fe94
         client->duid_len = duid_len;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1130,16 +1141,9 @@ sd_dhcp6_client *sd_dhcp6_client_unref(sd_dhcp6_client *client) {
Zbigniew Jędrzejewski-Szmek 62fe94
         return client;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-struct duid_en {
Zbigniew Jędrzejewski-Szmek 62fe94
-        uint16_t type; /* DHCP6_DUID_EN */
Zbigniew Jędrzejewski-Szmek 62fe94
-        uint32_t pen;
Zbigniew Jędrzejewski-Szmek 62fe94
-        uint8_t id[8];
Zbigniew Jędrzejewski-Szmek 62fe94
-} _packed_;
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
 int sd_dhcp6_client_new(sd_dhcp6_client **ret)
Zbigniew Jędrzejewski-Szmek 62fe94
 {
Zbigniew Jędrzejewski-Szmek 62fe94
         _cleanup_dhcp6_client_unref_ sd_dhcp6_client *client = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
-        struct duid_en *duid;
Zbigniew Jędrzejewski-Szmek 62fe94
         sd_id128_t machine_id;
Zbigniew Jędrzejewski-Szmek 62fe94
         int r;
Zbigniew Jędrzejewski-Szmek 62fe94
         size_t t;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1159,9 +1163,9 @@ int sd_dhcp6_client_new(sd_dhcp6_client **ret)
Zbigniew Jędrzejewski-Szmek 62fe94
         client->fd = -1;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         /* initialize DUID */
Zbigniew Jędrzejewski-Szmek 62fe94
-        duid = (struct duid_en *) &client->duid;
Zbigniew Jędrzejewski-Szmek 62fe94
-        duid->type = htobe16(DHCP6_DUID_EN);
Zbigniew Jędrzejewski-Szmek 62fe94
-        duid->pen = htobe32(SYSTEMD_PEN);
Zbigniew Jędrzejewski-Szmek 62fe94
+        client->duid.en.type = htobe16(DHCP6_DUID_EN);
Zbigniew Jędrzejewski-Szmek 62fe94
+        client->duid.en.pen = htobe32(SYSTEMD_PEN);
Zbigniew Jędrzejewski-Szmek 62fe94
+        client->duid_len = sizeof(client->duid.en);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         r = sd_id128_get_machine(&machine_id);
Zbigniew Jędrzejewski-Szmek 62fe94
         if (r < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -1169,8 +1173,7 @@ int sd_dhcp6_client_new(sd_dhcp6_client **ret)
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         /* a bit of snake-oil perhaps, but no need to expose the machine-id
Zbigniew Jędrzejewski-Szmek 62fe94
            directly */
Zbigniew Jędrzejewski-Szmek 62fe94
-        siphash24(duid->id, &machine_id, sizeof(machine_id), HASH_KEY.bytes);
Zbigniew Jędrzejewski-Szmek 62fe94
-        client->duid_len = sizeof (struct duid_en);
Zbigniew Jędrzejewski-Szmek 62fe94
+        siphash24(client->duid.en.id, &machine_id, sizeof(machine_id), HASH_KEY.bytes);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         client->req_opts_len = ELEMENTSOF(default_req_opts);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/systemd/sd-dhcp6-client.h b/src/systemd/sd-dhcp6-client.h
Zbigniew Jędrzejewski-Szmek 62fe94
index 7b7f098b0c..a4409e8d4e 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/systemd/sd-dhcp6-client.h
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/systemd/sd-dhcp6-client.h
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -45,7 +45,7 @@ int sd_dhcp6_client_set_callback(sd_dhcp6_client *client,
Zbigniew Jędrzejewski-Szmek 62fe94
 int sd_dhcp6_client_set_index(sd_dhcp6_client *client, int interface_index);
Zbigniew Jędrzejewski-Szmek 62fe94
 int sd_dhcp6_client_set_mac(sd_dhcp6_client *client,
Zbigniew Jędrzejewski-Szmek 62fe94
                             const struct ether_addr *mac_addr);
Zbigniew Jędrzejewski-Szmek 62fe94
-int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, uint8_t *duid,
Zbigniew Jędrzejewski-Szmek 62fe94
+int sd_dhcp6_client_set_duid(sd_dhcp6_client *client, uint16_t type, uint8_t *duid,
Zbigniew Jędrzejewski-Szmek 62fe94
                              size_t duid_len);
Zbigniew Jędrzejewski-Szmek 62fe94
 int sd_dhcp6_client_set_request_option(sd_dhcp6_client *client,
Zbigniew Jędrzejewski-Szmek 62fe94
                                        uint16_t option);