about summary refs log tree commit diff
path: root/src/nm-device-infiniband.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nm-device-infiniband.c')
-rw-r--r--src/nm-device-infiniband.c74
1 files changed, 34 insertions, 40 deletions
diff --git a/src/nm-device-infiniband.c b/src/nm-device-infiniband.c
index b2915f9e..c7dcf19c 100644
--- a/src/nm-device-infiniband.c
+++ b/src/nm-device-infiniband.c
@@ -44,7 +44,7 @@ G_DEFINE_TYPE (NMDeviceInfiniband, nm_device_infiniband, NM_TYPE_DEVICE_WIRED)
 #define NM_INFINIBAND_ERROR (nm_infiniband_error_quark ())
 
 typedef struct {
-	int dummy;
+	guint8 hw_addr[INFINIBAND_ALEN];
 } NMDeviceInfinibandPrivate;
 
 enum {
@@ -120,21 +120,26 @@ nm_device_infiniband_new (const char *udi,
 	                                  NULL);
 }
 
-
 static void
 update_hw_address (NMDevice *dev)
 {
-	const guint8 *hw_addr;
-	guint8 old_addr[INFINIBAND_ALEN];
-
-	hw_addr = nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (dev));
-	memcpy (old_addr, hw_addr, INFINIBAND_ALEN);
-
-	NM_DEVICE_CLASS (nm_device_infiniband_parent_class)->update_hw_address (dev);
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (dev);
+	gsize addrlen;
+	gboolean changed = FALSE;
+
+	addrlen = nm_device_read_hwaddr (dev, priv->hw_addr, sizeof (priv->hw_addr), &changed);
+	if (addrlen) {
+		g_return_if_fail (addrlen == INFINIBAND_ALEN);
+		if (changed)
+			g_object_notify (G_OBJECT (dev), NM_DEVICE_INFINIBAND_HW_ADDRESS);
+	}
+}
 
-	hw_addr = nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (dev));
-	if (memcmp (old_addr, hw_addr, INFINIBAND_ALEN))
-		g_object_notify (G_OBJECT (dev), NM_DEVICE_INFINIBAND_HW_ADDRESS);
+static const guint8 *
+get_hw_address (NMDevice *device, guint *out_len)
+{
+	*out_len = INFINIBAND_ALEN;
+	return NM_DEVICE_INFINIBAND_GET_PRIVATE (device)->hw_addr;
 }
 
 static guint32
@@ -148,31 +153,25 @@ get_best_auto_connection (NMDevice *dev,
                           GSList *connections,
                           char **specific_object)
 {
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (dev);
 	GSList *iter;
 
 	for (iter = connections; iter; iter = g_slist_next (iter)) {
 		NMConnection *connection = NM_CONNECTION (iter->data);
-		NMSettingConnection *s_con;
 		NMSettingInfiniband *s_infiniband;
 
-		s_con = nm_connection_get_setting_connection (connection);
-		g_assert (s_con);
-
 		if (!nm_connection_is_type (connection, NM_SETTING_INFINIBAND_SETTING_NAME))
 			continue;
-		if (!nm_setting_connection_get_autoconnect (s_con))
-			continue;
 
 		s_infiniband = nm_connection_get_setting_infiniband (connection);
 		if (!s_infiniband)
 			continue;
 
 		if (s_infiniband) {
-			const guint8 *hwaddr = nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (dev));
 			const GByteArray *mac;
 
 			mac = nm_setting_infiniband_get_mac_address (s_infiniband);
-			if (mac && memcmp (mac->data, hwaddr, INFINIBAND_ALEN))
+			if (mac && memcmp (mac->data, priv->hw_addr, INFINIBAND_ALEN))
 				continue;
 		}
 
@@ -249,6 +248,7 @@ check_connection_compatible (NMDevice *device,
                              NMConnection *connection,
                              GError **error)
 {
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (device);
 	NMSettingInfiniband *s_infiniband;
 	const GByteArray *mac;
 
@@ -269,10 +269,8 @@ check_connection_compatible (NMDevice *device,
 	}
 
 	if (s_infiniband) {
-		const guint8 *hwaddr = nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (device));
-
 		mac = nm_setting_infiniband_get_mac_address (s_infiniband);
-		if (mac && memcmp (mac->data, hwaddr, INFINIBAND_ALEN)) {
+		if (mac && memcmp (mac->data, priv->hw_addr, INFINIBAND_ALEN)) {
 			g_set_error (error,
 			             NM_INFINIBAND_ERROR,
 			             NM_INFINIBAND_ERROR_CONNECTION_INCOMPATIBLE,
@@ -291,9 +289,9 @@ complete_connection (NMDevice *device,
                      const GSList *existing_connections,
                      GError **error)
 {
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (device);
 	NMSettingInfiniband *s_infiniband;
 	const GByteArray *setting_mac;
-	const guint8 *hwaddr;
 
 	nm_utils_complete_generic (connection,
 	                           NM_SETTING_INFINIBAND_SETTING_NAME,
@@ -308,11 +306,10 @@ complete_connection (NMDevice *device,
 		nm_connection_add_setting (connection, NM_SETTING (s_infiniband));
 	}
 
-	hwaddr = nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (device));
 	setting_mac = nm_setting_infiniband_get_mac_address (s_infiniband);
 	if (setting_mac) {
 		/* Make sure the setting MAC (if any) matches the device's MAC */
-		if (memcmp (setting_mac->data, hwaddr, INFINIBAND_ALEN)) {
+		if (memcmp (setting_mac->data, priv->hw_addr, INFINIBAND_ALEN)) {
 			g_set_error_literal (error,
 			                     NM_SETTING_INFINIBAND_ERROR,
 			                     NM_SETTING_INFINIBAND_ERROR_INVALID_PROPERTY,
@@ -323,8 +320,8 @@ complete_connection (NMDevice *device,
 		GByteArray *mac;
 
 		/* Lock the connection to this device by default */
-		mac = g_byte_array_sized_new (INFINIBAND_ALEN);
-		g_byte_array_append (mac, hwaddr, INFINIBAND_ALEN);
+		mac = g_byte_array_sized_new (sizeof (priv->hw_addr));
+		g_byte_array_append (mac, priv->hw_addr, sizeof (priv->hw_addr));
 		g_object_set (G_OBJECT (s_infiniband), NM_SETTING_INFINIBAND_MAC_ADDRESS, mac, NULL);
 		g_byte_array_free (mac, TRUE);
 	}
@@ -338,10 +335,11 @@ complete_connection (NMDevice *device,
 static gboolean
 spec_match_list (NMDevice *device, const GSList *specs)
 {
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (device);
 	char *hwaddr;
 	gboolean matched;
 
-	hwaddr = nm_utils_hwaddr_ntoa (nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (device)), ARPHRD_INFINIBAND);
+	hwaddr = nm_utils_hwaddr_ntoa (priv->hw_addr, ARPHRD_INFINIBAND);
 	matched = nm_match_spec_hwaddr (specs, hwaddr);
 	g_free (hwaddr);
 
@@ -351,6 +349,7 @@ spec_match_list (NMDevice *device, const GSList *specs)
 static gboolean
 infiniband_match_config (NMDevice *self, NMConnection *connection)
 {
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (self);
 	NMSettingInfiniband *s_infiniband;
 	const GByteArray *s_mac;
 
@@ -360,7 +359,7 @@ infiniband_match_config (NMDevice *self, NMConnection *connection)
 
 	/* MAC address check */
 	s_mac = nm_setting_infiniband_get_mac_address (s_infiniband);
-	if (s_mac && memcmp (s_mac->data, nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (self)), INFINIBAND_ALEN))
+	if (s_mac && memcmp (s_mac->data, priv->hw_addr, INFINIBAND_ALEN))
 		return FALSE;
 
 	return TRUE;
@@ -403,14 +402,9 @@ hwaddr_matches (NMDevice *device,
                 guint other_hwaddr_len,
                 gboolean fail_if_no_hwaddr)
 {
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (device);
 	NMSettingInfiniband *s_ib;
-	const guint8 *devaddr;
 	const GByteArray *mac = NULL;
-	int devtype;
-
-	devtype = nm_device_wired_get_hwaddr_type (NM_DEVICE_WIRED (device));
-	devaddr = nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (device));
-	g_return_val_if_fail (devaddr != NULL, FALSE);
 
 	s_ib = nm_connection_get_setting_infiniband (connection);
 	if (s_ib)
@@ -422,7 +416,7 @@ hwaddr_matches (NMDevice *device,
 			g_return_val_if_fail (other_hwaddr_len == INFINIBAND_ALEN, FALSE);
 			if (memcmp (mac->data, other_hwaddr, mac->len) == 0)
 				return TRUE;
-		} else if (memcmp (mac->data, devaddr, mac->len) == 0)
+		} else if (memcmp (mac->data, priv->hw_addr, mac->len) == 0)
 			return TRUE;
 	} else if (fail_if_no_hwaddr == FALSE)
 		return TRUE;
@@ -434,12 +428,11 @@ static void
 get_property (GObject *object, guint prop_id,
               GValue *value, GParamSpec *pspec)
 {
-	const guint8 *current_addr;
+	NMDeviceInfinibandPrivate *priv = NM_DEVICE_INFINIBAND_GET_PRIVATE (object);
 
 	switch (prop_id) {
 	case PROP_HW_ADDRESS:
-		current_addr = nm_device_wired_get_hwaddr (NM_DEVICE_WIRED (object));
-		g_value_take_string (value, nm_utils_hwaddr_ntoa (current_addr, ARPHRD_INFINIBAND));
+		g_value_take_string (value, nm_utils_hwaddr_ntoa (priv->hw_addr, ARPHRD_INFINIBAND));
 		break;
 	case PROP_CARRIER:
 		g_value_set_boolean (value, nm_device_wired_get_carrier (NM_DEVICE_WIRED (object)));
@@ -476,6 +469,7 @@ nm_device_infiniband_class_init (NMDeviceInfinibandClass *klass)
 
 	parent_class->get_generic_capabilities = get_generic_capabilities;
 	parent_class->update_hw_address = update_hw_address;
+	parent_class->get_hw_address = get_hw_address;
 	parent_class->get_best_auto_connection = get_best_auto_connection;
 	parent_class->check_connection_compatible = check_connection_compatible;
 	parent_class->complete_connection = complete_connection;