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

Reply via email to