]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
WPS: Set RF bands based on driver capabilities
authorBharat Chakravarty <bchakrav@qca.qualcomm.com>
Wed, 31 Aug 2011 14:53:55 +0000 (17:53 +0300)
committerJouni Malinen <j@w1.fi>
Wed, 31 Aug 2011 14:53:55 +0000 (17:53 +0300)
Instead of hardcoding support for both 2.4 GHz and 5 GHz bands,
use driver capabilities to figure out which bands are supported.

wpa_supplicant/wps_supplicant.c

index 6f70cad84cbf3d52514e4d5b0e9e159bf14f0bc3..222c8fc8132d356145f05ea45b094a8834b0266f 100644 (file)
@@ -1116,6 +1116,8 @@ int wpas_wps_init(struct wpa_supplicant *wpa_s)
 {
        struct wps_context *wps;
        struct wps_registrar_config rcfg;
+       struct hostapd_hw_modes *modes;
+       u16 num_modes, flags, m;
 
        wps = os_zalloc(sizeof(*wps));
        if (wps == NULL)
@@ -1148,7 +1150,24 @@ int wpas_wps_init(struct wpa_supplicant *wpa_s)
                  WPS_DEV_TYPE_LEN * wps->dev.num_sec_dev_types);
 
        wps->dev.os_version = WPA_GET_BE32(wpa_s->conf->os_version);
-       wps->dev.rf_bands = WPS_RF_24GHZ | WPS_RF_50GHZ; /* TODO: config */
+       modes = wpa_drv_get_hw_feature_data(wpa_s, &num_modes, &flags);
+       if (modes) {
+               for (m = 0; m < num_modes; m++) {
+                       if (modes[m].mode == HOSTAPD_MODE_IEEE80211B ||
+                           modes[m].mode == HOSTAPD_MODE_IEEE80211G)
+                               wps->dev.rf_bands |= WPS_RF_24GHZ;
+                       else if (modes[m].mode == HOSTAPD_MODE_IEEE80211A)
+                               wps->dev.rf_bands |= WPS_RF_50GHZ;
+               }
+               ieee80211_sta_free_hw_features(modes, num_modes);
+       }
+       if (wps->dev.rf_bands == 0) {
+               /*
+                * Default to claiming support for both bands if the driver
+                * does not provide support for fetching supported bands.
+                */
+               wps->dev.rf_bands = WPS_RF_24GHZ | WPS_RF_50GHZ;
+       }
        os_memcpy(wps->dev.mac_addr, wpa_s->own_addr, ETH_ALEN);
        wpas_wps_set_uuid(wpa_s, wps);