199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright 2016 6WIND S.A. 399a2dd95SBruce Richardson * Copyright 2016 Mellanox Technologies, Ltd 499a2dd95SBruce Richardson */ 599a2dd95SBruce Richardson 699a2dd95SBruce Richardson #ifndef RTE_FLOW_DRIVER_H_ 799a2dd95SBruce Richardson #define RTE_FLOW_DRIVER_H_ 899a2dd95SBruce Richardson 999a2dd95SBruce Richardson /** 1099a2dd95SBruce Richardson * @file 1199a2dd95SBruce Richardson * RTE generic flow API (driver side) 1299a2dd95SBruce Richardson * 1399a2dd95SBruce Richardson * This file provides implementation helpers for internal use by PMDs, they 1499a2dd95SBruce Richardson * are not intended to be exposed to applications and are not subject to ABI 1599a2dd95SBruce Richardson * versioning. 1699a2dd95SBruce Richardson */ 1799a2dd95SBruce Richardson 1899a2dd95SBruce Richardson #include <stdint.h> 1999a2dd95SBruce Richardson 2099a2dd95SBruce Richardson #include "rte_ethdev.h" 2199a2dd95SBruce Richardson #include "ethdev_driver.h" 2299a2dd95SBruce Richardson #include "rte_flow.h" 2399a2dd95SBruce Richardson 2499a2dd95SBruce Richardson #ifdef __cplusplus 2599a2dd95SBruce Richardson extern "C" { 2699a2dd95SBruce Richardson #endif 2799a2dd95SBruce Richardson 2899a2dd95SBruce Richardson /** 2999a2dd95SBruce Richardson * Generic flow operations structure implemented and returned by PMDs. 3099a2dd95SBruce Richardson * 3199a2dd95SBruce Richardson * These callback functions are not supposed to be used by applications 3299a2dd95SBruce Richardson * directly, which must rely on the API defined in rte_flow.h. 3399a2dd95SBruce Richardson * 3499a2dd95SBruce Richardson * Public-facing wrapper functions perform a few consistency checks so that 3599a2dd95SBruce Richardson * unimplemented (i.e. NULL) callbacks simply return -ENOTSUP. These 3699a2dd95SBruce Richardson * callbacks otherwise only differ by their first argument (with port ID 3799a2dd95SBruce Richardson * already resolved to a pointer to struct rte_eth_dev). 3899a2dd95SBruce Richardson */ 3999a2dd95SBruce Richardson struct rte_flow_ops { 4099a2dd95SBruce Richardson /** See rte_flow_validate(). */ 4199a2dd95SBruce Richardson int (*validate) 4299a2dd95SBruce Richardson (struct rte_eth_dev *, 4399a2dd95SBruce Richardson const struct rte_flow_attr *, 4499a2dd95SBruce Richardson const struct rte_flow_item [], 4599a2dd95SBruce Richardson const struct rte_flow_action [], 4699a2dd95SBruce Richardson struct rte_flow_error *); 4799a2dd95SBruce Richardson /** See rte_flow_create(). */ 4899a2dd95SBruce Richardson struct rte_flow *(*create) 4999a2dd95SBruce Richardson (struct rte_eth_dev *, 5099a2dd95SBruce Richardson const struct rte_flow_attr *, 5199a2dd95SBruce Richardson const struct rte_flow_item [], 5299a2dd95SBruce Richardson const struct rte_flow_action [], 5399a2dd95SBruce Richardson struct rte_flow_error *); 5499a2dd95SBruce Richardson /** See rte_flow_destroy(). */ 5599a2dd95SBruce Richardson int (*destroy) 5699a2dd95SBruce Richardson (struct rte_eth_dev *, 5799a2dd95SBruce Richardson struct rte_flow *, 5899a2dd95SBruce Richardson struct rte_flow_error *); 5999a2dd95SBruce Richardson /** See rte_flow_flush(). */ 6099a2dd95SBruce Richardson int (*flush) 6199a2dd95SBruce Richardson (struct rte_eth_dev *, 6299a2dd95SBruce Richardson struct rte_flow_error *); 6399a2dd95SBruce Richardson /** See rte_flow_query(). */ 6499a2dd95SBruce Richardson int (*query) 6599a2dd95SBruce Richardson (struct rte_eth_dev *, 6699a2dd95SBruce Richardson struct rte_flow *, 6799a2dd95SBruce Richardson const struct rte_flow_action *, 6899a2dd95SBruce Richardson void *, 6999a2dd95SBruce Richardson struct rte_flow_error *); 7099a2dd95SBruce Richardson /** See rte_flow_isolate(). */ 7199a2dd95SBruce Richardson int (*isolate) 7299a2dd95SBruce Richardson (struct rte_eth_dev *, 7399a2dd95SBruce Richardson int, 7499a2dd95SBruce Richardson struct rte_flow_error *); 7599a2dd95SBruce Richardson /** See rte_flow_dev_dump(). */ 7699a2dd95SBruce Richardson int (*dev_dump) 7799a2dd95SBruce Richardson (struct rte_eth_dev *dev, 7899a2dd95SBruce Richardson struct rte_flow *flow, 7999a2dd95SBruce Richardson FILE *file, 8099a2dd95SBruce Richardson struct rte_flow_error *error); 8199a2dd95SBruce Richardson /** See rte_flow_get_aged_flows() */ 8299a2dd95SBruce Richardson int (*get_aged_flows) 8399a2dd95SBruce Richardson (struct rte_eth_dev *dev, 8499a2dd95SBruce Richardson void **context, 8599a2dd95SBruce Richardson uint32_t nb_contexts, 8699a2dd95SBruce Richardson struct rte_flow_error *err); 874b61b877SBing Zhao /** See rte_flow_action_handle_create() */ 884b61b877SBing Zhao struct rte_flow_action_handle *(*action_handle_create) 8999a2dd95SBruce Richardson (struct rte_eth_dev *dev, 904b61b877SBing Zhao const struct rte_flow_indir_action_conf *conf, 9199a2dd95SBruce Richardson const struct rte_flow_action *action, 9299a2dd95SBruce Richardson struct rte_flow_error *error); 934b61b877SBing Zhao /** See rte_flow_action_handle_destroy() */ 944b61b877SBing Zhao int (*action_handle_destroy) 9599a2dd95SBruce Richardson (struct rte_eth_dev *dev, 964b61b877SBing Zhao struct rte_flow_action_handle *handle, 9799a2dd95SBruce Richardson struct rte_flow_error *error); 984b61b877SBing Zhao /** See rte_flow_action_handle_update() */ 994b61b877SBing Zhao int (*action_handle_update) 10099a2dd95SBruce Richardson (struct rte_eth_dev *dev, 1014b61b877SBing Zhao struct rte_flow_action_handle *handle, 1024b61b877SBing Zhao const void *update, 10399a2dd95SBruce Richardson struct rte_flow_error *error); 1044b61b877SBing Zhao /** See rte_flow_action_handle_query() */ 1054b61b877SBing Zhao int (*action_handle_query) 10699a2dd95SBruce Richardson (struct rte_eth_dev *dev, 1074b61b877SBing Zhao const struct rte_flow_action_handle *handle, 10899a2dd95SBruce Richardson void *data, 10999a2dd95SBruce Richardson struct rte_flow_error *error); 11099a2dd95SBruce Richardson /** See rte_flow_tunnel_decap_set() */ 11199a2dd95SBruce Richardson int (*tunnel_decap_set) 11299a2dd95SBruce Richardson (struct rte_eth_dev *dev, 11399a2dd95SBruce Richardson struct rte_flow_tunnel *tunnel, 11499a2dd95SBruce Richardson struct rte_flow_action **pmd_actions, 11599a2dd95SBruce Richardson uint32_t *num_of_actions, 11699a2dd95SBruce Richardson struct rte_flow_error *err); 11799a2dd95SBruce Richardson /** See rte_flow_tunnel_match() */ 11899a2dd95SBruce Richardson int (*tunnel_match) 11999a2dd95SBruce Richardson (struct rte_eth_dev *dev, 12099a2dd95SBruce Richardson struct rte_flow_tunnel *tunnel, 12199a2dd95SBruce Richardson struct rte_flow_item **pmd_items, 12299a2dd95SBruce Richardson uint32_t *num_of_items, 12399a2dd95SBruce Richardson struct rte_flow_error *err); 12499a2dd95SBruce Richardson /** See rte_flow_get_rte_flow_restore_info() */ 12599a2dd95SBruce Richardson int (*get_restore_info) 12699a2dd95SBruce Richardson (struct rte_eth_dev *dev, 12799a2dd95SBruce Richardson struct rte_mbuf *m, 12899a2dd95SBruce Richardson struct rte_flow_restore_info *info, 12999a2dd95SBruce Richardson struct rte_flow_error *err); 13099a2dd95SBruce Richardson /** See rte_flow_action_tunnel_decap_release() */ 13199a2dd95SBruce Richardson int (*tunnel_action_decap_release) 13299a2dd95SBruce Richardson (struct rte_eth_dev *dev, 13399a2dd95SBruce Richardson struct rte_flow_action *pmd_actions, 13499a2dd95SBruce Richardson uint32_t num_of_actions, 13599a2dd95SBruce Richardson struct rte_flow_error *err); 13699a2dd95SBruce Richardson /** See rte_flow_item_release() */ 13799a2dd95SBruce Richardson int (*tunnel_item_release) 13899a2dd95SBruce Richardson (struct rte_eth_dev *dev, 13999a2dd95SBruce Richardson struct rte_flow_item *pmd_items, 14099a2dd95SBruce Richardson uint32_t num_of_items, 14199a2dd95SBruce Richardson struct rte_flow_error *err); 1421179f05cSIvan Malov /** See rte_flow_pick_transfer_proxy() */ 1431179f05cSIvan Malov int (*pick_transfer_proxy) 1441179f05cSIvan Malov (struct rte_eth_dev *dev, 1451179f05cSIvan Malov uint16_t *proxy_port_id, 1461179f05cSIvan Malov struct rte_flow_error *error); 147dc4d860eSViacheslav Ovsiienko struct rte_flow_item_flex_handle *(*flex_item_create) 148dc4d860eSViacheslav Ovsiienko (struct rte_eth_dev *dev, 149dc4d860eSViacheslav Ovsiienko const struct rte_flow_item_flex_conf *conf, 150dc4d860eSViacheslav Ovsiienko struct rte_flow_error *error); 151dc4d860eSViacheslav Ovsiienko int (*flex_item_release) 152dc4d860eSViacheslav Ovsiienko (struct rte_eth_dev *dev, 153dc4d860eSViacheslav Ovsiienko const struct rte_flow_item_flex_handle *handle, 154dc4d860eSViacheslav Ovsiienko struct rte_flow_error *error); 1554ff58b73SAlexander Kozyrev /** See rte_flow_info_get() */ 1564ff58b73SAlexander Kozyrev int (*info_get) 1574ff58b73SAlexander Kozyrev (struct rte_eth_dev *dev, 1584ff58b73SAlexander Kozyrev struct rte_flow_port_info *port_info, 159197e820cSAlexander Kozyrev struct rte_flow_queue_info *queue_info, 1604ff58b73SAlexander Kozyrev struct rte_flow_error *err); 1614ff58b73SAlexander Kozyrev /** See rte_flow_configure() */ 1624ff58b73SAlexander Kozyrev int (*configure) 1634ff58b73SAlexander Kozyrev (struct rte_eth_dev *dev, 1644ff58b73SAlexander Kozyrev const struct rte_flow_port_attr *port_attr, 165197e820cSAlexander Kozyrev uint16_t nb_queue, 166197e820cSAlexander Kozyrev const struct rte_flow_queue_attr *queue_attr[], 1674ff58b73SAlexander Kozyrev struct rte_flow_error *err); 168f076bcfbSAlexander Kozyrev /** See rte_flow_pattern_template_create() */ 169f076bcfbSAlexander Kozyrev struct rte_flow_pattern_template *(*pattern_template_create) 170f076bcfbSAlexander Kozyrev (struct rte_eth_dev *dev, 171f076bcfbSAlexander Kozyrev const struct rte_flow_pattern_template_attr *template_attr, 172f076bcfbSAlexander Kozyrev const struct rte_flow_item pattern[], 173f076bcfbSAlexander Kozyrev struct rte_flow_error *err); 174f076bcfbSAlexander Kozyrev /** See rte_flow_pattern_template_destroy() */ 175f076bcfbSAlexander Kozyrev int (*pattern_template_destroy) 176f076bcfbSAlexander Kozyrev (struct rte_eth_dev *dev, 177f076bcfbSAlexander Kozyrev struct rte_flow_pattern_template *pattern_template, 178f076bcfbSAlexander Kozyrev struct rte_flow_error *err); 179f076bcfbSAlexander Kozyrev /** See rte_flow_actions_template_create() */ 180f076bcfbSAlexander Kozyrev struct rte_flow_actions_template *(*actions_template_create) 181f076bcfbSAlexander Kozyrev (struct rte_eth_dev *dev, 182f076bcfbSAlexander Kozyrev const struct rte_flow_actions_template_attr *template_attr, 183f076bcfbSAlexander Kozyrev const struct rte_flow_action actions[], 184f076bcfbSAlexander Kozyrev const struct rte_flow_action masks[], 185f076bcfbSAlexander Kozyrev struct rte_flow_error *err); 186f076bcfbSAlexander Kozyrev /** See rte_flow_actions_template_destroy() */ 187f076bcfbSAlexander Kozyrev int (*actions_template_destroy) 188f076bcfbSAlexander Kozyrev (struct rte_eth_dev *dev, 189f076bcfbSAlexander Kozyrev struct rte_flow_actions_template *actions_template, 190f076bcfbSAlexander Kozyrev struct rte_flow_error *err); 191f076bcfbSAlexander Kozyrev /** See rte_flow_template_table_create() */ 192f076bcfbSAlexander Kozyrev struct rte_flow_template_table *(*template_table_create) 193f076bcfbSAlexander Kozyrev (struct rte_eth_dev *dev, 194f076bcfbSAlexander Kozyrev const struct rte_flow_template_table_attr *table_attr, 195f076bcfbSAlexander Kozyrev struct rte_flow_pattern_template *pattern_templates[], 196f076bcfbSAlexander Kozyrev uint8_t nb_pattern_templates, 197f076bcfbSAlexander Kozyrev struct rte_flow_actions_template *actions_templates[], 198f076bcfbSAlexander Kozyrev uint8_t nb_actions_templates, 199f076bcfbSAlexander Kozyrev struct rte_flow_error *err); 200f076bcfbSAlexander Kozyrev /** See rte_flow_template_table_destroy() */ 201f076bcfbSAlexander Kozyrev int (*template_table_destroy) 202f076bcfbSAlexander Kozyrev (struct rte_eth_dev *dev, 203f076bcfbSAlexander Kozyrev struct rte_flow_template_table *template_table, 204f076bcfbSAlexander Kozyrev struct rte_flow_error *err); 205197e820cSAlexander Kozyrev /** See rte_flow_async_create() */ 206197e820cSAlexander Kozyrev struct rte_flow *(*async_create) 207197e820cSAlexander Kozyrev (struct rte_eth_dev *dev, 208197e820cSAlexander Kozyrev uint32_t queue_id, 209197e820cSAlexander Kozyrev const struct rte_flow_op_attr *op_attr, 210197e820cSAlexander Kozyrev struct rte_flow_template_table *template_table, 211197e820cSAlexander Kozyrev const struct rte_flow_item pattern[], 212197e820cSAlexander Kozyrev uint8_t pattern_template_index, 213197e820cSAlexander Kozyrev const struct rte_flow_action actions[], 214197e820cSAlexander Kozyrev uint8_t actions_template_index, 215197e820cSAlexander Kozyrev void *user_data, 216197e820cSAlexander Kozyrev struct rte_flow_error *err); 217197e820cSAlexander Kozyrev /** See rte_flow_async_destroy() */ 218197e820cSAlexander Kozyrev int (*async_destroy) 219197e820cSAlexander Kozyrev (struct rte_eth_dev *dev, 220197e820cSAlexander Kozyrev uint32_t queue_id, 221197e820cSAlexander Kozyrev const struct rte_flow_op_attr *op_attr, 222197e820cSAlexander Kozyrev struct rte_flow *flow, 223197e820cSAlexander Kozyrev void *user_data, 224197e820cSAlexander Kozyrev struct rte_flow_error *err); 225197e820cSAlexander Kozyrev /** See rte_flow_push() */ 226197e820cSAlexander Kozyrev int (*push) 227197e820cSAlexander Kozyrev (struct rte_eth_dev *dev, 228197e820cSAlexander Kozyrev uint32_t queue_id, 229197e820cSAlexander Kozyrev struct rte_flow_error *err); 230197e820cSAlexander Kozyrev /** See rte_flow_pull() */ 231197e820cSAlexander Kozyrev int (*pull) 232197e820cSAlexander Kozyrev (struct rte_eth_dev *dev, 233197e820cSAlexander Kozyrev uint32_t queue_id, 234197e820cSAlexander Kozyrev struct rte_flow_op_result res[], 235197e820cSAlexander Kozyrev uint16_t n_res, 236197e820cSAlexander Kozyrev struct rte_flow_error *error); 237*13cd6d5cSAlexander Kozyrev /** See rte_flow_async_action_handle_create() */ 238*13cd6d5cSAlexander Kozyrev struct rte_flow_action_handle *(*async_action_handle_create) 239*13cd6d5cSAlexander Kozyrev (struct rte_eth_dev *dev, 240*13cd6d5cSAlexander Kozyrev uint32_t queue_id, 241*13cd6d5cSAlexander Kozyrev const struct rte_flow_op_attr *op_attr, 242*13cd6d5cSAlexander Kozyrev const struct rte_flow_indir_action_conf *indir_action_conf, 243*13cd6d5cSAlexander Kozyrev const struct rte_flow_action *action, 244*13cd6d5cSAlexander Kozyrev void *user_data, 245*13cd6d5cSAlexander Kozyrev struct rte_flow_error *err); 246*13cd6d5cSAlexander Kozyrev /** See rte_flow_async_action_handle_destroy() */ 247*13cd6d5cSAlexander Kozyrev int (*async_action_handle_destroy) 248*13cd6d5cSAlexander Kozyrev (struct rte_eth_dev *dev, 249*13cd6d5cSAlexander Kozyrev uint32_t queue_id, 250*13cd6d5cSAlexander Kozyrev const struct rte_flow_op_attr *op_attr, 251*13cd6d5cSAlexander Kozyrev struct rte_flow_action_handle *action_handle, 252*13cd6d5cSAlexander Kozyrev void *user_data, 253*13cd6d5cSAlexander Kozyrev struct rte_flow_error *error); 254*13cd6d5cSAlexander Kozyrev /** See rte_flow_async_action_handle_update() */ 255*13cd6d5cSAlexander Kozyrev int (*async_action_handle_update) 256*13cd6d5cSAlexander Kozyrev (struct rte_eth_dev *dev, 257*13cd6d5cSAlexander Kozyrev uint32_t queue_id, 258*13cd6d5cSAlexander Kozyrev const struct rte_flow_op_attr *op_attr, 259*13cd6d5cSAlexander Kozyrev struct rte_flow_action_handle *action_handle, 260*13cd6d5cSAlexander Kozyrev const void *update, 261*13cd6d5cSAlexander Kozyrev void *user_data, 262*13cd6d5cSAlexander Kozyrev struct rte_flow_error *error); 26399a2dd95SBruce Richardson }; 26499a2dd95SBruce Richardson 26599a2dd95SBruce Richardson /** 26699a2dd95SBruce Richardson * Get generic flow operations structure from a port. 26799a2dd95SBruce Richardson * 26899a2dd95SBruce Richardson * @param port_id 26999a2dd95SBruce Richardson * Port identifier to query. 27099a2dd95SBruce Richardson * @param[out] error 27199a2dd95SBruce Richardson * Pointer to flow error structure. 27299a2dd95SBruce Richardson * 27399a2dd95SBruce Richardson * @return 27499a2dd95SBruce Richardson * The flow operations structure associated with port_id, NULL in case of 27599a2dd95SBruce Richardson * error, in which case rte_errno is set and the error structure contains 27699a2dd95SBruce Richardson * additional details. 27799a2dd95SBruce Richardson */ 27899a2dd95SBruce Richardson const struct rte_flow_ops * 27999a2dd95SBruce Richardson rte_flow_ops_get(uint16_t port_id, struct rte_flow_error *error); 28099a2dd95SBruce Richardson 28199a2dd95SBruce Richardson #ifdef __cplusplus 28299a2dd95SBruce Richardson } 28399a2dd95SBruce Richardson #endif 28499a2dd95SBruce Richardson 28599a2dd95SBruce Richardson #endif /* RTE_FLOW_DRIVER_H_ */ 286