summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoi Dayan <roid@mellanox.com>2020-08-04 09:37:21 +0300
committerSimon Horman <simon.horman@netronome.com>2020-08-06 17:26:46 +0200
commitd5659751f65ebc17d9aec40b60c1cff3a2d87162 (patch)
tree9166d99fd63f9ae053961374a82b8f1efcca46c8
parent930f135f5ddc4372c1615bc7674dda35c229b6bd (diff)
downloadopenvswitch-d5659751f65ebc17d9aec40b60c1cff3a2d87162.tar.gz
tc: Use skip_hw flag when probing tc features
There is no need to pass tc rules to hw when just probing for tc features. this will avoid redundant errors from hw drivers that may happen. Signed-off-by: Roi Dayan <roid@mellanox.com> Acked-By: Vlad Buslov <vladbu@mellanox.com> Reviewed-by: Tonghao Zhang <xiangxia.m.yue@gmail.com> Signed-off-by: Simon Horman <simon.horman@netronome.com>
-rw-r--r--lib/netdev-offload-tc.c2
-rw-r--r--lib/tc.c13
-rw-r--r--lib/tc.h10
3 files changed, 18 insertions, 7 deletions
diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index 2c9c6f4ca..18ff380f9 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -1918,6 +1918,7 @@ probe_multi_mask_per_prio(int ifindex)
memset(&flower, 0, sizeof flower);
+ flower.tc_policy = TC_POLICY_SKIP_HW;
flower.key.eth_type = htons(ETH_P_IP);
flower.mask.eth_type = OVS_BE16_MAX;
memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
@@ -1965,6 +1966,7 @@ probe_tc_block_support(int ifindex)
memset(&flower, 0, sizeof flower);
+ flower.tc_policy = TC_POLICY_SKIP_HW;
flower.key.eth_type = htons(ETH_P_IP);
flower.mask.eth_type = OVS_BE16_MAX;
memset(&flower.key.dst_mac, 0x11, sizeof flower.key.dst_mac);
diff --git a/lib/tc.c b/lib/tc.c
index c96d09538..8761304c9 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -65,12 +65,6 @@ VLOG_DEFINE_THIS_MODULE(tc);
static struct vlog_rate_limit error_rl = VLOG_RATE_LIMIT_INIT(60, 5);
-enum tc_offload_policy {
- TC_POLICY_NONE,
- TC_POLICY_SKIP_SW,
- TC_POLICY_SKIP_HW
-};
-
static enum tc_offload_policy tc_policy = TC_POLICY_NONE;
struct tc_pedit_key_ex {
@@ -2757,6 +2751,7 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
bool is_vlan = eth_type_vlan(flower->key.eth_type);
bool is_qinq = is_vlan && eth_type_vlan(flower->key.encap_eth_type[0]);
bool is_mpls = eth_type_mpls(flower->key.eth_type);
+ enum tc_offload_policy policy = flower->tc_policy;
int err;
/* need to parse acts first as some acts require changing the matching
@@ -2882,7 +2877,11 @@ nl_msg_put_flower_options(struct ofpbuf *request, struct tc_flower *flower)
}
}
- nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(tc_policy));
+ if (policy == TC_POLICY_NONE) {
+ policy = tc_policy;
+ }
+
+ nl_msg_put_u32(request, TCA_FLOWER_FLAGS, tc_get_tc_cls_policy(policy));
if (flower->tunnel) {
nl_msg_put_flower_tunnel(request, flower);
diff --git a/lib/tc.h b/lib/tc.h
index 028eed5d0..281231c0d 100644
--- a/lib/tc.h
+++ b/lib/tc.h
@@ -312,6 +312,14 @@ is_tcf_id_eq(struct tcf_id *id1, struct tcf_id *id2)
&& id1->chain == id2->chain;
}
+enum tc_offload_policy {
+ TC_POLICY_NONE = 0,
+ TC_POLICY_SKIP_SW,
+ TC_POLICY_SKIP_HW
+};
+
+BUILD_ASSERT_DECL(TC_POLICY_NONE == 0);
+
struct tc_flower {
struct tc_flower_key key;
struct tc_flower_key mask;
@@ -337,6 +345,8 @@ struct tc_flower {
bool needs_full_ip_proto_mask;
enum tc_offloaded_state offloaded_state;
+ /* Used to force skip_hw when probing tc features. */
+ enum tc_offload_policy tc_policy;
};
/* assert that if we overflow with a masked write of uint32_t to the last byte