[ovs-discuss] Problems executing decap(eth)+encap(eth) actions

Gregory Rose gvrose8192 at gmail.com
Tue Oct 30 21:42:15 UTC 2018


On 10/29/2018 3:38 AM, Jaime Caamaño Ruiz wrote:
> Hey Greg. Thanks for helping out. I did build OVS with the fix and it
> got my problem sorted without causing any additional ones on my
> environment. Let me know if I can help with anything else.
>
> BR
> Jaime.

Jaime,

you seem to have identified a bug!

Using printks with a simple rule to just decap and then encap an 
Ethernet header we see this with the code
as it is right now:

[13568.973807] __ovs_nla_copy_actions:3007 <- decap
[13568.973812] __ovs_nla_copy_actions:3012 <- decap succeeds but sets 
mac_proto = MAC_PROTO_ETHERNET
[13568.973815] __ovs_nla_copy_actions:2999 <- encap
[13568.973818] openvswitch: netlink: Flow actions may not be safe on all 
matching packets. <- returns -EINVAL

Note that the decap happens at lines 3007-3012 and is successful. 
However, the very next encap action
starting at line 2999 does not finish and returns -EINVAL so a printk at 
line 3002 does not execute.
If I change the code as you suggested the flow of decap/encap works 
without complaint and without
returning -EINVAL:

[13838.435051] __ovs_nla_copy_actions:3007 <- decap
[13838.435054] __ovs_nla_copy_actions:3012 <-decap succeeds and sets 
mac_proto = MAC_PROTO_NONE
[13838.435055] __ovs_nla_copy_actions:2999 <- encap
[13838.435056] __ovs_nla_copy_actions:3002 <- encap succeeds and sets 
mac_proto = MAC_PROTO_ETHERNET

Thank you for finding this bug.  Do you wish to send the patch to fix it 
or would you prefer me to do it?

Regards,

- Greg

>
>
> -----Original Message-----
> From: Gregory Rose <gvrose8192 at gmail.com>
> To: ovs-discuss at openvswitch.org, jcaamano at suse.de
> Subject: Re: [ovs-discuss] Problems executing decap(eth)+encap(eth)
> actions
> Date: Fri, 26 Oct 2018 15:42:51 -0700
>
> On 10/19/2018 1:39 AM, Jaime Caamaño Ruiz wrote:
>> Hello
>>
>> When using nsh encapsulation, it's useful to normalize your pipeline
>> to
>> packet_type=nsh, poping an ethernet header on input if necessary and
>> pushing an ethernet header again if required before output.
>>
>> But it seems to be problematic:
>>
>> ---
>> 2018-10-18T13:10:59.196Z|00010|dpif(handler3)|WARN|system at ovs-system:
>> execute
>> pop_eth,push_eth(src=fe:16:3e:c1:9e:87,dst=fa:16:3e:c1:9e:87),5
>> failed (Invalid argument) on packet
>> vlan_tci=0x0000,dl_src=fa:16:3e:c2:e6:68,dl_dst=fe:16:3e:c2:e6:68,dl_
>> ty
>> pe=0x894f,nsh_flags=0,nsh_ttl=63,nsh_mdtype=1,nsh_np=3,nsh_spi=0x1a,n
>> sh
>> _si=254,nsh_c1=0xc0a82a01,nsh_c2=0x3,nsh_c3=0x0,nsh_c4=0x90000100,nw_
>> pr
>> oto=0,nw_tos=0,nw_ecn=0,nw_ttl=0
>>    with metadata
>> skb_priority(0),tunnel(tun_id=0x0,src=192.168.42.1,dst=192.168.42.3,t
>> tl
>> =64,tp_src=47656,tp_dst=4789,flags(key)),skb_mark(0),in_port(4) mtu 0
>> ---
>>
>> Looking at the code datapath/flow_netlink.c @ __ovs_nla_copy_actions:
>>
>>                   case OVS_ACTION_ATTR_PUSH_ETH:
>>                           /* Disallow pushing an Ethernet header if
>> one
>>                            * is already present */
>>                           if (mac_proto != MAC_PROTO_NONE)
>>                                   return -EINVAL;
>>                           mac_proto = MAC_PROTO_NONE;
>>                           break;
>>
>>                   case OVS_ACTION_ATTR_POP_ETH:
>>                           if (mac_proto != MAC_PROTO_ETHERNET)
>>                                   return -EINVAL;
>>                           if (vlan_tci & htons(VLAN_TAG_PRESENT))
>>                                   return -EINVAL;
>>                           mac_proto = MAC_PROTO_ETHERNET;
>>                           break;
>>
>>
>> Isn't the mac_proto set inverted here, should'nt it look like this?
>>
>>
>>                   case OVS_ACTION_ATTR_PUSH_ETH:
>>                           /* Disallow pushing an Ethernet header if
>> one
>>                            * is already present */
>>                           if (mac_proto != MAC_PROTO_NONE)
>>                                   return -EINVAL;
>>                           mac_proto = MAC_PROTO_ETHERNET;
>>                           break;
>>
>>                   case OVS_ACTION_ATTR_POP_ETH:
>>                           if (mac_proto != MAC_PROTO_ETHERNET)
>>                                   return -EINVAL;
>>                           if (vlan_tci & htons(VLAN_TAG_PRESENT))
>>                                   return -EINVAL;
>>                           mac_proto = MAC_PROTO_NONE;
>>                           break;
> Jaime,
>
> I am looking into this and at first sight this does look inverted but
> we
> have no other reported bugs
> in this area so I want to be careful that we don't break anything else
> while fixing this.  Have you tried
> building OVS with this code change and been able to verify that this
> change works?
>
> I'll be working on setting up a test bed to check this - hopefully by
> early next week I can report back so
> stay tuned please.
>
> Thanks,
>
> - Greg
>
>> BR
>> Jaime.
>> _______________________________________________
>> discuss mailing list
>> discuss at openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-discuss
>



More information about the discuss mailing list