summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2014-03-19 13:53:02 +0200
committerPatrik Flykt <patrik.flykt@linux.intel.com>2014-03-20 10:54:31 +0200
commit715c6a9acd6ce4cce4fdfe8a62a32dc8f552e1d7 (patch)
treea17186e2588ea2148453fd44be2d40d48b312538
parentf1b2c3eccb5ca2cbf97bb14b735fef5784bf3a90 (diff)
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.
-rw-r--r--src/libsystemd-network/sd-dhcp-client.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index ce375dd016..1a57939bbf 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;