1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright 2016 6WIND S.A. 3d30ea906Sjfb8856606 * Copyright 2016 Mellanox Technologies, Ltd 4d30ea906Sjfb8856606 */ 5d30ea906Sjfb8856606 6d30ea906Sjfb8856606 #ifndef RTE_FLOW_DRIVER_H_ 7d30ea906Sjfb8856606 #define RTE_FLOW_DRIVER_H_ 8d30ea906Sjfb8856606 9d30ea906Sjfb8856606 /** 10d30ea906Sjfb8856606 * @file 11d30ea906Sjfb8856606 * RTE generic flow API (driver side) 12d30ea906Sjfb8856606 * 13d30ea906Sjfb8856606 * This file provides implementation helpers for internal use by PMDs, they 14d30ea906Sjfb8856606 * are not intended to be exposed to applications and are not subject to ABI 15d30ea906Sjfb8856606 * versioning. 16d30ea906Sjfb8856606 */ 17d30ea906Sjfb8856606 18d30ea906Sjfb8856606 #include <stdint.h> 19d30ea906Sjfb8856606 20d30ea906Sjfb8856606 #include "rte_ethdev.h" 21*2d9fd380Sjfb8856606 #include "rte_ethdev_driver.h" 22d30ea906Sjfb8856606 #include "rte_flow.h" 23d30ea906Sjfb8856606 24d30ea906Sjfb8856606 #ifdef __cplusplus 25d30ea906Sjfb8856606 extern "C" { 26d30ea906Sjfb8856606 #endif 27d30ea906Sjfb8856606 28d30ea906Sjfb8856606 /** 29d30ea906Sjfb8856606 * Generic flow operations structure implemented and returned by PMDs. 30d30ea906Sjfb8856606 * 31d30ea906Sjfb8856606 * To implement this API, PMDs must handle the RTE_ETH_FILTER_GENERIC filter 32d30ea906Sjfb8856606 * type in their .filter_ctrl callback function (struct eth_dev_ops) as well 33d30ea906Sjfb8856606 * as the RTE_ETH_FILTER_GET filter operation. 34d30ea906Sjfb8856606 * 35d30ea906Sjfb8856606 * If successful, this operation must result in a pointer to a PMD-specific 36d30ea906Sjfb8856606 * struct rte_flow_ops written to the argument address as described below: 37d30ea906Sjfb8856606 * 38d30ea906Sjfb8856606 * \code 39d30ea906Sjfb8856606 * 40d30ea906Sjfb8856606 * // PMD filter_ctrl callback 41d30ea906Sjfb8856606 * 42d30ea906Sjfb8856606 * static const struct rte_flow_ops pmd_flow_ops = { ... }; 43d30ea906Sjfb8856606 * 44d30ea906Sjfb8856606 * switch (filter_type) { 45d30ea906Sjfb8856606 * case RTE_ETH_FILTER_GENERIC: 46d30ea906Sjfb8856606 * if (filter_op != RTE_ETH_FILTER_GET) 47d30ea906Sjfb8856606 * return -EINVAL; 48d30ea906Sjfb8856606 * *(const void **)arg = &pmd_flow_ops; 49d30ea906Sjfb8856606 * return 0; 50d30ea906Sjfb8856606 * } 51d30ea906Sjfb8856606 * 52d30ea906Sjfb8856606 * \endcode 53d30ea906Sjfb8856606 * 54d30ea906Sjfb8856606 * See also rte_flow_ops_get(). 55d30ea906Sjfb8856606 * 56d30ea906Sjfb8856606 * These callback functions are not supposed to be used by applications 57d30ea906Sjfb8856606 * directly, which must rely on the API defined in rte_flow.h. 58d30ea906Sjfb8856606 * 59d30ea906Sjfb8856606 * Public-facing wrapper functions perform a few consistency checks so that 60d30ea906Sjfb8856606 * unimplemented (i.e. NULL) callbacks simply return -ENOTSUP. These 61d30ea906Sjfb8856606 * callbacks otherwise only differ by their first argument (with port ID 62d30ea906Sjfb8856606 * already resolved to a pointer to struct rte_eth_dev). 63d30ea906Sjfb8856606 */ 64d30ea906Sjfb8856606 struct rte_flow_ops { 65d30ea906Sjfb8856606 /** See rte_flow_validate(). */ 66d30ea906Sjfb8856606 int (*validate) 67d30ea906Sjfb8856606 (struct rte_eth_dev *, 68d30ea906Sjfb8856606 const struct rte_flow_attr *, 69d30ea906Sjfb8856606 const struct rte_flow_item [], 70d30ea906Sjfb8856606 const struct rte_flow_action [], 71d30ea906Sjfb8856606 struct rte_flow_error *); 72d30ea906Sjfb8856606 /** See rte_flow_create(). */ 73d30ea906Sjfb8856606 struct rte_flow *(*create) 74d30ea906Sjfb8856606 (struct rte_eth_dev *, 75d30ea906Sjfb8856606 const struct rte_flow_attr *, 76d30ea906Sjfb8856606 const struct rte_flow_item [], 77d30ea906Sjfb8856606 const struct rte_flow_action [], 78d30ea906Sjfb8856606 struct rte_flow_error *); 79d30ea906Sjfb8856606 /** See rte_flow_destroy(). */ 80d30ea906Sjfb8856606 int (*destroy) 81d30ea906Sjfb8856606 (struct rte_eth_dev *, 82d30ea906Sjfb8856606 struct rte_flow *, 83d30ea906Sjfb8856606 struct rte_flow_error *); 84d30ea906Sjfb8856606 /** See rte_flow_flush(). */ 85d30ea906Sjfb8856606 int (*flush) 86d30ea906Sjfb8856606 (struct rte_eth_dev *, 87d30ea906Sjfb8856606 struct rte_flow_error *); 88d30ea906Sjfb8856606 /** See rte_flow_query(). */ 89d30ea906Sjfb8856606 int (*query) 90d30ea906Sjfb8856606 (struct rte_eth_dev *, 91d30ea906Sjfb8856606 struct rte_flow *, 92d30ea906Sjfb8856606 const struct rte_flow_action *, 93d30ea906Sjfb8856606 void *, 94d30ea906Sjfb8856606 struct rte_flow_error *); 95d30ea906Sjfb8856606 /** See rte_flow_isolate(). */ 96d30ea906Sjfb8856606 int (*isolate) 97d30ea906Sjfb8856606 (struct rte_eth_dev *, 98d30ea906Sjfb8856606 int, 99d30ea906Sjfb8856606 struct rte_flow_error *); 100*2d9fd380Sjfb8856606 /** See rte_flow_dev_dump(). */ 101*2d9fd380Sjfb8856606 int (*dev_dump) 102*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 103*2d9fd380Sjfb8856606 FILE *file, 104*2d9fd380Sjfb8856606 struct rte_flow_error *error); 105*2d9fd380Sjfb8856606 /** See rte_flow_get_aged_flows() */ 106*2d9fd380Sjfb8856606 int (*get_aged_flows) 107*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 108*2d9fd380Sjfb8856606 void **context, 109*2d9fd380Sjfb8856606 uint32_t nb_contexts, 110*2d9fd380Sjfb8856606 struct rte_flow_error *err); 111*2d9fd380Sjfb8856606 /** See rte_flow_shared_action_create() */ 112*2d9fd380Sjfb8856606 struct rte_flow_shared_action *(*shared_action_create) 113*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 114*2d9fd380Sjfb8856606 const struct rte_flow_shared_action_conf *conf, 115*2d9fd380Sjfb8856606 const struct rte_flow_action *action, 116*2d9fd380Sjfb8856606 struct rte_flow_error *error); 117*2d9fd380Sjfb8856606 /** See rte_flow_shared_action_destroy() */ 118*2d9fd380Sjfb8856606 int (*shared_action_destroy) 119*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 120*2d9fd380Sjfb8856606 struct rte_flow_shared_action *shared_action, 121*2d9fd380Sjfb8856606 struct rte_flow_error *error); 122*2d9fd380Sjfb8856606 /** See rte_flow_shared_action_update() */ 123*2d9fd380Sjfb8856606 int (*shared_action_update) 124*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 125*2d9fd380Sjfb8856606 struct rte_flow_shared_action *shared_action, 126*2d9fd380Sjfb8856606 const struct rte_flow_action *update, 127*2d9fd380Sjfb8856606 struct rte_flow_error *error); 128*2d9fd380Sjfb8856606 /** See rte_flow_shared_action_query() */ 129*2d9fd380Sjfb8856606 int (*shared_action_query) 130*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 131*2d9fd380Sjfb8856606 const struct rte_flow_shared_action *shared_action, 132*2d9fd380Sjfb8856606 void *data, 133*2d9fd380Sjfb8856606 struct rte_flow_error *error); 134*2d9fd380Sjfb8856606 /** See rte_flow_tunnel_decap_set() */ 135*2d9fd380Sjfb8856606 int (*tunnel_decap_set) 136*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 137*2d9fd380Sjfb8856606 struct rte_flow_tunnel *tunnel, 138*2d9fd380Sjfb8856606 struct rte_flow_action **pmd_actions, 139*2d9fd380Sjfb8856606 uint32_t *num_of_actions, 140*2d9fd380Sjfb8856606 struct rte_flow_error *err); 141*2d9fd380Sjfb8856606 /** See rte_flow_tunnel_match() */ 142*2d9fd380Sjfb8856606 int (*tunnel_match) 143*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 144*2d9fd380Sjfb8856606 struct rte_flow_tunnel *tunnel, 145*2d9fd380Sjfb8856606 struct rte_flow_item **pmd_items, 146*2d9fd380Sjfb8856606 uint32_t *num_of_items, 147*2d9fd380Sjfb8856606 struct rte_flow_error *err); 148*2d9fd380Sjfb8856606 /** See rte_flow_get_rte_flow_restore_info() */ 149*2d9fd380Sjfb8856606 int (*get_restore_info) 150*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 151*2d9fd380Sjfb8856606 struct rte_mbuf *m, 152*2d9fd380Sjfb8856606 struct rte_flow_restore_info *info, 153*2d9fd380Sjfb8856606 struct rte_flow_error *err); 154*2d9fd380Sjfb8856606 /** See rte_flow_action_tunnel_decap_release() */ 155*2d9fd380Sjfb8856606 int (*tunnel_action_decap_release) 156*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 157*2d9fd380Sjfb8856606 struct rte_flow_action *pmd_actions, 158*2d9fd380Sjfb8856606 uint32_t num_of_actions, 159*2d9fd380Sjfb8856606 struct rte_flow_error *err); 160*2d9fd380Sjfb8856606 /** See rte_flow_item_release() */ 161*2d9fd380Sjfb8856606 int (*tunnel_item_release) 162*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, 163*2d9fd380Sjfb8856606 struct rte_flow_item *pmd_items, 164*2d9fd380Sjfb8856606 uint32_t num_of_items, 165*2d9fd380Sjfb8856606 struct rte_flow_error *err); 166d30ea906Sjfb8856606 }; 167d30ea906Sjfb8856606 168d30ea906Sjfb8856606 /** 169d30ea906Sjfb8856606 * Get generic flow operations structure from a port. 170d30ea906Sjfb8856606 * 171d30ea906Sjfb8856606 * @param port_id 172d30ea906Sjfb8856606 * Port identifier to query. 173d30ea906Sjfb8856606 * @param[out] error 174d30ea906Sjfb8856606 * Pointer to flow error structure. 175d30ea906Sjfb8856606 * 176d30ea906Sjfb8856606 * @return 177d30ea906Sjfb8856606 * The flow operations structure associated with port_id, NULL in case of 178d30ea906Sjfb8856606 * error, in which case rte_errno is set and the error structure contains 179d30ea906Sjfb8856606 * additional details. 180d30ea906Sjfb8856606 */ 181d30ea906Sjfb8856606 const struct rte_flow_ops * 182d30ea906Sjfb8856606 rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error); 183d30ea906Sjfb8856606 184d30ea906Sjfb8856606 #ifdef __cplusplus 185d30ea906Sjfb8856606 } 186d30ea906Sjfb8856606 #endif 187d30ea906Sjfb8856606 188d30ea906Sjfb8856606 #endif /* RTE_FLOW_DRIVER_H_ */ 189