Lines Matching +full:tx +full:- +full:slots
1 .\" Copyright (c) 2011-2014 Matteo Landi, Luigi Rizzo, Universita` di Pisa
45 .Bl -tag -width XXXX
51 implementing a very fast and modular in-kernel software switch/dataplane;
72 35-40 Mpps on 40 Gbit/s NICs (limited by the hardware);
79 which uses unmodified device drivers and is 3-5 times faster than
98 supports both non-blocking I/O through
145 the rings, and possibly implement zero-copy forwarding
186 .Bl -tag -width XXXX
195 Both SSS and PPP have the form [0-9a-zA-Z_]+ , the string
208 Non-blocking I/O is done with special
218 OS-generated packets for that NIC end up into a
233 .Bl -tag -width XXX
235 .Bd -literal
240 const uint32_t ni_tx_rings; /* NIC tx rings */
250 The number of tx and rx rings
253 NICs also have an extra tx/rx ring pair connected to the host stack.
273 this list and use the buffers (i.e., binding them to the slots of a
281 .Bd -literal
284 const uint32_t num_slots; /* slots in each ring */
294 struct netmap_slot slot[0]; /* array of slots */
300 .Em slots
303 .Bd -literal
372 slots and buffers
373 during the execution of a netmap-related system call.
374 The only exception are slots (and buffers) in the range
375 .Va tail\ . . . head-1 ,
380 system call, slots in the range
381 .Va head\ . . . tail-1
383 User code should fill the slots sequentially
388 past slots ready to transmit.
391 more slots before further transmissions (see
395 slots up to
396 .Va head-1
399 may advance if further slots have become available.
400 Below is an example of the evolution of a TX ring:
401 .Bd -literal
402 after the syscall, slots between cur and tail are (a)vailable
406 TX [.....aaaaaaaaaaa.............]
412 TX [.....TTTTTaaaaaa.............]
414 NIOCTXSYNC/poll()/select() sends packets and reports new slots
418 TX [..........aaaaaaaaaaa........]
425 .Dl ring->cur == ring->tail
426 and return when new slots have become available.
432 .Dl ring->head != ring->tail + 1 (modulo the ring size).
439 system call, the slots in the range
440 .Va head\& . . . tail-1
446 past slots it wants to return to the kernel.
450 without returning all the previous slots to the kernel.
453 slots up to
454 .Va head-1
460 .Bd -literal
461 after the syscall, there are some (h)eld and some (R)eceived slots
467 user advances head and cur, releasing some slots and holding others
473 NICRXSYNC/poll()/select() recovers slots and reports new packets
479 .Sh SLOTS AND PACKET BUFFERS
480 Normally, packets should be stored in the netmap-allocated buffers
481 assigned to slots when ports are bound to a file descriptor.
485 .Bl -tag -width XXX
492 zero-copy forwarding, see
493 .Sx ZERO-COPY FORWARDING .
511 indicates that the packet's payload is in a user-supplied buffer
524 Packets can span multiple slots if the
538 indicates the remaining number of slots for this packet,
540 Slots with a value greater than 1 also have NS_MOREFRAG set.
544 for non-blocking I/O.
548 .Bd -literal
554 uint32_t nr_tx_slots; /* (i/o) slots in tx rings */
555 uint32_t nr_rx_slots; /* (i/o) slots in rx rings */
556 uint16_t nr_tx_rings; /* (i/o) number of tx rings */
572 .Bl -tag -width XXXX
579 .Bl -tag -width XX
596 using interface-specific functions (e.g.,
651 .Bl -tag -width XXXXX
658 .It NR_REG_ONE_NIC "netmap:foo-i"
659 only the i-th hardware ring pair, where the number is in
682 The feature can be disabled by or-ing
700 number of slots available for transmission.
716 Both block if no slots are available in the ring
717 .Va ( ring->cur == ring->tail ) .
760 API, to ease porting of libpcap-based applications to
768 .Bl -tag -width XXXXX
773 .Bl -tag -width XX
871 .Bl -tag -width indent
940 Allow ptnet devices to use virtio-net headers
948 domains, this will prevent zero-copy forwarding optimizations and thus may hurt
989 .Xr pkt-gen 8
993 .Dl pkt-gen -i ix0 -f tx -l 60
995 .Dl pkt-gen -i ix0 -f rx
1000 .Xr pkt-gen 8
1010 .Dl bridge -i netmap:ix0 -i netmap:ix1
1012 .Dl bridge -i netmap:ix0
1016 .Bd -literal -compact
1037 poll(&fds, 1, -1);
1039 i = ring->cur;
1040 buf = NETMAP_BUF(ring, ring->slot[i].buf_index);
1042 ring->slot[i].len = ... packet length ...
1043 ring->head = ring->cur = nm_ring_next(ring, i);
1051 .Bd -literal -compact
1066 poll(&fds, 1, -1);
1073 .Ss ZERO-COPY FORWARDING
1080 .Bd -literal -compact
1084 src = &src_ring->slot[rxr->cur];
1085 dst = &dst_ring->slot[txr->cur];
1086 tmp = dst->buf_idx;
1087 dst->buf_idx = src->buf_idx;
1088 dst->len = src->len;
1089 dst->flags = NS_BUF_CHANGED;
1090 src->buf_idx = tmp;
1091 src->flags = NS_BUF_CHANGED;
1092 rxr->head = rxr->cur = nm_ring_next(rxr, rxr->cur);
1093 txr->head = txr->cur = nm_ring_next(txr, txr->cur);
1109 .Dl pkt-gen -i vale1:a -f rx # receiver
1110 .Dl pkt-gen -i vale1:b -f tx # sender
1113 .Dl pkt-gen -i vale2:x{3 -f rx # receiver on the master side
1114 .Dl pkt-gen -i vale2:x}3 -f tx # sender on the slave side
1118 .Dl valectl -h vale2:em0
1128 .Xr pkt-gen 8 ,
1134 Communications of the ACM, 55 (3), pp.45-51, March 2012
1147 .An -nosplit
1189 device-specific sysctl variables.