examples/l3fwd: share queue size variables
[dpdk.git] / drivers / net / iavf / iavf_generic_flow.c
index 364904f..ddc1fdd 100644 (file)
@@ -1611,6 +1611,40 @@ enum rte_flow_item_type iavf_pattern_eth_ipv6_gre_ipv6_udp[] = {
        RTE_FLOW_ITEM_TYPE_END,
 };
 
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2[] = {
+       RTE_FLOW_ITEM_TYPE_ETH,
+       RTE_FLOW_ITEM_TYPE_IPV4,
+       RTE_FLOW_ITEM_TYPE_UDP,
+       RTE_FLOW_ITEM_TYPE_L2TPV2,
+       RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp[] = {
+       RTE_FLOW_ITEM_TYPE_ETH,
+       RTE_FLOW_ITEM_TYPE_IPV4,
+       RTE_FLOW_ITEM_TYPE_UDP,
+       RTE_FLOW_ITEM_TYPE_L2TPV2,
+       RTE_FLOW_ITEM_TYPE_PPP,
+       RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2[] = {
+       RTE_FLOW_ITEM_TYPE_ETH,
+       RTE_FLOW_ITEM_TYPE_IPV6,
+       RTE_FLOW_ITEM_TYPE_UDP,
+       RTE_FLOW_ITEM_TYPE_L2TPV2,
+       RTE_FLOW_ITEM_TYPE_END,
+};
+
+enum rte_flow_item_type iavf_pattern_eth_ipv6_udp_l2tpv2_ppp[] = {
+       RTE_FLOW_ITEM_TYPE_ETH,
+       RTE_FLOW_ITEM_TYPE_IPV6,
+       RTE_FLOW_ITEM_TYPE_UDP,
+       RTE_FLOW_ITEM_TYPE_L2TPV2,
+       RTE_FLOW_ITEM_TYPE_PPP,
+       RTE_FLOW_ITEM_TYPE_END,
+};
+
 /* PPPoL2TPv2oUDP */
 enum rte_flow_item_type iavf_pattern_eth_ipv4_udp_l2tpv2_ppp_ipv4[] = {
        RTE_FLOW_ITEM_TYPE_ETH,
@@ -1766,6 +1800,7 @@ iavf_flow_init(struct iavf_adapter *ad)
        TAILQ_INIT(&vf->flow_list);
        TAILQ_INIT(&vf->rss_parser_list);
        TAILQ_INIT(&vf->dist_parser_list);
+       TAILQ_INIT(&vf->ipsec_crypto_parser_list);
        rte_spinlock_init(&vf->flow_ops_lock);
 
        RTE_TAILQ_FOREACH_SAFE(engine, &engine_list, node, temp) {
@@ -1840,6 +1875,9 @@ iavf_register_parser(struct iavf_flow_parser *parser,
        } else if (parser->engine->type == IAVF_FLOW_ENGINE_FDIR) {
                list = &vf->dist_parser_list;
                TAILQ_INSERT_HEAD(list, parser_node, node);
+       } else if (parser->engine->type == IAVF_FLOW_ENGINE_IPSEC_CRYPTO) {
+               list = &vf->ipsec_crypto_parser_list;
+               TAILQ_INSERT_HEAD(list, parser_node, node);
        } else {
                return -EINVAL;
        }
@@ -2149,6 +2187,13 @@ iavf_flow_process_filter(struct rte_eth_dev *dev,
 
        *engine = iavf_parse_engine(ad, flow, &vf->dist_parser_list, pattern,
                                    actions, error);
+       if (*engine)
+               return 0;
+
+       *engine = iavf_parse_engine(ad, flow, &vf->ipsec_crypto_parser_list,
+                       pattern, actions, error);
+       if (*engine)
+               return 0;
 
        if (!*engine) {
                rte_flow_error_set(error, EINVAL,
@@ -2195,6 +2240,10 @@ iavf_flow_create(struct rte_eth_dev *dev,
                return flow;
        }
 
+       /* Special case for inline crypto egress flows */
+       if (attr->egress && actions[0].type == RTE_FLOW_ACTION_TYPE_SECURITY)
+               goto free_flow;
+
        ret = iavf_flow_process_filter(dev, flow, attr, pattern, actions,
                        &engine, iavf_parse_engine_create, error);
        if (ret < 0) {
@@ -2319,4 +2368,3 @@ iavf_flow_query(struct rte_eth_dev *dev,
        }
        return ret;
 }
-