examples/ip_pipeline: add sw queue object
authorJasvinder Singh <jasvinder.singh@intel.com>
Thu, 29 Mar 2018 18:31:43 +0000 (19:31 +0100)
committerCristian Dumitrescu <cristian.dumitrescu@intel.com>
Thu, 5 Apr 2018 16:23:50 +0000 (18:23 +0200)
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>
examples/ip_pipeline/Makefile
examples/ip_pipeline/cli.c
examples/ip_pipeline/main.c
examples/ip_pipeline/meson.build
examples/ip_pipeline/swq.c [new file with mode: 0644]
examples/ip_pipeline/swq.h [new file with mode: 0644]

index 3dab932..0dc8442 100644 (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
index 803e61e..6aa10a2 100644 (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]);
 }
 
index edfb523..456f016 100644 (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,
index a2f9bb6..442f3e3 100644 (file)
@@ -14,4 +14,5 @@ sources = files(
        'main.c',
        'mempool.c',
        'parser.c',
+       'swq.c',
 )
diff --git a/examples/ip_pipeline/swq.c b/examples/ip_pipeline/swq.c
new file mode 100644 (file)
index 0000000..c11bbf2
--- /dev/null
@@ -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;
+}
diff --git a/examples/ip_pipeline/swq.h b/examples/ip_pipeline/swq.h
new file mode 100644 (file)
index 0000000..c8440ee
--- /dev/null
@@ -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_ */