examples/ip_pipeline: add sw queue object

Add swq object implementation to the application.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Signed-off-by: Kevin Laatz <kevin.laatz@intel.com>
This commit is contained in:
Jasvinder Singh 2018-03-29 19:31:43 +01:00 committed by Cristian Dumitrescu
parent 133c2c6565
commit 8245472c58
6 changed files with 176 additions and 0 deletions

View File

@ -11,6 +11,7 @@ SRCS-y += link.c
SRCS-y += main.c
SRCS-y += mempool.c
SRCS-y += parser.c
SRCS-y += swq.c
#SRCS-y += thread.c
# Build using pkg-config variables if possible

View File

@ -13,6 +13,7 @@
#include "link.h"
#include "mempool.h"
#include "parser.h"
#include "swq.h"
#ifndef CMD_MAX_TOKENS
#define CMD_MAX_TOKENS 256
@ -227,6 +228,55 @@ cmd_link(char **tokens,
}
}
/**
* swq <swq_name>
* size <size>
* cpu <cpu_id>
*/
static void
cmd_swq(char **tokens,
uint32_t n_tokens,
char *out,
size_t out_size)
{
struct swq_params p;
char *name;
struct swq *swq;
if (n_tokens != 6) {
snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
return;
}
name = tokens[1];
if (strcmp(tokens[2], "size") != 0) {
snprintf(out, out_size, MSG_ARG_NOT_FOUND, "size");
return;
}
if (parser_read_uint32(&p.size, tokens[3]) != 0) {
snprintf(out, out_size, MSG_ARG_INVALID, "size");
return;
}
if (strcmp(tokens[4], "cpu") != 0) {
snprintf(out, out_size, MSG_ARG_NOT_FOUND, "cpu");
return;
}
if (parser_read_uint32(&p.cpu_id, tokens[5]) != 0) {
snprintf(out, out_size, MSG_ARG_INVALID, "cpu_id");
return;
}
swq = swq_create(name, &p);
if (swq == NULL) {
snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
return;
}
}
void
cli_process(char *in, char *out, size_t out_size)
{
@ -256,6 +306,11 @@ cli_process(char *in, char *out, size_t out_size)
return;
}
if (strcmp(tokens[0], "swq") == 0) {
cmd_swq(tokens, n_tokens, out, out_size);
return;
}
snprintf(out, out_size, MSG_CMD_UNKNOWN, tokens[0]);
}

View File

@ -14,6 +14,7 @@
#include "conn.h"
#include "link.h"
#include "mempool.h"
#include "swq.h"
static const char usage[] =
"%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
@ -175,6 +176,13 @@ main(int argc, char **argv)
return status;
}
/* SWQ */
status = swq_init();
if (status) {
printf("Error: SWQ initialization failed (%d)\n", status);
return status;
}
/* Script */
if (app.script_name)
cli_script_process(app.script_name,

View File

@ -14,4 +14,5 @@ sources = files(
'main.c',
'mempool.c',
'parser.c',
'swq.c',
)

View File

@ -0,0 +1,74 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2010-2018 Intel Corporation
*/
#include <stdlib.h>
#include <string.h>
#include "swq.h"
static struct swq_list swq_list;
int
swq_init(void)
{
TAILQ_INIT(&swq_list);
return 0;
}
struct swq *
swq_find(const char *name)
{
struct swq *swq;
if (name == NULL)
return NULL;
TAILQ_FOREACH(swq, &swq_list, node)
if (strcmp(swq->name, name) == 0)
return swq;
return NULL;
}
struct swq *
swq_create(const char *name, struct swq_params *params)
{
struct swq *swq;
struct rte_ring *r;
unsigned int flags = RING_F_SP_ENQ | RING_F_SC_DEQ;
/* Check input params */
if ((name == NULL) ||
swq_find(name) ||
(params == NULL) ||
(params->size == 0))
return NULL;
/* Resource create */
r = rte_ring_create(
name,
params->size,
params->cpu_id,
flags);
if (r == NULL)
return NULL;
/* Node allocation */
swq = calloc(1, sizeof(struct swq));
if (swq == NULL) {
rte_ring_free(r);
return NULL;
}
/* Node fill in */
strncpy(swq->name, name, sizeof(swq->name));
swq->r = r;
/* Node add to list */
TAILQ_INSERT_TAIL(&swq_list, swq, node);
return swq;
}

View File

@ -0,0 +1,37 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2010-2018 Intel Corporation
*/
#ifndef _INCLUDE_SWQ_H_
#define _INCLUDE_SWQ_H_
#include <stdint.h>
#include <sys/queue.h>
#include <rte_ring.h>
#include "common.h"
struct swq {
TAILQ_ENTRY(swq) node;
char name[NAME_SIZE];
struct rte_ring *r;
};
TAILQ_HEAD(swq_list, swq);
int
swq_init(void);
struct swq *
swq_find(const char *name);
struct swq_params {
uint32_t size;
uint32_t cpu_id;
};
struct swq *
swq_create(const char *name, struct swq_params *params);
#endif /* _INCLUDE_SWQ_H_ */