summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-02-14 13:09:23 +0100
committerThomas Haller <thaller@redhat.com>2018-02-15 16:08:00 +0100
commitb0e9856196bc4b321228a586af4f2f7f0e0c7f15 (patch)
treef79a7e0e797086749c272fe9b9dc26f8915e8e9e
parent1f08b01714c9b2cbf476c8cea41290469c6ac4ad (diff)
downloadNetworkManager-b0e9856196bc4b321228a586af4f2f7f0e0c7f15.tar.gz
dhcp: refactor type of NMDhcpClient hwaddr to be GBytes
GByteArray is a mutable array of bytes. For every practical purpose, the hwaddr property of NMDhcpClient is an immutable sequence of bytes. Thus, make it a GBytes.
-rw-r--r--src/devices/nm-device.c43
-rw-r--r--src/dhcp/nm-dhcp-client.c12
-rw-r--r--src/dhcp/nm-dhcp-client.h2
-rw-r--r--src/dhcp/nm-dhcp-manager.c6
-rw-r--r--src/dhcp/nm-dhcp-manager.h4
-rw-r--r--src/dhcp/nm-dhcp-systemd.c37
-rw-r--r--src/nm-iface-helper.c12
-rw-r--r--src/platform/nm-platform.h14
8 files changed, 59 insertions, 71 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index ae64229cda..01ef15b4f6 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -5745,8 +5745,7 @@ ipv4_dad_start (NMDevice *self, NMIP4Config **configs, ArpingCallback cb)
ArpingData *data;
guint timeout;
gboolean ret, addr_found;
- const guint8 *hw_addr;
- size_t hw_addr_len = 0;
+ const guint8 *hwaddr_arr;
GError *error = NULL;
guint i;
@@ -5762,13 +5761,12 @@ ipv4_dad_start (NMDevice *self, NMIP4Config **configs, ArpingCallback cb)
}
timeout = get_ipv4_dad_timeout (self);
- hw_addr = nm_platform_link_get_address (nm_device_get_platform (self),
- nm_device_get_ip_ifindex (self),
- &hw_addr_len);
+ hwaddr_arr = nm_platform_link_get_address (nm_device_get_platform (self),
+ nm_device_get_ip_ifindex (self),
+ NULL);
if ( !timeout
- || !hw_addr
- || !hw_addr_len
+ || !hwaddr_arr
|| !addr_found
|| nm_device_sys_iface_state_is_external_or_assume (self)) {
@@ -6399,9 +6397,7 @@ dhcp4_start (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMSettingIPConfig *s_ip4;
- const guint8 *hw_addr;
- size_t hw_addr_len = 0;
- GByteArray *tmp = NULL;
+ gs_unref_bytes GBytes *hwaddr = NULL;
NMConnection *connection;
connection = nm_device_get_applied_connection (self);
@@ -6413,11 +6409,8 @@ dhcp4_start (NMDevice *self)
nm_exported_object_clear_and_unexport (&priv->dhcp4.config);
priv->dhcp4.config = nm_dhcp4_config_new ();
- hw_addr = nm_platform_link_get_address (nm_device_get_platform (self), nm_device_get_ip_ifindex (self), &hw_addr_len);
- if (hw_addr_len) {
- tmp = g_byte_array_sized_new (hw_addr_len);
- g_byte_array_append (tmp, hw_addr, hw_addr_len);
- }
+ hwaddr = nm_platform_link_get_address_as_bytes (nm_device_get_platform (self),
+ nm_device_get_ip_ifindex (self));
/* Begin DHCP on the interface */
g_warn_if_fail (priv->dhcp4.client == NULL);
@@ -6425,7 +6418,7 @@ dhcp4_start (NMDevice *self)
nm_netns_get_multi_idx (nm_device_get_netns (self)),
nm_device_get_ip_iface (self),
nm_device_get_ip_ifindex (self),
- tmp,
+ hwaddr,
nm_connection_get_uuid (connection),
nm_device_get_route_table (self, AF_INET, TRUE),
nm_device_get_route_metric (self, AF_INET),
@@ -6437,9 +6430,6 @@ dhcp4_start (NMDevice *self)
priv->dhcp_anycast_address,
NULL);
- if (tmp)
- g_byte_array_free (tmp, TRUE);
-
if (!priv->dhcp4.client)
return NM_ACT_STAGE_RETURN_FAILURE;
@@ -7128,9 +7118,7 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMSettingIPConfig *s_ip6;
- GByteArray *tmp = NULL;
- const guint8 *hw_addr;
- size_t hw_addr_len = 0;
+ gs_unref_bytes GBytes *hwaddr = NULL;
const NMPlatformIP6Address *ll_addr = NULL;
g_assert (connection);
@@ -7145,17 +7133,14 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
return FALSE;
}
- hw_addr = nm_platform_link_get_address (nm_device_get_platform (self), nm_device_get_ip_ifindex (self), &hw_addr_len);
- if (hw_addr_len) {
- tmp = g_byte_array_sized_new (hw_addr_len);
- g_byte_array_append (tmp, hw_addr, hw_addr_len);
- }
+ hwaddr = nm_platform_link_get_address_as_bytes (nm_device_get_platform (self),
+ nm_device_get_ip_ifindex (self));
priv->dhcp6.client = nm_dhcp_manager_start_ip6 (nm_dhcp_manager_get (),
nm_device_get_multi_index (self),
nm_device_get_ip_iface (self),
nm_device_get_ip_ifindex (self),
- tmp,
+ hwaddr,
&ll_addr->address,
nm_connection_get_uuid (connection),
nm_device_get_route_table (self, AF_INET6, TRUE),
@@ -7167,8 +7152,6 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
(priv->dhcp6.mode == NM_NDISC_DHCP_LEVEL_OTHERCONF) ? TRUE : FALSE,
nm_setting_ip6_config_get_ip6_privacy (NM_SETTING_IP6_CONFIG (s_ip6)),
priv->dhcp6.needed_prefixes);
- if (tmp)
- g_byte_array_free (tmp, TRUE);
if (priv->dhcp6.client) {
priv->dhcp6.state_sigid = g_signal_connect (priv->dhcp6.client,
diff --git a/src/dhcp/nm-dhcp-client.c b/src/dhcp/nm-dhcp-client.c
index 1fa8cca54c..c758417f63 100644
--- a/src/dhcp/nm-dhcp-client.c
+++ b/src/dhcp/nm-dhcp-client.c
@@ -67,7 +67,7 @@ NM_GOBJECT_PROPERTIES_DEFINE_BASE (
typedef struct _NMDhcpClientPrivate {
NMDedupMultiIndex *multi_idx;
char * iface;
- GByteArray * hwaddr;
+ GBytes * hwaddr;
char * uuid;
GByteArray * duid;
GBytes * client_id;
@@ -147,7 +147,7 @@ nm_dhcp_client_get_duid (NMDhcpClient *self)
return NM_DHCP_CLIENT_GET_PRIVATE (self)->duid;
}
-const GByteArray *
+GBytes *
nm_dhcp_client_get_hw_addr (NMDhcpClient *self)
{
g_return_val_if_fail (NM_IS_DHCP_CLIENT (self), NULL);
@@ -1018,11 +1018,7 @@ dispose (GObject *object)
g_clear_pointer (&priv->hostname, g_free);
g_clear_pointer (&priv->uuid, g_free);
g_clear_pointer (&priv->client_id, g_bytes_unref);
-
- if (priv->hwaddr) {
- g_byte_array_free (priv->hwaddr, TRUE);
- priv->hwaddr = NULL;
- }
+ g_clear_pointer (&priv->hwaddr, g_bytes_unref);
if (priv->duid) {
g_byte_array_free (priv->duid, TRUE);
@@ -1068,7 +1064,7 @@ nm_dhcp_client_class_init (NMDhcpClientClass *client_class)
obj_properties[PROP_HWADDR] =
g_param_spec_boxed (NM_DHCP_CLIENT_HWADDR, "", "",
- G_TYPE_BYTE_ARRAY,
+ G_TYPE_BYTES,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
diff --git a/src/dhcp/nm-dhcp-client.h b/src/dhcp/nm-dhcp-client.h
index f3b731cefc..f1ce933f83 100644
--- a/src/dhcp/nm-dhcp-client.h
+++ b/src/dhcp/nm-dhcp-client.h
@@ -127,7 +127,7 @@ const char *nm_dhcp_client_get_uuid (NMDhcpClient *self);
const GByteArray *nm_dhcp_client_get_duid (NMDhcpClient *self);
-const GByteArray *nm_dhcp_client_get_hw_addr (NMDhcpClient *self);
+GBytes *nm_dhcp_client_get_hw_addr (NMDhcpClient *self);
guint32 nm_dhcp_client_get_route_table (NMDhcpClient *self);
diff --git a/src/dhcp/nm-dhcp-manager.c b/src/dhcp/nm-dhcp-manager.c
index 0fcf1e2c83..fc88f54978 100644
--- a/src/dhcp/nm-dhcp-manager.c
+++ b/src/dhcp/nm-dhcp-manager.c
@@ -158,7 +158,7 @@ client_start (NMDhcpManager *self,
NMDedupMultiIndex *multi_idx,
const char *iface,
int ifindex,
- const GByteArray *hwaddr,
+ GBytes *hwaddr,
const char *uuid,
guint32 route_table,
guint32 route_metric,
@@ -233,7 +233,7 @@ nm_dhcp_manager_start_ip4 (NMDhcpManager *self,
NMDedupMultiIndex *multi_idx,
const char *iface,
int ifindex,
- const GByteArray *hwaddr,
+ GBytes *hwaddr,
const char *uuid,
guint32 route_table,
guint32 route_metric,
@@ -289,7 +289,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
NMDedupMultiIndex *multi_idx,
const char *iface,
int ifindex,
- const GByteArray *hwaddr,
+ GBytes *hwaddr,
const struct in6_addr *ll_addr,
const char *uuid,
guint32 route_table,
diff --git a/src/dhcp/nm-dhcp-manager.h b/src/dhcp/nm-dhcp-manager.h
index 078117ffab..afb13b1d8b 100644
--- a/src/dhcp/nm-dhcp-manager.h
+++ b/src/dhcp/nm-dhcp-manager.h
@@ -49,7 +49,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip4 (NMDhcpManager *manager,
struct _NMDedupMultiIndex *multi_idx,
const char *iface,
int ifindex,
- const GByteArray *hwaddr,
+ GBytes *hwaddr,
const char *uuid,
guint32 route_table,
guint32 route_metric,
@@ -65,7 +65,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip6 (NMDhcpManager *manager,
struct _NMDedupMultiIndex *multi_idx,
const char *iface,
int ifindex,
- const GByteArray *hwaddr,
+ GBytes *hwaddr,
const struct in6_addr *ll_addr,
const char *uuid,
guint32 route_table,
diff --git a/src/dhcp/nm-dhcp-systemd.c b/src/dhcp/nm-dhcp-systemd.c
index a7222e4863..f0ad8c06f0 100644
--- a/src/dhcp/nm-dhcp-systemd.c
+++ b/src/dhcp/nm-dhcp-systemd.c
@@ -583,14 +583,16 @@ dhcp_event_cb (sd_dhcp_client *client, int event, gpointer user_data)
}
static guint16
-get_arp_type (const GByteArray *hwaddr)
+get_arp_type (GBytes *hwaddr)
{
- if (hwaddr->len == ETH_ALEN)
+ switch (g_bytes_get_size (hwaddr)) {
+ case ETH_ALEN:
return ARPHRD_ETHER;
- else if (hwaddr->len == INFINIBAND_ALEN)
+ case INFINIBAND_ALEN:
return ARPHRD_INFINIBAND;
- else
+ default:
return ARPHRD_NONE;
+ }
}
static gboolean
@@ -599,7 +601,7 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
NMDhcpSystemd *self = NM_DHCP_SYSTEMD (client);
NMDhcpSystemdPrivate *priv = NM_DHCP_SYSTEMD_GET_PRIVATE (self);
const char *iface = nm_dhcp_client_get_iface (client);
- const GByteArray *hwaddr;
+ GBytes *hwaddr;
sd_dhcp_lease *lease = NULL;
GBytes *override_client_id;
const uint8_t *client_id = NULL;
@@ -608,7 +610,6 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
const char *hostname;
int r, i;
gboolean success = FALSE;
- guint16 arp_type;
g_assert (priv->client4 == NULL);
g_assert (priv->client6 == NULL);
@@ -632,16 +633,14 @@ ip4_start (NMDhcpClient *client, const char *dhcp_anycast_addr, const char *last
hwaddr = nm_dhcp_client_get_hw_addr (client);
if (hwaddr) {
- arp_type= get_arp_type (hwaddr);
- if (arp_type == ARPHRD_NONE) {
- _LOGW ("failed to determine ARP type");
- goto error;
- }
+ const uint8_t *data;
+ gsize len;
+ data = g_bytes_get_data (hwaddr, &len);
r = sd_dhcp_client_set_mac (priv->client4,
- hwaddr->data,
- hwaddr->len,
- arp_type);
+ data,
+ len,
+ get_arp_type (hwaddr));
if (r < 0) {
_LOGW ("failed to set MAC address (%d)", r);
goto error;
@@ -906,7 +905,7 @@ ip6_start (NMDhcpClient *client,
NMDhcpSystemd *self = NM_DHCP_SYSTEMD (client);
NMDhcpSystemdPrivate *priv = NM_DHCP_SYSTEMD_GET_PRIVATE (self);
const char *iface = nm_dhcp_client_get_iface (client);
- const GByteArray *hwaddr;
+ GBytes *hwaddr;
const char *hostname;
int r, i;
@@ -953,9 +952,13 @@ ip6_start (NMDhcpClient *client,
hwaddr = nm_dhcp_client_get_hw_addr (client);
if (hwaddr) {
+ const uint8_t *data;
+ gsize len;
+
+ data = g_bytes_get_data (hwaddr, &len);
r = sd_dhcp6_client_set_mac (priv->client6,
- hwaddr->data,
- hwaddr->len,
+ data,
+ len,
get_arp_type (hwaddr));
if (r < 0) {
_LOGW ("failed to set MAC address (%d)", r);
diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c
index a7769ab3cd..996b060fd3 100644
--- a/src/nm-iface-helper.c
+++ b/src/nm-iface-helper.c
@@ -340,9 +340,7 @@ main (int argc, char *argv[])
gs_free char *pidfile = NULL;
gs_unref_object NMDhcpClient *dhcp4_client = NULL;
gs_unref_object NMNDisc *ndisc = NULL;
- GByteArray *hwaddr = NULL;
- size_t hwaddr_len = 0;
- gconstpointer tmp;
+ gs_unref_bytes GBytes *hwaddr = NULL;
gs_free NMUtilsIPv6IfaceId *iid = NULL;
guint sd_id;
char sysctl_path_buf[NM_UTILS_SYSCTL_IP_CONF_PATH_BUFSIZE];
@@ -429,11 +427,7 @@ main (int argc, char *argv[])
/* Set up platform interaction layer */
nm_linux_platform_setup ();
- tmp = nm_platform_link_get_address (NM_PLATFORM_GET, gl.ifindex, &hwaddr_len);
- if (tmp) {
- hwaddr = g_byte_array_sized_new (hwaddr_len);
- g_byte_array_append (hwaddr, tmp, hwaddr_len);
- }
+ hwaddr = nm_platform_link_get_address_as_bytes (NM_PLATFORM_GET, gl.ifindex);
if (global_opt.iid_str) {
GBytes *bytes;
@@ -521,8 +515,6 @@ main (int argc, char *argv[])
g_main_loop_run (gl.main_loop);
- g_clear_pointer (&hwaddr, g_byte_array_unref);
-
if (pidfile && wrote_pidfile)
unlink (pidfile);
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index 3cbf8c9990..a545485183 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -1080,7 +1080,21 @@ gboolean nm_platform_link_is_connected (NMPlatform *self, int ifindex);
gboolean nm_platform_link_uses_arp (NMPlatform *self, int ifindex);
guint32 nm_platform_link_get_mtu (NMPlatform *self, int ifindex);
gboolean nm_platform_link_get_user_ipv6ll_enabled (NMPlatform *self, int ifindex);
+
gconstpointer nm_platform_link_get_address (NMPlatform *self, int ifindex, size_t *length);
+
+static inline GBytes *
+nm_platform_link_get_address_as_bytes (NMPlatform *self, int ifindex)
+{
+ gconstpointer p;
+ gsize l;
+
+ p = nm_platform_link_get_address (self, ifindex, &l);
+ return p
+ ? g_bytes_new (p, l)
+ : NULL;
+}
+
int nm_platform_link_get_master (NMPlatform *self, int slave);
gboolean nm_platform_link_can_assume (NMPlatform *self, int ifindex);