core: add nm_utils_detect_arp_type_from_addrlen() helper

and use it in "nm-dhcp-systemd.c".

(cherry picked from commit 6e48e99be4)
This commit is contained in:
Thomas Haller 2018-12-14 08:45:09 +01:00
parent e4fa047126
commit 17e7eba7a3
3 changed files with 36 additions and 19 deletions

View file

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

View file

@ -36,6 +36,7 @@
#include <sys/stat.h>
#include <linux/if.h>
#include <linux/if_infiniband.h>
#include <net/if_arp.h>
#include <net/ethernet.h>
#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)

View file

@ -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 */
/**