]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - share/man/man4/netmap.4
MFC r339659:
[FreeBSD/FreeBSD.git] / share / man / man4 / netmap.4
1 .\" Copyright (c) 2011-2014 Matteo Landi, Luigi Rizzo, Universita` di Pisa
2 .\" All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\"    notice, this list of conditions and the following disclaimer in the
11 .\"    documentation and/or other materials provided with the distribution.
12 .\"
13 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 .\" SUCH DAMAGE.
24 .\"
25 .\" This document is derived in part from the enet man page (enet.4)
26 .\" distributed with 4.3BSD Unix.
27 .\"
28 .\" $FreeBSD$
29 .\"
30 .Dd October 23, 2018
31 .Dt NETMAP 4
32 .Os
33 .Sh NAME
34 .Nm netmap
35 .Nd a framework for fast packet I/O
36 .Nm VALE
37 .Nd a fast VirtuAl Local Ethernet using the netmap API
38 .Pp
39 .Nm netmap pipes
40 .Nd a shared memory packet transport channel
41 .Sh SYNOPSIS
42 .Cd device netmap
43 .Sh DESCRIPTION
44 .Nm
45 is a framework for extremely fast and efficient packet I/O
46 for userspace and kernel clients, and for Virtual Machines.
47 It runs on
48 .Fx
49 Linux and some versions of Windows, and supports a variety of
50 .Nm netmap ports ,
51 including
52 .Bl -tag -width XXXX
53 .It Nm physical NIC ports
54 to access individual queues of network interfaces;
55 .It Nm host ports
56 to inject packets into the host stack;
57 .It Nm VALE ports
58 implementing a very fast and modular in-kernel software switch/dataplane;
59 .It Nm netmap pipes
60 a shared memory packet transport channel;
61 .It Nm netmap monitors
62 a mechanism similar to
63 .Xr bpf 4
64 to capture traffic
65 .El
66 .Pp
67 All these
68 .Nm netmap ports
69 are accessed interchangeably with the same API,
70 and are at least one order of magnitude faster than
71 standard OS mechanisms
72 (sockets, bpf, tun/tap interfaces, native switches, pipes).
73 With suitably fast hardware (NICs, PCIe buses, CPUs),
74 packet I/O using
75 .Nm
76 on supported NICs
77 reaches 14.88 million packets per second (Mpps)
78 with much less than one core on 10 Gbit/s NICs;
79 35-40 Mpps on 40 Gbit/s NICs (limited by the hardware);
80 about 20 Mpps per core for VALE ports;
81 and over 100 Mpps for
82 .Nm netmap pipes.
83 NICs without native
84 .Nm
85 support can still use the API in emulated mode,
86 which uses unmodified device drivers and is 3-5 times faster than
87 .Xr bpf 4
88 or raw sockets.
89 .Pp
90 Userspace clients can dynamically switch NICs into
91 .Nm
92 mode and send and receive raw packets through
93 memory mapped buffers.
94 Similarly,
95 .Nm VALE
96 switch instances and ports,
97 .Nm netmap pipes
98 and
99 .Nm netmap monitors
100 can be created dynamically,
101 providing high speed packet I/O between processes,
102 virtual machines, NICs and the host stack.
103 .Pp
104 .Nm
105 supports both non-blocking I/O through
106 .Xr ioctl 2 ,
107 synchronization and blocking I/O through a file descriptor
108 and standard OS mechanisms such as
109 .Xr select 2 ,
110 .Xr poll 2 ,
111 .Xr epoll 2 ,
112 and
113 .Xr kqueue 2 .
114 All types of
115 .Nm netmap ports
116 and the
117 .Nm VALE switch
118 are implemented by a single kernel module, which also emulates the
119 .Nm
120 API over standard drivers.
121 For best performance,
122 .Nm
123 requires native support in device drivers.
124 A list of such devices is at the end of this document.
125 .Pp
126 In the rest of this (long) manual page we document
127 various aspects of the
128 .Nm
129 and
130 .Nm VALE
131 architecture, features and usage.
132 .Sh ARCHITECTURE
133 .Nm
134 supports raw packet I/O through a
135 .Em port ,
136 which can be connected to a physical interface
137 .Em ( NIC ) ,
138 to the host stack,
139 or to a
140 .Nm VALE
141 switch.
142 Ports use preallocated circular queues of buffers
143 .Em ( rings )
144 residing in an mmapped region.
145 There is one ring for each transmit/receive queue of a
146 NIC or virtual port.
147 An additional ring pair connects to the host stack.
148 .Pp
149 After binding a file descriptor to a port, a
150 .Nm
151 client can send or receive packets in batches through
152 the rings, and possibly implement zero-copy forwarding
153 between ports.
154 .Pp
155 All NICs operating in
156 .Nm
157 mode use the same memory region,
158 accessible to all processes who own
159 .Pa /dev/netmap
160 file descriptors bound to NICs.
161 Independent
162 .Nm VALE
163 and
164 .Nm netmap pipe
165 ports
166 by default use separate memory regions,
167 but can be independently configured to share memory.
168 .Sh ENTERING AND EXITING NETMAP MODE
169 The following section describes the system calls to create
170 and control
171 .Nm netmap
172 ports (including
173 .Nm VALE
174 and
175 .Nm netmap pipe
176 ports).
177 Simpler, higher level functions are described in the
178 .Sx LIBRARIES
179 section.
180 .Pp
181 Ports and rings are created and controlled through a file descriptor,
182 created by opening a special device
183 .Dl fd = open("/dev/netmap");
184 and then bound to a specific port with an
185 .Dl ioctl(fd, NIOCREGIF, (struct nmreq *)arg);
186 .Pp
187 .Nm
188 has multiple modes of operation controlled by the
189 .Vt struct nmreq
190 argument.
191 .Va arg.nr_name
192 specifies the netmap port name, as follows:
193 .Bl -tag -width XXXX
194 .It Dv OS network interface name (e.g., 'em0', 'eth1', ... )
195 the data path of the NIC is disconnected from the host stack,
196 and the file descriptor is bound to the NIC (one or all queues),
197 or to the host stack;
198 .It Dv valeSSS:PPP
199 the file descriptor is bound to port PPP of VALE switch SSS.
200 Switch instances and ports are dynamically created if necessary.
201 .Pp
202 Both SSS and PPP have the form [0-9a-zA-Z_]+ , the string
203 cannot exceed IFNAMSIZ characters, and PPP cannot
204 be the name of any existing OS network interface.
205 .El
206 .Pp
207 On return,
208 .Va arg
209 indicates the size of the shared memory region,
210 and the number, size and location of all the
211 .Nm
212 data structures, which can be accessed by mmapping the memory
213 .Dl char *mem = mmap(0, arg.nr_memsize, fd);
214 .Pp
215 Non-blocking I/O is done with special
216 .Xr ioctl 2
217 .Xr select 2
218 and
219 .Xr poll 2
220 on the file descriptor permit blocking I/O.
221 .Xr epoll 2
222 and
223 .Xr kqueue 2
224 are not supported on
225 .Nm
226 file descriptors.
227 .Pp
228 While a NIC is in
229 .Nm
230 mode, the OS will still believe the interface is up and running.
231 OS-generated packets for that NIC end up into a
232 .Nm
233 ring, and another ring is used to send packets into the OS network stack.
234 A
235 .Xr close 2
236 on the file descriptor removes the binding,
237 and returns the NIC to normal mode (reconnecting the data path
238 to the host stack), or destroys the virtual port.
239 .Sh DATA STRUCTURES
240 The data structures in the mmapped memory region are detailed in
241 .In sys/net/netmap.h ,
242 which is the ultimate reference for the
243 .Nm
244 API.
245 The main structures and fields are indicated below:
246 .Bl -tag -width XXX
247 .It Dv struct netmap_if (one per interface)
248 .Bd -literal
249 struct netmap_if {
250     ...
251     const uint32_t   ni_flags;      /* properties              */
252     ...
253     const uint32_t   ni_tx_rings;   /* NIC tx rings            */
254     const uint32_t   ni_rx_rings;   /* NIC rx rings            */
255     uint32_t         ni_bufs_head;  /* head of extra bufs list */
256     ...
257 };
258 .Ed
259 .Pp
260 Indicates the number of available rings
261 .Pa ( struct netmap_rings )
262 and their position in the mmapped region.
263 The number of tx and rx rings
264 .Pa ( ni_tx_rings , ni_rx_rings )
265 normally depends on the hardware.
266 NICs also have an extra tx/rx ring pair connected to the host stack.
267 .Em NIOCREGIF
268 can also request additional unbound buffers in the same memory space,
269 to be used as temporary storage for packets.
270 .Pa ni_bufs_head
271 contains the index of the first of these free rings,
272 which are connected in a list (the first uint32_t of each
273 buffer being the index of the next buffer in the list).
274 A
275 .Dv 0
276 indicates the end of the list.
277 .It Dv struct netmap_ring (one per ring)
278 .Bd -literal
279 struct netmap_ring {
280     ...
281     const uint32_t num_slots;   /* slots in each ring            */
282     const uint32_t nr_buf_size; /* size of each buffer           */
283     ...
284     uint32_t       head;        /* (u) first buf owned by user   */
285     uint32_t       cur;         /* (u) wakeup position           */
286     const uint32_t tail;        /* (k) first buf owned by kernel */
287     ...
288     uint32_t       flags;
289     struct timeval ts;          /* (k) time of last rxsync()     */
290     ...
291     struct netmap_slot slot[0]; /* array of slots                */
292 }
293 .Ed
294 .Pp
295 Implements transmit and receive rings, with read/write
296 pointers, metadata and an array of
297 .Em slots
298 describing the buffers.
299 .It Dv struct netmap_slot (one per buffer)
300 .Bd -literal
301 struct netmap_slot {
302     uint32_t buf_idx;           /* buffer index                 */
303     uint16_t len;               /* packet length                */
304     uint16_t flags;             /* buf changed, etc.            */
305     uint64_t ptr;               /* address for indirect buffers */
306 };
307 .Ed
308 .Pp
309 Describes a packet buffer, which normally is identified by
310 an index and resides in the mmapped region.
311 .It Dv packet buffers
312 Fixed size (normally 2 KB) packet buffers allocated by the kernel.
313 .El
314 .Pp
315 The offset of the
316 .Pa struct netmap_if
317 in the mmapped region is indicated by the
318 .Pa nr_offset
319 field in the structure returned by
320 .Dv NIOCREGIF .
321 From there, all other objects are reachable through
322 relative references (offsets or indexes).
323 Macros and functions in
324 .In net/netmap_user.h
325 help converting them into actual pointers:
326 .Pp
327 .Dl struct netmap_if  *nifp = NETMAP_IF(mem, arg.nr_offset);
328 .Dl struct netmap_ring *txr = NETMAP_TXRING(nifp, ring_index);
329 .Dl struct netmap_ring *rxr = NETMAP_RXRING(nifp, ring_index);
330 .Pp
331 .Dl char *buf = NETMAP_BUF(ring, buffer_index);
332 .Sh RINGS, BUFFERS AND DATA I/O
333 .Va Rings
334 are circular queues of packets with three indexes/pointers
335 .Va ( head , cur , tail ) ;
336 one slot is always kept empty.
337 The ring size
338 .Va ( num_slots )
339 should not be assumed to be a power of two.
340 .Pp
341 .Va head
342 is the first slot available to userspace;
343 .Pp
344 .Va cur
345 is the wakeup point:
346 select/poll will unblock when
347 .Va tail
348 passes
349 .Va cur ;
350 .Pp
351 .Va tail
352 is the first slot reserved to the kernel.
353 .Pp
354 Slot indexes
355 .Em must
356 only move forward;
357 for convenience, the function
358 .Dl nm_ring_next(ring, index)
359 returns the next index modulo the ring size.
360 .Pp
361 .Va head
362 and
363 .Va cur
364 are only modified by the user program;
365 .Va tail
366 is only modified by the kernel.
367 The kernel only reads/writes the
368 .Vt struct netmap_ring
369 slots and buffers
370 during the execution of a netmap-related system call.
371 The only exception are slots (and buffers) in the range
372 .Va tail\  . . . head-1 ,
373 that are explicitly assigned to the kernel.
374 .Pp
375 .Ss TRANSMIT RINGS
376 On transmit rings, after a
377 .Nm
378 system call, slots in the range
379 .Va head\  . . . tail-1
380 are available for transmission.
381 User code should fill the slots sequentially
382 and advance
383 .Va head
384 and
385 .Va cur
386 past slots ready to transmit.
387 .Va cur
388 may be moved further ahead if the user code needs
389 more slots before further transmissions (see
390 .Sx SCATTER GATHER I/O ) .
391 .Pp
392 At the next NIOCTXSYNC/select()/poll(),
393 slots up to
394 .Va head-1
395 are pushed to the port, and
396 .Va tail
397 may advance if further slots have become available.
398 Below is an example of the evolution of a TX ring:
399 .Bd -literal
400     after the syscall, slots between cur and tail are (a)vailable
401               head=cur   tail
402                |          |
403                v          v
404      TX  [.....aaaaaaaaaaa.............]
405
406     user creates new packets to (T)ransmit
407                 head=cur tail
408                     |     |
409                     v     v
410      TX  [.....TTTTTaaaaaa.............]
411
412     NIOCTXSYNC/poll()/select() sends packets and reports new slots
413                 head=cur      tail
414                     |          |
415                     v          v
416      TX  [..........aaaaaaaaaaa........]
417 .Ed
418 .Pp
419 .Fn select
420 and
421 .Fn poll
422 will block if there is no space in the ring, i.e.,
423 .Dl ring->cur == ring->tail
424 and return when new slots have become available.
425 .Pp
426 High speed applications may want to amortize the cost of system calls
427 by preparing as many packets as possible before issuing them.
428 .Pp
429 A transmit ring with pending transmissions has
430 .Dl ring->head != ring->tail + 1 (modulo the ring size).
431 The function
432 .Va int nm_tx_pending(ring)
433 implements this test.
434 .Ss RECEIVE RINGS
435 On receive rings, after a
436 .Nm
437 system call, the slots in the range
438 .Va head\& . . . tail-1
439 contain received packets.
440 User code should process them and advance
441 .Va head
442 and
443 .Va cur
444 past slots it wants to return to the kernel.
445 .Va cur
446 may be moved further ahead if the user code wants to
447 wait for more packets
448 without returning all the previous slots to the kernel.
449 .Pp
450 At the next NIOCRXSYNC/select()/poll(),
451 slots up to
452 .Va head-1
453 are returned to the kernel for further receives, and
454 .Va tail
455 may advance to report new incoming packets.
456 .Pp
457 Below is an example of the evolution of an RX ring:
458 .Bd -literal
459     after the syscall, there are some (h)eld and some (R)eceived slots
460            head  cur     tail
461             |     |       |
462             v     v       v
463      RX  [..hhhhhhRRRRRRRR..........]
464
465     user advances head and cur, releasing some slots and holding others
466                head cur  tail
467                  |  |     |
468                  v  v     v
469      RX  [..*****hhhRRRRRR...........]
470
471     NICRXSYNC/poll()/select() recovers slots and reports new packets
472                head cur        tail
473                  |  |           |
474                  v  v           v
475      RX  [.......hhhRRRRRRRRRRRR....]
476 .Ed
477 .Sh SLOTS AND PACKET BUFFERS
478 Normally, packets should be stored in the netmap-allocated buffers
479 assigned to slots when ports are bound to a file descriptor.
480 One packet is fully contained in a single buffer.
481 .Pp
482 The following flags affect slot and buffer processing:
483 .Bl -tag -width XXX
484 .It NS_BUF_CHANGED
485 .Em must
486 be used when the
487 .Va buf_idx
488 in the slot is changed.
489 This can be used to implement
490 zero-copy forwarding, see
491 .Sx ZERO-COPY FORWARDING .
492 .It NS_REPORT
493 reports when this buffer has been transmitted.
494 Normally,
495 .Nm
496 notifies transmit completions in batches, hence signals
497 can be delayed indefinitely.
498 This flag helps detect
499 when packets have been sent and a file descriptor can be closed.
500 .It NS_FORWARD
501 When a ring is in 'transparent' mode (see
502 .Sx TRANSPARENT MODE ) ,
503 packets marked with this flag are forwarded to the other endpoint
504 at the next system call, thus restoring (in a selective way)
505 the connection between a NIC and the host stack.
506 .It NS_NO_LEARN
507 tells the forwarding code that the source MAC address for this
508 packet must not be used in the learning bridge code.
509 .It NS_INDIRECT
510 indicates that the packet's payload is in a user-supplied buffer
511 whose user virtual address is in the 'ptr' field of the slot.
512 The size can reach 65535 bytes.
513 .Pp
514 This is only supported on the transmit ring of
515 .Nm VALE
516 ports, and it helps reducing data copies in the interconnection
517 of virtual machines.
518 .It NS_MOREFRAG
519 indicates that the packet continues with subsequent buffers;
520 the last buffer in a packet must have the flag clear.
521 .El
522 .Sh SCATTER GATHER I/O
523 Packets can span multiple slots if the
524 .Va NS_MOREFRAG
525 flag is set in all but the last slot.
526 The maximum length of a chain is 64 buffers.
527 This is normally used with
528 .Nm VALE
529 ports when connecting virtual machines, as they generate large
530 TSO segments that are not split unless they reach a physical device.
531 .Pp
532 NOTE: The length field always refers to the individual
533 fragment; there is no place with the total length of a packet.
534 .Pp
535 On receive rings the macro
536 .Va NS_RFRAGS(slot)
537 indicates the remaining number of slots for this packet,
538 including the current one.
539 Slots with a value greater than 1 also have NS_MOREFRAG set.
540 .Sh IOCTLS
541 .Nm
542 uses two ioctls (NIOCTXSYNC, NIOCRXSYNC)
543 for non-blocking I/O.
544 They take no argument.
545 Two more ioctls (NIOCGINFO, NIOCREGIF) are used
546 to query and configure ports, with the following argument:
547 .Bd -literal
548 struct nmreq {
549     char      nr_name[IFNAMSIZ]; /* (i) port name                  */
550     uint32_t  nr_version;        /* (i) API version                */
551     uint32_t  nr_offset;         /* (o) nifp offset in mmap region */
552     uint32_t  nr_memsize;        /* (o) size of the mmap region    */
553     uint32_t  nr_tx_slots;       /* (i/o) slots in tx rings        */
554     uint32_t  nr_rx_slots;       /* (i/o) slots in rx rings        */
555     uint16_t  nr_tx_rings;       /* (i/o) number of tx rings       */
556     uint16_t  nr_rx_rings;       /* (i/o) number of rx rings       */
557     uint16_t  nr_ringid;         /* (i/o) ring(s) we care about    */
558     uint16_t  nr_cmd;            /* (i) special command            */
559     uint16_t  nr_arg1;           /* (i/o) extra arguments          */
560     uint16_t  nr_arg2;           /* (i/o) extra arguments          */
561     uint32_t  nr_arg3;           /* (i/o) extra arguments          */
562     uint32_t  nr_flags           /* (i/o) open mode                */
563     ...
564 };
565 .Ed
566 .Pp
567 A file descriptor obtained through
568 .Pa /dev/netmap
569 also supports the ioctl supported by network devices, see
570 .Xr netintro 4 .
571 .Bl -tag -width XXXX
572 .It Dv NIOCGINFO
573 returns EINVAL if the named port does not support netmap.
574 Otherwise, it returns 0 and (advisory) information
575 about the port.
576 Note that all the information below can change before the
577 interface is actually put in netmap mode.
578 .Bl -tag -width XX
579 .It Pa nr_memsize
580 indicates the size of the
581 .Nm
582 memory region.
583 NICs in
584 .Nm
585 mode all share the same memory region,
586 whereas
587 .Nm VALE
588 ports have independent regions for each port.
589 .It Pa nr_tx_slots , nr_rx_slots
590 indicate the size of transmit and receive rings.
591 .It Pa nr_tx_rings , nr_rx_rings
592 indicate the number of transmit
593 and receive rings.
594 Both ring number and sizes may be configured at runtime
595 using interface-specific functions (e.g.,
596 .Xr ethtool 8
597 ).
598 .El
599 .It Dv NIOCREGIF
600 binds the port named in
601 .Va nr_name
602 to the file descriptor.
603 For a physical device this also switches it into
604 .Nm
605 mode, disconnecting
606 it from the host stack.
607 Multiple file descriptors can be bound to the same port,
608 with proper synchronization left to the user.
609 .Pp
610 The recommended way to bind a file descriptor to a port is
611 to use function
612 .Va nm_open(..)
613 (see
614 .Sx LIBRARIES )
615 which parses names to access specific port types and
616 enable features.
617 In the following we document the main features.
618 .Pp
619 .Dv NIOCREGIF can also bind a file descriptor to one endpoint of a
620 .Em netmap pipe ,
621 consisting of two netmap ports with a crossover connection.
622 A netmap pipe share the same memory space of the parent port,
623 and is meant to enable configuration where a master process acts
624 as a dispatcher towards slave processes.
625 .Pp
626 To enable this function, the
627 .Pa nr_arg1
628 field of the structure can be used as a hint to the kernel to
629 indicate how many pipes we expect to use, and reserve extra space
630 in the memory region.
631 .Pp
632 On return, it gives the same info as NIOCGINFO,
633 with
634 .Pa nr_ringid
635 and
636 .Pa nr_flags
637 indicating the identity of the rings controlled through the file
638 descriptor.
639 .Pp
640 .Va nr_flags
641 .Va nr_ringid
642 selects which rings are controlled through this file descriptor.
643 Possible values of
644 .Pa nr_flags
645 are indicated below, together with the naming schemes
646 that application libraries (such as the
647 .Nm nm_open
648 indicated below) can use to indicate the specific set of rings.
649 In the example below, "netmap:foo" is any valid netmap port name.
650 .Bl -tag -width XXXXX
651 .It NR_REG_ALL_NIC                         "netmap:foo"
652 (default) all hardware ring pairs
653 .It NR_REG_SW            "netmap:foo^"
654 the ``host rings'', connecting to the host stack.
655 .It NR_REG_NIC_SW        "netmap:foo+"
656 all hardware rings and the host rings
657 .It NR_REG_ONE_NIC       "netmap:foo-i"
658 only the i-th hardware ring pair, where the number is in
659 .Pa nr_ringid ;
660 .It NR_REG_PIPE_MASTER  "netmap:foo{i"
661 the master side of the netmap pipe whose identifier (i) is in
662 .Pa nr_ringid ;
663 .It NR_REG_PIPE_SLAVE   "netmap:foo}i"
664 the slave side of the netmap pipe whose identifier (i) is in
665 .Pa nr_ringid .
666 .Pp
667 The identifier of a pipe must be thought as part of the pipe name,
668 and does not need to be sequential.
669 On return the pipe
670 will only have a single ring pair with index 0,
671 irrespective of the value of
672 .Va i.
673 .El
674 .Pp
675 By default, a
676 .Xr poll 2
677 or
678 .Xr select 2
679 call pushes out any pending packets on the transmit ring, even if
680 no write events are specified.
681 The feature can be disabled by or-ing
682 .Va NETMAP_NO_TX_POLL
683 to the value written to
684 .Va nr_ringid.
685 When this feature is used,
686 packets are transmitted only on
687 .Va ioctl(NIOCTXSYNC)
688 or select()/poll() are called with a write event (POLLOUT/wfdset) or a full ring.
689 .Pp
690 When registering a virtual interface that is dynamically created to a
691 .Xr vale 4
692 switch, we can specify the desired number of rings (1 by default,
693 and currently up to 16) on it using nr_tx_rings and nr_rx_rings fields.
694 .It Dv NIOCTXSYNC
695 tells the hardware of new packets to transmit, and updates the
696 number of slots available for transmission.
697 .It Dv NIOCRXSYNC
698 tells the hardware of consumed packets, and asks for newly available
699 packets.
700 .El
701 .Sh SELECT, POLL, EPOLL, KQUEUE.
702 .Xr select 2
703 and
704 .Xr poll 2
705 on a
706 .Nm
707 file descriptor process rings as indicated in
708 .Sx TRANSMIT RINGS
709 and
710 .Sx RECEIVE RINGS ,
711 respectively when write (POLLOUT) and read (POLLIN) events are requested.
712 Both block if no slots are available in the ring
713 .Va ( ring->cur == ring->tail ) .
714 Depending on the platform,
715 .Xr epoll 2
716 and
717 .Xr kqueue 2
718 are supported too.
719 .Pp
720 Packets in transmit rings are normally pushed out
721 (and buffers reclaimed) even without
722 requesting write events.
723 Passing the
724 .Dv NETMAP_NO_TX_POLL
725 flag to
726 .Em NIOCREGIF
727 disables this feature.
728 By default, receive rings are processed only if read
729 events are requested.
730 Passing the
731 .Dv NETMAP_DO_RX_POLL
732 flag to
733 .Em NIOCREGIF updates receive rings even without read events.
734 Note that on epoll and kqueue,
735 .Dv NETMAP_NO_TX_POLL
736 and
737 .Dv NETMAP_DO_RX_POLL
738 only have an effect when some event is posted for the file descriptor.
739 .Sh LIBRARIES
740 The
741 .Nm
742 API is supposed to be used directly, both because of its simplicity and
743 for efficient integration with applications.
744 .Pp
745 For convenience, the
746 .In net/netmap_user.h
747 header provides a few macros and functions to ease creating
748 a file descriptor and doing I/O with a
749 .Nm
750 port.
751 These are loosely modeled after the
752 .Xr pcap 3
753 API, to ease porting of libpcap-based applications to
754 .Nm .
755 To use these extra functions, programs should
756 .Dl #define NETMAP_WITH_LIBS
757 before
758 .Dl #include <net/netmap_user.h>
759 .Pp
760 The following functions are available:
761 .Bl -tag -width XXXXX
762 .It Va  struct nm_desc * nm_open(const char *ifname, const struct nmreq *req, uint64_t flags, const struct nm_desc *arg)
763 similar to
764 .Xr pcap_open 3pcap ,
765 binds a file descriptor to a port.
766 .Bl -tag -width XX
767 .It Va ifname
768 is a port name, in the form "netmap:PPP" for a NIC and "valeSSS:PPP" for a
769 .Nm VALE
770 port.
771 .It Va req
772 provides the initial values for the argument to the NIOCREGIF ioctl.
773 The nm_flags and nm_ringid values are overwritten by parsing
774 ifname and flags, and other fields can be overridden through
775 the other two arguments.
776 .It Va arg
777 points to a struct nm_desc containing arguments (e.g., from a previously
778 open file descriptor) that should override the defaults.
779 The fields are used as described below
780 .It Va flags
781 can be set to a combination of the following flags:
782 .Va NETMAP_NO_TX_POLL ,
783 .Va NETMAP_DO_RX_POLL
784 (copied into nr_ringid);
785 .Va NM_OPEN_NO_MMAP (if arg points to the same memory region,
786 avoids the mmap and uses the values from it);
787 .Va NM_OPEN_IFNAME (ignores ifname and uses the values in arg);
788 .Va NM_OPEN_ARG1 ,
789 .Va NM_OPEN_ARG2 ,
790 .Va NM_OPEN_ARG3 (uses the fields from arg);
791 .Va NM_OPEN_RING_CFG (uses the ring number and sizes from arg).
792 .El
793 .It Va int nm_close(struct nm_desc *d)
794 closes the file descriptor, unmaps memory, frees resources.
795 .It Va int nm_inject(struct nm_desc *d, const void *buf, size_t size)
796 similar to pcap_inject(), pushes a packet to a ring, returns the size
797 of the packet is successful, or 0 on error;
798 .It Va int nm_dispatch(struct nm_desc *d, int cnt, nm_cb_t cb, u_char *arg)
799 similar to pcap_dispatch(), applies a callback to incoming packets
800 .It Va u_char * nm_nextpkt(struct nm_desc *d, struct nm_pkthdr *hdr)
801 similar to pcap_next(), fetches the next packet
802 .El
803 .Sh SUPPORTED DEVICES
804 .Nm
805 natively supports the following devices:
806 .Pp
807 On FreeBSD:
808 .Xr cxgbe 4 ,
809 .Xr em 4 ,
810 .Xr igb 4 ,
811 .Xr ixgbe 4 ,
812 .Xr ixl 4 ,
813 .Xr lem 4 ,
814 .Xr re 4 .
815 .Pp
816 On Linux
817 .Xr e1000 4 ,
818 .Xr e1000e 4 ,
819 .Xr i40e 4 ,
820 .Xr igb 4 ,
821 .Xr ixgbe 4 ,
822 .Xr r8169 4 .
823 .Pp
824 NICs without native support can still be used in
825 .Nm
826 mode through emulation.
827 Performance is inferior to native netmap
828 mode but still significantly higher than various raw socket types
829 (bpf, PF_PACKET, etc.).
830 Note that for slow devices (such as 1 Gbit/s and slower NICs,
831 or several 10 Gbit/s NICs whose hardware is unable to sustain line rate),
832 emulated and native mode will likely have similar or same throughput.
833 .Pp
834 When emulation is in use, packet sniffer programs such as tcpdump
835 could see received packets before they are diverted by netmap.
836 This behaviour is not intentional, being just an artifact of the implementation
837 of emulation.
838 Note that in case the netmap application subsequently moves packets received
839 from the emulated adapter onto the host RX ring, the sniffer will intercept
840 those packets again, since the packets are injected to the host stack as they
841 were received by the network interface.
842 .Pp
843 Emulation is also available for devices with native netmap support,
844 which can be used for testing or performance comparison.
845 The sysctl variable
846 .Va dev.netmap.admode
847 globally controls how netmap mode is implemented.
848 .Sh SYSCTL VARIABLES AND MODULE PARAMETERS
849 Some aspect of the operation of
850 .Nm
851 are controlled through sysctl variables on FreeBSD
852 .Em ( dev.netmap.* )
853 and module parameters on Linux
854 .Em ( /sys/module/netmap_lin/parameters/* ) :
855 .Bl -tag -width indent
856 .It Va dev.netmap.admode: 0
857 Controls the use of native or emulated adapter mode.
858 .Pp
859 0 uses the best available option;
860 .Pp
861 1 forces native mode and fails if not available;
862 .Pp
863 2 forces emulated hence never fails.
864 .It Va dev.netmap.generic_ringsize: 1024
865 Ring size used for emulated netmap mode
866 .It Va dev.netmap.generic_mit: 100000
867 Controls interrupt moderation for emulated mode
868 .It Va dev.netmap.mmap_unreg: 0
869 .It Va dev.netmap.fwd: 0
870 Forces NS_FORWARD mode
871 .It Va dev.netmap.flags: 0
872 .It Va dev.netmap.txsync_retry: 2
873 .It Va dev.netmap.no_pendintr: 1
874 Forces recovery of transmit buffers on system calls
875 .It Va dev.netmap.mitigate: 1
876 Propagates interrupt mitigation to user processes
877 .It Va dev.netmap.no_timestamp: 0
878 Disables the update of the timestamp in the netmap ring
879 .It Va dev.netmap.verbose: 0
880 Verbose kernel messages
881 .It Va dev.netmap.buf_num: 163840
882 .It Va dev.netmap.buf_size: 2048
883 .It Va dev.netmap.ring_num: 200
884 .It Va dev.netmap.ring_size: 36864
885 .It Va dev.netmap.if_num: 100
886 .It Va dev.netmap.if_size: 1024
887 Sizes and number of objects (netmap_if, netmap_ring, buffers)
888 for the global memory region.
889 The only parameter worth modifying is
890 .Va dev.netmap.buf_num
891 as it impacts the total amount of memory used by netmap.
892 .It Va dev.netmap.buf_curr_num: 0
893 .It Va dev.netmap.buf_curr_size: 0
894 .It Va dev.netmap.ring_curr_num: 0
895 .It Va dev.netmap.ring_curr_size: 0
896 .It Va dev.netmap.if_curr_num: 0
897 .It Va dev.netmap.if_curr_size: 0
898 Actual values in use.
899 .It Va dev.netmap.bridge_batch: 1024
900 Batch size used when moving packets across a
901 .Nm VALE
902 switch.
903 Values above 64 generally guarantee good
904 performance.
905 .El
906 .Sh SYSTEM CALLS
907 .Nm
908 uses
909 .Xr select 2 ,
910 .Xr poll 2 ,
911 .Xr epoll 2
912 and
913 .Xr kqueue 2
914 to wake up processes when significant events occur, and
915 .Xr mmap 2
916 to map memory.
917 .Xr ioctl 2
918 is used to configure ports and
919 .Nm VALE switches .
920 .Pp
921 Applications may need to create threads and bind them to
922 specific cores to improve performance, using standard
923 OS primitives, see
924 .Xr pthread 3 .
925 In particular,
926 .Xr pthread_setaffinity_np 3
927 may be of use.
928 .Sh EXAMPLES
929 .Ss TEST PROGRAMS
930 .Nm
931 comes with a few programs that can be used for testing or
932 simple applications.
933 See the
934 .Pa examples/
935 directory in
936 .Nm
937 distributions, or
938 .Pa tools/tools/netmap/
939 directory in
940 .Fx
941 distributions.
942 .Pp
943 .Xr pkt-gen 8
944 is a general purpose traffic source/sink.
945 .Pp
946 As an example
947 .Dl pkt-gen -i ix0 -f tx -l 60
948 can generate an infinite stream of minimum size packets, and
949 .Dl pkt-gen -i ix0 -f rx
950 is a traffic sink.
951 Both print traffic statistics, to help monitor
952 how the system performs.
953 .Pp
954 .Xr pkt-gen 8
955 has many options can be uses to set packet sizes, addresses,
956 rates, and use multiple send/receive threads and cores.
957 .Pp
958 .Xr bridge 4
959 is another test program which interconnects two
960 .Nm
961 ports.
962 It can be used for transparent forwarding between
963 interfaces, as in
964 .Dl bridge -i ix0 -i ix1
965 or even connect the NIC to the host stack using netmap
966 .Dl bridge -i ix0 -i ix0
967 .Ss USING THE NATIVE API
968 The following code implements a traffic generator
969 .Pp
970 .Bd -literal -compact
971 #include <net/netmap_user.h>
972 \&...
973 void sender(void)
974 {
975     struct netmap_if *nifp;
976     struct netmap_ring *ring;
977     struct nmreq nmr;
978     struct pollfd fds;
979
980     fd = open("/dev/netmap", O_RDWR);
981     bzero(&nmr, sizeof(nmr));
982     strcpy(nmr.nr_name, "ix0");
983     nmr.nm_version = NETMAP_API;
984     ioctl(fd, NIOCREGIF, &nmr);
985     p = mmap(0, nmr.nr_memsize, fd);
986     nifp = NETMAP_IF(p, nmr.nr_offset);
987     ring = NETMAP_TXRING(nifp, 0);
988     fds.fd = fd;
989     fds.events = POLLOUT;
990     for (;;) {
991         poll(&fds, 1, -1);
992         while (!nm_ring_empty(ring)) {
993             i = ring->cur;
994             buf = NETMAP_BUF(ring, ring->slot[i].buf_index);
995             ... prepare packet in buf ...
996             ring->slot[i].len = ... packet length ...
997             ring->head = ring->cur = nm_ring_next(ring, i);
998         }
999     }
1000 }
1001 .Ed
1002 .Ss HELPER FUNCTIONS
1003 A simple receiver can be implemented using the helper functions
1004 .Bd -literal -compact
1005 #define NETMAP_WITH_LIBS
1006 #include <net/netmap_user.h>
1007 \&...
1008 void receiver(void)
1009 {
1010     struct nm_desc *d;
1011     struct pollfd fds;
1012     u_char *buf;
1013     struct nm_pkthdr h;
1014     ...
1015     d = nm_open("netmap:ix0", NULL, 0, 0);
1016     fds.fd = NETMAP_FD(d);
1017     fds.events = POLLIN;
1018     for (;;) {
1019         poll(&fds, 1, -1);
1020         while ( (buf = nm_nextpkt(d, &h)) )
1021             consume_pkt(buf, h->len);
1022     }
1023     nm_close(d);
1024 }
1025 .Ed
1026 .Ss ZERO-COPY FORWARDING
1027 Since physical interfaces share the same memory region,
1028 it is possible to do packet forwarding between ports
1029 swapping buffers.
1030 The buffer from the transmit ring is used
1031 to replenish the receive ring:
1032 .Bd -literal -compact
1033     uint32_t tmp;
1034     struct netmap_slot *src, *dst;
1035     ...
1036     src = &src_ring->slot[rxr->cur];
1037     dst = &dst_ring->slot[txr->cur];
1038     tmp = dst->buf_idx;
1039     dst->buf_idx = src->buf_idx;
1040     dst->len = src->len;
1041     dst->flags = NS_BUF_CHANGED;
1042     src->buf_idx = tmp;
1043     src->flags = NS_BUF_CHANGED;
1044     rxr->head = rxr->cur = nm_ring_next(rxr, rxr->cur);
1045     txr->head = txr->cur = nm_ring_next(txr, txr->cur);
1046     ...
1047 .Ed
1048 .Ss ACCESSING THE HOST STACK
1049 The host stack is for all practical purposes just a regular ring pair,
1050 which you can access with the netmap API (e.g., with
1051 .Dl nm_open("netmap:eth0^", ... ) ;
1052 All packets that the host would send to an interface in
1053 .Nm
1054 mode end up into the RX ring, whereas all packets queued to the
1055 TX ring are send up to the host stack.
1056 .Ss VALE SWITCH
1057 A simple way to test the performance of a
1058 .Nm VALE
1059 switch is to attach a sender and a receiver to it,
1060 e.g., running the following in two different terminals:
1061 .Dl pkt-gen -i vale1:a -f rx # receiver
1062 .Dl pkt-gen -i vale1:b -f tx # sender
1063 The same example can be used to test netmap pipes, by simply
1064 changing port names, e.g.,
1065 .Dl pkt-gen -i vale2:x{3 -f rx # receiver on the master side
1066 .Dl pkt-gen -i vale2:x}3 -f tx # sender on the slave side
1067 .Pp
1068 The following command attaches an interface and the host stack
1069 to a switch:
1070 .Dl vale-ctl -h vale2:em0
1071 Other
1072 .Nm
1073 clients attached to the same switch can now communicate
1074 with the network card or the host.
1075 .Sh SEE ALSO
1076 .Xr pkt-gen 8 ,
1077 .Xr bridge 8
1078 .Pp
1079 .Pa http://info.iet.unipi.it/~luigi/netmap/
1080 .Pp
1081 Luigi Rizzo, Revisiting network I/O APIs: the netmap framework,
1082 Communications of the ACM, 55 (3), pp.45-51, March 2012
1083 .Pp
1084 Luigi Rizzo, netmap: a novel framework for fast packet I/O,
1085 Usenix ATC'12, June 2012, Boston
1086 .Pp
1087 Luigi Rizzo, Giuseppe Lettieri,
1088 VALE, a switched ethernet for virtual machines,
1089 ACM CoNEXT'12, December 2012, Nice
1090 .Pp
1091 Luigi Rizzo, Giuseppe Lettieri, Vincenzo Maffione,
1092 Speeding up packet I/O in virtual machines,
1093 ACM/IEEE ANCS'13, October 2013, San Jose
1094 .Sh AUTHORS
1095 .An -nosplit
1096 The
1097 .Nm
1098 framework has been originally designed and implemented at the
1099 Universita` di Pisa in 2011 by
1100 .An Luigi Rizzo ,
1101 and further extended with help from
1102 .An Matteo Landi ,
1103 .An Gaetano Catalli ,
1104 .An Giuseppe Lettieri ,
1105 and
1106 .An Vincenzo Maffione .
1107 .Pp
1108 .Nm
1109 and
1110 .Nm VALE
1111 have been funded by the European Commission within FP7 Projects
1112 CHANGE (257422) and OPENLAB (287581).
1113 .Sh CAVEATS
1114 No matter how fast the CPU and OS are,
1115 achieving line rate on 10G and faster interfaces
1116 requires hardware with sufficient performance.
1117 Several NICs are unable to sustain line rate with
1118 small packet sizes.
1119 Insufficient PCIe or memory bandwidth
1120 can also cause reduced performance.
1121 .Pp
1122 Another frequent reason for low performance is the use
1123 of flow control on the link: a slow receiver can limit
1124 the transmit speed.
1125 Be sure to disable flow control when running high
1126 speed experiments.
1127 .Ss SPECIAL NIC FEATURES
1128 .Nm
1129 is orthogonal to some NIC features such as
1130 multiqueue, schedulers, packet filters.
1131 .Pp
1132 Multiple transmit and receive rings are supported natively
1133 and can be configured with ordinary OS tools,
1134 such as
1135 .Xr ethtool 8
1136 or
1137 device-specific sysctl variables.
1138 The same goes for Receive Packet Steering (RPS)
1139 and filtering of incoming traffic.
1140 .Pp
1141 .Nm
1142 .Em does not use
1143 features such as
1144 .Em checksum offloading , TCP segmentation offloading ,
1145 .Em encryption , VLAN encapsulation/decapsulation ,
1146 etc.
1147 When using netmap to exchange packets with the host stack,
1148 make sure to disable these features.