summary refs log tree commit diff
path: root/src/settings/plugins/ifcfg-rh/reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings/plugins/ifcfg-rh/reader.c')
-rw-r--r--src/settings/plugins/ifcfg-rh/reader.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c
index ec874167..72123e66 100644
--- a/src/settings/plugins/ifcfg-rh/reader.c
+++ b/src/settings/plugins/ifcfg-rh/reader.c
@@ -250,6 +250,15 @@ make_connection_setting (const char *file,
 		g_free (value);
 	}
 
+	switch (svTrueValue (ifcfg, "CONNECTION_METERED", -1)) {
+	case TRUE:
+		g_object_set (s_con, NM_SETTING_CONNECTION_METERED, NM_METERED_YES, NULL);
+		break;
+	case FALSE:
+		g_object_set (s_con, NM_SETTING_CONNECTION_METERED, NM_METERED_NO, NULL);
+		break;
+	}
+
 	return NM_SETTING (s_con);
 }
 
@@ -3492,6 +3501,80 @@ wireless_connection_from_ifcfg (const char *file,
 	return connection;
 }
 
+static void
+parse_ethtool_options (shvarFile *ifcfg, NMSettingWired *s_wired, char *value)
+{
+	NMSettingWiredWakeOnLan wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_NONE;
+	gboolean use_password = FALSE;
+	char **words, **iter, *flag;
+
+	if (!value || !value[0])
+		return;
+
+	words = g_strsplit_set (value, " ", 0);
+	iter = words;
+
+	while (iter[0]) {
+		if (g_str_equal (iter[0], "wol") && iter[1] && *iter[1]) {
+			for (flag = iter[1]; *flag; flag++) {
+				switch (*flag) {
+				case 'p':
+					wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_PHY;
+					break;
+				case 'u':
+					wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_UNICAST;
+					break;
+				case 'm':
+					wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_MULTICAST;
+					break;
+				case 'b':
+					wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_BROADCAST;
+					break;
+				case 'a':
+					wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_ARP;
+					break;
+				case 'g':
+					wol_flags |= NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC;
+					break;
+				case 's':
+					use_password = TRUE;
+					break;
+				case 'd':
+					wol_flags = NM_SETTING_WIRED_WAKE_ON_LAN_NONE;
+					use_password = FALSE;
+					break;
+				default:
+					PARSE_WARNING ("unrecognized Wake-on-LAN option '%c'", *flag);
+				}
+			}
+
+			if (!NM_FLAGS_HAS (wol_flags, NM_SETTING_WIRED_WAKE_ON_LAN_MAGIC))
+				use_password = FALSE;
+
+			g_object_set (s_wired, NM_SETTING_WIRED_WAKE_ON_LAN, wol_flags, NULL);
+			iter += 2;
+			continue;
+		}
+
+		if (g_str_equal (iter[0], "sopass") && iter[1] && *iter[1]) {
+			if (use_password) {
+				if (nm_utils_hwaddr_valid (iter[1], ETH_ALEN))
+					g_object_set (s_wired, NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD, iter[1], NULL);
+				else
+					PARSE_WARNING ("Wake-on-LAN password '%s' is invalid", iter[1]);
+			} else
+				PARSE_WARNING ("Wake-on-LAN password not expected");
+			iter += 2;
+			continue;
+		}
+
+		/* Silently skip unknown options */
+		iter++;
+	}
+
+	g_strfreev (words);
+}
+
 static NMSetting *
 make_wired_setting (shvarFile *ifcfg,
                     const char *file,
@@ -3627,6 +3710,10 @@ make_wired_setting (shvarFile *ifcfg,
 		g_free (value);
 	}
 
+	value = svGetValue (ifcfg, "ETHTOOL_OPTS", FALSE);
+	parse_ethtool_options (ifcfg, s_wired, value);
+	g_free (value);
+
 	return (NMSetting *) s_wired;
 
 error: