diff options
author | Xin Long <lucien.xin@gmail.com> | 2023-03-07 16:31:31 -0500 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2023-03-08 14:25:41 +0100 |
commit | eaafdaa3e92234b877b645431957549a1f87e2bf (patch) | |
tree | 13adbe7627976f3d95a430810b0ad0abbd262b45 /net/netfilter/nf_conntrack_ovs.c | |
parent | 28e144cf5f72ce1c304571bc448e37c27495903a (diff) | |
download | linux-eaafdaa3e92234b877b645431957549a1f87e2bf.tar.gz linux-eaafdaa3e92234b877b645431957549a1f87e2bf.tar.bz2 linux-eaafdaa3e92234b877b645431957549a1f87e2bf.zip |
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>
Diffstat (limited to 'net/netfilter/nf_conntrack_ovs.c')
-rw-r--r-- | net/netfilter/nf_conntrack_ovs.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/net/netfilter/nf_conntrack_ovs.c b/net/netfilter/nf_conntrack_ovs.c index 52b776bdf526..068e9489e1c2 100644 --- a/net/netfilter/nf_conntrack_ovs.c +++ b/net/netfilter/nf_conntrack_ovs.c @@ -6,6 +6,7 @@ #include <net/netfilter/ipv6/nf_defrag_ipv6.h> #include <net/ipv6_frag.h> #include <net/ip.h> +#include <linux/netfilter_ipv6.h> /* 'skb' should already be pulled to nh_ofs. */ int nf_ct_helper(struct sk_buff *skb, struct nf_conn *ct, @@ -120,8 +121,14 @@ int nf_ct_skb_network_trim(struct sk_buff *skb, int family) len = skb_ip_totlen(skb); break; case NFPROTO_IPV6: - len = sizeof(struct ipv6hdr) - + ntohs(ipv6_hdr(skb)->payload_len); + len = ntohs(ipv6_hdr(skb)->payload_len); + if (ipv6_hdr(skb)->nexthdr == NEXTHDR_HOP) { + int err = nf_ip6_check_hbh_len(skb, &len); + + if (err) + return err; + } + len += sizeof(struct ipv6hdr); break; default: len = skb->len; |