From patchwork Sat Aug 28 07:56:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qiming Chen X-Patchwork-Id: 97503 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C87EDA0C5C; Sat, 28 Aug 2021 09:57:19 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 42F5840150; Sat, 28 Aug 2021 09:57:19 +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 4A3ED4003E for ; Sat, 28 Aug 2021 09:57:17 +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=Gj1en OVM3ZIwpW1Mxzew96KpeUuPfEOLwr1lZs1/gEQ=; b=HZwoOkd69mIle9CEWM+nP cI22s4ksThlpKOWc0N5KmrlAr7FX3mos4v7Snvg3KBPKS/YG4GEMbV0JtxAsRqbL Ffsj3pKMIUzlRc5PwgjVyvkm+oyTQPBGy1tkW/zXWtFRiy5rU7w30i28a1vFe6cC 1T3yn6VOXRywhp28Dx1WRc= Received: from localhost.localdomain (unknown [124.160.214.152]) by smtp5 (Coremail) with SMTP id HdxpCgBXDo9W7Clh7dTYBw--.11615S2; Sat, 28 Aug 2021 15:57:15 +0800 (CST) From: Qiming Chen To: dev@dpdk.org Cc: ferruh.yigit@intel.com, Qiming Chen Date: Sat, 28 Aug 2021 15:56:28 +0800 Message-Id: <20210828075628.1896-1-chenqiming_huawei@163.com> X-Mailer: git-send-email 2.30.1.windows.1 In-Reply-To: <20210828074947.1839-1-chenqiming_huawei@163.com> References: <20210828074947.1839-1-chenqiming_huawei@163.com> MIME-Version: 1.0 X-CM-TRANSID: HdxpCgBXDo9W7Clh7dTYBw--.11615S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxtryxWr43Zry3ZFWfZrWkZwb_yoWxAw47pF s8ta9ay3y8tws3W3Z2yan8Ca45Gws7tFW2vF9aya48Zw1rJryxWF1jka4Y9r1Fkryqgr15 Aan8Xa1kGr42qr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07b4PEfUUUUU= X-Originating-IP: [124.160.214.152] X-CM-SenderInfo: xfkh01xlpl0w5bkxt4lhl6il2tof0z/1tbiDhv8oFXl1KK39QAAsN Subject: [dpdk-dev] [PATCH v2] 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 --- v2: Clear coding style warning. --- drivers/net/pcap/pcap_ethdev.c | 88 +++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c index a8774b7a43..7dbdca7da7 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,15 @@ 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 +1447,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 +1497,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 +1604,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 +1661,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 "=");