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