[RFC v2 PATCH 1/2] events: Handle survey event properly into wpa_supplicant

Jouni Malinen j at w1.fi
Thu Dec 24 11:40:08 PST 2015


On Fri, Nov 27, 2015 at 12:40:36PM +0100, Ulrich Ölmann wrote:
> Let's reuse hostapd code for such handling. This will be useful to get
> ACS support into wpa_supplicant where this one needs to handle the
> survey event so it fills in the result ACS subsystem will require.

>  src/ap/drv_callbacks.c  | 216 ++++++++++++++++++++++++------------------------

This is hiding the real changes by moving functions unnecessarily.. This
should look more like this to be readable:
 src/ap/drv_callbacks.c  |   10 ++++++----

(i.e., just add couple of #endif/#ifdef and leave the functions where
they are)

> diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
> @@ -3924,6 +3924,13 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
> +	case EVENT_SURVEY: {
> +		struct hostapd_data hapd = {};
> +		hapd.iface = wpa_s->ap_iface;
> +
> +		hostapd_event_get_survey(&hapd, &data->survey_results);

This fails to build at least with the gcc version and parameters I'm
using.. In any case, this looks pretty risky since who knows what
happens if hostapd_event_get_survey() were to use something else from
struct hostapd_data. It is going to be both safer and simpler to make
hostapd_event_get_survey() take in struct hostapd_iface pointer.


This is what the changes look like with these comments addressed:

 src/ap/drv_callbacks.c  | 10 ++++++----
 src/ap/hostapd.h        |  3 +++
 wpa_supplicant/events.c |  8 ++++++++
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c
index fd07201..9208569 100644
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -945,6 +945,8 @@ static void hostapd_event_eapol_rx(struct hostapd_data *hapd, const u8 *src,
 	ieee802_1x_receive(hapd, src, data, data_len);
 }
 
+#endif /* HOSTAPD */
+
 
 static struct hostapd_channel_data * hostapd_get_mode_channel(
 	struct hostapd_iface *iface, unsigned int freq)
@@ -1019,10 +1021,9 @@ static void hostapd_single_channel_get_survey(struct hostapd_iface *iface,
 }
 
 
-static void hostapd_event_get_survey(struct hostapd_data *hapd,
-				     struct survey_results *survey_results)
+void hostapd_event_get_survey(struct hostapd_iface *iface,
+			      struct survey_results *survey_results)
 {
-	struct hostapd_iface *iface = hapd->iface;
 	struct freq_survey *survey, *tmp;
 	struct hostapd_channel_data *chan;
 
@@ -1054,6 +1055,7 @@ static void hostapd_event_get_survey(struct hostapd_data *hapd,
 }
 
 
+#ifdef HOSTAPD
 #ifdef NEED_AP_MLME
 
 static void hostapd_event_iface_unavailable(struct hostapd_data *hapd)
@@ -1261,7 +1263,7 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
 			data->connect_failed_reason.code);
 		break;
 	case EVENT_SURVEY:
-		hostapd_event_get_survey(hapd, &data->survey_results);
+		hostapd_event_get_survey(hapd->iface, &data->survey_results);
 		break;
 #ifdef NEED_AP_MLME
 	case EVENT_INTERFACE_UNAVAILABLE:
diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h
index 8161a59..a664644 100644
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -493,6 +493,9 @@ int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da,
 			 int ssi_signal);
 void hostapd_event_ch_switch(struct hostapd_data *hapd, int freq, int ht,
 			     int offset, int width, int cf1, int cf2);
+struct survey_results;
+void hostapd_event_get_survey(struct hostapd_iface *iface,
+			      struct survey_results *survey_results);
 
 const struct hostapd_eap_user *
 hostapd_get_eap_user(struct hostapd_data *hapd, const u8 *identity,
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 5e8ebad..43f3d9b 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -3938,6 +3938,14 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
 				     data->mesh_peer.ie_len);
 #endif /* CONFIG_MESH */
 		break;
+	case EVENT_SURVEY:
+#ifdef CONFIG_AP
+		if (!wpa_s->ap_iface)
+			break;
+		hostapd_event_get_survey(wpa_s->ap_iface,
+					 &data->survey_results);
+#endif /* CONFIG_AP */
+		break;
 	default:
 		wpa_msg(wpa_s, MSG_INFO, "Unknown event %d", event);
 		break;
-- 
1.9.1


-- 
Jouni Malinen                                            PGP id EFC895FA



More information about the Hostap mailing list