Soft Patch Panel
 help / color / mirror / Atom feed
* [spp] [PATCH 1/4] spp_nfv: add pcap pmd
@ 2018-01-31 11:21 ogawa.yasufumi
  2018-01-31 11:21 ` [spp] [PATCH 2/4] spp: add pcap pmd support ogawa.yasufumi
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: ogawa.yasufumi @ 2018-01-31 11:21 UTC (permalink / raw)
  To: spp, ferruh.yigit, geminoa; +Cc: ogawa.yasufumi, Naoki Takada

From: ogawa.yasufumi@lab.ntt.co.jp

From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>

Add libpcap-based PMD[1] support to read and write packets from files
on host. As ring or vhost PMD, pcap PMD is created from add_pcap_pmd().
Pcap device is created as '/tmp/rx_*.pcap' and '/tmp/tx_*.pcap' from
rte_eth_dev_attach().

[1] https://dpdk.org/doc/guides/nics/pcap_ring.html

Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
Signed-off-by: Naoki Takada <takada.naoki@lab.ntt.co.jp>
---
 src/nfv/nfv.c       | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/shared/common.c |  5 ++++
 src/shared/common.h | 10 +++++++
 3 files changed, 99 insertions(+), 1 deletion(-)

diff --git a/src/nfv/nfv.c b/src/nfv/nfv.c
index fd82690..c1a48e9 100644
--- a/src/nfv/nfv.c
+++ b/src/nfv/nfv.c
@@ -346,7 +346,6 @@ do_del(char *token_list[], int max_token)
 		if (port_id < 0)
 			return -1;
 
-
 	} else if (!strcmp(token_list[1], "ring")) {
 		char name[RTE_ETH_NAME_MAX_LEN];
 
@@ -358,6 +357,18 @@ do_del(char *token_list[], int max_token)
 			return -1;
 
 		rte_eth_dev_detach(port_id, name);
+
+	} else if (!strcmp(token_list[1], "pcap")) {
+		char name[RTE_ETH_NAME_MAX_LEN];
+
+		if (spp_atoi(token_list[2], &id) < 0)
+			return 0;
+
+		port_id = find_port_id(id, PCAP);
+		if (port_id < 0)
+			return -1;
+
+		rte_eth_dev_detach(port_id, name);
 	}
 
 	forward_array_remove(port_id);
@@ -484,6 +495,71 @@ add_vhost_pmd(int index)
 }
 
 static int
+add_pcap_pmd(int index)
+{
+	struct rte_eth_conf port_conf = {
+		.rxmode = { .max_rx_pkt_len = ETHER_MAX_LEN }
+	};
+
+	struct rte_mempool *mp;
+	const char *name;
+	char devargs[256];
+	uint16_t pcap_pmd_port_id;
+	uint16_t nr_queues = 1;
+
+	int ret;
+
+	mp = rte_mempool_lookup(PKTMBUF_POOL_NAME);
+	if (mp == NULL)
+		rte_exit(EXIT_FAILURE, "Cannon get mempool for mbuf\n");
+
+	name = get_pcap_pmd_name(index);
+	sprintf(devargs,
+		"%s,rx_pcap=/tmp/rx_%d.pcap,tx_pcap=/tmp/tx_%d.pcap",
+		name, index, index);
+	ret = rte_eth_dev_attach(devargs, &pcap_pmd_port_id);
+
+	if (ret < 0)
+		return ret;
+
+	ret = rte_eth_dev_configure(
+			pcap_pmd_port_id, nr_queues, nr_queues, &port_conf);
+
+	if (ret < 0)
+		return ret;
+
+	/* Allocate and set up 1 RX queue per Ethernet port. */
+	uint16_t q;
+	for (q = 0; q < nr_queues; q++) {
+		ret = rte_eth_rx_queue_setup(
+				pcap_pmd_port_id, q, NR_DESCS,
+				rte_eth_dev_socket_id(pcap_pmd_port_id),
+				NULL, mp);
+		if (ret < 0)
+			return ret;
+	}
+
+	/* Allocate and set up 1 TX queue per Ethernet port. */
+	for (q = 0; q < nr_queues; q++) {
+		ret = rte_eth_tx_queue_setup(
+				pcap_pmd_port_id, q, NR_DESCS,
+				rte_eth_dev_socket_id(pcap_pmd_port_id),
+				NULL);
+		if (ret < 0)
+			return ret;
+	}
+
+	ret = rte_eth_dev_start(pcap_pmd_port_id);
+
+	if (ret < 0)
+		return ret;
+
+	RTE_LOG(DEBUG, APP, "pcap port id %d\n", pcap_pmd_port_id);
+
+	return pcap_pmd_port_id;
+}
+
+static int
 do_add(char *token_list[], int max_token)
 {
 	enum port_type type = UNDEF;
@@ -506,6 +582,13 @@ do_add(char *token_list[], int max_token)
 
 		type = RING;
 		port_id = add_ring_pmd(id);
+
+	} else if (!strcmp(token_list[1], "pcap")) {
+		if (spp_atoi(token_list[2], &id) < 0)
+			return 0;
+
+		type = PCAP;
+		port_id = add_pcap_pmd(id);
 	}
 
 	if (port_id < 0)
diff --git a/src/shared/common.c b/src/shared/common.c
index 5b87385..c577d12 100644
--- a/src/shared/common.c
+++ b/src/shared/common.c
@@ -297,6 +297,11 @@ print_active_ports(char *str, uint16_t client_id,
 			sprintf(str + strlen(str), "VHOST(%u),",
 				port_map[i].id);
 			break;
+		case PCAP:
+			RTE_LOG(INFO, APP, "Type: PCAP\n");
+			sprintf(str + strlen(str), "PCAP(%u),",
+					port_map[i].id);
+			break;
 		case UNDEF:
 			RTE_LOG(INFO, APP, "Type: UDF\n");
 			sprintf(str + strlen(str), "UDF,");
diff --git a/src/shared/common.h b/src/shared/common.h
index 5defbb0..c5f39d1 100644
--- a/src/shared/common.h
+++ b/src/shared/common.h
@@ -118,6 +118,7 @@ enum port_type {
 	PHY,
 	RING,
 	VHOST,
+	PCAP,
 	UNDEF,
 };
 
@@ -143,6 +144,7 @@ struct port {
 #define MZ_PORT_INFO "MProc_port_info"
 #define VHOST_BACKEND_NAME "eth_vhost%u"
 #define VHOST_IFACE_NAME "/tmp/sock%u"
+#define PCAP_PMD_DEV_NAME "eth_pcap%u"
 
 /*
  * Given the rx queue name template above, get the queue name
@@ -186,6 +188,14 @@ get_vhost_iface_name(unsigned int id)
 	return buffer;
 }
 
+static inline const char *
+get_pcap_pmd_name(int id)
+{
+	static char buffer[sizeof(PCAP_PMD_DEV_NAME) + 2];
+	snprintf(buffer, sizeof(buffer) - 1, PCAP_PMD_DEV_NAME, id);
+	return buffer;
+}
+
 void check_all_ports_link_status(struct port_info *ports, uint16_t port_num,
 		uint32_t port_mask);
 
-- 
2.13.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [spp] [PATCH 2/4] spp: add pcap pmd support
  2018-01-31 11:21 [spp] [PATCH 1/4] spp_nfv: add pcap pmd ogawa.yasufumi
@ 2018-01-31 11:21 ` ogawa.yasufumi
  2018-01-31 11:21 ` [spp] [PATCH 3/4] spp_nfv: add null pmd ogawa.yasufumi
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: ogawa.yasufumi @ 2018-01-31 11:21 UTC (permalink / raw)
  To: spp, ferruh.yigit, geminoa; +Cc: ogawa.yasufumi, Naoki Takada

From: ogawa.yasufumi@lab.ntt.co.jp

From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>

Add pcap for add/del commands and complementation to SPP controller.

Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
Signed-off-by: Naoki Takada <takada.naoki@lab.ntt.co.jp>
---
 src/spp.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/spp.py b/src/spp.py
index e7ad43b..f5d53de 100755
--- a/src/spp.py
+++ b/src/spp.py
@@ -362,7 +362,7 @@ class Shell(cmd.Cmd):
 
     PRI_CMDS = ['status', 'exit', 'clear']
     SEC_CMDS = ['status', 'exit', 'forward', 'stop', 'add', 'patch', 'del']
-    SEC_SUBCMDS = ['vhost', 'ring']
+    SEC_SUBCMDS = ['vhost', 'ring', 'pcap']
     BYE_CMDS = ['sec', 'all']
 
     def close_all_secondary(self):
@@ -454,7 +454,7 @@ class Shell(cmd.Cmd):
         level1 = ['status', 'exit', 'forward', 'stop']
         level2 = ['add', 'patch', 'del']
         patch_args = ['reset']
-        add_del_args = ['ring', 'vhost']
+        add_del_args = ['ring', 'vhost', 'pcap']
         cmdlist = cmds.split(' ')
         valid = 0
 
-- 
2.13.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [spp] [PATCH 3/4] spp_nfv: add null pmd
  2018-01-31 11:21 [spp] [PATCH 1/4] spp_nfv: add pcap pmd ogawa.yasufumi
  2018-01-31 11:21 ` [spp] [PATCH 2/4] spp: add pcap pmd support ogawa.yasufumi
@ 2018-01-31 11:21 ` ogawa.yasufumi
  2018-01-31 11:21 ` [spp] [PATCH 4/4] spp: add null pmd support ogawa.yasufumi
  2018-02-01 13:09 ` [spp] [PATCH 1/4] spp_nfv: add pcap pmd Ferruh Yigit
  3 siblings, 0 replies; 5+ messages in thread
From: ogawa.yasufumi @ 2018-01-31 11:21 UTC (permalink / raw)
  To: spp, ferruh.yigit, geminoa; +Cc: ogawa.yasufumi, Naoki Takada

From: ogawa.yasufumi@lab.ntt.co.jp

From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>

Null PMD is a virtual device for DPDK performance test[1]. It provides
'/dev/null' like PMD which means that it is able to send/receive
packets no limitation.

[1] https://dpdk.org/ml/archives/dev/2015-February/012482.html

Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
Signed-off-by: Naoki Takada <takada.naoki@lab.ntt.co.jp>
---
 src/nfv/nfv.c       | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/shared/common.c |  5 ++++
 src/shared/common.h | 10 +++++++
 3 files changed, 97 insertions(+)

diff --git a/src/nfv/nfv.c b/src/nfv/nfv.c
index c1a48e9..a3e04bf 100644
--- a/src/nfv/nfv.c
+++ b/src/nfv/nfv.c
@@ -369,6 +369,19 @@ do_del(char *token_list[], int max_token)
 			return -1;
 
 		rte_eth_dev_detach(port_id, name);
+
+	} else if (!strcmp(token_list[1], "nullpmd")) {
+		char name[RTE_ETH_NAME_MAX_LEN];
+
+		if (spp_atoi(token_list[2], &id) < 0)
+			return 0;
+
+		port_id = find_port_id(id, NULLPMD);
+		if (port_id < 0)
+			return -1;
+
+		rte_eth_dev_detach(port_id, name);
+
 	}
 
 	forward_array_remove(port_id);
@@ -560,6 +573,68 @@ add_pcap_pmd(int index)
 }
 
 static int
+add_null_pmd(int index)
+{
+	struct rte_eth_conf port_conf = {
+			.rxmode = { .max_rx_pkt_len = ETHER_MAX_LEN }
+	};
+
+	struct rte_mempool *mp;
+	const char *name;
+	char devargs[64];
+	uint16_t null_pmd_port_id;
+	uint16_t nr_queues = 1;
+
+	int ret;
+
+	mp = rte_mempool_lookup(PKTMBUF_POOL_NAME);
+	if (mp == NULL)
+		rte_exit(EXIT_FAILURE, "Cannon get mempool for mbuf\n");
+
+	name = get_null_pmd_name(index);
+	sprintf(devargs, "%s", name);
+	ret = rte_eth_dev_attach(devargs, &null_pmd_port_id);
+	if (ret < 0)
+		return ret;
+
+	ret = rte_eth_dev_configure(
+			null_pmd_port_id, nr_queues, nr_queues,
+			&port_conf);
+	if (ret < 0)
+		return ret;
+
+	/* Allocate and set up 1 RX queue per Ethernet port. */
+	uint16_t q;
+	for (q = 0; q < nr_queues; q++) {
+		ret = rte_eth_rx_queue_setup(
+				null_pmd_port_id, q, NR_DESCS,
+				rte_eth_dev_socket_id(
+					null_pmd_port_id), NULL, mp);
+		if (ret < 0)
+			return ret;
+	}
+
+	/* Allocate and set up 1 TX queue per Ethernet port. */
+	for (q = 0; q < nr_queues; q++) {
+		ret = rte_eth_tx_queue_setup(
+				null_pmd_port_id, q, NR_DESCS,
+				rte_eth_dev_socket_id(
+					null_pmd_port_id),
+				NULL);
+		if (ret < 0)
+			return ret;
+	}
+
+	ret = rte_eth_dev_start(null_pmd_port_id);
+	if (ret < 0)
+		return ret;
+
+	RTE_LOG(DEBUG, APP, "null port id %d\n", null_pmd_port_id);
+
+	return null_pmd_port_id;
+}
+
+static int
 do_add(char *token_list[], int max_token)
 {
 	enum port_type type = UNDEF;
@@ -589,6 +664,13 @@ do_add(char *token_list[], int max_token)
 
 		type = PCAP;
 		port_id = add_pcap_pmd(id);
+
+	} else if (!strcmp(token_list[1], "nullpmd")) {
+		if (spp_atoi(token_list[2], &id) < 0)
+			return 0;
+
+		type = NULLPMD;
+		port_id = add_null_pmd(id);
 	}
 
 	if (port_id < 0)
diff --git a/src/shared/common.c b/src/shared/common.c
index c577d12..4176b6d 100644
--- a/src/shared/common.c
+++ b/src/shared/common.c
@@ -302,6 +302,11 @@ print_active_ports(char *str, uint16_t client_id,
 			sprintf(str + strlen(str), "PCAP(%u),",
 					port_map[i].id);
 			break;
+		case NULLPMD:
+			RTE_LOG(INFO, APP, "Type: NULLPMD\n");
+			sprintf(str + strlen(str), "NULLPMD(%u),",
+					port_map[i].id);
+			break;
 		case UNDEF:
 			RTE_LOG(INFO, APP, "Type: UDF\n");
 			sprintf(str + strlen(str), "UDF,");
diff --git a/src/shared/common.h b/src/shared/common.h
index c5f39d1..f0d68e5 100644
--- a/src/shared/common.h
+++ b/src/shared/common.h
@@ -119,6 +119,7 @@ enum port_type {
 	RING,
 	VHOST,
 	PCAP,
+	NULLPMD,
 	UNDEF,
 };
 
@@ -145,6 +146,7 @@ struct port {
 #define VHOST_BACKEND_NAME "eth_vhost%u"
 #define VHOST_IFACE_NAME "/tmp/sock%u"
 #define PCAP_PMD_DEV_NAME "eth_pcap%u"
+#define NULL_PMD_DEV_NAME "eth_null%u"
 
 /*
  * Given the rx queue name template above, get the queue name
@@ -196,6 +198,14 @@ get_pcap_pmd_name(int id)
 	return buffer;
 }
 
+static inline const char *
+get_null_pmd_name(int id)
+{
+	static char buffer[sizeof(NULL_PMD_DEV_NAME) + 2];
+	snprintf(buffer, sizeof(buffer) - 1, NULL_PMD_DEV_NAME, id);
+	return buffer;
+}
+
 void check_all_ports_link_status(struct port_info *ports, uint16_t port_num,
 		uint32_t port_mask);
 
-- 
2.13.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [spp] [PATCH 4/4] spp: add null pmd support
  2018-01-31 11:21 [spp] [PATCH 1/4] spp_nfv: add pcap pmd ogawa.yasufumi
  2018-01-31 11:21 ` [spp] [PATCH 2/4] spp: add pcap pmd support ogawa.yasufumi
  2018-01-31 11:21 ` [spp] [PATCH 3/4] spp_nfv: add null pmd ogawa.yasufumi
@ 2018-01-31 11:21 ` ogawa.yasufumi
  2018-02-01 13:09 ` [spp] [PATCH 1/4] spp_nfv: add pcap pmd Ferruh Yigit
  3 siblings, 0 replies; 5+ messages in thread
From: ogawa.yasufumi @ 2018-01-31 11:21 UTC (permalink / raw)
  To: spp, ferruh.yigit, geminoa; +Cc: ogawa.yasufumi, Naoki Takada

From: ogawa.yasufumi@lab.ntt.co.jp

From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>

Add nullpmd for add/del commands and complementation to SPP controller.

Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
Signed-off-by: Naoki Takada <takada.naoki@lab.ntt.co.jp>
---
 src/spp.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/spp.py b/src/spp.py
index f5d53de..3796670 100755
--- a/src/spp.py
+++ b/src/spp.py
@@ -362,7 +362,7 @@ class Shell(cmd.Cmd):
 
     PRI_CMDS = ['status', 'exit', 'clear']
     SEC_CMDS = ['status', 'exit', 'forward', 'stop', 'add', 'patch', 'del']
-    SEC_SUBCMDS = ['vhost', 'ring', 'pcap']
+    SEC_SUBCMDS = ['vhost', 'ring', 'pcap', 'nullpmd']
     BYE_CMDS = ['sec', 'all']
 
     def close_all_secondary(self):
@@ -454,7 +454,7 @@ class Shell(cmd.Cmd):
         level1 = ['status', 'exit', 'forward', 'stop']
         level2 = ['add', 'patch', 'del']
         patch_args = ['reset']
-        add_del_args = ['ring', 'vhost', 'pcap']
+        add_del_args = ['ring', 'vhost', 'pcap', 'nullpmd']
         cmdlist = cmds.split(' ')
         valid = 0
 
-- 
2.13.1

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [spp] [PATCH 1/4] spp_nfv: add pcap pmd
  2018-01-31 11:21 [spp] [PATCH 1/4] spp_nfv: add pcap pmd ogawa.yasufumi
                   ` (2 preceding siblings ...)
  2018-01-31 11:21 ` [spp] [PATCH 4/4] spp: add null pmd support ogawa.yasufumi
@ 2018-02-01 13:09 ` Ferruh Yigit
  3 siblings, 0 replies; 5+ messages in thread
From: Ferruh Yigit @ 2018-02-01 13:09 UTC (permalink / raw)
  To: ogawa.yasufumi, spp, geminoa; +Cc: Naoki Takada

On 1/31/2018 11:21 AM, ogawa.yasufumi@lab.ntt.co.jp wrote:
> From: ogawa.yasufumi@lab.ntt.co.jp
> 
> From: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
> 
> Add libpcap-based PMD[1] support to read and write packets from files
> on host. As ring or vhost PMD, pcap PMD is created from add_pcap_pmd().
> Pcap device is created as '/tmp/rx_*.pcap' and '/tmp/tx_*.pcap' from
> rte_eth_dev_attach().
> 
> [1] https://dpdk.org/doc/guides/nics/pcap_ring.html
> 
> Signed-off-by: Yasufumi Ogawa <ogawa.yasufumi@lab.ntt.co.jp>
> Signed-off-by: Naoki Takada <takada.naoki@lab.ntt.co.jp>

I think it is good idea to add pcap and null support.

Series applied, thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-02-01 13:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-31 11:21 [spp] [PATCH 1/4] spp_nfv: add pcap pmd ogawa.yasufumi
2018-01-31 11:21 ` [spp] [PATCH 2/4] spp: add pcap pmd support ogawa.yasufumi
2018-01-31 11:21 ` [spp] [PATCH 3/4] spp_nfv: add null pmd ogawa.yasufumi
2018-01-31 11:21 ` [spp] [PATCH 4/4] spp: add null pmd support ogawa.yasufumi
2018-02-01 13:09 ` [spp] [PATCH 1/4] spp_nfv: add pcap pmd Ferruh Yigit

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).