#include <stdlib.h>
#include <string.h>
#ifdef RTE_LIB_KNI
#endif
#include <rte_table_hash_func.h>
#ifdef RTE_LIB_KNI
#include "kni.h"
#endif
#include "link.h"
#include "mempool.h"
#include "pipeline.h"
#include "tap.h"
#include "tmgr.h"
#include "swq.h"
#include "cryptodev.h"
#ifndef PIPELINE_MSGQ_SIZE
#define PIPELINE_MSGQ_SIZE 64
#endif
#ifndef TABLE_LPM_NUMBER_TBL8
#define TABLE_LPM_NUMBER_TBL8 256
#endif
static struct pipeline_list pipeline_list;
int
pipeline_init(void)
{
TAILQ_INIT(&pipeline_list);
return 0;
}
pipeline_find(const char *name)
{
if (name == NULL)
return NULL;
TAILQ_FOREACH(
pipeline, &pipeline_list, node)
return NULL;
}
pipeline_create(const char *name, struct pipeline_params *params)
{
char msgq_name[NAME_MAX];
struct rte_pipeline *p;
if ((name == NULL) ||
pipeline_find(name) ||
(params == NULL) ||
(params->timer_period_ms == 0))
return NULL;
snprintf(msgq_name, sizeof(msgq_name), "%s-MSGQ-REQ", name);
PIPELINE_MSGQ_SIZE,
params->cpu_id,
if (msgq_req == NULL)
return NULL;
snprintf(msgq_name, sizeof(msgq_name), "%s-MSGQ-RSP", name);
PIPELINE_MSGQ_SIZE,
params->cpu_id,
if (msgq_rsp == NULL) {
return NULL;
}
pp.name = name;
pp.socket_id = (int) params->cpu_id;
pp.offset_port_id = params->offset_port_id;
if (p == NULL) {
return NULL;
}
return NULL;
}
pipeline->timer_period_ms = params->timer_period_ms;
TAILQ_INSERT_TAIL(&pipeline_list,
pipeline, node);
}
int
pipeline_port_in_create(const char *pipeline_name,
struct port_in_params *params,
int enabled)
{
union {
#ifdef RTE_LIB_KNI
#endif
} pp;
struct port_in *port_in;
struct port_in_action_profile *ap;
struct rte_port_in_action *action;
uint32_t port_id;
int status;
memset(&p, 0, sizeof(p));
memset(&pp, 0, sizeof(pp));
if ((pipeline_name == NULL) ||
(params == NULL) ||
(params->burst_size == 0) ||
return -1;
pipeline = pipeline_find(pipeline_name);
return -1;
ap = NULL;
if (params->action_profile_name) {
ap = port_in_action_profile_find(params->action_profile_name);
if (ap == NULL)
return -1;
}
switch (params->type) {
case PORT_IN_RXQ:
{
struct link *link;
link = link_find(params->dev_name);
if (link == NULL)
return -1;
if (params->rxq.queue_id >= link->n_rxq)
return -1;
pp.ethdev.port_id = link->port_id;
pp.ethdev.queue_id = params->rxq.queue_id;
p.arg_create = &pp.ethdev;
break;
}
case PORT_IN_SWQ:
{
struct swq *swq;
swq = swq_find(params->dev_name);
if (swq == NULL)
return -1;
pp.ring.ring = swq->r;
p.arg_create = &pp.ring;
break;
}
case PORT_IN_TMGR:
{
struct tmgr_port *tmgr_port;
tmgr_port = tmgr_port_find(params->dev_name);
if (tmgr_port == NULL)
return -1;
pp.sched.sched = tmgr_port->s;
p.arg_create = &pp.sched;
break;
}
case PORT_IN_TAP:
{
struct tap *tap;
struct mempool *mempool;
tap = tap_find(params->dev_name);
mempool = mempool_find(params->tap.mempool_name);
if ((tap == NULL) || (mempool == NULL))
return -1;
pp.fd.fd = tap->fd;
pp.fd.mempool = mempool->m;
pp.fd.mtu = params->tap.mtu;
p.arg_create = &pp.fd;
break;
}
#ifdef RTE_LIB_KNI
case PORT_IN_KNI:
{
struct kni *kni;
kni = kni_find(params->dev_name);
if (kni == NULL)
return -1;
pp.kni.kni = kni->k;
p.arg_create = &pp.kni;
break;
}
#endif
case PORT_IN_SOURCE:
{
struct mempool *mempool;
mempool = mempool_find(params->source.mempool_name);
if (mempool == NULL)
return -1;
pp.source.mempool = mempool->m;
pp.source.file_name = params->source.file_name;
pp.source.n_bytes_per_pkt = params->source.n_bytes_per_pkt;
p.arg_create = &pp.source;
break;
}
case PORT_IN_CRYPTODEV:
{
struct cryptodev *cryptodev;
cryptodev = cryptodev_find(params->dev_name);
if (cryptodev == NULL)
return -1;
if (params->rxq.queue_id > cryptodev->n_queues - 1)
return -1;
pp.sym_crypto.cryptodev_id = cryptodev->dev_id;
pp.sym_crypto.queue_id = params->cryptodev.queue_id;
pp.sym_crypto.f_callback = params->cryptodev.f_callback;
pp.sym_crypto.arg_callback = params->cryptodev.arg_callback;
p.arg_create = &pp.sym_crypto;
break;
}
default:
return -1;
}
p.burst_size = params->burst_size;
action = NULL;
p.f_action = NULL;
p.arg_ah = NULL;
if (ap) {
if (action == NULL)
return -1;
action,
&p);
if (status) {
struct if (status) {