Skip to content
Snippets Groups Projects
Commit 3a88706a authored by R. Christian McDonald's avatar R. Christian McDonald Committed by Cy Schubert
Browse files

security/wpa_supplicant: wpa: Enable receiving priority tagged (VID 0) frames

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 to accept both unencapsulated and
encapsulated (with VLAN 0) EAPOL EtherTypes. This preserves the
original filter behavior while also matching on encapsulated EAPOL.

Sponsored by:   Rubicon Communications, LLC ("Netgate")
Reviewed by:    cy
Obtained from:	src bb5d6d14d81b
PR:		273696
MFH:		2023Q3
parent 2150c312
No related branches found
No related tags found
No related merge requests found
PORTNAME= wpa_supplicant
PORTVERSION= 2.10
PORTREVISION= 8
PORTREVISION= 9
CATEGORIES= security net
MASTER_SITES= https://w1.fi/releases/
......
--- src/l2_packet/l2_packet_freebsd.c.orig 2022-01-16 12:51:29.000000000 -0800
+++ src/l2_packet/l2_packet_freebsd.c 2023-09-10 23:29:49.674128000 -0700
+++ src/l2_packet/l2_packet_freebsd.c 2023-09-11 22:19:01.713695000 -0700
@@ -8,7 +8,8 @@
*/
......@@ -10,7 +10,15 @@
#include <net/bpf.h>
#endif /* __APPLE__ */
#include <pcap.h>
@@ -76,24 +77,28 @@
@@ -20,6 +21,7 @@
#include <sys/sysctl.h>
#endif /* __sun__ */
+#include <net/ethernet.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <net/route.h>
@@ -76,24 +78,33 @@
{
struct l2_packet_data *l2 = eloop_ctx;
pcap_t *pcap = sock_ctx;
......@@ -41,6 +49,24 @@
buf = (unsigned char *) (ethhdr + 1);
- len = hdr.caplen - sizeof(*ethhdr);
+ len = hdr->caplen - sizeof(*ethhdr);
+ /* handle 8021Q encapsulated frames */
+ if (ethhdr->h_proto == htons(ETH_P_8021Q)) {
+ buf += ETHER_VLAN_ENCAP_LEN;
+ len -= ETHER_VLAN_ENCAP_LEN;
+ }
}
l2->rx_callback(l2->rx_callback_ctx, ethhdr->h_source, buf, len);
}
@@ -122,10 +133,10 @@
os_snprintf(pcap_filter, sizeof(pcap_filter),
"not ether src " MACSTR " and "
"( ether dst " MACSTR " or ether dst " MACSTR " ) and "
- "ether proto 0x%x",
+ "( ether proto 0x%x or ( vlan 0 and ether proto 0x%x ) )",
MAC2STR(l2->own_addr), /* do not receive own packets */
MAC2STR(l2->own_addr), MAC2STR(pae_group_addr),
- protocol);
+ protocol, protocol);
if (pcap_compile(l2->pcap, &pcap_fp, pcap_filter, 1, pcap_netp) < 0) {
fprintf(stderr, "pcap_compile: %s\n", pcap_geterr(l2->pcap));
return -1;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment