I'm using a dpdk-replay application (that reads from pcap and sends to a port) and I'm passing the parameter --vdev net_memif in order that the application sends packets to the memif PMD interface. Before launching dpdk-replay I launch the testpmd like this:
dpdk-testpmd -l 4-5 --proc-type=primary --file-prefix=pmd1 --vdev=net_memif
The dpdk-replay is using the following code to start the port but unfortunately the link status is always down and rte_eth_tx_burst doesn't send anything.
/* Configure for each port (ethernet device), the number of rx queues & tx queues */
if (rte_eth_dev_configure(port,
0, /* nb rx queue */
NB_TX_QUEUES, /* nb tx queue */
ðconf) < 0) {
fprintf(stderr, "DPDK: RTE ETH Ethernet device configuration failed\n");
return (-1);
}
/* Then allocate and set up the transmit queues for this Ethernet device */
for (i = 0; i < NB_TX_QUEUES; i++) {
ret = rte_eth_tx_queue_setup(port,
i,
TX_QUEUE_SIZE,
cpus->numacore,
&txconf);
if (ret < 0) {
fprintf(stderr, "DPDK: RTE ETH Ethernet device tx queue %i setup failed: %s",
i, strerror(-ret));
return (ret);
}
}
/* Start the ethernet device */
if (rte_eth_dev_start(port) < 0) {
fprintf(stderr, "DPDK: RTE ETH Ethernet device start failed\n");
return (-1);
}
/* Get link status and display it. */
rte_eth_link_get(port, ð_link);
if (eth_link.link_status) {
printf(" Link up - speed %u Mbps - %s\n",
eth_link.link_speed,
(eth_link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
"full-duplex" : "half-duplex\n");
} else {
printf("Link down\n");
}