12564abdaSShiri Kuzin /* SPDX-License-Identifier: BSD-3-Clause
22564abdaSShiri Kuzin * Copyright 2014-2020 Mellanox Technologies, Ltd
32564abdaSShiri Kuzin */
42564abdaSShiri Kuzin
52564abdaSShiri Kuzin #include <stdarg.h>
62564abdaSShiri Kuzin #include <stdio.h>
72564abdaSShiri Kuzin #include <stdint.h>
82564abdaSShiri Kuzin #include <unistd.h>
92564abdaSShiri Kuzin #include <inttypes.h>
102564abdaSShiri Kuzin
112564abdaSShiri Kuzin #include <sys/queue.h>
122564abdaSShiri Kuzin #include <sys/stat.h>
132564abdaSShiri Kuzin
142564abdaSShiri Kuzin #include <rte_common.h>
152564abdaSShiri Kuzin #include <rte_ether.h>
162564abdaSShiri Kuzin #include <rte_ethdev.h>
172564abdaSShiri Kuzin #include <rte_ip.h>
182564abdaSShiri Kuzin #include <rte_flow.h>
192564abdaSShiri Kuzin
202564abdaSShiri Kuzin #include "testpmd.h"
21*1d343c19SMike Pattrick #include "5tswap.h"
222564abdaSShiri Kuzin
232564abdaSShiri Kuzin /*
242564abdaSShiri Kuzin * 5 tuple swap forwarding mode: Swap the source and the destination of layers
252564abdaSShiri Kuzin * 2,3,4. Swaps source and destination for MAC, IPv4/IPv6, UDP/TCP.
262564abdaSShiri Kuzin * Parses each layer and swaps it. When the next layer doesn't match it stops.
272564abdaSShiri Kuzin */
2806c20561SDavid Marchand static bool
pkt_burst_5tuple_swap(struct fwd_stream * fs)292564abdaSShiri Kuzin pkt_burst_5tuple_swap(struct fwd_stream *fs)
302564abdaSShiri Kuzin {
312564abdaSShiri Kuzin struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
322564abdaSShiri Kuzin uint16_t nb_rx;
332564abdaSShiri Kuzin
342564abdaSShiri Kuzin /*
352564abdaSShiri Kuzin * Receive a burst of packets and forward them.
362564abdaSShiri Kuzin */
37d3dae396SDavid Marchand nb_rx = common_fwd_stream_receive(fs, pkts_burst, nb_pkt_per_burst);
382564abdaSShiri Kuzin if (unlikely(nb_rx == 0))
3906c20561SDavid Marchand return false;
402564abdaSShiri Kuzin
41*1d343c19SMike Pattrick do_5tswap(pkts_burst, nb_rx, fs);
42*1d343c19SMike Pattrick
43655131ccSDavid Marchand common_fwd_stream_transmit(fs, pkts_burst, nb_rx);
4406c20561SDavid Marchand
4506c20561SDavid Marchand return true;
462564abdaSShiri Kuzin }
472564abdaSShiri Kuzin
482564abdaSShiri Kuzin struct fwd_engine five_tuple_swap_fwd_engine = {
492564abdaSShiri Kuzin .fwd_mode_name = "5tswap",
50180ba023SDavid Marchand .stream_init = common_fwd_stream_init,
512564abdaSShiri Kuzin .packet_fwd = pkt_burst_5tuple_swap,
522564abdaSShiri Kuzin };
53