3eecba267c
The tx_ol_flags field was used in order to control the different Tx offloads set. After the conversion to the new Ethdev Tx offloads API it is not needed anymore as the offloads configuration is stored in ethdev structs. Signed-off-by: Shahaf Shuler <shahafs@mellanox.com> Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
141 lines
3.5 KiB
C
141 lines
3.5 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause
|
|
* Copyright(c) 2010-2014 Intel Corporation
|
|
*/
|
|
|
|
#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"
|
|
|
|
/*
|
|
* Forwarding of packets in MAC mode.
|
|
* Change the source and the destination Ethernet addressed of packets
|
|
* before forwarding them.
|
|
*/
|
|
static void
|
|
pkt_burst_mac_forward(struct fwd_stream *fs)
|
|
{
|
|
struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
|
|
struct rte_port *txp;
|
|
struct rte_mbuf *mb;
|
|
struct ether_hdr *eth_hdr;
|
|
uint32_t retry;
|
|
uint16_t nb_rx;
|
|
uint16_t nb_tx;
|
|
uint16_t i;
|
|
uint64_t ol_flags = 0;
|
|
uint64_t tx_offloads;
|
|
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
|
|
uint64_t start_tsc;
|
|
uint64_t end_tsc;
|
|
uint64_t core_cycles;
|
|
#endif
|
|
|
|
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
|
|
start_tsc = rte_rdtsc();
|
|
#endif
|
|
|
|
/*
|
|
* 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);
|
|
if (unlikely(nb_rx == 0))
|
|
return;
|
|
|
|
#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
|
|
fs->rx_burst_stats.pkt_burst_spread[nb_rx]++;
|
|
#endif
|
|
fs->rx_packets += nb_rx;
|
|
txp = &ports[fs->tx_port];
|
|
tx_offloads = txp->dev_conf.txmode.offloads;
|
|
if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
|
|
ol_flags = PKT_TX_VLAN_PKT;
|
|
if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
|
|
ol_flags |= PKT_TX_QINQ_PKT;
|
|
if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
|
|
ol_flags |= PKT_TX_MACSEC;
|
|
for (i = 0; i < nb_rx; i++) {
|
|
if (likely(i < nb_rx - 1))
|
|
rte_prefetch0(rte_pktmbuf_mtod(pkts_burst[i + 1],
|
|
void *));
|
|
mb = pkts_burst[i];
|
|
eth_hdr = rte_pktmbuf_mtod(mb, struct ether_hdr *);
|
|
ether_addr_copy(&peer_eth_addrs[fs->peer_addr],
|
|
ð_hdr->d_addr);
|
|
ether_addr_copy(&ports[fs->tx_port].eth_addr,
|
|
ð_hdr->s_addr);
|
|
mb->ol_flags = ol_flags;
|
|
mb->l2_len = sizeof(struct ether_hdr);
|
|
mb->l3_len = sizeof(struct ipv4_hdr);
|
|
mb->vlan_tci = txp->tx_vlan_id;
|
|
mb->vlan_tci_outer = txp->tx_vlan_id_outer;
|
|
}
|
|
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;
|
|
#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
|
|
fs->tx_burst_stats.pkt_burst_spread[nb_tx]++;
|
|
#endif
|
|
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);
|
|
}
|
|
#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
|
|
end_tsc = rte_rdtsc();
|
|
core_cycles = (end_tsc - start_tsc);
|
|
fs->core_cycles = (uint64_t) (fs->core_cycles + core_cycles);
|
|
#endif
|
|
}
|
|
|
|
struct fwd_engine mac_fwd_engine = {
|
|
.fwd_mode_name = "mac",
|
|
.port_fwd_begin = NULL,
|
|
.port_fwd_end = NULL,
|
|
.packet_fwd = pkt_burst_mac_forward,
|
|
};
|