[RFC 2/2] nl80211: Modified event generation on up/down of the interfaces
Yogesh Ashok Powar
yogeshp
Tue Nov 30 08:47:11 PST 2010
Whenever any interface is enabled or disabled the EVENT_INTERFACE_ENABLED or
EVENT_INTERFACE_DISABLED events are generated.
Monitor interface events will be sent for first-bss inteface. Eg., When
mon.wlan2 interface is added then event INTERFACE_ENABLED is called for wlan2.
This is required for symmetrical path for real and virtual interfaces.
Signed-off-by: Yogesh Ashok Powar <yogeshp at marvell.com>
---
src/drivers/driver_nl80211.c | 38 +++++++++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 0621458..056d44f 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -112,6 +112,7 @@ struct i802_bss {
struct i802_bss *next;
int ifindex;
char ifname[IFNAMSIZ + 1];
+ int if_disabled;
unsigned int beacon_set:1;
};
@@ -126,7 +127,6 @@ struct wpa_driver_nl80211_data {
char brname[IFNAMSIZ];
int ifindex;
int if_removed;
- int if_disabled;
struct rfkill_data *rfkill;
struct wpa_driver_capa capa;
int has_capability;
@@ -456,6 +456,9 @@ static void wpa_driver_nl80211_event_rtm_newlink(void *ctx,
int attrlen, rta_len;
struct rtattr *attr;
u32 brid = 0;
+ union wpa_event_data event;
+ struct i802_bss *this_bss = &drv->first_bss;
+ os_memset(&event, 0, sizeof(event));
if (!wpa_driver_nl80211_own_ifindex(drv, ifi->ifi_index, buf, len) &&
!have_ifidx(drv, ifi->ifi_index)) {
@@ -464,6 +467,14 @@ static void wpa_driver_nl80211_event_rtm_newlink(void *ctx,
return;
}
+ while (this_bss) {
+ if (this_bss->ifindex == ifi->ifi_index)
+ break;
+ this_bss = this_bss->next;
+ }
+ if (!this_bss)
+ return;
+
wpa_printf(MSG_DEBUG, "RTM_NEWLINK: operstate=%d ifi_flags=0x%x "
"(%s%s%s%s)",
drv->operstate, ifi->ifi_flags,
@@ -472,16 +483,21 @@ static void wpa_driver_nl80211_event_rtm_newlink(void *ctx,
(ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",
(ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : "");
- 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->if_disabled && (ifi->ifi_flags & IFF_UP)) {
- wpa_printf(MSG_DEBUG, "nl80211: Interface up");
- drv->if_disabled = 0;
- wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, NULL);
+ if (!this_bss->if_disabled && !(ifi->ifi_flags & IFF_UP)) {
+ this_bss->if_disabled = 1;
+ this_bss->beacon_set = 0;
+ if_indextoname(ifi->ifi_index, event.interface_up_down.ifname);
+ wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_DISABLED,
+ &event);
+ } else if (this_bss->if_disabled && (ifi->ifi_flags & IFF_UP)) {
+ this_bss->if_disabled = 0;
+ if (ifi->ifi_index == drv->monitor_ifidx)
+ memcpy(event.interface_up_down.ifname,
+ drv->first_bss.ifname, IFNAMSIZ);
+ else
+ if_indextoname(ifi->ifi_index,
+ event.interface_up_down.ifname);
+ wpa_supplicant_event(drv->ctx, EVENT_INTERFACE_ENABLED, &event);
}
/*
--
1.5.4.3
More information about the Hostap
mailing list