From: Yu Watanabe Date: Tue, 2 Aug 2022 06:34:42 +0000 (+0900) Subject: dhcp: make dhcp_identifier_set_iaid() take struct hw_addr_data X-Git-Tag: v252-rc1~494^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b75435db6f1f229ef05ca2cb11a6f0e313169b2;p=thirdparty%2Fsystemd.git dhcp: make dhcp_identifier_set_iaid() take struct hw_addr_data --- diff --git a/src/libsystemd-network/dhcp-identifier.c b/src/libsystemd-network/dhcp-identifier.c index 326b09ac5e2..21048e51c59 100644 --- a/src/libsystemd-network/dhcp-identifier.c +++ b/src/libsystemd-network/dhcp-identifier.c @@ -198,8 +198,7 @@ int dhcp_identifier_set_duid( int dhcp_identifier_set_iaid( int ifindex, - const uint8_t *mac, - size_t mac_len, + const struct hw_addr_data *hw_addr, bool legacy_unstable_byteorder, bool use_mac, void *ret) { @@ -212,6 +211,10 @@ int dhcp_identifier_set_iaid( uint64_t id; int r; + assert(ifindex > 0); + assert(hw_addr); + assert(ret); + if (udev_available() && !use_mac) { /* udev should be around */ @@ -240,7 +243,7 @@ int dhcp_identifier_set_iaid( id = siphash24(name, strlen(name), HASH_KEY.bytes); else /* fall back to MAC address if no predictable name available */ - id = siphash24(mac, mac_len, HASH_KEY.bytes); + id = siphash24(hw_addr->bytes, hw_addr->length, HASH_KEY.bytes); id32 = (id & 0xffffffff) ^ (id >> 32); diff --git a/src/libsystemd-network/dhcp-identifier.h b/src/libsystemd-network/dhcp-identifier.h index 697ba3bfbb0..91c2a3f27a0 100644 --- a/src/libsystemd-network/dhcp-identifier.h +++ b/src/libsystemd-network/dhcp-identifier.h @@ -3,6 +3,7 @@ #include "sd-id128.h" +#include "ether-addr-util.h" #include "macro.h" #include "sparse-endian.h" #include "time-util.h" @@ -67,8 +68,7 @@ int dhcp_identifier_set_duid( size_t *ret_len); int dhcp_identifier_set_iaid( int ifindex, - const uint8_t *mac, - size_t mac_len, + const struct hw_addr_data *hw_addr, bool legacy_unstable_byteorder, bool use_mac, void *ret); diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 8964b6e9e5e..3bae14e317d 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -419,8 +419,7 @@ static int dhcp_client_set_iaid_duid_internal( if (iaid_set) client->client_id.ns.iaid = htobe32(iaid); else { - r = dhcp_identifier_set_iaid(client->ifindex, client->hw_addr.bytes, - client->hw_addr.length, + r = dhcp_identifier_set_iaid(client->ifindex, &client->hw_addr, /* legacy_unstable_byteorder = */ true, /* use_mac = */ client->test_mode, &client->client_id.ns.iaid); @@ -787,7 +786,7 @@ static int client_message_init( client->client_id.type = 255; - r = dhcp_identifier_set_iaid(client->ifindex, client->hw_addr.bytes, client->hw_addr.length, + r = dhcp_identifier_set_iaid(client->ifindex, &client->hw_addr, /* legacy_unstable_byteorder = */ true, /* use_mac = */ client->test_mode, &client->client_id.ns.iaid); diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index abdc4be38cb..6203155f0f2 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -299,7 +299,7 @@ static int client_ensure_iaid(sd_dhcp6_client *client) { if (client->iaid_set) return 0; - r = dhcp_identifier_set_iaid(client->ifindex, client->hw_addr.bytes, client->hw_addr.length, + r = dhcp_identifier_set_iaid(client->ifindex, &client->hw_addr, /* legacy_unstable_byteorder = */ true, /* use_mac = */ client->test_mode, &iaid); diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c index fb86e6c994c..b8585c28849 100644 --- a/src/libsystemd-network/test-dhcp-client.c +++ b/src/libsystemd-network/test-dhcp-client.c @@ -17,14 +17,19 @@ #include "dhcp-identifier.h" #include "dhcp-internal.h" #include "dhcp-protocol.h" +#include "ether-addr-util.h" #include "fd-util.h" #include "random-util.h" #include "tests.h" #include "util.h" -static uint8_t mac_addr[] = {'A', 'B', 'C', '1', '2', '3'}; -static uint8_t bcast_addr[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; - +static struct hw_addr_data hw_addr = { + .length = ETH_ALEN, + .ether = {{ 'A', 'B', 'C', '1', '2', '3' }}, +}, bcast_addr = { + .length = ETH_ALEN, + .ether = {{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}, +}; typedef int (*test_callback_recv_t)(size_t size, DHCPMessage *dhcp); static bool verbose = true; @@ -139,9 +144,9 @@ static void test_dhcp_identifier_set_iaid(void) { uint32_t iaid_legacy; be32_t iaid; - assert_se(dhcp_identifier_set_iaid(42, mac_addr, sizeof(mac_addr), /* legacy = */ true, + assert_se(dhcp_identifier_set_iaid(42, &hw_addr, /* legacy = */ true, /* use_mac = */ true, &iaid_legacy) >= 0); - assert_se(dhcp_identifier_set_iaid(42, mac_addr, sizeof(mac_addr), /* legacy = */ false, + assert_se(dhcp_identifier_set_iaid(42, &hw_addr, /* legacy = */ false, /* use_mac = */ true, &iaid) >= 0); /* we expect, that the MAC address was hashed. The legacy value is in native @@ -164,7 +169,7 @@ static int check_options(uint8_t code, uint8_t len, const void *option, void *us size_t duid_len; assert_se(dhcp_identifier_set_duid_en(/* test_mode = */ true, &duid, &duid_len) >= 0); - assert_se(dhcp_identifier_set_iaid(42, mac_addr, ETH_ALEN, true, /* use_mac = */ true, &iaid) >= 0); + assert_se(dhcp_identifier_set_iaid(42, &hw_addr, /* legacy = */ true, /* use_mac = */ true, &iaid) >= 0); assert_se(len == sizeof(uint8_t) + sizeof(uint32_t) + duid_len); assert_se(len == 19); @@ -217,7 +222,7 @@ int dhcp_network_send_raw_socket(int s, const union sockaddr_union *link, const assert_se(ip_check == 0xffff); assert_se(discover->dhcp.xid); - assert_se(memcmp(discover->dhcp.chaddr, &mac_addr, ETH_ALEN) == 0); + assert_se(memcmp(discover->dhcp.chaddr, hw_addr.bytes, hw_addr.length) == 0); size = len - sizeof(struct iphdr) - sizeof(struct udphdr); @@ -282,7 +287,7 @@ static void test_discover_message(sd_event *e) { assert_se(r >= 0); assert_se(sd_dhcp_client_set_ifindex(client, 42) >= 0); - assert_se(sd_dhcp_client_set_mac(client, mac_addr, bcast_addr, ETH_ALEN, ARPHRD_ETHER) >= 0); + assert_se(sd_dhcp_client_set_mac(client, hw_addr.bytes, bcast_addr.bytes, hw_addr.length, ARPHRD_ETHER) >= 0); dhcp_client_set_test_mode(client, true); assert_se(sd_dhcp_client_set_request_option(client, 248) >= 0); @@ -440,7 +445,7 @@ static int test_addr_acq_recv_request(size_t size, DHCPMessage *request) { memcpy(&test_addr_acq_ack[26], &udp_check, sizeof(udp_check)); memcpy(&test_addr_acq_ack[32], &xid, sizeof(xid)); - memcpy(&test_addr_acq_ack[56], &mac_addr, ETHER_ADDR_LEN); + memcpy(&test_addr_acq_ack[56], hw_addr.bytes, hw_addr.length); callback_recv = NULL; @@ -471,7 +476,7 @@ static int test_addr_acq_recv_discover(size_t size, DHCPMessage *discover) { memcpy(&test_addr_acq_offer[26], &udp_check, sizeof(udp_check)); memcpy(&test_addr_acq_offer[32], &xid, sizeof(xid)); - memcpy(&test_addr_acq_offer[56], &mac_addr, ETHER_ADDR_LEN); + memcpy(&test_addr_acq_offer[56], hw_addr.bytes, hw_addr.length); callback_recv = test_addr_acq_recv_request; @@ -500,7 +505,7 @@ static void test_addr_acq(sd_event *e) { assert_se(r >= 0); assert_se(sd_dhcp_client_set_ifindex(client, 42) >= 0); - assert_se(sd_dhcp_client_set_mac(client, mac_addr, bcast_addr, ETH_ALEN, ARPHRD_ETHER) >= 0); + assert_se(sd_dhcp_client_set_mac(client, hw_addr.bytes, bcast_addr.bytes, hw_addr.length, ARPHRD_ETHER) >= 0); dhcp_client_set_test_mode(client, true); assert_se(sd_dhcp_client_set_callback(client, test_addr_acq_acquired, e) >= 0);