[PATCH] l2_packet_freebsd: Enable receiving priority tagged (VID=0) frames

Jouni Malinen j at w1.fi
Sat Oct 28 08:04:06 PDT 2023


On Fri, Jun 09, 2023 at 04:27:12PM +0000, R. Christian McDonald wrote:
> Certain internet service providers transmit VLAN 0 priority tagged
> EAPOL frames from the ONT towards the residential gateway. VID 0
> should be ignored, and the frame processed according to the priority
> set in the 802.1P bits and the encapsulated EtherType (i.e. EAPOL).
> 
> The pcap filter utilized by l2_packet_* is inadquate for this use case.
> 
> Here we modify the pcap filter on FreeBSD to accept both unencapsulated
> and encapsulated (with VLAN 0) EAPOL EtherTypes. This preserves the
> original filter behavior while also matching on encapsulated EAPOL.
> 
> Additional work is required to support this handling on other platforms.
> 
> We also modify the rx_receive handler to offset the packet buffer
> and length when handling dot1q encapsualted frames so the existing
> packet parsing code works as-is.

I applied this part.

> Finally, we bring along another patch from FreeBSD that handles the
> case where the interface can disappear either by `ifconfig destroy`
> or if a USB NIC is forcibly removed or experiences USB faults. This
> patch uses `pcap_next_ex`, setting the packet pointer to NULL, and
> terminating the event loop.

But this is not really expected wpa_supplicant/hostapd behavior, so I
dropped this:

> diff --git a/src/l2_packet/l2_packet_freebsd.c b/src/l2_packet/l2_packet_freebsd.c
> @@ -82,7 +83,11 @@ static void l2_packet_receive(int sock, void *eloop_ctx, void *sock_ctx)
>  	unsigned char *buf;
>  	size_t len;
>  
> -	packet = pcap_next(pcap, &hdr);
> +	if (pcap_next_ex(pcap, &hdr, &packet) == -1) {
> +		wpa_printf(MSG_ERROR, "Error reading packet, has device disappeared?");
> +		packet = NULL;
> +		eloop_terminate();
> +	}

This seems to be a completely independent change and as such, should be
in its own patch, but calling eloop_terminate() does not feel correct
for this type of a case. A better approach would be to detect interface
removal in src/drivers/driver_*.c and report it to upper layers (as is
already done for nl80211).

-- 
Jouni Malinen                                            PGP id EFC895FA



More information about the Hostap mailing list