diff --git a/acinclude.m4 b/acinclude.m4 index eedda769243..7ed464c1470 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -400,6 +400,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ [nf_ct_zone_init]) OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_labels.h], [nf_connlabels_get]) + OVS_GREP_IFELSE([$KSRC/include/net/netfilter/ipv6/nf_defrag_ipv6.h], + [nf_ct_frag6_consume_orig]) + OVS_GREP_IFELSE([$KSRC/include/net/netfilter/ipv6/nf_defrag_ipv6.h], + [nf_ct_frag6_output]) OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32]) OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32_max]) diff --git a/datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h b/datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h index 7d51491a9c1..97052ccc4d9 100644 --- a/datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h +++ b/datapath/linux/compat/include/net/netfilter/ipv6/nf_defrag_ipv6.h @@ -7,8 +7,14 @@ #include_next #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0) +/* Upstream commit 029f7f3b8701 ("netfilter: ipv6: nf_defrag: avoid/free clone + * operations") changed the semantics of nf_ct_frag6_gather(), so we backport + * it for all prior kernels. + */ +#if defined(HAVE_NF_CT_FRAG6_CONSUME_ORIG) || \ + defined(HAVE_NF_CT_FRAG6_OUTPUT) #if defined(OVS_FRAGMENT_BACKPORT) +#define OVS_NF_DEFRAG6_BACKPORT 1 struct sk_buff *rpl_nf_ct_frag6_gather(struct sk_buff *skb, u32 user); int __init rpl_nf_ct_frag6_init(void); void rpl_nf_ct_frag6_cleanup(void); @@ -24,9 +30,13 @@ static inline void rpl_nf_ct_frag6_cleanup(void) { } static inline void rpl_nf_ct_frag6_consume_orig(struct sk_buff *skb) { } #endif /* OVS_FRAGMENT_BACKPORT */ #define nf_ct_frag6_gather rpl_nf_ct_frag6_gather +#else /* HAVE_NF_CT_FRAG6_CONSUME_ORIG */ +static inline int __init rpl_nf_ct_frag6_init(void) { return 0; } +static inline void rpl_nf_ct_frag6_cleanup(void) { } +static inline void rpl_nf_ct_frag6_consume_orig(struct sk_buff *skb) { } +#endif /* HAVE_NF_CT_FRAG6_CONSUME_ORIG */ #define nf_ct_frag6_init rpl_nf_ct_frag6_init #define nf_ct_frag6_cleanup rpl_nf_ct_frag6_cleanup #define nf_ct_frag6_consume_orig rpl_nf_ct_frag6_consume_orig -#endif /* < 4.3 */ #endif /* __NF_DEFRAG_IPV6_WRAPPER_H */ diff --git a/datapath/linux/compat/nf_conntrack_reasm.c b/datapath/linux/compat/nf_conntrack_reasm.c index 89a39789d32..fec9e5794f8 100644 --- a/datapath/linux/compat/nf_conntrack_reasm.c +++ b/datapath/linux/compat/nf_conntrack_reasm.c @@ -21,8 +21,6 @@ #include -#ifdef OVS_FRAGMENT_BACKPORT - #include #include #include @@ -56,6 +54,8 @@ #include #include +#ifdef OVS_NF_DEFRAG6_BACKPORT + static const char nf_frags_cache_name[] = "nf-frags"; struct nf_ct_frag6_skb_cb @@ -651,4 +651,4 @@ void rpl_nf_ct_frag6_cleanup(void) inet_frags_fini(&nf_frags); } -#endif /* OVS_FRAGMENT_BACKPORT */ +#endif /* OVS_NF_DEFRAG6_BACKPORT */