diff options
author | Jiří Klimeš <jklimes@redhat.com> | 2015-08-21 09:36:30 +0200 |
---|---|---|
committer | Jiří Klimeš <jklimes@redhat.com> | 2015-08-21 09:36:30 +0200 |
commit | 4dd6632f88ae4c13a6c8e9606f152d59e61eee97 (patch) | |
tree | ade634be52fc8552addcd849fd32beb671c7987d | |
parent | 7f9cb1305773d1599dd919d20154bb2e0befae40 (diff) | |
parent | c0f6725146bb2fed77a466c38f434f1811febcff (diff) | |
download | NetworkManager-4dd6632f88ae4c13a6c8e9606f152d59e61eee97.tar.gz |
merge: Wi-Fi band/channel locking fixes (bgo #627571)
- fixes value for 'freq_list' wpa_supplicant option
- allows locking to a channel within a band
- adds utility functions for getting Wi-Fi frequencies
https://bugzilla.gnome.org/show_bug.cgi?id=627571
-rw-r--r-- | libnm-core/nm-utils.c | 55 | ||||
-rw-r--r-- | libnm-core/nm-utils.h | 4 | ||||
-rw-r--r-- | libnm/libnm.ver | 2 | ||||
-rw-r--r-- | src/supplicant-manager/nm-supplicant-config.c | 66 |
4 files changed, 111 insertions, 16 deletions
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 70777ae379..6312423661 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -2841,6 +2841,61 @@ nm_utils_wifi_is_channel_valid (guint32 channel, const char *band) return FALSE; } +static const guint * +_wifi_freqs (gboolean bg_band) +{ + static guint *freqs_2ghz = NULL; + static guint *freqs_5ghz = NULL; + guint *freqs; + + freqs = bg_band ? freqs_2ghz : freqs_5ghz; + if (G_UNLIKELY (freqs == NULL)) { + struct cf_pair *table; + int i; + + table = bg_band ? bg_table : a_table; + freqs = g_new0 (guint, bg_band ? G_N_ELEMENTS (bg_table) : G_N_ELEMENTS (a_table)); + for (i = 0; table[i].chan; i++) + freqs[i] = table[i].freq; + freqs[i] = 0; + if (bg_band) + freqs_2ghz = freqs; + else + freqs_5ghz = freqs; + } + return freqs; +} + +/** + * nm_utils_wifi_2ghz_freqs: + * + * Utility function to return 2.4 GHz Wi-Fi frequencies (802.11bg band). + * + * Returns: zero-terminated array of frequencies numbers (in MHz) + * + * Since: 1.2 + **/ +const guint * +nm_utils_wifi_2ghz_freqs (void) +{ + return _wifi_freqs (TRUE); +} + +/** + * nm_utils_wifi_5ghz_freqs: + * + * Utility function to return 5 GHz Wi-Fi frequencies (802.11a band). + * + * Returns: zero-terminated array of frequencies numbers (in MHz) + * + * Since: 1.2 + **/ +const guint * +nm_utils_wifi_5ghz_freqs (void) +{ + return _wifi_freqs (FALSE); +} + /** * nm_utils_wifi_strength_bars: * @strength: the access point strength, from 0 to 100 diff --git a/libnm-core/nm-utils.h b/libnm-core/nm-utils.h index 64e57e875a..5f9ec10398 100644 --- a/libnm-core/nm-utils.h +++ b/libnm-core/nm-utils.h @@ -144,6 +144,10 @@ guint32 nm_utils_wifi_freq_to_channel (guint32 freq); guint32 nm_utils_wifi_channel_to_freq (guint32 channel, const char *band); guint32 nm_utils_wifi_find_next_channel (guint32 channel, int direction, char *band); gboolean nm_utils_wifi_is_channel_valid (guint32 channel, const char *band); +NM_AVAILABLE_IN_1_2 +const guint *nm_utils_wifi_2ghz_freqs (void); +NM_AVAILABLE_IN_1_2 +const guint *nm_utils_wifi_5ghz_freqs (void); const char *nm_utils_wifi_strength_bars (guint8 strength); diff --git a/libnm/libnm.ver b/libnm/libnm.ver index ee23ad06e2..125aaa51cf 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -876,6 +876,8 @@ global: nm_utils_bond_mode_string_to_int; nm_utils_enum_from_str; nm_utils_enum_to_str; + nm_utils_wifi_2ghz_freqs; + nm_utils_wifi_5ghz_freqs; nm_vpn_editor_plugin_load_from_file; nm_vpn_plugin_info_get_filename; nm_vpn_plugin_info_get_editor_plugin; diff --git a/src/supplicant-manager/nm-supplicant-config.c b/src/supplicant-manager/nm-supplicant-config.c index 7dbd4b774d..86fd1814ca 100644 --- a/src/supplicant-manager/nm-supplicant-config.c +++ b/src/supplicant-manager/nm-supplicant-config.c @@ -306,12 +306,32 @@ nm_supplicant_config_get_blobs (NMSupplicantConfig * self) return NM_SUPPLICANT_CONFIG_GET_PRIVATE (self)->blobs; } -#define TWO_GHZ_FREQS "2412,2417,2422,2427,2432,2437,2442,2447,2452,2457,2462,2467,2472,2484" -#define FIVE_GHZ_FREQS "4915,4920,4925,4935,4940,4945,4960,4980,5035,5040,5045,5055,5060,5080," \ - "5170,5180,5190,5200,5210,5220,5230,5240,5260,5280,5300,5320,5500," \ - "5520,5540,5560,5580,5600,5620,5640,5660,5680,5700,5745,5765,5785," \ - "5805,5825" - +static const char * +wifi_freqs_to_string (gboolean bg_band) +{ + static const char *str_2ghz = NULL; + static const char *str_5ghz = NULL; + const char *str; + + str = bg_band ? str_2ghz : str_5ghz; + + if (G_UNLIKELY (str == NULL)) { + GString *tmp; + const guint *freqs; + int i; + + freqs = bg_band ? nm_utils_wifi_2ghz_freqs () : nm_utils_wifi_5ghz_freqs (); + tmp = g_string_sized_new (bg_band ? 70 : 225); + for (i = 0; freqs[i]; i++) + g_string_append_printf (tmp, i == 0 ? "%d" : " %d", freqs[i]); + str = g_string_free (tmp, FALSE); + if (bg_band) + str_2ghz = str; + else + str_5ghz = str; + } + return str; +} gboolean nm_supplicant_config_add_setting_wireless (NMSupplicantConfig * self, @@ -321,6 +341,7 @@ nm_supplicant_config_add_setting_wireless (NMSupplicantConfig * self, NMSupplicantConfigPrivate *priv; gboolean is_adhoc, is_ap; const char *mode, *band; + guint32 channel; GBytes *ssid; const char *bssid; @@ -391,22 +412,35 @@ nm_supplicant_config_add_setting_wireless (NMSupplicantConfig * self, } band = nm_setting_wireless_get_band (setting); + channel = nm_setting_wireless_get_channel (setting); if (band) { - const char *freqs = NULL; + if (channel) { + guint32 freq; + char *str_freq; + + freq = nm_utils_wifi_channel_to_freq (channel, band); + str_freq = g_strdup_printf ("%u", freq); + if (!nm_supplicant_config_add_option (self, "freq_list", str_freq, -1, FALSE)) { + g_free (str_freq); + nm_log_warn (LOGD_SUPPLICANT, "Error adding frequency list to supplicant config."); + return FALSE; + } + g_free (str_freq); + } else { + const char *freqs = NULL; - if (!strcmp (band, "a")) - freqs = FIVE_GHZ_FREQS; - else if (!strcmp (band, "bg")) - freqs = TWO_GHZ_FREQS; + if (!strcmp (band, "a")) + freqs = wifi_freqs_to_string (FALSE); + else if (!strcmp (band, "bg")) + freqs = wifi_freqs_to_string (TRUE); - if (freqs && !nm_supplicant_config_add_option (self, "freq_list", freqs, strlen (freqs), FALSE)) { - nm_log_warn (LOGD_SUPPLICANT, "Error adding frequency list/band to supplicant config."); - return FALSE; + if (freqs && !nm_supplicant_config_add_option (self, "freq_list", freqs, strlen (freqs), FALSE)) { + nm_log_warn (LOGD_SUPPLICANT, "Error adding frequency list/band to supplicant config."); + return FALSE; + } } } - // FIXME: channel config item - return TRUE; } |