A pktio interface can be used with poll mode drivers, where TX completion often
has to be done manually. This turned up as a problem with ODP-DPDK and
odp_l2fwd:
while (!exit_threads) {
pkts = odp_pktio_recv(pktio_src,...);
if (pkts <= 0)
continue;
...
if (pkts_ok > 0)
odp_pktio_send(pktio_dst, pkt_tbl, pkts_ok);
...
}
In this example we never call odp_pktio_send() on pktio_dst if there wasn't
any new packets received on pktio_src. DPDK needs manual TX completion. The
above example should have an odp_pktio_send_completion(pktio_dst) right at the
beginning of the loop.
Signed-off-by: Zoltan Kiss <[email protected]>
---
include/odp/api/packet_io.h | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/include/odp/api/packet_io.h b/include/odp/api/packet_io.h
index b97b2b8..3a4054c 100644
--- a/include/odp/api/packet_io.h
+++ b/include/odp/api/packet_io.h
@@ -119,6 +119,22 @@ int odp_pktio_recv(odp_pktio_t pktio, odp_packet_t
pkt_table[], int len);
int odp_pktio_send(odp_pktio_t pktio, odp_packet_t pkt_table[], int len);
/**
+ * Release sent packets
+ *
+ * This function should be called after sending on a pktio. If the platform
+ * doesn't implement send completion in other ways, this function should call
+ * odp_packet_free() on packets where transmission is already completed. It can
+ * be a no-op if the platform guarantees that the packets will be released upon
+ * completion, but the application must call it periodically after send to make
+ * sure packets are released.
+ *
+ * @param pktio ODP packet IO handle
+ *
+ * @retval <0 on failure
+ */
+int odp_pktio_send_complete(odp_pktio_t pktio);
+
+/**
* Set the default input queue to be associated with a pktio handle
*
* @param pktio ODP packet IO handle
--
1.9.1
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp