From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mogw1121.ocn.ad.jp (mogw1121.ocn.ad.jp [153.149.229.22]) by dpdk.org (Postfix) with ESMTP id 82D011B759 for ; Wed, 31 Jan 2018 12:20:48 +0100 (CET) Received: from mf-smf-ucb023c2 (mf-smf-ucb023c2.ocn.ad.jp [153.153.66.143]) by mogw1121.ocn.ad.jp (Postfix) with ESMTP id D72B2400236; Wed, 31 Jan 2018 20:20:46 +0900 (JST) Received: from ntt.pod01.mv-mta-ucb020 ([153.149.142.83]) by mf-smf-ucb023c2 with ESMTP id gqRaeC20DtN2ugqRaeyMw8; Wed, 31 Jan 2018 20:20:46 +0900 Received: from smtp.ocn.ne.jp ([153.149.227.133]) by ntt.pod01.mv-mta-ucb020 with id 4zLm1x00B2tKTyH01zLmAa; Wed, 31 Jan 2018 11:20:46 +0000 Received: from mugwort.jp (p6535076-ipngn12202marunouchi.tokyo.ocn.ne.jp [118.22.122.76]) by smtp.ocn.ne.jp (Postfix) with ESMTPA; Wed, 31 Jan 2018 20:20:46 +0900 (JST) From: ogawa.yasufumi@lab.ntt.co.jp To: spp@dpdk.org, ferruh.yigit@intel.com, geminoa@juno.ocn.ne.jp Cc: ogawa.yasufumi@lab.ntt.co.jp, Naoki Takada Date: Wed, 31 Jan 2018 20:21:10 +0900 Message-Id: <20180131105606.1345-1-ogawa.yasufumi@lab.ntt.co.jp> X-Mailer: git-send-email 2.13.1 X-Account-Key: account3 X-UIDL: 8821.Jw9ikqULdRu0urQ16EhBQ4DeMT8= X-Mozilla-Status: 0001 Received: from mzcmta026.ocn.ad.jp (LHLO mzcmta026.ocn.ad.jp) (153.149.230.168) by mzcstore251.ocn.ad.jp with LMTP; Wed, 31 Jan 2018 19:55:36 +0900 (JST) Received: from mfgw692.ocn.ad.jp (mfgw692.ocn.ad.jp [153.153.63.102]) by mzcmta026.ocn.ad.jp (Postfix) with ESMTP id 96A89371801A for ; Wed, 31 Jan 2018 19:55:36 +0900 (JST) Received-SPF: softfail (mf-ofc-ucb069: domain of transitioning dose not designate client-ip as permitted sender) client-ip=118.23.109.108; envelope-from=; helo=mogw0134.ocn.ad.jp; Authentication-Results: mf-ofc-ucb069; spf=softfail smtp.mailfrom=ogawa.yasufumi@lab.ntt.co.jp Received: from mogw0134.ocn.ad.jp (mogw0134.ocn.ad.jp [118.23.109.108]) by mfgw692.ocn.ad.jp (Postfix) with ESMTP id B7110A8028A for ; Wed, 31 Jan 2018 19:55:35 +0900 (JST) Received: from mf-smf-ucb021c3 (mf-smf-ucb021c3.ocn.ad.jp [153.153.66.138]) by mogw0134.ocn.ad.jp (Postfix) with ESMTP id 886EB120253; Wed, 31 Jan 2018 19:55:35 +0900 (JST) Received: from ntt.pod01.mv-mta-ucb020 ([153.149.142.83]) by mf-smf-ucb021c3 with ESMTP id gq3Aex4YHKNb7gq3Dee9IH; Wed, 31 Jan 2018 19:55:35 +0900 Received: from smtp.ocn.ne.jp ([153.149.227.166]) by ntt.pod01.mv-mta-ucb020 with id 4yvb1x0023c2f7501yvb1o; Wed, 31 Jan 2018 10:55:35 +0000 Received: from mugwort.jp (p6535076-ipngn12202marunouchi.tokyo.ocn.ne.jp [118.22.122.76]) by smtp.ocn.ne.jp (Postfix) with ESMTPA; Wed, 31 Jan 2018 19:55:35 +0900 (JST) X-Mailer: git-send-email 2.13.1 Subject: [spp] [PATCH 1/4] spp_nfv: add pcap pmd X-BeenThere: spp@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Soft Patch Panel List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 Jan 2018 11:20:49 -0000 From: ogawa.yasufumi@lab.ntt.co.jp From: Yasufumi Ogawa 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 Signed-off-by: Naoki Takada --- 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