summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-10-02 12:25:18 -0500
committerDan Williams <dcbw@redhat.com>2014-10-08 21:55:31 -0500
commit8c48fcf96ce1789c88fdfe963b28b03e50904a88 (patch)
treead14d5659de4c1fa1d507bb001a1639cac8c326d
parent4a6ded1cfdad707dfef54e7b1afa96f0c9412d59 (diff)
downloadNetworkManager-8c48fcf96ce1789c88fdfe963b28b03e50904a88.tar.gz
ifcfg-rh: read and write WiFi bands with BAND keyword
BAND alone will be honored, but CHANNEL will override BAND since CHANNEL almost always implies BAND as well.
-rw-r--r--src/settings/plugins/ifcfg-rh/reader.c36
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am3
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a13
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a-channel-mismatch9
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-bg-channel-mismatch9
-rw-r--r--src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c142
-rw-r--r--src/settings/plugins/ifcfg-rh/writer.c4
7 files changed, 211 insertions, 5 deletions
diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c
index 1fe2595567..80f075a848 100644
--- a/src/settings/plugins/ifcfg-rh/reader.c
+++ b/src/settings/plugins/ifcfg-rh/reader.c
@@ -3268,6 +3268,7 @@ make_wireless_setting (shvarFile *ifcfg,
NMSettingWireless *s_wireless;
GBytes *bytes = NULL;
char *value = NULL;
+ gint64 chan = 0;
s_wireless = NM_SETTING_WIRELESS (nm_setting_wireless_new ());
@@ -3386,22 +3387,47 @@ make_wireless_setting (shvarFile *ifcfg,
value = svGetValue (ifcfg, "CHANNEL", FALSE);
if (value) {
- long int chan;
-
errno = 0;
- chan = strtol (value, NULL, 10);
- if (errno || chan <= 0 || chan > 196) {
+ chan = nm_utils_ascii_str_to_int64 (value, 10, 1, 196, 0);
+ if (errno || (chan == 0)) {
g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
"Invalid wireless channel '%s'", value);
g_free (value);
goto error;
}
g_object_set (s_wireless, NM_SETTING_WIRELESS_CHANNEL, (guint32) chan, NULL);
+ g_free (value);
+ }
+
+ value = svGetValue (ifcfg, "BAND", FALSE);
+ if (value) {
+ if (!strcmp (value, "a")) {
+ if (chan && chan <= 14) {
+ g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
+ "Band '%s' invalid for channel %ld", value, chan);
+ g_free (value);
+ goto error;
+ }
+ } else if (!strcmp (value, "bg")) {
+ if (chan && chan > 14) {
+ g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
+ "Band '%s' invalid for channel %ld", value, chan);
+ g_free (value);
+ goto error;
+ }
+ } else {
+ g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
+ "Invalid wireless band '%s'", value);
+ g_free (value);
+ goto error;
+ }
+ g_object_set (s_wireless, NM_SETTING_WIRELESS_BAND, value, NULL);
+ g_free (value);
+ } else if (chan > 0) {
if (chan > 14)
g_object_set (s_wireless, NM_SETTING_WIRELESS_BAND, "a", NULL);
else
g_object_set (s_wireless, NM_SETTING_WIRELESS_BAND, "bg", NULL);
- g_free (value);
}
value = svGetValue (ifcfg, "MTU", FALSE);
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am b/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am
index 782ad8e045..9c9a3b13f8 100644
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am
@@ -60,6 +60,9 @@ EXTRA_DIST = \
ifcfg-test-wifi-wpa-eap-ttls-tls \
keys-test-wifi-wpa-eap-ttls-tls \
ifcfg-test-wifi-hidden \
+ ifcfg-test-wifi-band-a \
+ ifcfg-test-wifi-band-a-channel-mismatch \
+ ifcfg-test-wifi-band-bg-channel-mismatch \
test_ca_cert.pem \
test1_key_and_cert.pem \
ifcfg-test-ibft \
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a
new file mode 100644
index 0000000000..4328611100
--- /dev/null
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a
@@ -0,0 +1,13 @@
+TYPE=Wireless
+DEVICE=eth2
+HWADDR=00:16:41:11:22:33
+NM_CONTROLLED=yes
+BOOTPROTO=dhcp
+ESSID=blahblah
+BAND=a
+MODE=Managed
+RATE=auto
+ONBOOT=yes
+USERCTL=yes
+PEERDNS=yes
+IPV6INIT=no
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a-channel-mismatch b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a-channel-mismatch
new file mode 100644
index 0000000000..8905ba0b32
--- /dev/null
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-a-channel-mismatch
@@ -0,0 +1,9 @@
+TYPE=Wireless
+DEVICE=eth2
+HWADDR=00:16:41:11:22:33
+BOOTPROTO=dhcp
+ESSID=blahblah
+CHANNEL=9
+BAND=a
+MODE=Managed
+
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-bg-channel-mismatch b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-bg-channel-mismatch
new file mode 100644
index 0000000000..e02e21ad26
--- /dev/null
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-wifi-band-bg-channel-mismatch
@@ -0,0 +1,9 @@
+TYPE=Wireless
+DEVICE=eth2
+HWADDR=00:16:41:11:22:33
+BOOTPROTO=dhcp
+ESSID=blahblah
+CHANNEL=183
+BAND=bg
+MODE=Managed
+
diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
index c27f50a033..e72e7a3681 100644
--- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
+++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
@@ -5827,6 +5827,144 @@ test_write_wifi_hidden (void)
g_object_unref (reread);
}
+static void
+test_read_wifi_band_a (void)
+{
+ NMConnection *connection;
+ NMSettingConnection *s_con;
+ NMSettingWireless *s_wifi;
+ gboolean success;
+ GError *error = NULL;
+
+ connection = connection_from_file (TEST_IFCFG_DIR"/network-scripts/ifcfg-test-wifi-band-a",
+ NULL, TYPE_WIRELESS, NULL, NULL, NULL, NULL, &error, NULL);
+ g_assert_no_error (error);
+ g_assert (connection);
+
+ success = nm_connection_verify (connection, &error);
+ g_assert_no_error (error);
+ g_assert (success);
+
+ s_con = nm_connection_get_setting_connection (connection);
+ g_assert (s_con);
+ g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_WIRELESS_SETTING_NAME);
+
+ s_wifi = nm_connection_get_setting_wireless (connection);
+ g_assert (s_wifi);
+ g_assert_cmpstr (nm_setting_wireless_get_band (s_wifi), ==, "a");
+
+ g_object_unref (connection);
+}
+
+static void
+test_write_wifi_band_a (void)
+{
+ NMConnection *connection, *reread;
+ NMSettingConnection *s_con;
+ NMSettingWireless *s_wifi;
+ char *uuid, *testfile = NULL, *val;
+ gboolean success;
+ GError *error = NULL;
+ shvarFile *f;
+ GBytes *ssid;
+ const unsigned char ssid_data[] = { 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x53, 0x49, 0x44 };
+
+ connection = nm_simple_connection_new ();
+
+ /* Connection setting */
+ s_con = (NMSettingConnection *) nm_setting_connection_new ();
+ nm_connection_add_setting (connection, NM_SETTING (s_con));
+
+ uuid = nm_utils_uuid_generate ();
+ g_object_set (s_con,
+ NM_SETTING_CONNECTION_ID, "Test Write WiFi Band A",
+ NM_SETTING_CONNECTION_UUID, uuid,
+ NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
+ NULL);
+ g_free (uuid);
+
+ /* Wifi setting */
+ s_wifi = (NMSettingWireless *) nm_setting_wireless_new ();
+ nm_connection_add_setting (connection, NM_SETTING (s_wifi));
+
+ ssid = g_bytes_new (ssid_data, sizeof (ssid_data));
+
+ g_object_set (s_wifi,
+ NM_SETTING_WIRELESS_SSID, ssid,
+ NM_SETTING_WIRELESS_MODE, "infrastructure",
+ NM_SETTING_WIRELESS_BAND, "a",
+ NULL);
+
+ g_bytes_unref (ssid);
+
+ success = nm_connection_verify (connection, &error);
+ g_assert_no_error (error);
+ g_assert (success);
+
+ /* Save the ifcfg */
+ success = writer_new_connection (connection,
+ TEST_SCRATCH_DIR "/network-scripts/",
+ &testfile,
+ &error);
+ g_assert_no_error (error);
+ g_assert (success);
+
+ f = svOpenFile (testfile, &error);
+ g_assert_no_error (error);
+ g_assert (f);
+
+ /* re-read the file to check that what key was written. */
+ val = svGetValue (f, "BAND", FALSE);
+ g_assert (val);
+ g_assert_cmpstr (val, ==, "a");
+ g_free (val);
+ svCloseFile (f);
+
+ /* reread will be normalized, so we must normalize connection too. */
+ nm_connection_normalize (connection, NULL, NULL, NULL);
+
+ /* re-read the connection for comparison */
+ reread = connection_from_file (testfile, NULL, TYPE_WIRELESS,
+ NULL, NULL, NULL, NULL, &error, NULL);
+ unlink (testfile);
+ g_assert_no_error (error);
+ g_assert (reread);
+
+ success = nm_connection_verify (reread, &error);
+ g_assert_no_error (error);
+ g_assert (success);
+
+ g_assert (nm_connection_compare (connection, reread, NM_SETTING_COMPARE_FLAG_EXACT));
+
+ g_free (testfile);
+ g_object_unref (connection);
+ g_object_unref (reread);
+}
+
+static void
+test_read_wifi_band_a_channel_mismatch (void)
+{
+ NMConnection *connection;
+ GError *error = NULL;
+
+ connection = connection_from_file (TEST_IFCFG_DIR"/network-scripts/ifcfg-test-wifi-band-a-channel-mismatch",
+ NULL, TYPE_WIRELESS, NULL, NULL, NULL, NULL, &error, NULL);
+ g_assert (connection == NULL);
+ g_assert_error (error, IFCFG_PLUGIN_ERROR, 0);
+}
+
+static void
+test_read_wifi_band_bg_channel_mismatch (void)
+{
+ NMConnection *connection;
+ GError *error = NULL;
+
+ connection = connection_from_file (TEST_IFCFG_DIR"/network-scripts/ifcfg-test-wifi-band-bg-channel-mismatch",
+ NULL, TYPE_WIRELESS, NULL, NULL, NULL, NULL, &error, NULL);
+ g_assert (connection == NULL);
+ g_assert_error (error, IFCFG_PLUGIN_ERROR, 0);
+}
+
#define TEST_IFCFG_WIRED_QETH_STATIC TEST_IFCFG_DIR"/network-scripts/ifcfg-test-wired-qeth-static"
static void
@@ -13746,6 +13884,9 @@ int main (int argc, char **argv)
test_read_wifi_wpa_eap_tls ();
test_read_wifi_wpa_eap_ttls_tls ();
test_read_wifi_wep_eap_ttls_chap ();
+ g_test_add_func (TPATH "wifi/read-band-a", test_read_wifi_band_a);
+ g_test_add_func (TPATH "wifi/read-band-a-channel-mismatch", test_read_wifi_band_a_channel_mismatch);
+ g_test_add_func (TPATH "wifi/read-band-bg-channel-mismatch", test_read_wifi_band_bg_channel_mismatch);
g_test_add_func (TPATH "wifi/read-hidden", test_read_wifi_hidden);
test_read_wired_qeth_static ();
test_read_wired_ctc_static ();
@@ -13826,6 +13967,7 @@ int main (int argc, char **argv)
test_write_wifi_wpa_then_open ();
test_write_wifi_wpa_then_wep_with_perms ();
g_test_add_func (TPATH "wifi/write-hidden", test_write_wifi_hidden);
+ g_test_add_func (TPATH "wifi/write-band-a", test_write_wifi_band_a);
test_write_wired_qeth_dhcp ();
test_write_wired_ctc_dhcp ();
test_write_permissions ();
diff --git a/src/settings/plugins/ifcfg-rh/writer.c b/src/settings/plugins/ifcfg-rh/writer.c
index ffc83a3c67..86f317cc19 100644
--- a/src/settings/plugins/ifcfg-rh/writer.c
+++ b/src/settings/plugins/ifcfg-rh/writer.c
@@ -916,11 +916,15 @@ write_wireless_setting (NMConnection *connection,
}
svSetValue (ifcfg, "CHANNEL", NULL, FALSE);
+ svSetValue (ifcfg, "BAND", NULL, FALSE);
chan = nm_setting_wireless_get_channel (s_wireless);
if (chan) {
tmp = g_strdup_printf ("%u", chan);
svSetValue (ifcfg, "CHANNEL", tmp, FALSE);
g_free (tmp);
+ } else {
+ /* Band only set if channel is not, since channel implies band */
+ svSetValue (ifcfg, "BAND", nm_setting_wireless_get_band (s_wireless), FALSE);
}
bssid = nm_setting_wireless_get_bssid (s_wireless);