Hi, On Wed, Dec 13, 2017 at 10:20:48PM +1100, Brendan McGrath wrote: > Currently, when forwarding from a Virtual Interface to a Physical > Interface, ip_summed is set to a value of CHECKSUM_UNNECESSARY and > the UDP checksum has not been calculated. > > When the packet is then forwarded by a Multicast Router, the checksum > value is left as is and therefore rejected by the receiving > machine(s). > > This patch ensures the checksum is recalculated before forwarding. > > Signed-off-by: Brendan McGrath <red...@redmandi.dyndns.org> > --- > > It's a bit ugly putting UDP specific code in this spot - but I'm not > aware of any other protocols that are: > a) multicast; > b) forwarded; and > c) checksummed > > net/ipv6/ip6mr.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c > index 890f9bda..ee4370a 100644 > --- a/net/ipv6/ip6mr.c > +++ b/net/ipv6/ip6mr.c > @@ -2077,6 +2077,13 @@ static int ip6mr_forward2(struct net *net, struct > mr6_table *mrt, > ipv6h = ipv6_hdr(skb); > ipv6h->hop_limit--; > > + if (ipv6h->nexthdr == NEXTHDR_UDP && > + skb->ip_summed != CHECKSUM_PARTIAL) { ^
This indentation is wrong. The 2nd line should start right after the ( column in the 1st line, like: + if (ipv6h->nexthdr == NEXTHDR_UDP && + skb->ip_summed != CHECKSUM_PARTIAL) { Adjust with spaces as needed. Running the patch through scripts/checkpatch.pl before posting will catch these. > + struct udphdr *uh = udp_hdr(skb); > + udp6_set_csum(false, skb, &ipv6_hdr(skb)->saddr, > + &ipv6_hdr(skb)->daddr, ntohs(uh->len)); ^ same deal here. > + } > + > IP6CB(skb)->flags |= IP6SKB_FORWARDED; > > return NF_HOOK(NFPROTO_IPV6, NF_INET_FORWARD, > -- > 2.7.4 >