From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 38623A0C5C; Sat, 28 Aug 2021 09:50:37 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AD30740150; Sat, 28 Aug 2021 09:50:36 +0200 (CEST) Received: from mail-m975.mail.163.com (mail-m975.mail.163.com [123.126.97.5]) by mails.dpdk.org (Postfix) with ESMTP id D2E9E4003E for ; Sat, 28 Aug 2021 09:50:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=DrMnU C5MoOdUgFrhi4gtfxa8/00Hx+Z1N70Rta4viEs=; b=OqqKd7PZNxC6AvcLae8/L Wkd7xfQncD7tYIt+6fiTIjYFMh0XE4PeRgMgvRGMkdWNb713YKBFPbcerxixremb ZPrBqDxKtsRV83OWH7KoQ4lD/P5RL6mvQMqv3dAkfqoR6OVXqLC3ZefkUsNGWc+R FpvC8nlMpVKmaNHHOafDTk= Received: from localhost.localdomain (unknown [124.160.214.152]) by smtp5 (Coremail) with SMTP id HdxpCgCHM17F6ilhJhPYBw--.11157S2; Sat, 28 Aug 2021 15:50:31 +0800 (CST) From: Qiming Chen To: dev@dpdk.org Cc: ferruh.yigit@intel.com, Qiming Chen Date: Sat, 28 Aug 2021 15:49:47 +0800 Message-Id: <20210828074947.1839-1-chenqiming_huawei@163.com> X-Mailer: git-send-email 2.30.1.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: HdxpCgCHM17F6ilhJhPYBw--.11157S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxtryxWr43Zry3ZFWfZrWkZwb_yoWxAFyfpF s8ta9ay3y8tws3Wwn7tan8Cay5Cws7tFW7ZF9Ika48Zw1rJryxWF12ka4Y9r1Fkryqgr1U Aan8Xa1kGr42qr7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07b4Ma8UUUUU= X-Originating-IP: [124.160.214.152] X-CM-SenderInfo: xfkh01xlpl0w5bkxt4lhl6il2tof0z/xtbBZAf8oFQHOSJPHAAAsk Subject: [dpdk-dev] [PATCH] net/pcap: support buffer size parameter X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When the pcap port is probed, the size of the pcap message buffer is not set, the default is 2M, and then this value has a great impact on the message forwarding performance. Therefore, parameters are provided for users to set. In order to pass the buffer size parameter parsed by the probe to the start function, the buf_size member variable is added to the struct pmd_process_private structure. At the same time, for the uniform code style, the buf_size member variable is also added to the struct pmd_devargs structure, which is used by the probe function. Signed-off-by: Qiming Chen --- drivers/net/pcap/pcap_ethdev.c | 89 +++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 22 deletions(-) diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c index a8774b7a43..d3eb90a3f8 100644 --- a/drivers/net/pcap/pcap_ethdev.c +++ b/drivers/net/pcap/pcap_ethdev.c @@ -33,6 +33,7 @@ #define ETH_PCAP_IFACE_ARG "iface" #define ETH_PCAP_PHY_MAC_ARG "phy_mac" #define ETH_PCAP_INFINITE_RX_ARG "infinite_rx" +#define ETH_PCAP_BUF_SIZE_ARG "buf_size" #define ETH_PCAP_ARG_MAXLEN 64 @@ -98,6 +99,7 @@ struct pmd_process_private { pcap_t *rx_pcap[RTE_PMD_PCAP_MAX_QUEUES]; pcap_t *tx_pcap[RTE_PMD_PCAP_MAX_QUEUES]; pcap_dumper_t *tx_dumper[RTE_PMD_PCAP_MAX_QUEUES]; + int buf_size; }; struct pmd_devargs { @@ -109,6 +111,7 @@ struct pmd_devargs { const char *type; } queue[RTE_PMD_PCAP_MAX_QUEUES]; int phy_mac; + int buf_size; }; struct pmd_devargs_all { @@ -131,6 +134,7 @@ static const char *valid_arguments[] = { ETH_PCAP_IFACE_ARG, ETH_PCAP_PHY_MAC_ARG, ETH_PCAP_INFINITE_RX_ARG, + ETH_PCAP_BUF_SIZE_ARG, NULL }; @@ -504,30 +508,51 @@ eth_pcap_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) return i; } -/* - * pcap_open_live wrapper function - */ -static inline int -open_iface_live(const char *iface, pcap_t **pcap) { - *pcap = pcap_open_live(iface, RTE_ETH_PCAP_SNAPLEN, - RTE_ETH_PCAP_PROMISC, RTE_ETH_PCAP_TIMEOUT, errbuf); +static int +open_single_iface(const char *iface, int buf_size, pcap_t **pcap) +{ + pcap_t *p = NULL; + int ret; - if (*pcap == NULL) { - PMD_LOG(ERR, "Couldn't open %s: %s", iface, errbuf); + p = pcap_create(iface, errbuf); + if (p == NULL) { + PMD_LOG(ERR, "Couldn't create %s pcap", iface); return -1; } - return 0; -} + ret = pcap_set_snaplen(p, RTE_ETH_PCAP_SNAPLEN); + if (ret < 0) { + PMD_LOG(ERR, "Couldn't set %s pcap snaplen", iface); + return -1; + } -static int -open_single_iface(const char *iface, pcap_t **pcap) -{ - if (open_iface_live(iface, pcap) < 0) { - PMD_LOG(ERR, "Couldn't open interface %s", iface); + ret = pcap_set_promisc(p, RTE_ETH_PCAP_PROMISC); + if (ret < 0) { + PMD_LOG(ERR, "Couldn't set %s pcap promisc", iface); + return -1; + } + + ret = pcap_set_timeout(p, RTE_ETH_PCAP_TIMEOUT); + if (ret < 0) { + PMD_LOG(ERR, "Couldn't set %s pcap timeout", iface); + return -1; + } + + if (buf_size != 0) { + ret = pcap_set_buffer_size(p, buf_size); + if (ret < 0) { + PMD_LOG(ERR, "Couldn't set %s pcap buffer size(%d)", iface, buf_size); + return -1; + } + } + + ret = pcap_activate(p); + if (ret < 0) { + PMD_LOG(ERR, "Couldn't activate %s pcap", iface); return -1; } + *pcap = p; return 0; } @@ -608,7 +633,7 @@ eth_dev_start(struct rte_eth_dev *dev) if (!pp->tx_pcap[0] && strcmp(tx->type, ETH_PCAP_IFACE_ARG) == 0) { - if (open_single_iface(tx->name, &pp->tx_pcap[0]) < 0) + if (open_single_iface(tx->name, pp->buf_size, &pp->tx_pcap[0]) < 0) return -1; pp->rx_pcap[0] = pp->tx_pcap[0]; } @@ -627,7 +652,7 @@ eth_dev_start(struct rte_eth_dev *dev) return -1; } else if (!pp->tx_pcap[i] && strcmp(tx->type, ETH_PCAP_TX_IFACE_ARG) == 0) { - if (open_single_iface(tx->name, &pp->tx_pcap[i]) < 0) + if (open_single_iface(tx->name, pp->buf_size, &pp->tx_pcap[i]) < 0) return -1; } } @@ -643,7 +668,7 @@ eth_dev_start(struct rte_eth_dev *dev) if (open_single_rx_pcap(rx->name, &pp->rx_pcap[i]) < 0) return -1; } else if (strcmp(rx->type, ETH_PCAP_RX_IFACE_ARG) == 0) { - if (open_single_iface(rx->name, &pp->rx_pcap[i]) < 0) + if (open_single_iface(rx->name, pp->buf_size, &pp->rx_pcap[i]) < 0) return -1; } } @@ -1072,7 +1097,7 @@ open_rx_tx_iface(const char *key, const char *value, void *extra_args) struct pmd_devargs *tx = extra_args; pcap_t *pcap = NULL; - if (open_single_iface(iface, &pcap) < 0) + if (open_single_iface(iface, tx->buf_size, &pcap) < 0) return -1; tx->queue[0].pcap = pcap; @@ -1104,7 +1129,7 @@ open_iface(const char *key, const char *value, void *extra_args) struct pmd_devargs *pmd = extra_args; pcap_t *pcap = NULL; - if (open_single_iface(iface, &pcap) < 0) + if (open_single_iface(iface, pmd->buf_size, &pcap) < 0) return -1; if (add_queue(pmd, iface, key, pcap, NULL) < 0) { pcap_close(pcap); @@ -1154,6 +1179,16 @@ open_tx_iface(const char *key, const char *value, void *extra_args) return open_iface(key, value, extra_args); } +static int +select_buf_size(const char *key __rte_unused, const char *value, + void *extra_args) +{ + if (extra_args) { + *(int *)extra_args = atoi(value); + } + return 0; +} + static int select_phy_mac(const char *key __rte_unused, const char *value, void *extra_args) @@ -1413,6 +1448,13 @@ pmd_pcap_probe(struct rte_vdev_device *dev) return -1; } + if (rte_kvargs_count(kvlist, ETH_PCAP_BUF_SIZE_ARG) == 1) { + ret = rte_kvargs_process(kvlist, ETH_PCAP_BUF_SIZE_ARG, + &select_buf_size, &pcaps.buf_size); + if (ret < 0) + goto free_kvlist; + } + /* * If iface argument is passed we open the NICs and use them for * reading / writing @@ -1456,6 +1498,7 @@ pmd_pcap_probe(struct rte_vdev_device *dev) devargs_all.is_tx_iface = rte_kvargs_count(kvlist, ETH_PCAP_TX_IFACE_ARG) ? 1 : 0; dumpers.num_of_queue = 0; + dumpers.buf_size = pcaps.buf_size; if (devargs_all.is_rx_pcap) { /* @@ -1562,6 +1605,7 @@ pmd_pcap_probe(struct rte_vdev_device *dev) pp->tx_dumper[i] = dumpers.queue[i].dumper; pp->tx_pcap[i] = dumpers.queue[i].pcap; } + pp->buf_size =pcaps.buf_size; eth_dev->process_private = pp; eth_dev->rx_pkt_burst = eth_pcap_rx; @@ -1618,4 +1662,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_pcap, ETH_PCAP_TX_IFACE_ARG "= " ETH_PCAP_IFACE_ARG "= " ETH_PCAP_PHY_MAC_ARG "=" - ETH_PCAP_INFINITE_RX_ARG "=<0|1>"); + ETH_PCAP_INFINITE_RX_ARG "=<0|1>" + ETH_PCAP_BUF_SIZE_ARG "="); -- 2.30.1.windows.1