aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDiogo Ferreira <diogo@underdev.org>2015-03-23 13:10:49 +0000
committerRicardo Cerqueira <ricardo@cyngn.com>2016-07-01 11:17:52 +0100
commit6bbb9c883a900cfdb58bcd284af24d7de7356406 (patch)
tree56ae60031b2aafab413a7aacacf6c11ac2ad4a97
parenta46cc719b5d14a91b4711aff5197edcf49b775e7 (diff)
downloadandroid_external_wpa_supplicant_8-6bbb9c883a900cfdb58bcd284af24d7de7356406.tar.gz
android_external_wpa_supplicant_8-6bbb9c883a900cfdb58bcd284af24d7de7356406.tar.bz2
android_external_wpa_supplicant_8-6bbb9c883a900cfdb58bcd284af24d7de7356406.zip
wpa_supplicant: Force the p2p channels to reuse frequencies used by STA
In the mediatek platform the performance of p2p connections will degrade significantly if different frequences are used for STA and P2P. Change-Id: I8bd7e4a3f10177c99d273eccb88c8590fcbe3d34
-rw-r--r--wpa_supplicant/bss.c6
-rw-r--r--wpa_supplicant/events.c54
-rw-r--r--wpa_supplicant/scan.c7
-rw-r--r--wpa_supplicant/wpa_supplicant.c27
4 files changed, 93 insertions, 1 deletions
diff --git a/wpa_supplicant/bss.c b/wpa_supplicant/bss.c
index 96e1a623..39a16095 100644
--- a/wpa_supplicant/bss.c
+++ b/wpa_supplicant/bss.c
@@ -322,6 +322,12 @@ static int wpa_bss_in_use(struct wpa_supplicant *wpa_s, struct wpa_bss *bss)
return !is_zero_ether_addr(bss->bssid) &&
(os_memcmp(bss->bssid, wpa_s->bssid, ETH_ALEN) == 0 ||
+#ifdef MTK_HARDWARE
+ /* if we're trying to connect this ssid, don't remove it from scan result */
+ (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) && wpa_s->current_ssid &&
+ wpa_s->current_ssid->ssid_len > 0 &&
+ os_strncmp(wpa_s->current_ssid->ssid, bss->ssid, wpa_s->current_ssid->ssid_len) == 0) ||
+#endif
os_memcmp(bss->bssid, wpa_s->pending_bssid, ETH_ALEN) == 0);
}
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index cfc8350d..567fbc0e 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1075,6 +1075,13 @@ wpa_supplicant_select_bss(struct wpa_supplicant *wpa_s,
int only_first_ssid)
{
unsigned int i;
+#ifdef MTK_HARDWARE
+ struct wpa_bss *temp_bss = NULL;
+ struct dl_list *list_next = NULL;
+ int shared_freq = 0;
+ int num = 0;
+#endif
+
if (only_first_ssid)
wpa_dbg(wpa_s, MSG_DEBUG, "Try to find BSS matching pre-selected network id=%d",
@@ -1082,6 +1089,49 @@ wpa_supplicant_select_bss(struct wpa_supplicant *wpa_s,
else
wpa_dbg(wpa_s, MSG_DEBUG, "Selecting BSS from priority group %d",
group->priority);
+#ifdef MTK_HARDWARE
+ if (os_strncmp(wpa_s->ifname, "wlan", 4) == 0)
+ num = get_shared_radio_freqs(wpa_s, &shared_freq, 1);
+ /*
+ * for channel conflict revise feature
+ * if p2p/wfd is connected, search in full scan result to find the ssid.
+ * because framework also base on
+ * this result, but not last scan result.
+ *
+ * changes in function wpa_bss_in_use will asure the intended bsses
+ * are not removed from full scan result.
+ */
+ if (num > 0 && shared_freq > 0) {
+ wpa_printf(MSG_DEBUG, "try to find a bss on freq %d", shared_freq);
+ temp_bss = dl_list_first(&wpa_s->bss, struct wpa_bss, list);
+ for (i = 0; i < wpa_s->num_bss; i++) {
+ list_next = temp_bss->list.next;
+ if (temp_bss->freq != shared_freq) {
+ temp_bss = dl_list_entry(list_next, struct wpa_bss, list);
+ continue;
+ }
+ *selected_ssid = wpa_scan_res_match(wpa_s, i, temp_bss, group,
+ only_first_ssid);
+
+ if (!*selected_ssid) {
+ temp_bss = dl_list_entry(list_next, struct wpa_bss, list);
+ continue;
+ }
+
+ wpa_printf(MSG_DEBUG, "on Freq %d, "
+ "found a BSS in previous scan res", shared_freq);
+ return temp_bss;
+ }
+ /*
+ * it is rarely that we aren't able to find this ssid in full scan result,
+ * unless this bss was removed just after
+ * framework select this bss and before send command to wpa_supplicant
+ */
+ wpa_printf(MSG_ERROR, "didn't find BSS on freq %d, "
+ "try to find on other freqs", shared_freq);
+ }
+#endif
+
for (i = 0; i < wpa_s->last_scan_res_used; i++) {
struct wpa_bss *bss = wpa_s->last_scan_res[i];
@@ -1656,6 +1706,10 @@ static int wpas_select_network_from_last_scan(struct wpa_supplicant *wpa_s,
wpa_msg_ctrl(wpa_s, MSG_INFO,
WPA_EVENT_NETWORK_NOT_FOUND);
+#ifdef MTK_HARDWARE
+ if (os_strncmp(wpa_s->ifname, "wlan", 4) == 0)
+ wpa_s->current_ssid = NULL;
+#endif
}
}
return 0;
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index acd3211c..03a8cc31 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -1159,6 +1159,13 @@ void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec)
}
+#ifdef MTK_HARDWARE
+int wpa_supplicant_pending_scan(struct wpa_supplicant *wpa_s)
+{
+ return eloop_is_timeout_registered(wpa_supplicant_scan, wpa_s, NULL);
+}
+#endif
+
/**
* wpa_supplicant_delayed_sched_scan - Request a delayed scheduled scan
* @wpa_s: Pointer to wpa_supplicant data
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index f93e0f6c..84a42b92 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -2294,6 +2294,11 @@ static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
params.bssid = bss->bssid;
params.freq.freq = bss->freq;
}
+#ifdef MTK_HARDWARE
+ else {
+ params.freq.freq = bss->freq;
+ }
+#endif
params.bssid_hint = bss->bssid;
params.freq_hint = bss->freq;
params.pbss = bss_is_pbss(bss);
@@ -2683,6 +2688,9 @@ void wpa_supplicant_disable_network(struct wpa_supplicant *wpa_s,
}
}
+#ifdef MTK_HARDWARE
+extern int wpa_supplicant_pending_scan(struct wpa_supplicant *wpa_s);
+#endif
/**
* wpa_supplicant_select_network - Attempt association with a network
@@ -2751,10 +2759,27 @@ void wpa_supplicant_select_network(struct wpa_supplicant *wpa_s,
wpa_s->disconnected = 0;
wpa_s->reassociate = 1;
-
+#ifdef MTK_HARDWARE
+ if (wpa_s->connect_without_scan ||
+ wpa_supplicant_fast_associate(wpa_s) != 1) {
+ /*
+ * Can't connect to AP when WFD is connected.
+ */
+ if (radio_work_pending(wpa_s, "scan") ||
+ wpa_supplicant_pending_scan(wpa_s)) {
+ wpa_printf(MSG_INFO, "[channel conflict revise] there're pending"
+ " scan request, clear it");
+ wpa_supplicant_cancel_scan(wpa_s);
+ /* radio_remove_works(wpa_s, "scan", 0); */
+ wpa_s->scan_res_handler = NULL;
+ }
+ wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
+ }
+#else
if (wpa_s->connect_without_scan ||
wpa_supplicant_fast_associate(wpa_s) != 1)
wpa_supplicant_req_scan(wpa_s, 0, disconnected ? 100000 : 0);
+#endif
if (ssid)
wpas_notify_network_selected(wpa_s, ssid);