@@ -1939,6 +1939,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);
@@ -2076,6 +2077,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);
@@ -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 {
@@ -2759,6 +2753,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
@@ -2884,7 +2879,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);
@@ -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