[ovs-dev] [PATCH v3 06/28] datapath: backport: tunnel: introduce ipv6_tun_rx_dst()
Pravin B Shelar
pshelar at ovn.org
Sat Jul 2 00:58:35 UTC 2016
Update ovs_udp_tun_rx_dst() to handle ipv6 tunnels.
This commit partially backports c29a70d2c ("tunnel: introduce udp_tun_rx_dst()")
Signed-off-by: Pravin B Shelar <pshelar at ovn.org>
Acked-by: Jesse Gross <jesse at kernel.org>
---
datapath/linux/compat/include/net/dst_metadata.h | 46 ++++++++++++++++++++++--
datapath/linux/compat/include/net/udp_tunnel.h | 5 ++-
2 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/datapath/linux/compat/include/net/dst_metadata.h b/datapath/linux/compat/include/net/dst_metadata.h
index f15bb03..b54cfc0 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,18 +28,57 @@ 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_tun_rx_dst(struct ip_tunnel_info *info, int md_size)
+{
+ /* No need to allocate for OVS backport case. */
+#if 0
+ struct metadata_dst *tun_dst;
+ struct ip_tunnel_info *info;
+
+ tun_dst = metadata_dst_alloc(md_size, GFP_ATOMIC);
+ if (!tun_dst)
+ return NULL;
+#endif
+ info->mode = 0;
+ info->options_len = 0;
+}
+
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)
{
const struct iphdr *iph = ip_hdr(skb);
+ ovs_tun_rx_dst(tun_info, md_size);
ip_tunnel_key_init(&tun_info->key,
iph->saddr, iph->daddr, iph->tos, iph->ttl,
0, 0, tunnel_id, flags);
- 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);
+
+ ovs_tun_rx_dst(info, md_size);
+ 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;
}
void ovs_ip_tunnel_rcv(struct net_device *dev, struct sk_buff *skb,
diff --git a/datapath/linux/compat/include/net/udp_tunnel.h b/datapath/linux/compat/include/net/udp_tunnel.h
index 65adc02..065b95a 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;
--
1.9.1
More information about the dev
mailing list