From: Pravin B Shelar <pshe...@nicira.com> Update ovs_udp_tun_rx_dst() to handle ipv6 tunnels.
Signed-off-by: Pravin B Shelar <pshe...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev