1bcb7ba9de
Those commands date back to the early stages of DPDK when only PCI devices were supported. At the time, developers may have used those commands to help in debugging their buggy^Wwork in progress drivers. Removing them, we can drop the dependency on the PCI bus and library and make testpmd bus agnostic. Signed-off-by: David Marchand <david.marchand@redhat.com> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
109 lines
2.5 KiB
C
109 lines
2.5 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <stdint.h>
|
|
#include <unistd.h>
|
|
#include <inttypes.h>
|
|
|
|
#include <sys/queue.h>
|
|
#include <sys/stat.h>
|
|
|
|
#include <rte_common.h>
|
|
#include <rte_byteorder.h>
|
|
#include <rte_log.h>
|
|
#include <rte_debug.h>
|
|
#include <rte_cycles.h>
|
|
#include <rte_memory.h>
|
|
#include <rte_launch.h>
|
|
#include <rte_eal.h>
|
|
#include <rte_per_lcore.h>
|
|
#include <rte_lcore.h>
|
|
#include <rte_branch_prediction.h>
|
|
#include <rte_memcpy.h>
|
|
#include <rte_mempool.h>
|
|
#include <rte_mbuf.h>
|
|
#include <rte_interrupts.h>
|
|
#include <rte_ether.h>
|
|
#include <rte_ethdev.h>
|
|
#include <rte_string_fns.h>
|
|
#include <rte_flow.h>
|
|
|
|
#include "testpmd.h"
|
|
|
|
/*
|
|
* Forwarding of packets in I/O mode.
|
|
* Forward packets "as-is".
|
|
* This is the fastest possible forwarding operation, as it does not access
|
|
* to packets data.
|
|
*/
|
|
static void
|
|
pkt_burst_io_forward(struct fwd_stream *fs)
|
|
{
|
|
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
|
|
uint16_t nb_rx;
|
|
uint16_t nb_tx;
|
|
uint32_t retry;
|
|
uint64_t start_tsc = 0;
|
|
|
|
get_start_cycles(&start_tsc);
|
|
|
|
/*
|
|
* Receive a burst of packets and forward them.
|
|
*/
|
|
nb_rx = rte_eth_rx_burst(fs->rx_port, fs->rx_queue,
|
|
pkts_burst, nb_pkt_per_burst);
|
|
inc_rx_burst_stats(fs, nb_rx);
|
|
if (unlikely(nb_rx == 0))
|
|
return;
|
|
fs->rx_packets += nb_rx;
|
|
|
|
nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue,
|
|
pkts_burst, nb_rx);
|
|
/*
|
|
* Retry if necessary
|
|
*/
|
|
if (unlikely(nb_tx < nb_rx) && fs->retry_enabled) {
|
|
retry = 0;
|
|
while (nb_tx < nb_rx && retry++ < burst_tx_retry_num) {
|
|
rte_delay_us(burst_tx_delay_time);
|
|
nb_tx += rte_eth_tx_burst(fs->tx_port, fs->tx_queue,
|
|
&pkts_burst[nb_tx], nb_rx - nb_tx);
|
|
}
|
|
}
|
|
fs->tx_packets += nb_tx;
|
|
inc_tx_burst_stats(fs, nb_tx);
|
|
if (unlikely(nb_tx < nb_rx)) {
|
|
fs->fwd_dropped += (nb_rx - nb_tx);
|
|
do {
|
|
rte_pktmbuf_free(pkts_burst[nb_tx]);
|
|
} while (++nb_tx < nb_rx);
|
|
}
|
|
|
|
get_end_cycles(fs, start_tsc);
|
|
}
|
|
|
|
static void
|
|
stream_init_forward(struct fwd_stream *fs)
|
|
{
|
|
bool rx_stopped, tx_stopped;
|
|
|
|
rx_stopped = ports[fs->rx_port].rxq[fs->rx_queue].state ==
|
|
RTE_ETH_QUEUE_STATE_STOPPED;
|
|
tx_stopped = ports[fs->tx_port].txq[fs->tx_queue].state ==
|
|
RTE_ETH_QUEUE_STATE_STOPPED;
|
|
fs->disabled = rx_stopped || tx_stopped;
|
|
}
|
|
|
|
struct fwd_engine io_fwd_engine = {
|
|
.fwd_mode_name = "io",
|
|
.port_fwd_begin = NULL,
|
|
.port_fwd_end = NULL,
|
|
.stream_init = stream_init_forward,
|
|
.packet_fwd = pkt_burst_io_forward,
|
|
};
|