From 17e7eba7a35e419a8654df19cc170df236c0e4ea Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 14 Dec 2018 08:45:09 +0100 Subject: [PATCH] core: add nm_utils_detect_arp_type_from_addrlen() helper and use it in "nm-dhcp-systemd.c". (cherry picked from commit 6e48e99be4fe11e9bf1e2c2a20b1caadb63377d3) --- src/dhcp/nm-dhcp-systemd.c | 25 ++++++------------------- src/nm-core-utils.c | 28 ++++++++++++++++++++++++++++ src/nm-core-utils.h | 2 ++ 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/dhcp/nm-dhcp-systemd.c b/src/dhcp/nm-dhcp-systemd.c index c33de3accd..c35a934da7 100644 --- a/src/dhcp/nm-dhcp-systemd.c +++ b/src/dhcp/nm-dhcp-systemd.c @@ -559,19 +559,6 @@ dhcp_event_cb (sd_dhcp_client *client, int event, gpointer user_data) } } -static guint16 -get_arp_type (gsize hwaddr_len) -{ - switch (hwaddr_len) { - case ETH_ALEN: - return ARPHRD_ETHER; - case INFINIBAND_ALEN: - return ARPHRD_INFINIBAND; - default: - return ARPHRD_NONE; - } -} - static gboolean ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, @@ -585,7 +572,7 @@ ip4_start (NMDhcpClient *client, GBytes *hwaddr; const uint8_t *hwaddr_arr; gsize hwaddr_len; - guint16 arptype; + int arp_type; GBytes *client_id; gs_unref_bytes GBytes *client_id_new = NULL; const uint8_t *client_id_arr; @@ -614,14 +601,14 @@ ip4_start (NMDhcpClient *client, hwaddr = nm_dhcp_client_get_hw_addr (client); if ( !hwaddr || !(hwaddr_arr = g_bytes_get_data (hwaddr, &hwaddr_len)) - || (arptype = get_arp_type (hwaddr_len)) == ARPHRD_NONE) { + || (arp_type = nm_utils_detect_arp_type_from_addrlen (hwaddr_len)) < 0) { nm_utils_error_set_literal (error, NM_UTILS_ERROR_UNKNOWN, "invalid MAC address"); return FALSE; } r = sd_dhcp_client_set_mac (sd_client, hwaddr_arr, hwaddr_len, - arptype); + (guint16) arp_type); if (r < 0) { nm_utils_error_set_errno (error, r, "failed to set MAC address: %s"); return FALSE; @@ -900,7 +887,7 @@ ip6_start (NMDhcpClient *client, GBytes *duid; const uint8_t *hwaddr_arr; gsize hwaddr_len; - guint16 arptype; + int arp_type; g_return_val_if_fail (!priv->client4, FALSE); g_return_val_if_fail (!priv->client6, FALSE); @@ -946,14 +933,14 @@ ip6_start (NMDhcpClient *client, hwaddr = nm_dhcp_client_get_hw_addr (client); if ( !hwaddr || !(hwaddr_arr = g_bytes_get_data (hwaddr, &hwaddr_len)) - || (arptype = get_arp_type (hwaddr_len)) == ARPHRD_NONE) { + || (arp_type = nm_utils_detect_arp_type_from_addrlen (hwaddr_len)) < 0) { nm_utils_error_set_literal (error, NM_UTILS_ERROR_UNKNOWN, "invalid MAC address"); return FALSE; } r = sd_dhcp6_client_set_mac (sd_client, hwaddr_arr, hwaddr_len, - arptype); + (guint16) arp_type); if (r < 0) { nm_utils_error_set_errno (error, r, "failed to set MAC address: %s"); return FALSE; diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index d5e6346de6..34a77bbc98 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include "nm-utils/nm-random-utils.h" @@ -3041,6 +3042,33 @@ nm_utils_boot_id_bin (void) /*****************************************************************************/ +/** + * nm_utils_detect_arp_type_from_addrlen: + * @hwaddr_len: the length of the hardware address in bytes. + * + * Detects the arp-type based on the length of the MAC address. + * On success, this returns a (positive) value in uint16_t range, + * like ARPHRD_ETHER or ARPHRD_INFINIBAND. + * + * On failure, returns a negative error code. + * + * Returns: the arp-type or negative value on error. */ +int +nm_utils_detect_arp_type_from_addrlen (gsize hwaddr_len) +{ + switch (hwaddr_len) { + case ETH_ALEN: + return ARPHRD_ETHER; + case INFINIBAND_ALEN: + return ARPHRD_INFINIBAND; + default: + /* Note: if you ever support anything but ethernet and infiniband, + * make sure to look at all callers. They assert that it's one of + * these two. */ + return -EINVAL; + } +} + /* Returns the "u" (universal/local) bit value for a Modified EUI-64 */ static gboolean get_gre_eui64_u_bit (guint32 addr) diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h index 16ca50b607..bdeb1b6625 100644 --- a/src/nm-core-utils.h +++ b/src/nm-core-utils.h @@ -293,6 +293,8 @@ gboolean nm_utils_host_id_get (const guint8 **out_host_id, gsize *out_host_id_len); gint64 nm_utils_host_id_get_timestamp_ns (void); +int nm_utils_detect_arp_type_from_addrlen (gsize hwaddr_len); + /* IPv6 Interface Identifier helpers */ /**