diff mbox

[ovs-dev,1/3] datapath: Add support for 4.1 kernel.

Message ID 1442340563-40106-1-git-send-email-pshelar@nicira.com
State Accepted
Headers show

Commit Message

Pravin B Shelar Sept. 15, 2015, 6:09 p.m. UTC
From: Joe Stringer <joestringer@nicira.com>

Signed-off-by: Joe Stringer <joestringer@nicira.com>
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
---
 .travis.yml                                       |    3 +-
 FAQ.md                                            |    1 +
 acinclude.m4                                      |    4 +-
 datapath/datapath.c                               |    4 +--
 datapath/datapath.h                               |    9 +++----
 datapath/flow.c                                   |    4 ++-
 datapath/linux/compat/geneve.c                    |    2 +-
 datapath/linux/compat/include/net/net_namespace.h |   27 +++++++++++++++++++++
 datapath/linux/compat/include/net/udp_tunnel.h    |   15 +++++++++++-
 datapath/linux/compat/include/net/vxlan.h         |   14 ++++++----
 datapath/linux/compat/stt.c                       |   16 +++++++-----
 datapath/linux/compat/udp_tunnel.c                |   10 ++++----
 datapath/linux/compat/vxlan.c                     |    7 ++---
 datapath/vport-lisp.c                             |    3 +-
 datapath/vport-vxlan.c                            |    2 +-
 15 files changed, 83 insertions(+), 38 deletions(-)

Comments

Jesse Gross Sept. 16, 2015, 9:43 p.m. UTC | #1
On Tue, Sep 15, 2015 at 11:09 AM, Pravin B Shelar <pshelar@nicira.com> wrote:
> From: Joe Stringer <joestringer@nicira.com>
>
> Signed-off-by: Joe Stringer <joestringer@nicira.com>
> Signed-off-by: Pravin B Shelar <pshelar@nicira.com>

At a first glance, it looks like there are a few commits in 4.1 that
aren't represented here:
netlink: implement nla_put_in_addr and nla_put_in6_addr
netlink: implement nla_get_in_addr and nla_get_in6_addr
openvswitch: disable LRO

> diff --git a/.travis.yml b/.travis.yml
> index d14f786..f4b9188 100644
> --- a/.travis.yml
> +++ b/.travis.yml
> @@ -12,7 +12,8 @@ env:
>    - TESTSUITE=1 KERNEL=3.18.1
>    - TESTSUITE=1 OPTS="--enable-shared"
>    - BUILD_ENV="-m32" OPTS="--disable-ssl"
> -  - KERNEL=4.0.2
> +  - KERNEL=4.1.6
> +  - KERNEL=4.0.9

Is there a reason to have both 4.0 and 4.1 tested?

> diff --git a/datapath/datapath.h b/datapath/datapath.h
> index 526ddad..aca9407 100644
> --- a/datapath/datapath.h
> +++ b/datapath/datapath.h
>  static inline struct net *ovs_dp_get_net(const struct datapath *dp)
>  {
> -       return read_pnet(&dp->net);
> +       return rpl_read_pnet(&dp->net);
>  }
>
>  static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
>  {
> -       write_pnet(&dp->net, net);
> +       rpl_write_pnet(&dp->net, net);
>  }

Can we use macros here so we don't need to call the rpl_ versions directly?
Jesse Gross Sept. 16, 2015, 9:49 p.m. UTC | #2
On Wed, Sep 16, 2015 at 2:43 PM, Jesse Gross <jesse@nicira.com> wrote:
> On Tue, Sep 15, 2015 at 11:09 AM, Pravin B Shelar <pshelar@nicira.com> wrote:
>> From: Joe Stringer <joestringer@nicira.com>
>>
>> Signed-off-by: Joe Stringer <joestringer@nicira.com>
>> Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
>
> At a first glance, it looks like there are a few commits in 4.1 that
> aren't represented here:
> netlink: implement nla_put_in_addr and nla_put_in6_addr
> netlink: implement nla_get_in_addr and nla_get_in6_addr
> openvswitch: disable LRO

Never mind on these, I see now they have gone in independently.
Pravin B Shelar Sept. 17, 2015, 6:49 p.m. UTC | #3
On Wed, Sep 16, 2015 at 2:43 PM, Jesse Gross <jesse@nicira.com> wrote:
> On Tue, Sep 15, 2015 at 11:09 AM, Pravin B Shelar <pshelar@nicira.com> wrote:
>> From: Joe Stringer <joestringer@nicira.com>
>>
>> Signed-off-by: Joe Stringer <joestringer@nicira.com>
>> Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
>
> At a first glance, it looks like there are a few commits in 4.1 that
> aren't represented here:
> netlink: implement nla_put_in_addr and nla_put_in6_addr
> netlink: implement nla_get_in_addr and nla_get_in6_addr
> openvswitch: disable LRO
>
>> diff --git a/.travis.yml b/.travis.yml
>> index d14f786..f4b9188 100644
>> --- a/.travis.yml
>> +++ b/.travis.yml
>> @@ -12,7 +12,8 @@ env:
>>    - TESTSUITE=1 KERNEL=3.18.1
>>    - TESTSUITE=1 OPTS="--enable-shared"
>>    - BUILD_ENV="-m32" OPTS="--disable-ssl"
>> -  - KERNEL=4.0.2
>> +  - KERNEL=4.1.6
>> +  - KERNEL=4.0.9
>
> Is there a reason to have both 4.0 and 4.1 tested?
>
right, I have removed it in next patch.

>> diff --git a/datapath/datapath.h b/datapath/datapath.h
>> index 526ddad..aca9407 100644
>> --- a/datapath/datapath.h
>> +++ b/datapath/datapath.h
>>  static inline struct net *ovs_dp_get_net(const struct datapath *dp)
>>  {
>> -       return read_pnet(&dp->net);
>> +       return rpl_read_pnet(&dp->net);
>>  }
>>
>>  static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
>>  {
>> -       write_pnet(&dp->net, net);
>> +       rpl_write_pnet(&dp->net, net);
>>  }
>
> Can we use macros here so we don't need to call the rpl_ versions directly?

If I use the macro then it causes compilation issue in older linux
header that calls write_pnet(),read_pnet() due to undefined struct
possible_net_t. I can move these definitions to compat.h file to make
it clear.
Jesse Gross Sept. 17, 2015, 8:12 p.m. UTC | #4
On Thu, Sep 17, 2015 at 11:49 AM, Pravin Shelar <pshelar@nicira.com> wrote:
> On Wed, Sep 16, 2015 at 2:43 PM, Jesse Gross <jesse@nicira.com> wrote:
>> On Tue, Sep 15, 2015 at 11:09 AM, Pravin B Shelar <pshelar@nicira.com> wrote:
>>> diff --git a/.travis.yml b/.travis.yml
>>> index d14f786..f4b9188 100644
>>> --- a/.travis.yml
>>> +++ b/.travis.yml
>>> @@ -12,7 +12,8 @@ env:
>>>    - TESTSUITE=1 KERNEL=3.18.1
>>>    - TESTSUITE=1 OPTS="--enable-shared"
>>>    - BUILD_ENV="-m32" OPTS="--disable-ssl"
>>> -  - KERNEL=4.0.2
>>> +  - KERNEL=4.1.6
>>> +  - KERNEL=4.0.9
>>
>> Is there a reason to have both 4.0 and 4.1 tested?
>>
> right, I have removed it in next patch.

But then the next patch adds 4.2 and keeps 4.1. I guess the larger
point is, is there a reason to do test builds on each of these point
releases or just do we only need the latest one?

>>> diff --git a/datapath/datapath.h b/datapath/datapath.h
>>> index 526ddad..aca9407 100644
>>> --- a/datapath/datapath.h
>>> +++ b/datapath/datapath.h
>>>  static inline struct net *ovs_dp_get_net(const struct datapath *dp)
>>>  {
>>> -       return read_pnet(&dp->net);
>>> +       return rpl_read_pnet(&dp->net);
>>>  }
>>>
>>>  static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
>>>  {
>>> -       write_pnet(&dp->net, net);
>>> +       rpl_write_pnet(&dp->net, net);
>>>  }
>>
>> Can we use macros here so we don't need to call the rpl_ versions directly?
>
> If I use the macro then it causes compilation issue in older linux
> header that calls write_pnet(),read_pnet() due to undefined struct
> possible_net_t. I can move these definitions to compat.h file to make
> it clear.

OK. In that case, I would just keep it as it is - I'm not sure that it
makes it clearer to have it in compat.h since it really is a
backported function. Either way is fine though.
Pravin B Shelar Sept. 17, 2015, 8:22 p.m. UTC | #5
On Thu, Sep 17, 2015 at 1:12 PM, Jesse Gross <jesse@nicira.com> wrote:
> On Thu, Sep 17, 2015 at 11:49 AM, Pravin Shelar <pshelar@nicira.com> wrote:
>> On Wed, Sep 16, 2015 at 2:43 PM, Jesse Gross <jesse@nicira.com> wrote:
>>> On Tue, Sep 15, 2015 at 11:09 AM, Pravin B Shelar <pshelar@nicira.com> wrote:
>>>> diff --git a/.travis.yml b/.travis.yml
>>>> index d14f786..f4b9188 100644
>>>> --- a/.travis.yml
>>>> +++ b/.travis.yml
>>>> @@ -12,7 +12,8 @@ env:
>>>>    - TESTSUITE=1 KERNEL=3.18.1
>>>>    - TESTSUITE=1 OPTS="--enable-shared"
>>>>    - BUILD_ENV="-m32" OPTS="--disable-ssl"
>>>> -  - KERNEL=4.0.2
>>>> +  - KERNEL=4.1.6
>>>> +  - KERNEL=4.0.9
>>>
>>> Is there a reason to have both 4.0 and 4.1 tested?
>>>
>> right, I have removed it in next patch.
>
> But then the next patch adds 4.2 and keeps 4.1. I guess the larger
> point is, is there a reason to do test builds on each of these point
> releases or just do we only need the latest one?
>
I just wanted to keep it consistent with kernel versions listed on
kernel.org. Those kernel most likely change and therefore needs to be
compiled for.

>>>> diff --git a/datapath/datapath.h b/datapath/datapath.h
>>>> index 526ddad..aca9407 100644
>>>> --- a/datapath/datapath.h
>>>> +++ b/datapath/datapath.h
>>>>  static inline struct net *ovs_dp_get_net(const struct datapath *dp)
>>>>  {
>>>> -       return read_pnet(&dp->net);
>>>> +       return rpl_read_pnet(&dp->net);
>>>>  }
>>>>
>>>>  static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
>>>>  {
>>>> -       write_pnet(&dp->net, net);
>>>> +       rpl_write_pnet(&dp->net, net);
>>>>  }
>>>
>>> Can we use macros here so we don't need to call the rpl_ versions directly?
>>
>> If I use the macro then it causes compilation issue in older linux
>> header that calls write_pnet(),read_pnet() due to undefined struct
>> possible_net_t. I can move these definitions to compat.h file to make
>> it clear.
>
> OK. In that case, I would just keep it as it is - I'm not sure that it
> makes it clearer to have it in compat.h since it really is a
> backported function. Either way is fine though.

ok. I will keep it as it is.
Jesse Gross Sept. 18, 2015, 12:44 a.m. UTC | #6
On Thu, Sep 17, 2015 at 1:22 PM, Pravin Shelar <pshelar@nicira.com> wrote:
> On Thu, Sep 17, 2015 at 1:12 PM, Jesse Gross <jesse@nicira.com> wrote:
>> On Thu, Sep 17, 2015 at 11:49 AM, Pravin Shelar <pshelar@nicira.com> wrote:
>>> On Wed, Sep 16, 2015 at 2:43 PM, Jesse Gross <jesse@nicira.com> wrote:
>>>> On Tue, Sep 15, 2015 at 11:09 AM, Pravin B Shelar <pshelar@nicira.com> wrote:
>>>>> diff --git a/.travis.yml b/.travis.yml
>>>>> index d14f786..f4b9188 100644
>>>>> --- a/.travis.yml
>>>>> +++ b/.travis.yml
>>>>> @@ -12,7 +12,8 @@ env:
>>>>>    - TESTSUITE=1 KERNEL=3.18.1
>>>>>    - TESTSUITE=1 OPTS="--enable-shared"
>>>>>    - BUILD_ENV="-m32" OPTS="--disable-ssl"
>>>>> -  - KERNEL=4.0.2
>>>>> +  - KERNEL=4.1.6
>>>>> +  - KERNEL=4.0.9
>>>>
>>>> Is there a reason to have both 4.0 and 4.1 tested?
>>>>
>>> right, I have removed it in next patch.
>>
>> But then the next patch adds 4.2 and keeps 4.1. I guess the larger
>> point is, is there a reason to do test builds on each of these point
>> releases or just do we only need the latest one?
>>
> I just wanted to keep it consistent with kernel versions listed on
> kernel.org. Those kernel most likely change and therefore needs to be
> compiled for.

OK, that's fine. I just wanted to make sure there was a reason.

I think that means that all of my concerns were addressed without
changes to this patch:
Acked-by: Jesse Gross <jesse@nicira.com>
Pravin B Shelar Sept. 18, 2015, 8:35 p.m. UTC | #7
On Thu, Sep 17, 2015 at 5:44 PM, Jesse Gross <jesse@nicira.com> wrote:
> On Thu, Sep 17, 2015 at 1:22 PM, Pravin Shelar <pshelar@nicira.com> wrote:
>> On Thu, Sep 17, 2015 at 1:12 PM, Jesse Gross <jesse@nicira.com> wrote:
>>> On Thu, Sep 17, 2015 at 11:49 AM, Pravin Shelar <pshelar@nicira.com> wrote:
>>>> On Wed, Sep 16, 2015 at 2:43 PM, Jesse Gross <jesse@nicira.com> wrote:
>>>>> On Tue, Sep 15, 2015 at 11:09 AM, Pravin B Shelar <pshelar@nicira.com> wrote:
>>>>>> diff --git a/.travis.yml b/.travis.yml
>>>>>> index d14f786..f4b9188 100644
>>>>>> --- a/.travis.yml
>>>>>> +++ b/.travis.yml
>>>>>> @@ -12,7 +12,8 @@ env:
>>>>>>    - TESTSUITE=1 KERNEL=3.18.1
>>>>>>    - TESTSUITE=1 OPTS="--enable-shared"
>>>>>>    - BUILD_ENV="-m32" OPTS="--disable-ssl"
>>>>>> -  - KERNEL=4.0.2
>>>>>> +  - KERNEL=4.1.6
>>>>>> +  - KERNEL=4.0.9
>>>>>
>>>>> Is there a reason to have both 4.0 and 4.1 tested?
>>>>>
>>>> right, I have removed it in next patch.
>>>
>>> But then the next patch adds 4.2 and keeps 4.1. I guess the larger
>>> point is, is there a reason to do test builds on each of these point
>>> releases or just do we only need the latest one?
>>>
>> I just wanted to keep it consistent with kernel versions listed on
>> kernel.org. Those kernel most likely change and therefore needs to be
>> compiled for.
>
> OK, that's fine. I just wanted to make sure there was a reason.
>
> I think that means that all of my concerns were addressed without
> changes to this patch:
> Acked-by: Jesse Gross <jesse@nicira.com>

Thanks. I pushed patch to master.
Thomas F Herbert Sept. 22, 2015, 8:11 p.m. UTC | #8
On 9/15/15 2:09 PM, Pravin B Shelar wrote:
> From: Joe Stringer <joestringer@nicira.com>
>
> Signed-off-by: Joe Stringer <joestringer@nicira.com>
> Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
> ---
>   .travis.yml                                       |    3 +-
>   FAQ.md                                            |    1 +
>   acinclude.m4                                      |    4 +-
>   datapath/datapath.c                               |    4 +--
>   datapath/datapath.h                               |    9 +++----
>   datapath/flow.c                                   |    4 ++-
>   datapath/linux/compat/geneve.c                    |    2 +-
>   datapath/linux/compat/include/net/net_namespace.h |   27 +++++++++++++++++++++
>   datapath/linux/compat/include/net/udp_tunnel.h    |   15 +++++++++++-
>   datapath/linux/compat/include/net/vxlan.h         |   14 ++++++----
>   datapath/linux/compat/stt.c                       |   16 +++++++-----
>   datapath/linux/compat/udp_tunnel.c                |   10 ++++----
>   datapath/linux/compat/vxlan.c                     |    7 ++---
>   datapath/vport-lisp.c                             |    3 +-
>   datapath/vport-vxlan.c                            |    2 +-
Pravin, when will the changes for contrak support that were merged into 
upstream net-next be backported to OVS? I don't see them in this patch.
>   15 files changed, 83 insertions(+), 38 deletions(-)
>
> diff --git a/.travis.yml b/.travis.yml
> index d14f786..f4b9188 100644
> --- a/.travis.yml
> +++ b/.travis.yml
> @@ -12,7 +12,8 @@ env:
>     - TESTSUITE=1 KERNEL=3.18.1
>     - TESTSUITE=1 OPTS="--enable-shared"
>     - BUILD_ENV="-m32" OPTS="--disable-ssl"
> -  - KERNEL=4.0.2
> +  - KERNEL=4.1.6
> +  - KERNEL=4.0.9
>     - KERNEL=3.17.7 DPDK=1
>     - KERNEL=3.17.7 DPDK=1 OPTS="--enable-shared"
>     - KERNEL=3.17.7
> diff --git a/FAQ.md b/FAQ.md
> index 631f6a4..cea517d 100644
> --- a/FAQ.md
> +++ b/FAQ.md
> @@ -156,6 +156,7 @@ A: The following table lists the Linux kernel versions against which the
>   |    2.1.x     | 2.6.32 to 3.11
>   |    2.3.x     | 2.6.32 to 3.14
>   |    2.4.x     | 2.6.32 to 4.0
> +|    2.5.x     | 2.6.32 to 4.1
>
>      Open vSwitch userspace should also work with the Linux kernel module
>      built into Linux 3.3 and later.
> diff --git a/acinclude.m4 b/acinclude.m4
> index b755dc4..229f900 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -134,10 +134,10 @@ AC_DEFUN([OVS_CHECK_LINUX], [
>       AC_MSG_RESULT([$kversion])
>
>       if test "$version" -ge 4; then
> -       if test "$version" = 4 && test "$patchlevel" -le 0; then
> +       if test "$version" = 4 && test "$patchlevel" -le 1; then
>             : # Linux 4.x
>          else
> -          AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.0.x is not supported (please refer to the FAQ for advice)])
> +          AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.1.x is not supported (please refer to the FAQ for advice)])
>          fi
>       elif test "$version" = 3; then
>          : # Linux 3.x
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index 73c0b4a..1115649 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -205,7 +205,6 @@ static void destroy_dp_rcu(struct rcu_head *rcu)
>
>   	ovs_flow_tbl_destroy(&dp->table);
>   	free_percpu(dp->stats_percpu);
> -	release_net(ovs_dp_get_net(dp));
>   	kfree(dp->ports);
>   	kfree(dp);
>   }
> @@ -1527,7 +1526,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
>   	if (dp == NULL)
>   		goto err_free_reply;
>
> -	ovs_dp_set_net(dp, hold_net(sock_net(skb->sk)));
> +	ovs_dp_set_net(dp, sock_net(skb->sk));
>
>   	/* Allocate table. */
>   	err = ovs_flow_tbl_init(&dp->table);
> @@ -1601,7 +1600,6 @@ err_destroy_percpu:
>   err_destroy_table:
>   	ovs_flow_tbl_destroy(&dp->table);
>   err_free_dp:
> -	release_net(ovs_dp_get_net(dp));
>   	kfree(dp);
>   err_free_reply:
>   	kfree_skb(reply);
> diff --git a/datapath/datapath.h b/datapath/datapath.h
> index 526ddad..aca9407 100644
> --- a/datapath/datapath.h
> +++ b/datapath/datapath.h
> @@ -25,6 +25,7 @@
>   #include <linux/netdevice.h>
>   #include <linux/skbuff.h>
>   #include <linux/u64_stats_sync.h>
> +#include <net/net_namespace.h>
>
>   #include "compat.h"
>   #include "flow.h"
> @@ -86,10 +87,8 @@ struct datapath {
>   	/* Stats. */
>   	struct dp_stats_percpu __percpu *stats_percpu;
>
> -#ifdef CONFIG_NET_NS
>   	/* Network namespace ref. */
> -	struct net *net;
> -#endif
> +	possible_net_t net;
>
>   	u32 user_features;
>   };
> @@ -156,12 +155,12 @@ int lockdep_ovsl_is_held(void);
>
>   static inline struct net *ovs_dp_get_net(const struct datapath *dp)
>   {
> -	return read_pnet(&dp->net);
> +	return rpl_read_pnet(&dp->net);
>   }
>
>   static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
>   {
> -	write_pnet(&dp->net, net);
> +	rpl_write_pnet(&dp->net, net);
>   }
>
>   struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no);
> diff --git a/datapath/flow.c b/datapath/flow.c
> index a7a2063..8ef60d1 100644
> --- a/datapath/flow.c
> +++ b/datapath/flow.c
> @@ -101,7 +101,9 @@ void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags,
>
>   				new_stats =
>   					kmem_cache_alloc_node(flow_stats_cache,
> -							      GFP_THISNODE |
> +                                                              GFP_NOWAIT |
> +                                                              __GFP_THISNODE |
> +                                                              __GFP_NOWARN |
>   							      __GFP_NOMEMALLOC,
>   							      node);
>   				if (likely(new_stats)) {
> diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c
> index 78d3395..8e80180 100644
> --- a/datapath/linux/compat/geneve.c
> +++ b/datapath/linux/compat/geneve.c
> @@ -117,7 +117,7 @@ int rpl_geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
>
>   	ovs_skb_set_inner_protocol(skb, htons(ETH_P_TEB));
>
> -	return udp_tunnel_xmit_skb(rt, skb, src, dst,
> +	return udp_tunnel_xmit_skb(rt, gs->sock->sk, skb, src, dst,
>   				   tos, ttl, df, src_port, dst_port, xnet,
>   				   !csum);
>   }
> diff --git a/datapath/linux/compat/include/net/net_namespace.h b/datapath/linux/compat/include/net/net_namespace.h
> index b7dbfe3..edfa131 100644
> --- a/datapath/linux/compat/include/net/net_namespace.h
> +++ b/datapath/linux/compat/include/net/net_namespace.h
> @@ -51,4 +51,31 @@ static void rpl_unregister_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_p
>   #define DEFINE_COMPAT_PNET_REG_FUNC(TYPE)
>   #endif /* 2.6.33 */
>
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
> +typedef struct {
> +#ifdef CONFIG_NET_NS
> +	struct net *net;
> +#endif
> +} possible_net_t;
> +
> +static inline void rpl_write_pnet(possible_net_t *pnet, struct net *net)
> +{
> +#ifdef CONFIG_NET_NS
> +	pnet->net = net;
> +#endif
> +}
> +
> +static inline struct net *rpl_read_pnet(const possible_net_t *pnet)
> +{
> +#ifdef CONFIG_NET_NS
> +	return pnet->net;
> +#else
> +	return &init_net;
> +#endif
> +}
> +#else /* Linux >= 4.1 */
> +#define rpl_read_pnet read_pnet
> +#define rpl_write_pnet write_pnet
> +#endif /* Linux >= 4.1 */
> +
>   #endif /* net/net_namespace.h wrapper */
> diff --git a/datapath/linux/compat/include/net/udp_tunnel.h b/datapath/linux/compat/include/net/udp_tunnel.h
> index 81cb3df..d334746 100644
> --- a/datapath/linux/compat/include/net/udp_tunnel.h
> +++ b/datapath/linux/compat/include/net/udp_tunnel.h
> @@ -19,6 +19,18 @@ rpl_udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum,
>   }
>   #define udp_tunnel_handle_offloads rpl_udp_tunnel_handle_offloads
>
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
> +static inline int rpl_udp_tunnel_xmit_skb(struct rtable *rt,
> +					  struct sock *sk, struct sk_buff *skb,
> +					  __be32 src, __be32 dst, __u8 tos, __u8 ttl,
> +					  __be16 df, __be16 src_port, __be16 dst_port,
> +					  bool xnet, bool nocheck)
> +{
> +	return udp_tunnel_xmit_skb(rt, skb, src, dst, tos, ttl, df, src_port,
> +				   dst_port, xnet, nocheck);
> +}
> +#define udp_tunnel_xmit_skb rpl_udp_tunnel_xmit_skb
> +#endif
>   #else
>
>   #include <net/ip_tunnels.h>
> @@ -71,7 +83,8 @@ void rpl_setup_udp_tunnel_sock(struct net *net, struct socket *sock,
>
>   /* Transmit the skb using UDP encapsulation. */
>   #define udp_tunnel_xmit_skb rpl_udp_tunnel_xmit_skb
> -int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
> +int rpl_udp_tunnel_xmit_skb(struct rtable *rt,
> +			    struct sock *sk, struct sk_buff *skb,
>   			    __be32 src, __be32 dst, __u8 tos, __u8 ttl,
>   			    __be16 df, __be16 src_port, __be16 dst_port,
>   			    bool xnet, bool nocheck);
> diff --git a/datapath/linux/compat/include/net/vxlan.h b/datapath/linux/compat/include/net/vxlan.h
> index 0d60c18..cafff79 100644
> --- a/datapath/linux/compat/include/net/vxlan.h
> +++ b/datapath/linux/compat/include/net/vxlan.h
> @@ -88,10 +88,9 @@ struct vxlanhdr_gbp {
>   #endif
>
>   #ifdef USE_UPSTREAM_VXLAN
> -static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
> -                   struct rtable *rt, struct sk_buff *skb,
> -                   __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
> -                   __be16 src_port, __be16 dst_port,
> +static inline int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk,
> +		   struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos,
> +		   __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port,
>   		   struct vxlan_metadata *md, bool xnet, u32 vxflags)
>   {
>   	if (skb_is_gso(skb) && skb_is_encapsulated(skb)) {
> @@ -99,7 +98,11 @@ static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
>   		return -ENOSYS;
>   	}
>
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
>   	return vxlan_xmit_skb(rt, skb, src, dst, tos, ttl, df,
> +#else
> +	return vxlan_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df,
> +#endif
>   			      src_port, dst_port, md, xnet, vxflags);
>   }
>
> @@ -138,8 +141,7 @@ struct vxlan_sock *rpl_vxlan_sock_add(struct net *net, __be16 port,
>   void rpl_vxlan_sock_release(struct vxlan_sock *vs);
>
>   #define vxlan_xmit_skb rpl_vxlan_xmit_skb
> -int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
> -		       struct rtable *rt, struct sk_buff *skb,
> +int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
>   		       __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
>   		       __be16 src_port, __be16 dst_port,
>   		       struct vxlan_metadata *md, bool xnet, u32 vxflags);
> diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c
> index dd21753..e27cedf 100644
> --- a/datapath/linux/compat/stt.c
> +++ b/datapath/linux/compat/stt.c
> @@ -1320,16 +1320,18 @@ static void clean_percpu(struct work_struct *work)
>   }
>
>   #ifdef HAVE_NF_HOOKFN_ARG_OPS
> -#define FIRST_PARAM const struct nf_hook_ops *ops,
> +#define FIRST_PARAM const struct nf_hook_ops *ops
>   #else
> -#define FIRST_PARAM unsigned int hooknum,
> +#define FIRST_PARAM unsigned int hooknum
>   #endif
>
> -static unsigned int nf_ip_hook(FIRST_PARAM
> -			       struct sk_buff *skb,
> -			       const struct net_device *in,
> -			       const struct net_device *out,
> -			       int (*okfn)(struct sk_buff *))
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
> +#define LAST_PARAM const struct nf_hook_state *state
> +#else
> +#define LAST_PARAM const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)
> +#endif
> +
> +static unsigned int nf_ip_hook(FIRST_PARAM, struct sk_buff *skb, LAST_PARAM)
>   {
>   	struct stt_sock *stt_sock;
>   	int ip_hdr_len;
> diff --git a/datapath/linux/compat/udp_tunnel.c b/datapath/linux/compat/udp_tunnel.c
> index c84113b..680fd83 100644
> --- a/datapath/linux/compat/udp_tunnel.c
> +++ b/datapath/linux/compat/udp_tunnel.c
> @@ -142,10 +142,10 @@ void ovs_udp_csum_gso(struct sk_buff *skb)
>   }
>   EXPORT_SYMBOL_GPL(ovs_udp_csum_gso);
>
> -int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
> -			    __be32 src, __be32 dst, __u8 tos, __u8 ttl,
> -			    __be16 df, __be16 src_port, __be16 dst_port,
> -			    bool xnet, bool nocheck)
> +int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk,
> +			    struct sk_buff *skb, __be32 src, __be32 dst,
> +			    __u8 tos, __u8 ttl, __be16 df, __be16 src_port,
> +			    __be16 dst_port, bool xnet, bool nocheck)
>   {
>   	struct udphdr *uh;
>
> @@ -159,7 +159,7 @@ int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
>
>   	udp_set_csum(nocheck, skb, src, dst, skb->len);
>
> -	return iptunnel_xmit(skb->sk, rt, skb, src, dst, IPPROTO_UDP,
> +	return iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP,
>   			     tos, ttl, df, xnet);
>   }
>   EXPORT_SYMBOL_GPL(rpl_udp_tunnel_xmit_skb);
> diff --git a/datapath/linux/compat/vxlan.c b/datapath/linux/compat/vxlan.c
> index 129f171..fd454ae 100644
> --- a/datapath/linux/compat/vxlan.c
> +++ b/datapath/linux/compat/vxlan.c
> @@ -180,8 +180,7 @@ static void vxlan_build_gbp_hdr(struct vxlanhdr *vxh, u32 vxflags,
>   	gbp->policy_id = htons(md->gbp & VXLAN_GBP_ID_MASK);
>   }
>
> -int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
> -		       struct rtable *rt, struct sk_buff *skb,
> +int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
>   		       __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
>   		       __be16 src_port, __be16 dst_port,
>   		       struct vxlan_metadata *md, bool xnet, u32 vxflags)
> @@ -217,11 +216,11 @@ int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
>   	if (vxflags & VXLAN_F_GBP)
>   		vxlan_build_gbp_hdr(vxh, vxflags, md);
>
> -	vxlan_set_owner(vs->sock->sk, skb);
> +	vxlan_set_owner(sk, skb);
>
>   	ovs_skb_set_inner_protocol(skb, htons(ETH_P_TEB));
>
> -	return udp_tunnel_xmit_skb(rt, skb, src, dst, tos,
> +	return udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos,
>   				   ttl, df, src_port, dst_port, xnet,
>   				   !udp_sum);
>   }
> diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c
> index 0024eb4..104a21d 100644
> --- a/datapath/vport-lisp.c
> +++ b/datapath/vport-lisp.c
> @@ -455,7 +455,8 @@ static int lisp_send(struct vport *vport, struct sk_buff *skb)
>   	ovs_skb_set_inner_protocol(skb, skb->protocol);
>
>   	df = tun_key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
> -	sent_len = udp_tunnel_xmit_skb(rt, skb, saddr, tun_key->ipv4_dst,
> +	sent_len = udp_tunnel_xmit_skb(rt, lisp_port->lisp_rcv_socket->sk, skb,
> +				       saddr, tun_key->ipv4_dst,
>   				       tun_key->ipv4_tos, tun_key->ipv4_ttl,
>   				       df, src_port, dst_port, false, true);
>
> diff --git a/datapath/vport-vxlan.c b/datapath/vport-vxlan.c
> index eff7ca2..fc9f350 100644
> --- a/datapath/vport-vxlan.c
> +++ b/datapath/vport-vxlan.c
> @@ -260,7 +260,7 @@ static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb)
>   	vxflags = vxlan_port->exts |
>   		      (tun_key->tun_flags & TUNNEL_CSUM ? VXLAN_F_UDP_CSUM : 0);
>
> -	err = vxlan_xmit_skb(vxlan_port->vs, rt, skb,
> +	err = vxlan_xmit_skb(rt, vxlan_port->vs->sock->sk, skb,
>   			     saddr, tun_key->ipv4_dst,
>   			     tun_key->ipv4_tos,
>   			     tun_key->ipv4_ttl, df,
>
Pravin B Shelar Sept. 22, 2015, 8:15 p.m. UTC | #9
On Tue, Sep 22, 2015 at 1:11 PM, Thomas F Herbert
<thomasfherbert@gmail.com> wrote:
> On 9/15/15 2:09 PM, Pravin B Shelar wrote:
>>
>> From: Joe Stringer <joestringer@nicira.com>
>>
>> Signed-off-by: Joe Stringer <joestringer@nicira.com>
>> Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
>> ---
>>   .travis.yml                                       |    3 +-
>>   FAQ.md                                            |    1 +
>>   acinclude.m4                                      |    4 +-
>>   datapath/datapath.c                               |    4 +--
>>   datapath/datapath.h                               |    9 +++----
>>   datapath/flow.c                                   |    4 ++-
>>   datapath/linux/compat/geneve.c                    |    2 +-
>>   datapath/linux/compat/include/net/net_namespace.h |   27
>> +++++++++++++++++++++
>>   datapath/linux/compat/include/net/udp_tunnel.h    |   15 +++++++++++-
>>   datapath/linux/compat/include/net/vxlan.h         |   14 ++++++----
>>   datapath/linux/compat/stt.c                       |   16 +++++++-----
>>   datapath/linux/compat/udp_tunnel.c                |   10 ++++----
>>   datapath/linux/compat/vxlan.c                     |    7 ++---
>>   datapath/vport-lisp.c                             |    3 +-
>>   datapath/vport-vxlan.c                            |    2 +-
>
> Pravin, when will the changes for contrak support that were merged into
> upstream net-next be backported to OVS? I don't see them in this patch.
>
That will be done by separate patch. Joe is working on it.
Thomas F Herbert Sept. 23, 2015, 1:28 p.m. UTC | #10
On 9/22/15 4:15 PM, Pravin Shelar wrote:
> On Tue, Sep 22, 2015 at 1:11 PM, Thomas F Herbert
> <thomasfherbert@gmail.com> wrote:
>> On 9/15/15 2:09 PM, Pravin B Shelar wrote:
>>>
>>> From: Joe Stringer <joestringer@nicira.com>
>>>
>>> Signed-off-by: Joe Stringer <joestringer@nicira.com>
>>> Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
>>> ---
>>>    .travis.yml                                       |    3 +-
>>>    FAQ.md                                            |    1 +
>>>    acinclude.m4                                      |    4 +-
>>>    datapath/datapath.c                               |    4 +--
>>>    datapath/datapath.h                               |    9 +++----
>>>    datapath/flow.c                                   |    4 ++-
>>>    datapath/linux/compat/geneve.c                    |    2 +-
>>>    datapath/linux/compat/include/net/net_namespace.h |   27
>>> +++++++++++++++++++++
>>>    datapath/linux/compat/include/net/udp_tunnel.h    |   15 +++++++++++-
>>>    datapath/linux/compat/include/net/vxlan.h         |   14 ++++++----
>>>    datapath/linux/compat/stt.c                       |   16 +++++++-----
>>>    datapath/linux/compat/udp_tunnel.c                |   10 ++++----
>>>    datapath/linux/compat/vxlan.c                     |    7 ++---
>>>    datapath/vport-lisp.c                             |    3 +-
>>>    datapath/vport-vxlan.c                            |    2 +-
>>
>> Pravin, when will the changes for contrak support that were merged into
>> upstream net-next be backported to OVS? I don't see them in this patch.
>>
> That will be done by separate patch. Joe is working on it.
Thanks. I asked because I see the 4 CT attributes show up in user space 
when I send an upcall with a double tagged vlan from my kernel module 
with 802.1ad patch.
>
diff mbox

Patch

diff --git a/.travis.yml b/.travis.yml
index d14f786..f4b9188 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -12,7 +12,8 @@  env:
   - TESTSUITE=1 KERNEL=3.18.1
   - TESTSUITE=1 OPTS="--enable-shared"
   - BUILD_ENV="-m32" OPTS="--disable-ssl"
-  - KERNEL=4.0.2
+  - KERNEL=4.1.6
+  - KERNEL=4.0.9
   - KERNEL=3.17.7 DPDK=1
   - KERNEL=3.17.7 DPDK=1 OPTS="--enable-shared"
   - KERNEL=3.17.7
diff --git a/FAQ.md b/FAQ.md
index 631f6a4..cea517d 100644
--- a/FAQ.md
+++ b/FAQ.md
@@ -156,6 +156,7 @@  A: The following table lists the Linux kernel versions against which the
 |    2.1.x     | 2.6.32 to 3.11
 |    2.3.x     | 2.6.32 to 3.14
 |    2.4.x     | 2.6.32 to 4.0
+|    2.5.x     | 2.6.32 to 4.1
 
    Open vSwitch userspace should also work with the Linux kernel module
    built into Linux 3.3 and later.
diff --git a/acinclude.m4 b/acinclude.m4
index b755dc4..229f900 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -134,10 +134,10 @@  AC_DEFUN([OVS_CHECK_LINUX], [
     AC_MSG_RESULT([$kversion])
 
     if test "$version" -ge 4; then
-       if test "$version" = 4 && test "$patchlevel" -le 0; then
+       if test "$version" = 4 && test "$patchlevel" -le 1; then
           : # Linux 4.x
        else
-          AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.0.x is not supported (please refer to the FAQ for advice)])
+          AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 4.1.x is not supported (please refer to the FAQ for advice)])
        fi
     elif test "$version" = 3; then
        : # Linux 3.x
diff --git a/datapath/datapath.c b/datapath/datapath.c
index 73c0b4a..1115649 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -205,7 +205,6 @@  static void destroy_dp_rcu(struct rcu_head *rcu)
 
 	ovs_flow_tbl_destroy(&dp->table);
 	free_percpu(dp->stats_percpu);
-	release_net(ovs_dp_get_net(dp));
 	kfree(dp->ports);
 	kfree(dp);
 }
@@ -1527,7 +1526,7 @@  static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
 	if (dp == NULL)
 		goto err_free_reply;
 
-	ovs_dp_set_net(dp, hold_net(sock_net(skb->sk)));
+	ovs_dp_set_net(dp, sock_net(skb->sk));
 
 	/* Allocate table. */
 	err = ovs_flow_tbl_init(&dp->table);
@@ -1601,7 +1600,6 @@  err_destroy_percpu:
 err_destroy_table:
 	ovs_flow_tbl_destroy(&dp->table);
 err_free_dp:
-	release_net(ovs_dp_get_net(dp));
 	kfree(dp);
 err_free_reply:
 	kfree_skb(reply);
diff --git a/datapath/datapath.h b/datapath/datapath.h
index 526ddad..aca9407 100644
--- a/datapath/datapath.h
+++ b/datapath/datapath.h
@@ -25,6 +25,7 @@ 
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
 #include <linux/u64_stats_sync.h>
+#include <net/net_namespace.h>
 
 #include "compat.h"
 #include "flow.h"
@@ -86,10 +87,8 @@  struct datapath {
 	/* Stats. */
 	struct dp_stats_percpu __percpu *stats_percpu;
 
-#ifdef CONFIG_NET_NS
 	/* Network namespace ref. */
-	struct net *net;
-#endif
+	possible_net_t net;
 
 	u32 user_features;
 };
@@ -156,12 +155,12 @@  int lockdep_ovsl_is_held(void);
 
 static inline struct net *ovs_dp_get_net(const struct datapath *dp)
 {
-	return read_pnet(&dp->net);
+	return rpl_read_pnet(&dp->net);
 }
 
 static inline void ovs_dp_set_net(struct datapath *dp, struct net *net)
 {
-	write_pnet(&dp->net, net);
+	rpl_write_pnet(&dp->net, net);
 }
 
 struct vport *ovs_lookup_vport(const struct datapath *dp, u16 port_no);
diff --git a/datapath/flow.c b/datapath/flow.c
index a7a2063..8ef60d1 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -101,7 +101,9 @@  void ovs_flow_stats_update(struct sw_flow *flow, __be16 tcp_flags,
 
 				new_stats =
 					kmem_cache_alloc_node(flow_stats_cache,
-							      GFP_THISNODE |
+                                                              GFP_NOWAIT |
+                                                              __GFP_THISNODE |
+                                                              __GFP_NOWARN |
 							      __GFP_NOMEMALLOC,
 							      node);
 				if (likely(new_stats)) {
diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c
index 78d3395..8e80180 100644
--- a/datapath/linux/compat/geneve.c
+++ b/datapath/linux/compat/geneve.c
@@ -117,7 +117,7 @@  int rpl_geneve_xmit_skb(struct geneve_sock *gs, struct rtable *rt,
 
 	ovs_skb_set_inner_protocol(skb, htons(ETH_P_TEB));
 
-	return udp_tunnel_xmit_skb(rt, skb, src, dst,
+	return udp_tunnel_xmit_skb(rt, gs->sock->sk, skb, src, dst,
 				   tos, ttl, df, src_port, dst_port, xnet,
 				   !csum);
 }
diff --git a/datapath/linux/compat/include/net/net_namespace.h b/datapath/linux/compat/include/net/net_namespace.h
index b7dbfe3..edfa131 100644
--- a/datapath/linux/compat/include/net/net_namespace.h
+++ b/datapath/linux/compat/include/net/net_namespace.h
@@ -51,4 +51,31 @@  static void rpl_unregister_pernet_gen_##TYPE(struct rpl_pernet_operations *rpl_p
 #define DEFINE_COMPAT_PNET_REG_FUNC(TYPE)
 #endif /* 2.6.33 */
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
+typedef struct {
+#ifdef CONFIG_NET_NS
+	struct net *net;
+#endif
+} possible_net_t;
+
+static inline void rpl_write_pnet(possible_net_t *pnet, struct net *net)
+{
+#ifdef CONFIG_NET_NS
+	pnet->net = net;
+#endif
+}
+
+static inline struct net *rpl_read_pnet(const possible_net_t *pnet)
+{
+#ifdef CONFIG_NET_NS
+	return pnet->net;
+#else
+	return &init_net;
+#endif
+}
+#else /* Linux >= 4.1 */
+#define rpl_read_pnet read_pnet
+#define rpl_write_pnet write_pnet
+#endif /* Linux >= 4.1 */
+
 #endif /* net/net_namespace.h wrapper */
diff --git a/datapath/linux/compat/include/net/udp_tunnel.h b/datapath/linux/compat/include/net/udp_tunnel.h
index 81cb3df..d334746 100644
--- a/datapath/linux/compat/include/net/udp_tunnel.h
+++ b/datapath/linux/compat/include/net/udp_tunnel.h
@@ -19,6 +19,18 @@  rpl_udp_tunnel_handle_offloads(struct sk_buff *skb, bool udp_csum,
 }
 #define udp_tunnel_handle_offloads rpl_udp_tunnel_handle_offloads
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
+static inline int rpl_udp_tunnel_xmit_skb(struct rtable *rt,
+					  struct sock *sk, struct sk_buff *skb,
+					  __be32 src, __be32 dst, __u8 tos, __u8 ttl,
+					  __be16 df, __be16 src_port, __be16 dst_port,
+					  bool xnet, bool nocheck)
+{
+	return udp_tunnel_xmit_skb(rt, skb, src, dst, tos, ttl, df, src_port,
+				   dst_port, xnet, nocheck);
+}
+#define udp_tunnel_xmit_skb rpl_udp_tunnel_xmit_skb
+#endif
 #else
 
 #include <net/ip_tunnels.h>
@@ -71,7 +83,8 @@  void rpl_setup_udp_tunnel_sock(struct net *net, struct socket *sock,
 
 /* Transmit the skb using UDP encapsulation. */
 #define udp_tunnel_xmit_skb rpl_udp_tunnel_xmit_skb
-int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
+int rpl_udp_tunnel_xmit_skb(struct rtable *rt,
+			    struct sock *sk, struct sk_buff *skb,
 			    __be32 src, __be32 dst, __u8 tos, __u8 ttl,
 			    __be16 df, __be16 src_port, __be16 dst_port,
 			    bool xnet, bool nocheck);
diff --git a/datapath/linux/compat/include/net/vxlan.h b/datapath/linux/compat/include/net/vxlan.h
index 0d60c18..cafff79 100644
--- a/datapath/linux/compat/include/net/vxlan.h
+++ b/datapath/linux/compat/include/net/vxlan.h
@@ -88,10 +88,9 @@  struct vxlanhdr_gbp {
 #endif
 
 #ifdef USE_UPSTREAM_VXLAN
-static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
-                   struct rtable *rt, struct sk_buff *skb,
-                   __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
-                   __be16 src_port, __be16 dst_port,
+static inline int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk,
+		   struct sk_buff *skb, __be32 src, __be32 dst, __u8 tos,
+		   __u8 ttl, __be16 df, __be16 src_port, __be16 dst_port,
 		   struct vxlan_metadata *md, bool xnet, u32 vxflags)
 {
 	if (skb_is_gso(skb) && skb_is_encapsulated(skb)) {
@@ -99,7 +98,11 @@  static inline int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
 		return -ENOSYS;
 	}
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
 	return vxlan_xmit_skb(rt, skb, src, dst, tos, ttl, df,
+#else
+	return vxlan_xmit_skb(rt, sk, skb, src, dst, tos, ttl, df,
+#endif
 			      src_port, dst_port, md, xnet, vxflags);
 }
 
@@ -138,8 +141,7 @@  struct vxlan_sock *rpl_vxlan_sock_add(struct net *net, __be16 port,
 void rpl_vxlan_sock_release(struct vxlan_sock *vs);
 
 #define vxlan_xmit_skb rpl_vxlan_xmit_skb
-int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
-		       struct rtable *rt, struct sk_buff *skb,
+int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
 		       __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
 		       __be16 src_port, __be16 dst_port,
 		       struct vxlan_metadata *md, bool xnet, u32 vxflags);
diff --git a/datapath/linux/compat/stt.c b/datapath/linux/compat/stt.c
index dd21753..e27cedf 100644
--- a/datapath/linux/compat/stt.c
+++ b/datapath/linux/compat/stt.c
@@ -1320,16 +1320,18 @@  static void clean_percpu(struct work_struct *work)
 }
 
 #ifdef HAVE_NF_HOOKFN_ARG_OPS
-#define FIRST_PARAM const struct nf_hook_ops *ops,
+#define FIRST_PARAM const struct nf_hook_ops *ops
 #else
-#define FIRST_PARAM unsigned int hooknum,
+#define FIRST_PARAM unsigned int hooknum
 #endif
 
-static unsigned int nf_ip_hook(FIRST_PARAM
-			       struct sk_buff *skb,
-			       const struct net_device *in,
-			       const struct net_device *out,
-			       int (*okfn)(struct sk_buff *))
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+#define LAST_PARAM const struct nf_hook_state *state
+#else
+#define LAST_PARAM const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)
+#endif
+
+static unsigned int nf_ip_hook(FIRST_PARAM, struct sk_buff *skb, LAST_PARAM)
 {
 	struct stt_sock *stt_sock;
 	int ip_hdr_len;
diff --git a/datapath/linux/compat/udp_tunnel.c b/datapath/linux/compat/udp_tunnel.c
index c84113b..680fd83 100644
--- a/datapath/linux/compat/udp_tunnel.c
+++ b/datapath/linux/compat/udp_tunnel.c
@@ -142,10 +142,10 @@  void ovs_udp_csum_gso(struct sk_buff *skb)
 }
 EXPORT_SYMBOL_GPL(ovs_udp_csum_gso);
 
-int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
-			    __be32 src, __be32 dst, __u8 tos, __u8 ttl,
-			    __be16 df, __be16 src_port, __be16 dst_port,
-			    bool xnet, bool nocheck)
+int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk,
+			    struct sk_buff *skb, __be32 src, __be32 dst,
+			    __u8 tos, __u8 ttl, __be16 df, __be16 src_port,
+			    __be16 dst_port, bool xnet, bool nocheck)
 {
 	struct udphdr *uh;
 
@@ -159,7 +159,7 @@  int rpl_udp_tunnel_xmit_skb(struct rtable *rt, struct sk_buff *skb,
 
 	udp_set_csum(nocheck, skb, src, dst, skb->len);
 
-	return iptunnel_xmit(skb->sk, rt, skb, src, dst, IPPROTO_UDP,
+	return iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP,
 			     tos, ttl, df, xnet);
 }
 EXPORT_SYMBOL_GPL(rpl_udp_tunnel_xmit_skb);
diff --git a/datapath/linux/compat/vxlan.c b/datapath/linux/compat/vxlan.c
index 129f171..fd454ae 100644
--- a/datapath/linux/compat/vxlan.c
+++ b/datapath/linux/compat/vxlan.c
@@ -180,8 +180,7 @@  static void vxlan_build_gbp_hdr(struct vxlanhdr *vxh, u32 vxflags,
 	gbp->policy_id = htons(md->gbp & VXLAN_GBP_ID_MASK);
 }
 
-int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
-		       struct rtable *rt, struct sk_buff *skb,
+int rpl_vxlan_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb,
 		       __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
 		       __be16 src_port, __be16 dst_port,
 		       struct vxlan_metadata *md, bool xnet, u32 vxflags)
@@ -217,11 +216,11 @@  int rpl_vxlan_xmit_skb(struct vxlan_sock *vs,
 	if (vxflags & VXLAN_F_GBP)
 		vxlan_build_gbp_hdr(vxh, vxflags, md);
 
-	vxlan_set_owner(vs->sock->sk, skb);
+	vxlan_set_owner(sk, skb);
 
 	ovs_skb_set_inner_protocol(skb, htons(ETH_P_TEB));
 
-	return udp_tunnel_xmit_skb(rt, skb, src, dst, tos,
+	return udp_tunnel_xmit_skb(rt, sk, skb, src, dst, tos,
 				   ttl, df, src_port, dst_port, xnet,
 				   !udp_sum);
 }
diff --git a/datapath/vport-lisp.c b/datapath/vport-lisp.c
index 0024eb4..104a21d 100644
--- a/datapath/vport-lisp.c
+++ b/datapath/vport-lisp.c
@@ -455,7 +455,8 @@  static int lisp_send(struct vport *vport, struct sk_buff *skb)
 	ovs_skb_set_inner_protocol(skb, skb->protocol);
 
 	df = tun_key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
-	sent_len = udp_tunnel_xmit_skb(rt, skb, saddr, tun_key->ipv4_dst,
+	sent_len = udp_tunnel_xmit_skb(rt, lisp_port->lisp_rcv_socket->sk, skb,
+				       saddr, tun_key->ipv4_dst,
 				       tun_key->ipv4_tos, tun_key->ipv4_ttl,
 				       df, src_port, dst_port, false, true);
 
diff --git a/datapath/vport-vxlan.c b/datapath/vport-vxlan.c
index eff7ca2..fc9f350 100644
--- a/datapath/vport-vxlan.c
+++ b/datapath/vport-vxlan.c
@@ -260,7 +260,7 @@  static int vxlan_tnl_send(struct vport *vport, struct sk_buff *skb)
 	vxflags = vxlan_port->exts |
 		      (tun_key->tun_flags & TUNNEL_CSUM ? VXLAN_F_UDP_CSUM : 0);
 
-	err = vxlan_xmit_skb(vxlan_port->vs, rt, skb,
+	err = vxlan_xmit_skb(rt, vxlan_port->vs->sock->sk, skb,
 			     saddr, tun_key->ipv4_dst,
 			     tun_key->ipv4_tos,
 			     tun_key->ipv4_ttl, df,