diff mbox series

[ovs-dev,v4,1/2] netdev-tc-offload: Add csum offload of IGMP/UDPLITE/SCTP in ip rewrite

Message ID APgAoAAXJHRmoru4drlm*KoD.1.1693190792491.Hmail.mocan@ucloud.cn
State Superseded
Headers show
Series Add more protocols to offload in ip rewrite | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Faicker Mo Aug. 28, 2023, 2:46 a.m. UTC
When the IP header is rewritten like NAT or ttl/tos changed,
the csum of IP header need recalculation. The UDPLITE checksum
needs recalculation if src or dst changed in IP header.
The tc-csum action is for this.

Signed-off-by: Faicker Mo <faicker.mo@ucloud.cn>
---
 lib/tc.c                         |  7 ++++++-
 tests/system-offloads-traffic.at | 24 ++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/lib/tc.c b/lib/tc.c
index f49048cda..ae71390bc 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -2973,11 +2973,16 @@  csum_update_flag(struct tc_flower *flower,
         } else if (flower->key.ip_proto == IPPROTO_UDP) {
             flower->needs_full_ip_proto_mask = true;
             flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_UDP;
-        } else if (flower->key.ip_proto == IPPROTO_ICMP) {
+        } else if (flower->key.ip_proto == IPPROTO_ICMP ||
+                   flower->key.ip_proto == IPPROTO_IGMP ||
+                   flower->key.ip_proto == IPPROTO_SCTP) {
             flower->needs_full_ip_proto_mask = true;
         } else if (flower->key.ip_proto == IPPROTO_ICMPV6) {
             flower->needs_full_ip_proto_mask = true;
             flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_ICMP;
+        } else if (flower->key.ip_proto == IPPROTO_UDPLITE) {
+            flower->needs_full_ip_proto_mask = true;
+            flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_UDPLITE;
         } else {
             VLOG_WARN_RL(&error_rl,
                          "can't offload rewrite of IP/IPV6 with ip_proto: %d",
diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at
index 7215e36e2..47b5f1ff7 100644
--- a/tests/system-offloads-traffic.at
+++ b/tests/system-offloads-traffic.at
@@ -855,3 +855,27 @@  AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "eth_type(0x0800)
 OVS_TRAFFIC_VSWITCHD_STOP
 AT_CLEANUP
 
+AT_SETUP([offloads - Add IGMP/UDPLITE/SCTP protocols to offload in ip rewrite - offloads enabled])
+OVS_TRAFFIC_VSWITCHD_START([], [], [-- set Open_vSwitch . other_config:hw-offload=true])
+
+ADD_NAMESPACES(at_ns0, at_ns1)
+
+ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
+ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
+
+dnl Set up the ip field modify flow.
+AT_CHECK([ovs-ofctl add-flow br0 "priority=100 in_port=ovs-p0,ip actions=mod_nw_tos:12,output:ovs-p1"])
+
+dnl add and del multicast address to send IGMP packet.
+NS_CHECK_EXEC([at_ns0], [ip addr add dev p0 224.10.10.10/24 autojoin 2>/dev/null], [0])
+NS_CHECK_EXEC([at_ns0], [ip addr del dev p0 224.10.10.10/24 2>/dev/null], [0])
+
+sleep 1
+
+dnl Check the offloaded flow.
+AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "eth_type(0x0800)" | wc -l], [0], [dnl
+1
+])
+
+OVS_TRAFFIC_VSWITCHD_STOP
+AT_CLEANUP