On 10/28/2015 22:29, Stuart Haslam wrote:
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 <stuart.has...@linaro.org>
---
platform/linux-generic/pktio/netmap.c | 59 ++++++++++++++++++++++++++++++++---
1 file changed, 54 insertions(+), 5 deletions(-)
diff --git a/platform/linux-generic/pktio/netmap.c
b/platform/linux-generic/pktio/netmap.c
index 7d47fc1..d72af3d 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -268,32 +268,81 @@ static int netmap_recv(pktio_entry_t *pktio_entry,
odp_packet_t pkt_table[],
return args.nb_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++) {
why c and not i as everywhere? Also can n be some read friendly name,
like num_rings?
Maxim.
+ 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;
}
+
if (odp_unlikely(i == NM_INJECT_RETRIES)) {
ioctl(nm_desc->fd, NIOCTXSYNC, NULL);
break;
}
}
+
/* Send pending packets */
poll(&polld, 1, 0);
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp