|
@@ -129,6 +129,7 @@ struct wpa_driver_nl80211_data {
|
|
int ifindex;
|
|
int ifindex;
|
|
int if_removed;
|
|
int if_removed;
|
|
int if_disabled;
|
|
int if_disabled;
|
|
|
|
+ int ignore_if_down_event;
|
|
struct rfkill_data *rfkill;
|
|
struct rfkill_data *rfkill;
|
|
struct wpa_driver_capa capa;
|
|
struct wpa_driver_capa capa;
|
|
int has_capability;
|
|
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)) {
|
|
if (!drv->if_disabled && !(ifi->ifi_flags & IFF_UP)) {
|
|
wpa_printf(MSG_DEBUG, "nl80211: Interface down");
|
|
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)) {
|
|
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 "
|
|
wpa_printf(MSG_DEBUG, "nl80211: Mode change succeeded while "
|
|
"interface is down");
|
|
"interface is down");
|
|
drv->nlmode = nlmode;
|
|
drv->nlmode = nlmode;
|
|
|
|
+ drv->ignore_if_down_event = 1;
|
|
}
|
|
}
|
|
|
|
|
|
done:
|
|
done:
|