wpa_supplicant AP: Disable AP mode on disassoc paths - problems

Jouni Malinen j
Sun Jul 17 04:01:06 PDT 2011


On Fri, Jul 15, 2011 at 09:17:39AM +0200, Janusz Dziedzic wrote:
> commit ca62e114aa7b716fc5edc5e8da5e20b74d942201
> Author: Jouni Malinen <j at w1.fi>
> Date:   Tue Jul 5 16:38:30 2011 +0300
> 
>     wpa_supplicant AP: Disable AP mode on disassoc paths

> Generate problems in case of wpa_supplicant AP mode.
> Operstate is always 0 (RTM_NEWLINK: operstate=0) for drivers that
> can't change interface mode when UP.

I see even worse issues in the AP mode never coming up properly at all
when testing with hwsim hacked to not allow dynamic iftype changes. The
key problem here seems to be in the undesired EVENT_INTERFACE_DISABLED
event generated in the case where wpa_supplicant set the interface down
itself. Before this commit, that was mostly ignored. The following
change fixes this in my tests:
 
commit 7d9c369827e9413da985a26946bd52fbbe5d5acb
Author: Jouni Malinen <j at w1.fi>
Date:   Sun Jul 17 13:56:34 2011 +0300

    nl80211: Ignore ifdown event if mode change triggered it
    
    When driver_nl80211.c has to set the netdev down to change iftype, an
    RTM_NEWLINK event is generated. Do not generate
    EVENT_INTERFACE_DISABLED event based on that.

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index d0f256c..1a5b628 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -129,6 +129,7 @@ struct wpa_driver_nl80211_data {
 	int ifindex;
 	int if_removed;
 	int if_disabled;
+	int ignore_if_down_event;
 	struct rfkill_data *rfkill;
 	struct wpa_driver_capa capa;
 	int has_capability;
@@ -486,8 +487,15 @@ static void wpa_driver_nl80211_event_rtm_newlink(void *ctx,
 
 	if (!drv->if_disabled && !(ifi->ifi_flags & IFF_UP)) {
 		wpa_printf(MSG_DEBUG, "nl80211: Interface down");
-		drv->if_disabled = 1;
-		wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED, NULL);
+		if (drv->ignore_if_down_event) {
+			wpa_printf(MSG_DEBUG, "nl80211: Ignore interface down "
+				   "event generated by mode change");
+			drv->ignore_if_down_event = 0;
+		} else {
+			drv->if_disabled = 1;
+			wpa_supplicant_event(drv->ctx,
+					     EVENT_INTERFACE_DISABLED, NULL);
+		}
 	}
 
 	if (drv->if_disabled && (ifi->ifi_flags & IFF_UP)) {
@@ -5051,6 +5059,7 @@ static int wpa_driver_nl80211_set_mode(void *priv, int mode)
 		wpa_printf(MSG_DEBUG, "nl80211: Mode change succeeded while "
 			   "interface is down");
 		drv->nlmode = nlmode;
+		drv->ignore_if_down_event = 1;
 	}
 
 done:

-- 
Jouni Malinen                                            PGP id EFC895FA



More information about the Hostap mailing list