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>
118 lines
2.7 KiB
C
118 lines
2.7 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright 2014-2020 Mellanox Technologies, Ltd
|
|
*/
|
|
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <stdio.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_memcpy.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_mempool.h>
|
|
#include <rte_mbuf.h>
|
|
#include <rte_interrupts.h>
|
|
#include <rte_ether.h>
|
|
#include <rte_ethdev.h>
|
|
#include <rte_ip.h>
|
|
#include <rte_string_fns.h>
|
|
#include <rte_flow.h>
|
|
|
|
#include "testpmd.h"
|
|
#if defined(RTE_ARCH_X86)
|
|
#include "macswap_sse.h"
|
|
#elif defined(__ARM_NEON)
|
|
#include "macswap_neon.h"
|
|
#else
|
|
#include "macswap.h"
|
|
#endif
|
|
|
|
/*
|
|
* MAC swap forwarding mode: Swap the source and the destination Ethernet
|
|
* addresses of packets before forwarding them.
|
|
*/
|
|
static void
|
|
pkt_burst_mac_swap(struct fwd_stream *fs)
|
|
{
|
|
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
|
|
struct rte_port *txp;
|
|
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;
|
|
txp = &ports[fs->tx_port];
|
|
|
|
do_macswap(pkts_burst, nb_rx, txp);
|
|
|
|
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_mac_swap(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 mac_swap_engine = {
|
|
.fwd_mode_name = "macswap",
|
|
.port_fwd_begin = NULL,
|
|
.port_fwd_end = NULL,
|
|
.stream_init = stream_init_mac_swap,
|
|
.packet_fwd = pkt_burst_mac_swap,
|
|
};
|