]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wpa_supplicant: "don't care" value for pbss in ssid structure
authorLior David <qca_liord@qca.qualcomm.com>
Mon, 4 Apr 2016 16:19:25 +0000 (19:19 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 8 Apr 2016 09:56:34 +0000 (12:56 +0300)
Add a new value 2 to the pbss parameter of wpa_ssid structure, which
means "don't care". This value is used in infrastructure mode to request
connection to either AP or PCP, whichever is available in the scan
results. The value is also used in regular WPS (not P2P group formation)
to make WPS work with devices running as either AP or PCP.

Signed-off-by: Lior David <qca_liord@qca.qualcomm.com>
wpa_supplicant/ap.c
wpa_supplicant/config.c
wpa_supplicant/config_ssid.h
wpa_supplicant/events.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant.conf
wpa_supplicant/wps_supplicant.c

index b133d038408e807fd32d6286672dc7b8ab9c9fcf..4f895f34c0ad286068e6442586427c9ec41aaeb8 100644 (file)
@@ -214,6 +214,13 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
        if (wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf))
                return -1;
 
+       if (ssid->pbss > 1) {
+               wpa_printf(MSG_ERROR, "Invalid pbss value(%d) for AP mode",
+                          ssid->pbss);
+               return -1;
+       }
+       bss->pbss = ssid->pbss;
+
 #ifdef CONFIG_ACS
        if (ssid->acs) {
                /* Setting channel to 0 in order to enable ACS */
@@ -453,8 +460,6 @@ no_wps:
                        wpabuf_dup(wpa_s->conf->ap_vendor_elements);
        }
 
-       bss->pbss = ssid->pbss;
-
        return 0;
 }
 
index c167f09b245195af822aa60eb19068f45299e080..7ecc5b09dd1acbb9521773d71305476d6252a167 100644 (file)
@@ -2048,7 +2048,7 @@ static const struct parse_data ssid_fields[] = {
        { INT(update_identifier) },
 #endif /* CONFIG_HS20 */
        { INT_RANGE(mac_addr, 0, 2) },
-       { INT_RANGE(pbss, 0, 1) },
+       { INT_RANGE(pbss, 0, 2) },
 };
 
 #undef OFFSET
index eb7b87be3c25484a261e68f1f8256d17e0d8ff94..c2af91df019d34920cb7a36f680796bdb8214653 100644 (file)
@@ -361,10 +361,14 @@ struct wpa_ssid {
 
        /**
         * pbss - Whether to use PBSS. Relevant to DMG networks only.
+        * 0 = do not use PBSS
+        * 1 = use PBSS
+        * 2 = don't care (not allowed in AP mode)
         * Used together with mode configuration. When mode is AP, it
         * means to start a PCP instead of a regular AP. When mode is INFRA it
-        * means connect to a PCP instead of AP. P2P_GO and P2P_GROUP_FORMATION
-        * modes must use PBSS in DMG network.
+        * means connect to a PCP instead of AP. In this mode you can also
+        * specify 2 (don't care) meaning connect to either AP or PCP.
+        * P2P_GO and P2P_GROUP_FORMATION modes must use PBSS in DMG network.
         */
        int pbss;
 
index eb330ddadeae27b670d99dd5341bf06bb6d1be35..4c1bf7b8db036c63072260ebc3a082352ef1396f 100644 (file)
@@ -1006,7 +1006,7 @@ struct wpa_ssid * wpa_scan_res_match(struct wpa_supplicant *wpa_s,
                        continue;
                }
 
-               if (ssid->pbss != bss_is_pbss(bss)) {
+               if (ssid->pbss != 2 && ssid->pbss != bss_is_pbss(bss)) {
                        wpa_dbg(wpa_s, MSG_DEBUG, "   skip - PBSS mismatch (ssid %d bss %d)",
                                ssid->pbss, bss_is_pbss(bss));
                        continue;
index 51bb2457eb54ef407c86a0db268ee7e64bdb3f5e..3f1d08b830da1069a87bd874e53f0b8018c12306 100644 (file)
@@ -2414,7 +2414,7 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
        } else {
                params.ssid = ssid->ssid;
                params.ssid_len = ssid->ssid_len;
-               params.pbss = ssid->pbss;
+               params.pbss = (ssid->pbss != 2) ? ssid->pbss : 0;
        }
 
        if (ssid->mode == WPAS_MODE_IBSS && ssid->bssid_set &&
index e55b380fe876d4bfc922c9def3dde7d5f2543b89..a385694e529cd7f2dec429f2fe6522f953500c04 100644 (file)
@@ -717,10 +717,14 @@ fast_reauth=1
 # the network will be used instead of this configured value.
 #
 # pbss: Whether to use PBSS. Relevant to IEEE 802.11ad networks only.
+# 0 = do not use PBSS
+# 1 = use PBSS
+# 2 = don't care (not allowed in AP mode)
 # Used together with mode configuration. When mode is AP, it means to start a
 # PCP instead of a regular AP. When mode is infrastructure it means connect
-# to a PCP instead of AP. P2P_GO and P2P_GROUP_FORMATION modes must use PBSS
-# in IEEE 802.11ad network.
+# to a PCP instead of AP. In this mode you can also specify 2 (don't care)
+# which means connect to either PCP or AP.
+# P2P_GO and P2P_GROUP_FORMATION modes must use PBSS in IEEE 802.11ad network.
 # For more details, see IEEE Std 802.11ad-2012.
 #
 # scan_freq: List of frequencies to scan
index 0860eb40b07c429cda45e1bcc5b45492a7493d52..74a420c671d0c6eb85c388efb90606edb0e2ed81 100644 (file)
@@ -1142,6 +1142,13 @@ int wpas_wps_start_pbc(struct wpa_supplicant *wpa_s, const u8 *bssid,
                return -1;
        ssid->temporary = 1;
        ssid->p2p_group = p2p_group;
+       /*
+        * When starting a regular WPS process (not P2P group formation)
+        * the registrar/final station can be either AP or PCP
+        * so use a "don't care" value for the pbss flag.
+        */
+       if (!p2p_group)
+               ssid->pbss = 2;
 #ifdef CONFIG_P2P
        if (p2p_group && wpa_s->go_params && wpa_s->go_params->ssid_len) {
                ssid->ssid = os_zalloc(wpa_s->go_params->ssid_len + 1);
@@ -1197,6 +1204,13 @@ static int wpas_wps_start_dev_pw(struct wpa_supplicant *wpa_s,
        }
        ssid->temporary = 1;
        ssid->p2p_group = p2p_group;
+       /*
+        * When starting a regular WPS process (not P2P group formation)
+        * the registrar/final station can be either AP or PCP
+        * so use a "don't care" value for the pbss flag.
+        */
+       if (!p2p_group)
+               ssid->pbss = 2;
        if (ssid_val) {
                ssid->ssid = os_malloc(ssid_len);
                if (ssid->ssid) {