net/ice/base: add GCO defines and GCO flex descriptor
[dpdk.git] / drivers / net / ice / ice_fdir_filter.c
index abba9ae..7ba65b9 100644 (file)
 
 #define ICE_FDIR_INSET_IPV4_NATT_ESP (\
        ICE_INSET_IPV4_SRC | ICE_INSET_IPV4_DST | \
-       ICE_INSET_ESP_SPI)
+       ICE_INSET_NAT_T_ESP_SPI)
 
 #define ICE_FDIR_INSET_IPV6_NATT_ESP (\
        ICE_INSET_IPV6_SRC | ICE_INSET_IPV6_DST | \
-       ICE_INSET_ESP_SPI)
+       ICE_INSET_NAT_T_ESP_SPI)
 
 static struct ice_pattern_match_item ice_fdir_pattern_list[] = {
        {pattern_ethertype,                             ICE_FDIR_INSET_ETH,             ICE_INSET_NONE,                 ICE_INSET_NONE},
@@ -651,8 +651,10 @@ ice_fdir_teardown(struct ice_pf *pf)
 
        ice_tx_queue_release(pf->fdir.txq);
        pf->fdir.txq = NULL;
+       rte_eth_dma_zone_free(eth_dev, "fdir_tx_ring", ICE_FDIR_QUEUE_ID);
        ice_rx_queue_release(pf->fdir.rxq);
        pf->fdir.rxq = NULL;
+       rte_eth_dma_zone_free(eth_dev, "fdir_rx_ring", ICE_FDIR_QUEUE_ID);
        ice_fdir_prof_rm_all(pf);
        ice_fdir_prof_free(hw);
        ice_release_vsi(vsi);
@@ -806,6 +808,28 @@ ice_fdir_cross_prof_conflict(struct ice_pf *pf,
                        (pf, cflct_ptype, is_tunnel))
                        goto err;
                break;
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP:
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP:
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP:
+               cflct_ptype = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER;
+               if (!ice_fdir_prof_resolve_conflict
+                       (pf, cflct_ptype, is_tunnel))
+                       goto err;
+               break;
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER:
+               cflct_ptype = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP;
+               if (!ice_fdir_prof_resolve_conflict
+                       (pf, cflct_ptype, is_tunnel))
+                       goto err;
+               cflct_ptype = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP;
+               if (!ice_fdir_prof_resolve_conflict
+                       (pf, cflct_ptype, is_tunnel))
+                       goto err;
+               cflct_ptype = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP;
+               if (!ice_fdir_prof_resolve_conflict
+                       (pf, cflct_ptype, is_tunnel))
+                       goto err;
+               break;
        default:
                break;
        }
@@ -929,6 +953,8 @@ ice_fdir_input_set_parse(uint64_t inset, enum ice_flow_field *field)
                {ICE_INSET_GTPU_TEID, ICE_FLOW_FIELD_IDX_GTPU_IP_TEID},
                {ICE_INSET_GTPU_QFI, ICE_FLOW_FIELD_IDX_GTPU_EH_QFI},
                {ICE_INSET_VXLAN_VNI, ICE_FLOW_FIELD_IDX_VXLAN_VNI},
+               {ICE_INSET_ESP_SPI, ICE_FLOW_FIELD_IDX_ESP_SPI},
+               {ICE_INSET_NAT_T_ESP_SPI, ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI},
        };
 
        for (i = 0, j = 0; i < RTE_DIM(ice_inset_map); i++) {
@@ -988,11 +1014,12 @@ ice_fdir_input_set_hdrs(enum ice_fltr_ptype flow, struct ice_flow_seg_info *seg)
                ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV6 |
                                  ICE_FLOW_SEG_HDR_IPV_FRAG);
                break;
-       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN:
-               ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP |
-                               ICE_FLOW_SEG_HDR_IPV4 |
-                               ICE_FLOW_SEG_HDR_VXLAN |
-                               ICE_FLOW_SEG_HDR_IPV_OTHER);
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP:
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP:
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP:
+               break;
+       case ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER:
+               ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV_OTHER);
                break;
        case ICE_FLTR_PTYPE_NONF_IPV4_GTPU:
                ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_GTPU_IP |
@@ -2105,8 +2132,12 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
                        if (!(esp_spec && esp_mask))
                                break;
 
-                       if (esp_mask->hdr.spi == UINT32_MAX)
-                               *input_set |= ICE_INSET_ESP_SPI;
+                       if (esp_mask->hdr.spi == UINT32_MAX) {
+                               if (l4 == RTE_FLOW_ITEM_TYPE_UDP)
+                                       *input_set |= ICE_INSET_NAT_T_ESP_SPI;
+                               else
+                                       *input_set |= ICE_INSET_ESP_SPI;
+                       }
 
                        if (l3 == RTE_FLOW_ITEM_TYPE_IPV4)
                                filter->input.ip.v4.sec_parm_idx =
@@ -2136,8 +2167,18 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
        else if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_GTPU_EH &&
                flow_type == ICE_FLTR_PTYPE_NONF_IPV6_UDP)
                flow_type = ICE_FLTR_PTYPE_NONF_IPV6_GTPU_EH;
-       else if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_VXLAN)
-               flow_type = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN;
+       else if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_VXLAN &&
+               flow_type == ICE_FLTR_PTYPE_NONF_IPV4_UDP)
+               flow_type = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_UDP;
+       else if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_VXLAN &&
+               flow_type == ICE_FLTR_PTYPE_NONF_IPV4_TCP)
+               flow_type = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_TCP;
+       else if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_VXLAN &&
+               flow_type == ICE_FLTR_PTYPE_NONF_IPV4_SCTP)
+               flow_type = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_SCTP;
+       else if (tunnel_type == ICE_FDIR_TUNNEL_TYPE_VXLAN &&
+               flow_type == ICE_FLTR_PTYPE_NONF_IPV4_OTHER)
+               flow_type = ICE_FLTR_PTYPE_NONF_IPV4_UDP_VXLAN_IPV4_OTHER;
 
        filter->tunnel_type = tunnel_type;
        filter->input.flow_type = flow_type;