aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLior David <qca_liord@qca.qualcomm.com>2016-04-04 19:19:25 +0300
committerHamad Kadmany <hkadmany@codeaurora.org>2016-04-20 12:05:07 +0300
commite4a0877119c7278cf36bc8509e64aece15c4332f (patch)
treea9fc0e11fa320358b74d0ca42459604c6a66fbb8
parent2daba882a1639c3bee76842bdf82d539c87ac971 (diff)
downloadandroid_external_wpa_supplicant_8-e4a0877119c7278cf36bc8509e64aece15c4332f.tar.gz
android_external_wpa_supplicant_8-e4a0877119c7278cf36bc8509e64aece15c4332f.tar.bz2
android_external_wpa_supplicant_8-e4a0877119c7278cf36bc8509e64aece15c4332f.zip
wpa_supplicant: "don't care" value for pbss in ssid structure
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. Change-Id: I3091fd41b1810adb9aa06242de5ee6498f573bdf Signed-off-by: Lior David <qca_liord@qca.qualcomm.com> Git-commit: 90f14962ec14f3ff46c12f0a191404e5957786b1 Git-repo: git://w1.fi/srv/git/hostap.git CRs-Fixed: 985990
-rw-r--r--wpa_supplicant/ap.c9
-rw-r--r--wpa_supplicant/config.c2
-rw-r--r--wpa_supplicant/config_ssid.h8
-rw-r--r--wpa_supplicant/events.c2
-rw-r--r--wpa_supplicant/wpa_supplicant.c2
-rw-r--r--wpa_supplicant/wpa_supplicant.conf8
-rw-r--r--wpa_supplicant/wps_supplicant.c14
7 files changed, 36 insertions, 9 deletions
diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c
index 540c9c8d..419bd893 100644
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
@@ -184,6 +184,13 @@ static int wpa_supplicant_conf_ap(struct wpa_supplicant *wpa_s,
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;
+
wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf);
if (ieee80211_is_dfs(ssid->frequency) && wpa_s->conf->country[0]) {
@@ -413,8 +420,6 @@ no_wps:
wpabuf_dup(wpa_s->conf->ap_vendor_elements);
}
- bss->pbss = ssid->pbss;
-
return 0;
}
diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c
index 1e514694..b736394a 100644
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -1969,7 +1969,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
diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
index 207e8c93..ca4220d3 100644
--- a/wpa_supplicant/config_ssid.h
+++ b/wpa_supplicant/config_ssid.h
@@ -359,10 +359,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;
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 7af5ac8b..cfc8350d 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -987,7 +987,7 @@ static 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;
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 7ed09305..7852268a 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -2300,7 +2300,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 &&
diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf
index 47bd9d6e..af6684be 100644
--- a/wpa_supplicant/wpa_supplicant.conf
+++ b/wpa_supplicant/wpa_supplicant.conf
@@ -655,10 +655,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
diff --git a/wpa_supplicant/wps_supplicant.c b/wpa_supplicant/wps_supplicant.c
index a07ee42f..09a3c054 100644
--- a/wpa_supplicant/wps_supplicant.c
+++ b/wpa_supplicant/wps_supplicant.c
@@ -1130,6 +1130,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);
@@ -1185,6 +1192,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) {