When TC parses the flow to install, it assumes that the datalink type mask is set. However, this may not always be the case, for example, when multiple VLANs exist but only one is enabled (vlan-limit).
This patch will only process the dl_type if the mask is set. It also includes a unit test to verify that the TC rules are offloaded in this case. Fixes: 1be33d52af77 ("netdev-tc-offloads: Don't offload header modification on ip fragments.") Signed-off-by: Eelco Chaudron <echau...@redhat.com> --- lib/netdev-offload-tc.c | 8 +++++--- tests/system-offloads-traffic.at | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c index 9e163c2a6..3dcec0afc 100644 --- a/lib/netdev-offload-tc.c +++ b/lib/netdev-offload-tc.c @@ -2294,6 +2294,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, struct flow_tnl *tnl_mask = &mask->tunnel; struct dpif_flow_stats adjust_stats; bool recirc_act = false; + bool match_on_dl_type = false; uint32_t block_id = 0; struct tcf_id id; uint32_t chain; @@ -2500,10 +2501,11 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, flower.mask.src_mac = mask->dl_src; memset(&mask->dl_dst, 0, sizeof mask->dl_dst); memset(&mask->dl_src, 0, sizeof mask->dl_src); + match_on_dl_type = mask->dl_type == htons(0xffff); mask->dl_type = 0; mask->in_port.odp_port = 0; - if (key->dl_type == htons(ETH_P_ARP)) { + if (match_on_dl_type && key->dl_type == htons(ETH_P_ARP)) { flower.key.arp.spa = key->nw_src; flower.key.arp.tpa = key->nw_dst; flower.key.arp.sha = key->arp_sha; @@ -2522,7 +2524,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, memset(&mask->arp_tha, 0, sizeof mask->arp_tha); } - if (is_ip_any(key) && !is_ipv6_fragment_and_masked(key, mask)) { + if (match_on_dl_type && (key) && !is_ipv6_fragment_and_masked(key, mask)) { flower.key.ip_proto = key->nw_proto; flower.mask.ip_proto = mask->nw_proto; mask->nw_proto = 0; @@ -2554,7 +2556,7 @@ netdev_tc_flow_put(struct netdev *netdev, struct match *match, * flows perform a fully masked match on the fragmentation bits. * However, since TC depends on this behavior, we return ENOTSUPP * for now in case this behavior changes in the future. */ - return EOPNOTSUPP; + return EOPNOTSUPP; } if (key->nw_proto == IPPROTO_TCP) { diff --git a/tests/system-offloads-traffic.at b/tests/system-offloads-traffic.at index 78c6f5d7e..2f0179bea 100644 --- a/tests/system-offloads-traffic.at +++ b/tests/system-offloads-traffic.at @@ -1015,5 +1015,37 @@ AT_CHECK( [grep -q -F "set(tunnel(dst=172.31.1.1,ttl=64,tp_dst=4789,flags(csum)))" \ stdout]) +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([offloads - 802.1ad should be offloaded]) +OVS_TRAFFIC_VSWITCHD_START([], [], [-- set Open_vSwitch . \ + other_config:hw-offload=true]) +OVS_CHECK_8021AD() + +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") + +ADD_SVLAN(p0, at_ns0, 4094, "10.255.2.1/24") +ADD_SVLAN(p1, at_ns1, 4094, "10.255.2.2/24") + +ADD_CVLAN(p0.4094, at_ns0, 100, "10.2.2.1/24") +ADD_CVLAN(p1.4094, at_ns1, 100, "10.2.2.2/24") + +AT_CHECK([ovs-ofctl add-flow br0 "priority=1 action=normal"]) + +AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg ofproto_dpif_upcall:dbg netdev_offload_tc:dbg]) + +OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2]) + +AT_CHECK([ovs-appctl dpctl/dump-flows type=tc,offloaded | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED], [0], [dnl +in_port(2),eth(macs),eth_type(0x88a8),vlan(vid=4094,pcp=0),encap(eth_type(0x0800)), packets:0, bytes:0, used:0.001s, actions:output +in_port(3),eth(macs),eth_type(0x88a8),vlan(vid=4094,pcp=0),encap(eth_type(0x0800)), packets:0, bytes:0, used:0.001s, actions:output +]) + +AT_CHECK([ovs-appctl dpctl/dump-flows type=ovs | grep "eth_type(0x0800)" | DUMP_CLEAN_SORTED], [0], []) + OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP \ No newline at end of file -- 2.47.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev