Skip to content

Commit eaafdaa

Browse files
lxinFlorian Westphal
authored andcommitted
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>
1 parent 28e144c commit eaafdaa

File tree

1 file changed

+9
-2
lines changed

1 file changed

+9
-2
lines changed

net/netfilter/nf_conntrack_ovs.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <net/netfilter/ipv6/nf_defrag_ipv6.h>
77
#include <net/ipv6_frag.h>
88
#include <net/ip.h>
9+
#include <linux/netfilter_ipv6.h>
910

1011
/* 'skb' should already be pulled to nh_ofs. */
1112
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)
120121
len = skb_ip_totlen(skb);
121122
break;
122123
case NFPROTO_IPV6:
123-
len = sizeof(struct ipv6hdr)
124-
+ ntohs(ipv6_hdr(skb)->payload_len);
124+
len = ntohs(ipv6_hdr(skb)->payload_len);
125+
if (ipv6_hdr(skb)->nexthdr == NEXTHDR_HOP) {
126+
int err = nf_ip6_check_hbh_len(skb, &len);
127+
128+
if (err)
129+
return err;
130+
}
131+
len += sizeof(struct ipv6hdr);
125132
break;
126133
default:
127134
len = skb->len;

0 commit comments

Comments
 (0)