Replace the nm_inject() helper with our own version so that odp_packet_copydata_out() can be used as this understands segmented packets.
Signed-off-by: Stuart Haslam <[email protected]> --- platform/linux-generic/pktio/netmap.c | 57 ++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 639afa8..b7547e1 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -308,23 +308,70 @@ static int netmap_recv(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], return num_rx; } +static struct netmap_ring *netmap_tx_ring(struct nm_desc *d) +{ + unsigned c, n = d->last_tx_ring - d->first_tx_ring + 1; + + for (c = 0; c < n ; c++) { + struct netmap_ring *ring; + unsigned ri = d->cur_tx_ring + c; + + if (ri > d->last_tx_ring) + ri = d->first_tx_ring; + ring = NETMAP_TXRING(d->nifp, ri); + if (nm_ring_empty(ring)) + continue; + + return ring; + } + + return NULL; +} + +static int netmap_inject(struct nm_desc *d, odp_packet_t pkt) +{ + struct netmap_ring *ring; + unsigned i; + uint32_t pkt_len = odp_packet_len(pkt); + uint32_t offset = 0; + char *buf; + + ring = netmap_tx_ring(d); + if (!ring) + return 0; + + if (pkt_len > ring->nr_buf_size) { + __odp_errno = -EMSGSIZE; + return 0; + } + + i = ring->cur; + ring->slot[i].flags = 0; + ring->slot[i].len = pkt_len; + buf = NETMAP_BUF(ring, ring->slot[i].buf_idx); + + if (odp_packet_copydata_out(pkt, offset, pkt_len, buf)) + return 0; + + ring->cur = nm_ring_next(ring, i); + ring->head = ring->cur; + + return 1; +} + static int netmap_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], unsigned num) { struct pollfd polld; struct nm_desc *nm_desc = pktio_entry->s.pkt_nm.tx_desc; unsigned i, nb_tx; - uint8_t *frame; - uint32_t frame_len; polld.fd = nm_desc->fd; polld.events = POLLOUT; for (nb_tx = 0; nb_tx < num; nb_tx++) { - frame_len = 0; - frame = odp_packet_l2_ptr(pkt_table[nb_tx], &frame_len); for (i = 0; i < NM_INJECT_RETRIES; i++) { - if (nm_inject(nm_desc, frame, frame_len) == 0) + if (netmap_inject(nm_desc, pkt_table[nb_tx]) == 0) poll(&polld, 1, 0); else break; -- 2.1.1 _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
