mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 06:15:47 +00:00
datapath: Add support for RHEL-7 / CentOS-7 kernel.
This patch mostly is related to tunnel API where RHEL 7 kernel API are not in-sync with newer linux kernel API. So extra checks are required to check for parameters of API. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> Acked-by: Jiri Benc <jbenc@redhat.com>
This commit is contained in:
@@ -284,6 +284,7 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
|
|||||||
|
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [ERR_CAST])
|
OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [ERR_CAST])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [IS_ERR_OR_NULL])
|
OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [IS_ERR_OR_NULL])
|
||||||
|
OVS_GREP_IFELSE([$KSRC/include/linux/hash.h], [fast_hash_ops])
|
||||||
|
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [eth_hw_addr_random])
|
OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [eth_hw_addr_random])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [ether_addr_copy])
|
OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [ether_addr_copy])
|
||||||
@@ -341,6 +342,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
|
|||||||
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_orphan_frags])
|
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_orphan_frags])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_get_hash])
|
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_get_hash])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_clear_hash])
|
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_clear_hash])
|
||||||
|
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [int.skb_zerocopy(],
|
||||||
|
[OVS_DEFINE([HAVE_SKB_ZEROCOPY])])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [l4_rxhash])
|
OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [l4_rxhash])
|
||||||
|
|
||||||
OVS_GREP_IFELSE([$KSRC/include/linux/types.h], [bool],
|
OVS_GREP_IFELSE([$KSRC/include/linux/types.h], [bool],
|
||||||
@@ -356,7 +359,11 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
|
|||||||
OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [genl_has_listeners])
|
OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [genl_has_listeners])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [mcgrp_offset])
|
OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [mcgrp_offset])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [parallel_ops])
|
OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [parallel_ops])
|
||||||
|
OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [genlmsg_new_unicast])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_cisco_register])
|
OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_cisco_register])
|
||||||
|
OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_handle_offloads])
|
||||||
|
OVS_GREP_IFELSE([$KSRC/include/net/ip_tunnels.h], [iptunnel_xmit.*net],
|
||||||
|
[OVS_DEFINE([HAVE_IPTUNNEL_XMIT_NET])])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_get_be16])
|
OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_get_be16])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be16])
|
OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be16])
|
||||||
OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be32])
|
OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be32])
|
||||||
|
@@ -408,7 +408,7 @@ static int queue_userspace_packet(struct datapath *dp, struct sk_buff *skb,
|
|||||||
struct sk_buff *user_skb = NULL; /* to be queued to userspace */
|
struct sk_buff *user_skb = NULL; /* to be queued to userspace */
|
||||||
struct nlattr *nla;
|
struct nlattr *nla;
|
||||||
struct genl_info info = {
|
struct genl_info info = {
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
|
#ifdef HAVE_GENLMSG_NEW_UNICAST
|
||||||
.dst_sk = ovs_dp_get_net(dp)->genl_sock,
|
.dst_sk = ovs_dp_get_net(dp)->genl_sock,
|
||||||
#endif
|
#endif
|
||||||
.snd_portid = upcall_info->portid,
|
.snd_portid = upcall_info->portid,
|
||||||
|
@@ -268,6 +268,8 @@ int gre_cisco_unregister(struct gre_cisco_protocol *proto)
|
|||||||
|
|
||||||
#endif /* !HAVE_GRE_CISCO_REGISTER */
|
#endif /* !HAVE_GRE_CISCO_REGISTER */
|
||||||
|
|
||||||
|
#ifndef GRE_USE_KERNEL_GRE_HANDLE_OFFLOADS
|
||||||
|
|
||||||
/* GRE TX side. */
|
/* GRE TX side. */
|
||||||
static void gre_csum_fix(struct sk_buff *skb)
|
static void gre_csum_fix(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
@@ -343,6 +345,7 @@ void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_NET_IPGRE_DEMUX */
|
#endif /* CONFIG_NET_IPGRE_DEMUX */
|
||||||
|
|
||||||
|
@@ -2,11 +2,10 @@
|
|||||||
#define _LINUX_HASH_WRAPPER_H
|
#define _LINUX_HASH_WRAPPER_H
|
||||||
|
|
||||||
#include_next <linux/hash.h>
|
#include_next <linux/hash.h>
|
||||||
|
|
||||||
#include <linux/version.h>
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
|
|
||||||
#include <asm/hash.h>
|
#include <asm/hash.h>
|
||||||
|
|
||||||
|
#ifndef HAVE_FAST_HASH_OPS
|
||||||
|
|
||||||
struct fast_hash_ops {
|
struct fast_hash_ops {
|
||||||
u32 (*hash)(const void *data, u32 len, u32 seed);
|
u32 (*hash)(const void *data, u32 len, u32 seed);
|
||||||
u32 (*hash2)(const u32 *data, u32 len, u32 seed);
|
u32 (*hash2)(const u32 *data, u32 len, u32 seed);
|
||||||
@@ -40,6 +39,6 @@ extern u32 arch_fast_hash(const void *data, u32 len, u32 seed);
|
|||||||
* Returns 32bit hash.
|
* Returns 32bit hash.
|
||||||
*/
|
*/
|
||||||
extern u32 arch_fast_hash2(const u32 *data, u32 len, u32 seed);
|
extern u32 arch_fast_hash2(const u32 *data, u32 len, u32 seed);
|
||||||
#endif /* < 3.14 */
|
#endif /* !HASH_FAST_HASH_OPS */
|
||||||
|
|
||||||
#endif /* _LINUX_HASH_WRAPPER_H */
|
#endif /* _LINUX_HASH_WRAPPER_H */
|
||||||
|
@@ -288,6 +288,10 @@ static inline void skb_tx_error(struct sk_buff *skb)
|
|||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
|
||||||
unsigned int skb_zerocopy_headlen(const struct sk_buff *from);
|
unsigned int skb_zerocopy_headlen(const struct sk_buff *from);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_SKB_ZEROCOPY
|
||||||
|
#define skb_zerocopy rpl_skb_zerocopy
|
||||||
int skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len,
|
int skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len,
|
||||||
int hlen);
|
int hlen);
|
||||||
#endif
|
#endif
|
||||||
|
@@ -96,7 +96,7 @@ static inline int rpl_genl_register_family(struct genl_family *family)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
|
#ifndef HAVE_GENLMSG_NEW_UNICAST
|
||||||
static inline struct sk_buff *genlmsg_new_unicast(size_t payload,
|
static inline struct sk_buff *genlmsg_new_unicast(size_t payload,
|
||||||
struct genl_info *info,
|
struct genl_info *info,
|
||||||
gfp_t flags)
|
gfp_t flags)
|
||||||
|
@@ -81,7 +81,7 @@ static inline __be16 tnl_flags_to_gre_flags(__be16 tflags)
|
|||||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) */
|
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) */
|
||||||
#endif /* HAVE_GRE_CISCO_REGISTER */
|
#endif /* HAVE_GRE_CISCO_REGISTER */
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)
|
#ifndef GRE_USE_KERNEL_GRE_HANDLE_OFFLOADS
|
||||||
|
|
||||||
#define gre_build_header rpl_gre_build_header
|
#define gre_build_header rpl_gre_build_header
|
||||||
void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
|
void gre_build_header(struct sk_buff *skb, const struct tnl_ptk_info *tpi,
|
||||||
|
@@ -2,7 +2,15 @@
|
|||||||
#define __NET_IP_TUNNELS_WRAPPER_H 1
|
#define __NET_IP_TUNNELS_WRAPPER_H 1
|
||||||
|
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)
|
#if defined(HAVE_GRE_HANDLE_OFFLOADS) && \
|
||||||
|
LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
|
||||||
|
/* RHEL6 and RHEL7 both has backported tunnel API but RHEL6 has
|
||||||
|
* older version, so avoid using RHEL6 backports.
|
||||||
|
*/
|
||||||
|
#define GRE_USE_KERNEL_GRE_HANDLE_OFFLOADS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef GRE_USE_KERNEL_GRE_HANDLE_OFFLOADS
|
||||||
#include_next <net/ip_tunnels.h>
|
#include_next <net/ip_tunnels.h>
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)
|
||||||
@@ -11,7 +19,11 @@ static inline int rpl_iptunnel_xmit(struct sock *sk, struct rtable *rt,
|
|||||||
__be32 dst, __u8 proto, __u8 tos,
|
__be32 dst, __u8 proto, __u8 tos,
|
||||||
__u8 ttl, __be16 df, bool xnet)
|
__u8 ttl, __be16 df, bool xnet)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_IPTUNNEL_XMIT_NET
|
||||||
|
return iptunnel_xmit(NULL, rt, skb, src, dst, proto, tos, ttl, df);
|
||||||
|
#else
|
||||||
return iptunnel_xmit(rt, skb, src, dst, proto, tos, ttl, df, xnet);
|
return iptunnel_xmit(rt, skb, src, dst, proto, tos, ttl, df, xnet);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#define iptunnel_xmit rpl_iptunnel_xmit
|
#define iptunnel_xmit rpl_iptunnel_xmit
|
||||||
#endif
|
#endif
|
||||||
|
@@ -4,9 +4,10 @@
|
|||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/udp.h>
|
#include <linux/udp.h>
|
||||||
|
#include <net/gre.h>
|
||||||
|
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)
|
#ifdef GRE_USE_KERNEL_GRE_HANDLE_OFFLOADS
|
||||||
#include_next <net/vxlan.h>
|
#include_next <net/vxlan.h>
|
||||||
|
|
||||||
static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
|
static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
|
||||||
@@ -23,8 +24,14 @@ static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
|
|||||||
return vxlan_xmit_skb(vs, rt, skb, src, dst, tos, ttl, df,
|
return vxlan_xmit_skb(vs, rt, skb, src, dst, tos, ttl, df,
|
||||||
src_port, dst_port, vni, false);
|
src_port, dst_port, vni, false);
|
||||||
#else
|
#else
|
||||||
|
#ifndef HAVE_IPTUNNEL_XMIT_NET
|
||||||
return vxlan_xmit_skb(vs, rt, skb, src, dst, tos, ttl, df,
|
return vxlan_xmit_skb(vs, rt, skb, src, dst, tos, ttl, df,
|
||||||
src_port, dst_port, vni);
|
src_port, dst_port, vni);
|
||||||
|
#else
|
||||||
|
return vxlan_xmit_skb(NULL, vs, rt, skb, src, dst, tos, ttl, df,
|
||||||
|
src_port, dst_port, vni);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,8 +16,6 @@
|
|||||||
* 02110-1301, USA
|
* 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/version.h>
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)
|
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
@@ -37,6 +35,7 @@
|
|||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "gso.h"
|
#include "gso.h"
|
||||||
|
|
||||||
|
#ifndef GRE_USE_KERNEL_GRE_HANDLE_OFFLOADS
|
||||||
int iptunnel_xmit(struct sock *sk, struct rtable *rt,
|
int iptunnel_xmit(struct sock *sk, struct rtable *rt,
|
||||||
struct sk_buff *skb,
|
struct sk_buff *skb,
|
||||||
__be32 src, __be32 dst, __u8 proto,
|
__be32 src, __be32 dst, __u8 proto,
|
||||||
@@ -117,4 +116,4 @@ int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __be16 inner_proto)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* 3.12 */
|
#endif
|
||||||
|
@@ -49,6 +49,7 @@ skb_zerocopy_headlen(const struct sk_buff *from)
|
|||||||
return hlen;
|
return hlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef HAVE_SKB_ZEROCOPY
|
||||||
/**
|
/**
|
||||||
* skb_zerocopy - Zero copy skb to skb
|
* skb_zerocopy - Zero copy skb to skb
|
||||||
* @to: destination buffer
|
* @to: destination buffer
|
||||||
@@ -122,3 +123,4 @@ skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len, int hlen)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
@@ -19,7 +19,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,12,0)
|
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
@@ -43,6 +42,7 @@
|
|||||||
#include <net/arp.h>
|
#include <net/arp.h>
|
||||||
#include <net/ndisc.h>
|
#include <net/ndisc.h>
|
||||||
#include <net/ip.h>
|
#include <net/ip.h>
|
||||||
|
#include <net/gre.h>
|
||||||
#include <net/ip_tunnels.h>
|
#include <net/ip_tunnels.h>
|
||||||
#include <net/icmp.h>
|
#include <net/icmp.h>
|
||||||
#include <net/udp.h>
|
#include <net/udp.h>
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
#include "datapath.h"
|
#include "datapath.h"
|
||||||
#include "gso.h"
|
#include "gso.h"
|
||||||
#include "vlan.h"
|
#include "vlan.h"
|
||||||
|
#ifndef GRE_USE_KERNEL_GRE_HANDLE_OFFLOADS
|
||||||
|
|
||||||
#define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
|
#define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user