Module Name: src Committed By: martin Date: Mon Dec 7 20:01:02 UTC 2020
Modified Files: src/sys/netinet [netbsd-8]: ip_mroute.c Log Message: Pull up following revision(s) (requested by kardel in ticket #1632): sys/netinet/ip_mroute.c: revision 1.164 (patch) PR kern/55779: restore non-desctructive guarantee of ip_mforward() mbuf argument. This avoids generation invalid UDP checksums on multicast packets in ip_output(). XXX the root cause of the misguided fix in 2008 should be XXX investigated To generate a diff of this commit: cvs rdiff -u -r1.146.6.4 -r1.146.6.5 src/sys/netinet/ip_mroute.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/ip_mroute.c diff -u src/sys/netinet/ip_mroute.c:1.146.6.4 src/sys/netinet/ip_mroute.c:1.146.6.5 --- src/sys/netinet/ip_mroute.c:1.146.6.4 Fri Jul 13 14:26:47 2018 +++ src/sys/netinet/ip_mroute.c Mon Dec 7 20:01:01 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_mroute.c,v 1.146.6.4 2018/07/13 14:26:47 martin Exp $ */ +/* $NetBSD: ip_mroute.c,v 1.146.6.5 2020/12/07 20:01:01 martin Exp $ */ /* * Copyright (c) 1992, 1993 @@ -93,7 +93,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_mroute.c,v 1.146.6.4 2018/07/13 14:26:47 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_mroute.c,v 1.146.6.5 2020/12/07 20:01:01 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -239,6 +239,8 @@ static int tbf_dq_sel(struct vif *, stru static void tbf_send_packet(struct vif *, struct mbuf *); static void tbf_update_tokens(struct vif *); static int priority(struct vif *, struct ip *); +static int ip_mforward_real(struct mbuf *, struct ifnet *); + /* * Bandwidth monitoring @@ -1309,6 +1311,34 @@ ip_mforward(struct mbuf *m, struct ifnet ip_mforward(struct mbuf *m, struct ifnet *ifp) #endif /* RSVP_ISI */ { + int rc; + /* + * save csum_flags to uphold the + * "unscathed" guarantee. + * ip_output() relies on that and + * without it we send out + * multicast packets with an invalid + * checksum + * + * see PR kern/55779 + */ + int csum_flags = m->m_pkthdr.csum_flags; + + /* + * Temporarily clear any in-bound checksum flags for this packet. + */ + m->m_pkthdr.csum_flags = 0; + + rc = ip_mforward_real(m, ifp); + + m->m_pkthdr.csum_flags = csum_flags; + + return rc; +} + +static int +ip_mforward_real(struct mbuf *m, struct ifnet *ifp) +{ struct ip *ip = mtod(m, struct ip *); struct mfc *rt; static int srctun = 0; @@ -1340,11 +1370,6 @@ ip_mforward(struct mbuf *m, struct ifnet return (1); } - /* - * Clear any in-bound checksum flags for this packet. - */ - m->m_pkthdr.csum_flags = 0; - #ifdef RSVP_ISI if (imo && ((vifi = imo->imo_multicast_vif) < numvifs)) { if (ip->ip_ttl < MAXTTL)