[PATCH 4/5] events.c: add wpa_supplicant_event2 for global driver events
Roy Marples
roy
Tue May 26 14:25:17 PDT 2009
If the event is notification of a new interface then we attempt to
add the interface using the default driver and configuration if
wpa_supplicant is not already using it and the name matches our list.
Otherwise we pass the event to wpa_supplicant_event if we can find
an interface that wpa_supplicant is using.
Signed-off-by: Roy Marples <roy at marples.name>
---
src/drivers/driver.h | 13 +++++++++++++
wpa_supplicant/events.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 30bc72e..f46526c 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1706,6 +1706,19 @@ void wpa_supplicant_event(void *ctx, wpa_event_type event,
union wpa_event_data *data);
/**
+ * wpa_supplicant_event2 - Report a global driver event for wpa_supplicant
+ * @ctx: Context pointer to wpa_global
+ * @event: event type (defined above)
+ * @data: possible extra data for the event
+ *
+ * Same as wpa_suppicant_event, but we search for the interface in wpa_global.
+ * If the event is notification of a new interface and we match
+ * the interfacename and wpa_supplicant is not currently monitoring it
+ * then we try and start the interface using the default driver.
+ */
+void wpa_supplicant_event2(void *ctx, wpa_event_type event,
+ union wpa_event_data *data);
+/**
* wpa_supplicant_rx_eapol - Deliver a received EAPOL frame to wpa_supplicant
* @ctx: Context pointer (wpa_s); this is the ctx variable registered
* with struct wpa_driver_ops::init()
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 56c57fb..7b6e6ee 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1125,6 +1125,7 @@ wpa_supplicant_event_interface_status(struct wpa_supplicant *wpa_s,
wpa_supplicant_mark_disassoc(wpa_s);
l2_packet_deinit(wpa_s->l2);
wpa_s->l2 = NULL;
+ wpa_supplicant_remove_iface(wpa_s->global, wpa_s);
#ifdef CONFIG_TERMINATE_ONLASTIF
/* check if last interface */
if (!any_interfaces(wpa_s->global->ifaces))
@@ -1240,3 +1241,32 @@ void wpa_supplicant_event(void *ctx, wpa_event_type event,
break;
}
}
+
+void wpa_supplicant_event2(void *ctx, wpa_event_type event,
+ union wpa_event_data *data)
+{
+ struct wpa_global *wpa_g;
+ struct wpa_supplicant *wpa_s;
+ struct wpa_interface wpa_i;
+
+ wpa_s = wpa_supplicant_get_iface(ctx, data->interface_status.ifname);
+
+ if (event == EVENT_INTERFACE_STATUS &&
+ data->interface_status.ievent == EVENT_INTERFACE_ADDED)
+ {
+ if (wpa_s != NULL)
+ return;
+ wpa_g = ctx;
+ if (!wpa_supplicant_match_iface(wpa_g,
+ data->interface_status.ifname))
+ return;
+ os_memset(&wpa_i, 0, sizeof(wpa_i));
+ wpa_i.ifname = data->interface_status.ifname;
+ wpa_i.confname = wpa_g->params.confname;
+ wpa_supplicant_add_iface(ctx, &wpa_i);
+ return;
+ }
+
+ if (wpa_s != NULL)
+ wpa_supplicant_event(wpa_s, event, data);
+}
--
1.6.2.5
More information about the Hostap
mailing list