Changeset View
Changeset View
Standalone View
Standalone View
head/sys/net/netmap_user.h
Show First 20 Lines • Show All 1,023 Lines • ▼ Show 20 Lines | |||||
nm_inject(struct nm_desc *d, const void *buf, size_t size) | nm_inject(struct nm_desc *d, const void *buf, size_t size) | ||||
{ | { | ||||
u_int c, n = d->last_tx_ring - d->first_tx_ring + 1, | u_int c, n = d->last_tx_ring - d->first_tx_ring + 1, | ||||
ri = d->cur_tx_ring; | ri = d->cur_tx_ring; | ||||
for (c = 0; c < n ; c++, ri++) { | for (c = 0; c < n ; c++, ri++) { | ||||
/* compute current ring to use */ | /* compute current ring to use */ | ||||
struct netmap_ring *ring; | struct netmap_ring *ring; | ||||
uint32_t i, idx; | uint32_t i, j, idx; | ||||
size_t rem; | |||||
if (ri > d->last_tx_ring) | if (ri > d->last_tx_ring) | ||||
ri = d->first_tx_ring; | ri = d->first_tx_ring; | ||||
ring = NETMAP_TXRING(d->nifp, ri); | ring = NETMAP_TXRING(d->nifp, ri); | ||||
if (nm_ring_empty(ring)) { | rem = size; | ||||
continue; | 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; | i = ring->cur; | ||||
while (i != j) { | |||||
idx = ring->slot[i].buf_idx; | idx = ring->slot[i].buf_idx; | ||||
ring->slot[i].len = size; | ring->slot[i].len = ring->nr_buf_size; | ||||
nm_pkt_copy(buf, NETMAP_BUF(ring, idx), size); | ring->slot[i].flags = NS_MOREFRAG; | ||||
d->cur_tx_ring = ri; | 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 = rem; | |||||
ring->slot[i].flags = 0; | |||||
nm_pkt_copy(buf, NETMAP_BUF(ring, idx), rem); | |||||
ring->head = ring->cur = nm_ring_next(ring, i); | ring->head = ring->cur = nm_ring_next(ring, i); | ||||
d->cur_tx_ring = ri; | |||||
return size; | return size; | ||||
} | } | ||||
return 0; /* fail */ | return 0; /* fail */ | ||||
} | } | ||||
/* | /* | ||||
* Same prototype as pcap_dispatch(), only need to cast. | * Same prototype as pcap_dispatch(), only need to cast. | ||||
▲ Show 20 Lines • Show All 85 Lines • Show Last 20 Lines |