/* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2016 Intel Corporation */ #ifndef __INCLUDE_PIPELINE_BE_H__ #define __INCLUDE_PIPELINE_BE_H__ #include #include #include #include #include #include #include #ifdef RTE_LIBRTE_KNI #include #endif #include enum pipeline_port_in_type { PIPELINE_PORT_IN_ETHDEV_READER, PIPELINE_PORT_IN_RING_READER, PIPELINE_PORT_IN_RING_MULTI_READER, PIPELINE_PORT_IN_RING_READER_IPV4_FRAG, PIPELINE_PORT_IN_RING_READER_IPV6_FRAG, PIPELINE_PORT_IN_SCHED_READER, PIPELINE_PORT_IN_FD_READER, PIPELINE_PORT_IN_KNI_READER, PIPELINE_PORT_IN_SOURCE, }; struct pipeline_port_in_params { enum pipeline_port_in_type type; union { struct rte_port_ethdev_reader_params ethdev; struct rte_port_ring_reader_params ring; struct rte_port_ring_multi_reader_params ring_multi; struct rte_port_ring_reader_ipv4_frag_params ring_ipv4_frag; struct rte_port_ring_reader_ipv6_frag_params ring_ipv6_frag; struct rte_port_sched_reader_params sched; struct rte_port_fd_reader_params fd; #ifdef RTE_LIBRTE_KNI struct rte_port_kni_reader_params kni; #endif struct rte_port_source_params source; } params; uint32_t burst_size; }; static inline void * pipeline_port_in_params_convert(struct pipeline_port_in_params *p) { switch (p->type) { case PIPELINE_PORT_IN_ETHDEV_READER: return (void *) &p->params.ethdev; case PIPELINE_PORT_IN_RING_READER: return (void *) &p->params.ring; case PIPELINE_PORT_IN_RING_MULTI_READER: return (void *) &p->params.ring_multi; case PIPELINE_PORT_IN_RING_READER_IPV4_FRAG: return (void *) &p->params.ring_ipv4_frag; case PIPELINE_PORT_IN_RING_READER_IPV6_FRAG: return (void *) &p->params.ring_ipv6_frag; case PIPELINE_PORT_IN_SCHED_READER: return (void *) &p->params.sched; case PIPELINE_PORT_IN_FD_READER: return (void *) &p->params.fd; #ifdef RTE_LIBRTE_KNI case PIPELINE_PORT_IN_KNI_READER: return (void *) &p->params.kni; #endif case PIPELINE_PORT_IN_SOURCE: return (void *) &p->params.source; default: return NULL; } } static inline struct rte_port_in_ops * pipeline_port_in_params_get_ops(struct pipeline_port_in_params *p) { switch (p->type) { case PIPELINE_PORT_IN_ETHDEV_READER: return &rte_port_ethdev_reader_ops; case PIPELINE_PORT_IN_RING_READER: return &rte_port_ring_reader_ops; case PIPELINE_PORT_IN_RING_MULTI_READER: return &rte_port_ring_multi_reader_ops; case PIPELINE_PORT_IN_RING_READER_IPV4_FRAG: return &rte_port_ring_reader_ipv4_frag_ops; case PIPELINE_PORT_IN_RING_READER_IPV6_FRAG: return &rte_port_ring_reader_ipv6_frag_ops; case PIPELINE_PORT_IN_SCHED_READER: return &rte_port_sched_reader_ops; case PIPELINE_PORT_IN_FD_READER: return &rte_port_fd_reader_ops; #ifdef RTE_LIBRTE_KNI case PIPELINE_PORT_IN_KNI_READER: return &rte_port_kni_reader_ops; #endif case PIPELINE_PORT_IN_SOURCE: return &rte_port_source_ops; default: return NULL; } } enum pipeline_port_out_type { PIPELINE_PORT_OUT_ETHDEV_WRITER, PIPELINE_PORT_OUT_ETHDEV_WRITER_NODROP, PIPELINE_PORT_OUT_RING_WRITER, PIPELINE_PORT_OUT_RING_MULTI_WRITER, PIPELINE_PORT_OUT_RING_WRITER_NODROP, PIPELINE_PORT_OUT_RING_MULTI_WRITER_NODROP, PIPELINE_PORT_OUT_RING_WRITER_IPV4_RAS, PIPELINE_PORT_OUT_RING_WRITER_IPV6_RAS, PIPELINE_PORT_OUT_SCHED_WRITER, PIPELINE_PORT_OUT_FD_WRITER, PIPELINE_PORT_OUT_KNI_WRITER, PIPELINE_PORT_OUT_KNI_WRITER_NODROP, PIPELINE_PORT_OUT_SINK, }; struct pipeline_port_out_params { enum pipeline_port_out_type type; union { struct rte_port_ethdev_writer_params ethdev; struct rte_port_ethdev_writer_nodrop_params ethdev_nodrop; struct rte_port_ring_writer_params ring; struct rte_port_ring_multi_writer_params ring_multi; struct rte_port_ring_writer_nodrop_params ring_nodrop; struct rte_port_ring_multi_writer_nodrop_params ring_multi_nodrop; struct rte_port_ring_writer_ipv4_ras_params ring_ipv4_ras; struct rte_port_ring_writer_ipv6_ras_params ring_ipv6_ras; struct rte_port_sched_writer_params sched; struct rte_port_fd_writer_params fd; #ifdef RTE_LIBRTE_KNI struct rte_port_kni_writer_params kni; struct rte_port_kni_writer_nodrop_params kni_nodrop; #endif struct rte_port_sink_params sink; } params; }; static inline void * pipeline_port_out_params_convert(struct pipeline_port_out_params *p) { switch (p->type) { case PIPELINE_PORT_OUT_ETHDEV_WRITER: return (void *) &p->params.ethdev; case PIPELINE_PORT_OUT_ETHDEV_WRITER_NODROP: return (void *) &p->params.ethdev_nodrop; case PIPELINE_PORT_OUT_RING_WRITER: return (void *) &p->params.ring; case PIPELINE_PORT_OUT_RING_MULTI_WRITER: return (void *) &p->params.ring_multi; case PIPELINE_PORT_OUT_RING_WRITER_NODROP: return (void *) &p->params.ring_nodrop; case PIPELINE_PORT_OUT_RING_MULTI_WRITER_NODROP: return (void *) &p->params.ring_multi_nodrop; case PIPELINE_PORT_OUT_RING_WRITER_IPV4_RAS: return (void *) &p->params.ring_ipv4_ras; case PIPELINE_PORT_OUT_RING_WRITER_IPV6_RAS: return (void *) &p->params.ring_ipv6_ras; case PIPELINE_PORT_OUT_SCHED_WRITER: return (void *) &p->params.sched; case PIPELINE_PORT_OUT_FD_WRITER: return (void *) &p->params.fd; #ifdef RTE_LIBRTE_KNI case PIPELINE_PORT_OUT_KNI_WRITER: return (void *) &p->params.kni; case PIPELINE_PORT_OUT_KNI_WRITER_NODROP: return (void *) &p->params.kni_nodrop; #endif case PIPELINE_PORT_OUT_SINK: return (void *) &p->params.sink; default: return NULL; } } static inline void * pipeline_port_out_params_get_ops(struct pipeline_port_out_params *p) { switch (p->type) { case PIPELINE_PORT_OUT_ETHDEV_WRITER: return &rte_port_ethdev_writer_ops; case PIPELINE_PORT_OUT_ETHDEV_WRITER_NODROP: return &rte_port_ethdev_writer_nodrop_ops; case PIPELINE_PORT_OUT_RING_WRITER: return &rte_port_ring_writer_ops; case PIPELINE_PORT_OUT_RING_MULTI_WRITER: return &rte_port_ring_multi_writer_ops; case PIPELINE_PORT_OUT_RING_WRITER_NODROP: return &rte_port_ring_writer_nodrop_ops; case PIPELINE_PORT_OUT_RING_MULTI_WRITER_NODROP: return &rte_port_ring_multi_writer_nodrop_ops; case PIPELINE_PORT_OUT_RING_WRITER_IPV4_RAS: return &rte_port_ring_writer_ipv4_ras_ops; case PIPELINE_PORT_OUT_RING_WRITER_IPV6_RAS: return &rte_port_ring_writer_ipv6_ras_ops; case PIPELINE_PORT_OUT_SCHED_WRITER: return &rte_port_sched_writer_ops; case PIPELINE_PORT_OUT_FD_WRITER: return &rte_port_fd_writer_ops; #ifdef RTE_LIBRTE_KNI case PIPELINE_PORT_OUT_KNI_WRITER: return &rte_port_kni_writer_ops; case PIPELINE_PORT_OUT_KNI_WRITER_NODROP: return &rte_port_kni_writer_nodrop_ops; #endif case PIPELINE_PORT_OUT_SINK: return &rte_port_sink_ops; default: return NULL; } } #ifndef PIPELINE_NAME_SIZE #define PIPELINE_NAME_SIZE 64 #endif #ifndef PIPELINE_TYPE_SIZE #define PIPELINE_TYPE_SIZE 64 #endif #ifndef PIPELINE_MAX_PORT_IN #define PIPELINE_MAX_PORT_IN 64 #endif #ifndef PIPELINE_MAX_PORT_OUT #define PIPELINE_MAX_PORT_OUT 64 #endif #ifndef PIPELINE_MAX_TABLES #define PIPELINE_MAX_TABLES 16 #endif #ifndef PIPELINE_MAX_MSGQ_IN #define PIPELINE_MAX_MSGQ_IN 16 #endif #ifndef PIPELINE_MAX_MSGQ_OUT #define PIPELINE_MAX_MSGQ_OUT 16 #endif #ifndef PIPELINE_MAX_ARGS #define PIPELINE_MAX_ARGS 64 #endif struct pipeline_params { char name[PIPELINE_NAME_SIZE]; char type[PIPELINE_TYPE_SIZE]; struct pipeline_port_in_params port_in[PIPELINE_MAX_PORT_IN]; struct pipeline_port_out_params port_out[PIPELINE_MAX_PORT_OUT]; struct rte_ring *msgq_in[PIPELINE_MAX_MSGQ_IN]; struct rte_ring *msgq_out[PIPELINE_MAX_MSGQ_OUT]; uint32_t n_ports_in; uint32_t n_ports_out; uint32_t n_msgq; int socket_id; char *args_name[PIPELINE_MAX_ARGS]; char *args_value[PIPELINE_MAX_ARGS]; uint32_t n_args; uint32_t log_level; }; /* * Pipeline type back-end operations */ typedef void* (*pipeline_be_op_init)(struct pipeline_params *params, void *arg); typedef int (*pipeline_be_op_free)(void *pipeline); typedef int (*pipeline_be_op_run)(void *pipeline); typedef int (*pipeline_be_op_timer)(void *pipeline); struct pipeline_be_ops { pipeline_be_op_init f_init; pipeline_be_op_free f_free; pipeline_be_op_run f_run; pipeline_be_op_timer f_timer; }; /* Pipeline specific config parse error messages */ #define PIPELINE_ARG_CHECK(exp, fmt, ...) \ do { \ if (!(exp)) { \ fprintf(stderr, fmt "\n", ## __VA_ARGS__); \ return -1; \ } \ } while (0) #define PIPELINE_PARSE_ERR_INV_VAL(exp, section, entry, val) \ PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": entry \"%s\" " \ "has invalid value (\"%s\")", section, entry, val) #define PIPELINE_PARSE_ERR_OUT_RNG(exp, section, entry, val) \ PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": entry \"%s\" " \ "value is out of range (\"%s\")", section, entry, val) #define PIPELINE_PARSE_ERR_DUPLICATE(exp, section, entry) \ PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": duplicated " \ "entry \"%s\"", section, entry) #define PIPELINE_PARSE_ERR_INV_ENT(exp, section, entry) \ PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": invalid entry " \ "\"%s\"", section, entry) #define PIPELINE_PARSE_ERR_MANDATORY(exp, section, entry) \ PIPELINE_ARG_CHECK(exp, "Parse error in section \"%s\": mandatory " \ "entry \"%s\" is missing", section, entry) #endif