Skip to content

Commit

Permalink
tc: Add IPIP/GRE protocols to offload in IP rewrite.
Browse files Browse the repository at this point in the history
Currently checksum recalculation is not supported with TC offload for
IPIP and GRE packets. This patch adds support for TC offloading of
IPIP and GRE packets by adding the correct csum action.

Without this patch the following warning can be seen in the logging:
  Can't offload rewrite of IP/IPV6 with ip_proto: X.

Acked-by: Simon Horman <[email protected]>
Signed-off-by: Faicker Mo <[email protected]>
Signed-off-by: Eelco Chaudron <[email protected]>
  • Loading branch information
faickermo authored and chaudron committed Oct 13, 2023
1 parent b16ef52 commit c29ba54
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/tc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2975,7 +2975,9 @@ csum_update_flag(struct tc_flower *flower,
flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_UDP;
} else if (flower->key.ip_proto == IPPROTO_ICMP ||
flower->key.ip_proto == IPPROTO_IGMP ||
flower->key.ip_proto == IPPROTO_SCTP) {
flower->key.ip_proto == IPPROTO_SCTP ||
flower->key.ip_proto == IPPROTO_IPIP ||
flower->key.ip_proto == IPPROTO_GRE) {
flower->needs_full_ip_proto_mask = true;
} else if (flower->key.ip_proto == IPPROTO_ICMPV6) {
flower->needs_full_ip_proto_mask = true;
Expand Down
39 changes: 39 additions & 0 deletions tests/system-offloads-traffic.at
Original file line number Diff line number Diff line change
Expand Up @@ -882,3 +882,42 @@ AT_CHECK([tc -d filter show dev ovs-p0 ingress | grep -q "csum (iph)"], [0])

OVS_TRAFFIC_VSWITCHD_STOP
AT_CLEANUP

AT_SETUP([offloads - IPIP wth ip rewrite - offloads enabled])
OVS_TRAFFIC_VSWITCHD_START([], [], [-- set Open_vSwitch . other_config:hw-offload=true])

AT_CHECK([ovs-ofctl add-flow br0 "priority=0 actions=normal"])

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,nw_dst=10.1.1.2 actions=dec_ttl,output:ovs-p1"])
AT_CHECK([ovs-ofctl add-flow br0 "priority=100 in_port=ovs-p1,ip,nw_dst=10.1.1.1 actions=dec_ttl,output:ovs-p0"])

dnl Set up ipip tunnel in NS.
NS_CHECK_EXEC([at_ns0], [ip tunnel add ipip0 remote 10.1.1.2 2>/dev/null], [0])
NS_CHECK_EXEC([at_ns0], [ip link set dev ipip0 up 2>/dev/null], [0])
NS_CHECK_EXEC([at_ns0], [ip addr add dev ipip0 192.168.1.1/30 2>/dev/null], [0])
NS_CHECK_EXEC([at_ns1], [ip tunnel add ipip0 remote 10.1.1.1 2>/dev/null], [0])
NS_CHECK_EXEC([at_ns1], [ip link set dev ipip0 up 2>/dev/null], [0])
NS_CHECK_EXEC([at_ns1], [ip addr add dev ipip0 192.168.1.2/30 2>/dev/null], [0])

dnl Check the tunnel.
NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 192.168.1.2 | FORMAT_PING], [0], [dnl
3 packets transmitted, 3 received, 0% packet loss, time 0ms
])

dnl Check the offloaded flow.
AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED | strip_stats], [0], [dnl
in_port(2),eth(),eth_type(0x0800),ipv4(dst=10.1.1.2,proto=4,ttl=64,frag=no), packets:0, bytes:0, used:0.001s, actions:set(ipv4(ttl=63)),3
in_port(3),eth(),eth_type(0x0800),ipv4(dst=10.1.1.1,proto=4,ttl=64,frag=no), packets:0, bytes:0, used:0.001s, actions:set(ipv4(ttl=63)),2
])

dnl Check the tc rule.
AT_CHECK([tc -d filter show dev ovs-p0 ingress | grep -q "csum (iph)"], [0])

OVS_TRAFFIC_VSWITCHD_STOP
AT_CLEANUP

0 comments on commit c29ba54

Please sign in to comment.