Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netfilter: use nf_ip6_check_hbh_len in nf_ct_skb_network_trim

For IPv6 Jumbo packets, the ipv6_hdr(skb)->payload_len is always 0,
and its real payload_len ( > 65535) is saved in hbh exthdr. With 0
length for the jumbo packets, all data and exthdr will be trimmed
in nf_ct_skb_network_trim().

This patch is to call nf_ip6_check_hbh_len() to get real pkt_len
of the IPv6 packet, similar to br_validate_ipv6().

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
Reviewed-by: Aaron Conole <aconole@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>

authored by

Xin Long and committed by
Florian Westphal
eaafdaa3 28e144cf

+9 -2
+9 -2
net/netfilter/nf_conntrack_ovs.c
··· 6 6 #include <net/netfilter/ipv6/nf_defrag_ipv6.h> 7 7 #include <net/ipv6_frag.h> 8 8 #include <net/ip.h> 9 + #include <linux/netfilter_ipv6.h> 9 10 10 11 /* 'skb' should already be pulled to nh_ofs. */ 11 12 int nf_ct_helper(struct sk_buff *skb, struct nf_conn *ct, ··· 121 120 len = skb_ip_totlen(skb); 122 121 break; 123 122 case NFPROTO_IPV6: 124 - len = sizeof(struct ipv6hdr) 125 - + ntohs(ipv6_hdr(skb)->payload_len); 123 + len = ntohs(ipv6_hdr(skb)->payload_len); 124 + if (ipv6_hdr(skb)->nexthdr == NEXTHDR_HOP) { 125 + int err = nf_ip6_check_hbh_len(skb, &len); 126 + 127 + if (err) 128 + return err; 129 + } 130 + len += sizeof(struct ipv6hdr); 126 131 break; 127 132 default: 128 133 len = skb->len;