app/testpmd: update forward engine beginning
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>
This commit is contained in:
parent
0668d82908
commit
a78040c990
@ -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 = {
|
||||
|
@ -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
|
||||
|
@ -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 = {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user