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

Reply via email to