|
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);
|