net/ice: update QinQ switch filter handling
authorHaiyue Wang <haiyue.wang@intel.com>
Tue, 13 Apr 2021 05:14:59 +0000 (13:14 +0800)
committerQi Zhang <qi.z.zhang@intel.com>
Tue, 13 Apr 2021 14:33:58 +0000 (16:33 +0200)
The hardware outer/inner VLAN protocol types are now updated to map to
new interface VLAN protocol types, so update the application to use new
VLAN protocol types when the rte_flow is QinQ filter type.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/ice/ice_switch_filter.c

index 6f9e861..0bf3660 100644 (file)
@@ -389,12 +389,17 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
        bool profile_rule = 0;
        bool nvgre_valid = 0;
        bool vxlan_valid = 0;
+       bool qinq_valid = 0;
        bool ipv6_valid = 0;
        bool ipv4_valid = 0;
        bool udp_valid = 0;
        bool tcp_valid = 0;
        uint16_t j, t = 0;
 
+       if (*tun_type == ICE_SW_TUN_AND_NON_TUN_QINQ ||
+           *tun_type == ICE_NON_TUN_QINQ)
+               qinq_valid = 1;
+
        for (item = pattern; item->type !=
                        RTE_FLOW_ITEM_TYPE_END; item++) {
                if (item->last) {
@@ -932,22 +937,25 @@ ice_switch_inset_get(const struct rte_flow_item pattern[],
                                return 0;
                        }
 
-                       if (!outer_vlan_valid &&
-                           (*tun_type == ICE_SW_TUN_AND_NON_TUN_QINQ ||
-                            *tun_type == ICE_NON_TUN_QINQ))
-                               outer_vlan_valid = 1;
-                       else if (!inner_vlan_valid &&
-                                (*tun_type == ICE_SW_TUN_AND_NON_TUN_QINQ ||
-                                 *tun_type == ICE_NON_TUN_QINQ))
-                               inner_vlan_valid = 1;
-                       else if (!inner_vlan_valid)
-                               inner_vlan_valid = 1;
+                       if (qinq_valid) {
+                               if (!outer_vlan_valid)
+                                       outer_vlan_valid = 1;
+                               else
+                                       inner_vlan_valid = 1;
+                       }
 
                        if (vlan_spec && vlan_mask) {
-                               if (outer_vlan_valid && !inner_vlan_valid) {
-                                       list[t].type = ICE_VLAN_EX;
-                                       input_set |= ICE_INSET_VLAN_OUTER;
-                               } else if (inner_vlan_valid) {
+                               if (qinq_valid) {
+                                       if (!inner_vlan_valid) {
+                                               list[t].type = ICE_VLAN_EX;
+                                               input_set |=
+                                                       ICE_INSET_VLAN_OUTER;
+                                       } else {
+                                               list[t].type = ICE_VLAN_IN;
+                                               input_set |=
+                                                       ICE_INSET_VLAN_INNER;
+                                       }
+                               } else {
                                        list[t].type = ICE_VLAN_OFOS;
                                        input_set |= ICE_INSET_VLAN_INNER;
                                }