mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-08 10:08:05 +02:00
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:
parent
e4fa047126
commit
17e7eba7a3
3 changed files with 36 additions and 19 deletions
|
|
@ -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
|
static gboolean
|
||||||
ip4_start (NMDhcpClient *client,
|
ip4_start (NMDhcpClient *client,
|
||||||
const char *dhcp_anycast_addr,
|
const char *dhcp_anycast_addr,
|
||||||
|
|
@ -585,7 +572,7 @@ ip4_start (NMDhcpClient *client,
|
||||||
GBytes *hwaddr;
|
GBytes *hwaddr;
|
||||||
const uint8_t *hwaddr_arr;
|
const uint8_t *hwaddr_arr;
|
||||||
gsize hwaddr_len;
|
gsize hwaddr_len;
|
||||||
guint16 arptype;
|
int arp_type;
|
||||||
GBytes *client_id;
|
GBytes *client_id;
|
||||||
gs_unref_bytes GBytes *client_id_new = NULL;
|
gs_unref_bytes GBytes *client_id_new = NULL;
|
||||||
const uint8_t *client_id_arr;
|
const uint8_t *client_id_arr;
|
||||||
|
|
@ -614,14 +601,14 @@ ip4_start (NMDhcpClient *client,
|
||||||
hwaddr = nm_dhcp_client_get_hw_addr (client);
|
hwaddr = nm_dhcp_client_get_hw_addr (client);
|
||||||
if ( !hwaddr
|
if ( !hwaddr
|
||||||
|| !(hwaddr_arr = g_bytes_get_data (hwaddr, &hwaddr_len))
|
|| !(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");
|
nm_utils_error_set_literal (error, NM_UTILS_ERROR_UNKNOWN, "invalid MAC address");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
r = sd_dhcp_client_set_mac (sd_client,
|
r = sd_dhcp_client_set_mac (sd_client,
|
||||||
hwaddr_arr,
|
hwaddr_arr,
|
||||||
hwaddr_len,
|
hwaddr_len,
|
||||||
arptype);
|
(guint16) arp_type);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
nm_utils_error_set_errno (error, r, "failed to set MAC address: %s");
|
nm_utils_error_set_errno (error, r, "failed to set MAC address: %s");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
@ -900,7 +887,7 @@ ip6_start (NMDhcpClient *client,
|
||||||
GBytes *duid;
|
GBytes *duid;
|
||||||
const uint8_t *hwaddr_arr;
|
const uint8_t *hwaddr_arr;
|
||||||
gsize hwaddr_len;
|
gsize hwaddr_len;
|
||||||
guint16 arptype;
|
int arp_type;
|
||||||
|
|
||||||
g_return_val_if_fail (!priv->client4, FALSE);
|
g_return_val_if_fail (!priv->client4, FALSE);
|
||||||
g_return_val_if_fail (!priv->client6, 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);
|
hwaddr = nm_dhcp_client_get_hw_addr (client);
|
||||||
if ( !hwaddr
|
if ( !hwaddr
|
||||||
|| !(hwaddr_arr = g_bytes_get_data (hwaddr, &hwaddr_len))
|
|| !(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");
|
nm_utils_error_set_literal (error, NM_UTILS_ERROR_UNKNOWN, "invalid MAC address");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
r = sd_dhcp6_client_set_mac (sd_client,
|
r = sd_dhcp6_client_set_mac (sd_client,
|
||||||
hwaddr_arr,
|
hwaddr_arr,
|
||||||
hwaddr_len,
|
hwaddr_len,
|
||||||
arptype);
|
(guint16) arp_type);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
nm_utils_error_set_errno (error, r, "failed to set MAC address: %s");
|
nm_utils_error_set_errno (error, r, "failed to set MAC address: %s");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/if_infiniband.h>
|
#include <linux/if_infiniband.h>
|
||||||
|
#include <net/if_arp.h>
|
||||||
#include <net/ethernet.h>
|
#include <net/ethernet.h>
|
||||||
|
|
||||||
#include "nm-utils/nm-random-utils.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 */
|
/* Returns the "u" (universal/local) bit value for a Modified EUI-64 */
|
||||||
static gboolean
|
static gboolean
|
||||||
get_gre_eui64_u_bit (guint32 addr)
|
get_gre_eui64_u_bit (guint32 addr)
|
||||||
|
|
|
||||||
|
|
@ -293,6 +293,8 @@ gboolean nm_utils_host_id_get (const guint8 **out_host_id,
|
||||||
gsize *out_host_id_len);
|
gsize *out_host_id_len);
|
||||||
gint64 nm_utils_host_id_get_timestamp_ns (void);
|
gint64 nm_utils_host_id_get_timestamp_ns (void);
|
||||||
|
|
||||||
|
int nm_utils_detect_arp_type_from_addrlen (gsize hwaddr_len);
|
||||||
|
|
||||||
/* IPv6 Interface Identifier helpers */
|
/* IPv6 Interface Identifier helpers */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue