diff options
author | Dan Williams <dcbw@redhat.com> | 2012-03-16 17:56:32 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-03-16 17:58:23 -0500 |
commit | 69247a00eacd00617acbf1dfcee8497437b8ad39 (patch) | |
tree | f8b9c657033a7cd741bb676970e916789a4ca1c6 | |
parent | c455eafbefb16f996bbd441aaa381bdf04e830aa (diff) |
wifi: disable Ad-Hoc WPA connections (lp:905748)
The kernel is broken for Ad-Hoc WPA, and creates the connections
as open connections instead. Yeah, eventually we can use
wpa_supplicant with RSN support, but for now we just have to
disable Ad-Hoc WPA because it's a problem to say we're creating
a protected network but then have the kernel not do that for
us. Will be re-enabled once all the necessary bits have been
fixed.
Note that Ad-Hoc WPA has been broken since at least 2.6.32 with
mac80211-based drivers, which is what most users will be using.
-rw-r--r-- | libnm-util/nm-utils.c | 4 | ||||
-rw-r--r-- | src/nm-device-wifi.c | 60 | ||||
-rw-r--r-- | src/settings/nm-settings.c | 44 |
3 files changed, 108 insertions, 0 deletions
diff --git a/libnm-util/nm-utils.c b/libnm-util/nm-utils.c index debf0e5794..a8806206da 100644 --- a/libnm-util/nm-utils.c +++ b/libnm-util/nm-utils.c @@ -1285,6 +1285,8 @@ nm_utils_security_valid (NMUtilsSecurityType type, } break; case NMU_SEC_WPA_PSK: + if (adhoc) + return FALSE; /* FIXME: Kernel WPA Ad-Hoc support is buggy */ if (!(wifi_caps & NM_WIFI_DEVICE_CAP_WPA)) return FALSE; if (have_ap) { @@ -1311,6 +1313,8 @@ nm_utils_security_valid (NMUtilsSecurityType type, } break; case NMU_SEC_WPA2_PSK: + if (adhoc) + return FALSE; /* FIXME: Kernel WPA Ad-Hoc support is buggy */ if (!(wifi_caps & NM_WIFI_DEVICE_CAP_RSN)) return FALSE; if (have_ap) { diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c index d5f79e8b2b..2f4ba00874 100644 --- a/src/nm-device-wifi.c +++ b/src/nm-device-wifi.c @@ -972,6 +972,36 @@ real_deactivate (NMDevice *dev) } static gboolean +is_adhoc_wpa (NMConnection *connection) +{ + NMSettingWireless *s_wifi; + NMSettingWirelessSecurity *s_wsec; + const char *mode, *key_mgmt; + + /* The kernel doesn't support Ad-Hoc WPA connections well at this time, + * and turns them into open networks. It's been this way since at least + * 2.6.30 or so; until that's fixed, disable WPA-protected Ad-Hoc networks. + */ + + s_wifi = nm_connection_get_setting_wireless (connection); + g_return_val_if_fail (s_wifi != NULL, FALSE); + + mode = nm_setting_wireless_get_mode (s_wifi); + if (g_strcmp0 (mode, NM_SETTING_WIRELESS_MODE_ADHOC) != 0) + return FALSE; + + s_wsec = nm_connection_get_setting_wireless_security (connection); + if (!s_wsec) + return FALSE; + + key_mgmt = nm_setting_wireless_security_get_key_mgmt (s_wsec); + if (g_strcmp0 (key_mgmt, "wpa-none") != 0) + return FALSE; + + return TRUE; +} + +static gboolean real_check_connection_compatible (NMDevice *device, NMConnection *connection, GError **error) @@ -983,6 +1013,14 @@ real_check_connection_compatible (NMDevice *device, const GByteArray *mac; const GSList *mac_blacklist, *mac_blacklist_iter; + if (is_adhoc_wpa (connection)) { + g_set_error_literal (error, + NM_WIFI_ERROR, + NM_WIFI_ERROR_CONNECTION_INCOMPATIBLE, + "WPA Ad-Hoc disabled due to kernel bugs"); + return FALSE; + } + s_con = nm_connection_get_setting_connection (connection); g_assert (s_con); @@ -1188,6 +1226,18 @@ real_complete_connection (NMDevice *device, return FALSE; } + /* The kernel doesn't support Ad-Hoc WPA connections well at this time, + * and turns them into open networks. It's been this way since at least + * 2.6.30 or so; until that's fixed, disable WPA-protected Ad-Hoc networks. + */ + if (is_adhoc_wpa (connection)) { + g_set_error_literal (error, + NM_SETTING_WIRELESS_ERROR, + NM_SETTING_WIRELESS_ERROR_INVALID_PROPERTY, + "WPA Ad-Hoc disabled due to kernel bugs"); + return FALSE; + } + g_assert (ssid); str_ssid = nm_utils_ssid_to_utf8 (ssid); format = g_strdup_printf ("%s %%d", str_ssid); @@ -2595,6 +2645,16 @@ real_act_stage1_prepare (NMDevice *dev, NMDeviceStateReason *reason) connection = nm_act_request_get_connection (req); g_return_val_if_fail (connection != NULL, NM_ACT_STAGE_RETURN_FAILURE); + /* The kernel doesn't support Ad-Hoc WPA connections well at this time, + * and turns them into open networks. It's been this way since at least + * 2.6.30 or so; until that's fixed, disable WPA-protected Ad-Hoc networks. + */ + if (is_adhoc_wpa (connection)) { + nm_log_warn (LOGD_WIFI, "Ad-Hoc WPA disabled due to kernel bugs"); + *reason = NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED; + return NM_ACT_STAGE_RETURN_FAILURE; + } + /* Set spoof MAC to the interface */ s_wireless = nm_connection_get_setting_wireless (connection); g_assert (s_wireless); diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 990f98ded7..70dae8bbb9 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -1035,6 +1035,37 @@ add_cb (NMSettings *self, dbus_g_method_return (context, nm_connection_get_path (NM_CONNECTION (connection))); } +/* FIXME: remove if/when kernel supports adhoc wpa */ +static gboolean +is_adhoc_wpa (NMConnection *connection) +{ + NMSettingWireless *s_wifi; + NMSettingWirelessSecurity *s_wsec; + const char *mode, *key_mgmt; + + /* The kernel doesn't support Ad-Hoc WPA connections well at this time, + * and turns them into open networks. It's been this way since at least + * 2.6.30 or so; until that's fixed, disable WPA-protected Ad-Hoc networks. + */ + + s_wifi = nm_connection_get_setting_wireless (connection); + g_return_val_if_fail (s_wifi != NULL, FALSE); + + mode = nm_setting_wireless_get_mode (s_wifi); + if (g_strcmp0 (mode, NM_SETTING_WIRELESS_MODE_ADHOC) != 0) + return FALSE; + + s_wsec = nm_connection_get_setting_wireless_security (connection); + if (!s_wsec) + return FALSE; + + key_mgmt = nm_setting_wireless_security_get_key_mgmt (s_wsec); + if (g_strcmp0 (key_mgmt, "wpa-none") != 0) + return FALSE; + + return TRUE; +} + void nm_settings_add_connection (NMSettings *self, NMConnection *connection, @@ -1062,6 +1093,19 @@ nm_settings_add_connection (NMSettings *self, return; } + /* The kernel doesn't support Ad-Hoc WPA connections well at this time, + * and turns them into open networks. It's been this way since at least + * 2.6.30 or so; until that's fixed, disable WPA-protected Ad-Hoc networks. + */ + if (is_adhoc_wpa (connection)) { + error = g_error_new_literal (NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "WPA Ad-Hoc disabled due to kernel bugs"); + callback (self, NULL, error, context, user_data); + g_error_free (error); + return; + } + /* Do any of the plugins support adding? */ if (!get_plugin (self, NM_SYSTEM_CONFIG_INTERFACE_CAP_MODIFY_CONNECTIONS)) { error = g_error_new_literal (NM_SETTINGS_ERROR, |