rte_flow_ops(3)
β¨ NAME β¨
rte_flow_ops β that's the whole name, bestie, and it's the flow-ops callback struct from section 3 of the Library Functions Manual π«Ά She's a bundle of function pointers, and every single one of them is a door that a PMD can either open or leave shut (spoiler: shut = NULL).
π SYNOPSIS π
#include <rte_flow_driver.h>
π¦ Data Fields π¦
okay so this is the roster π every field is a callback, listed in exactly the order rte_flow_driver.h puts them in, and I'm not editing a single character of them because the compiler does not accept vibes as an argument:
int(* validate )(struct rte_eth_dev *, const struct rte_flow_attr *, const struct rte_flow_item[], const struct rte_flow_action[], struct rte_flow_error *)β the validate callback. Dev, attributes, an array of items, an array of actions, and somewhere to drop an error. She's the one who checks the outfit before you leave the house β¨struct rte_flow *(* create )(struct rte_eth_dev *, const struct rte_flow_attr *, const struct rte_flow_item[], const struct rte_flow_action[], struct rte_flow_error *)β create, and note she hands you back astruct rte_flow *, so this one actually makes something π same five arguments as her sister above.int(* destroy )(struct rte_eth_dev *, struct rte_flow *, struct rte_flow_error *)β destroy, taking the dev, the flow, and the error pointer. cleanup era π§Ήint(* flush )(struct rte_eth_dev *, struct rte_flow_error *)β flush. Just the dev and the error pointer, no flow named. it's giving "all of it, gone" πint(* query )(struct rte_eth_dev *, struct rte_flow *, const struct rte_flow_action *, void *, struct rte_flow_error *)β query: dev, flow, a pointer to the action, avoid *for the answer, and the error pointer. nosy in the best way πint(* isolate )(struct rte_eth_dev *, int, struct rte_flow_error *)β isolate, and her middle argument is a plainint, which is iconic of her honestly. main character in her own little bubble π¦int(* dev_dump )(struct rte_eth_dev *dev, struct rte_flow *flow, FILE *file, struct rte_flow_error *error)β dev_dump, and this is the one that takes an actualFILE *file. she writes things down πint(* get_aged_flows )(struct rte_eth_dev *dev, void **context, uint32_t nb_contexts, struct rte_flow_error *err)β get_aged_flows: dev, avoid **context, a countnb_contexts, anderr. note the parameter is literally namederrhere, noterrorβ yes, that matters, keep it πint(* get_q_aged_flows )(struct rte_eth_dev *dev, uint32_t queue_id, void **contexts, uint32_t nb_contexts, struct rte_flow_error *error)β the queue-flavoured one: dev, aqueue_id,void **contexts(plural this time, obsessed with the consistency),nb_contexts,error.struct rte_flow_action_handle *(* action_handle_create )(struct rte_eth_dev *dev, const struct rte_flow_indir_action_conf *conf, const struct rte_flow_action *action, struct rte_flow_error *error)β action_handle_create, returning astruct rte_flow_action_handle *, taking dev, therte_flow_indir_action_confconf, the action, and error πΈint(* action_handle_destroy )(struct rte_eth_dev *dev, struct rte_flow_action_handle *handle, struct rte_flow_action_handle *handleβ wait, no. Deep breath. It'sint(* action_handle_destroy )(struct rte_eth_dev *dev, struct rte_flow_action_handle *handle, struct rte_flow_error *error)β dev, handle, error. the matching cleanup πint(* action_handle_update )(struct rte_eth_dev *dev, struct rte_flow_action_handle *handle, const void *update, struct rte_flow_error *error)β action_handle_update: dev, handle,const void *update, error β¨int(* action_handle_query )(struct rte_eth_dev *dev, const struct rte_flow_action_handle *handle, void *data, struct rte_flow_error *error)β action_handle_query, and note the handle isconsthere. dev,consthandle,void *data, error π₯int(* action_handle_query_update )(struct rte_eth_dev *dev, struct rte_flow_action_handle *handle, const void *update, void *query, enum rte_flow_query_update_mode qu_mode, struct rte_flow_error *error)β both at once, queen behavior: dev, handle,const void *update,void *query,enum rte_flow_query_update_mode qu_mode, error πstruct rte_flow_action_list_handle *(* action_list_handle_create )(struct rte_eth_dev *dev, const struct rte_flow_indir_action_conf *conf, const struct rte_flow_action actions[], struct rte_flow_error *error)β action_list_handle_create, returns astruct rte_flow_action_list_handle *, takes dev, conf, the actions array, error πint(* action_list_handle_destroy )(struct rte_eth_dev *dev, struct rte_flow_action_list_handle *handle, struct rte_flow_error *error)β action_list_handle_destroy: dev, the list handle, error πint(* tunnel_decap_set )(struct rte_eth_dev *dev, struct rte_flow_tunnel *tunnel, struct rte_flow_action **pmd_actions, uint32_t *num_of_actions, struct rte_flow_error *err)β tunnel_decap_set: dev, tunnel,struct rte_flow_action **pmd_actions,uint32_t *num_of_actions,errβint(* tunnel_match )(struct rte_eth_dev *dev, struct rte_flow_tunnel *tunnel, struct rte_flow_item **pmd_items, uint32_t *num_of_items, struct rte_flow_error *err)β tunnel_match, same shape but for items: dev, tunnel,struct rte_flow_item **pmd_items,uint32_t *num_of_items,errπint(* get_restore_info )(struct rte_eth_dev *dev, struct rte_mbuf *m, struct rte_flow_restore_info *info, struct rte_flow_error *err)β get_restore_info: dev, astruct rte_mbuf *m(yes, a real mbuf),struct rte_flow_restore_info *info,errπint(* tunnel_action_decap_release )(struct rte_eth_dev *dev, struct rte_flow_action *pmd_actions, uint32_t num_of_actions, struct rte_flow_error *err)β tunnel_action_decap_release: dev,struct rte_flow_action *pmd_actions,num_of_actions,errβ and note this one takes a single*, not the**from up above. different girl, different pointer π§int(* tunnel_item_release )(struct rte_eth_dev *dev, struct rte_flow_item *pmd_items, uint32_t num_of_items, struct rte_flow_error *err)β tunnel_item_release: dev,struct rte_flow_item *pmd_items,num_of_items,errπ¦int(* pick_transfer_proxy )(struct rte_eth_dev *dev, uint16_t *proxy_port_id, struct rte_flow_error *error)β pick_transfer_proxy: dev,uint16_t *proxy_port_id, error. she picks πint(* info_get )(struct rte_eth_dev *dev, struct rte_flow_port_info *port_info, struct rte_flow_queue_info *queue_info, struct rte_flow_error *err)β info_get: dev,rte_flow_port_info *port_info,rte_flow_queue_info *queue_info,errβ¨int(* configure )(struct rte_eth_dev *dev, const struct rte_flow_port_attr *port_attr, uint16_t nb_queue, const struct rte_flow_queue_attr *queue_attr[], struct rte_flow_error *err)β configure: dev,const struct rte_flow_port_attr *port_attr, auint16_t nb_queue,const struct rte_flow_queue_attr *queue_attr[],errπΈstruct rte_flow_pattern_template *(* pattern_template_create )(struct rte_eth_dev *dev, const struct rte_flow_pattern_template_attr *template_attr, const struct rte_flow_item pattern[], struct rte_flow_error *err)β pattern_template_create, returns astruct rte_flow_pattern_template *, takes dev,rte_flow_pattern_template_attr *template_attr, thepattern[],errπint(* pattern_template_destroy )(struct rte_eth_dev *dev, struct rte_flow_pattern_template *pattern_template, struct rte_flow_error *err)β pattern_template_destroy: dev, the pattern template,errπstruct rte_flow_actions_template *(* actions_template_create )(struct rte_eth_dev *dev, const struct rte_flow_actions_template_attr *template_attr, const struct rte_flow_action actions[], const struct rte_flow_action masks[], struct rte_flow_error *err)β actions_template_create, returns astruct rte_flow_actions_template *, and look, she takes bothactions[]andmasks[]. dev,template_attr, actions, masks,errπ³int(* actions_template_destroy )(struct rte_eth_dev *dev, struct rte_flow_actions_template *actions_template, struct rte_flow_error *err)β actions_template_destroy: dev, the actions template,errπ₯struct rte_flow_template_table *(* template_table_create )(struct rte_eth_dev *dev, const struct rte_flow_template_table_attr *table_attr, struct rte_flow_pattern_template *pattern_templates[], uint8_t nb_pattern_templates, struct rte_flow_actions_template *actions_templates[], uint8_t nb_actions_templates, struct rte_flow_error *err)β template_table_create, returns astruct rte_flow_template_table *, and she is stacked: dev,table_attr, thepattern_templates[]array,uint8_t nb_pattern_templates, theactions_templates[]array,uint8_t nb_actions_templates,errπint(* template_table_destroy )(struct rte_eth_dev *dev, struct rte_flow_template_table *template_table, struct rte_flow_error *err)β template_table_destroy: dev, the template table,errπint(* group_set_miss_actions )(struct rte_eth_dev *dev, uint32_t group_id, const struct rte_flow_group_attr *attr, const struct rte_flow_action actions[], struct rte_flow_error *err)β group_set_miss_actions: dev, auint32_t group_id,const struct rte_flow_group_attr *attr, theactions[],errπint(* actions_update )(struct rte_eth_dev *dev, struct rte_flow *flow, const struct rte_flow_action actions[], struct rte_flow_error *error)β actions_update, and she goes through a fullstruct rte_flow *flowrather than a handle: dev, flow,actions[],errorβint(* action_list_handle_query_update )(struct rte_eth_dev *dev, const struct rte_flow_action_list_handle *handle, const void **update, void **query, enum rte_flow_query_update_mode mode, struct rte_flow_error *error)β action_list_handle_query_update: dev,const struct rte_flow_action_list_handle *handle,const void **update,void **query,enum rte_flow_query_update_mode mode,error. (the action-list twin of the handle one, and her mode enum param is calledmode, notqu_mode. we respect that.) πint(* flow_calc_table_hash )(struct rte_eth_dev *dev, const struct rte_flow_template_table *table, const struct rte_flow_item pattern[], uint8_t pattern_template_index, uint32_t *hash, struct rte_flow_error *error)β flow_calc_table_hash: dev,const struct rte_flow_template_table *table, thepattern[],uint8_t pattern_template_index,uint32_t *hash,errorπ’int(* flow_calc_encap_hash )(struct rte_eth_dev *dev, const struct rte_flow_item pattern[], enum rte_flow_encap_hash_field dest_field, uint8_t *hash, struct rte_flow_error *error)β flow_calc_encap_hash: dev, thepattern[],enum rte_flow_encap_hash_field dest_field,uint8_t *hash(auint8_t, not theuint32_tabove, don't @ me),errorβ¨int(* flow_template_table_resize )(struct rte_eth_dev *dev, struct rte_flow_template_table *table, uint32_t nb_rules, struct rte_flow_error *error)β flow_template_table_resize: dev, the table, auint32_t nb_rules,errorπint(* flow_update_resized )(struct rte_eth_dev *dev, uint32_t queue, const struct rte_flow_op_attr *attr, struct rte_flow *rule, void *user_data, struct rte_flow_error *error)β flow_update_resized: dev, auint32_t queue,const struct rte_flow_op_attr *attr,struct rte_flow *rule,void *user_data,errorπ¦int(* flow_template_table_resize_complete )(struct rte_eth_dev *dev, struct rte_flow_template_table *table, struct rte_flow_error *error)β flow_template_table_resize_complete, the closer: dev, the table,errorπ
π Detailed Description π
She's the generic flow operations structure β implemented by PMDs and handed back by PMDs. No cap π₯
π¨ okay so the important bit, bestie, listen: these callback functions are not supposed to be used by applications directly. Applications must rely on the API defined in rte_flow.h. Do not call these yourself. That is not the move. π
The public-facing wrapper functions do a few consistency checks along the way, so that unimplemented β i.e. NULL β callbacks simply return -ENOTSUP. So a missing callback isn't a crash, it's just a very polite no π
Otherwise these callbacks only differ by their first argument, and that first argument is the port ID already resolved into a pointer to struct rte_eth_dev π
Definition at line 39 of file rte_flow_driver.h. β
β¨ Field Documentation β¨
okay so rte_flow_ops is basically the plug board β every member is a function pointer that a PMD fills in, and each one is documented by pointing you at its real public function. So every single entry below gets its exact signature, its See / See also pointer, and its Definition at line β¦ receipt. No skips. Not one. π
validate
int (*validate)(struct rte_eth_dev *, const struct rte_flow_attr *, const struct rte_flow_item[], const struct rte_flow_action[], struct rte_flow_error *)
This is the slot that hands you off to the real validation tea. See rte_flow_validate().
Definition at line 41 of file rte_flow_driver.h.
create
struct rte_flow *(*create)(struct rte_eth_dev *, const struct rte_flow_attr *, const struct rte_flow_item[], const struct rte_flow_action[], struct rte_flow_error *)
The one that makes a flow actually exist, and yes it returns the struct rte_flow *. See rte_flow_create().
Definition at line 41 of file rte_flow_driver.h.
destroy
int (*destroy)(struct rte_eth_dev *, struct rte_flow *, struct rte_flow_error *)
Takes a flow and ends it, no drama. See rte_flow_destroy().
Definition at line 55 of file rte_flow_driver.h.
flush
int (*flush)(struct rte_eth_dev *, struct rte_flow_error *)
Everything goes. All of it. See rte_flow_flush().
Definition at line 60 of file rte_flow_driver.h.
query
int (*query)(struct rte_eth_dev *, struct rte_flow *, const struct rte_flow_action *, void *, struct rte_flow_error *)
She's nosy and that's a compliment β it's the peek-at-your-flow hook. See rte_flow_query().
Definition at line 64 of file rte_flow_driver.h.
isolate
int (*isolate)(struct rte_eth_dev *, int, struct rte_flow_error *)
Note that middle arg is just a bare int, iconic. See rte_flow_isolate().
Definition at line 71 of file rte_flow_driver.h.
dev_dump
int (*dev_dump)(struct rte_eth_dev *dev, struct rte_flow *flow, FILE *file, struct rte_flow_error *error)
This one names its params (dev, flow, file, error) and, yes, it takes a FILE *file. See rte_flow_dev_dump().
Definition at line 76 of file rte_flow_driver.h.
get_aged_flows
int (*get_aged_flows)(struct rte_eth_dev *dev, void **context, uint32_t nb_contexts, struct rte_flow_error *err)
The See line here has no trailing period and I am respecting her boundaries. See rte_flow_get_aged_flows()
Definition at line 82 of file rte_flow_driver.h.
get_q_aged_flows
int (*get_q_aged_flows)(struct rte_eth_dev *dev, uint32_t queue_id, void **contexts, uint32_t nb_contexts, struct rte_flow_error *error)
Per-queue version, note queue_id sitting pretty in there. Also no period. See rte_flow_get_q_aged_flows()
Definition at line 88 of file rte_flow_driver.h.
action_handle_create
struct rte_flow_action_handle *(*action_handle_create)(struct rte_eth_dev *dev, const struct rte_flow_indir_action_conf *conf, const struct rte_flow_action *action, struct rte_flow_error *error)
Returns a struct rte_flow_action_handle *, take the conf and the action. No period on the See. See rte_flow_action_handle_create()
Definition at line 88 of file rte_flow_driver.h.
action_handle_destroy
int (*action_handle_destroy)(struct rte_eth_dev *dev, struct rte_flow_action_handle *handle, struct rte_flow_error *error)
Handle in, handle gone. See rte_flow_action_handle_destroy()
Definition at line 101 of file rte_flow_driver.h.
action_handle_update
int (*action_handle_update)(struct rte_eth_dev *dev, struct rte_flow_action_handle *handle, const void *update, struct rte_flow_error *error)
const void *update doing the heavy lifting. See rte_flow_action_handle_update()
Definition at line 106 of file rte_flow_driver.h.
action_handle_query
int (*action_handle_query)(struct rte_eth_dev *dev, const struct rte_flow_action_handle *handle, void *data, struct rte_flow_error *error)
Note the handle is const here, but data is very much writable. See rte_flow_action_handle_query()
Definition at line 112 of file rte_flow_driver.h.
action_handle_query_update
int (*action_handle_query_update)(struct rte_eth_dev *dev, struct rte_flow_action_handle *handle, const void *update, void *query, enum rte_flow_query_update_mode qu_mode, struct rte_flow_error *error)
Yes bestie it does both at once, and yes the mode arg really is spelled qu_mode. See rte_flow_action_handle_query_update()
Definition at line 118 of file rte_flow_driver.h.
action_list_handle_create
struct rte_flow_action_list_handle *(*action_list_handle_create)(struct rte_eth_dev *dev, const struct rte_flow_indir_action_conf *conf, const struct rte_flow_action actions[], struct rte_flow_error *error)
Heads up: this one says See also, not just See.
See also rte_flow_action_list_handle_create()
Definition at line 118 of file rte_flow_driver.h.
action_list_handle_destroy
int (*action_list_handle_destroy)(struct rte_eth_dev *dev, struct rte_flow_action_list_handle *handle, struct rte_flow_error *error)
The whole list handle, yeeted. Also a See also.
See also rte_flow_action_list_handle_destroy()
Definition at line 131 of file rte_flow_driver.h.
tunnel_decap_set
int (*tunnel_decap_set)(struct rte_eth_dev *dev, struct rte_flow_tunnel *tunnel, struct rte_flow_action **pmd_actions, uint32_t *num_of_actions, struct rte_flow_error *err)
Double pointer on pmd_actions, and num_of_actions rides along as a uint32_t *. See rte_flow_tunnel_decap_set()
Definition at line 136 of file rte_flow_driver.h.
tunnel_match
int (*tunnel_match)(struct rte_eth_dev *dev, struct rte_flow_tunnel *tunnel, struct rte_flow_item **pmd_items, uint32_t *num_of_items, struct rte_flow_error *err)
Same shape as the decap one but for items, bestie. See rte_flow_tunnel_match()
Definition at line 143 of file rte_flow_driver.h.
get_restore_info
int (*get_restore_info)(struct rte_eth_dev *dev, struct rte_mbuf *m, struct rte_flow_restore_info *info, struct rte_flow_error *err)
The function it points at has a longer name than the member, which is so her. See rte_flow_get_rte_flow_restore_info()
Definition at line 150 of file rte_flow_driver.h.
tunnel_action_decap_release
int (*tunnel_action_decap_release)(struct rte_eth_dev *dev, struct rte_flow_action *pmd_actions, uint32_t num_of_actions, struct rte_flow_error *err)
Releasing the pair from tunnel_decap_set earlier. See rte_flow_action_tunnel_decap_release()
Definition at line 156 of file rte_flow_driver.h.
tunnel_item_release
int (*tunnel_item_release)(struct rte_eth_dev *dev, struct rte_flow_item *pmd_items, uint32_t num_of_items, struct rte_flow_error *err)
And this one lets go of the pmd_items. See rte_flow_item_release()
Definition at line 162 of file rte_flow_driver.h.
pick_transfer_proxy
int (*pick_transfer_proxy)(struct rte_eth_dev *dev, uint16_t *proxy_port_id, struct rte_flow_error *error)
Hands you back a uint16_t *proxy_port_id. See rte_flow_pick_transfer_proxy()
Definition at line 168 of file rte_flow_driver.h.
info_get
int (*info_get)(struct rte_eth_dev *dev, struct rte_flow_port_info *port_info, struct rte_flow_queue_info *queue_info, struct rte_flow_error *err)
Both port_info and queue_info show up for this one. See rte_flow_info_get()
Definition at line 181 of file rte_flow_driver.h.
configure
int (*configure)(struct rte_eth_dev *dev, const struct rte_flow_port_attr *port_attr, uint16_t nb_queue, const struct rte_flow_queue_attr *queue_attr[], struct rte_flow_error *err)
Look at queue_attr[] β array of pointers, the drama. See rte_flow_configure()
Definition at line 187 of file rte_flow_driver.h.
pattern_template_create
struct rte_flow_pattern_template *(*pattern_template_create)(struct rte_eth_dev *dev, const struct rte_flow_pattern_template_attr *template_attr, const struct rte_flow_item pattern[], struct rte_flow_error *err)
Returns a struct rte_flow_pattern_template *. See rte_flow_pattern_template_create()
Definition at line 187 of file rte_flow_driver.h.
pattern_template_destroy
int (*pattern_template_destroy)(struct rte_eth_dev *dev, struct rte_flow_pattern_template *pattern_template, struct rte_flow_error *err)
See rte_flow_pattern_template_destroy()
Definition at line 200 of file rte_flow_driver.h.
actions_template_create
struct rte_flow_actions_template *(*actions_template_create)(struct rte_eth_dev *dev, const struct rte_flow_actions_template_attr *template_attr, const struct rte_flow_action actions[], const struct rte_flow_action masks[], struct rte_flow_error *err)
Yes bestie, it takes both actions[] and masks[]. See rte_flow_actions_template_create()
Definition at line 200 of file rte_flow_driver.h.
actions_template_destroy
int (*actions_template_destroy)(struct rte_eth_dev *dev, struct rte_flow_actions_template *actions_template, struct rte_flow_error *err)
See rte_flow_actions_template_destroy()
Definition at line 212 of file rte_flow_driver.h.
template_table_create
struct rte_flow_template_table *(*template_table_create)(struct rte_eth_dev *dev, const struct rte_flow_template_table_attr *table_attr, struct rte_flow_pattern_template *pattern_templates[], uint8_t nb_pattern_templates, struct rte_flow_actions_template *actions_templates[], uint8_t nb_actions_templates, struct rte_flow_error *err)
The longest signature on this whole page and honestly? she ate. Note the two uint8_t counters. See rte_flow_template_table_create()
Definition at line 212 of file rte_flow_driver.h.
template_table_destroy
int (*template_table_destroy)(struct rte_eth_dev *dev, struct rte_flow_template_table *template_table, struct rte_flow_error *err)
See rte_flow_template_table_destroy()
Definition at line 226 of file rte_flow_driver.h.
group_set_miss_actions
int (*group_set_miss_actions)(struct rte_eth_dev *dev, uint32_t group_id, const struct rte_flow_group_attr *attr, const struct rte_flow_action actions[], struct rte_flow_error *err)
group_id is a uint32_t, attr is const, actions is not. See rte_flow_group_set_miss_actions()
Definition at line 231 of file rte_flow_driver.h.
actions_update
int (*actions_update)(struct rte_eth_dev *dev, struct rte_flow *flow, const struct rte_flow_action actions[], struct rte_flow_error *error)
This one's See does have a period, and I love that for her. See rte_flow_actions_update().
Definition at line 238 of file rte_flow_driver.h.
action_list_handle_query_update
int (*action_list_handle_query_update)(struct rte_eth_dev *dev, const struct rte_flow_action_list_handle *handle, const void **update, void **query, enum rte_flow_query_update_mode mode, struct rte_flow_error *error)
Double pointers everywhere and the mode arg here is just mode. A See also.
See also rte_flow_action_list_handle_query_update()
Definition at line 244 of file rte_flow_driver.h.
flow_calc_table_hash
int (*flow_calc_table_hash)(struct rte_eth_dev *dev, const struct rte_flow_template_table *table, const struct rte_flow_item pattern[], uint8_t pattern_template_index, uint32_t *hash, struct rte_flow_error *error)
pattern_template_index is a uint8_t, hash is a uint32_t *. A See also.
See also rte_flow_calc_table_hash()
Definition at line 251 of file rte_flow_driver.h.
flow_calc_encap_hash
int (*flow_calc_encap_hash)(struct rte_eth_dev *dev, const struct rte_flow_item pattern[], enum rte_flow_encap_hash_field dest_field, uint8_t *hash, struct rte_flow_error *error)
Note dest_field is the enum rte_flow_encap_hash_field. Another See also.
See also rte_flow_calc_encap_hash()
Definition at line 256 of file rte_flow_driver.h.
flow_template_table_resize
int (*flow_template_table_resize)(struct rte_eth_dev *dev, struct rte_flow_template_table *table, uint32_t nb_rules, struct rte_flow_error *error)
Takes nb_rules as a uint32_t. See also, bestie.
See also rte_flow_template_table_resize()
Definition at line 261 of file rte_flow_driver.h.
flow_update_resized
int (*flow_update_resized)(struct rte_eth_dev *dev, uint32_t queue, const struct rte_flow_op_attr *attr, struct rte_flow *rule, void *user_data, struct rte_flow_error *error)
The referenced function is named async_update_resized while the member is not β she's mysterious like that. See also.
See also rte_flow_async_update_resized()
Definition at line 266 of file rte_flow_driver.h.
flow_template_table_resize_complete
int (*flow_template_table_resize_complete)(struct rte_eth_dev *dev, struct rte_flow_template_table *table, struct rte_flow_error *error)
And she closes the resize arc. See also.
See also rte_flow_template_table_resize_complete()
Definition at line 271 of file rte_flow_driver.h.
π Author π
Generated automatically by Doxygen for DPDK from the source code.
(so no, a human did not handcraft this one β the robot did, and she served anyway π )
that's the whole page bestie, you made it to the end and I'm so proud π«Ά β this was rte_flow_ops(3) from DPDK Version 25.11.3. go hydrate, then go read the actual referenced functions, they've got the real tea β¨
π¦ where this page comes from
- ubuntu resolute: dpdk-doc 25.11.3-0ubuntu0.26.04.1 Β· BSD-3-Clause
- ubuntu stonking: dpdk-doc 25.11.3-1 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms