aboutsummaryrefslogtreecommitdiff
path: root/sys/net/netmap_user.h
diff options
context:
space:
mode:
authorVincenzo Maffione <vmaffione@FreeBSD.org>2018-10-23 08:55:16 +0000
committerVincenzo Maffione <vmaffione@FreeBSD.org>2018-10-23 08:55:16 +0000
commit2a7db7a63de8af153b9a626780dd15ca26ae3596 (patch)
tree37c944c0992d8c89dea1efe83fa7d85ae3aabd0f /sys/net/netmap_user.h
parent60b905ae2f3a31efd6809c790b5a02f574489716 (diff)
Notes
Diffstat (limited to 'sys/net/netmap_user.h')
-rw-r--r--sys/net/netmap_user.h27
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 */