1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Intel Corporation
4 #ifndef __INCLUDE_RTE_SWX_PIPELINE_H__
5 #define __INCLUDE_RTE_SWX_PIPELINE_H__
20 #include <rte_compat.h>
22 #include "rte_swx_port.h"
23 #include "rte_swx_table.h"
24 #include "rte_swx_extern.h"
27 #ifndef RTE_SWX_NAME_SIZE
28 #define RTE_SWX_NAME_SIZE 64
31 /** Instruction size. */
32 #ifndef RTE_SWX_INSTRUCTION_SIZE
33 #define RTE_SWX_INSTRUCTION_SIZE 256
36 /** Instruction tokens. */
37 #ifndef RTE_SWX_INSTRUCTION_TOKENS_MAX
38 #define RTE_SWX_INSTRUCTION_TOKENS_MAX 16
42 * Pipeline setup and operation
45 /** Pipeline opaque data structure. */
46 struct rte_swx_pipeline;
52 * Pipeline handle. Must point to valid memory. Contains valid pipeline handle
53 * when the function returns successfully.
54 * @param[in] numa_node
55 * Non-Uniform Memory Access (NUMA) node.
57 * 0 on success or the following error codes otherwise:
58 * -EINVAL: Invalid argument;
59 * -ENOMEM: Not enough space/cannot allocate memory.
63 rte_swx_pipeline_config(struct rte_swx_pipeline **p,
67 * Pipeline input ports
71 * Pipeline input port type register
76 * Input port type name.
78 * Input port type operations.
80 * 0 on success or the following error codes otherwise:
81 * -EINVAL: Invalid argument;
82 * -ENOMEM: Not enough space/cannot allocate memory;
83 * -EEXIST: Input port type with this name already exists.
87 rte_swx_pipeline_port_in_type_register(struct rte_swx_pipeline *p,
89 struct rte_swx_port_in_ops *ops);
92 * Pipeline input port configure
98 * @param[in] port_type_name
99 * Existing input port type name.
101 * Input port creation arguments.
103 * 0 on success or the following error codes otherwise:
104 * -EINVAL: Invalid argument;
105 * -ENOMEM: Not enough space/cannot allocate memory;
106 * -ENODEV: Input port object creation error.
110 rte_swx_pipeline_port_in_config(struct rte_swx_pipeline *p,
112 const char *port_type_name,
116 * Pipeline output ports
120 * Pipeline output port type register
125 * Output port type name.
127 * Output port type operations.
129 * 0 on success or the following error codes otherwise:
130 * -EINVAL: Invalid argument;
131 * -ENOMEM: Not enough space/cannot allocate memory;
132 * -EEXIST: Output port type with this name already exists.
136 rte_swx_pipeline_port_out_type_register(struct rte_swx_pipeline *p,
138 struct rte_swx_port_out_ops *ops);
141 * Pipeline output port configure
147 * @param[in] port_type_name
148 * Existing output port type name.
150 * Output port creation arguments.
152 * 0 on success or the following error codes otherwise:
153 * -EINVAL: Invalid argument;
154 * -ENOMEM: Not enough space/cannot allocate memory;
155 * -ENODEV: Output port object creation error.
159 rte_swx_pipeline_port_out_config(struct rte_swx_pipeline *p,
161 const char *port_type_name,
165 * Extern objects and functions
169 * Pipeline extern type register
175 * @param[in] mailbox_struct_type_name
176 * Name of existing struct type used to define the mailbox size and layout for
177 * the extern objects that are instances of this type. Each extern object gets
178 * its own mailbox, which is used to pass the input arguments to the member
179 * functions and retrieve the output results.
180 * @param[in] constructor
181 * Function used to create the extern objects that are instances of this type.
182 * @param[in] destructor
183 * Function used to free the extern objects that are instances of this type.
185 * 0 on success or the following error codes otherwise:
186 * -EINVAL: Invalid argument;
187 * -ENOMEM: Not enough space/cannot allocate memory;
188 * -EEXIST: Extern type with this name already exists.
192 rte_swx_pipeline_extern_type_register(struct rte_swx_pipeline *p,
194 const char *mailbox_struct_type_name,
195 rte_swx_extern_type_constructor_t constructor,
196 rte_swx_extern_type_destructor_t destructor);
199 * Pipeline extern type member function register
203 * @param[in] extern_type_name
204 * Existing extern type name.
206 * Name for the new member function to be added to the extern type.
207 * @param[in] member_func
208 * The new member function.
210 * 0 on success or the following error codes otherwise:
211 * -EINVAL: Invalid argument;
212 * -ENOMEM: Not enough space/cannot allocate memory;
213 * -EEXIST: Member function with this name already exists for this type;
214 * -ENOSPC: Maximum number of member functions reached for this type.
218 rte_swx_pipeline_extern_type_member_func_register(struct rte_swx_pipeline *p,
219 const char *extern_type_name,
221 rte_swx_extern_type_member_func_t member_func);
224 * Pipeline extern object configure
226 * Instantiate a given extern type to create new extern object.
230 * @param[in] extern_type_name
231 * Existing extern type name.
233 * Name for the new object instantiating the extern type.
235 * Extern object constructor arguments.
237 * 0 on success or the following error codes otherwise:
238 * -EINVAL: Invalid argument;
239 * -ENOMEM: Not enough space/cannot allocate memory;
240 * -EEXIST: Extern object with this name already exists;
241 * -ENODEV: Extern object constructor error.
245 rte_swx_pipeline_extern_object_config(struct rte_swx_pipeline *p,
246 const char *extern_type_name,
251 * Pipeline extern function register
256 * Extern function name.
257 * @param[in] mailbox_struct_type_name
258 * Name of existing struct type used to define the mailbox size and layout for
259 * this extern function. The mailbox is used to pass the input arguments to
260 * the extern function and retrieve the output results.
262 * The extern function.
264 * 0 on success or the following error codes otherwise:
265 * -EINVAL: Invalid argument;
266 * -ENOMEM: Not enough space/cannot allocate memory;
267 * -EEXIST: Extern function with this name already exists.
271 rte_swx_pipeline_extern_func_register(struct rte_swx_pipeline *p,
273 const char *mailbox_struct_type_name,
274 rte_swx_extern_func_t func);
277 * Packet headers and meta-data
280 /** Structure (struct) field. */
281 struct rte_swx_field_params {
282 /** Struct field name. */
285 /** Struct field size (in bits).
286 * Restriction: All struct fields must be a multiple of 8 bits.
287 * Restriction: All struct fields must be no greater than 64 bits.
293 * Pipeline struct type register
295 * Structs are used extensively in many part of the pipeline to define the size
296 * and layout of a specific memory piece such as: headers, meta-data, action
297 * data stored in a table entry, mailboxes for extern objects and functions.
298 * Similar to C language structs, they are a well defined sequence of fields,
299 * with each field having a unique name and a constant size.
301 * In order to use structs to express variable size packet headers such as IPv4
302 * with options, it is allowed for the last field of the struct type to have a
303 * variable size between 0 and *n_bits* bits, with the actual size of this field
304 * determined at run-time for each packet. This struct feature is restricted to
305 * just a few selected instructions that deal with packet headers, so a typical
306 * struct generally has a constant size that is fully known when its struct type
314 * The sequence of struct fields.
315 * @param[in] n_fields
316 * The number of struct fields.
317 * @param[in] last_field_has_variable_size
318 * If non-zero (true), then the last field has a variable size between 0 and
319 * *n_bits* bits, with its actual size determined at run-time for each packet.
320 * If zero (false), then the last field has a constant size of *n_bits* bits.
322 * 0 on success or the following error codes otherwise:
323 * -EINVAL: Invalid argument;
324 * -ENOMEM: Not enough space/cannot allocate memory;
325 * -EEXIST: Struct type with this name already exists.
329 rte_swx_pipeline_struct_type_register(struct rte_swx_pipeline *p,
331 struct rte_swx_field_params *fields,
333 int last_field_has_variable_size);
336 * Pipeline packet header register
342 * @param[in] struct_type_name
343 * The struct type instantiated by this packet header.
345 * 0 on success or the following error codes otherwise:
346 * -EINVAL: Invalid argument;
347 * -ENOMEM: Not enough space/cannot allocate memory;
348 * -EEXIST: Header with this name already exists;
349 * -ENOSPC: Maximum number of headers reached for the pipeline.
353 rte_swx_pipeline_packet_header_register(struct rte_swx_pipeline *p,
355 const char *struct_type_name);
358 * Pipeline packet meta-data register
362 * @param[in] struct_type_name
363 * The struct type instantiated by the packet meta-data.
365 * 0 on success or the following error codes otherwise:
366 * -EINVAL: Invalid argument.
370 rte_swx_pipeline_packet_metadata_register(struct rte_swx_pipeline *p,
371 const char *struct_type_name);
378 * Instruction operands:
380 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
381 *<pre>| | Description | Format | DST | SRC |</pre>
382 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
383 *<pre>| hdr | Header | h.header | | |</pre>
384 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
385 *<pre>| act | Action | ACTION | | |</pre>
386 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
387 *<pre>| tbl | Table | TABLE | | |</pre>
388 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
389 *<pre>| H | Header field | h.header.field | YES | YES |</pre>
390 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
391 *<pre>| M | Meta-data field | m.field | YES | YES |</pre>
392 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
393 *<pre>| E | Extern obj mailbox field | e.ext_obj.field | YES | YES |</pre>
394 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
395 *<pre>| F | Extern func mailbox field | f.ext_func.field | YES | YES |</pre>
396 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
397 *<pre>| T | Table action data field | t.header.field | NO | YES |</pre>
398 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
399 *<pre>| I | Immediate value (64-bit) | h.header.field | NO | YES |</pre>
400 *<pre>+-----+---------------------------+------------------+-----+-----+</pre>
404 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
405 *<pre>| Instr. | Instruction | Instruction | 1st | 2nd |</pre>
406 *<pre>| Name | Description | Format | opnd.| opnd. |</pre>
407 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
408 *<pre>| rx | Receive one pkt | rx m.port_in | M | |</pre>
409 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
410 *<pre>| tx | Transmit one pkt | tx m.port_out | M | |</pre>
411 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
412 *<pre>| extract | Extract one hdr | extract h.hdr | hdr | |</pre>
413 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
414 *<pre>| emit | Emit one hdr | emit h.hdr | hdr | |</pre>
415 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
416 *<pre>| validate | Validate one hdr | validate h.hdr | hdr | |</pre>
417 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
418 *<pre>| invalidate | Invalidate one hdr | invalidate h.hdr | hdr | |</pre>
419 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
420 *<pre>| mov | dst = src | mov dst src | HMEF | HMEFTI |</pre>
421 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
422 *<pre>| add | dst += src | add dst src | HMEF | HMEFTI |</pre>
423 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
424 *<pre>| sub | dst -= src | add dst src | HMEF | HMEFTI |</pre>
425 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
426 *<pre>| ckadd | Checksum add: dst = | add dst src | HMEF | HMEFTI |</pre>
427 *<pre>| | dst '+ src[0:1] '+ | | | or hdr |</pre>
428 *<pre>| | src[2:3] '+ ... | | | |</pre>
429 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
430 *<pre>| cksub | Checksum subtract: | add dst src | HMEF | HMEFTI |</pre>
431 *<pre>| | dst = dst '- src | | | |</pre>
432 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
433 *<pre>| and | dst &= src | and dst src | HMEF | HMEFTI |</pre>
434 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
435 *<pre>| or | dst |= src | or dst src | HMEF | HMEFTI |</pre>
436 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
437 *<pre>| xor | dst ^= src | xor dst src | HMEF | HMEFTI |</pre>
438 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
439 *<pre>| shl | dst <<= src | shl dst src | HMEF | HMEFTI |</pre>
440 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
441 *<pre>| shr | dst >>= src | shr dst src | HMEF | HMEFTI |</pre>
442 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
443 *<pre>| table | Table lookup | table TABLE | tbl | |</pre>
444 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
445 *<pre>| extern | Ext obj member func | extern e.obj.mfunc| ext | |</pre>
446 *<pre>| | call or ext func call| extern f.func | | |</pre>
447 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
448 *<pre>| jmp | Unconditional jump | jmp LABEL | | |</pre>
449 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
450 *<pre>| jmpv | Jump if hdr is valid | jmpv LABEL h.hdr | hdr | |</pre>
451 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
452 *<pre>| jmpnv | Jump if hdr is inval | jmpnv LABEL h.hdr | hdr | |</pre>
453 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
454 *<pre>| jmph | Jump if tbl lkp hit | jmph LABEL | | |</pre>
455 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
456 *<pre>| jmpnh | Jump if tbl lkp miss | jmpnh LABEL | | |</pre>
457 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
458 *<pre>| jmpa | Jump if action run | jmpa LABEL ACTION | act | |</pre>
459 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
460 *<pre>| jmpna | Jump if act not run | jmpna LABEL ACTION| act | |</pre>
461 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
462 *<pre>| jmpeq | Jump if (a == b) | jmpeq LABEL a b | HMEFT| HMEFTI |</pre>
463 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
464 *<pre>| jmpneq | Jump if (a != b) | jmpneq LABEL a b | HMEFT| HMEFTI |</pre>
465 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
466 *<pre>| jmplt | Jump if (a < b) | jmplt LABEL a b | HMEFT| HMEFTI |</pre>
467 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
468 *<pre>| jmpgt | Jump if (a > b) | jmpgt LABEL a b | HMEFT| HMEFTI |</pre>
469 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
470 *<pre>| return | Return from action | return | | |</pre>
471 *<pre>+------------+----------------------+-------------------+------+--------+</pre>
473 * At initialization time, the pipeline and action instructions (including the
474 * symbolic name operands) are translated to internal data structures that are
483 * Pipeline action configure
489 * @param[in] args_struct_type_name
490 * The struct type instantiated by the action data. The action data represent
491 * the action arguments that are stored in the table entry together with the
492 * action ID. Set to NULL when the action does not have any arguments.
493 * @param[in] instructions
494 * Action instructions.
495 * @param[in] n_instructions
496 * Number of action instructions.
498 * 0 on success or the following error codes otherwise:
499 * -EINVAL: Invalid argument;
500 * -ENOMEM: Not enough space/cannot allocate memory;
501 * -EEXIST: Action with this name already exists.
505 rte_swx_pipeline_action_config(struct rte_swx_pipeline *p,
507 const char *args_struct_type_name,
508 const char **instructions,
509 uint32_t n_instructions);
516 * Pipeline table type register
522 * @param[in] match_type
523 * Match type implemented by the new table type.
525 * Table type operations.
527 * 0 on success or the following error codes otherwise:
528 * -EINVAL: Invalid argument;
529 * -ENOMEM: Not enough space/cannot allocate memory;
530 * -EEXIST: Table type with this name already exists.
534 rte_swx_pipeline_table_type_register(struct rte_swx_pipeline *p,
536 enum rte_swx_table_match_type match_type,
537 struct rte_swx_table_ops *ops);
539 /** Match field parameters. */
540 struct rte_swx_match_field_params {
541 /** Match field name. Must be either a field of one of the registered
542 * packet headers ("h.header.field") or a field of the registered
543 * meta-data ("m.field").
547 /** Match type of the field. */
548 enum rte_swx_table_match_type match_type;
551 /** Pipeline table parameters. */
552 struct rte_swx_pipeline_table_params {
553 /** The set of match fields for the current table.
554 * Restriction: All the match fields of the current table need to be
555 * part of the same struct, i.e. either all the match fields are part of
556 * the same header or all the match fields are part of the meta-data.
558 struct rte_swx_match_field_params *fields;
560 /** The number of match fields for the current table. If set to zero, no
561 * "regular" entries (i.e. entries other than the default entry) can be
562 * added to the current table and the match process always results in
567 /** The set of actions for the current table. */
568 const char **action_names;
570 /** Array of *n_actions* flags. For each action, the associated flag
571 * indicates whether the action can be assigned to regular table entries
572 * (when non-zero, i.e. true) or not (when zero, i.e. false). When set
573 * to NULL, it defaults to true for all actions.
575 int *action_is_for_table_entries;
577 /** Array of *n_actions* flags. For each action, the associated flag
578 * indicates whether the action can be assigned to the default table
579 * entry (when non-zero, i.e. true) or not (when zero, i.e. false).
580 * When set to NULL, it defaults to true for all actions.
582 int *action_is_for_default_entry;
584 /** The number of actions for the current table. Must be at least one.
588 /** The default table action that gets executed on lookup miss. Must be
589 * one of the table actions included in the *action_names*.
591 const char *default_action_name;
593 /** Default action data. The size of this array is the action data size
594 * of the default action. Must be NULL if the default action data size
597 uint8_t *default_action_data;
599 /** If non-zero (true), then the default action of the current table
600 * cannot be changed. If zero (false), then the default action can be
601 * changed in the future with another action from the *action_names*
604 int default_action_is_const;
608 * Pipeline table configure
616 * @param[in] recommended_table_type_name
617 * Recommended table type. Typically set to NULL. Useful as guidance when
618 * there are multiple table types registered for the match type of the table,
619 * as determined from the table match fields specification. Silently ignored
620 * if the recommended table type does not exist or it serves a different match
623 * Table creation arguments.
625 * Guideline on maximum number of table entries.
627 * 0 on success or the following error codes otherwise:
628 * -EINVAL: Invalid argument;
629 * -ENOMEM: Not enough space/cannot allocate memory;
630 * -EEXIST: Table with this name already exists;
631 * -ENODEV: Table creation error.
635 rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
637 struct rte_swx_pipeline_table_params *params,
638 const char *recommended_table_type_name,
642 /** Pipeline selector table parameters. */
643 struct rte_swx_pipeline_selector_params {
644 /** The group ID field. Input into the selection operation.
645 * Restriction: This field must be a meta-data field.
647 const char *group_id_field_name;
649 /** The set of fields used to select (through a hashing scheme) the
650 * member within the current group. Inputs into the seletion operation.
651 * Restriction: All the selector fields must be part of the same struct,
652 * i.e. part of the same header or part of the meta-data structure.
654 const char **selector_field_names;
656 /** The number of selector fields. Must be non-zero. */
657 uint32_t n_selector_fields;
659 /** The member ID field. Output from the selection operation.
660 * Restriction: This field must be a meta-data field.
662 const char *member_id_field_name;
664 /** Maximum number of groups. Must be non-zero. */
665 uint32_t n_groups_max;
667 /** Maximum number of members per group. Must be non-zero. */
668 uint32_t n_members_per_group_max;
672 * Pipeline selector table configure
677 * Selector table name.
679 * Selector table parameters.
681 * 0 on success or the following error codes otherwise:
682 * -EINVAL: Invalid argument;
683 * -ENOMEM: Not enough space/cannot allocate memory;
684 * -EEXIST: Selector table with this name already exists;
685 * -ENODEV: Selector table creation error.
689 rte_swx_pipeline_selector_config(struct rte_swx_pipeline *p,
691 struct rte_swx_pipeline_selector_params *params);
693 /** Pipeline learner table parameters. */
694 struct rte_swx_pipeline_learner_params {
695 /** The set of match fields for the current table.
696 * Restriction: All the match fields of the current table need to be
697 * part of the same struct, i.e. either all the match fields are part of
698 * the same header or all the match fields are part of the meta-data.
700 const char **field_names;
702 /** The number of match fields for the current table. Must be non-zero.
706 /** The set of actions for the current table. */
707 const char **action_names;
709 /** Array of *n_actions* flags. For each action, the associated flag
710 * indicates whether the action can be assigned to regular table entries
711 * (when non-zero, i.e. true) or not (when zero, i.e. false). When set
712 * to NULL, it defaults to true for all actions.
714 int *action_is_for_table_entries;
716 /** Array of *n_actions* flags. For each action, the associated flag
717 * indicates whether the action can be assigned to the default table
718 * entry (when non-zero, i.e. true) or not (when zero, i.e. false).
719 * When set to NULL, it defaults to true for all actions.
721 int *action_is_for_default_entry;
723 /** The number of actions for the current table. Must be at least one.
727 /** The default table action that gets executed on lookup miss. Must be
728 * one of the table actions included in the *action_names*.
730 const char *default_action_name;
732 /** Default action data. The size of this array is the action data size
733 * of the default action. Must be NULL if the default action data size
736 uint8_t *default_action_data;
738 /** If non-zero (true), then the default action of the current table
739 * cannot be changed. If zero (false), then the default action can be
740 * changed in the future with another action from the *action_names*
743 int default_action_is_const;
747 * Pipeline learner table configure
752 * Learner table name.
754 * Learner table parameters.
756 * The maximum number of table entries. Must be non-zero.
758 * Table entry timeout in seconds. Must be non-zero.
760 * 0 on success or the following error codes otherwise:
761 * -EINVAL: Invalid argument;
762 * -ENOMEM: Not enough space/cannot allocate memory;
763 * -EEXIST: Learner table with this name already exists;
764 * -ENODEV: Learner table creation error.
768 rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
770 struct rte_swx_pipeline_learner_params *params,
775 * Pipeline register array configure
780 * Register array name.
782 * Number of registers in the array. Each register is 64-bit in size.
783 * @param[in] init_val
784 * Initial value for every register in the array. The recommended value is 0.
786 * 0 on success or the following error codes otherwise:
787 * -EINVAL: Invalid argument;
788 * -ENOMEM: Not enough space/cannot allocate memory;
789 * -EEXIST: Register array with this name already exists.
793 rte_swx_pipeline_regarray_config(struct rte_swx_pipeline *p,
799 * Pipeline meter array configure
806 * Number of meters in the array. Each meter in the array implements the Two
807 * Rate Three Color Marker (trTCM) algorithm, as specified by RFC 2698.
809 * 0 on success or the following error codes otherwise:
810 * -EINVAL: Invalid argument;
811 * -ENOMEM: Not enough space/cannot allocate memory;
812 * -EEXIST: Meter array with this name already exists.
816 rte_swx_pipeline_metarray_config(struct rte_swx_pipeline *p,
821 * Pipeline instructions configure
825 * @param[in] instructions
826 * Pipeline instructions.
827 * @param[in] n_instructions
828 * Number of pipeline instructions.
830 * 0 on success or the following error codes otherwise:
831 * -EINVAL: Invalid argument;
832 * -ENOMEM: Not enough space/cannot allocate memory.
836 rte_swx_pipeline_instructions_config(struct rte_swx_pipeline *p,
837 const char **instructions,
838 uint32_t n_instructions);
843 * Once called, the pipeline build operation marks the end of pipeline
844 * configuration. At this point, all the internal data structures needed to run
845 * the pipeline are built.
850 * 0 on success or the following error codes otherwise:
851 * -EINVAL: Invalid argument;
852 * -ENOMEM: Not enough space/cannot allocate memory;
853 * -EEXIST: Pipeline was already built successfully.
857 rte_swx_pipeline_build(struct rte_swx_pipeline *p);
860 * Pipeline build from specification file
865 * Pipeline specification file.
866 * @param[out] err_line
867 * In case of error and non-NULL, the line number within the *spec* file where
868 * the error occurred. The first line number in the file is 1.
869 * @param[out] err_msg
870 * In case of error and non-NULL, the error message.
872 * 0 on success or the following error codes otherwise:
873 * -EINVAL: Invalid argument;
874 * -ENOMEM: Not enough space/cannot allocate memory;
875 * -EEXIST: Resource with the same name already exists;
876 * -ENODEV: Extern object or table creation error.
880 rte_swx_pipeline_build_from_spec(struct rte_swx_pipeline *p,
883 const char **err_msg);
890 * @param[in] n_instructions
891 * Number of instructions to execute.
895 rte_swx_pipeline_run(struct rte_swx_pipeline *p,
896 uint32_t n_instructions);
901 * Flush all output ports of the pipeline.
908 rte_swx_pipeline_flush(struct rte_swx_pipeline *p);
918 rte_swx_pipeline_free(struct rte_swx_pipeline *p);