On 20.03.2019 12:18, Ilya Maximets wrote:
> On 20.03.2019 11:34, Ilya Maximets wrote:
>> On 20.03.2019 11:01, Eelco Chaudron wrote:
>>>
>>>
>>> On 19 Mar 2019, at 16:51, Ilya Maximets wrote:
>>>
>>>> On 19.03.2019 12:23, Eelco Chaudron wrote:
>>>>> When debugging an issue we noticed that by accident someone has changes 
>>>>> the
>>>>> bridge datapath_type to netdev, where it's clearly a kernel (system 
>>>>> bridge)
>>>>> with physical and tap devices. Unfortunately, this is not something you
>>>>> will easily spot, as the bridge datapath type value is not shown by 
>>>>> default.
>>>>>
>>>>> In addition, OVS is not warning you about this potential mismatch in
>>>>> interface and bridge datapath.
>>>>>
>>>>> I'm sending out this patch as an RFC as I could not find a clear
>>>>> demarcation between bridge datapath types and interface datapath types.
>>>>> The patch below will at least warn for netdev bridges with system
>>>>> interfaces. But no warning will be given for some unsupported virtual
>>>>> interfaces. For system bridges, the dpdk types will no be recognized as
>>>>> system/virtual interfaces (unless the name exists) which will result in
>>>>> an error.
>>>>>
>>>>> Signed-off-by: Eelco Chaudron <[email protected]>
>>>>> ---
>>>>
>>>> Hi.
>>>>
>>>> Hmm. What do you mean under misconfiguration?
>>>
>>> Good question, as the documentation and code are not clear about this part…
>>>
>>> My interpretation is that for the netdev datapath bridges DPDK/vhost ports, 
>>> internal ports, patch-ports, and user space tunnel ports are the once 
>>> supported. But any other kernel ports are not, however, your text below 
>>> suggests otherwise.
>>
>> See below.
>>
>>>
>>>> In practice, userspace datapath is able to open "system" type netdevs.
>>>> It's supported by netdev-linux to open system network devices via socket.
>>>> And these devices has "system" type.
>>>> On 'datapath_type' changes, bridge/ofproto will be destroyed and 
>>>> re-created.
>>>> All the ports from kernel datapath will be destroyed and new ones created
>>>> in userspace. All the ports should still work as usual.
>>>
>>> With the below statement in mind, I configure the following:
>>>
>>>   ovs-vsctl add-br test
>>>   ip link add name right1 type veth peer name left1
>>>   ip link add name right2 type veth peer name left2
>>>   ovs-vsctl add-port test left1
>>>   ovs-vsctl add-port test left2
>>>   ovs-vsctl add-port test eth0
>>>   ip link set dev left1 up
>>>   ip link set dev left2 up
>>>   ip netns add netns1
>>>   ip netns add netns2
>>>   ip link set dev right1 netns netns1
>>>   ip link set dev right2 netns netns2
>>>   ip netns exec netns1 ip link set dev lo up
>>>   ip netns exec netns1 ip link set dev right1 up
>>>   ip netns exec netns2 ip link set dev right2 up
>>>   ip netns exec netns2 ip link set dev lo up
>>>   ip netns exec netns1 ip  a a dev right1 192.168.0.1/24
>>>   ip netns exec netns2 ip a a dev right2 192.168.0.2/24
>>>
>>> This is all working fine now, and now some accidentally does this:
>>>
>>>  ovs-vsctl set bridge test datapath_type=netdev
>>>
>>> And you suggest all continues to work as is?
>>
>> In general, yes.
>>
>>>
>>>> The only possible issue will be that this bridge will no longer communicate
>>>> with other bridges, because they're in different datapaths now.
>>>>
>>>> So, below warning will be printed on any attempt to add legitimate
>>>> system network interface to the userspace bridge.
>>>
>>>> "system" devices supported by both datapaths, but "dpdk" devices supported
>>>> only by userspace, that is why you see the error in case of changing to
>>>> 'datapath_type=system'.
>>>
>>> Are you saying ALL system devices are supported by the netdev datapath? Or 
>>> only a specific set? If the later we should check for those (and maybe add 
>>> some infrastructure to identify easily which devices are supported by which 
>>> datapath. If it exists please point me to it, as I might have overlooked 
>>> it).
>>
>> OVS netdev datapath could open any linux network interfacce that could be
>> opened with the raw socket. There is nothing device specific here.
>>
>> BTW, tests/system-userspace-testsuite.at completely relies on ability to
>> open and forward traffic through the veth pairs by netdev datapath.
>>
>>>
>>>> Maybe I'm missing something? What is the issue you're trying to address?
>>>
>>> The above example stops working due to checksum offloading on veth.
>>> But if you are right this is a valid configuration I’ll further investigate 
>>> this.
>>
>> Configuration is valid. The issue here is that OVS netdev datapath doesn't
>> support TX checksum offloading (this is not easy task with arguable profit).
>> i.e. if packet arrives with bad/no checksum it will be sent to the output 
>> port
>> with same bad/no checksum. Everything works in case of kernel datapth because
>> the packet doesn't leave the kernel space. In case of netdev datapath some
>> information (like CHECKSUM_VALID skb flags) is lost while receiving via

I meant CHECKSUM_UNNECESSARY.

>> socket in userspace and subsequently kernel expects valid checksum while
>> receiving the packet from userspace because TX offloading is not enabled.
>>
>> This kind of issues usually mitigated by disabling TX offloading on the
>> "right*" interfaces, or by setting iptables to fill the checksums like this:
>>
>> iptables -A POSTROUTING -t mangle -p udp -m udp -j CHECKSUM --checksum-fill
>>
>> Some related OpenStack bug: https://bugs.launchpad.net/neutron/+bug/1244589
> 
> Also, note that this happens only for virtual interfaces like veth/tap because
> kernel always tries to delay checksum calculation/validation as much as 
> possible.
> Correct packets received from the wire will always have correct checksums.
> 
>>
>>>
>>>> Best regards, Ilya Maximets.
>>>>
>>>>>  vswitchd/bridge.c |    6 ++++++
>>>>>  1 file changed, 6 insertions(+)
>>>>>
>>>>> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
>>>>> index a427b0122..42c33d1d9 100644
>>>>> --- a/vswitchd/bridge.c
>>>>> +++ b/vswitchd/bridge.c
>>>>> @@ -1808,6 +1808,12 @@ iface_do_create(const struct bridge *br,
>>>>>          goto error;
>>>>>      }
>>>>>
>>>>> +    if (!iface_is_internal(iface_cfg, br->cfg)
>>>>> +        && !strcmp(br->type, "netdev")
>>>>> +        && !strcmp(netdev_get_type(netdev), "system")) {
>>>>> +        VLOG_WARN("bridge %s: interface %s is a system type where the 
>>>>> bridge "
>>>>> +                  "is a netdev one", br->name, iface_cfg->name);
>>>>> +    }
>>>>>      VLOG_INFO("bridge %s: added interface %s on port %d",
>>>>>                br->name, iface_cfg->name, *ofp_portp);
>>>>>
>>>>>
>>>
>>>
> 
> 
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to