1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2017 Intel Corporation
32bfe3f2eSlogwang  */
42bfe3f2eSlogwang 
52bfe3f2eSlogwang #ifndef _RTE_FLOW_CLASSIFY_H_
62bfe3f2eSlogwang #define _RTE_FLOW_CLASSIFY_H_
72bfe3f2eSlogwang 
82bfe3f2eSlogwang /**
92bfe3f2eSlogwang  * @file
102bfe3f2eSlogwang  *
11*0c6bd470Sfengbojiang  * RTE Flow Classify Library.
122bfe3f2eSlogwang  *
13*0c6bd470Sfengbojiang  * @warning
14*0c6bd470Sfengbojiang  * @b EXPERIMENTAL:
15*0c6bd470Sfengbojiang  * All functions in this file may be changed or removed without prior notice.
162bfe3f2eSlogwang  *
172bfe3f2eSlogwang  * This library provides flow record information with some measured properties.
182bfe3f2eSlogwang  *
192bfe3f2eSlogwang  * Application should define the flow and measurement criteria (action) for it.
202bfe3f2eSlogwang  *
212bfe3f2eSlogwang  * The Library doesn't maintain any flow records itself, instead flow
222bfe3f2eSlogwang  * information is returned to upper layer only for given packets.
232bfe3f2eSlogwang  *
242bfe3f2eSlogwang  * It is application's responsibility to call rte_flow_classifier_query()
252bfe3f2eSlogwang  * for a burst of packets, just after receiving them or before transmitting
262bfe3f2eSlogwang  * them.
272bfe3f2eSlogwang  * Application should provide the flow type interested in, measurement to apply
282bfe3f2eSlogwang  * to that flow in rte_flow_classify_table_entry_add() API, and should provide
292bfe3f2eSlogwang  * the rte_flow_classifier object and storage to put results in for the
302bfe3f2eSlogwang  * rte_flow_classifier_query() API.
312bfe3f2eSlogwang  *
322bfe3f2eSlogwang  *  Usage:
332bfe3f2eSlogwang  *  - application calls rte_flow_classifier_create() to create an
342bfe3f2eSlogwang  *    rte_flow_classifier object.
352bfe3f2eSlogwang  *  - application calls rte_flow_classify_table_create() to create a table
362bfe3f2eSlogwang  *    in the rte_flow_classifier object.
372bfe3f2eSlogwang  *  - application calls rte_flow_classify_table_entry_add() to add a rule to
382bfe3f2eSlogwang  *    the table in the rte_flow_classifier object.
392bfe3f2eSlogwang  *  - application calls rte_flow_classifier_query() in a polling manner,
402bfe3f2eSlogwang  *    preferably after rte_eth_rx_burst(). This will cause the library to
412bfe3f2eSlogwang  *    match packet information to flow information with some measurements.
422bfe3f2eSlogwang  *  - rte_flow_classifier object can be destroyed when it is no longer needed
432bfe3f2eSlogwang  *    with rte_flow_classifier_free()
442bfe3f2eSlogwang  */
452bfe3f2eSlogwang 
46d30ea906Sjfb8856606 #include <rte_compat.h>
472bfe3f2eSlogwang #include <rte_common.h>
482bfe3f2eSlogwang #include <rte_ethdev.h>
492bfe3f2eSlogwang #include <rte_ether.h>
502bfe3f2eSlogwang #include <rte_flow.h>
512bfe3f2eSlogwang #include <rte_acl.h>
522bfe3f2eSlogwang #include <rte_table_acl.h>
532bfe3f2eSlogwang 
542bfe3f2eSlogwang #ifdef __cplusplus
552bfe3f2eSlogwang extern "C" {
562bfe3f2eSlogwang #endif
572bfe3f2eSlogwang 
582bfe3f2eSlogwang extern int librte_flow_classify_logtype;
592bfe3f2eSlogwang 
602bfe3f2eSlogwang #define RTE_FLOW_CLASSIFY_LOG(level, ...) \
612bfe3f2eSlogwang 	rte_log(RTE_LOG_ ## level, \
622bfe3f2eSlogwang 		librte_flow_classify_logtype, \
632bfe3f2eSlogwang 		RTE_FMT("%s(): " RTE_FMT_HEAD(__VA_ARGS__,), \
642bfe3f2eSlogwang 			__func__, \
652bfe3f2eSlogwang 			RTE_FMT_TAIL(__VA_ARGS__,)))
662bfe3f2eSlogwang 
67d30ea906Sjfb8856606 #ifndef RTE_FLOW_CLASSIFY_TABLE_MAX
68d30ea906Sjfb8856606 #define RTE_FLOW_CLASSIFY_TABLE_MAX		32
69d30ea906Sjfb8856606 #endif
70d30ea906Sjfb8856606 
712bfe3f2eSlogwang /** Opaque data type for flow classifier */
722bfe3f2eSlogwang struct rte_flow_classifier;
732bfe3f2eSlogwang 
742bfe3f2eSlogwang /** Opaque data type for flow classify rule */
752bfe3f2eSlogwang struct rte_flow_classify_rule;
762bfe3f2eSlogwang 
772bfe3f2eSlogwang /** Flow classify rule type */
782bfe3f2eSlogwang enum rte_flow_classify_rule_type {
792bfe3f2eSlogwang 	/** no type */
802bfe3f2eSlogwang 	RTE_FLOW_CLASSIFY_RULE_TYPE_NONE,
812bfe3f2eSlogwang 	/** IPv4 5tuple type */
822bfe3f2eSlogwang 	RTE_FLOW_CLASSIFY_RULE_TYPE_IPV4_5TUPLE,
832bfe3f2eSlogwang };
842bfe3f2eSlogwang 
852bfe3f2eSlogwang /** Flow classify table type */
862bfe3f2eSlogwang enum rte_flow_classify_table_type {
87d30ea906Sjfb8856606 	/** No type */
88d30ea906Sjfb8856606 	RTE_FLOW_CLASSIFY_TABLE_TYPE_NONE = 1 << 0,
89d30ea906Sjfb8856606 	/** ACL IP4 5TUPLE */
90d30ea906Sjfb8856606 	RTE_FLOW_CLASSIFY_TABLE_ACL_IP4_5TUPLE = 1 << 1,
91d30ea906Sjfb8856606 	/** ACL VLAN IP4 5TUPLE */
92d30ea906Sjfb8856606 	RTE_FLOW_CLASSIFY_TABLE_ACL_VLAN_IP4_5TUPLE = 1 << 2,
93d30ea906Sjfb8856606 	/** ACL QinQ IP4 5TUPLE */
94d30ea906Sjfb8856606 	RTE_FLOW_CLASSIFY_TABLE_ACL_QINQ_IP4_5TUPLE = 1 << 3,
952bfe3f2eSlogwang 
96d30ea906Sjfb8856606 };
975af785ecSfengbojiang(姜凤波) 
982bfe3f2eSlogwang /** Parameters for flow classifier creation */
992bfe3f2eSlogwang struct rte_flow_classifier_params {
1002bfe3f2eSlogwang 	/** flow classifier name */
1012bfe3f2eSlogwang 	const char *name;
1022bfe3f2eSlogwang 
1032bfe3f2eSlogwang 	/** CPU socket ID where memory for the flow classifier and its */
1042bfe3f2eSlogwang 	/** elements (tables) should be allocated */
1052bfe3f2eSlogwang 	int socket_id;
1062bfe3f2eSlogwang };
1072bfe3f2eSlogwang 
1082bfe3f2eSlogwang /** Parameters for table creation */
1092bfe3f2eSlogwang struct rte_flow_classify_table_params {
1102bfe3f2eSlogwang 	/** Table operations (specific to each table type) */
1112bfe3f2eSlogwang 	struct rte_table_ops *ops;
1122bfe3f2eSlogwang 
1132bfe3f2eSlogwang 	/** Opaque param to be passed to the table create operation */
1142bfe3f2eSlogwang 	void *arg_create;
115d30ea906Sjfb8856606 
116d30ea906Sjfb8856606 	/** Classifier table type */
117d30ea906Sjfb8856606 	enum rte_flow_classify_table_type type;
1182bfe3f2eSlogwang };
1192bfe3f2eSlogwang 
1202bfe3f2eSlogwang /** IPv4 5-tuple data */
1212bfe3f2eSlogwang struct rte_flow_classify_ipv4_5tuple {
1222bfe3f2eSlogwang 	uint32_t dst_ip;         /**< Destination IP address in big endian. */
1232bfe3f2eSlogwang 	uint32_t dst_ip_mask;    /**< Mask of destination IP address. */
1242bfe3f2eSlogwang 	uint32_t src_ip;         /**< Source IP address in big endian. */
1252bfe3f2eSlogwang 	uint32_t src_ip_mask;    /**< Mask of destination IP address. */
1262bfe3f2eSlogwang 	uint16_t dst_port;       /**< Destination port in big endian. */
1272bfe3f2eSlogwang 	uint16_t dst_port_mask;  /**< Mask of destination port. */
1282bfe3f2eSlogwang 	uint16_t src_port;       /**< Source Port in big endian. */
1292bfe3f2eSlogwang 	uint16_t src_port_mask;  /**< Mask of source port. */
1302bfe3f2eSlogwang 	uint8_t proto;           /**< L4 protocol. */
1312bfe3f2eSlogwang 	uint8_t proto_mask;      /**< Mask of L4 protocol. */
1322bfe3f2eSlogwang };
1332bfe3f2eSlogwang 
1342bfe3f2eSlogwang /**
1352bfe3f2eSlogwang  * Flow stats
1362bfe3f2eSlogwang  *
1372bfe3f2eSlogwang  * For the count action, stats can be returned by the query API.
1382bfe3f2eSlogwang  *
1392bfe3f2eSlogwang  * Storage for stats is provided by application.
1402bfe3f2eSlogwang  */
1412bfe3f2eSlogwang struct rte_flow_classify_stats {
1422bfe3f2eSlogwang 	void *stats;
1432bfe3f2eSlogwang };
1442bfe3f2eSlogwang 
1452bfe3f2eSlogwang struct rte_flow_classify_ipv4_5tuple_stats {
1462bfe3f2eSlogwang 	/** count of packets that match IPv4 5tuple pattern */
1472bfe3f2eSlogwang 	uint64_t counter1;
1482bfe3f2eSlogwang 	/** IPv4 5tuple data */
1492bfe3f2eSlogwang 	struct rte_flow_classify_ipv4_5tuple ipv4_5tuple;
1502bfe3f2eSlogwang };
1512bfe3f2eSlogwang 
1522bfe3f2eSlogwang /**
1532bfe3f2eSlogwang  * Flow classifier create
1542bfe3f2eSlogwang  *
1552bfe3f2eSlogwang  * @param params
1562bfe3f2eSlogwang  *   Parameters for flow classifier creation
1572bfe3f2eSlogwang  * @return
1582bfe3f2eSlogwang  *   Handle to flow classifier instance on success or NULL otherwise
1592bfe3f2eSlogwang  */
1604418919fSjohnjiang __rte_experimental
1614418919fSjohnjiang struct rte_flow_classifier *
1622bfe3f2eSlogwang rte_flow_classifier_create(struct rte_flow_classifier_params *params);
1632bfe3f2eSlogwang 
1642bfe3f2eSlogwang /**
1652bfe3f2eSlogwang  * Flow classifier free
1662bfe3f2eSlogwang  *
1672bfe3f2eSlogwang  * @param cls
1682bfe3f2eSlogwang  *   Handle to flow classifier instance
1692bfe3f2eSlogwang  * @return
1702bfe3f2eSlogwang  *   0 on success, error code otherwise
1712bfe3f2eSlogwang  */
1724418919fSjohnjiang __rte_experimental
1734418919fSjohnjiang int
1742bfe3f2eSlogwang rte_flow_classifier_free(struct rte_flow_classifier *cls);
1752bfe3f2eSlogwang 
1762bfe3f2eSlogwang /**
1772bfe3f2eSlogwang  * Flow classify table create
1782bfe3f2eSlogwang  *
1792bfe3f2eSlogwang  * @param cls
1802bfe3f2eSlogwang  *   Handle to flow classifier instance
1812bfe3f2eSlogwang  * @param params
1822bfe3f2eSlogwang  *   Parameters for flow_classify table creation
1832bfe3f2eSlogwang  * @return
1842bfe3f2eSlogwang  *   0 on success, error code otherwise
1852bfe3f2eSlogwang  */
1864418919fSjohnjiang __rte_experimental
1874418919fSjohnjiang int
1882bfe3f2eSlogwang rte_flow_classify_table_create(struct rte_flow_classifier *cls,
189d30ea906Sjfb8856606 		struct rte_flow_classify_table_params *params);
1902bfe3f2eSlogwang 
1912bfe3f2eSlogwang /**
192d30ea906Sjfb8856606  * Flow classify validate
19328440c50Sjfb8856606  *
194d30ea906Sjfb8856606  * @param cls
195d30ea906Sjfb8856606  *   Handle to flow classifier instance
19628440c50Sjfb8856606  * @param[in] attr
19728440c50Sjfb8856606  *   Flow rule attributes
19828440c50Sjfb8856606  * @param[in] pattern
19928440c50Sjfb8856606  *   Pattern specification (list terminated by the END pattern item).
20028440c50Sjfb8856606  * @param[in] actions
20128440c50Sjfb8856606  *   Associated actions (list terminated by the END pattern item).
20228440c50Sjfb8856606  * @param[out] error
20328440c50Sjfb8856606  *   Perform verbose error reporting if not NULL. Structure
20428440c50Sjfb8856606  *   initialised in case of error only.
20528440c50Sjfb8856606  * @return
206d30ea906Sjfb8856606  *   0 on success, error code otherwise
20728440c50Sjfb8856606  */
2084418919fSjohnjiang __rte_experimental
2094418919fSjohnjiang int
210d30ea906Sjfb8856606 rte_flow_classify_validate(struct rte_flow_classifier *cls,
21128440c50Sjfb8856606 		const struct rte_flow_attr *attr,
21228440c50Sjfb8856606 		const struct rte_flow_item pattern[],
21328440c50Sjfb8856606 		const struct rte_flow_action actions[],
21428440c50Sjfb8856606 		struct rte_flow_error *error);
21528440c50Sjfb8856606 
21628440c50Sjfb8856606 /**
2171646932aSjfb8856606  * Add a flow classify rule to the flow_classifier table.
218d30ea906Sjfb8856606  *
219d30ea906Sjfb8856606  * @param[in] cls
220d30ea906Sjfb8856606  *   Flow classifier handle
221d30ea906Sjfb8856606  * @param[in] attr
222d30ea906Sjfb8856606  *   Flow rule attributes
223d30ea906Sjfb8856606  * @param[in] pattern
224d30ea906Sjfb8856606  *   Pattern specification (list terminated by the END pattern item).
225d30ea906Sjfb8856606  * @param[in] actions
226d30ea906Sjfb8856606  *   Associated actions (list terminated by the END pattern item).
227d30ea906Sjfb8856606  * @param[out] key_found
228d30ea906Sjfb8856606  *  returns 1 if rule present already, 0 otherwise.
229d30ea906Sjfb8856606  * @param[out] error
230d30ea906Sjfb8856606  *   Perform verbose error reporting if not NULL. Structure
231d30ea906Sjfb8856606  *   initialised in case of error only.
232d30ea906Sjfb8856606  * @return
233d30ea906Sjfb8856606  *   A valid handle in case of success, NULL otherwise.
234d30ea906Sjfb8856606  */
2354418919fSjohnjiang __rte_experimental
2364418919fSjohnjiang struct rte_flow_classify_rule *
237d30ea906Sjfb8856606 rte_flow_classify_table_entry_add(struct rte_flow_classifier *cls,
238d30ea906Sjfb8856606 		const struct rte_flow_attr *attr,
239d30ea906Sjfb8856606 		const struct rte_flow_item pattern[],
240d30ea906Sjfb8856606 		const struct rte_flow_action actions[],
241d30ea906Sjfb8856606 		int *key_found,
242d30ea906Sjfb8856606 		struct rte_flow_error *error);
243d30ea906Sjfb8856606 
244d30ea906Sjfb8856606 /**
2451646932aSjfb8856606  * Delete a flow classify rule from the flow_classifier table.
2462bfe3f2eSlogwang  *
2472bfe3f2eSlogwang  * @param[in] cls
2482bfe3f2eSlogwang  *   Flow classifier handle
2492bfe3f2eSlogwang  * @param[in] rule
2502bfe3f2eSlogwang  *   Flow classify rule
2512bfe3f2eSlogwang  * @return
2522bfe3f2eSlogwang  *   0 on success, error code otherwise.
2532bfe3f2eSlogwang  */
2544418919fSjohnjiang __rte_experimental
2554418919fSjohnjiang int
2562bfe3f2eSlogwang rte_flow_classify_table_entry_delete(struct rte_flow_classifier *cls,
2572bfe3f2eSlogwang 		struct rte_flow_classify_rule *rule);
2582bfe3f2eSlogwang 
2592bfe3f2eSlogwang /**
2602bfe3f2eSlogwang  * Query flow classifier for given rule.
2612bfe3f2eSlogwang  *
2622bfe3f2eSlogwang  * @param[in] cls
2632bfe3f2eSlogwang  *   Flow classifier handle
2642bfe3f2eSlogwang  * @param[in] pkts
2652bfe3f2eSlogwang  *   Pointer to packets to process
2662bfe3f2eSlogwang  * @param[in] nb_pkts
2672bfe3f2eSlogwang  *   Number of packets to process
2682bfe3f2eSlogwang  * @param[in] rule
2692bfe3f2eSlogwang  *   Flow classify rule
2702bfe3f2eSlogwang  * @param[in] stats
2712bfe3f2eSlogwang  *   Flow classify stats
2722bfe3f2eSlogwang  *
2732bfe3f2eSlogwang  * @return
2742bfe3f2eSlogwang  *   0 on success, error code otherwise.
2752bfe3f2eSlogwang  */
2764418919fSjohnjiang __rte_experimental
2774418919fSjohnjiang int
2782bfe3f2eSlogwang rte_flow_classifier_query(struct rte_flow_classifier *cls,
2792bfe3f2eSlogwang 		struct rte_mbuf **pkts,
2802bfe3f2eSlogwang 		const uint16_t nb_pkts,
2812bfe3f2eSlogwang 		struct rte_flow_classify_rule *rule,
2822bfe3f2eSlogwang 		struct rte_flow_classify_stats *stats);
2832bfe3f2eSlogwang 
2842bfe3f2eSlogwang #ifdef __cplusplus
2852bfe3f2eSlogwang }
2862bfe3f2eSlogwang #endif
2872bfe3f2eSlogwang 
2882bfe3f2eSlogwang #endif /* _RTE_FLOW_CLASSIFY_H_ */
289