On 20 Mar 2019, at 10:28, Ilya Maximets wrote:

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.

Thanks Ilya for all the details above, this helped me to quickly get trough the bottom of this.

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