From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtprelay06.ispgateway.de (smtprelay06.ispgateway.de [80.67.31.102]) by dpdk.org (Postfix) with ESMTP id 672185683 for ; Mon, 13 Jul 2015 16:54:51 +0200 (CEST) Received: from [87.172.131.115] (helo=localhost.localdomain) by smtprelay06.ispgateway.de with esmtpsa (TLSv1.2:AES128-SHA256:128) (Exim 4.84) (envelope-from ) id 1ZEf85-0002WN-E9; Mon, 13 Jul 2015 16:54:49 +0200 From: Klaus Degner To: dev@dpdk.org Date: Mon, 13 Jul 2015 16:54:22 +0200 Message-Id: <1436799262-91898-1-git-send-email-kd@allegro-packets.com> X-Mailer: git-send-email 2.4.5 In-Reply-To: <1435664375-25648-1-git-send-email-kd@allegro-packets.com> References: <1435664375-25648-1-git-send-email-kd@allegro-packets.com> X-Df-Sender: a2RAYWxsZWdyby1wYWNrZXRzLmNvbQ== Subject: [dpdk-dev] [PATCH v5] pcap: add support for rx and tx byte counters X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jul 2015 14:54:51 -0000 Added RX and TX bytes counter support to the PCAP statistics. Added TX counter support for pcap dumper and interface functions. Renamed RX and TX packet counters for consistency. Signed-off-by: Klaus Degner --- drivers/net/pcap/rte_eth_pcap.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index 682628f..f2e4634 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -69,6 +69,7 @@ struct pcap_rx_queue { uint8_t in_port; struct rte_mempool *mb_pool; volatile unsigned long rx_pkts; + volatile unsigned long rx_bytes; volatile unsigned long err_pkts; char name[PATH_MAX]; char type[ETH_PCAP_ARG_MAXLEN]; @@ -78,6 +79,7 @@ struct pcap_tx_queue { pcap_dumper_t *dumper; pcap_t *pcap; volatile unsigned long tx_pkts; + volatile unsigned long tx_bytes; volatile unsigned long err_pkts; char name[PATH_MAX]; char type[ETH_PCAP_ARG_MAXLEN]; @@ -196,6 +198,7 @@ eth_pcap_rx(void *queue, struct pcap_rx_queue *pcap_q = queue; uint16_t num_rx = 0; uint16_t buf_size; + uint32_t rx_bytes = 0; if (unlikely(pcap_q->pcap == NULL || nb_pkts == 0)) return 0; @@ -235,8 +238,10 @@ eth_pcap_rx(void *queue, mbuf->port = pcap_q->in_port; bufs[num_rx] = mbuf; num_rx++; + rx_bytes += header.len; } pcap_q->rx_pkts += num_rx; + pcap_q->rx_bytes += rx_bytes; return num_rx; } @@ -263,6 +268,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf *mbuf; struct pcap_tx_queue *dumper_q = queue; uint16_t num_tx = 0; + uint32_t tx_bytes = 0; struct pcap_pkthdr header; if (dumper_q->dumper == NULL || nb_pkts == 0) @@ -297,6 +303,7 @@ eth_pcap_tx_dumper(void *queue, rte_pktmbuf_free(mbuf); num_tx++; + tx_bytes += mbuf->pkt_len; } /* @@ -306,6 +313,7 @@ eth_pcap_tx_dumper(void *queue, */ pcap_dump_flush(dumper_q->dumper); dumper_q->tx_pkts += num_tx; + dumper_q->tx_bytes += tx_bytes; dumper_q->err_pkts += nb_pkts - num_tx; return num_tx; } @@ -323,6 +331,7 @@ eth_pcap_tx(void *queue, struct rte_mbuf *mbuf; struct pcap_tx_queue *tx_queue = queue; uint16_t num_tx = 0; + uint32_t tx_bytes = 0; if (unlikely(nb_pkts == 0 || tx_queue->pcap == NULL)) return 0; @@ -355,10 +364,12 @@ eth_pcap_tx(void *queue, if (unlikely(ret != 0)) break; num_tx++; + tx_bytes += mbuf->pkt_len; rte_pktmbuf_free(mbuf); } tx_queue->tx_pkts += num_tx; + tx_queue->tx_bytes += tx_bytes; tx_queue->err_pkts += nb_pkts - num_tx; return num_tx; } @@ -499,26 +510,34 @@ eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *igb_stats) { unsigned i; - unsigned long rx_total = 0, tx_total = 0, tx_err_total = 0; + unsigned long rx_packets_total = 0, rx_bytes_total = 0; + unsigned long tx_packets_total = 0, tx_bytes_total = 0; + unsigned long tx_packets_err_total = 0; const struct pmd_internals *internal = dev->data->dev_private; for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS && i < internal->nb_rx_queues; i++) { igb_stats->q_ipackets[i] = internal->rx_queue[i].rx_pkts; - rx_total += igb_stats->q_ipackets[i]; + igb_stats->q_ibytes[i] = internal->rx_queue[i].rx_bytes; + rx_packets_total += igb_stats->q_ipackets[i]; + rx_bytes_total += igb_stats->q_ibytes[i]; } for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS && i < internal->nb_tx_queues; i++) { igb_stats->q_opackets[i] = internal->tx_queue[i].tx_pkts; + igb_stats->q_obytes[i] = internal->tx_queue[i].tx_bytes; igb_stats->q_errors[i] = internal->tx_queue[i].err_pkts; - tx_total += igb_stats->q_opackets[i]; - tx_err_total += igb_stats->q_errors[i]; + tx_packets_total += igb_stats->q_opackets[i]; + tx_bytes_total += igb_stats->q_obytes[i]; + tx_packets_err_total += igb_stats->q_errors[i]; } - igb_stats->ipackets = rx_total; - igb_stats->opackets = tx_total; - igb_stats->oerrors = tx_err_total; + igb_stats->ipackets = rx_packets_total; + igb_stats->ibytes = rx_bytes_total; + igb_stats->opackets = tx_packets_total; + igb_stats->obytes = tx_bytes_total; + igb_stats->oerrors = tx_packets_err_total; } static void @@ -526,10 +545,13 @@ eth_stats_reset(struct rte_eth_dev *dev) { unsigned i; struct pmd_internals *internal = dev->data->dev_private; - for (i = 0; i < internal->nb_rx_queues; i++) + for (i = 0; i < internal->nb_rx_queues; i++) { internal->rx_queue[i].rx_pkts = 0; + internal->rx_queue[i].rx_bytes = 0; + } for (i = 0; i < internal->nb_tx_queues; i++) { internal->tx_queue[i].tx_pkts = 0; + internal->tx_queue[i].tx_bytes = 0; internal->tx_queue[i].err_pkts = 0; } } -- 2.4.5 V5. Minor refactoring. V4. Incorporated comments. V3. Rebased to new master. V2. Incorporated comments. V1. Initial version.