Hello, </snip> > > --------8<---------------8<---------------8<------------------8<-------- > > diff --git a/sys/net/pf.c b/sys/net/pf.c > > index 8cb1326a160..c328109026c 100644 > > --- a/sys/net/pf.c > > +++ b/sys/net/pf.c > > @@ -6847,7 +6847,7 @@ pf_walk_header(struct pf_pdesc *pd, struct ip *h, > > u_short *reason) > > /* IGMP packets have router alert options, allow them */ > > if (pd->proto == IPPROTO_IGMP) { > > /* According to RFC 1112 ttl must be set to 1. */ > > - if ((h->ip_ttl != 1) || !IN_MULTICAST(h->ip_dst.s_addr)) { > > + if ((h->ip_ttl != 1) && IN_MULTICAST(h->ip_dst.s_addr)) { > > DPFPRINTF(LOG_NOTICE, "Invalid IGMP"); > > REASON_SET(reason, PFRES_IPOPTIONS); > > return (PF_DROP); > > @@ -7101,8 +7101,8 @@ pf_walk_header6(struct pf_pdesc *pd, struct ip6_hdr > > *h, u_short *reason) > > * missing then MLD message is invalid and > > * should be discarded. > > */ > > - if ((h->ip6_hlim != 1) || > > - !IN6_IS_ADDR_LINKLOCAL(&h->ip6_src)) { > > + if ((h->ip6_hlim != 1) && > > + IN6_IS_ADDR_LINKLOCAL(&h->ip6_src)) { > > DPFPRINTF(LOG_NOTICE, "Invalid MLD"); > > REASON_SET(reason, PFRES_IPOPTIONS); > > return (PF_DROP); > > > > Unless I'm missing more context, this hunk looks wrong to me. Valid > MLD packets must have a ttl of 1 *and* come from a LL address. The > initial logic seems ok to me. >
yes you are right. Your comment made me to take better look at RFC 1112 [1]. Section 'Informal Protocol Description' reads as follows: Multicast routers send Host Membership Query messages (hereinafter called Queries) to discover which host groups have members on their attached local networks. Queries are addressed to the all-hosts group (address 224.0.0.1), and carry an IP time-to-live of 1. I think I've confused all-hosts group (224.0.0.1) with any multicast address (any class-D 224.0.0.0). I think the diff below is what we actually need to get IPv4 IGMP working again: [1] https://www.ietf.org/rfc/rfc1112.txt --------8<---------------8<---------------8<------------------8<-------- diff --git a/sys/net/pf.c b/sys/net/pf.c index 8cb1326a160..c50173186da 100644 --- a/sys/net/pf.c +++ b/sys/net/pf.c @@ -6846,8 +6846,12 @@ pf_walk_header(struct pf_pdesc *pd, struct ip *h, u_short *reason) pd->proto = h->ip_p; /* IGMP packets have router alert options, allow them */ if (pd->proto == IPPROTO_IGMP) { - /* According to RFC 1112 ttl must be set to 1. */ - if ((h->ip_ttl != 1) || !IN_MULTICAST(h->ip_dst.s_addr)) { + /* + * According to RFC 1112 ttl must be set to 1 in all IGMP + * packets sent do 224.0.0.1 + */ + if ((h->ip_ttl != 1) && + (h->ip_dst.s_addr == INADDR_ALLHOSTS_GROUP)) { DPFPRINTF(LOG_NOTICE, "Invalid IGMP"); REASON_SET(reason, PFRES_IPOPTIONS); return (PF_DROP);