about summary refs log tree commit diff
path: root/src/devices/nm-device-ethernet.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/nm-device-ethernet.c')
-rw-r--r--src/devices/nm-device-ethernet.c130
1 files changed, 56 insertions, 74 deletions
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index 0fb8fea4..a9a9f968 100644
--- a/src/devices/nm-device-ethernet.c
+++ b/src/devices/nm-device-ethernet.c
@@ -343,21 +343,23 @@ match_subchans (NMDeviceEthernet *self, NMSettingWired *s_wired, gboolean *try_m
 }
 
 static gboolean
-check_connection_compatible (NMDevice *device, NMConnection *connection, GError **error)
+check_connection_compatible (NMDevice *device, NMConnection *connection)
 {
 	NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device);
 	NMSettingWired *s_wired;
 
-	if (!NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->check_connection_compatible (device, connection, error))
+	if (!NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->check_connection_compatible (device, connection))
 		return FALSE;
 
+	s_wired = nm_connection_get_setting_wired (connection);
+
 	if (nm_connection_is_type (connection, NM_SETTING_PPPOE_SETTING_NAME)) {
-		s_wired = nm_connection_get_setting_wired (connection);
-	} else {
-		s_wired = _nm_connection_check_main_setting (connection, NM_SETTING_WIRED_SETTING_NAME, error);
+		/* NOP */
+	} else if (nm_connection_is_type (connection, NM_SETTING_WIRED_SETTING_NAME)) {
 		if (!s_wired)
 			return FALSE;
-	}
+	} else
+		return FALSE;
 
 	if (s_wired) {
 		const char *mac, *perm_hw_addr;
@@ -365,43 +367,28 @@ check_connection_compatible (NMDevice *device, NMConnection *connection, GError
 		const char * const *mac_blacklist;
 		int i;
 
-		if (!match_subchans (self, s_wired, &try_mac)) {
-			nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
-			                            "s390 subchannels don't match");
+		if (!match_subchans (self, s_wired, &try_mac))
 			return FALSE;
-		}
 
 		perm_hw_addr = nm_device_get_permanent_hw_address (device);
 		mac = nm_setting_wired_get_mac_address (s_wired);
 		if (perm_hw_addr) {
-			if (   try_mac
-			    && mac
-			    && !nm_utils_hwaddr_matches (mac, -1, perm_hw_addr, -1)) {
-				nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
-				                            "permanent MAC address doesn't match");
+			if (try_mac && mac && !nm_utils_hwaddr_matches (mac, -1, perm_hw_addr, -1))
 				return FALSE;
-			}
 
 			/* Check for MAC address blacklist */
 			mac_blacklist = nm_setting_wired_get_mac_address_blacklist (s_wired);
 			for (i = 0; mac_blacklist[i]; i++) {
 				if (!nm_utils_hwaddr_valid (mac_blacklist[i], ETH_ALEN)) {
-					nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
-					                            "invalid MAC in blacklist");
+					g_warn_if_reached ();
 					return FALSE;
 				}
 
-				if (nm_utils_hwaddr_matches (mac_blacklist[i], -1, perm_hw_addr, -1)) {
-					nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
-					                            "permanent MAC address of device blacklisted");
+				if (nm_utils_hwaddr_matches (mac_blacklist[i], -1, perm_hw_addr, -1))
 					return FALSE;
-				}
 			}
-		} else if (mac) {
-			nm_utils_error_set_literal (error, NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
-			                            "device has no permanent MAC address to match");
+		} else if (mac)
 			return FALSE;
-		}
 	}
 
 	return TRUE;
@@ -1198,6 +1185,7 @@ wake_on_lan_enable (NMDevice *device)
 	NMSettingWiredWakeOnLan wol;
 	NMSettingWired *s_wired;
 	const char *password = NULL;
+	gs_free char *value = NULL;
 
 	s_wired = (NMSettingWired *) nm_device_get_applied_setting (device, NM_TYPE_SETTING_WIRED);
 	if (s_wired) {
@@ -1207,25 +1195,27 @@ wake_on_lan_enable (NMDevice *device)
 			goto found;
 	}
 
-	wol = nm_config_data_get_connection_default_int64 (NM_CONFIG_GET_DATA,
-	                                                   "ethernet.wake-on-lan",
-	                                                   device,
-	                                                   NM_SETTING_WIRED_WAKE_ON_LAN_NONE,
-	                                                   G_MAXINT32,
-	                                                   NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT);
-
-	if (   NM_FLAGS_ANY (wol, NM_SETTING_WIRED_WAKE_ON_LAN_EXCLUSIVE_FLAGS)
-	    && !nm_utils_is_power_of_two (wol)) {
-		nm_log_dbg (LOGD_ETHER, "invalid default value %u for wake-on-lan", (guint) wol);
-		wol = NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT;
+	value = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
+	                                               "ethernet.wake-on-lan",
+	                                               device);
+
+	if (value) {
+		wol = _nm_utils_ascii_str_to_int64 (value, 10,
+		                                    NM_SETTING_WIRED_WAKE_ON_LAN_NONE,
+		                                    G_MAXINT32,
+		                                    NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT);
+
+		if (   NM_FLAGS_ANY (wol, NM_SETTING_WIRED_WAKE_ON_LAN_EXCLUSIVE_FLAGS)
+		    && !nm_utils_is_power_of_two (wol)) {
+			nm_log_dbg (LOGD_ETHER, "invalid default value %u for wake-on-lan", (guint) wol);
+			wol = NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT;
+		}
+		if (wol != NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT)
+			goto found;
 	}
-	if (wol != NM_SETTING_WIRED_WAKE_ON_LAN_DEFAULT)
-		goto found;
 	wol = NM_SETTING_WIRED_WAKE_ON_LAN_IGNORE;
 found:
-	return nm_platform_ethtool_set_wake_on_lan (nm_device_get_platform (device),
-	                                            nm_device_get_ifindex (device),
-	                                            wol, password);
+	return nm_platform_ethtool_set_wake_on_lan (nm_device_get_platform (device), nm_device_get_ifindex (device), wol, password);
 }
 
 /*****************************************************************************/
@@ -1440,14 +1430,12 @@ new_default_connection (NMDevice *self)
 	NMConnection *connection;
 	NMSettingsConnection *const*connections;
 	NMSetting *setting;
-	gs_unref_hashtable GHashTable *existing_ids = NULL;
 	struct udev_device *dev;
 	const char *perm_hw_addr;
 	const char *uprop = "0";
 	gs_free char *defname = NULL;
 	gs_free char *uuid = NULL;
 	gs_free char *machine_id = NULL;
-	guint i, n_connections;
 
 	if (nm_config_get_no_auto_default_for_device (nm_config_get (), self))
 		return NULL;
@@ -1460,13 +1448,8 @@ new_default_connection (NMDevice *self)
 	setting = nm_setting_connection_new ();
 	nm_connection_add_setting (connection, setting);
 
-	connections = nm_settings_get_connections (nm_device_get_settings (self), &n_connections);
-	if (n_connections > 0) {
-		existing_ids = g_hash_table_new (nm_str_hash, g_str_equal);
-		for (i = 0; i < n_connections; i++)
-			g_hash_table_add (existing_ids, (char *) nm_settings_connection_get_id (connections[i]));
-	}
-	defname = nm_device_ethernet_utils_get_default_wired_name (existing_ids);
+	connections = nm_settings_get_connections (nm_device_get_settings (self), NULL);
+	defname = nm_device_ethernet_utils_get_default_wired_name ((NMConnection *const*) connections);
 	if (!defname)
 		return NULL;
 
@@ -1767,10 +1750,12 @@ nm_device_ethernet_class_init (NMDeviceEthernetClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (klass);
-	NMDeviceClass *device_class = NM_DEVICE_CLASS (klass);
+	NMDeviceClass *parent_class = NM_DEVICE_CLASS (klass);
 
 	g_type_class_add_private (object_class, sizeof (NMDeviceEthernetPrivate));
 
+	NM_DEVICE_CLASS_DECLARE_TYPES (klass, NM_SETTING_WIRED_SETTING_NAME, NM_LINK_TYPE_ETHERNET)
+
 	object_class->dispose = dispose;
 	object_class->finalize = finalize;
 	object_class->get_property = get_property;
@@ -1778,28 +1763,25 @@ nm_device_ethernet_class_init (NMDeviceEthernetClass *klass)
 
 	dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_device_wired);
 
-	device_class->connection_type_supported = NM_SETTING_WIRED_SETTING_NAME;
-	device_class->link_types = NM_DEVICE_DEFINE_LINK_TYPES (NM_LINK_TYPE_ETHERNET);
-
-	device_class->get_generic_capabilities = get_generic_capabilities;
-	device_class->check_connection_compatible = check_connection_compatible;
-	device_class->complete_connection = complete_connection;
-	device_class->new_default_connection = new_default_connection;
-
-	device_class->act_stage1_prepare = act_stage1_prepare;
-	device_class->act_stage2_config = act_stage2_config;
-	device_class->act_stage3_ip4_config_start = act_stage3_ip4_config_start;
-	device_class->get_configured_mtu = get_configured_mtu;
-	device_class->deactivate = deactivate;
-	device_class->get_s390_subchannels = get_s390_subchannels;
-	device_class->update_connection = update_connection;
-	device_class->carrier_changed_notify = carrier_changed_notify;
-	device_class->link_changed = link_changed;
-	device_class->is_available = is_available;
-	device_class->can_reapply_change = can_reapply_change;
-	device_class->reapply_connection = reapply_connection;
-
-	device_class->state_changed = device_state_changed;
+	parent_class->get_generic_capabilities = get_generic_capabilities;
+	parent_class->check_connection_compatible = check_connection_compatible;
+	parent_class->complete_connection = complete_connection;
+	parent_class->new_default_connection = new_default_connection;
+
+	parent_class->act_stage1_prepare = act_stage1_prepare;
+	parent_class->act_stage2_config = act_stage2_config;
+	parent_class->act_stage3_ip4_config_start = act_stage3_ip4_config_start;
+	parent_class->get_configured_mtu = get_configured_mtu;
+	parent_class->deactivate = deactivate;
+	parent_class->get_s390_subchannels = get_s390_subchannels;
+	parent_class->update_connection = update_connection;
+	parent_class->carrier_changed_notify = carrier_changed_notify;
+	parent_class->link_changed = link_changed;
+	parent_class->is_available = is_available;
+	parent_class->can_reapply_change = can_reapply_change;
+	parent_class->reapply_connection = reapply_connection;
+
+	parent_class->state_changed = device_state_changed;
 
 	obj_properties[PROP_SPEED] =
 	    g_param_spec_uint (NM_DEVICE_ETHERNET_SPEED, "", "",