app/testpmd: update forward engine beginning
authorAlvin Zhang <alvinx.zhang@intel.com>
Thu, 23 Sep 2021 08:01:28 +0000 (16:01 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 8 Oct 2021 16:57:48 +0000 (18:57 +0200)
For each forward engine, there may be some special conditions
must be met before the forwarding runs.

Adding checks for these conditions in configuring is not suitable,
because one condition may rely on multiple configurations, and the
conditions required by each forward engine is not general.

The best solution is each forward engine has a callback to check
whether these conditions are met, and then testpmd can call the
callback to determine whether the forwarding can be started.

There was a void callback 'port_fwd_begin' in forward engine,
it did some initialization for forwarding, this patch updates its
return value then we can add some checks in it to confirm whether
the forwarding can be started. In addition, this patch calls the
callback before the forwarding stats is reset and then launches the
forwarding engine.

Bugzilla ID: 797
Cc: stable@dpdk.org
Signed-off-by: Alvin Zhang <alvinx.zhang@intel.com>
Acked-by: Xiaoyun Li <xiaoyun.li@intel.com>
app/test-pmd/flowgen.c
app/test-pmd/ieee1588fwd.c
app/test-pmd/noisy_vnf.c
app/test-pmd/testpmd.c
app/test-pmd/testpmd.h
app/test-pmd/txonly.c

index a96169e680322d31cb2d61b98419e18e02c257b8..7ebed9fed33461ef16a052ed559482c6eddba146 100644 (file)
@@ -201,10 +201,11 @@ pkt_burst_flow_gen(struct fwd_stream *fs)
        get_end_cycles(fs, start_tsc);
 }
 
-static void
+static int
 flowgen_begin(portid_t pi)
 {
        printf("  number of flows for port %u: %d\n", pi, nb_flows_flowgen);
+       return 0;
 }
 
 struct fwd_engine flow_gen_engine = {
index 9cf10c1c50b2ce778af3be2cf4767e769d49366a..b85a4aa87b8c5e068b51e2e346abbc80ff6f6d87 100644 (file)
@@ -198,10 +198,11 @@ ieee1588_packet_fwd(struct fwd_stream *fs)
        port_ieee1588_tx_timestamp_check(fs->rx_port);
 }
 
-static void
+static int
 port_ieee1588_fwd_begin(portid_t pi)
 {
        rte_eth_timesync_enable(pi);
+       return 0;
 }
 
 static void
index 382a4c2aaef1ef64ea8b7552dc311511b988c6bd..e4434bea95cfa01717a681e35ee1d26f2864f468 100644 (file)
@@ -231,7 +231,7 @@ noisy_fwd_end(portid_t pi)
        rte_free(noisy_cfg[pi]);
 }
 
-static void
+static int
 noisy_fwd_begin(portid_t pi)
 {
        struct noisy_config *n;
@@ -273,6 +273,8 @@ noisy_fwd_begin(portid_t pi)
                rte_exit(EXIT_FAILURE,
                         "--noisy-lkup-memory-size must be > 0\n");
        }
+
+       return 0;
 }
 
 struct fwd_engine noisy_vnf_engine = {
index 97ae52e17ecdd8661c9bf2dac088d75d987b807b..eec4f1b81dc27d3f2a4041a1702a9455376add5e 100644 (file)
@@ -2172,16 +2172,10 @@ run_one_txonly_burst_on_core(void *fwd_arg)
 static void
 launch_packet_forwarding(lcore_function_t *pkt_fwd_on_lcore)
 {
-       port_fwd_begin_t port_fwd_begin;
        unsigned int i;
        unsigned int lc_id;
        int diag;
 
-       port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin;
-       if (port_fwd_begin != NULL) {
-               for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
-                       (*port_fwd_begin)(fwd_ports_ids[i]);
-       }
        for (i = 0; i < cur_fwd_config.nb_fwd_lcores; i++) {
                lc_id = fwd_lcores_cpuids[i];
                if ((interactive == 0) || (lc_id != rte_lcore_id())) {
@@ -2227,10 +2221,35 @@ start_packet_forwarding(int with_tx_first)
                fprintf(stderr, "Packet forwarding already started\n");
                return;
        }
-       test_done = 0;
 
        fwd_config_setup();
 
+       port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin;
+       if (port_fwd_begin != NULL) {
+               for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+                       if (port_fwd_begin(fwd_ports_ids[i])) {
+                               fprintf(stderr,
+                                       "Packet forwarding is not ready\n");
+                               return;
+                       }
+               }
+       }
+
+       if (with_tx_first) {
+               port_fwd_begin = tx_only_engine.port_fwd_begin;
+               if (port_fwd_begin != NULL) {
+                       for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
+                               if (port_fwd_begin(fwd_ports_ids[i])) {
+                                       fprintf(stderr,
+                                               "Packet forwarding is not ready\n");
+                                       return;
+                               }
+                       }
+               }
+       }
+
+       test_done = 0;
+
        if(!no_flush_rx)
                flush_fwd_rx_queues();
 
@@ -2239,11 +2258,6 @@ start_packet_forwarding(int with_tx_first)
 
        fwd_stats_reset();
        if (with_tx_first) {
-               port_fwd_begin = tx_only_engine.port_fwd_begin;
-               if (port_fwd_begin != NULL) {
-                       for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
-                               (*port_fwd_begin)(fwd_ports_ids[i]);
-               }
                while (with_tx_first--) {
                        launch_packet_forwarding(
                                        run_one_txonly_burst_on_core);
index 5863b2f43f3e852e546b00a8078c7c2b5652d6bf..e9d9db06ce42e225aa7b9a0c8d37e8336b36ecf8 100644 (file)
@@ -268,7 +268,7 @@ struct fwd_lcore {
  *     Forwards packets unchanged on the same port.
  *     Check that sent IEEE1588 PTP packets are timestamped by the hardware.
  */
-typedef void (*port_fwd_begin_t)(portid_t pi);
+typedef int (*port_fwd_begin_t)(portid_t pi);
 typedef void (*port_fwd_end_t)(portid_t pi);
 typedef void (*packet_fwd_t)(struct fwd_stream *fs);
 
index 40655801cc4b3158c1b434eec56d6f68aade79ab..6b3651f855a7af97447390dcff6aa9f11aca77c4 100644 (file)
@@ -435,7 +435,7 @@ pkt_burst_transmit(struct fwd_stream *fs)
        get_end_cycles(fs, start_tsc);
 }
 
-static void
+static int
 tx_only_begin(portid_t pi)
 {
        uint16_t pkt_data_len;
@@ -467,6 +467,7 @@ tx_only_begin(portid_t pi)
                timestamp_init_req++;
        /* Make sure all settings are visible on forwarding cores.*/
        rte_wmb();
+       return 0;
 }
 
 struct fwd_engine tx_only_engine = {