DPDK patches and discussions
 help / color / mirror / Atom feed
From: Jasvinder Singh <jasvinder.singh@intel.com>
To: dev@dpdk.org
Cc: cristian.dumitrescu@intel.com
Subject: [dpdk-dev] [PATCH 11/37] ip_pipeline: add cli interface
Date: Fri,  9 Mar 2018 18:24:00 +0000	[thread overview]
Message-ID: <20180309182426.135278-12-jasvinder.singh@intel.com> (raw)
In-Reply-To: <20180309182426.135278-1-jasvinder.singh@intel.com>

CLI interface allowing connectivity with external agent(e.g. telnet,
netcat, Python script, etc) is added to the application.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
 examples/ip_pipeline/Makefile    |   4 +-
 examples/ip_pipeline/cli.c       |  85 ++++++++++
 examples/ip_pipeline/cli.h       |  18 +++
 examples/ip_pipeline/conn.c      | 326 +++++++++++++++++++++++++++++++++++++++
 examples/ip_pipeline/conn.h      |  47 ++++++
 examples/ip_pipeline/main.c      | 151 +++++++++++++++++-
 examples/ip_pipeline/meson.build |   5 +-
 7 files changed, 632 insertions(+), 4 deletions(-)
 create mode 100644 examples/ip_pipeline/cli.c
 create mode 100644 examples/ip_pipeline/cli.h
 create mode 100644 examples/ip_pipeline/conn.c
 create mode 100644 examples/ip_pipeline/conn.h

diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile
index 981c4f7..0c5b6b1 100644
--- a/examples/ip_pipeline/Makefile
+++ b/examples/ip_pipeline/Makefile
@@ -5,7 +5,9 @@
 APP = ip_pipeline
 
 # all source are stored in SRCS-y
-SRCS-y := main.c
+SRCS-y := cli.c
+SRCS-y += conn.c
+SRCS-y += main.c
 SRCS-y += parser.c
 #SRCS-y += thread.c
 
diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c
new file mode 100644
index 0000000..3e97b29
--- /dev/null
+++ b/examples/ip_pipeline/cli.c
@@ -0,0 +1,85 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <rte_common.h>
+
+#include "cli.h"
+
+static int
+is_comment(char *in)
+{
+	if ((strlen(in) && index("!#%;", in[0])) ||
+		(strncmp(in, "//", 2) == 0) ||
+		(strncmp(in, "--", 2) == 0))
+		return 1;
+
+	return 0;
+}
+
+void
+cli_process(char *in, char *out __rte_unused, size_t out_size __rte_unused)
+{
+	if (is_comment(in))
+		return;
+
+}
+
+int
+cli_script_process(const char *file_name,
+	size_t msg_in_len_max,
+	size_t msg_out_len_max)
+{
+	char *msg_in = NULL, *msg_out = NULL;
+	FILE *f = NULL;
+
+	/* Check input arguments */
+	if ((file_name == NULL) ||
+		(strlen(file_name) == 0) ||
+		(msg_in_len_max == 0) ||
+		(msg_out_len_max == 0))
+		return -EINVAL;
+
+	msg_in = malloc(msg_in_len_max + 1);
+	msg_out = malloc(msg_out_len_max + 1);
+	if ((msg_in == NULL) ||
+		(msg_out == NULL)) {
+		free(msg_out);
+		free(msg_in);
+		return -ENOMEM;
+	}
+
+	/* Open input file */
+	f = fopen(file_name, "r");
+	if (f == NULL) {
+		free(msg_out);
+		free(msg_in);
+		return -EIO;
+	}
+
+	/* Read file */
+	for ( ; ; ) {
+		if (fgets(msg_in, msg_in_len_max + 1, f) == NULL)
+			break;
+
+		printf("%s", msg_in);
+
+		cli_process(msg_in,
+			msg_out,
+			msg_out_len_max);
+
+		if (strlen(msg_out))
+			printf("%s", msg_out);
+	}
+
+	/* Close file */
+	fclose(f);
+	free(msg_out);
+	free(msg_in);
+	return 0;
+}
diff --git a/examples/ip_pipeline/cli.h b/examples/ip_pipeline/cli.h
new file mode 100644
index 0000000..992e4c3
--- /dev/null
+++ b/examples/ip_pipeline/cli.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#ifndef __INCLUDE_CLI_H__
+#define __INCLUDE_CLI_H__
+
+#include <stddef.h>
+
+void
+cli_process(char *in, char *out, size_t out_size);
+
+int
+cli_script_process(const char *file_name,
+	size_t msg_in_len_max,
+	size_t msg_out_len_max);
+
+#endif
diff --git a/examples/ip_pipeline/conn.c b/examples/ip_pipeline/conn.c
new file mode 100644
index 0000000..2a9fa15
--- /dev/null
+++ b/examples/ip_pipeline/conn.c
@@ -0,0 +1,326 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+#define __USE_GNU
+#include <sys/socket.h>
+
+#include <sys/epoll.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <errno.h>
+
+#include "conn.h"
+
+#define MSG_CMD_TOO_LONG "Command too long."
+
+struct conn {
+	char *welcome;
+	char *prompt;
+	char *buf;
+	char *msg_in;
+	char *msg_out;
+	size_t buf_size;
+	size_t msg_in_len_max;
+	size_t msg_out_len_max;
+	size_t msg_in_len;
+	int fd_server;
+	int fd_client_group;
+	conn_msg_handle_t msg_handle;
+};
+
+struct conn *
+conn_init(struct conn_params *p)
+{
+	struct sockaddr_in server_address;
+	struct conn *conn;
+	int fd_server, fd_client_group, status;
+
+	memset(&server_address, 0, sizeof(server_address));
+
+	/* Check input arguments */
+	if ((p == NULL) ||
+		(p->welcome == NULL) ||
+		(p->prompt == NULL) ||
+		(p->addr == NULL) ||
+		(p->buf_size == 0) ||
+		(p->msg_in_len_max == 0) ||
+		(p->msg_out_len_max == 0) ||
+		(p->msg_handle == NULL))
+		return NULL;
+
+	status = inet_aton(p->addr, &server_address.sin_addr);
+	if (status == 0)
+		return NULL;
+
+	/* Memory allocation */
+	conn = calloc(1, sizeof(struct conn));
+	if (conn == NULL)
+		return NULL;
+
+	conn->welcome = calloc(1, CONN_WELCOME_LEN_MAX + 1);
+	conn->prompt = calloc(1, CONN_PROMPT_LEN_MAX + 1);
+	conn->buf = calloc(1, p->buf_size);
+	conn->msg_in = calloc(1, p->msg_in_len_max + 1);
+	conn->msg_out = calloc(1, p->msg_out_len_max + 1);
+
+	if ((conn->welcome == NULL) ||
+		(conn->prompt == NULL) ||
+		(conn->buf == NULL) ||
+		(conn->msg_in == NULL) ||
+		(conn->msg_out == NULL)) {
+		conn_free(conn);
+		return NULL;
+	}
+
+	/* Server socket */
+	server_address.sin_family = AF_INET;
+	server_address.sin_port = htons(p->port);
+
+	fd_server = socket(AF_INET,
+		SOCK_STREAM | SOCK_NONBLOCK,
+		0);
+	if (fd_server == -1) {
+		conn_free(conn);
+		return NULL;
+	}
+
+	status = bind(fd_server,
+		(struct sockaddr *) &server_address,
+		sizeof(server_address));
+	if (status == -1) {
+		conn_free(conn);
+		return NULL;
+	}
+
+	status = listen(fd_server, 16);
+	if (status == -1) {
+		conn_free(conn);
+		return NULL;
+	}
+
+	/* Client group */
+	fd_client_group = epoll_create(1);
+	if (fd_client_group == -1) {
+		conn_free(conn);
+		return NULL;
+	}
+
+	/* Fill in */
+	strncpy(conn->welcome, p->welcome, CONN_WELCOME_LEN_MAX);
+	strncpy(conn->prompt, p->prompt, CONN_PROMPT_LEN_MAX);
+	conn->buf_size = p->buf_size;
+	conn->msg_in_len_max = p->msg_in_len_max;
+	conn->msg_out_len_max = p->msg_out_len_max;
+	conn->msg_in_len = 0;
+	conn->fd_server = fd_server;
+	conn->fd_client_group = fd_client_group;
+	conn->msg_handle = p->msg_handle;
+
+	return conn;
+}
+
+void
+conn_free(struct conn *conn)
+{
+	if (conn == NULL)
+		return;
+
+	if (conn->fd_client_group)
+		close(conn->fd_client_group);
+
+	if (conn->fd_server)
+		close(conn->fd_server);
+
+	free(conn->msg_out);
+	free(conn->msg_in);
+	free(conn->prompt);
+	free(conn->welcome);
+	free(conn);
+}
+
+int
+conn_poll_for_conn(struct conn *conn)
+{
+	struct sockaddr_in client_address;
+	struct epoll_event event;
+	socklen_t client_address_length;
+	int fd_client, status;
+
+	/* Check input arguments */
+	if (conn == NULL)
+		return -1;
+
+	/* Server socket */
+	client_address_length = sizeof(client_address);
+	fd_client = accept4(conn->fd_server,
+		(struct sockaddr *) &client_address,
+		&client_address_length,
+		SOCK_NONBLOCK);
+	if (fd_client == -1) {
+		if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
+			return 0;
+
+		return -1;
+	}
+
+	/* Client group */
+	event.events = EPOLLIN | EPOLLRDHUP | EPOLLHUP;
+	event.data.fd = fd_client;
+
+	status = epoll_ctl(conn->fd_client_group,
+		EPOLL_CTL_ADD,
+		fd_client,
+		&event);
+	if (status == -1) {
+		close(fd_client);
+		return -1;
+	}
+
+	/* Client */
+	status = write(fd_client,
+		conn->welcome,
+		strlen(conn->welcome));
+	if (status == -1) {
+		close(fd_client);
+		return -1;
+	}
+
+	status = write(fd_client,
+		conn->prompt,
+		strlen(conn->prompt));
+	if (status == -1) {
+		close(fd_client);
+		return -1;
+	}
+
+	return 0;
+}
+
+static int
+data_event_handle(struct conn *conn,
+	int fd_client)
+{
+	ssize_t len, i, status;
+
+	/* Read input message */
+
+	len = read(fd_client,
+		conn->buf,
+		conn->buf_size);
+	if (len == -1) {
+		if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
+			return 0;
+
+		return -1;
+	}
+	if (len == 0)
+		return 0;
+
+	/* Handle input messages */
+	for (i = 0; i < len; i++) {
+		if (conn->buf[i] == '\n') {
+			size_t n;
+
+			conn->msg_in[conn->msg_in_len] = 0;
+			conn->msg_out[0] = 0;
+
+			conn->msg_handle(conn->msg_in,
+				conn->msg_out,
+				conn->msg_out_len_max);
+
+			n = strlen(conn->msg_out);
+			if (n) {
+				status = write(fd_client,
+					conn->msg_out,
+					n);
+				if (status == -1)
+					return status;
+			}
+
+			conn->msg_in_len = 0;
+		} else if (conn->msg_in_len < conn->msg_in_len_max) {
+			conn->msg_in[conn->msg_in_len] = conn->buf[i];
+			conn->msg_in_len++;
+		} else {
+			status = write(fd_client,
+				MSG_CMD_TOO_LONG,
+				strlen(MSG_CMD_TOO_LONG));
+			if (status == -1)
+				return status;
+
+			conn->msg_in_len = 0;
+		}
+	}
+
+	/* Write prompt */
+	status = write(fd_client,
+		conn->prompt,
+		strlen(conn->prompt));
+	if (status == -1)
+		return status;
+
+	return 0;
+}
+
+static int
+control_event_handle(struct conn *conn,
+	int fd_client)
+{
+	int status;
+
+	status = epoll_ctl(conn->fd_client_group,
+		EPOLL_CTL_DEL,
+		fd_client,
+		NULL);
+	if (status == -1)
+		return -1;
+
+	status = close(fd_client);
+	if (status == -1)
+		return -1;
+
+	return 0;
+}
+
+int
+conn_poll_for_msg(struct conn *conn)
+{
+	struct epoll_event event;
+	int fd_client, status, status_data, status_control;
+
+	/* Check input arguments */
+	if (conn == NULL)
+		return -1;
+
+	/* Client group */
+	status = epoll_wait(conn->fd_client_group,
+		&event,
+		1,
+		0);
+	if (status == -1)
+		return -1;
+	if (status == 0)
+		return 0;
+
+	fd_client = event.data.fd;
+
+	/* Data available */
+	if (event.events & EPOLLIN)
+		status_data = data_event_handle(conn, fd_client);
+
+	/* Control events */
+	if (event.events & (EPOLLRDHUP | EPOLLERR | EPOLLHUP))
+		status_control = control_event_handle(conn, fd_client);
+
+	if (status_data || status_control)
+		return -1;
+
+	return 0;
+}
diff --git a/examples/ip_pipeline/conn.h b/examples/ip_pipeline/conn.h
new file mode 100644
index 0000000..46f9f95
--- /dev/null
+++ b/examples/ip_pipeline/conn.h
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2018 Intel Corporation
+ */
+
+#ifndef __INCLUDE_CONN_H__
+#define __INCLUDE_CONN_H__
+
+#include <stdint.h>
+
+struct conn;
+
+#ifndef CONN_WELCOME_LEN_MAX
+#define CONN_WELCOME_LEN_MAX                               1024
+#endif
+
+#ifndef CONN_PROMPT_LEN_MAX
+#define CONN_PROMPT_LEN_MAX                                16
+#endif
+
+typedef void (*conn_msg_handle_t)(char *msg_in,
+	char *msg_out,
+	size_t msg_out_len_max);
+
+struct conn_params {
+	const char *welcome;
+	const char *prompt;
+	const char *addr;
+	uint16_t port;
+	size_t buf_size;
+	size_t msg_in_len_max;
+	size_t msg_out_len_max;
+	conn_msg_handle_t msg_handle;
+};
+
+struct conn *
+conn_init(struct conn_params *p);
+
+void
+conn_free(struct conn *conn);
+
+int
+conn_poll_for_conn(struct conn *conn);
+
+int
+conn_poll_for_msg(struct conn *conn);
+
+#endif
diff --git a/examples/ip_pipeline/main.c b/examples/ip_pipeline/main.c
index 1696e36..60936f4 100644
--- a/examples/ip_pipeline/main.c
+++ b/examples/ip_pipeline/main.c
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2010-2015 Intel Corporation
+ * Copyright(c) 2010-2018 Intel Corporation
  */
 
 #include <stdio.h>
@@ -10,11 +10,140 @@
 
 #include <rte_eal.h>
 
+#include "cli.h"
+#include "conn.h"
+
+static const char usage[] =
+	"%s EAL_ARGS -- [-h HOST] [-p PORT] [-s SCRIPT]\n";
+
+static const char welcome[] =
+	"\n"
+	"Welcome to IP Pipeline!\n"
+	"\n";
+
+static const char prompt[] = "pipeline> ";
+
+static struct app_params {
+	struct conn_params conn;
+	char *script_name;
+} app = {
+	.conn = {
+		.welcome = welcome,
+		.prompt = prompt,
+		.addr = "0.0.0.0",
+		.port = 8086,
+		.buf_size = 1024 * 1024,
+		.msg_in_len_max = 1024,
+		.msg_out_len_max = 1024 * 1024,
+		.msg_handle = cli_process,
+	},
+	.script_name = NULL,
+};
+
+static int
+parse_args(int argc, char **argv)
+{
+	char *app_name = argv[0];
+	struct option lgopts[] = {
+		{ NULL,  0, 0, 0 }
+	};
+	int opt, option_index;
+	int h_present, p_present, s_present, n_args, i;
+
+	/* Skip EAL input args */
+	n_args = argc;
+	for (i = 0; i < n_args; i++)
+		if (strcmp(argv[i], "--") == 0) {
+			argc -= i;
+			argv += i;
+			break;
+		}
+
+	if (i == n_args)
+		return 0;
+
+	/* Parse args */
+	h_present = 0;
+	p_present = 0;
+	s_present = 0;
+
+	while ((opt = getopt_long(argc, argv, "h:p:s:", lgopts, &option_index))
+			!= EOF)
+		switch (opt) {
+		case 'h':
+			if (h_present) {
+				printf("Error: Multiple -h arguments\n");
+				return -1;
+			}
+			h_present = 1;
+
+			if (!strlen(optarg)) {
+				printf("Error: Argument for -h not provided\n");
+				return -1;
+			}
+
+			app.conn.addr = strdup(optarg);
+			if (app.conn.addr == NULL) {
+				printf("Error: Not enough memory\n");
+				return -1;
+			}
+			break;
+
+		case 'p':
+			if (p_present) {
+				printf("Error: Multiple -p arguments\n");
+				return -1;
+			}
+			p_present = 1;
+
+			if (!strlen(optarg)) {
+				printf("Error: Argument for -p not provided\n");
+				return -1;
+			}
+
+			app.conn.port = (uint16_t) atoi(optarg);
+			break;
+
+		case 's':
+			if (s_present) {
+				printf("Error: Multiple -s arguments\n");
+				return -1;
+			}
+			s_present = 1;
+
+			if (!strlen(optarg)) {
+				printf("Error: Argument for -s not provided\n");
+				return -1;
+			}
+
+			app.script_name = strdup(optarg);
+			if (app.script_name == NULL) {
+				printf("Error: Not enough memory\n");
+				return -1;
+			}
+			break;
+
+		default:
+			printf(usage, app_name);
+			return -1;
+		}
+
+	optind = 1; /* reset getopt lib */
+
+	return 0;
+}
+
 int
 main(int argc, char **argv)
 {
+	struct conn *conn;
 	int status;
 
+	/* Parse application arguments */
+	status = parse_args(argc, argv);
+	if (status < 0)
+		return status;
+
 	/* EAL */
 	status = rte_eal_init(argc, argv);
 	if (status < 0) {
@@ -22,4 +151,24 @@ main(int argc, char **argv)
 		return status;
 	};
 
+	/* Connectivity */
+	conn = conn_init(&app.conn);
+	if (conn == NULL) {
+		printf("Error: Connectivity initialization failed (%d)\n",
+			status);
+		return status;
+	};
+
+	/* Script */
+	if (app.script_name)
+		cli_script_process(app.script_name,
+			app.conn.msg_in_len_max,
+			app.conn.msg_out_len_max);
+
+	/* Dispatch loop */
+	for ( ; ; ) {
+		conn_poll_for_conn(conn);
+
+		conn_poll_for_msg(conn);
+	}
 }
diff --git a/examples/ip_pipeline/meson.build b/examples/ip_pipeline/meson.build
index ea89460..a89cb30 100644
--- a/examples/ip_pipeline/meson.build
+++ b/examples/ip_pipeline/meson.build
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
-# Copyright(c) 2017 Intel Corporation
+# Copyright(c) 2017-2018 Intel Corporation
 
 # meson file, for building this example as part of a main DPDK build.
 #
@@ -7,8 +7,9 @@
 # DPDK instance, use 'make'
 
 deps += ['pipeline', 'bus_pci']
-includes += include_directories('pipeline')
 sources = files(
+	'cli.c',
+	'conn.c',
 	'main.c',
 	'parser.c',
 )
-- 
2.9.3

  parent reply	other threads:[~2018-03-09 18:24 UTC|newest]

Thread overview: 181+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-09 18:23 [dpdk-dev] [PATCH 00/37] ip_pipeline: refactoring Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 01/37] pipeline: add pipeline table action APIs Jasvinder Singh
2018-03-12 17:25   ` [dpdk-dev] [PATCH v2 00/44] ip_pipeline: refactoring Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 01/44] pipeline: add pipeline table action APIs Jasvinder Singh
2018-03-16 17:56       ` [dpdk-dev] [PATCH v3 00/44] ip_pipeline: refactoring Jasvinder Singh
2018-03-16 17:56         ` [dpdk-dev] [PATCH v3 01/44] pipeline: add pipeline table action APIs Jasvinder Singh
2018-03-16 17:58       ` [dpdk-dev] [PATCH v3 00/44] ip_pipeline: refactoring Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 01/44] pipeline: add pipeline table action APIs Jasvinder Singh
2018-03-29 18:31           ` [dpdk-dev] [PATCH v4 00/49] ip_pipeline: refactoring Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 01/49] pipeline: add pipeline table action APIs Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 02/49] pipeline: get pipeline table action params Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 03/49] pipeline: add traffic metering action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 04/49] pipeline: add traffic manager action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 05/49] pipeline: add packet encapsulation action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 06/49] pipeline: add nat action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 07/49] pipeline: add ttl update action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 08/49] pipeline: add statistics read action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 09/49] pipeline: add timestamp action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 10/49] pipeline: add load balance action Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 11/49] pipeline: add pipeline port in action APIs Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 12/49] librte_table/acl: remove incorrect check Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 13/49] ip_pipeline: remove passthrough pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 14/49] ip_pipeline: remove routing pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 15/49] ip_pipeline: remove flow classification pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 16/49] ip_pipeline: remove flow actions pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 17/49] ip_pipeline: remove firewall pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 18/49] ip_pipeline: remove master pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 19/49] ip_pipeline: remove config Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 20/49] ip_pipeline: rework and improvements Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 21/49] ip_pipeline: add cli interface Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 22/49] ip_pipeline: add mempool object for pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 23/49] ip_pipeline: add link object Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 24/49] ip_pipeline: add software queue object Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 25/49] ip_pipeline: add traffic manager object Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 26/49] ip_pipeline: add tap object Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 27/49] ip_pipeline: add kni object Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 28/49] ip_pipeline: add action profile object Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 29/49] ip_pipeline: add pipeline object Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 30/49] ip_pipeline: add threads Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 31/49] ip_pipeline: add thread runtime Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 32/49] ip_pipeline: add cli to enable and disable pipeline Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 33/49] ip_pipeline: add cli to enable and disable pipeline port Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 34/49] ip_pipeline: add cli to read pipeline port and table stats Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 35/49] ip_pipeline: add cli for pipeline table entry Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 36/49] ip_pipeline: add cli to delete " Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 37/49] ip_pipeline: add cli for bulk entries to pipeline table Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 38/49] ip_pipeline: add cli to read pipeline table entry stats Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 39/49] ip_pipeline: add cli to configure meter profile Jasvinder Singh
2018-03-29 18:31             ` [dpdk-dev] [PATCH v4 40/49] ip_pipeline: add cli to read meter stats Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 41/49] ip_pipeline: add cli to update dscp table Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 42/49] ip_pipeline: add cli to read ttl stats Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 43/49] ip_pipeline: add cli for load balance action Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 44/49] ip_pipeline: add l2fwd example Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 45/49] ip_pipeline: add KNI port example Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 46/49] ip_pipeline: add TAP " Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 47/49] ip_pipeline: add route example Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 48/49] ip_pipeline: add firewall example Jasvinder Singh
2018-03-29 18:32             ` [dpdk-dev] [PATCH v4 49/49] ip_pipeline: add flow classification example Jasvinder Singh
2018-03-30 12:44             ` [dpdk-dev] [PATCH v4 00/49] ip_pipeline: refactoring Dumitrescu, Cristian
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 02/44] pipeline: get pipeline table action params Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 03/44] pipeline: add traffic metering action Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 04/44] pipeline: add traffic manager action Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 05/44] pipeline: add packet encapsulation action Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 06/44] pipeline: add nat action Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 07/44] pipeline: add ttl update action Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 08/44] pipeline: add statistics read action Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 09/44] pipeline: add timestamp action Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 10/44] ip_pipeline: remove passthrough pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 11/44] ip_pipeline: remove routing pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 12/44] ip_pipeline: remove flow classification pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 13/44] ip_pipeline: remove flow actions pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 14/44] ip_pipeline: remove firewall pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 15/44] ip_pipeline: remove master pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 16/44] ip_pipeline: remove config Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 17/44] ip_pipeline: rework and improvements Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 18/44] ip_pipeline: add cli interface Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 19/44] ip_pipeline: add mempool object for pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 20/44] ip_pipeline: add link object Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 21/44] ip_pipeline: add software queue object Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 22/44] ip_pipeline: add traffic manager object Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 23/44] ip_pipeline: add tap object Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 24/44] ip_pipeline: add kni object Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 25/44] ip_pipeline: add action profile object Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 26/44] ip_pipeline: add pipeline object Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 27/44] ip_pipeline: add threads Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 28/44] ip_pipeline: add thread runtime Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 29/44] ip_pipeline: add cli to enable and disable pipeline Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 30/44] ip_pipeline: add cli to enable and disable pipeline port Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 31/44] ip_pipeline: add cli to read pipeline port and table stats Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 32/44] ip_pipeline: add cli for pipeline table entries Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 33/44] ip_pipeline: add cli to delete pipeline table entry Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 34/44] ip_pipeline: add cli to read pipeline table entry stats Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 35/44] ip_pipeline: add cli to configure meter profile Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 36/44] ip_pipeline: add cli to read meter stats Jasvinder Singh
2018-03-16 17:58         ` [dpdk-dev] [PATCH v3 37/44] ip_pipeline: add cli to update dscp table Jasvinder Singh
2018-03-16 17:59         ` [dpdk-dev] [PATCH v3 38/44] ip_pipeline: add cli to read ttl stats Jasvinder Singh
2018-03-16 17:59         ` [dpdk-dev] [PATCH v3 39/44] ip_pipeline: add l2fwd example Jasvinder Singh
2018-03-16 17:59         ` [dpdk-dev] [PATCH v3 40/44] ip_pipeline: add KNI port example Jasvinder Singh
2018-03-16 17:59         ` [dpdk-dev] [PATCH v3 41/44] ip_pipeline: add TAP " Jasvinder Singh
2018-03-16 17:59         ` [dpdk-dev] [PATCH v3 42/44] ip_pipeline: add route example Jasvinder Singh
2018-03-16 17:59         ` [dpdk-dev] [PATCH v3 43/44] ip_pipeline: add firewall example Jasvinder Singh
2018-03-16 17:59         ` [dpdk-dev] [PATCH v3 44/44] ip_pipeline: add flow classification example Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 02/44] pipeline: get pipeline table action params Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 03/44] pipeline: add traffic metering action Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 04/44] pipeline: add traffic manager action Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 05/44] pipeline: add packet encapsulation action Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 06/44] pipeline: add nat action Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 07/44] pipeline: add ttl update action Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 08/44] pipeline: add statistics read action Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 09/44] pipeline: add timestamp action Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 10/44] ip_pipeline: remove passthrough pipeline Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 11/44] ip_pipeline: remove routing pipeline Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 12/44] ip_pipeline: remove flow classification pipeline Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 13/44] ip_pipeline: remove flow actions pipeline Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 14/44] ip_pipeline: remove firewall pipeline Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 15/44] ip_pipeline: remove master pipeline Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 16/44] ip_pipeline: remove config Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 17/44] ip_pipeline: rework and improvements Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 18/44] ip_pipeline: add cli interface Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 19/44] ip_pipeline: add mempool object for pipeline Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 20/44] ip_pipeline: add link object Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 21/44] ip_pipeline: add software queue object Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 22/44] ip_pipeline: add traffic manager object Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 23/44] ip_pipeline: add tap object Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 24/44] ip_pipeline: add kni object Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 25/44] ip_pipeline: add action profile object Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 26/44] ip_pipeline: add pipeline object Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 27/44] ip_pipeline: add threads Jasvinder Singh
2018-03-12 17:25     ` [dpdk-dev] [PATCH v2 28/44] ip_pipeline: add thread runtime Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 29/44] ip_pipeline: add cli to enable and disable pipeline Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 30/44] ip_pipeline: add cli to enable and disable pipeline port Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 31/44] ip_pipeline: add cli to read pipeline port and table stats Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 32/44] ip_pipeline: add cli for pipeline table entries Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 33/44] ip_pipeline: add cli to delete pipeline table entry Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 34/44] ip_pipeline: add cli to read pipeline table entry stats Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 35/44] ip_pipeline: add cli to configure meter profile Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 36/44] ip_pipeline: add cli to read meter stats Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 37/44] ip_pipeline: add cli to update dscp table Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 38/44] ip_pipeline: add cli to read ttl stats Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 39/44] ip_pipeline: add l2fwd example Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 40/44] ip_pipeline: add KNI port example Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 41/44] ip_pipeline: add TAP " Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 42/44] ip_pipeline: add route example Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 43/44] ip_pipeline: add firewall example Jasvinder Singh
2018-03-12 17:26     ` [dpdk-dev] [PATCH v2 44/44] ip_pipeline: add flow classification example Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 02/37] pipeline: get pipeline table action params Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 03/37] pipeline: add traffic metering action Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 04/37] pipeline: add traffic manager action Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 05/37] pipeline: add packet encapsulation action Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 06/37] pipeline: add nat action Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 07/37] pipeline: add ttl update action Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 08/37] pipeline: add statistics read action Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 09/37] pipeline: add timestamp action Jasvinder Singh
2018-03-09 18:23 ` [dpdk-dev] [PATCH 10/37] ip_pipeline: rework and improvements Jasvinder Singh
2018-03-09 18:24 ` Jasvinder Singh [this message]
2018-03-09 18:24 ` [dpdk-dev] [PATCH 12/37] ip_pipeline: add mempool object for pipeline Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 13/37] ip_pipeline: add link object Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 14/37] ip_pipeline: add software queue object Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 15/37] ip_pipeline: add traffic manager object Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 16/37] ip_pipeline: add tap object Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 17/37] ip_pipeline: add kni object Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 18/37] ip_pipeline: add action profile object Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 19/37] ip_pipeline: add pipeline object Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 20/37] ip_pipeline: add threads Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 21/37] ip_pipeline: add thread runtime Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 22/37] ip_pipeline: add cli to enable and disable pipeline Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 23/37] ip_pipeline: add cli to enable and disable pipeline port Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 24/37] ip_pipeline: add cli to read pipeline port and table stats Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 25/37] ip_pipeline: add cli for pipeline table entries Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 26/37] ip_pipeline: add cli to delete pipeline table entry Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 27/37] ip_pipeline: add cli to read pipeline table entry stats Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 28/37] ip_pipeline: add cli to configure meter profile Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 29/37] ip_pipeline: add cli to read meter stats Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 30/37] ip_pipeline: add cli to update dscp table Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 31/37] ip_pipeline: add cli to read ttl stats Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 32/37] ip_pipeline: add l2fwd example Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 33/37] ip_pipeline: add KNI port example Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 34/37] ip_pipeline: add TAP " Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 35/37] ip_pipeline: add route example Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 36/37] ip_pipeline: add firewall example Jasvinder Singh
2018-03-09 18:24 ` [dpdk-dev] [PATCH 37/37] ip_pipeline: add flow classification example Jasvinder Singh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180309182426.135278-12-jasvinder.singh@intel.com \
    --to=jasvinder.singh@intel.com \
    --cc=cristian.dumitrescu@intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).