The same functionality is already implemented in API-NEXT branch. Is this patch mandatory for the whole set?
-Matias > -----Original Message----- > From: lng-odp [mailto:[email protected]] On Behalf Of EXT > Stuart > Haslam > Sent: Friday, January 22, 2016 8:48 PM > To: [email protected] > Subject: [lng-odp] [PATCHv2 4/5] linux-generic: netmap: support segmented > packets > > 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 _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
