From: Xiaoyu Min <jack...@nvidia.com>

Added common forwarding wrapper function for all fwd engines
which do the following in common:

- record core cycles
- call rte_eth_rx_burst(...,nb_pkt_per_burst)
- update received packets
- handle received mbufs with callback function

For better performance, the function is defined as macro.

Signed-off-by: Xiaoyu Min <jack...@nvidia.com>
Signed-off-by: Xueming Li <xuemi...@nvidia.com>
---
 app/test-pmd/5tswap.c   | 25 +++++--------------------
 app/test-pmd/csumonly.c | 25 ++++++-------------------
 app/test-pmd/flowgen.c  | 20 +++++---------------
 app/test-pmd/icmpecho.c | 30 ++++++++----------------------
 app/test-pmd/iofwd.c    | 24 +++++-------------------
 app/test-pmd/macfwd.c   | 24 +++++-------------------
 app/test-pmd/macswap.c  | 23 +++++------------------
 app/test-pmd/rxonly.c   | 32 ++++++++------------------------
 app/test-pmd/testpmd.h  | 19 +++++++++++++++++++
 9 files changed, 66 insertions(+), 156 deletions(-)

diff --git a/app/test-pmd/5tswap.c b/app/test-pmd/5tswap.c
index e8cef9623b..8fe940294f 100644
--- a/app/test-pmd/5tswap.c
+++ b/app/test-pmd/5tswap.c
@@ -82,18 +82,16 @@ swap_udp(struct rte_udp_hdr *udp_hdr)
  * Parses each layer and swaps it. When the next layer doesn't match it stops.
  */
 static void
-pkt_burst_5tuple_swap(struct fwd_stream *fs)
+_5tuple_swap_stream(struct fwd_stream *fs, uint16_t nb_rx,
+               struct rte_mbuf **pkts_burst)
 {
-       struct rte_mbuf  *pkts_burst[MAX_PKT_BURST];
        struct rte_port  *txp;
        struct rte_mbuf *mb;
        uint16_t next_proto;
        uint64_t ol_flags;
        uint16_t proto;
-       uint16_t nb_rx;
        uint16_t nb_tx;
        uint32_t retry;
-
        int i;
        union {
                struct rte_ether_hdr *eth;
@@ -105,20 +103,6 @@ pkt_burst_5tuple_swap(struct fwd_stream *fs)
                uint8_t *byte;
        } h;
 
-       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];
        ol_flags = ol_flags_init(txp->dev_conf.txmode.offloads);
        vlan_qinq_set(pkts_burst, nb_rx, ol_flags,
@@ -182,12 +166,13 @@ pkt_burst_5tuple_swap(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-       get_end_cycles(fs, start_tsc);
 }
 
+PKT_BURST_FWD(_5tuple_swap_stream);
+
 struct fwd_engine five_tuple_swap_fwd_engine = {
        .fwd_mode_name  = "5tswap",
        .port_fwd_begin = NULL,
        .port_fwd_end   = NULL,
-       .packet_fwd     = pkt_burst_5tuple_swap,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index 38cc256533..9bfc7d10dc 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -763,7 +763,7 @@ pkt_copy_split(const struct rte_mbuf *pkt)
 }
 
 /*
- * Receive a burst of packets, and for each packet:
+ * For each packet in received mbuf:
  *  - parse packet, and try to recognize a supported packet type (1)
  *  - if it's not a supported packet type, don't touch the packet, else:
  *  - reprocess the checksum of all supported layers. This is done in SW
@@ -792,9 +792,9 @@ pkt_copy_split(const struct rte_mbuf *pkt)
  * OUTER_IP is only useful for tunnel packets.
  */
 static void
-pkt_burst_checksum_forward(struct fwd_stream *fs)
+checksum_forward_stream(struct fwd_stream *fs, uint16_t nb_rx,
+               struct rte_mbuf **pkts_burst)
 {
-       struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
        struct rte_mbuf *gso_segments[GSO_MAX_PKT_BURST];
        struct rte_gso_ctx *gso_ctx;
        struct rte_mbuf **tx_pkts_burst;
@@ -805,7 +805,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
        void **gro_ctx;
        uint16_t gro_pkts_num;
        uint8_t gro_enable;
-       uint16_t nb_rx;
        uint16_t nb_tx;
        uint16_t nb_prep;
        uint16_t i;
@@ -820,18 +819,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
        uint16_t nb_segments = 0;
        int ret;
 
-       uint64_t start_tsc = 0;
-
-       get_start_cycles(&start_tsc);
-
-       /* receive a burst of packet */
-       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;
        rx_bad_ip_csum = 0;
        rx_bad_l4_csum = 0;
        rx_bad_outer_l4_csum = 0;
@@ -1138,13 +1125,13 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
                        rte_pktmbuf_free(tx_pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-
-       get_end_cycles(fs, start_tsc);
 }
 
+PKT_BURST_FWD(checksum_forward_stream);
+
 struct fwd_engine csum_fwd_engine = {
        .fwd_mode_name  = "csum",
        .port_fwd_begin = NULL,
        .port_fwd_end   = NULL,
-       .packet_fwd     = pkt_burst_checksum_forward,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c
index 0d3664a64d..aa45948b4c 100644
--- a/app/test-pmd/flowgen.c
+++ b/app/test-pmd/flowgen.c
@@ -61,10 +61,10 @@ RTE_DEFINE_PER_LCORE(int, _next_flow);
  * still do so in order to maintain traffic statistics.
  */
 static void
-pkt_burst_flow_gen(struct fwd_stream *fs)
+flow_gen_stream(struct fwd_stream *fs, uint16_t nb_rx,
+               struct rte_mbuf **pkts_burst)
 {
        unsigned pkt_size = tx_pkt_length - 4;  /* Adjust FCS */
-       struct rte_mbuf  *pkts_burst[MAX_PKT_BURST];
        struct rte_mempool *mbp;
        struct rte_mbuf  *pkt = NULL;
        struct rte_ether_hdr *eth_hdr;
@@ -72,7 +72,6 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
        struct rte_udp_hdr *udp_hdr;
        uint16_t vlan_tci, vlan_tci_outer;
        uint64_t ol_flags = 0;
-       uint16_t nb_rx;
        uint16_t nb_tx;
        uint16_t nb_dropped;
        uint16_t nb_pkt;
@@ -80,17 +79,9 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
        uint16_t i;
        uint32_t retry;
        uint64_t tx_offloads;
-       uint64_t start_tsc = 0;
        int next_flow = RTE_PER_LCORE(_next_flow);
 
-       get_start_cycles(&start_tsc);
-
-       /* Receive a burst of packets and discard 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);
-       fs->rx_packets += nb_rx;
-
        for (i = 0; i < nb_rx; i++)
                rte_pktmbuf_free(pkts_burst[i]);
 
@@ -195,12 +186,11 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_pkt);
        }
-
        RTE_PER_LCORE(_next_flow) = next_flow;
-
-       get_end_cycles(fs, start_tsc);
 }
 
+PKT_BURST_FWD(flow_gen_stream);
+
 static void
 flowgen_begin(portid_t pi)
 {
@@ -211,5 +201,5 @@ struct fwd_engine flow_gen_engine = {
        .fwd_mode_name  = "flowgen",
        .port_fwd_begin = flowgen_begin,
        .port_fwd_end   = NULL,
-       .packet_fwd     = pkt_burst_flow_gen,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/icmpecho.c b/app/test-pmd/icmpecho.c
index 8948f28eb5..467ba330aa 100644
--- a/app/test-pmd/icmpecho.c
+++ b/app/test-pmd/icmpecho.c
@@ -267,13 +267,13 @@ ipv4_hdr_cksum(struct rte_ipv4_hdr *ip_h)
        (((rte_be_to_cpu_32((ipv4_addr)) >> 24) & 0x000000FF) == 0xE0)
 
 /*
- * Receive a burst of packets, lookup for ICMP echo requests, and, if any,
- * send back ICMP echo replies.
+ * Lookup for ICMP echo requests in received mbuf and, if any,
+ * send back ICMP echo replies to corresponding Tx port.
  */
 static void
-reply_to_icmp_echo_rqsts(struct fwd_stream *fs)
+reply_to_icmp_echo_rqsts_stream(struct fwd_stream *fs, uint16_t nb_rx,
+               struct rte_mbuf **pkts_burst)
 {
-       struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
        struct rte_mbuf *pkt;
        struct rte_ether_hdr *eth_h;
        struct rte_vlan_hdr *vlan_h;
@@ -283,7 +283,6 @@ reply_to_icmp_echo_rqsts(struct fwd_stream *fs)
        struct rte_ether_addr eth_addr;
        uint32_t retry;
        uint32_t ip_addr;
-       uint16_t nb_rx;
        uint16_t nb_tx;
        uint16_t nb_replies;
        uint16_t eth_type;
@@ -291,22 +290,9 @@ reply_to_icmp_echo_rqsts(struct fwd_stream *fs)
        uint16_t arp_op;
        uint16_t arp_pro;
        uint32_t cksum;
-       uint8_t  i;
+       uint16_t  i;
        int l2_len;
-       uint64_t start_tsc = 0;
 
-       get_start_cycles(&start_tsc);
-
-       /*
-        * First, receive a burst of packets.
-        */
-       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_replies = 0;
        for (i = 0; i < nb_rx; i++) {
                if (likely(i < nb_rx - 1))
@@ -509,13 +495,13 @@ reply_to_icmp_echo_rqsts(struct fwd_stream *fs)
                        } while (++nb_tx < nb_replies);
                }
        }
-
-       get_end_cycles(fs, start_tsc);
 }
 
+PKT_BURST_FWD(reply_to_icmp_echo_rqsts_stream);
+
 struct fwd_engine icmp_echo_engine = {
        .fwd_mode_name  = "icmpecho",
        .port_fwd_begin = NULL,
        .port_fwd_end   = NULL,
-       .packet_fwd     = reply_to_icmp_echo_rqsts,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/iofwd.c b/app/test-pmd/iofwd.c
index 83d098adcb..dbd78167b4 100644
--- a/app/test-pmd/iofwd.c
+++ b/app/test-pmd/iofwd.c
@@ -44,25 +44,11 @@
  * to packets data.
  */
 static void
-pkt_burst_io_forward(struct fwd_stream *fs)
+io_forward_stream(struct fwd_stream *fs, uint16_t nb_rx,
+                 struct rte_mbuf **pkts_burst)
 {
-       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);
@@ -85,13 +71,13 @@ pkt_burst_io_forward(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-
-       get_end_cycles(fs, start_tsc);
 }
 
+PKT_BURST_FWD(io_forward_stream);
+
 struct fwd_engine io_fwd_engine = {
        .fwd_mode_name  = "io",
        .port_fwd_begin = NULL,
        .port_fwd_end   = NULL,
-       .packet_fwd     = pkt_burst_io_forward,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/macfwd.c b/app/test-pmd/macfwd.c
index 0568ea794d..b0728c7597 100644
--- a/app/test-pmd/macfwd.c
+++ b/app/test-pmd/macfwd.c
@@ -44,32 +44,18 @@
  * before forwarding them.
  */
 static void
-pkt_burst_mac_forward(struct fwd_stream *fs)
+mac_forward_stream(struct fwd_stream *fs, uint16_t nb_rx,
+               struct rte_mbuf **pkts_burst)
 {
-       struct rte_mbuf  *pkts_burst[MAX_PKT_BURST];
        struct rte_port  *txp;
        struct rte_mbuf  *mb;
        struct rte_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;
-       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];
        tx_offloads = txp->dev_conf.txmode.offloads;
        if (tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT)
@@ -116,13 +102,13 @@ pkt_burst_mac_forward(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-
-       get_end_cycles(fs, start_tsc);
 }
 
+PKT_BURST_FWD(mac_forward_stream);
+
 struct fwd_engine mac_fwd_engine = {
        .fwd_mode_name  = "mac",
        .port_fwd_begin = NULL,
        .port_fwd_end   = NULL,
-       .packet_fwd     = pkt_burst_mac_forward,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/macswap.c b/app/test-pmd/macswap.c
index 310bca06af..cc208944d7 100644
--- a/app/test-pmd/macswap.c
+++ b/app/test-pmd/macswap.c
@@ -50,27 +50,13 @@
  * addresses of packets before forwarding them.
  */
 static void
-pkt_burst_mac_swap(struct fwd_stream *fs)
+mac_swap_stream(struct fwd_stream *fs, uint16_t nb_rx,
+               struct rte_mbuf **pkts_burst)
 {
-       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);
@@ -95,12 +81,13 @@ pkt_burst_mac_swap(struct fwd_stream *fs)
                        rte_pktmbuf_free(pkts_burst[nb_tx]);
                } while (++nb_tx < nb_rx);
        }
-       get_end_cycles(fs, start_tsc);
 }
 
+PKT_BURST_FWD(mac_swap_stream);
+
 struct fwd_engine mac_swap_engine = {
        .fwd_mode_name  = "macswap",
        .port_fwd_begin = NULL,
        .port_fwd_end   = NULL,
-       .packet_fwd     = pkt_burst_mac_swap,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/rxonly.c b/app/test-pmd/rxonly.c
index c78fc4609a..a7354596b5 100644
--- a/app/test-pmd/rxonly.c
+++ b/app/test-pmd/rxonly.c
@@ -41,37 +41,21 @@
 #include "testpmd.h"
 
 /*
- * Received a burst of packets.
+ * Process a burst of received packets from same stream.
  */
 static void
-pkt_burst_receive(struct fwd_stream *fs)
+rxonly_forward_stream(struct fwd_stream *fs, uint16_t nb_rx,
+                     struct rte_mbuf **pkts_burst)
 {
-       struct rte_mbuf  *pkts_burst[MAX_PKT_BURST];
-       uint16_t nb_rx;
-       uint16_t i;
-       uint64_t start_tsc = 0;
-
-       get_start_cycles(&start_tsc);
-
-       /*
-        * Receive a burst of packets.
-        */
-       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;
-       for (i = 0; i < nb_rx; i++)
-               rte_pktmbuf_free(pkts_burst[i]);
-
-       get_end_cycles(fs, start_tsc);
+       RTE_SET_USED(fs);
+       rte_pktmbuf_free_bulk(pkts_burst, nb_rx);
 }
 
+PKT_BURST_FWD(rxonly_forward_stream)
+
 struct fwd_engine rx_only_engine = {
        .fwd_mode_name  = "rxonly",
        .port_fwd_begin = NULL,
        .port_fwd_end   = NULL,
-       .packet_fwd     = pkt_burst_receive,
+       .packet_fwd     = pkt_burst_fwd,
 };
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index f121a2da90..4792bef03b 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -1028,6 +1028,25 @@ void add_tx_dynf_callback(portid_t portid);
 void remove_tx_dynf_callback(portid_t portid);
 int update_jumbo_frame_offload(portid_t portid);
 
+#define PKT_BURST_FWD(cb)                                       \
+static void                                                     \
+pkt_burst_fwd(struct fwd_stream *fs)                            \
+{                                                               \
+       struct rte_mbuf *pkts_burst[nb_pkt_per_burst];          \
+       uint16_t nb_rx;                                         \
+       uint64_t start_tsc = 0;                                 \
+                                                               \
+       get_start_cycles(&start_tsc);                           \
+       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;                                \
+       cb(fs, nb_rx, pkts_burst);                              \
+       get_end_cycles(fs, start_tsc);                          \
+}
+
 /*
  * Work-around of a compilation error with ICC on invocations of the
  * rte_be_to_cpu_16() function.
-- 
2.33.0

Reply via email to