[PATCH v2 2/4] HS20: Add support for configuring frame filters

Jouni Malinen j at w1.fi
Sun Mar 20 13:05:50 PDT 2016

On Tue, Mar 08, 2016 at 01:25:41PM +0200, Ilan Peer wrote:
> When a station has associated to a HS2.0 network, request
> the driver to do the following, based on the BSS capabilities:
> 1. Enable gratuitous ARP filtering
> 2. Enable unsolicited Neighbor Advertisement filtering
> 3. Enable GTK filtering if DGAF disabled bit is zero
> HS2.0 requires the filtering to start only after an IP
> address is obtained. However, the configuration is done
> regardless of obtaining an IP address, so this might
> not be good enough.

That "and obtained an IP address" part looks a bit strange.. Why would
this filtering not be enabled before IP address assignment completes?

> diff --git a/wpa_supplicant/hs20_supplicant.c b/wpa_supplicant/hs20_supplicant.c
> +void hs20_configure_frame_filters(struct wpa_supplicant *wpa_s)
> +	if (filter)
> +		wpa_drv_configure_frame_filters(wpa_s, filter);

Why is this call skipped for filter == 0? Wouldn't it be fine and
potentially even preferred to clear the setting here if for any reason
the driver setting was not cleared previously?

> diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
> @@ -751,6 +751,9 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
>  		wpas_connect_work_done(wpa_s);
>  		/* Reinitialize normal_scan counter */
>  		wpa_s->normal_scans = 0;
> +#ifdef CONFIG_HS20
> +		hs20_configure_frame_filters(wpa_s);
> +#endif /* CONFIG_HS20 */

While this might be closer to the "once .. obtained an IP address",
wouldn't it be more robust to set these filter before even starting the
association? There might be a race condition here (even if very unlikely
to be hit) of IP packets getting exchanged before this call is executed.

> @@ -816,8 +819,15 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
>  	if (state == WPA_COMPLETED)
>  		wpa_supplicant_start_bgscan(wpa_s);
> -	else if (state < WPA_ASSOCIATED)
> +	else if (state < WPA_ASSOCIATED) {
>  		wpa_supplicant_stop_bgscan(wpa_s);
> +
> +#ifdef CONFIG_HS20
> +		/* clear possibly configured frame filters */
> +		if (old_state == WPA_COMPLETED)
> +			wpa_drv_configure_frame_filters(wpa_s, 0);
> +#endif /* CONFIG_HS20 */
> +	}

What is this trying to do by requiring state < WPA_ASSOCIATED and
old_state == WPA_COMPLETED? What if the STA gets disconnected when going
through rekeying (state is WPA_4WAY_HANDSHAKE or WPA_GROUP_HANDSHAKE)?
I'm not sure wpa_suppliant_set_state() is really the best location for
either of these frame filter calls. In other words, these sound more
like items that should be done when starting an association and when
processing a disassociation. In addition, there should likely be code to
clear the configured values when deinitializing the interface.
Jouni Malinen                                            PGP id EFC895FA

More information about the Hostap mailing list