[RFC 2/2] nl80211: Modified event generation on up/down of the interfaces

Yogesh Ashok Powar yogeshp at marvell.com
Tue Nov 30 11:47:11 EST 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