ethdev: add transfer attribute to flow API
[dpdk.git] / drivers / net / tap / tap_flow.c
index 845031a..ad2ba9f 100644 (file)
@@ -270,13 +270,13 @@ static const struct tap_flow_items tap_flow_items[] = {
                .items = ITEMS(RTE_FLOW_ITEM_TYPE_IPV4,
                               RTE_FLOW_ITEM_TYPE_IPV6),
                .mask = &(const struct rte_flow_item_vlan){
-                       .tpid = -1,
                        /* DEI matching is not supported */
 #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
                        .tci = 0xffef,
 #else
                        .tci = 0xefff,
 #endif
+                       .inner_type = -1,
                },
                .mask_sz = sizeof(struct rte_flow_item_vlan),
                .default_mask = &rte_flow_item_vlan_mask,
@@ -578,13 +578,19 @@ tap_flow_create_vlan(const struct rte_flow_item *item, void *data)
        /* use default mask if none provided */
        if (!mask)
                mask = tap_flow_items[RTE_FLOW_ITEM_TYPE_VLAN].default_mask;
-       /* TC does not support tpid masking. Only accept if exact match. */
-       if (mask->tpid && mask->tpid != 0xffff)
+       /* Outer TPID cannot be matched. */
+       if (info->eth_type)
                return -1;
        /* Double-tagging not supported. */
-       if (spec && mask->tpid && spec->tpid != htons(ETH_P_8021Q))
+       if (info->vlan)
                return -1;
        info->vlan = 1;
+       if (mask->inner_type) {
+               /* TC does not support partial eth_type masking */
+               if (mask->inner_type != RTE_BE16(0xffff))
+                       return -1;
+               info->eth_type = spec->inner_type;
+       }
        if (!flow)
                return 0;
        msg = &flow->msg;
@@ -1033,6 +1039,12 @@ priv_flow_process(struct pmd_internals *pmd,
        };
        int action = 0; /* Only one action authorized for now */
 
+       if (attr->transfer) {
+               rte_flow_error_set(
+                       error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER,
+                       NULL, "transfer is not supported");
+               return -rte_errno;
+       }
        if (attr->group > MAX_GROUP) {
                rte_flow_error_set(
                        error, EINVAL, RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
@@ -2055,11 +2067,15 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd,
        struct rss_key rss_entry = { .hash_fields = 0,
                                     .key_size = 0 };
 
-       /* Check supported hash functions */
+       /* Check supported RSS features */
        if (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT)
                return rte_flow_error_set
                        (error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
                         "non-default RSS hash functions are not supported");
+       if (rss->level)
+               return rte_flow_error_set
+                       (error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
+                        "a nonzero RSS encapsulation level is not supported");
 
        /* Get a new map key for a new RSS rule */
        err = bpf_rss_key(KEY_CMD_GET, &flow->key_idx);