[ovs-dev] [PATCH 06/12] datapath: compat: Add support for ipv6 to ovs_udp_tun_rx_dst

Pravin B Shelar pshelar at ovn.org
Wed May 4 23:35:33 UTC 2016


From: Pravin B Shelar <pshelar at nicira.com>

Update ovs_udp_tun_rx_dst() to handle ipv6 tunnels.

Signed-off-by: Pravin B Shelar <pshelar at ovn.org>
---
 acinclude.m4                                     |  5 ++--
 datapath/linux/compat/include/net/dst_metadata.h | 29 +++++++++++++++++++++++-
 datapath/linux/compat/include/net/ipv6.h         | 10 ++++++++
 datapath/linux/compat/include/net/udp_tunnel.h   |  5 +++-
 4 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/acinclude.m4 b/acinclude.m4
index 74cb029..9404024 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -394,7 +394,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
   OVS_GREP_IFELSE([$KSRC/include/net/inetpeer.h], [vif],
                   [OVS_DEFINE([HAVE_INETPEER_VIF_SUPPORT])])
 
-  OVS_GREP_IFELSE([$KSRC/include/net/dst_metadata.h], [metadata_dst])
+  OVS_FIND_FIELD_IFELSE([$KSRC/include/net/ip_tunnels.h], [ip_tunnel_key],
+                        [label], [OVS_DEFINE([HAVE_METADATA_DST])])
 
   OVS_GREP_IFELSE([$KSRC/include/linux/net.h], [sock_create_kern.*net],
                   [OVS_DEFINE([HAVE_SOCK_CREATE_KERN_NET])])
@@ -565,8 +566,6 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
   OVS_GREP_IFELSE([$KSRC/include/net/udp.h], [udp_v4_check])
   OVS_GREP_IFELSE([$KSRC/include/net/udp.h], [udp_set_csum])
   OVS_GREP_IFELSE([$KSRC/include/net/udp_tunnel.h], [udp_tunnel_gro_complete])
-  OVS_GREP_IFELSE([$KSRC/include/net/udp_tunnel.h], [ipv6_v6only],
-                  [OVS_DEFINE([HAVE_UDP_TUNNEL_IPV6])])
 
   OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [ignore_df],
                   [OVS_DEFINE([HAVE_IGNORE_DF_RENAME])])
diff --git a/datapath/linux/compat/include/net/dst_metadata.h b/datapath/linux/compat/include/net/dst_metadata.h
index f15bb03..5e0ad29 100644
--- a/datapath/linux/compat/include/net/dst_metadata.h
+++ b/datapath/linux/compat/include/net/dst_metadata.h
@@ -5,8 +5,11 @@
 #include_next <net/dst_metadata.h>
 #else
 #include <linux/skbuff.h>
-#include <net/ip_tunnels.h>
+
+#include <net/dsfield.h>
 #include <net/dst.h>
+#include <net/ipv6.h>
+#include <net/ip_tunnels.h>
 
 struct metadata_dst {
 	unsigned long dst;
@@ -25,8 +28,10 @@ static inline struct metadata_dst *metadata_dst_alloc(u8 optslen, gfp_t flags)
 
 	return md_dst;
 }
+
 #define skb_tunnel_info ovs_skb_tunnel_info
 #endif
+
 static inline void ovs_ip_tun_rx_dst(struct ip_tunnel_info *tun_info,
 				 struct sk_buff *skb, __be16 flags,
 				 __be64 tunnel_id, int md_size)
@@ -39,6 +44,28 @@ static inline void ovs_ip_tun_rx_dst(struct ip_tunnel_info *tun_info,
 	tun_info->mode = 0;
 }
 
+static inline void ovs_ipv6_tun_rx_dst(struct ip_tunnel_info *info,
+				       struct sk_buff *skb,
+				       __be16 flags,
+				       __be64 tunnel_id,
+				       int md_size)
+{
+	const struct ipv6hdr *ip6h = ipv6_hdr(skb);
+
+	info->mode = IP_TUNNEL_INFO_IPV6;
+	info->key.tun_flags = flags;
+	info->key.tun_id = tunnel_id;
+	info->key.tp_src = 0;
+	info->key.tp_dst = 0;
+
+	info->key.u.ipv6.src = ip6h->saddr;
+	info->key.u.ipv6.dst = ip6h->daddr;
+
+	info->key.tos = ipv6_get_dsfield(ip6h);
+	info->key.ttl = ip6h->hop_limit;
+	info->key.label = ip6_flowlabel(ip6h);
+}
+
 void ovs_ip_tunnel_rcv(struct net_device *dev, struct sk_buff *skb,
 		      struct metadata_dst *tun_dst);
 #endif /* __NET_DST_METADATA_WRAPPER_H */
diff --git a/datapath/linux/compat/include/net/ipv6.h b/datapath/linux/compat/include/net/ipv6.h
index 4e60283..5cc5b6e 100644
--- a/datapath/linux/compat/include/net/ipv6.h
+++ b/datapath/linux/compat/include/net/ipv6.h
@@ -54,6 +54,16 @@ static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 unused)
 }
 #endif
 
+#ifndef IPV6_FLOWLABEL_MASK
+#define IPV6_FLOWLABEL_MASK             cpu_to_be32(0x000FFFFF)
+#endif
+
+#define ip6_flowlabel rpl_ip6_flowlabel
+static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr)
+{
+	return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK;
+}
+
 #ifndef IPV6_TCLASS_SHIFT
 #define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK)
 #define IPV6_TCLASS_SHIFT	20
diff --git a/datapath/linux/compat/include/net/udp_tunnel.h b/datapath/linux/compat/include/net/udp_tunnel.h
index feec6c7..17f829d 100644
--- a/datapath/linux/compat/include/net/udp_tunnel.h
+++ b/datapath/linux/compat/include/net/udp_tunnel.h
@@ -7,7 +7,7 @@
 #include <net/dst_metadata.h>
 #include <linux/netdev_features.h>
 
-#ifdef HAVE_UDP_TUNNEL_IPV6
+#ifdef HAVE_METADATA_DST
 #include_next <net/udp_tunnel.h>
 
 #else
@@ -143,6 +143,7 @@ static inline int rpl_udp_tunnel_handle_offloads(struct sk_buff *skb,
 #endif
 
 #define udp_tunnel_handle_offloads rpl_udp_tunnel_handle_offloads
+
 static inline void ovs_udp_tun_rx_dst(struct ip_tunnel_info *info,
 				  struct sk_buff *skb,
 				  unsigned short family,
@@ -150,6 +151,8 @@ static inline void ovs_udp_tun_rx_dst(struct ip_tunnel_info *info,
 {
 	if (family == AF_INET)
 		ovs_ip_tun_rx_dst(info, skb, flags, tunnel_id, md_size);
+	else
+		ovs_ipv6_tun_rx_dst(info, skb, flags, tunnel_id, md_size);
 
 	info->key.tp_src = udp_hdr(skb)->source;
 	info->key.tp_dst = udp_hdr(skb)->dest;
-- 
2.5.5




More information about the dev mailing list