[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