[ovs-dev] [PATCH] vxlan: Fix for the packet loop issue in vxlan

Neelakantam Gaddam neelugaddam at gmail.com
Tue Jun 12 17:11:58 UTC 2018


Hi Pravin,

The below configuration is causing the spinlock recursion issue.

I am able to see the issue with below configuration.



ovs-vsctl add-br br0

ovs-vsctl add-bond br0 bond0 p1p1 p1p2

ovs-vsctl set port bond0 lacp=active bond_mode=balance-tcp

ifconfig br0 100.0.0.1 up

ovs-vsctl add-port br0 veth0

ovs-vsctl add-port br0 vx0 -- set interface vx0 type=vxlan
options:local_ip=100.0.0.1 options:remote_ip=100.0.0.2 option:key=flow



ovs-ofctl add-flow br0 "table=0, priority=1, cookie=100, tun_id=100,
in_port=4, action=output:3"

ovs-ofctl add-flow br0 "table=0, priority=1, cookie=100, in_port=3,
actions=set_field:100->tun_id output:4"


The same bridge br0 is being used as the local interface for vxlan tunnel.
Even though this configuration is invalid, we should not see the kernel
crash.




On Tue, Jun 12, 2018 at 11:55 AM, Pravin Shelar <pshelar at ovn.org> wrote:

>
>
> On Tue, May 22, 2018 at 10:16 PM, Neelakantam Gaddam <
> neelugaddam at gmail.com> wrote:
>
>> This patch fixes the kernel soft lockup issue with vxlan configuration
>> where the tunneled packet is sent on the same bridge where vxlan port is
>> attched to. It detects the loop in vxlan xmit functionb and drops if loop
>> is
>> detected.
>>
>> Signed-off-by: Neelakantam Gaddam <neelugaddam at gmail.com>
>> ---
>>  datapath/linux/compat/vxlan.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/datapath/linux/compat/vxlan.c b/datapath/linux/compat/vxlan.
>> c
>> index 287dad2..00562fa 100644
>> --- a/datapath/linux/compat/vxlan.c
>> +++ b/datapath/linux/compat/vxlan.c
>> @@ -1115,7 +1115,8 @@ static void vxlan_xmit_one(struct sk_buff *skb,
>> struct net_device *dev,
>>                         goto tx_error;
>>                 }
>>
>> -               if (rt->dst.dev == dev) {
>> +               if ((rt->dst.dev == dev) ||
>> +                       (OVS_CB(skb)->input_vport->dev == rt->dst.dev)) {
>>
>
> I am not sure which case the  OVS_CB(skb)->input_vport->dev is not same as
> the dev when there is recursion. Can you explain how to reproduce it?
>
>


-- 
Thanks & Regards
Neelakantam Gaddam


More information about the dev mailing list