Patchwork PATCH:P2P We need to set conf variable for group_idle timeout if application has not set it for p2p_client

login
register
mail settings
Submitter Jouni Malinen
Date Oct. 28, 2012, 7:41 p.m.
Message ID <20121028194150.GG17172@w1.fi>
Download mbox | patch
Permalink /patch/194745/
State Accepted
Headers show

Comments

Jouni Malinen - Oct. 28, 2012, 7:41 p.m.
On Tue, Oct 23, 2012 at 10:19:48AM +0000, Neeraj Kumar Garg wrote:
> This patch is to fix the group_removal for p2p_client when the application has not configured the p2p_group_idle timeout to a non-zero value. So wpa_s->conf->p2p_group_idle remains to a default value as 0. But we configure the timeout to P2P_MAX_CLIENT_IDLE if it is p2p_client and application configured value is 0. In the function wpas_p2p_group_idle_timeout(), we check for conf value being 0 and we are not p2p_client. Without the below patch, conf value remains 0 and since current_ssid is removed by wpa_supplicant_mark_disassoc(), we don't have info about current_ssid. Please note that error can be reproduced only if P2P GO is completely removed or no longer in p2p_client range.
> 
> The below patch simply sets the conf value to P2P_MAX_CLIENT_IDLE if timeout has been set.

This is somewhat problematic way of solving the issue since it changes
the configuration and in case no separate P2P group interface is used,
this new value (10) could end up being used for the next P2P group
instance and in that case, the local end could be the GO and get
unexpected group idle timeouts.

I fixed this bit differently:

commit 5fbddfdcf1a7322d2929f8034576a24efb9b7334

    P2P: Fix default p2p_group_idle timeout for P2P client role
    
    Commit 0d30cc240fa36905b034dc9676f9d8da0ac18e56 forced
    wpa_s->current_ssid to be cleared in wpa_supplicant_mark_disassoc()
    which gets called from wpa_supplicant_event_disassoc(). This breaks the
    P2P group idle mechanism for the case where p2p_group_idle is not set
    (i.e., is the default 0) since wpas_p2p_group_idle_timeout() ignores the
    timeout in that case if the interface is not recognized as a client
    interface (which was based on wpa_s->current_ssid being set).
    
    Fix this by making wpas_p2p_is_client() default to client case if
    wpa_s->current_ssid is NULL. This is much more likely case since the P2P
    GO mode operation would not really clear the pointer without explicit
    request to disconnect.
    
    Signed-hostap: Jouni Malinen <j@w1.fi>

Patch

diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index be87567..c4e9176 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -4593,8 +4593,15 @@  int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period,
 
 static int wpas_p2p_is_client(struct wpa_supplicant *wpa_s)
 {
-	return wpa_s->current_ssid != NULL &&
-		wpa_s->current_ssid->p2p_group &&
+	if (wpa_s->current_ssid == NULL) {
+		/*
+		 * current_ssid can be clearead when P2P client interface gets
+		 * disconnected, so assume this interface was used as P2P
+		 * client.
+		 */
+		return 1;
+	}
+	return wpa_s->current_ssid->p2p_group &&
 		wpa_s->current_ssid->mode == WPAS_MODE_INFRA;
 }