]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wpa_supplicant: Use hostapd_freq_params in assoc_params
authorJanusz Dziedzic <janusz.dziedzic@tieto.com>
Wed, 1 Oct 2014 07:52:53 +0000 (09:52 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 4 Oct 2014 15:43:42 +0000 (18:43 +0300)
Use hostapd_freq_params instead of simple frequency parameter for driver
commands. This is preparation for IBSS configuration to allow use of
HT/VHT in IBSS.

Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
src/drivers/driver.h
src/drivers/driver_nl80211.c
src/drivers/driver_test.c
src/drivers/driver_wext.c
wpa_supplicant/ap.c
wpa_supplicant/sme.c
wpa_supplicant/wpa_supplicant.c

index 9595b9d3e943c67cac7cd281a2321e8a380820a7..6af72943a97a66727f7d6c39730649329db3541e 100644 (file)
@@ -411,6 +411,25 @@ enum wps_mode {
                          */
 };
 
+struct hostapd_freq_params {
+       int mode;
+       int freq;
+       int channel;
+       /* for HT */
+       int ht_enabled;
+       int sec_channel_offset; /* 0 = HT40 disabled, -1 = HT40 enabled,
+                                * secondary channel below primary, 1 = HT40
+                                * enabled, secondary channel above primary */
+
+       /* for VHT */
+       int vht_enabled;
+
+       /* valid for both HT and VHT, center_freq2 is non-zero
+        * only for bandwidth 80 and an 80+80 channel */
+       int center_freq1, center_freq2;
+       int bandwidth;
+};
+
 /**
  * struct wpa_driver_associate_params - Association parameters
  * Data for struct wpa_driver_ops::associate().
@@ -443,11 +462,9 @@ struct wpa_driver_associate_params {
        size_t ssid_len;
 
        /**
-        * freq - Frequency of the channel the selected AP is using
-        * Frequency that the selected AP is using (in MHz as
-        * reported in the scan results)
+        * freq - channel parameters
         */
-       int freq;
+       struct hostapd_freq_params freq;
 
        /**
         * freq_hint - Frequency of the channel the proposed AP is using
@@ -1091,25 +1108,6 @@ struct hostapd_sta_add_params {
        size_t supp_oper_classes_len;
 };
 
-struct hostapd_freq_params {
-       int mode;
-       int freq;
-       int channel;
-       /* for HT */
-       int ht_enabled;
-       int sec_channel_offset; /* 0 = HT40 disabled, -1 = HT40 enabled,
-                                * secondary channel below primary, 1 = HT40
-                                * enabled, secondary channel above primary */
-
-       /* for VHT */
-       int vht_enabled;
-
-       /* valid for both HT and VHT, center_freq2 is non-zero
-        * only for bandwidth 80 and an 80+80 channel */
-       int center_freq1, center_freq2;
-       int bandwidth;
-};
-
 struct mac_address {
        u8 addr[ETH_ALEN];
 };
index 88ec88bf1e688bfc50a2e0d06107ad9de2a6dc8c..d0304743f35b3d501f9f920f7d3ddda519e8513f 100644 (file)
@@ -358,7 +358,8 @@ static void wpa_driver_nl80211_scan_timeout(void *eloop_ctx,
                                            void *timeout_ctx);
 static int wpa_driver_nl80211_set_mode(struct i802_bss *bss,
                                       enum nl80211_iftype nlmode);
-static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss, int freq);
+static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss,
+                                           struct hostapd_freq_params *freq);
 
 static int
 wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv,
@@ -8681,9 +8682,6 @@ static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
                                 struct wpa_driver_associate_params *params)
 {
        enum nl80211_iftype nlmode, old_mode;
-       struct hostapd_freq_params freq = {
-               .freq = params->freq,
-       };
 
        if (params->p2p) {
                wpa_printf(MSG_DEBUG, "nl80211: Setup AP operations for P2P "
@@ -8698,7 +8696,7 @@ static int wpa_driver_nl80211_ap(struct wpa_driver_nl80211_data *drv,
                return -1;
        }
 
-       if (nl80211_set_channel(drv->first_bss, &freq, 0)) {
+       if (nl80211_set_channel(drv->first_bss, &params->freq, 0)) {
                if (old_mode != nlmode)
                        wpa_driver_nl80211_set_mode(drv->first_bss, old_mode);
                nl80211_remove_monitor_interface(drv);
@@ -8752,7 +8750,7 @@ static int wpa_driver_nl80211_ibss(struct wpa_driver_nl80211_data *drv,
 
        wpa_printf(MSG_DEBUG, "nl80211: Join IBSS (ifindex=%d)", drv->ifindex);
 
-       if (wpa_driver_nl80211_set_mode_ibss(drv->first_bss, params->freq)) {
+       if (wpa_driver_nl80211_set_mode_ibss(drv->first_bss, &params->freq)) {
                wpa_printf(MSG_INFO, "nl80211: Failed to set interface into "
                           "IBSS mode");
                return -1;
@@ -8776,8 +8774,16 @@ retry:
        os_memcpy(drv->ssid, params->ssid, params->ssid_len);
        drv->ssid_len = params->ssid_len;
 
-       wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
-       NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
+       wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq.freq);
+       wpa_printf(MSG_DEBUG, "  * ht_enabled=%d", params->freq.ht_enabled);
+       wpa_printf(MSG_DEBUG, "  * sec_channel_offset=%d",
+                  params->freq.sec_channel_offset);
+       wpa_printf(MSG_DEBUG, "  * vht_enabled=%d", params->freq.vht_enabled);
+       wpa_printf(MSG_DEBUG, "  * center_freq1=%d", params->freq.center_freq1);
+       wpa_printf(MSG_DEBUG, "  * center_freq2=%d", params->freq.center_freq2);
+       wpa_printf(MSG_DEBUG, "  * bandwidth=%d", params->freq.bandwidth);
+       if (nl80211_put_freq_params(msg, &params->freq) < 0)
+               goto nla_put_failure;
 
        if (params->beacon_int > 0) {
                wpa_printf(MSG_DEBUG, "  * beacon_int=%d", params->beacon_int);
@@ -8855,10 +8861,10 @@ static int nl80211_connect_common(struct wpa_driver_nl80211_data *drv,
                        params->bssid_hint);
        }
 
-       if (params->freq) {
-               wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq);
-               NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq);
-               drv->assoc_freq = params->freq;
+       if (params->freq.freq) {
+               wpa_printf(MSG_DEBUG, "  * freq=%d", params->freq.freq);
+               NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, params->freq.freq);
+               drv->assoc_freq = params->freq.freq;
        } else
                drv->assoc_freq = 0;
 
@@ -9349,13 +9355,11 @@ static int wpa_driver_nl80211_set_mode(struct i802_bss *bss,
 }
 
 
-static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss, int freq)
+static int wpa_driver_nl80211_set_mode_ibss(struct i802_bss *bss,
+                                           struct hostapd_freq_params *freq)
 {
-       struct hostapd_freq_params freq_params;
-       os_memset(&freq_params, 0, sizeof(freq_params));
-       freq_params.freq = freq;
        return wpa_driver_nl80211_set_mode_impl(bss, NL80211_IFTYPE_ADHOC,
-                                               &freq_params);
+                                               freq);
 }
 
 
index 3608b5228c8d720da0af2893052e3f7f87f32d02..66edfa73a5a80e807fc7be76be7a756bb8f35945 100644 (file)
@@ -1478,7 +1478,7 @@ static int wpa_driver_test_associate(
        struct wpa_driver_test_data *drv = dbss->drv;
        wpa_printf(MSG_DEBUG, "%s: priv=%p freq=%d pairwise_suite=%d "
                   "group_suite=%d key_mgmt_suite=%d auth_alg=%d mode=%d",
-                  __func__, priv, params->freq, params->pairwise_suite,
+                  __func__, priv, params->freq.freq, params->pairwise_suite,
                   params->group_suite, params->key_mgmt_suite,
                   params->auth_alg, params->mode);
        wpa_driver_update_mode(drv, params->mode == IEEE80211_MODE_AP);
index 459ac4816a05488b2f0d598fe68d3df62659dafd..1b3a757b168c494b42d69de2754341ea81eb88cc 100644 (file)
@@ -2119,7 +2119,8 @@ int wpa_driver_wext_associate(void *priv,
        if (wpa_driver_wext_set_auth_param(drv, IW_AUTH_MFP, value) < 0)
                ret = -1;
 #endif /* CONFIG_IEEE80211W */
-       if (params->freq && wpa_driver_wext_set_freq(drv, params->freq) < 0)
+       if (params->freq.freq &&
+           wpa_driver_wext_set_freq(drv, params->freq.freq) < 0)
                ret = -1;
        if (!drv->cfg80211 &&
            wpa_driver_wext_set_ssid(drv, params->ssid, params->ssid_len) < 0)
index f9aa8078c38f83f248d1dfd99ce318c53e7595dc..7c9349883cc1510bd05bd377458edb5738d618a9 100644 (file)
@@ -513,7 +513,7 @@ int wpa_supplicant_create_ap(struct wpa_supplicant *wpa_s,
        }
        if (ssid->frequency == 0)
                ssid->frequency = 2462; /* default channel 11 */
-       params.freq = ssid->frequency;
+       params.freq.freq = ssid->frequency;
 
        params.wpa_proto = ssid->proto;
        if (ssid->key_mgmt & WPA_KEY_MGMT_PSK)
index e4f2d123e192a58d3e3524daa5ef4f71bec98e8d..36b4f87edb97e0b5d0d85d7dee7d690b8f568d24 100644 (file)
@@ -742,7 +742,7 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
        params.bssid = bssid;
        params.ssid = wpa_s->sme.ssid;
        params.ssid_len = wpa_s->sme.ssid_len;
-       params.freq = wpa_s->sme.freq;
+       params.freq.freq = wpa_s->sme.freq;
        params.bg_scan_period = wpa_s->current_ssid ?
                wpa_s->current_ssid->bg_scan_period : -1;
        params.wpa_ie = wpa_s->sme.assoc_req_ie_len ?
@@ -780,7 +780,7 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
        wpa_msg(wpa_s, MSG_INFO, "Trying to associate with " MACSTR
                " (SSID='%s' freq=%d MHz)", MAC2STR(params.bssid),
                params.ssid ? wpa_ssid_txt(params.ssid, params.ssid_len) : "",
-               params.freq);
+               params.freq.freq);
 
        wpa_supplicant_set_state(wpa_s, WPA_ASSOCIATING);
 
index 30d554041927cc06cb68ca225202cebfecb03ae3..3c1d9ec12a0540d7d33a19aed2110b5cb8c3e23b 100644 (file)
@@ -1835,7 +1835,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
                                   MAC2STR(bss->bssid), bss->freq,
                                   ssid->bssid_set);
                        params.bssid = bss->bssid;
-                       params.freq = bss->freq;
+                       params.freq.freq = bss->freq;
                }
                params.bssid_hint = bss->bssid;
                params.freq_hint = bss->freq;
@@ -1851,8 +1851,8 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
        }
 
        if (ssid->mode == WPAS_MODE_IBSS && ssid->frequency > 0 &&
-           params.freq == 0)
-               params.freq = ssid->frequency; /* Initial channel for IBSS */
+           params.freq.freq == 0)
+               params.freq.freq = ssid->frequency;
 
        if (ssid->mode == WPAS_MODE_IBSS) {
                if (ssid->beacon_int)
@@ -1936,13 +1936,12 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
        if (wpa_s->num_multichan_concurrent < 2) {
                int freq, num;
                num = get_shared_radio_freqs(wpa_s, &freq, 1);
-               if (num > 0 && freq > 0 && freq != params.freq) {
+               if (num > 0 && freq > 0 && freq != params.freq.freq) {
                        wpa_printf(MSG_DEBUG,
                                   "Assoc conflicting freq found (%d != %d)",
-                                  freq, params.freq);
-                       if (wpas_p2p_handle_frequency_conflicts(wpa_s,
-                                                               params.freq,
-                                                               ssid) < 0)
+                                  freq, params.freq.freq);
+                       if (wpas_p2p_handle_frequency_conflicts(
+                                   wpa_s, params.freq.freq, ssid) < 0)
                                return;
                }
        }