<div><br></div><div>Single channel concurrency patch [4/4]</div><div><br></div><div>This patch handles cases where a STA connection is attempted after a P2P connection and the new sta connection detects a freq</div><div>conflict with the existing P2P connection. Now based on the priority of the connection (either sta or p2p), either one of the connection</div>
<div>will be terminated.</div><div><br></div><div><br></div><div><div>[PATCH] Handle frequency conflicts, in single channel concurrency case</div><div> Signed-hostap: Jithu Jance <<a href="mailto:jithu@broadcom.com">jithu@broadcom.com</a>></div>
<div><br></div><div>---</div><div> src/common/wpa_ctrl.h | 2 +</div><div> src/drivers/driver_nl80211.c | 5 +++-</div><div> wpa_supplicant/p2p_supplicant.c | 40 +++++++++++++++++++++++++++++++++++++</div>
<div> wpa_supplicant/p2p_supplicant.h | 2 +</div><div> wpa_supplicant/wpa_supplicant.c | 22 ++++++++++++++++++++</div><div> wpa_supplicant/wpa_supplicant_i.h | 3 +-</div><div> 6 files changed, 72 insertions(+), 2 deletions(-)</div>
<div><br></div><div>diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h</div><div>index 5b4846f..96ac11b 100644</div><div>--- a/src/common/wpa_ctrl.h</div><div>+++ b/src/common/wpa_ctrl.h</div><div>@@ -56,6 +56,8 @@ extern "C" {</div>
<div> #define WPA_EVENT_BSS_ADDED "CTRL-EVENT-BSS-ADDED "</div><div> /** A BSS entry was removed (followed by BSS entry id and BSSID) */</div><div> #define WPA_EVENT_BSS_REMOVED "CTRL-EVENT-BSS-REMOVED "</div>
<div>+/** Notify the Userspace about the freq conflict */</div><div>+#define WPA_EVENT_FREQ_CONFLICT "CTRL-EVENT-FREQ-CONFLICT "</div><div> </div><div> /** WPS overlap detected in PBC mode */</div><div> #define WPS_EVENT_OVERLAP "WPS-OVERLAP-DETECTED "</div>
<div>diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c</div><div>index 184b26f..1e8c7fe 100644</div><div>--- a/src/drivers/driver_nl80211.c</div><div>+++ b/src/drivers/driver_nl80211.c</div><div>@@ -8398,7 +8398,10 @@ static int wpa_driver_nl80211_shared_freq(void *priv)</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                        </span> MACSTR,</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span> driver->phyname, driver->first_bss.ifname,</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span> MAC2STR(driver->first_bss.addr));</div>
<div>-<span class="Apple-tab-span" style="white-space:pre">                </span>freq = nl80211_get_assoc_freq(driver);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>if(is_ap_interface(driver->nlmode))</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>freq = driver->first_bss.freq;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>else</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>freq = nl80211_get_assoc_freq(driver);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span>wpa_printf(MSG_DEBUG, "nl80211: Shared freq for PHY %s: %d",</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span> drv->phyname, freq);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c</div><div>index 486a551..9e80315 100644</div><div>--- a/wpa_supplicant/p2p_supplicant.c</div>
<div>+++ b/wpa_supplicant/p2p_supplicant.c</div><div>@@ -4496,3 +4496,43 @@ void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>return;</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>wpas_p2p_add_persistent_group_client(wpa_s, addr);</div><div> }</div><div>+</div><div>+int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s, int freq)</div>
<div>+{</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>struct wpa_supplicant *iface = NULL;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>if((iface->p2p_group_interface) && (iface->current_ssid) &&</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>(iface->current_ssid->frequency != freq)) {</div>
<div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>if (iface->p2p_group_interface == P2P_GROUP_INTERFACE_GO) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span>/* Try to see whether we can move the GO. If it</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span> * is not possible, remove the GO interface</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span>if(wpa_drv_switch_channel(iface, freq) == 0) {</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                                        </span>wpa_printf(MSG_ERROR, "P2P: "</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                                                </span>"GO Moved to freq(%d)", freq);</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                                        </span>iface->current_ssid->frequency = freq;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                                        </span>continue;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                        </span>}</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>/* If GO cannot be moved or if the conflicting interface is a</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span> * P2P Client, remove the interface depending up on the connection</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span> * priority */</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>if(!wpas_is_p2p_prioritized(iface)) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>/* STA connection has priority over existing</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                </span> * P2P connection. So remove the interface */</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>wpas_p2p_disconnect(iface);</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>iface->removal_reason = P2P_GROUP_REMOVAL_FREQ_CONFLICT;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>wpas_p2p_group_delete(iface);</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>} else {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>/* Existing connection has the priority. Disable the newly</div><div>
+<span class="Apple-tab-span" style="white-space:pre">                                </span> * selected network and let the application know about it.</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>return -1;</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span>return 0;</div><div>+}</div><div>diff --git a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h</div><div>index cf46eaf..da7b9d9 100644</div>
<div>--- a/wpa_supplicant/p2p_supplicant.h</div><div>+++ b/wpa_supplicant/p2p_supplicant.h</div><div>@@ -25,6 +25,8 @@ void wpas_p2p_remain_on_channel_cb(struct wpa_supplicant *wpa_s,</div><div> <span class="Apple-tab-span" style="white-space:pre">                                </span> unsigned int freq, unsigned int duration);</div>
<div> void wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,</div><div> <span class="Apple-tab-span" style="white-space:pre">                                        </span> unsigned int freq);</div><div>+int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s,</div>
<div>+ int freq);</div><div> int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname);</div><div> int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span> int freq);</div><div>diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c</div><div>index fdee407..d41f47e 100644</div><div>
--- a/wpa_supplicant/wpa_supplicant.c</div><div>+++ b/wpa_supplicant/wpa_supplicant.c</div><div>@@ -1100,6 +1100,7 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>ibss_rsn_deinit(wpa_s->ibss_rsn);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>wpa_s->ibss_rsn = NULL;</div><div> #endif /* CONFIG_IBSS_RSN */</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>int freq = 0;</div>
<div> </div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>if (ssid->mode == WPAS_MODE_AP || ssid->mode == WPAS_MODE_P2P_GO ||</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span> ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {</div>
<div>@@ -1403,6 +1404,27 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>wpa_supplicant_apply_ht_overrides(wpa_s, ssid, &params);</div>
<div> #endif /* CONFIG_HT_OVERRIDES */</div><div> </div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>/* If multichannel concurrency is not supported, check for any frequency</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span> * conflict and take appropriate action.</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">        </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) &&</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>((freq = wpa_drv_shared_freq(wpa_s)) > 0) && (freq != params.freq)) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>wpa_printf(MSG_DEBUG, "Shared interface with conflicting "</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>"frequency found (%d != %d)" , freq, params.freq);</div><div>+#ifdef CONFIG_P2P</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>if (wpas_p2p_handle_frequency_conflicts(wpa_s, params.freq) < 0) {</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>/* Handling conflicts failed. Disable the current connect req and</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span> * notify the userspace to take appropriate action */</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>wpa_printf(MSG_DEBUG, "proiritize is not set. "</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>"Notifying user space to handle the case");</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>wpa_supplicant_disable_network(wpa_s, ssid);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_FREQ_CONFLICT</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>" id=%d", ssid->id);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>os_memset(wpa_s->pending_bssid, 0, ETH_ALEN);</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div>+#endif /* CONFIG_P2P */</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>+</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>ret = wpa_drv_associate(wpa_s, &params);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>if (ret < 0) {</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>wpa_msg(wpa_s, MSG_INFO, "Association request to the driver "</div>
<div>diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h</div><div>index 0ba1935..283a342 100644</div><div>--- a/wpa_supplicant/wpa_supplicant_i.h</div><div>+++ b/wpa_supplicant/wpa_supplicant_i.h</div>
<div>@@ -495,7 +495,8 @@ struct wpa_supplicant {</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>P2P_GROUP_REMOVAL_UNKNOWN,</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>P2P_GROUP_REMOVAL_REQUESTED,</div>
<div> <span class="Apple-tab-span" style="white-space:pre">                </span>P2P_GROUP_REMOVAL_IDLE_TIMEOUT,</div><div>-<span class="Apple-tab-span" style="white-space:pre">                </span>P2P_GROUP_REMOVAL_UNAVAILABLE</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>P2P_GROUP_REMOVAL_UNAVAILABLE,</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>P2P_GROUP_REMOVAL_FREQ_CONFLICT</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>} removal_reason;</div><div> </div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>unsigned int p2p_cb_on_scan_complete:1;</div>
<div>-- </div><div>1.7.4.1</div></div><div><br></div>- Jithu Jance