diff options
| author | Vincenzo Maffione <vmaffione@FreeBSD.org> | 2018-10-23 08:55:16 +0000 |
|---|---|---|
| committer | Vincenzo Maffione <vmaffione@FreeBSD.org> | 2018-10-23 08:55:16 +0000 |
| commit | 2a7db7a63de8af153b9a626780dd15ca26ae3596 (patch) | |
| tree | 37c944c0992d8c89dea1efe83fa7d85ae3aabd0f /sys/net/netmap_user.h | |
| parent | 60b905ae2f3a31efd6809c790b5a02f574489716 (diff) | |
Notes
Diffstat (limited to 'sys/net/netmap_user.h')
| -rw-r--r-- | sys/net/netmap_user.h | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/sys/net/netmap_user.h b/sys/net/netmap_user.h index a314ca02b81c..a86bcb6b6e3e 100644 --- a/sys/net/netmap_user.h +++ b/sys/net/netmap_user.h @@ -1029,20 +1029,35 @@ nm_inject(struct nm_desc *d, const void *buf, size_t size) for (c = 0; c < n ; c++, ri++) { /* compute current ring to use */ struct netmap_ring *ring; - uint32_t i, idx; + uint32_t i, j, idx; + size_t rem; if (ri > d->last_tx_ring) ri = d->first_tx_ring; ring = NETMAP_TXRING(d->nifp, ri); - if (nm_ring_empty(ring)) { - continue; + rem = size; + j = ring->cur; + while (rem > ring->nr_buf_size && j != ring->tail) { + rem -= ring->nr_buf_size; + j = nm_ring_next(ring, j); } + if (j == ring->tail && rem > 0) + continue; i = ring->cur; + while (i != j) { + idx = ring->slot[i].buf_idx; + ring->slot[i].len = ring->nr_buf_size; + ring->slot[i].flags = NS_MOREFRAG; + nm_pkt_copy(buf, NETMAP_BUF(ring, idx), ring->nr_buf_size); + i = nm_ring_next(ring, i); + buf = (char *)buf + ring->nr_buf_size; + } idx = ring->slot[i].buf_idx; - ring->slot[i].len = size; - nm_pkt_copy(buf, NETMAP_BUF(ring, idx), size); - d->cur_tx_ring = ri; + ring->slot[i].len = rem; + ring->slot[i].flags = 0; + nm_pkt_copy(buf, NETMAP_BUF(ring, idx), rem); ring->head = ring->cur = nm_ring_next(ring, i); + d->cur_tx_ring = ri; return size; } return 0; /* fail */ |
