[RFC 2/4] P2P: Handling single channel concurrency

Jouni Malinen j at w1.fi
Sun Apr 8 13:17:30 EDT 2012


On Tue, Mar 06, 2012 at 10:33:55AM +0530, Jithu Jance wrote:
> Single channel concurrency Patch [2/4]
> 
> This patch handles the case where a p2p join fails due to a freq conflict
> with the existing STA connection.

Like Johannes pointed out, it would be nice to get a patch file that is
not corrupted (tabs were removed or converted to a single space, etc.,
that prevented the patch from applying). Similarly, it would be good to
get the D-Bus indication added, too.

> diff --git a/wpa_supplicant/p2p_supplicant.c
> @@ -2644,6 +2645,14 @@ static void wpas_p2p_scan_res_join(struct
> wpa_supplicant *wpa_s,
>   wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
>     "from P2P peer table: %d MHz", freq);
>   }
> +
> + if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) &&
> + ((shared_freq = wpa_drv_shared_freq(wpa_s)) > 0) && (shared_freq !=
> freq)) {
> + wpa_msg(wpa_s->parent, MSG_INFO,
> + P2P_EVENT_GROUP_FORMATION_FAILURE "reason=FREQ_CONFLICT");
> + return;
> + }

This is not enough and not in the correct location. The following freq
update based on BSS table is needed for many cases. In addition, the
wpa_s->global->ifaces list should be iterated in search of an
conflicting operating channel.

I added a more complete version of this type of validation:


commit 4b156206092d1d500407abbed7007071deee47d0

    P2P: Abort join-group operation if concurrent group cannot be supported
    
    If the driver does not indicate support for multi-channel concurrency,
    abort join-group operation if the end result would result in use of
    multiple operating frequencies with the same radio.
    
    Signed-hostap: Jouni Malinen <j at w1.fi>

diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 1c339d2..fa675fe 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -2605,6 +2605,44 @@ static void wpas_p2p_pd_before_join_timeout(void *eloop_ctx, void *timeout_ctx)
 }
 
 
+static int wpas_check_freq_conflict(struct wpa_supplicant *wpa_s, int freq)
+{
+	struct wpa_supplicant *iface;
+	int shared_freq;
+	u8 bssid[ETH_ALEN];
+
+	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)
+		return 0;
+
+	for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
+		if (!wpas_p2p_create_iface(wpa_s) && iface == wpa_s)
+			continue;
+		if (iface->current_ssid == NULL || iface->assoc_freq == 0)
+			continue;
+		if (wpa_drv_get_bssid(iface, bssid) == 0) {
+			if (freq != (int) wpa_s->assoc_freq) {
+				wpa_printf(MSG_DEBUG, "P2P: Frequency "
+					   "conflict - %s connected on %d MHz "
+					   "- new connection on %d MHz",
+					   wpa_s->ifname, wpa_s->assoc_freq,
+					   freq);
+				return 1;
+			}
+		}
+	}
+
+	shared_freq = wpa_drv_shared_freq(wpa_s);
+	if (shared_freq > 0 && shared_freq != freq) {
+		wpa_printf(MSG_DEBUG, "P2P: Frequency conflict - shared "
+			   "virtual interface connected on %d MHz - new "
+			   "connection on %d MHz", shared_freq, freq);
+		return 1;
+	}
+
+	return 0;
+}
+
+
 static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
 				   struct wpa_scan_results *scan_res)
 {
@@ -2655,6 +2693,13 @@ static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
 	if (freq > 0) {
 		u16 method;
 
+		if (wpas_check_freq_conflict(wpa_s, freq) > 0) {
+			wpa_msg(wpa_s->parent, MSG_INFO,
+				P2P_EVENT_GROUP_FORMATION_FAILURE
+				"reason=FREQ_CONFLICT");
+			return;
+		}
+
 		wpa_printf(MSG_DEBUG, "P2P: Send Provision Discovery Request "
 			   "prior to joining an existing group (GO " MACSTR
 			   " freq=%u MHz)",

-- 
Jouni Malinen                                            PGP id EFC895FA


More information about the HostAP mailing list