Hi,

I’ve faced an issue where GENEVE and VXLAN offload on RX path doesn’t work with 
openvswitch OOT kernel module.
The problem reproduced at least on CentOS 7.5, 7.8 (but I think more recent 
versions are affected too).
Initially the problem was observed with OVS 2.13, but it reproduces with 2.17 
and master branches as well.

The problem is shown with tcpdump while iperf3 on top of VXLAN of GENEVE is run 
(RX traffic; length 1448):

    19:19:00.223575 IP 10.1.0.105.60228 > 10.1.0.106.6081: Geneve, Flags 
[none], vni 0x0: IP 1.1.1.5.targus-getdata1 > 1.1.1.6.44652: Flags [.], seq 
40722105:40723553, ack 38, win 64, options [nop,nop,TS val 2491722176 ecr 
151867193], length 1448

The correct RX handling for GENEVE and VXLAN was broken in v2.10.0 release with 
[1] commit (if I understand correctly).
With OVS kmod v2.9.x GRO for VXLAN and GENEVE packets works as expected.
In CentOS 7.x in kernel-devel packages there is no include/net/erspan.h header 
file, therefore USE_UPSTREAM_TUNNEL macro is unset.
So I’ve tried to apply next patch:

diff --git a/acinclude.m4 b/acinclude.m4
index 914e27b93..cde232966 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -671,9 +671,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
                         [OVS_GREP_IFELSE([$KSRC/include/net/ip_tunnels.h],
                                          [iptunnel_pull_offloads],
                         [OVS_GREP_IFELSE([$KSRC/include/net/dst_cache.h], 
[dst_cache],
-                        [OVS_GREP_IFELSE([$KSRC/include/net/erspan.h], 
[erspan_md2],
-                                         
[OVS_DEFINE([USE_UPSTREAM_TUNNEL])])])])])
+                                         
[OVS_DEFINE([USE_UPSTREAM_TUNNEL])])])])

+  OVS_GREP_IFELSE([$KSRC/include/net/erspan.h], [erspan_md2],
+                  [OVS_DEFINE([USE_BUILTIN_ERSPAN_MD2])])
   OVS_GREP_IFELSE([$KSRC/include/net/dst_cache.h], [dst_cache],
                   [OVS_DEFINE([USE_BUILTIN_DST_CACHE])])
   OVS_GREP_IFELSE([$KSRC/include/net/mpls.h], [mpls_hdr],
diff --git a/datapath/linux/compat/include/net/erspan.h 
b/datapath/linux/compat/include/net/erspan.h
index 4a6a8f240..a36ce727b 100644
--- a/datapath/linux/compat/include/net/erspan.h
+++ b/datapath/linux/compat/include/net/erspan.h
@@ -1,4 +1,4 @@
-#ifndef USE_UPSTREAM_TUNNEL
+#ifndef USE_BUILTIN_ERSPAN_MD2
 #ifndef __LINUX_ERSPAN_H
 #define __LINUX_ERSPAN_H

After the next patch the problem was resolved (length 65k):

    19:05:13.500646 IP 10.1.0.105.51432 > 10.1.0.106.6081: Geneve, Flags 
[none], vni 0x0: IP 1.1.1.5.targus-getdata1 > 1.1.1.6.54874: Flags [.], seq 
185753153:185818313, ack 38, win 64, options [nop,nop,TS val 2490895458 ecr 
151040475], length 65160

The problem is that with this change erspan functionality in OVS is broken and 
I couldn’t understand where to see the root cause for this:

# ovs-vsctl add-port test at_erspan0 -- set int at_erspan0 type=erspan 
options:key=1 options:remote_ip=10.1.0.101 options:erspan_ver=1 
options:erspan_idx=1
ovs-vsctl: Error detected while setting up 'at_erspan0': could not add network 
device at_erspan0 to ofproto (Address family not supported by protocol).  See 
ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".

In ovs logs:
2022-04-07T16:17:33.175Z|00051|dpif|WARN|system@ovs-system: failed to add 
at_erspan0 as port: Address family not supported by protocol
2022-04-07T16:17:33.175Z|00052|bridge|WARN|could not add network device 
at_erspan0 to ofproto (Address family not supported by protocol)

Can anybody help understand the best way to fix the initial (GRO for udp_tnl) 
issue and not to break things around this? :)
Thanks.

1: 
https://github.com/openvswitch/ovs/commit/e1ededf45f072c41295f1b441a6f106159ff191b

Regards,
Vladislav Odintsov

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to