84fb33fec1
Replace use of RTE_MACHINE_CPUFLAG macros with regular compiler macros, which are more complete than those provided by DPDK, and as such it allows new instruction sets to be leveraged without having to do extra work to set them up in DPDK. Signed-off-by: Sean Morrissey <sean.morrissey@intel.com> Signed-off-by: Radu Nicolau <radu.nicolau@intel.com> Acked-by: David Marchand <david.marchand@redhat.com>
107 lines
2.4 KiB
C
107 lines
2.4 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_atomic.h>
|
|
#include <rte_branch_prediction.h>
|
|
#include <rte_mempool.h>
|
|
#include <rte_mbuf.h>
|
|
#include <rte_interrupts.h>
|
|
#include <rte_pci.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);
|
|
}
|
|
|
|
struct fwd_engine mac_swap_engine = {
|
|
.fwd_mode_name = "macswap",
|
|
.port_fwd_begin = NULL,
|
|
.port_fwd_end = NULL,
|
|
.packet_fwd = pkt_burst_mac_swap,
|
|
};
|