dhcp: move nm_utils_dhcp_client_id_mac() to "nm-core-utils.c"

We will need it outside of "src/devices/nm-device.c".
This commit is contained in:
Thomas Haller 2018-12-20 08:38:05 +01:00
parent 3bce451c60
commit 2ef9a089eb
3 changed files with 86 additions and 53 deletions

View file

@ -7457,53 +7457,6 @@ get_dhcp_timeout (NMDevice *self, int addr_family)
return timeout ?: NM_DHCP_TIMEOUT_DEFAULT;
}
static void
_ASSERT_arp_type (guint16 arp_type,
const guint8 *hwaddr,
gsize hwaddr_len)
{
/* we actually only support ethernet and infiniband below. Assert that
* the arp-type and the address length correspond. */
nm_assert (NM_IN_SET (arp_type, ARPHRD_ETHER, ARPHRD_INFINIBAND));
nm_assert (arp_type <= 255);
nm_assert (hwaddr_len > 0);
nm_assert (arp_type != ARPHRD_ETHER || hwaddr_len == ETH_ALEN);
nm_assert (arp_type != ARPHRD_INFINIBAND || hwaddr_len == INFINIBAND_ALEN);
nm_assert (hwaddr);
}
static void
_hwaddr_get_relevant_part (guint16 arp_type,
const guint8 **hwaddr,
gsize *hwaddr_len)
{
nm_assert (hwaddr);
nm_assert (hwaddr_len);
_ASSERT_arp_type (arp_type, *hwaddr, *hwaddr_len);
/* for infiniband, we only consider the last 8 bytes. */
if (arp_type == ARPHRD_INFINIBAND) {
*hwaddr += (INFINIBAND_ALEN - 8);
*hwaddr_len = 8;
}
}
static GBytes *
dhcp4_get_client_id_mac (guint16 arp_type,
const guint8 *hwaddr,
gsize hwaddr_len)
{
guint8 *client_id_buf;
const guint8 hwaddr_type = arp_type;
_hwaddr_get_relevant_part (arp_type, &hwaddr, &hwaddr_len);
client_id_buf = g_malloc (hwaddr_len + 1);
client_id_buf[0] = hwaddr_type;
memcpy (&client_id_buf[1], hwaddr, hwaddr_len);
return g_bytes_new_take (client_id_buf, hwaddr_len + 1);
}
static GBytes *
dhcp4_get_client_id (NMDevice *self,
NMConnection *connection,
@ -7553,7 +7506,7 @@ dhcp4_get_client_id (NMDevice *self,
goto out_fail;
}
result = dhcp4_get_client_id_mac ((guint16) arp_type, hwaddr_bin, hwaddr_len);
result = nm_utils_dhcp_client_id_mac (arp_type, hwaddr_bin, hwaddr_len);
goto out_good;
}
@ -7575,7 +7528,7 @@ dhcp4_get_client_id (NMDevice *self,
goto out_fail;
}
result = dhcp4_get_client_id_mac ((guint16) arp_type, hwaddr_bin_buf, hwaddr_len);
result = nm_utils_dhcp_client_id_mac (arp_type, hwaddr_bin_buf, hwaddr_len);
goto out_good;
}
@ -8230,7 +8183,7 @@ dhcp6_prefix_delegated (NMDhcpClient *client,
#define EPOCH_DATETIME_200001010000 946684800
static GBytes *
generate_duid_llt (guint16 arp_type,
generate_duid_llt (int arp_type,
const guint8 *hwaddr,
gsize hwaddr_len,
gint64 time)
@ -8240,7 +8193,8 @@ generate_duid_llt (guint16 arp_type,
const guint16 hw_type = htons (arp_type);
const guint32 duid_time = htonl (NM_MAX (0, time - EPOCH_DATETIME_200001010000));
_hwaddr_get_relevant_part (arp_type, &hwaddr, &hwaddr_len);
if (!nm_utils_arp_type_get_hwaddr_relevant_part (arp_type, &hwaddr, &hwaddr_len))
nm_assert_not_reached ();
arr = g_new (guint8, 2 + 2 + 4 + hwaddr_len);
@ -8253,7 +8207,7 @@ generate_duid_llt (guint16 arp_type,
}
static GBytes *
generate_duid_ll (guint16 arp_type,
generate_duid_ll (int arp_type,
const guint8 *hwaddr,
gsize hwaddr_len)
{
@ -8261,7 +8215,8 @@ generate_duid_ll (guint16 arp_type,
const guint16 duid_type = htons (3);
const guint16 hw_type = htons (arp_type);
_hwaddr_get_relevant_part (arp_type, &hwaddr, &hwaddr_len);
if (!nm_utils_arp_type_get_hwaddr_relevant_part (arp_type, &hwaddr, &hwaddr_len))
nm_assert_not_reached ();
arr = g_new (guint8, 2 + 2 + hwaddr_len);

View file

@ -2867,6 +2867,51 @@ nm_utils_arp_type_detect_from_hwaddrlen (gsize hwaddr_len)
}
}
gboolean
nm_utils_arp_type_validate_hwaddr (int arp_type,
const guint8 *hwaddr,
gsize hwaddr_len)
{
if (!hwaddr)
return FALSE;
if (arp_type == ARPHRD_ETHER) {
G_STATIC_ASSERT (ARPHRD_ETHER >= 0 && ARPHRD_ETHER <= 0xFF);
if (hwaddr_len != ETH_ALEN)
return FALSE;
} else if (arp_type == ARPHRD_INFINIBAND) {
G_STATIC_ASSERT (ARPHRD_INFINIBAND >= 0 && ARPHRD_INFINIBAND <= 0xFF);
if (hwaddr_len != INFINIBAND_ALEN)
return FALSE;
} else
return FALSE;
nm_assert (arp_type == nm_utils_arp_type_detect_from_hwaddrlen (hwaddr_len));
return TRUE;
}
gboolean
nm_utils_arp_type_get_hwaddr_relevant_part (int arp_type,
const guint8 **hwaddr,
gsize *hwaddr_len)
{
g_return_val_if_fail ( hwaddr
&& hwaddr_len
&& nm_utils_arp_type_validate_hwaddr (arp_type, *hwaddr, *hwaddr_len),
FALSE);
/* for infiniband, we only consider the last 8 bytes. */
if (arp_type == ARPHRD_INFINIBAND) {
*hwaddr += (INFINIBAND_ALEN - 8);
*hwaddr_len = 8;
}
return TRUE;
}
/*****************************************************************************/
/* Returns the "u" (universal/local) bit value for a Modified EUI-64 */
static gboolean
get_gre_eui64_u_bit (guint32 addr)
@ -3514,6 +3559,23 @@ nm_utils_hw_addr_gen_stable_eth (NMUtilsStableType stable_type,
/*****************************************************************************/
GBytes *
nm_utils_dhcp_client_id_mac (int arp_type,
const guint8 *hwaddr,
gsize hwaddr_len)
{
guint8 *client_id_buf;
const guint8 hwaddr_type = arp_type;
if (!nm_utils_arp_type_get_hwaddr_relevant_part (arp_type, &hwaddr, &hwaddr_len))
g_return_val_if_reached (NULL);
client_id_buf = g_malloc (hwaddr_len + 1);
client_id_buf[0] = hwaddr_type;
memcpy (&client_id_buf[1], hwaddr, hwaddr_len);
return g_bytes_new_take (client_id_buf, hwaddr_len + 1);
}
#define HASH_KEY ((const guint8[16]) { 0x80, 0x11, 0x8c, 0xc2, 0xfe, 0x4a, 0x03, 0xee, 0x3e, 0xd6, 0x0c, 0x6f, 0x36, 0x39, 0x14, 0x09 })
/**

View file

@ -279,8 +279,20 @@ 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_arp_type_detect_from_hwaddrlen (gsize hwaddr_len);
gboolean nm_utils_arp_type_validate_hwaddr (int arp_type,
const guint8 *hwaddr,
gsize hwaddr_len);
gboolean nm_utils_arp_type_get_hwaddr_relevant_part (int arp_type,
const guint8 **hwaddr,
gsize *hwaddr_len);
/*****************************************************************************/
/* IPv6 Interface Identifier helpers */
/**
@ -375,6 +387,10 @@ char *nm_utils_hw_addr_gen_stable_eth (NMUtilsStableType stable_type,
/*****************************************************************************/
GBytes *nm_utils_dhcp_client_id_mac (int arp_type,
const guint8 *hwaddr,
gsize hwaddr_len);
guint32 nm_utils_create_dhcp_iaid (gboolean legacy_unstable_byteorder,
const guint8 *interface_id,
gsize interface_id_len);