net/mlx5: fix vport index in port action
[dpdk.git] / drivers / net / enic / enic_flow.c
index 5924a01..6cd3640 100644 (file)
 #include "vnic_dev.h"
 #include "vnic_nic.h"
 
-#define FLOW_TRACE() \
-       rte_log(RTE_LOG_DEBUG, enicpmd_logtype_flow, \
-               "%s()\n", __func__)
-#define FLOW_LOG(level, fmt, args...) \
-       rte_log(RTE_LOG_ ## level, enicpmd_logtype_flow, \
-               fmt "\n", ##args)
-
 /*
  * Common arguments passed to copy_item functions. Use this structure
  * so we can easily add new arguments.
@@ -39,6 +32,7 @@ struct copy_item_args {
        uint8_t *inner_ofst;
        uint8_t l2_proto_off;
        uint8_t l3_proto_off;
+       struct enic *enic;
 };
 
 /* functions for copying items into enic filters */
@@ -359,17 +353,6 @@ static const enum rte_flow_action_type enic_supported_actions_v2_drop[] = {
        RTE_FLOW_ACTION_TYPE_END,
 };
 
-static const enum rte_flow_action_type enic_supported_actions_v2_count[] = {
-       RTE_FLOW_ACTION_TYPE_QUEUE,
-       RTE_FLOW_ACTION_TYPE_MARK,
-       RTE_FLOW_ACTION_TYPE_FLAG,
-       RTE_FLOW_ACTION_TYPE_DROP,
-       RTE_FLOW_ACTION_TYPE_COUNT,
-       RTE_FLOW_ACTION_TYPE_RSS,
-       RTE_FLOW_ACTION_TYPE_PASSTHRU,
-       RTE_FLOW_ACTION_TYPE_END,
-};
-
 /** Action capabilities indexed by NIC version information */
 static const struct enic_action_cap enic_action_cap[] = {
        [FILTER_ACTION_RQ_STEERING_FLAG] = {
@@ -384,10 +367,6 @@ static const struct enic_action_cap enic_action_cap[] = {
                .actions = enic_supported_actions_v2_drop,
                .copy_fn = enic_copy_action_v2,
        },
-       [FILTER_ACTION_COUNTER_FLAG] = {
-               .actions = enic_supported_actions_v2_count,
-               .copy_fn = enic_copy_action_v2,
-       },
 };
 
 static int
@@ -410,26 +389,26 @@ enic_copy_item_ipv4_v1(struct copy_item_args *arg)
        const struct rte_flow_item_ipv4 *spec = item->spec;
        const struct rte_flow_item_ipv4 *mask = item->mask;
        struct filter_ipv4_5tuple *enic_5tup = &enic_filter->u.ipv4;
-       struct ipv4_hdr supported_mask = {
+       struct rte_ipv4_hdr supported_mask = {
                .src_addr = 0xffffffff,
                .dst_addr = 0xffffffff,
        };
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        if (!mask)
                mask = &rte_flow_item_ipv4_mask;
 
        /* This is an exact match filter, both fields must be set */
        if (!spec || !spec->hdr.src_addr || !spec->hdr.dst_addr) {
-               FLOW_LOG(ERR, "IPv4 exact match src/dst addr");
+               ENICPMD_LOG(ERR, "IPv4 exact match src/dst addr");
                return ENOTSUP;
        }
 
        /* check that the suppied mask exactly matches capabilty */
        if (!mask_exact_match((const u8 *)&supported_mask,
                              (const u8 *)item->mask, sizeof(*mask))) {
-               FLOW_LOG(ERR, "IPv4 exact match mask");
+               ENICPMD_LOG(ERR, "IPv4 exact match mask");
                return ENOTSUP;
        }
 
@@ -448,26 +427,26 @@ enic_copy_item_udp_v1(struct copy_item_args *arg)
        const struct rte_flow_item_udp *spec = item->spec;
        const struct rte_flow_item_udp *mask = item->mask;
        struct filter_ipv4_5tuple *enic_5tup = &enic_filter->u.ipv4;
-       struct udp_hdr supported_mask = {
+       struct rte_udp_hdr supported_mask = {
                .src_port = 0xffff,
                .dst_port = 0xffff,
        };
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        if (!mask)
                mask = &rte_flow_item_udp_mask;
 
        /* This is an exact match filter, both ports must be set */
        if (!spec || !spec->hdr.src_port || !spec->hdr.dst_port) {
-               FLOW_LOG(ERR, "UDP exact match src/dst addr");
+               ENICPMD_LOG(ERR, "UDP exact match src/dst addr");
                return ENOTSUP;
        }
 
        /* check that the suppied mask exactly matches capabilty */
        if (!mask_exact_match((const u8 *)&supported_mask,
                              (const u8 *)item->mask, sizeof(*mask))) {
-               FLOW_LOG(ERR, "UDP exact match mask");
+               ENICPMD_LOG(ERR, "UDP exact match mask");
                return ENOTSUP;
        }
 
@@ -487,26 +466,26 @@ enic_copy_item_tcp_v1(struct copy_item_args *arg)
        const struct rte_flow_item_tcp *spec = item->spec;
        const struct rte_flow_item_tcp *mask = item->mask;
        struct filter_ipv4_5tuple *enic_5tup = &enic_filter->u.ipv4;
-       struct tcp_hdr supported_mask = {
+       struct rte_tcp_hdr supported_mask = {
                .src_port = 0xffff,
                .dst_port = 0xffff,
        };
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        if (!mask)
                mask = &rte_flow_item_tcp_mask;
 
        /* This is an exact match filter, both ports must be set */
        if (!spec || !spec->hdr.src_port || !spec->hdr.dst_port) {
-               FLOW_LOG(ERR, "TCPIPv4 exact match src/dst addr");
+               ENICPMD_LOG(ERR, "TCPIPv4 exact match src/dst addr");
                return ENOTSUP;
        }
 
        /* check that the suppied mask exactly matches capabilty */
        if (!mask_exact_match((const u8 *)&supported_mask,
                             (const u8 *)item->mask, sizeof(*mask))) {
-               FLOW_LOG(ERR, "TCP exact match mask");
+               ENICPMD_LOG(ERR, "TCP exact match mask");
                return ENOTSUP;
        }
 
@@ -568,12 +547,12 @@ enic_copy_item_inner_eth_v2(struct copy_item_args *arg)
        const void *mask = arg->item->mask;
        uint8_t *off = arg->inner_ofst;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
        if (!mask)
                mask = &rte_flow_item_eth_mask;
-       arg->l2_proto_off = *off + offsetof(struct ether_hdr, ether_type);
+       arg->l2_proto_off = *off + offsetof(struct rte_ether_hdr, ether_type);
        return copy_inner_common(&arg->filter->u.generic_1, off,
-               arg->item->spec, mask, sizeof(struct ether_hdr),
+               arg->item->spec, mask, sizeof(struct rte_ether_hdr),
                0 /* no previous protocol */, 0, 0);
 }
 
@@ -584,15 +563,15 @@ enic_copy_item_inner_vlan_v2(struct copy_item_args *arg)
        uint8_t *off = arg->inner_ofst;
        uint8_t eth_type_off;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
        if (!mask)
                mask = &rte_flow_item_vlan_mask;
        /* Append vlan header to L5 and set ether type = TPID */
        eth_type_off = arg->l2_proto_off;
-       arg->l2_proto_off = *off + offsetof(struct vlan_hdr, eth_proto);
+       arg->l2_proto_off = *off + offsetof(struct rte_vlan_hdr, eth_proto);
        return copy_inner_common(&arg->filter->u.generic_1, off,
-               arg->item->spec, mask, sizeof(struct vlan_hdr),
-               eth_type_off, rte_cpu_to_be_16(ETHER_TYPE_VLAN), 2);
+               arg->item->spec, mask, sizeof(struct rte_vlan_hdr),
+               eth_type_off, rte_cpu_to_be_16(RTE_ETHER_TYPE_VLAN), 2);
 }
 
 static int
@@ -601,14 +580,14 @@ enic_copy_item_inner_ipv4_v2(struct copy_item_args *arg)
        const void *mask = arg->item->mask;
        uint8_t *off = arg->inner_ofst;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
        if (!mask)
                mask = &rte_flow_item_ipv4_mask;
        /* Append ipv4 header to L5 and set ether type = ipv4 */
-       arg->l3_proto_off = *off + offsetof(struct ipv4_hdr, next_proto_id);
+       arg->l3_proto_off = *off + offsetof(struct rte_ipv4_hdr, next_proto_id);
        return copy_inner_common(&arg->filter->u.generic_1, off,
-               arg->item->spec, mask, sizeof(struct ipv4_hdr),
-               arg->l2_proto_off, rte_cpu_to_be_16(ETHER_TYPE_IPv4), 2);
+               arg->item->spec, mask, sizeof(struct rte_ipv4_hdr),
+               arg->l2_proto_off, rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4), 2);
 }
 
 static int
@@ -617,14 +596,14 @@ enic_copy_item_inner_ipv6_v2(struct copy_item_args *arg)
        const void *mask = arg->item->mask;
        uint8_t *off = arg->inner_ofst;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
        if (!mask)
                mask = &rte_flow_item_ipv6_mask;
        /* Append ipv6 header to L5 and set ether type = ipv6 */
-       arg->l3_proto_off = *off + offsetof(struct ipv6_hdr, proto);
+       arg->l3_proto_off = *off + offsetof(struct rte_ipv6_hdr, proto);
        return copy_inner_common(&arg->filter->u.generic_1, off,
-               arg->item->spec, mask, sizeof(struct ipv6_hdr),
-               arg->l2_proto_off, rte_cpu_to_be_16(ETHER_TYPE_IPv6), 2);
+               arg->item->spec, mask, sizeof(struct rte_ipv6_hdr),
+               arg->l2_proto_off, rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV6), 2);
 }
 
 static int
@@ -633,12 +612,12 @@ enic_copy_item_inner_udp_v2(struct copy_item_args *arg)
        const void *mask = arg->item->mask;
        uint8_t *off = arg->inner_ofst;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
        if (!mask)
                mask = &rte_flow_item_udp_mask;
        /* Append udp header to L5 and set ip proto = udp */
        return copy_inner_common(&arg->filter->u.generic_1, off,
-               arg->item->spec, mask, sizeof(struct udp_hdr),
+               arg->item->spec, mask, sizeof(struct rte_udp_hdr),
                arg->l3_proto_off, IPPROTO_UDP, 1);
 }
 
@@ -648,12 +627,12 @@ enic_copy_item_inner_tcp_v2(struct copy_item_args *arg)
        const void *mask = arg->item->mask;
        uint8_t *off = arg->inner_ofst;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
        if (!mask)
                mask = &rte_flow_item_tcp_mask;
        /* Append tcp header to L5 and set ip proto = tcp */
        return copy_inner_common(&arg->filter->u.generic_1, off,
-               arg->item->spec, mask, sizeof(struct tcp_hdr),
+               arg->item->spec, mask, sizeof(struct rte_tcp_hdr),
                arg->l3_proto_off, IPPROTO_TCP, 1);
 }
 
@@ -662,13 +641,13 @@ enic_copy_item_eth_v2(struct copy_item_args *arg)
 {
        const struct rte_flow_item *item = arg->item;
        struct filter_v2 *enic_filter = arg->filter;
-       struct ether_hdr enic_spec;
-       struct ether_hdr enic_mask;
+       struct rte_ether_hdr enic_spec;
+       struct rte_ether_hdr enic_mask;
        const struct rte_flow_item_eth *spec = item->spec;
        const struct rte_flow_item_eth *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /* Match all if no spec */
        if (!spec)
@@ -678,22 +657,22 @@ enic_copy_item_eth_v2(struct copy_item_args *arg)
                mask = &rte_flow_item_eth_mask;
 
        memcpy(enic_spec.d_addr.addr_bytes, spec->dst.addr_bytes,
-              ETHER_ADDR_LEN);
+              RTE_ETHER_ADDR_LEN);
        memcpy(enic_spec.s_addr.addr_bytes, spec->src.addr_bytes,
-              ETHER_ADDR_LEN);
+              RTE_ETHER_ADDR_LEN);
 
        memcpy(enic_mask.d_addr.addr_bytes, mask->dst.addr_bytes,
-              ETHER_ADDR_LEN);
+              RTE_ETHER_ADDR_LEN);
        memcpy(enic_mask.s_addr.addr_bytes, mask->src.addr_bytes,
-              ETHER_ADDR_LEN);
+              RTE_ETHER_ADDR_LEN);
        enic_spec.ether_type = spec->type;
        enic_mask.ether_type = mask->type;
 
        /* outer header */
        memcpy(gp->layer[FILTER_GENERIC_1_L2].mask, &enic_mask,
-              sizeof(struct ether_hdr));
+              sizeof(struct rte_ether_hdr));
        memcpy(gp->layer[FILTER_GENERIC_1_L2].val, &enic_spec,
-              sizeof(struct ether_hdr));
+              sizeof(struct rte_ether_hdr));
        return 0;
 }
 
@@ -705,10 +684,10 @@ enic_copy_item_vlan_v2(struct copy_item_args *arg)
        const struct rte_flow_item_vlan *spec = item->spec;
        const struct rte_flow_item_vlan *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
-       struct ether_hdr *eth_mask;
-       struct ether_hdr *eth_val;
+       struct rte_ether_hdr *eth_mask;
+       struct rte_ether_hdr *eth_val;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /* Match all if no spec */
        if (!spec)
@@ -723,12 +702,26 @@ enic_copy_item_vlan_v2(struct copy_item_args *arg)
        if (eth_mask->ether_type)
                return ENOTSUP;
        /*
+        * For recent models:
         * When packet matching, the VIC always compares vlan-stripped
         * L2, regardless of vlan stripping settings. So, the inner type
         * from vlan becomes the ether type of the eth header.
+        *
+        * Older models w/o hardware vxlan parser have a different
+        * behavior when vlan stripping is disabled. In this case,
+        * vlan tag remains in the L2 buffer.
         */
-       eth_mask->ether_type = mask->inner_type;
-       eth_val->ether_type = spec->inner_type;
+       if (!arg->enic->vxlan && !arg->enic->ig_vlan_strip_en) {
+               struct rte_vlan_hdr *vlan;
+
+               vlan = (struct rte_vlan_hdr *)(eth_mask + 1);
+               vlan->eth_proto = mask->inner_type;
+               vlan = (struct rte_vlan_hdr *)(eth_val + 1);
+               vlan->eth_proto = spec->inner_type;
+       } else {
+               eth_mask->ether_type = mask->inner_type;
+               eth_val->ether_type = spec->inner_type;
+       }
        /* For TCI, use the vlan mask/val fields (little endian). */
        gp->mask_vlan = rte_be_to_cpu_16(mask->tci);
        gp->val_vlan = rte_be_to_cpu_16(spec->tci);
@@ -744,7 +737,7 @@ enic_copy_item_ipv4_v2(struct copy_item_args *arg)
        const struct rte_flow_item_ipv4 *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /* Match IPv4 */
        gp->mask_flags |= FILTER_GENERIC_1_IPV4;
@@ -758,9 +751,9 @@ enic_copy_item_ipv4_v2(struct copy_item_args *arg)
                mask = &rte_flow_item_ipv4_mask;
 
        memcpy(gp->layer[FILTER_GENERIC_1_L3].mask, &mask->hdr,
-              sizeof(struct ipv4_hdr));
+              sizeof(struct rte_ipv4_hdr));
        memcpy(gp->layer[FILTER_GENERIC_1_L3].val, &spec->hdr,
-              sizeof(struct ipv4_hdr));
+              sizeof(struct rte_ipv4_hdr));
        return 0;
 }
 
@@ -773,7 +766,7 @@ enic_copy_item_ipv6_v2(struct copy_item_args *arg)
        const struct rte_flow_item_ipv6 *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /* Match IPv6 */
        gp->mask_flags |= FILTER_GENERIC_1_IPV6;
@@ -787,9 +780,9 @@ enic_copy_item_ipv6_v2(struct copy_item_args *arg)
                mask = &rte_flow_item_ipv6_mask;
 
        memcpy(gp->layer[FILTER_GENERIC_1_L3].mask, &mask->hdr,
-              sizeof(struct ipv6_hdr));
+              sizeof(struct rte_ipv6_hdr));
        memcpy(gp->layer[FILTER_GENERIC_1_L3].val, &spec->hdr,
-              sizeof(struct ipv6_hdr));
+              sizeof(struct rte_ipv6_hdr));
        return 0;
 }
 
@@ -802,7 +795,7 @@ enic_copy_item_udp_v2(struct copy_item_args *arg)
        const struct rte_flow_item_udp *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /* Match UDP */
        gp->mask_flags |= FILTER_GENERIC_1_UDP;
@@ -816,9 +809,9 @@ enic_copy_item_udp_v2(struct copy_item_args *arg)
                mask = &rte_flow_item_udp_mask;
 
        memcpy(gp->layer[FILTER_GENERIC_1_L4].mask, &mask->hdr,
-              sizeof(struct udp_hdr));
+              sizeof(struct rte_udp_hdr));
        memcpy(gp->layer[FILTER_GENERIC_1_L4].val, &spec->hdr,
-              sizeof(struct udp_hdr));
+              sizeof(struct rte_udp_hdr));
        return 0;
 }
 
@@ -831,7 +824,7 @@ enic_copy_item_tcp_v2(struct copy_item_args *arg)
        const struct rte_flow_item_tcp *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /* Match TCP */
        gp->mask_flags |= FILTER_GENERIC_1_TCP;
@@ -845,9 +838,9 @@ enic_copy_item_tcp_v2(struct copy_item_args *arg)
                return ENOTSUP;
 
        memcpy(gp->layer[FILTER_GENERIC_1_L4].mask, &mask->hdr,
-              sizeof(struct tcp_hdr));
+              sizeof(struct rte_tcp_hdr));
        memcpy(gp->layer[FILTER_GENERIC_1_L4].val, &spec->hdr,
-              sizeof(struct tcp_hdr));
+              sizeof(struct rte_tcp_hdr));
        return 0;
 }
 
@@ -862,23 +855,23 @@ enic_copy_item_sctp_v2(struct copy_item_args *arg)
        uint8_t *ip_proto_mask = NULL;
        uint8_t *ip_proto = NULL;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /*
         * The NIC filter API has no flags for "match sctp", so explicitly set
         * the protocol number in the IP pattern.
         */
        if (gp->val_flags & FILTER_GENERIC_1_IPV4) {
-               struct ipv4_hdr *ip;
-               ip = (struct ipv4_hdr *)gp->layer[FILTER_GENERIC_1_L3].mask;
+               struct rte_ipv4_hdr *ip;
+               ip = (struct rte_ipv4_hdr *)gp->layer[FILTER_GENERIC_1_L3].mask;
                ip_proto_mask = &ip->next_proto_id;
-               ip = (struct ipv4_hdr *)gp->layer[FILTER_GENERIC_1_L3].val;
+               ip = (struct rte_ipv4_hdr *)gp->layer[FILTER_GENERIC_1_L3].val;
                ip_proto = &ip->next_proto_id;
        } else if (gp->val_flags & FILTER_GENERIC_1_IPV6) {
-               struct ipv6_hdr *ip;
-               ip = (struct ipv6_hdr *)gp->layer[FILTER_GENERIC_1_L3].mask;
+               struct rte_ipv6_hdr *ip;
+               ip = (struct rte_ipv6_hdr *)gp->layer[FILTER_GENERIC_1_L3].mask;
                ip_proto_mask = &ip->proto;
-               ip = (struct ipv6_hdr *)gp->layer[FILTER_GENERIC_1_L3].val;
+               ip = (struct rte_ipv6_hdr *)gp->layer[FILTER_GENERIC_1_L3].val;
                ip_proto = &ip->proto;
        } else {
                /* Need IPv4/IPv6 pattern first */
@@ -895,9 +888,9 @@ enic_copy_item_sctp_v2(struct copy_item_args *arg)
                mask = &rte_flow_item_sctp_mask;
 
        memcpy(gp->layer[FILTER_GENERIC_1_L4].mask, &mask->hdr,
-              sizeof(struct sctp_hdr));
+              sizeof(struct rte_sctp_hdr));
        memcpy(gp->layer[FILTER_GENERIC_1_L4].val, &spec->hdr,
-              sizeof(struct sctp_hdr));
+              sizeof(struct rte_sctp_hdr));
        return 0;
 }
 
@@ -910,9 +903,9 @@ enic_copy_item_vxlan_v2(struct copy_item_args *arg)
        const struct rte_flow_item_vxlan *spec = item->spec;
        const struct rte_flow_item_vxlan *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
-       struct udp_hdr *udp;
+       struct rte_udp_hdr *udp;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /*
         * The NIC filter API has no flags for "match vxlan". Set UDP port to
@@ -920,9 +913,9 @@ enic_copy_item_vxlan_v2(struct copy_item_args *arg)
         */
        gp->mask_flags |= FILTER_GENERIC_1_UDP;
        gp->val_flags |= FILTER_GENERIC_1_UDP;
-       udp = (struct udp_hdr *)gp->layer[FILTER_GENERIC_1_L4].mask;
+       udp = (struct rte_udp_hdr *)gp->layer[FILTER_GENERIC_1_L4].mask;
        udp->dst_port = 0xffff;
-       udp = (struct udp_hdr *)gp->layer[FILTER_GENERIC_1_L4].val;
+       udp = (struct rte_udp_hdr *)gp->layer[FILTER_GENERIC_1_L4].val;
        udp->dst_port = RTE_BE16(4789);
        /* Match all if no spec */
        if (!spec)
@@ -932,11 +925,11 @@ enic_copy_item_vxlan_v2(struct copy_item_args *arg)
                mask = &rte_flow_item_vxlan_mask;
 
        memcpy(gp->layer[FILTER_GENERIC_1_L5].mask, mask,
-              sizeof(struct vxlan_hdr));
+              sizeof(struct rte_vxlan_hdr));
        memcpy(gp->layer[FILTER_GENERIC_1_L5].val, spec,
-              sizeof(struct vxlan_hdr));
+              sizeof(struct rte_vxlan_hdr));
 
-       *inner_ofst = sizeof(struct vxlan_hdr);
+       *inner_ofst = sizeof(struct rte_vxlan_hdr);
        return 0;
 }
 
@@ -955,7 +948,7 @@ enic_copy_item_raw_v2(struct copy_item_args *arg)
        const struct rte_flow_item_raw *mask = item->mask;
        struct filter_generic_1 *gp = &enic_filter->u.generic_1;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        /* Cannot be used for inner packet */
        if (*inner_ofst)
@@ -967,7 +960,8 @@ enic_copy_item_raw_v2(struct copy_item_args *arg)
        if (!spec->relative || spec->offset != 0 || spec->search || spec->limit)
                return EINVAL;
        /* Need non-null pattern that fits within the NIC's filter pattern */
-       if (spec->length == 0 || spec->length > FILTER_GENERIC_1_KEY_LEN ||
+       if (spec->length == 0 ||
+           spec->length + sizeof(struct rte_udp_hdr) > FILTER_GENERIC_1_KEY_LEN ||
            !spec->pattern || !mask->pattern)
                return EINVAL;
        /*
@@ -980,9 +974,9 @@ enic_copy_item_raw_v2(struct copy_item_args *arg)
         */
        if (mask->length != 0 && mask->length < spec->length)
                return EINVAL;
-       memcpy(gp->layer[FILTER_GENERIC_1_L4].mask + sizeof(struct udp_hdr),
+       memcpy(gp->layer[FILTER_GENERIC_1_L4].mask + sizeof(struct rte_udp_hdr),
               mask->pattern, spec->length);
-       memcpy(gp->layer[FILTER_GENERIC_1_L4].val + sizeof(struct udp_hdr),
+       memcpy(gp->layer[FILTER_GENERIC_1_L4].val + sizeof(struct rte_udp_hdr),
               spec->pattern, spec->length);
 
        return 0;
@@ -1005,7 +999,7 @@ item_stacking_valid(enum rte_flow_item_type prev_item,
 {
        enum rte_flow_item_type const *allowed_items = item_info->prev_items;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        for (; *allowed_items != RTE_FLOW_ITEM_TYPE_END; allowed_items++) {
                if (prev_item == *allowed_items)
@@ -1034,11 +1028,11 @@ fixup_l5_layer(struct enic *enic, struct filter_generic_1 *gp,
 
        if (!(inner_ofst > 0 && enic->vxlan))
                return;
-       FLOW_TRACE();
-       vxlan = sizeof(struct vxlan_hdr);
-       memcpy(gp->layer[FILTER_GENERIC_1_L4].mask + sizeof(struct udp_hdr),
+       ENICPMD_FUNC_TRACE();
+       vxlan = sizeof(struct rte_vxlan_hdr);
+       memcpy(gp->layer[FILTER_GENERIC_1_L4].mask + sizeof(struct rte_udp_hdr),
               gp->layer[FILTER_GENERIC_1_L5].mask, vxlan);
-       memcpy(gp->layer[FILTER_GENERIC_1_L4].val + sizeof(struct udp_hdr),
+       memcpy(gp->layer[FILTER_GENERIC_1_L4].val + sizeof(struct rte_udp_hdr),
               gp->layer[FILTER_GENERIC_1_L5].val, vxlan);
        inner = inner_ofst - vxlan;
        memset(layer, 0, sizeof(layer));
@@ -1076,12 +1070,13 @@ enic_copy_filter(const struct rte_flow_item pattern[],
        enic_copy_item_fn *copy_fn;
        u8 is_first_item = 1;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        prev_item = 0;
 
        args.filter = enic_filter;
        args.inner_ofst = &inner_ofst;
+       args.enic = enic;
        for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
                /* Get info about how to validate and copy the item. If NULL
                 * is returned the nic does not support the item.
@@ -1144,7 +1139,7 @@ enic_copy_action_v1(__rte_unused struct enic *enic,
        enum { FATE = 1, };
        uint32_t overlap = 0;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
                if (actions->type == RTE_FLOW_ACTION_TYPE_VOID)
@@ -1192,7 +1187,7 @@ enic_copy_action_v2(struct enic *enic,
        uint32_t overlap = 0;
        bool passthru = false;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
                switch (actions->type) {
@@ -1248,10 +1243,6 @@ enic_copy_action_v2(struct enic *enic,
                        enic_action->flags |= FILTER_ACTION_DROP_FLAG;
                        break;
                }
-               case RTE_FLOW_ACTION_TYPE_COUNT: {
-                       enic_action->flags |= FILTER_ACTION_COUNTER_FLAG;
-                       break;
-               }
                case RTE_FLOW_ACTION_TYPE_RSS: {
                        const struct rte_flow_action_rss *rss =
                                (const struct rte_flow_action_rss *)
@@ -1343,9 +1334,7 @@ enic_get_action_cap(struct enic *enic)
        uint8_t actions;
 
        actions = enic->filter_actions;
-       if (actions & FILTER_ACTION_COUNTER_FLAG)
-               ea = &enic_action_cap[FILTER_ACTION_COUNTER_FLAG];
-       else if (actions & FILTER_ACTION_DROP_FLAG)
+       if (actions & FILTER_ACTION_DROP_FLAG)
                ea = &enic_action_cap[FILTER_ACTION_DROP_FLAG];
        else if (actions & FILTER_ACTION_FILTER_ID_FLAG)
                ea = &enic_action_cap[FILTER_ACTION_FILTER_ID_FLAG];
@@ -1359,14 +1348,14 @@ static void
 enic_dump_actions(const struct filter_action_v2 *ea)
 {
        if (ea->type == FILTER_ACTION_RQ_STEERING) {
-               FLOW_LOG(INFO, "Action(V1), queue: %u\n", ea->rq_idx);
+               ENICPMD_LOG(INFO, "Action(V1), queue: %u\n", ea->rq_idx);
        } else if (ea->type == FILTER_ACTION_V2) {
-               FLOW_LOG(INFO, "Actions(V2)\n");
+               ENICPMD_LOG(INFO, "Actions(V2)\n");
                if (ea->flags & FILTER_ACTION_RQ_STEERING_FLAG)
-                       FLOW_LOG(INFO, "\tqueue: %u\n",
+                       ENICPMD_LOG(INFO, "\tqueue: %u\n",
                               enic_sop_rq_idx_to_rte_idx(ea->rq_idx));
                if (ea->flags & FILTER_ACTION_FILTER_ID_FLAG)
-                       FLOW_LOG(INFO, "\tfilter_id: %u\n", ea->filter_id);
+                       ENICPMD_LOG(INFO, "\tfilter_id: %u\n", ea->filter_id);
        }
 }
 
@@ -1382,13 +1371,13 @@ enic_dump_filter(const struct filter_v2 *filt)
 
        switch (filt->type) {
        case FILTER_IPV4_5TUPLE:
-               FLOW_LOG(INFO, "FILTER_IPV4_5TUPLE\n");
+               ENICPMD_LOG(INFO, "FILTER_IPV4_5TUPLE\n");
                break;
        case FILTER_USNIC_IP:
        case FILTER_DPDK_1:
                /* FIXME: this should be a loop */
                gp = &filt->u.generic_1;
-               FLOW_LOG(INFO, "Filter: vlan: 0x%04x, mask: 0x%04x\n",
+               ENICPMD_LOG(INFO, "Filter: vlan: 0x%04x, mask: 0x%04x\n",
                       gp->val_vlan, gp->mask_vlan);
 
                if (gp->mask_flags & FILTER_GENERIC_1_IPV4)
@@ -1446,7 +1435,7 @@ enic_dump_filter(const struct filter_v2 *filt)
                                 ? "ipfrag(y)" : "ipfrag(n)");
                else
                        sprintf(ipfrag, "%s ", "ipfrag(x)");
-               FLOW_LOG(INFO, "\tFlags: %s%s%s%s%s%s%s%s\n", ip4, ip6, udp,
+               ENICPMD_LOG(INFO, "\tFlags: %s%s%s%s%s%s%s%s\n", ip4, ip6, udp,
                         tcp, tcpudp, ip4csum, l4csum, ipfrag);
 
                for (i = 0; i < FILTER_GENERIC_1_NUM_LAYERS; i++) {
@@ -1463,7 +1452,7 @@ enic_dump_filter(const struct filter_v2 *filt)
                                bp += 2;
                        }
                        *bp = '\0';
-                       FLOW_LOG(INFO, "\tL%u mask: %s\n", i + 2, buf);
+                       ENICPMD_LOG(INFO, "\tL%u mask: %s\n", i + 2, buf);
                        bp = buf;
                        for (j = 0; j <= mbyte; j++) {
                                sprintf(bp, "%02x",
@@ -1471,11 +1460,11 @@ enic_dump_filter(const struct filter_v2 *filt)
                                bp += 2;
                        }
                        *bp = '\0';
-                       FLOW_LOG(INFO, "\tL%u  val: %s\n", i + 2, buf);
+                       ENICPMD_LOG(INFO, "\tL%u  val: %s\n", i + 2, buf);
                }
                break;
        default:
-               FLOW_LOG(INFO, "FILTER UNKNOWN\n");
+               ENICPMD_LOG(INFO, "FILTER UNKNOWN\n");
                break;
        }
 }
@@ -1517,7 +1506,7 @@ enic_flow_parse(struct rte_eth_dev *dev,
        const struct enic_action_cap *enic_action_cap;
        const struct rte_flow_action *action;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        memset(enic_filter, 0, sizeof(*enic_filter));
        memset(enic_action, 0, sizeof(*enic_action));
@@ -1629,11 +1618,9 @@ enic_flow_add_filter(struct enic *enic, struct filter_v2 *enic_filter,
 {
        struct rte_flow *flow;
        int err;
-       uint16_t entry;
-       int ctr_idx;
-       int last_max_flow_ctr;
+       u16 entry;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        flow = rte_calloc(__func__, 1, sizeof(*flow), 0);
        if (!flow) {
@@ -1642,34 +1629,6 @@ enic_flow_add_filter(struct enic *enic, struct filter_v2 *enic_filter,
                return NULL;
        }
 
-       flow->counter_idx = -1;
-       last_max_flow_ctr = -1;
-       if (enic_action->flags & FILTER_ACTION_COUNTER_FLAG) {
-               if (!vnic_dev_counter_alloc(enic->vdev, (uint32_t *)&ctr_idx)) {
-                       rte_flow_error_set(error, ENOMEM,
-                                          RTE_FLOW_ERROR_TYPE_ACTION_CONF,
-                                          NULL, "cannot allocate counter");
-                       goto unwind_flow_alloc;
-               }
-               flow->counter_idx = ctr_idx;
-               enic_action->counter_index = ctr_idx;
-
-               /* If index is the largest, increase the counter DMA size */
-               if (ctr_idx > enic->max_flow_counter) {
-                       err = vnic_dev_counter_dma_cfg(enic->vdev,
-                                                VNIC_FLOW_COUNTER_UPDATE_MSECS,
-                                                ctr_idx + 1);
-                       if (err) {
-                               rte_flow_error_set(error, -err,
-                                          RTE_FLOW_ERROR_TYPE_ACTION_CONF,
-                                          NULL, "counter DMA config failed");
-                               goto unwind_ctr_alloc;
-                       }
-                       last_max_flow_ctr = enic->max_flow_counter;
-                       enic->max_flow_counter = ctr_idx;
-               }
-       }
-
        /* entry[in] is the queue id, entry[out] is the filter Id for delete */
        entry = enic_action->rq_idx;
        err = vnic_dev_classifier(enic->vdev, CLSF_ADD, &entry, enic_filter,
@@ -1677,29 +1636,13 @@ enic_flow_add_filter(struct enic *enic, struct filter_v2 *enic_filter,
        if (err) {
                rte_flow_error_set(error, -err, RTE_FLOW_ERROR_TYPE_HANDLE,
                                   NULL, "vnic_dev_classifier error");
-               goto unwind_ctr_dma_cfg;
+               rte_free(flow);
+               return NULL;
        }
 
        flow->enic_filter_id = entry;
        flow->enic_filter = *enic_filter;
-
        return flow;
-
-/* unwind if there are errors */
-unwind_ctr_dma_cfg:
-       if (last_max_flow_ctr != -1) {
-               /* reduce counter DMA size */
-               vnic_dev_counter_dma_cfg(enic->vdev,
-                                        VNIC_FLOW_COUNTER_UPDATE_MSECS,
-                                        last_max_flow_ctr + 1);
-               enic->max_flow_counter = last_max_flow_ctr;
-       }
-unwind_ctr_alloc:
-       if (flow->counter_idx != -1)
-               vnic_dev_counter_free(enic->vdev, ctr_idx);
-unwind_flow_alloc:
-       rte_free(flow);
-       return NULL;
 }
 
 /**
@@ -1720,7 +1663,7 @@ enic_flow_del_filter(struct enic *enic, struct rte_flow *flow,
        u16 filter_id;
        int err;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        filter_id = flow->enic_filter_id;
        err = vnic_dev_classifier(enic->vdev, CLSF_DEL, &filter_id, NULL, NULL);
@@ -1729,13 +1672,6 @@ enic_flow_del_filter(struct enic *enic, struct rte_flow *flow,
                                   NULL, "vnic_dev_classifier failed");
                return -err;
        }
-
-       if (flow->counter_idx != -1) {
-               if (!vnic_dev_counter_free(enic->vdev, flow->counter_idx))
-                       dev_err(enic, "counter free failed, idx: %d\n",
-                               flow->counter_idx);
-               flow->counter_idx = -1;
-       }
        return 0;
 }
 
@@ -1759,7 +1695,7 @@ enic_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attrs,
        struct filter_action_v2 enic_action;
        int ret;
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        ret = enic_flow_parse(dev, attrs, pattern, actions, error,
                               &enic_filter, &enic_action);
@@ -1787,19 +1723,17 @@ enic_flow_create(struct rte_eth_dev *dev,
        struct rte_flow *flow;
        struct enic *enic = pmd_priv(dev);
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
        ret = enic_flow_parse(dev, attrs, pattern, actions, error, &enic_filter,
                              &enic_action);
        if (ret < 0)
                return NULL;
 
-       rte_spinlock_lock(&enic->flows_lock);
        flow = enic_flow_add_filter(enic, &enic_filter, &enic_action,
                                    error);
        if (flow)
                LIST_INSERT_HEAD(&enic->flows, flow, next);
-       rte_spinlock_unlock(&enic->flows_lock);
 
        return flow;
 }
@@ -1816,12 +1750,10 @@ enic_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow,
 {
        struct enic *enic = pmd_priv(dev);
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
-       rte_spinlock_lock(&enic->flows_lock);
        enic_flow_del_filter(enic, flow, error);
        LIST_REMOVE(flow, next);
-       rte_spinlock_unlock(&enic->flows_lock);
        rte_free(flow);
        return 0;
 }
@@ -1838,9 +1770,8 @@ enic_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
        struct rte_flow *flow;
        struct enic *enic = pmd_priv(dev);
 
-       FLOW_TRACE();
+       ENICPMD_FUNC_TRACE();
 
-       rte_spinlock_lock(&enic->flows_lock);
 
        while (!LIST_EMPTY(&enic->flows)) {
                flow = LIST_FIRST(&enic->flows);
@@ -1848,70 +1779,6 @@ enic_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error)
                LIST_REMOVE(flow, next);
                rte_free(flow);
        }
-       rte_spinlock_unlock(&enic->flows_lock);
-       return 0;
-}
-
-static int
-enic_flow_query_count(struct rte_eth_dev *dev,
-                     struct rte_flow *flow, void *data,
-                     struct rte_flow_error *error)
-{
-       struct enic *enic = pmd_priv(dev);
-       struct rte_flow_query_count *query;
-       uint64_t packets, bytes;
-
-       FLOW_TRACE();
-
-       if (flow->counter_idx == -1) {
-               return rte_flow_error_set(error, ENOTSUP,
-                                         RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-                                         NULL,
-                                         "flow does not have counter");
-       }
-       query = (struct rte_flow_query_count *)data;
-       if (!vnic_dev_counter_query(enic->vdev, flow->counter_idx,
-                                   !!query->reset, &packets, &bytes)) {
-               return rte_flow_error_set
-                       (error, EINVAL,
-                        RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-                        NULL,
-                        "cannot read counter");
-       }
-       query->hits_set = 1;
-       query->bytes_set = 1;
-       query->hits = packets;
-       query->bytes = bytes;
-       return 0;
-}
-
-static int
-enic_flow_query(struct rte_eth_dev *dev,
-               struct rte_flow *flow,
-               const struct rte_flow_action *actions,
-               void *data,
-               struct rte_flow_error *error)
-{
-       int ret = 0;
-
-       FLOW_TRACE();
-
-       for (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {
-               switch (actions->type) {
-               case RTE_FLOW_ACTION_TYPE_VOID:
-                       break;
-               case RTE_FLOW_ACTION_TYPE_COUNT:
-                       ret = enic_flow_query_count(dev, flow, data, error);
-                       break;
-               default:
-                       return rte_flow_error_set(error, ENOTSUP,
-                                                 RTE_FLOW_ERROR_TYPE_ACTION,
-                                                 actions,
-                                                 "action not supported");
-               }
-               if (ret < 0)
-                       return ret;
-       }
        return 0;
 }
 
@@ -1925,5 +1792,4 @@ const struct rte_flow_ops enic_flow_ops = {
        .create = enic_flow_create,
        .destroy = enic_flow_destroy,
        .flush = enic_flow_flush,
-       .query = enic_flow_query,
 };