[ovs-dev] [PATCH v3 0/9] UDP tunneling backports

Pravin Shelar pshelar at nicira.com
Fri Feb 20 23:27:25 UTC 2015


On Fri, Feb 20, 2015 at 3:17 PM, Jesse Gross <jesse at nicira.com> wrote:
> On Fri, Feb 20, 2015 at 2:15 PM, Pravin Shelar <pshelar at nicira.com> wrote:
>> On Fri, Feb 20, 2015 at 10:50 AM, Jesse Gross <jesse at nicira.com> wrote:
>>> This series backports much of the UDP tunnel infrastructure, ultimately
>>> in support of syncing Geneve with upstream and providing outer UDP
>>> checksum support.
>>>
>>> During the backporting process, I realized that there are several
>>> other lurking bugs that were fixed through a more complete UDP
>>> tunnel layer. The ones that I am aware of are:
>>>  * VXLAN TSO fails in some cases because the OVS handle_offload()
>>>    function is used with the upstream GSO handler.
>>>  * Hardware VXLAN offload was disabled on kernels that is otherwise
>>>    supported on since version checks were incremented by the GBP changes.
>>>  * LISP attempts to use hardware offload with NICs that only support
>>>    VXLAN
>>>  * LISP accesses unset inner headers when getting the source port for
>>>    egress info.
>>>
>>> v3: Patches 1-5 were pushed to master and have been removed from this
>>>     series.
>>>
>> I just noticed series does not compile on 3.10 and 3.18 kernel.
>
> OK, here's what I ended up with as a diff. It has both the
> iptunnel_xmit() simplification and a couple minor fixes for those
> kernels that were broken:
>
I am not able to apply it on top of v3 series. Do I need put it in
between patches?

> diff --git a/acinclude.m4 b/acinclude.m4
> index 25110c0..d8b415e 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -365,8 +365,6 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
>    OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [netlink_has_listeners(net->
>                    [OVS_DEFINE([HAVE_GENL_HAS_LISTENERS_TAKES_NET])])
>    OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_cisco_register])
> -  OVS_GREP_IFELSE([$KSRC/include/net/ip_tunnels.h], [iptunnel_xmit.*net],
> -                  [OVS_DEFINE([HAVE_IPTUNNEL_XMIT_NET])])
>    OVS_GREP_IFELSE([$KSRC/include/net/ipv6.h], [IP6_FH_F_SKIP_RH])
>    OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_get_be16])
>    OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be16])
> diff --git a/datapath/linux/compat/gso.c b/datapath/linux/compat/gso.c
> index 79adae1..cad9b18 100644
> --- a/datapath/linux/compat/gso.c
> +++ b/datapath/linux/compat/gso.c
> @@ -242,11 +242,29 @@ free:
>         return segs;
>  }
>
> +static int output_ip(struct sk_buff *skb)
> +{
> +       int ret = NETDEV_TX_OK;
> +       int err;
> +
> +       memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
> +
> +#undef ip_local_out
> +       err = ip_local_out(skb);
> +       if (unlikely(net_xmit_eval(err)))
> +               ret = err;
> +
> +       return ret;
> +}
> +
>  int rpl_ip_local_out(struct sk_buff *skb)
>  {
>         int ret = NETDEV_TX_OK;
>         int id = -1;
>
> +       if (!OVS_GSO_CB(skb)->fix_segment)
> +               return output_ip(skb);
> +
>         if (skb_is_gso(skb)) {
>                 struct iphdr *iph;
>
> @@ -266,7 +284,6 @@ int rpl_ip_local_out(struct sk_buff *skb)
>         while (skb) {
>                 struct sk_buff *next_skb = skb->next;
>                 struct iphdr *iph;
> -               int err;
>
>                 skb->next = NULL;
>
> @@ -274,13 +291,7 @@ int rpl_ip_local_out(struct sk_buff *skb)
>                 if (id >= 0)
>                         iph->id = htons(id++);
>
> -               memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
> -
> -#undef ip_local_out
> -               err = ip_local_out(skb);
> -               if (unlikely(net_xmit_eval(err)))
> -                       ret = err;
> -
> +               ret = output_ip(skb);
>                 skb = next_skb;
>         }
>         return ret;
> diff --git a/datapath/linux/compat/include/net/ip_tunnels.h b/datapath/linux/com
> index 017acf0..bb96ec3 100644
> --- a/datapath/linux/compat/include/net/ip_tunnels.h
> +++ b/datapath/linux/compat/include/net/ip_tunnels.h
> @@ -47,7 +47,6 @@ int iptunnel_pull_header(struct sk_buff *skb, int hdr_len, __b
>  #define TUNNEL_REC     __cpu_to_be16(0x20)
>  #define TUNNEL_VERSION __cpu_to_be16(0x40)
>  #define TUNNEL_NO_KEY  __cpu_to_be16(0x80)
> -#define TUNNEL_DONT_FRAGMENT   __cpu_to_be16(0x0100)
>
>  struct tnl_ptk_info {
>         __be16 flags;
> @@ -60,6 +59,10 @@ struct tnl_ptk_info {
>  #define PACKET_REJECT  1
>  #endif
>
> +#ifndef TUNNEL_DONT_FRAGMENT
> +#define TUNNEL_DONT_FRAGMENT   __cpu_to_be16(0x0100)
> +#endif
> +
>  #ifndef TUNNEL_OAM
>  #define TUNNEL_OAM     __cpu_to_be16(0x0200)
>  #define TUNNEL_CRIT_OPT        __cpu_to_be16(0x0400)
> diff --git a/datapath/linux/compat/ip_tunnels_core.c b/datapath/linux/compat/ip_
> index c37db14..5e38603 100644
> --- a/datapath/linux/compat/ip_tunnels_core.c
> +++ b/datapath/linux/compat/ip_tunnels_core.c
> @@ -36,10 +36,9 @@
>  #include "gso.h"
>
>  #if LINUX_VERSION_CODE < KERNEL_VERSION(3,18,0)
> -static int ovs_iptunnel_xmit(struct sock *sk, struct rtable *rt,
> -                            struct sk_buff *skb, __be32 src, __be32 dst,
> -                            __u8 proto, __u8 tos, __u8 ttl, __be16 df,
> -                            bool xnet)
> +int rpl_iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
> +                      __be32 src, __be32 dst, __u8 proto, __u8 tos, __u8 ttl,
> +                      __be16 df, bool xnet)
>  {
>         int pkt_len = skb->len;
>         struct iphdr *iph;
> @@ -82,30 +81,6 @@ static int ovs_iptunnel_xmit(struct sock *sk, struct rtable *
>         return pkt_len;
>  }
>
> -int rpl_iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
> -                      __be32 src, __be32 dst, __u8 proto, __u8 tos, __u8 ttl,
> -                      __be16 df, bool xnet)
> -{
> -       if (OVS_GSO_CB(skb)->fix_segment)
> -               return ovs_iptunnel_xmit(sk, rt, skb, src, dst, proto, tos,
> -                                        ttl, df, xnet);
> -
> -#undef iptunnel_xmit
> -
> -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
> -       return ovs_iptunnel_xmit(sk, rt, skb, src, dst, proto, tos, ttl,
> -                                df, xnet);
> -#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,15,0)
> -#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);
> -#endif
> -#else
> -       return iptunnel_xmit(sk, rt, skb, src, dst, proto, tos, ttl, df, xnet);
> -#endif
> -}
> -
>  struct sk_buff *ovs_iptunnel_handle_offloads(struct sk_buff *skb,
>                                              bool csum_help, int gso_type_mask,
>                                              void (*fix_segment)(struct sk_buff
> diff --git a/datapath/linux/compat/vxlan.c b/datapath/linux/compat/vxlan.c
> index 7556dc5..960ddba 100644
> --- a/datapath/linux/compat/vxlan.c
> +++ b/datapath/linux/compat/vxlan.c
> @@ -61,13 +61,12 @@
>  #include "vlan.h"
>
>  #ifndef USE_UPSTREAM_VXLAN
> -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,18,0)
> +
>  /* VXLAN protocol header */
>  struct vxlanhdr {
>         __be32 vx_flags;
>         __be32 vx_vni;
>  };
> -#endif
>
>  /* Callback from net/ipv4/udp.c to receive packets */
>  static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)



More information about the dev mailing list