<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 &lt;<a href="mailto:jithu@broadcom.com">jithu@broadcom.com</a>&gt;</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 &quot;C&quot; {</div>
<div> #define WPA_EVENT_BSS_ADDED &quot;CTRL-EVENT-BSS-ADDED &quot;</div><div> /** A BSS entry was removed (followed by BSS entry id and BSSID) */</div><div> #define WPA_EVENT_BSS_REMOVED &quot;CTRL-EVENT-BSS-REMOVED &quot;</div>
<div>+/** Notify the Userspace about the freq conflict */</div><div>+#define WPA_EVENT_FREQ_CONFLICT &quot;CTRL-EVENT-FREQ-CONFLICT &quot;</div><div> </div><div> /** WPS overlap detected in PBC mode */</div><div> #define WPS_EVENT_OVERLAP &quot;WPS-OVERLAP-DETECTED &quot;</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-&gt;phyname, driver-&gt;first_bss.ifname,</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span>   MAC2STR(driver-&gt;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-&gt;nlmode))</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>freq = driver-&gt;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, &quot;nl80211: Shared freq for PHY %s: %d&quot;,</div><div> <span class="Apple-tab-span" style="white-space:pre">                        </span>   drv-&gt;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-&gt;global-&gt;ifaces; iface; iface = iface-&gt;next) {</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>if((iface-&gt;p2p_group_interface) &amp;&amp; (iface-&gt;current_ssid) &amp;&amp;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>(iface-&gt;current_ssid-&gt;frequency != freq)) {</div>
<div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>if (iface-&gt;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, &quot;P2P: &quot;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                                                </span>&quot;GO Moved to freq(%d)&quot;, freq);</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                                                        </span>iface-&gt;current_ssid-&gt;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-&gt;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-&gt;ibss_rsn);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>wpa_s-&gt;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-&gt;mode == WPAS_MODE_AP || ssid-&gt;mode == WPAS_MODE_P2P_GO ||</div><div> <span class="Apple-tab-span" style="white-space:pre">        </span>    ssid-&gt;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, &amp;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-&gt;drv_flags &amp; WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) &amp;&amp;</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                </span>((freq = wpa_drv_shared_freq(wpa_s)) &gt; 0) &amp;&amp; (freq != params.freq)) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>wpa_printf(MSG_DEBUG, &quot;Shared interface with conflicting &quot;</div>
<div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>&quot;frequency found (%d != %d)&quot; , 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) &lt; 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, &quot;proiritize is not set. &quot;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>&quot;Notifying user space to handle the case&quot;);</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>&quot; id=%d&quot;, ssid-&gt;id);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>os_memset(wpa_s-&gt;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, &amp;params);</div>
<div> <span class="Apple-tab-span" style="white-space:pre">        </span>if (ret &lt; 0) {</div><div> <span class="Apple-tab-span" style="white-space:pre">                </span>wpa_msg(wpa_s, MSG_INFO, &quot;Association request to the driver &quot;</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