Lines Matching full:ring
45 * we can access ring->cur, ring->head, ring->tail, etc.
47 * ring->slot[i] gives us the i-th slot (we can access
50 * char *buf = NETMAP_BUF(ring, x) returns a pointer to
53 * All ring indexes (head, cur, tail) should always move forward.
54 * To compute the next index in a circular ring you can use
55 * i = nm_ring_next(ring, i);
118 #define NETMAP_BUF(ring, index) \ argument
119 ((char *)(ring) + (ring)->buf_ofs + ((size_t)(index)*(ring)->nr_buf_size))
121 #define NETMAP_BUF_IDX(ring, buf) \ argument
122 ( ((char *)(buf) - ((char *)(ring) + (ring)->buf_ofs) ) / \
123 (ring)->nr_buf_size )
125 /* read the offset field in a ring's slot */
126 #define NETMAP_ROFFSET(ring, slot) \ argument
127 ((slot)->ptr & (ring)->offset_mask)
129 /* update the offset field in a ring's slot */
130 #define NETMAP_WOFFSET(ring, slot, offset) \ argument
131 do { (slot)->ptr = ((slot)->ptr & ~(ring)->offset_mask) | \
132 ((offset) & (ring)->offset_mask); } while (0)
134 /* obtain the start of the buffer pointed to by a ring's slot, taking the
137 #define NETMAP_BUF_OFFSET(ring, slot) \ argument
138 (NETMAP_BUF(ring, (slot)->buf_idx) + NETMAP_ROFFSET(ring, slot))
149 * Return 1 if we have pending transmissions in the tx ring.
150 * When everything is complete ring->head = ring->tail + 1 (modulo ring size)
158 /* Compute the number of slots available in the netmap ring. We use
159 * ring->head as explained in the comment above nm_ring_empty(). */
161 nm_ring_space(struct netmap_ring *ring) in nm_ring_space() argument
163 int ret = ring->tail - ring->head; in nm_ring_space()
165 ret += ring->num_slots; in nm_ring_space()
284 * We also store a pointer to some ring as it helps in the
325 * ^ bind the host (sw) ring pair
326 * * bind host and NIC ring pairs
327 * -NN bind individual NIC ring pair
336 * R bind only RX ring(s)
337 * T bind only TX ring(s)
340 * Remember that the ifname parsing will override the ring
687 case '^': /* only SW ring */ in nm_parse()
695 case '-': /* one NIC ring pair */ in nm_parse()
827 * NM_OPEN_RING_CFG user ring config from arg
1047 /* compute current ring to use */ in nm_inject()
1048 struct netmap_ring *ring; in nm_inject() local
1054 ring = NETMAP_TXRING(d->nifp, ri); in nm_inject()
1056 j = ring->cur; in nm_inject()
1057 while (rem > ring->nr_buf_size && j != ring->tail) { in nm_inject()
1058 rem -= ring->nr_buf_size; in nm_inject()
1059 j = nm_ring_next(ring, j); in nm_inject()
1061 if (j == ring->tail && rem > 0) in nm_inject()
1063 i = ring->cur; in nm_inject()
1065 idx = ring->slot[i].buf_idx; in nm_inject()
1066 ring->slot[i].len = ring->nr_buf_size; in nm_inject()
1067 ring->slot[i].flags = NS_MOREFRAG; in nm_inject()
1068 nm_pkt_copy(buf, NETMAP_BUF(ring, idx), ring->nr_buf_size); in nm_inject()
1069 i = nm_ring_next(ring, i); in nm_inject()
1070 buf = (const char *)buf + ring->nr_buf_size; in nm_inject()
1072 idx = ring->slot[i].buf_idx; in nm_inject()
1073 ring->slot[i].len = rem; in nm_inject()
1074 ring->slot[i].flags = 0; in nm_inject()
1075 nm_pkt_copy(buf, NETMAP_BUF(ring, idx), rem); in nm_inject()
1076 ring->head = ring->cur = nm_ring_next(ring, i); in nm_inject()
1103 /* compute current ring to use */ in nm_dispatch()
1104 struct netmap_ring *ring; in nm_dispatch() local
1108 ring = NETMAP_RXRING(d->nifp, ri); in nm_dispatch()
1109 for ( ; !nm_ring_empty(ring) && cnt != got; got++) { in nm_dispatch()
1116 i = ring->cur; in nm_dispatch()
1117 slot = &ring->slot[i]; in nm_dispatch()
1120 * set it here, so it reflects d->hdr.buf's ring */ in nm_dispatch()
1123 oldbuf = d->hdr.buf = (u_char *)NETMAP_BUF(ring, idx); in nm_dispatch()
1129 i = nm_ring_next(ring, i); in nm_dispatch()
1130 slot = &ring->slot[i]; in nm_dispatch()
1132 nbuf = (u_char *)NETMAP_BUF(ring, slot->buf_idx); in nm_dispatch()
1133 if (oldbuf != NULL && (uint32_t)(nbuf - oldbuf) == ring->nr_buf_size && in nm_dispatch()
1134 oldlen == ring->nr_buf_size) { in nm_dispatch()
1141 d->hdr.ts = ring->ts; in nm_dispatch()
1142 ring->head = ring->cur = nm_ring_next(ring, i); in nm_dispatch()
1158 /* compute current ring to use */ in nm_nextpkt()
1159 struct netmap_ring *ring = NETMAP_RXRING(d->nifp, ri); in nm_nextpkt() local
1160 if (!nm_ring_empty(ring)) { in nm_nextpkt()
1161 u_int i = ring->cur; in nm_nextpkt()
1162 u_int idx = ring->slot[i].buf_idx; in nm_nextpkt()
1163 u_char *buf = (u_char *)NETMAP_BUF(ring, idx); in nm_nextpkt()
1166 hdr->ts = ring->ts; in nm_nextpkt()
1167 hdr->len = hdr->caplen = ring->slot[i].len; in nm_nextpkt()
1168 ring->cur = nm_ring_next(ring, i); in nm_nextpkt()
1173 ring->head = ring->cur; in nm_nextpkt()