]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/netmap/netmap.c
MFV r302423:
[FreeBSD/FreeBSD.git] / sys / dev / netmap / netmap.c
1 /*
2  * Copyright (C) 2011-2014 Matteo Landi, Luigi Rizzo. 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
26
27 /*
28  * $FreeBSD$
29  *
30  * This module supports memory mapped access to network devices,
31  * see netmap(4).
32  *
33  * The module uses a large, memory pool allocated by the kernel
34  * and accessible as mmapped memory by multiple userspace threads/processes.
35  * The memory pool contains packet buffers and "netmap rings",
36  * i.e. user-accessible copies of the interface's queues.
37  *
38  * Access to the network card works like this:
39  * 1. a process/thread issues one or more open() on /dev/netmap, to create
40  *    select()able file descriptor on which events are reported.
41  * 2. on each descriptor, the process issues an ioctl() to identify
42  *    the interface that should report events to the file descriptor.
43  * 3. on each descriptor, the process issues an mmap() request to
44  *    map the shared memory region within the process' address space.
45  *    The list of interesting queues is indicated by a location in
46  *    the shared memory region.
47  * 4. using the functions in the netmap(4) userspace API, a process
48  *    can look up the occupation state of a queue, access memory buffers,
49  *    and retrieve received packets or enqueue packets to transmit.
50  * 5. using some ioctl()s the process can synchronize the userspace view
51  *    of the queue with the actual status in the kernel. This includes both
52  *    receiving the notification of new packets, and transmitting new
53  *    packets on the output interface.
54  * 6. select() or poll() can be used to wait for events on individual
55  *    transmit or receive queues (or all queues for a given interface).
56  *
57
58                 SYNCHRONIZATION (USER)
59
60 The netmap rings and data structures may be shared among multiple
61 user threads or even independent processes.
62 Any synchronization among those threads/processes is delegated
63 to the threads themselves. Only one thread at a time can be in
64 a system call on the same netmap ring. The OS does not enforce
65 this and only guarantees against system crashes in case of
66 invalid usage.
67
68                 LOCKING (INTERNAL)
69
70 Within the kernel, access to the netmap rings is protected as follows:
71
72 - a spinlock on each ring, to handle producer/consumer races on
73   RX rings attached to the host stack (against multiple host
74   threads writing from the host stack to the same ring),
75   and on 'destination' rings attached to a VALE switch
76   (i.e. RX rings in VALE ports, and TX rings in NIC/host ports)
77   protecting multiple active senders for the same destination)
78
79 - an atomic variable to guarantee that there is at most one
80   instance of *_*xsync() on the ring at any time.
81   For rings connected to user file
82   descriptors, an atomic_test_and_set() protects this, and the
83   lock on the ring is not actually used.
84   For NIC RX rings connected to a VALE switch, an atomic_test_and_set()
85   is also used to prevent multiple executions (the driver might indeed
86   already guarantee this).
87   For NIC TX rings connected to a VALE switch, the lock arbitrates
88   access to the queue (both when allocating buffers and when pushing
89   them out).
90
91 - *xsync() should be protected against initializations of the card.
92   On FreeBSD most devices have the reset routine protected by
93   a RING lock (ixgbe, igb, em) or core lock (re). lem is missing
94   the RING protection on rx_reset(), this should be added.
95
96   On linux there is an external lock on the tx path, which probably
97   also arbitrates access to the reset routine. XXX to be revised
98
99 - a per-interface core_lock protecting access from the host stack
100   while interfaces may be detached from netmap mode.
101   XXX there should be no need for this lock if we detach the interfaces
102   only while they are down.
103
104
105 --- VALE SWITCH ---
106
107 NMG_LOCK() serializes all modifications to switches and ports.
108 A switch cannot be deleted until all ports are gone.
109
110 For each switch, an SX lock (RWlock on linux) protects
111 deletion of ports. When configuring or deleting a new port, the
112 lock is acquired in exclusive mode (after holding NMG_LOCK).
113 When forwarding, the lock is acquired in shared mode (without NMG_LOCK).
114 The lock is held throughout the entire forwarding cycle,
115 during which the thread may incur in a page fault.
116 Hence it is important that sleepable shared locks are used.
117
118 On the rx ring, the per-port lock is grabbed initially to reserve
119 a number of slot in the ring, then the lock is released,
120 packets are copied from source to destination, and then
121 the lock is acquired again and the receive ring is updated.
122 (A similar thing is done on the tx ring for NIC and host stack
123 ports attached to the switch)
124
125  */
126
127
128 /* --- internals ----
129  *
130  * Roadmap to the code that implements the above.
131  *
132  * > 1. a process/thread issues one or more open() on /dev/netmap, to create
133  * >    select()able file descriptor on which events are reported.
134  *
135  *      Internally, we allocate a netmap_priv_d structure, that will be
136  *      initialized on ioctl(NIOCREGIF).
137  *
138  *      os-specific:
139  *          FreeBSD: netmap_open (netmap_freebsd.c). The priv is
140  *                   per-thread.
141  *          linux:   linux_netmap_open (netmap_linux.c). The priv is
142  *                   per-open.
143  *
144  * > 2. on each descriptor, the process issues an ioctl() to identify
145  * >    the interface that should report events to the file descriptor.
146  *
147  *      Implemented by netmap_ioctl(), NIOCREGIF case, with nmr->nr_cmd==0.
148  *      Most important things happen in netmap_get_na() and
149  *      netmap_do_regif(), called from there. Additional details can be
150  *      found in the comments above those functions.
151  *
152  *      In all cases, this action creates/takes-a-reference-to a
153  *      netmap_*_adapter describing the port, and allocates a netmap_if
154  *      and all necessary netmap rings, filling them with netmap buffers.
155  *
156  *      In this phase, the sync callbacks for each ring are set (these are used
157  *      in steps 5 and 6 below).  The callbacks depend on the type of adapter.
158  *      The adapter creation/initialization code puts them in the
159  *      netmap_adapter (fields na->nm_txsync and na->nm_rxsync).  Then, they
160  *      are copied from there to the netmap_kring's during netmap_do_regif(), by
161  *      the nm_krings_create() callback.  All the nm_krings_create callbacks
162  *      actually call netmap_krings_create() to perform this and the other
163  *      common stuff. netmap_krings_create() also takes care of the host rings,
164  *      if needed, by setting their sync callbacks appropriately.
165  *
166  *      Additional actions depend on the kind of netmap_adapter that has been
167  *      registered:
168  *
169  *      - netmap_hw_adapter:         [netmap.c]
170  *           This is a system netdev/ifp with native netmap support.
171  *           The ifp is detached from the host stack by redirecting:
172  *             - transmissions (from the network stack) to netmap_transmit()
173  *             - receive notifications to the nm_notify() callback for
174  *               this adapter. The callback is normally netmap_notify(), unless
175  *               the ifp is attached to a bridge using bwrap, in which case it
176  *               is netmap_bwrap_intr_notify().
177  *
178  *      - netmap_generic_adapter:      [netmap_generic.c]
179  *            A system netdev/ifp without native netmap support.
180  *
181  *      (the decision about native/non native support is taken in
182  *       netmap_get_hw_na(), called by netmap_get_na())
183  *
184  *      - netmap_vp_adapter             [netmap_vale.c]
185  *            Returned by netmap_get_bdg_na().
186  *            This is a persistent or ephemeral VALE port. Ephemeral ports
187  *            are created on the fly if they don't already exist, and are
188  *            always attached to a bridge.
189  *            Persistent VALE ports must must be created separately, and i
190  *            then attached like normal NICs. The NIOCREGIF we are examining
191  *            will find them only if they had previosly been created and
192  *            attached (see VALE_CTL below).
193  *
194  *      - netmap_pipe_adapter         [netmap_pipe.c]
195  *            Returned by netmap_get_pipe_na().
196  *            Both pipe ends are created, if they didn't already exist.
197  *
198  *      - netmap_monitor_adapter      [netmap_monitor.c]
199  *            Returned by netmap_get_monitor_na().
200  *            If successful, the nm_sync callbacks of the monitored adapter
201  *            will be intercepted by the returned monitor.
202  *
203  *      - netmap_bwrap_adapter        [netmap_vale.c]
204  *            Cannot be obtained in this way, see VALE_CTL below
205  *
206  *
207  *      os-specific:
208  *          linux: we first go through linux_netmap_ioctl() to
209  *                 adapt the FreeBSD interface to the linux one.
210  *
211  *
212  * > 3. on each descriptor, the process issues an mmap() request to
213  * >    map the shared memory region within the process' address space.
214  * >    The list of interesting queues is indicated by a location in
215  * >    the shared memory region.
216  *
217  *      os-specific:
218  *          FreeBSD: netmap_mmap_single (netmap_freebsd.c).
219  *          linux:   linux_netmap_mmap (netmap_linux.c).
220  *
221  * > 4. using the functions in the netmap(4) userspace API, a process
222  * >    can look up the occupation state of a queue, access memory buffers,
223  * >    and retrieve received packets or enqueue packets to transmit.
224  *
225  *      these actions do not involve the kernel.
226  *
227  * > 5. using some ioctl()s the process can synchronize the userspace view
228  * >    of the queue with the actual status in the kernel. This includes both
229  * >    receiving the notification of new packets, and transmitting new
230  * >    packets on the output interface.
231  *
232  *      These are implemented in netmap_ioctl(), NIOCTXSYNC and NIOCRXSYNC
233  *      cases. They invoke the nm_sync callbacks on the netmap_kring
234  *      structures, as initialized in step 2 and maybe later modified
235  *      by a monitor. Monitors, however, will always call the original
236  *      callback before doing anything else.
237  *
238  *
239  * > 6. select() or poll() can be used to wait for events on individual
240  * >    transmit or receive queues (or all queues for a given interface).
241  *
242  *      Implemented in netmap_poll(). This will call the same nm_sync()
243  *      callbacks as in step 5 above.
244  *
245  *      os-specific:
246  *              linux: we first go through linux_netmap_poll() to adapt
247  *                     the FreeBSD interface to the linux one.
248  *
249  *
250  *  ----  VALE_CTL -----
251  *
252  *  VALE switches are controlled by issuing a NIOCREGIF with a non-null
253  *  nr_cmd in the nmreq structure. These subcommands are handled by
254  *  netmap_bdg_ctl() in netmap_vale.c. Persistent VALE ports are created
255  *  and destroyed by issuing the NETMAP_BDG_NEWIF and NETMAP_BDG_DELIF
256  *  subcommands, respectively.
257  *
258  *  Any network interface known to the system (including a persistent VALE
259  *  port) can be attached to a VALE switch by issuing the
260  *  NETMAP_BDG_ATTACH subcommand. After the attachment, persistent VALE ports
261  *  look exactly like ephemeral VALE ports (as created in step 2 above).  The
262  *  attachment of other interfaces, instead, requires the creation of a
263  *  netmap_bwrap_adapter.  Moreover, the attached interface must be put in
264  *  netmap mode. This may require the creation of a netmap_generic_adapter if
265  *  we have no native support for the interface, or if generic adapters have
266  *  been forced by sysctl.
267  *
268  *  Both persistent VALE ports and bwraps are handled by netmap_get_bdg_na(),
269  *  called by nm_bdg_ctl_attach(), and discriminated by the nm_bdg_attach()
270  *  callback.  In the case of the bwrap, the callback creates the
271  *  netmap_bwrap_adapter.  The initialization of the bwrap is then
272  *  completed by calling netmap_do_regif() on it, in the nm_bdg_ctl()
273  *  callback (netmap_bwrap_bdg_ctl in netmap_vale.c).
274  *  A generic adapter for the wrapped ifp will be created if needed, when
275  *  netmap_get_bdg_na() calls netmap_get_hw_na().
276  *
277  *
278  *  ---- DATAPATHS -----
279  *
280  *              -= SYSTEM DEVICE WITH NATIVE SUPPORT =-
281  *
282  *    na == NA(ifp) == netmap_hw_adapter created in DEVICE_netmap_attach()
283  *
284  *    - tx from netmap userspace:
285  *       concurrently:
286  *           1) ioctl(NIOCTXSYNC)/netmap_poll() in process context
287  *                kring->nm_sync() == DEVICE_netmap_txsync()
288  *           2) device interrupt handler
289  *                na->nm_notify()  == netmap_notify()
290  *    - rx from netmap userspace:
291  *       concurrently:
292  *           1) ioctl(NIOCRXSYNC)/netmap_poll() in process context
293  *                kring->nm_sync() == DEVICE_netmap_rxsync()
294  *           2) device interrupt handler
295  *                na->nm_notify()  == netmap_notify()
296  *    - rx from host stack
297  *       concurrently:
298  *           1) host stack
299  *                netmap_transmit()
300  *                  na->nm_notify  == netmap_notify()
301  *           2) ioctl(NIOCRXSYNC)/netmap_poll() in process context
302  *                kring->nm_sync() == netmap_rxsync_from_host_compat
303  *                  netmap_rxsync_from_host(na, NULL, NULL)
304  *    - tx to host stack
305  *           ioctl(NIOCTXSYNC)/netmap_poll() in process context
306  *             kring->nm_sync() == netmap_txsync_to_host_compat
307  *               netmap_txsync_to_host(na)
308  *                 NM_SEND_UP()
309  *                   FreeBSD: na->if_input() == ?? XXX
310  *                   linux: netif_rx() with NM_MAGIC_PRIORITY_RX
311  *
312  *
313  *
314  *               -= SYSTEM DEVICE WITH GENERIC SUPPORT =-
315  *
316  *    na == NA(ifp) == generic_netmap_adapter created in generic_netmap_attach()
317  *
318  *    - tx from netmap userspace:
319  *       concurrently:
320  *           1) ioctl(NIOCTXSYNC)/netmap_poll() in process context
321  *               kring->nm_sync() == generic_netmap_txsync()
322  *                   linux:   dev_queue_xmit() with NM_MAGIC_PRIORITY_TX
323  *                       generic_ndo_start_xmit()
324  *                           orig. dev. start_xmit
325  *                   FreeBSD: na->if_transmit() == orig. dev if_transmit
326  *           2) generic_mbuf_destructor()
327  *                   na->nm_notify() == netmap_notify()
328  *    - rx from netmap userspace:
329  *           1) ioctl(NIOCRXSYNC)/netmap_poll() in process context
330  *               kring->nm_sync() == generic_netmap_rxsync()
331  *                   mbq_safe_dequeue()
332  *           2) device driver
333  *               generic_rx_handler()
334  *                   mbq_safe_enqueue()
335  *                   na->nm_notify() == netmap_notify()
336  *    - rx from host stack:
337  *        concurrently:
338  *           1) host stack
339  *               linux: generic_ndo_start_xmit()
340  *                   netmap_transmit()
341  *               FreeBSD: ifp->if_input() == netmap_transmit
342  *               both:
343  *                       na->nm_notify() == netmap_notify()
344  *           2) ioctl(NIOCRXSYNC)/netmap_poll() in process context
345  *                kring->nm_sync() == netmap_rxsync_from_host_compat
346  *                  netmap_rxsync_from_host(na, NULL, NULL)
347  *    - tx to host stack:
348  *           ioctl(NIOCTXSYNC)/netmap_poll() in process context
349  *             kring->nm_sync() == netmap_txsync_to_host_compat
350  *               netmap_txsync_to_host(na)
351  *                 NM_SEND_UP()
352  *                   FreeBSD: na->if_input() == ??? XXX
353  *                   linux: netif_rx() with NM_MAGIC_PRIORITY_RX
354  *
355  *
356  *                           -= VALE =-
357  *
358  *   INCOMING:
359  *
360  *      - VALE ports:
361  *          ioctl(NIOCTXSYNC)/netmap_poll() in process context
362  *              kring->nm_sync() == netmap_vp_txsync()
363  *
364  *      - system device with native support:
365  *         from cable:
366  *             interrupt
367  *                na->nm_notify() == netmap_bwrap_intr_notify(ring_nr != host ring)
368  *                     kring->nm_sync() == DEVICE_netmap_rxsync()
369  *                     netmap_vp_txsync()
370  *                     kring->nm_sync() == DEVICE_netmap_rxsync()
371  *         from host stack:
372  *             netmap_transmit()
373  *                na->nm_notify() == netmap_bwrap_intr_notify(ring_nr == host ring)
374  *                     kring->nm_sync() == netmap_rxsync_from_host_compat()
375  *                     netmap_vp_txsync()
376  *
377  *      - system device with generic support:
378  *         from device driver:
379  *            generic_rx_handler()
380  *                na->nm_notify() == netmap_bwrap_intr_notify(ring_nr != host ring)
381  *                     kring->nm_sync() == generic_netmap_rxsync()
382  *                     netmap_vp_txsync()
383  *                     kring->nm_sync() == generic_netmap_rxsync()
384  *         from host stack:
385  *            netmap_transmit()
386  *                na->nm_notify() == netmap_bwrap_intr_notify(ring_nr == host ring)
387  *                     kring->nm_sync() == netmap_rxsync_from_host_compat()
388  *                     netmap_vp_txsync()
389  *
390  *   (all cases) --> nm_bdg_flush()
391  *                      dest_na->nm_notify() == (see below)
392  *
393  *   OUTGOING:
394  *
395  *      - VALE ports:
396  *         concurrently:
397  *             1) ioctlNIOCRXSYNC)/netmap_poll() in process context
398  *                    kring->nm_sync() == netmap_vp_rxsync()
399  *             2) from nm_bdg_flush()
400  *                    na->nm_notify() == netmap_notify()
401  *
402  *      - system device with native support:
403  *          to cable:
404  *             na->nm_notify() == netmap_bwrap_notify()
405  *                 netmap_vp_rxsync()
406  *                 kring->nm_sync() == DEVICE_netmap_txsync()
407  *                 netmap_vp_rxsync()
408  *          to host stack:
409  *                 netmap_vp_rxsync()
410  *                 kring->nm_sync() == netmap_txsync_to_host_compat
411  *                 netmap_vp_rxsync_locked()
412  *
413  *      - system device with generic adapter:
414  *          to device driver:
415  *             na->nm_notify() == netmap_bwrap_notify()
416  *                 netmap_vp_rxsync()
417  *                 kring->nm_sync() == generic_netmap_txsync()
418  *                 netmap_vp_rxsync()
419  *          to host stack:
420  *                 netmap_vp_rxsync()
421  *                 kring->nm_sync() == netmap_txsync_to_host_compat
422  *                 netmap_vp_rxsync()
423  *
424  */
425
426 /*
427  * OS-specific code that is used only within this file.
428  * Other OS-specific code that must be accessed by drivers
429  * is present in netmap_kern.h
430  */
431
432 #if defined(__FreeBSD__)
433 #include <sys/cdefs.h> /* prerequisite */
434 #include <sys/types.h>
435 #include <sys/errno.h>
436 #include <sys/param.h>  /* defines used in kernel.h */
437 #include <sys/kernel.h> /* types used in module initialization */
438 #include <sys/conf.h>   /* cdevsw struct, UID, GID */
439 #include <sys/filio.h>  /* FIONBIO */
440 #include <sys/sockio.h>
441 #include <sys/socketvar.h>      /* struct socket */
442 #include <sys/malloc.h>
443 #include <sys/poll.h>
444 #include <sys/rwlock.h>
445 #include <sys/socket.h> /* sockaddrs */
446 #include <sys/selinfo.h>
447 #include <sys/sysctl.h>
448 #include <sys/jail.h>
449 #include <net/vnet.h>
450 #include <net/if.h>
451 #include <net/if_var.h>
452 #include <net/bpf.h>            /* BIOCIMMEDIATE */
453 #include <machine/bus.h>        /* bus_dmamap_* */
454 #include <sys/endian.h>
455 #include <sys/refcount.h>
456
457
458 /* reduce conditional code */
459 // linux API, use for the knlist in FreeBSD
460 /* use a private mutex for the knlist */
461 #define init_waitqueue_head(x) do {                     \
462         struct mtx *m = &(x)->m;                        \
463         mtx_init(m, "nm_kn_lock", NULL, MTX_DEF);       \
464         knlist_init_mtx(&(x)->si.si_note, m);           \
465     } while (0)
466
467 #define OS_selrecord(a, b)      selrecord(a, &((b)->si))
468 #define OS_selwakeup(a, b)      freebsd_selwakeup(a, b)
469
470 #elif defined(linux)
471
472 #include "bsd_glue.h"
473
474
475
476 #elif defined(__APPLE__)
477
478 #warning OSX support is only partial
479 #include "osx_glue.h"
480
481 #else
482
483 #error  Unsupported platform
484
485 #endif /* unsupported */
486
487 /*
488  * common headers
489  */
490 #include <net/netmap.h>
491 #include <dev/netmap/netmap_kern.h>
492 #include <dev/netmap/netmap_mem2.h>
493
494
495 MALLOC_DEFINE(M_NETMAP, "netmap", "Network memory map");
496
497 /* user-controlled variables */
498 int netmap_verbose;
499
500 static int netmap_no_timestamp; /* don't timestamp on rxsync */
501
502 SYSCTL_NODE(_dev, OID_AUTO, netmap, CTLFLAG_RW, 0, "Netmap args");
503 SYSCTL_INT(_dev_netmap, OID_AUTO, verbose,
504     CTLFLAG_RW, &netmap_verbose, 0, "Verbose mode");
505 SYSCTL_INT(_dev_netmap, OID_AUTO, no_timestamp,
506     CTLFLAG_RW, &netmap_no_timestamp, 0, "no_timestamp");
507 int netmap_mitigate = 1;
508 SYSCTL_INT(_dev_netmap, OID_AUTO, mitigate, CTLFLAG_RW, &netmap_mitigate, 0, "");
509 int netmap_no_pendintr = 1;
510 SYSCTL_INT(_dev_netmap, OID_AUTO, no_pendintr,
511     CTLFLAG_RW, &netmap_no_pendintr, 0, "Always look for new received packets.");
512 int netmap_txsync_retry = 2;
513 SYSCTL_INT(_dev_netmap, OID_AUTO, txsync_retry, CTLFLAG_RW,
514     &netmap_txsync_retry, 0 , "Number of txsync loops in bridge's flush.");
515
516 int netmap_adaptive_io = 0;
517 SYSCTL_INT(_dev_netmap, OID_AUTO, adaptive_io, CTLFLAG_RW,
518     &netmap_adaptive_io, 0 , "Adaptive I/O on paravirt");
519
520 int netmap_flags = 0;   /* debug flags */
521 int netmap_fwd = 0;     /* force transparent mode */
522
523 /*
524  * netmap_admode selects the netmap mode to use.
525  * Invalid values are reset to NETMAP_ADMODE_BEST
526  */
527 enum { NETMAP_ADMODE_BEST = 0,  /* use native, fallback to generic */
528         NETMAP_ADMODE_NATIVE,   /* either native or none */
529         NETMAP_ADMODE_GENERIC,  /* force generic */
530         NETMAP_ADMODE_LAST };
531 static int netmap_admode = NETMAP_ADMODE_BEST;
532
533 int netmap_generic_mit = 100*1000;   /* Generic mitigation interval in nanoseconds. */
534 int netmap_generic_ringsize = 1024;   /* Generic ringsize. */
535 int netmap_generic_rings = 1;   /* number of queues in generic. */
536
537 SYSCTL_INT(_dev_netmap, OID_AUTO, flags, CTLFLAG_RW, &netmap_flags, 0 , "");
538 SYSCTL_INT(_dev_netmap, OID_AUTO, fwd, CTLFLAG_RW, &netmap_fwd, 0 , "");
539 SYSCTL_INT(_dev_netmap, OID_AUTO, admode, CTLFLAG_RW, &netmap_admode, 0 , "");
540 SYSCTL_INT(_dev_netmap, OID_AUTO, generic_mit, CTLFLAG_RW, &netmap_generic_mit, 0 , "");
541 SYSCTL_INT(_dev_netmap, OID_AUTO, generic_ringsize, CTLFLAG_RW, &netmap_generic_ringsize, 0 , "");
542 SYSCTL_INT(_dev_netmap, OID_AUTO, generic_rings, CTLFLAG_RW, &netmap_generic_rings, 0 , "");
543
544 NMG_LOCK_T      netmap_global_lock;
545 int netmap_use_count = 0; /* number of active netmap instances */
546
547 /*
548  * mark the ring as stopped, and run through the locks
549  * to make sure other users get to see it.
550  */
551 static void
552 netmap_disable_ring(struct netmap_kring *kr)
553 {
554         kr->nkr_stopped = 1;
555         nm_kr_get(kr);
556         mtx_lock(&kr->q_lock);
557         mtx_unlock(&kr->q_lock);
558         nm_kr_put(kr);
559 }
560
561 /* stop or enable a single ring */
562 void
563 netmap_set_ring(struct netmap_adapter *na, u_int ring_id, enum txrx t, int stopped)
564 {
565         if (stopped)
566                 netmap_disable_ring(NMR(na, t) + ring_id);
567         else
568                 NMR(na, t)[ring_id].nkr_stopped = 0;
569 }
570
571
572 /* stop or enable all the rings of na */
573 void
574 netmap_set_all_rings(struct netmap_adapter *na, int stopped)
575 {
576         int i;
577         enum txrx t;
578
579         if (!nm_netmap_on(na))
580                 return;
581
582         for_rx_tx(t) {
583                 for (i = 0; i < netmap_real_rings(na, t); i++) {
584                         netmap_set_ring(na, i, t, stopped);
585                 }
586         }
587 }
588
589 /*
590  * Convenience function used in drivers.  Waits for current txsync()s/rxsync()s
591  * to finish and prevents any new one from starting.  Call this before turning
592  * netmap mode off, or before removing the hardware rings (e.g., on module
593  * onload).  As a rule of thumb for linux drivers, this should be placed near
594  * each napi_disable().
595  */
596 void
597 netmap_disable_all_rings(struct ifnet *ifp)
598 {
599         netmap_set_all_rings(NA(ifp), 1 /* stopped */);
600 }
601
602 /*
603  * Convenience function used in drivers.  Re-enables rxsync and txsync on the
604  * adapter's rings In linux drivers, this should be placed near each
605  * napi_enable().
606  */
607 void
608 netmap_enable_all_rings(struct ifnet *ifp)
609 {
610         netmap_set_all_rings(NA(ifp), 0 /* enabled */);
611 }
612
613
614 /*
615  * generic bound_checking function
616  */
617 u_int
618 nm_bound_var(u_int *v, u_int dflt, u_int lo, u_int hi, const char *msg)
619 {
620         u_int oldv = *v;
621         const char *op = NULL;
622
623         if (dflt < lo)
624                 dflt = lo;
625         if (dflt > hi)
626                 dflt = hi;
627         if (oldv < lo) {
628                 *v = dflt;
629                 op = "Bump";
630         } else if (oldv > hi) {
631                 *v = hi;
632                 op = "Clamp";
633         }
634         if (op && msg)
635                 printf("%s %s to %d (was %d)\n", op, msg, *v, oldv);
636         return *v;
637 }
638
639
640 /*
641  * packet-dump function, user-supplied or static buffer.
642  * The destination buffer must be at least 30+4*len
643  */
644 const char *
645 nm_dump_buf(char *p, int len, int lim, char *dst)
646 {
647         static char _dst[8192];
648         int i, j, i0;
649         static char hex[] ="0123456789abcdef";
650         char *o;        /* output position */
651
652 #define P_HI(x) hex[((x) & 0xf0)>>4]
653 #define P_LO(x) hex[((x) & 0xf)]
654 #define P_C(x)  ((x) >= 0x20 && (x) <= 0x7e ? (x) : '.')
655         if (!dst)
656                 dst = _dst;
657         if (lim <= 0 || lim > len)
658                 lim = len;
659         o = dst;
660         sprintf(o, "buf 0x%p len %d lim %d\n", p, len, lim);
661         o += strlen(o);
662         /* hexdump routine */
663         for (i = 0; i < lim; ) {
664                 sprintf(o, "%5d: ", i);
665                 o += strlen(o);
666                 memset(o, ' ', 48);
667                 i0 = i;
668                 for (j=0; j < 16 && i < lim; i++, j++) {
669                         o[j*3] = P_HI(p[i]);
670                         o[j*3+1] = P_LO(p[i]);
671                 }
672                 i = i0;
673                 for (j=0; j < 16 && i < lim; i++, j++)
674                         o[j + 48] = P_C(p[i]);
675                 o[j+48] = '\n';
676                 o += j+49;
677         }
678         *o = '\0';
679 #undef P_HI
680 #undef P_LO
681 #undef P_C
682         return dst;
683 }
684
685
686 /*
687  * Fetch configuration from the device, to cope with dynamic
688  * reconfigurations after loading the module.
689  */
690 /* call with NMG_LOCK held */
691 int
692 netmap_update_config(struct netmap_adapter *na)
693 {
694         u_int txr, txd, rxr, rxd;
695
696         txr = txd = rxr = rxd = 0;
697         if (na->nm_config == NULL ||
698             na->nm_config(na, &txr, &txd, &rxr, &rxd))
699         {
700                 /* take whatever we had at init time */
701                 txr = na->num_tx_rings;
702                 txd = na->num_tx_desc;
703                 rxr = na->num_rx_rings;
704                 rxd = na->num_rx_desc;
705         }
706
707         if (na->num_tx_rings == txr && na->num_tx_desc == txd &&
708             na->num_rx_rings == rxr && na->num_rx_desc == rxd)
709                 return 0; /* nothing changed */
710         if (netmap_verbose || na->active_fds > 0) {
711                 D("stored config %s: txring %d x %d, rxring %d x %d",
712                         na->name,
713                         na->num_tx_rings, na->num_tx_desc,
714                         na->num_rx_rings, na->num_rx_desc);
715                 D("new config %s: txring %d x %d, rxring %d x %d",
716                         na->name, txr, txd, rxr, rxd);
717         }
718         if (na->active_fds == 0) {
719                 D("configuration changed (but fine)");
720                 na->num_tx_rings = txr;
721                 na->num_tx_desc = txd;
722                 na->num_rx_rings = rxr;
723                 na->num_rx_desc = rxd;
724                 return 0;
725         }
726         D("configuration changed while active, this is bad...");
727         return 1;
728 }
729
730 static void netmap_txsync_to_host(struct netmap_adapter *na);
731 static int netmap_rxsync_from_host(struct netmap_adapter *na, struct thread *td, void *pwait);
732
733 /* kring->nm_sync callback for the host tx ring */
734 static int
735 netmap_txsync_to_host_compat(struct netmap_kring *kring, int flags)
736 {
737         (void)flags; /* unused */
738         netmap_txsync_to_host(kring->na);
739         return 0;
740 }
741
742 /* kring->nm_sync callback for the host rx ring */
743 static int
744 netmap_rxsync_from_host_compat(struct netmap_kring *kring, int flags)
745 {
746         (void)flags; /* unused */
747         netmap_rxsync_from_host(kring->na, NULL, NULL);
748         return 0;
749 }
750
751
752
753 /* create the krings array and initialize the fields common to all adapters.
754  * The array layout is this:
755  *
756  *                    +----------+
757  * na->tx_rings ----->|          | \
758  *                    |          |  } na->num_tx_ring
759  *                    |          | /
760  *                    +----------+
761  *                    |          |    host tx kring
762  * na->rx_rings ----> +----------+
763  *                    |          | \
764  *                    |          |  } na->num_rx_rings
765  *                    |          | /
766  *                    +----------+
767  *                    |          |    host rx kring
768  *                    +----------+
769  * na->tailroom ----->|          | \
770  *                    |          |  } tailroom bytes
771  *                    |          | /
772  *                    +----------+
773  *
774  * Note: for compatibility, host krings are created even when not needed.
775  * The tailroom space is currently used by vale ports for allocating leases.
776  */
777 /* call with NMG_LOCK held */
778 int
779 netmap_krings_create(struct netmap_adapter *na, u_int tailroom)
780 {
781         u_int i, len, ndesc;
782         struct netmap_kring *kring;
783         u_int n[NR_TXRX];
784         enum txrx t;
785
786         /* account for the (possibly fake) host rings */
787         n[NR_TX] = na->num_tx_rings + 1;
788         n[NR_RX] = na->num_rx_rings + 1;
789
790         len = (n[NR_TX] + n[NR_RX]) * sizeof(struct netmap_kring) + tailroom;
791
792         na->tx_rings = malloc((size_t)len, M_DEVBUF, M_NOWAIT | M_ZERO);
793         if (na->tx_rings == NULL) {
794                 D("Cannot allocate krings");
795                 return ENOMEM;
796         }
797         na->rx_rings = na->tx_rings + n[NR_TX];
798
799         /*
800          * All fields in krings are 0 except the one initialized below.
801          * but better be explicit on important kring fields.
802          */
803         for_rx_tx(t) {
804                 ndesc = nma_get_ndesc(na, t);
805                 for (i = 0; i < n[t]; i++) {
806                         kring = &NMR(na, t)[i];
807                         bzero(kring, sizeof(*kring));
808                         kring->na = na;
809                         kring->ring_id = i;
810                         kring->tx = t;
811                         kring->nkr_num_slots = ndesc;
812                         if (i < nma_get_nrings(na, t)) {
813                                 kring->nm_sync = (t == NR_TX ? na->nm_txsync : na->nm_rxsync);
814                         } else if (i == na->num_tx_rings) {
815                                 kring->nm_sync = (t == NR_TX ?
816                                                 netmap_txsync_to_host_compat :
817                                                 netmap_rxsync_from_host_compat);
818                         }
819                         kring->nm_notify = na->nm_notify;
820                         kring->rhead = kring->rcur = kring->nr_hwcur = 0;
821                         /*
822                          * IMPORTANT: Always keep one slot empty.
823                          */
824                         kring->rtail = kring->nr_hwtail = (t == NR_TX ? ndesc - 1 : 0);
825                         snprintf(kring->name, sizeof(kring->name) - 1, "%s %s%d", na->name, 
826                                         nm_txrx2str(t), i);
827                         ND("ktx %s h %d c %d t %d",
828                                 kring->name, kring->rhead, kring->rcur, kring->rtail);
829                         mtx_init(&kring->q_lock, (t == NR_TX ? "nm_txq_lock" : "nm_rxq_lock"), NULL, MTX_DEF);
830                         init_waitqueue_head(&kring->si);
831                 }
832                 init_waitqueue_head(&na->si[t]);
833         }
834
835         na->tailroom = na->rx_rings + n[NR_RX];
836
837         return 0;
838 }
839
840
841 #ifdef __FreeBSD__
842 static void
843 netmap_knlist_destroy(NM_SELINFO_T *si)
844 {
845         /* XXX kqueue(9) needed; these will mirror knlist_init. */
846         knlist_delete(&si->si.si_note, curthread, 0 /* not locked */ );
847         knlist_destroy(&si->si.si_note);
848         /* now we don't need the mutex anymore */
849         mtx_destroy(&si->m);
850 }
851 #endif /* __FreeBSD__ */
852
853
854 /* undo the actions performed by netmap_krings_create */
855 /* call with NMG_LOCK held */
856 void
857 netmap_krings_delete(struct netmap_adapter *na)
858 {
859         struct netmap_kring *kring = na->tx_rings;
860         enum txrx t;
861
862         for_rx_tx(t)
863                 netmap_knlist_destroy(&na->si[t]);
864
865         /* we rely on the krings layout described above */
866         for ( ; kring != na->tailroom; kring++) {
867                 mtx_destroy(&kring->q_lock);
868                 netmap_knlist_destroy(&kring->si);
869         }
870         free(na->tx_rings, M_DEVBUF);
871         na->tx_rings = na->rx_rings = na->tailroom = NULL;
872 }
873
874
875 /*
876  * Destructor for NIC ports. They also have an mbuf queue
877  * on the rings connected to the host so we need to purge
878  * them first.
879  */
880 /* call with NMG_LOCK held */
881 static void
882 netmap_hw_krings_delete(struct netmap_adapter *na)
883 {
884         struct mbq *q = &na->rx_rings[na->num_rx_rings].rx_queue;
885
886         ND("destroy sw mbq with len %d", mbq_len(q));
887         mbq_purge(q);
888         mbq_safe_destroy(q);
889         netmap_krings_delete(na);
890 }
891
892
893
894 /*
895  * Undo everything that was done in netmap_do_regif(). In particular,
896  * call nm_register(ifp,0) to stop netmap mode on the interface and
897  * revert to normal operation.
898  */
899 /* call with NMG_LOCK held */
900 static void netmap_unset_ringid(struct netmap_priv_d *);
901 static void netmap_rel_exclusive(struct netmap_priv_d *);
902 static void
903 netmap_do_unregif(struct netmap_priv_d *priv)
904 {
905         struct netmap_adapter *na = priv->np_na;
906
907         NMG_LOCK_ASSERT();
908         na->active_fds--;
909         /* release exclusive use if it was requested on regif */
910         netmap_rel_exclusive(priv);
911         if (na->active_fds <= 0) {      /* last instance */
912
913                 if (netmap_verbose)
914                         D("deleting last instance for %s", na->name);
915
916 #ifdef  WITH_MONITOR
917                 /* walk through all the rings and tell any monitor
918                  * that the port is going to exit netmap mode
919                  */
920                 netmap_monitor_stop(na);
921 #endif
922                 /*
923                  * (TO CHECK) This function is only called
924                  * when the last reference to this file descriptor goes
925                  * away. This means we cannot have any pending poll()
926                  * or interrupt routine operating on the structure.
927                  * XXX The file may be closed in a thread while
928                  * another thread is using it.
929                  * Linux keeps the file opened until the last reference
930                  * by any outstanding ioctl/poll or mmap is gone.
931                  * FreeBSD does not track mmap()s (but we do) and
932                  * wakes up any sleeping poll(). Need to check what
933                  * happens if the close() occurs while a concurrent
934                  * syscall is running.
935                  */
936                 na->nm_register(na, 0); /* off, clear flags */
937                 /* Wake up any sleeping threads. netmap_poll will
938                  * then return POLLERR
939                  * XXX The wake up now must happen during *_down(), when
940                  * we order all activities to stop. -gl
941                  */
942                 /* delete rings and buffers */
943                 netmap_mem_rings_delete(na);
944                 na->nm_krings_delete(na);
945         }
946         /* possibily decrement counter of tx_si/rx_si users */
947         netmap_unset_ringid(priv);
948         /* delete the nifp */
949         netmap_mem_if_delete(na, priv->np_nifp);
950         /* drop the allocator */
951         netmap_mem_deref(na->nm_mem, na);
952         /* mark the priv as unregistered */
953         priv->np_na = NULL;
954         priv->np_nifp = NULL;
955 }
956
957 /* call with NMG_LOCK held */
958 static __inline int
959 nm_si_user(struct netmap_priv_d *priv, enum txrx t)
960 {
961         return (priv->np_na != NULL &&
962                 (priv->np_qlast[t] - priv->np_qfirst[t] > 1));
963 }
964
965 /*
966  * Destructor of the netmap_priv_d, called when the fd is closed
967  * Action: undo all the things done by NIOCREGIF,
968  * On FreeBSD we need to track whether there are active mmap()s,
969  * and we use np_active_mmaps for that. On linux, the field is always 0.
970  * Return: 1 if we can free priv, 0 otherwise.
971  *
972  */
973 /* call with NMG_LOCK held */
974 int
975 netmap_dtor_locked(struct netmap_priv_d *priv)
976 {
977         struct netmap_adapter *na = priv->np_na;
978
979         /* number of active references to this fd */
980         if (--priv->np_refs > 0) {
981                 return 0;
982         }
983         netmap_use_count--;
984         if (!na) {
985                 return 1; //XXX is it correct?
986         }
987         netmap_do_unregif(priv);
988         netmap_adapter_put(na);
989         return 1;
990 }
991
992
993 /* call with NMG_LOCK *not* held */
994 void
995 netmap_dtor(void *data)
996 {
997         struct netmap_priv_d *priv = data;
998         int last_instance;
999
1000         NMG_LOCK();
1001         last_instance = netmap_dtor_locked(priv);
1002         NMG_UNLOCK();
1003         if (last_instance) {
1004                 bzero(priv, sizeof(*priv));     /* for safety */
1005                 free(priv, M_DEVBUF);
1006         }
1007 }
1008
1009
1010
1011
1012 /*
1013  * Handlers for synchronization of the queues from/to the host.
1014  * Netmap has two operating modes:
1015  * - in the default mode, the rings connected to the host stack are
1016  *   just another ring pair managed by userspace;
1017  * - in transparent mode (XXX to be defined) incoming packets
1018  *   (from the host or the NIC) are marked as NS_FORWARD upon
1019  *   arrival, and the user application has a chance to reset the
1020  *   flag for packets that should be dropped.
1021  *   On the RXSYNC or poll(), packets in RX rings between
1022  *   kring->nr_kcur and ring->cur with NS_FORWARD still set are moved
1023  *   to the other side.
1024  * The transfer NIC --> host is relatively easy, just encapsulate
1025  * into mbufs and we are done. The host --> NIC side is slightly
1026  * harder because there might not be room in the tx ring so it
1027  * might take a while before releasing the buffer.
1028  */
1029
1030
1031 /*
1032  * pass a chain of buffers to the host stack as coming from 'dst'
1033  * We do not need to lock because the queue is private.
1034  */
1035 static void
1036 netmap_send_up(struct ifnet *dst, struct mbq *q)
1037 {
1038         struct mbuf *m;
1039
1040         /* send packets up, outside the lock */
1041         while ((m = mbq_dequeue(q)) != NULL) {
1042                 if (netmap_verbose & NM_VERB_HOST)
1043                         D("sending up pkt %p size %d", m, MBUF_LEN(m));
1044                 NM_SEND_UP(dst, m);
1045         }
1046         mbq_destroy(q);
1047 }
1048
1049
1050 /*
1051  * put a copy of the buffers marked NS_FORWARD into an mbuf chain.
1052  * Take packets from hwcur to ring->head marked NS_FORWARD (or forced)
1053  * and pass them up. Drop remaining packets in the unlikely event
1054  * of an mbuf shortage.
1055  */
1056 static void
1057 netmap_grab_packets(struct netmap_kring *kring, struct mbq *q, int force)
1058 {
1059         u_int const lim = kring->nkr_num_slots - 1;
1060         u_int const head = kring->rhead;
1061         u_int n;
1062         struct netmap_adapter *na = kring->na;
1063
1064         for (n = kring->nr_hwcur; n != head; n = nm_next(n, lim)) {
1065                 struct mbuf *m;
1066                 struct netmap_slot *slot = &kring->ring->slot[n];
1067
1068                 if ((slot->flags & NS_FORWARD) == 0 && !force)
1069                         continue;
1070                 if (slot->len < 14 || slot->len > NETMAP_BUF_SIZE(na)) {
1071                         RD(5, "bad pkt at %d len %d", n, slot->len);
1072                         continue;
1073                 }
1074                 slot->flags &= ~NS_FORWARD; // XXX needed ?
1075                 /* XXX TODO: adapt to the case of a multisegment packet */
1076                 m = m_devget(NMB(na, slot), slot->len, 0, na->ifp, NULL);
1077
1078                 if (m == NULL)
1079                         break;
1080                 mbq_enqueue(q, m);
1081         }
1082 }
1083
1084
1085 /*
1086  * Send to the NIC rings packets marked NS_FORWARD between
1087  * kring->nr_hwcur and kring->rhead
1088  * Called under kring->rx_queue.lock on the sw rx ring,
1089  */
1090 static u_int
1091 netmap_sw_to_nic(struct netmap_adapter *na)
1092 {
1093         struct netmap_kring *kring = &na->rx_rings[na->num_rx_rings];
1094         struct netmap_slot *rxslot = kring->ring->slot;
1095         u_int i, rxcur = kring->nr_hwcur;
1096         u_int const head = kring->rhead;
1097         u_int const src_lim = kring->nkr_num_slots - 1;
1098         u_int sent = 0;
1099
1100         /* scan rings to find space, then fill as much as possible */
1101         for (i = 0; i < na->num_tx_rings; i++) {
1102                 struct netmap_kring *kdst = &na->tx_rings[i];
1103                 struct netmap_ring *rdst = kdst->ring;
1104                 u_int const dst_lim = kdst->nkr_num_slots - 1;
1105
1106                 /* XXX do we trust ring or kring->rcur,rtail ? */
1107                 for (; rxcur != head && !nm_ring_empty(rdst);
1108                      rxcur = nm_next(rxcur, src_lim) ) {
1109                         struct netmap_slot *src, *dst, tmp;
1110                         u_int dst_cur = rdst->cur;
1111
1112                         src = &rxslot[rxcur];
1113                         if ((src->flags & NS_FORWARD) == 0 && !netmap_fwd)
1114                                 continue;
1115
1116                         sent++;
1117
1118                         dst = &rdst->slot[dst_cur];
1119
1120                         tmp = *src;
1121
1122                         src->buf_idx = dst->buf_idx;
1123                         src->flags = NS_BUF_CHANGED;
1124
1125                         dst->buf_idx = tmp.buf_idx;
1126                         dst->len = tmp.len;
1127                         dst->flags = NS_BUF_CHANGED;
1128
1129                         rdst->cur = nm_next(dst_cur, dst_lim);
1130                 }
1131                 /* if (sent) XXX txsync ? */
1132         }
1133         return sent;
1134 }
1135
1136
1137 /*
1138  * netmap_txsync_to_host() passes packets up. We are called from a
1139  * system call in user process context, and the only contention
1140  * can be among multiple user threads erroneously calling
1141  * this routine concurrently.
1142  */
1143 static void
1144 netmap_txsync_to_host(struct netmap_adapter *na)
1145 {
1146         struct netmap_kring *kring = &na->tx_rings[na->num_tx_rings];
1147         u_int const lim = kring->nkr_num_slots - 1;
1148         u_int const head = kring->rhead;
1149         struct mbq q;
1150
1151         /* Take packets from hwcur to head and pass them up.
1152          * force head = cur since netmap_grab_packets() stops at head
1153          * In case of no buffers we give up. At the end of the loop,
1154          * the queue is drained in all cases.
1155          */
1156         mbq_init(&q);
1157         netmap_grab_packets(kring, &q, 1 /* force */);
1158         ND("have %d pkts in queue", mbq_len(&q));
1159         kring->nr_hwcur = head;
1160         kring->nr_hwtail = head + lim;
1161         if (kring->nr_hwtail > lim)
1162                 kring->nr_hwtail -= lim + 1;
1163
1164         netmap_send_up(na->ifp, &q);
1165 }
1166
1167
1168 /*
1169  * rxsync backend for packets coming from the host stack.
1170  * They have been put in kring->rx_queue by netmap_transmit().
1171  * We protect access to the kring using kring->rx_queue.lock
1172  *
1173  * This routine also does the selrecord if called from the poll handler
1174  * (we know because td != NULL).
1175  *
1176  * NOTE: on linux, selrecord() is defined as a macro and uses pwait
1177  *     as an additional hidden argument.
1178  * returns the number of packets delivered to tx queues in
1179  * transparent mode, or a negative value if error
1180  */
1181 static int
1182 netmap_rxsync_from_host(struct netmap_adapter *na, struct thread *td, void *pwait)
1183 {
1184         struct netmap_kring *kring = &na->rx_rings[na->num_rx_rings];
1185         struct netmap_ring *ring = kring->ring;
1186         u_int nm_i, n;
1187         u_int const lim = kring->nkr_num_slots - 1;
1188         u_int const head = kring->rhead;
1189         int ret = 0;
1190         struct mbq *q = &kring->rx_queue, fq;
1191
1192         (void)pwait;    /* disable unused warnings */
1193         (void)td;
1194
1195         mbq_init(&fq); /* fq holds packets to be freed */
1196
1197         mbq_lock(q);
1198
1199         /* First part: import newly received packets */
1200         n = mbq_len(q);
1201         if (n) { /* grab packets from the queue */
1202                 struct mbuf *m;
1203                 uint32_t stop_i;
1204
1205                 nm_i = kring->nr_hwtail;
1206                 stop_i = nm_prev(nm_i, lim);
1207                 while ( nm_i != stop_i && (m = mbq_dequeue(q)) != NULL ) {
1208                         int len = MBUF_LEN(m);
1209                         struct netmap_slot *slot = &ring->slot[nm_i];
1210
1211                         m_copydata(m, 0, len, NMB(na, slot));
1212                         ND("nm %d len %d", nm_i, len);
1213                         if (netmap_verbose)
1214                                 D("%s", nm_dump_buf(NMB(na, slot),len, 128, NULL));
1215
1216                         slot->len = len;
1217                         slot->flags = kring->nkr_slot_flags;
1218                         nm_i = nm_next(nm_i, lim);
1219                         mbq_enqueue(&fq, m);
1220                 }
1221                 kring->nr_hwtail = nm_i;
1222         }
1223
1224         /*
1225          * Second part: skip past packets that userspace has released.
1226          */
1227         nm_i = kring->nr_hwcur;
1228         if (nm_i != head) { /* something was released */
1229                 if (netmap_fwd || kring->ring->flags & NR_FORWARD)
1230                         ret = netmap_sw_to_nic(na);
1231                 kring->nr_hwcur = head;
1232         }
1233
1234         /* access copies of cur,tail in the kring */
1235         if (kring->rcur == kring->rtail && td) /* no bufs available */
1236                 OS_selrecord(td, &kring->si);
1237
1238         mbq_unlock(q);
1239
1240         mbq_purge(&fq);
1241         mbq_destroy(&fq);
1242
1243         return ret;
1244 }
1245
1246
1247 /* Get a netmap adapter for the port.
1248  *
1249  * If it is possible to satisfy the request, return 0
1250  * with *na containing the netmap adapter found.
1251  * Otherwise return an error code, with *na containing NULL.
1252  *
1253  * When the port is attached to a bridge, we always return
1254  * EBUSY.
1255  * Otherwise, if the port is already bound to a file descriptor,
1256  * then we unconditionally return the existing adapter into *na.
1257  * In all the other cases, we return (into *na) either native,
1258  * generic or NULL, according to the following table:
1259  *
1260  *                                      native_support
1261  * active_fds   dev.netmap.admode         YES     NO
1262  * -------------------------------------------------------
1263  *    >0              *                 NA(ifp) NA(ifp)
1264  *
1265  *     0        NETMAP_ADMODE_BEST      NATIVE  GENERIC
1266  *     0        NETMAP_ADMODE_NATIVE    NATIVE   NULL
1267  *     0        NETMAP_ADMODE_GENERIC   GENERIC GENERIC
1268  *
1269  */
1270
1271 int
1272 netmap_get_hw_na(struct ifnet *ifp, struct netmap_adapter **na)
1273 {
1274         /* generic support */
1275         int i = netmap_admode;  /* Take a snapshot. */
1276         struct netmap_adapter *prev_na;
1277 #ifdef WITH_GENERIC
1278         struct netmap_generic_adapter *gna;
1279         int error = 0;
1280 #endif
1281
1282         *na = NULL; /* default */
1283
1284         /* reset in case of invalid value */
1285         if (i < NETMAP_ADMODE_BEST || i >= NETMAP_ADMODE_LAST)
1286                 i = netmap_admode = NETMAP_ADMODE_BEST;
1287
1288         if (NETMAP_CAPABLE(ifp)) {
1289                 prev_na = NA(ifp);
1290                 /* If an adapter already exists, return it if
1291                  * there are active file descriptors or if
1292                  * netmap is not forced to use generic
1293                  * adapters.
1294                  */
1295                 if (NETMAP_OWNED_BY_ANY(prev_na)
1296                         || i != NETMAP_ADMODE_GENERIC
1297                         || prev_na->na_flags & NAF_FORCE_NATIVE
1298 #ifdef WITH_PIPES
1299                         /* ugly, but we cannot allow an adapter switch
1300                          * if some pipe is referring to this one
1301                          */
1302                         || prev_na->na_next_pipe > 0
1303 #endif
1304                 ) {
1305                         *na = prev_na;
1306                         return 0;
1307                 }
1308         }
1309
1310         /* If there isn't native support and netmap is not allowed
1311          * to use generic adapters, we cannot satisfy the request.
1312          */
1313         if (!NETMAP_CAPABLE(ifp) && i == NETMAP_ADMODE_NATIVE)
1314                 return EOPNOTSUPP;
1315
1316 #ifdef WITH_GENERIC
1317         /* Otherwise, create a generic adapter and return it,
1318          * saving the previously used netmap adapter, if any.
1319          *
1320          * Note that here 'prev_na', if not NULL, MUST be a
1321          * native adapter, and CANNOT be a generic one. This is
1322          * true because generic adapters are created on demand, and
1323          * destroyed when not used anymore. Therefore, if the adapter
1324          * currently attached to an interface 'ifp' is generic, it
1325          * must be that
1326          * (NA(ifp)->active_fds > 0 || NETMAP_OWNED_BY_KERN(NA(ifp))).
1327          * Consequently, if NA(ifp) is generic, we will enter one of
1328          * the branches above. This ensures that we never override
1329          * a generic adapter with another generic adapter.
1330          */
1331         prev_na = NA(ifp);
1332         error = generic_netmap_attach(ifp);
1333         if (error)
1334                 return error;
1335
1336         *na = NA(ifp);
1337         gna = (struct netmap_generic_adapter*)NA(ifp);
1338         gna->prev = prev_na; /* save old na */
1339         if (prev_na != NULL) {
1340                 ifunit_ref(ifp->if_xname);
1341                 // XXX add a refcount ?
1342                 netmap_adapter_get(prev_na);
1343         }
1344         ND("Created generic NA %p (prev %p)", gna, gna->prev);
1345
1346         return 0;
1347 #else /* !WITH_GENERIC */
1348         return EOPNOTSUPP;
1349 #endif
1350 }
1351
1352
1353 /*
1354  * MUST BE CALLED UNDER NMG_LOCK()
1355  *
1356  * Get a refcounted reference to a netmap adapter attached
1357  * to the interface specified by nmr.
1358  * This is always called in the execution of an ioctl().
1359  *
1360  * Return ENXIO if the interface specified by the request does
1361  * not exist, ENOTSUP if netmap is not supported by the interface,
1362  * EBUSY if the interface is already attached to a bridge,
1363  * EINVAL if parameters are invalid, ENOMEM if needed resources
1364  * could not be allocated.
1365  * If successful, hold a reference to the netmap adapter.
1366  *
1367  * No reference is kept on the real interface, which may then
1368  * disappear at any time.
1369  */
1370 int
1371 netmap_get_na(struct nmreq *nmr, struct netmap_adapter **na, int create)
1372 {
1373         struct ifnet *ifp = NULL;
1374         int error = 0;
1375         struct netmap_adapter *ret = NULL;
1376
1377         *na = NULL;     /* default return value */
1378
1379         NMG_LOCK_ASSERT();
1380
1381         /* we cascade through all possible types of netmap adapter.
1382          * All netmap_get_*_na() functions return an error and an na,
1383          * with the following combinations:
1384          *
1385          * error    na
1386          *   0     NULL         type doesn't match
1387          *  !0     NULL         type matches, but na creation/lookup failed
1388          *   0    !NULL         type matches and na created/found
1389          *  !0    !NULL         impossible
1390          */
1391
1392         /* try to see if this is a monitor port */
1393         error = netmap_get_monitor_na(nmr, na, create);
1394         if (error || *na != NULL)
1395                 return error;
1396
1397         /* try to see if this is a pipe port */
1398         error = netmap_get_pipe_na(nmr, na, create);
1399         if (error || *na != NULL)
1400                 return error;
1401
1402         /* try to see if this is a bridge port */
1403         error = netmap_get_bdg_na(nmr, na, create);
1404         if (error)
1405                 return error;
1406
1407         if (*na != NULL) /* valid match in netmap_get_bdg_na() */
1408                 goto out;
1409
1410         /*
1411          * This must be a hardware na, lookup the name in the system.
1412          * Note that by hardware we actually mean "it shows up in ifconfig".
1413          * This may still be a tap, a veth/epair, or even a
1414          * persistent VALE port.
1415          */
1416         ifp = ifunit_ref(nmr->nr_name);
1417         if (ifp == NULL) {
1418                 return ENXIO;
1419         }
1420
1421         error = netmap_get_hw_na(ifp, &ret);
1422         if (error)
1423                 goto out;
1424
1425         *na = ret;
1426         netmap_adapter_get(ret);
1427
1428 out:
1429         if (error && ret != NULL)
1430                 netmap_adapter_put(ret);
1431
1432         if (ifp)
1433                 if_rele(ifp); /* allow live unloading of drivers modules */
1434
1435         return error;
1436 }
1437
1438
1439 /*
1440  * validate parameters on entry for *_txsync()
1441  * Returns ring->cur if ok, or something >= kring->nkr_num_slots
1442  * in case of error.
1443  *
1444  * rhead, rcur and rtail=hwtail are stored from previous round.
1445  * hwcur is the next packet to send to the ring.
1446  *
1447  * We want
1448  *    hwcur <= *rhead <= head <= cur <= tail = *rtail <= hwtail
1449  *
1450  * hwcur, rhead, rtail and hwtail are reliable
1451  */
1452 static u_int
1453 nm_txsync_prologue(struct netmap_kring *kring)
1454 {
1455 #define NM_ASSERT(t) if (t) { D("fail " #t); goto error; }
1456         struct netmap_ring *ring = kring->ring;
1457         u_int head = ring->head; /* read only once */
1458         u_int cur = ring->cur; /* read only once */
1459         u_int n = kring->nkr_num_slots;
1460
1461         ND(5, "%s kcur %d ktail %d head %d cur %d tail %d",
1462                 kring->name,
1463                 kring->nr_hwcur, kring->nr_hwtail,
1464                 ring->head, ring->cur, ring->tail);
1465 #if 1 /* kernel sanity checks; but we can trust the kring. */
1466         if (kring->nr_hwcur >= n || kring->rhead >= n ||
1467             kring->rtail >= n ||  kring->nr_hwtail >= n)
1468                 goto error;
1469 #endif /* kernel sanity checks */
1470         /*
1471          * user sanity checks. We only use 'cur',
1472          * A, B, ... are possible positions for cur:
1473          *
1474          *  0    A  cur   B  tail  C  n-1
1475          *  0    D  tail  E  cur   F  n-1
1476          *
1477          * B, F, D are valid. A, C, E are wrong
1478          */
1479         if (kring->rtail >= kring->rhead) {
1480                 /* want rhead <= head <= rtail */
1481                 NM_ASSERT(head < kring->rhead || head > kring->rtail);
1482                 /* and also head <= cur <= rtail */
1483                 NM_ASSERT(cur < head || cur > kring->rtail);
1484         } else { /* here rtail < rhead */
1485                 /* we need head outside rtail .. rhead */
1486                 NM_ASSERT(head > kring->rtail && head < kring->rhead);
1487
1488                 /* two cases now: head <= rtail or head >= rhead  */
1489                 if (head <= kring->rtail) {
1490                         /* want head <= cur <= rtail */
1491                         NM_ASSERT(cur < head || cur > kring->rtail);
1492                 } else { /* head >= rhead */
1493                         /* cur must be outside rtail..head */
1494                         NM_ASSERT(cur > kring->rtail && cur < head);
1495                 }
1496         }
1497         if (ring->tail != kring->rtail) {
1498                 RD(5, "tail overwritten was %d need %d",
1499                         ring->tail, kring->rtail);
1500                 ring->tail = kring->rtail;
1501         }
1502         kring->rhead = head;
1503         kring->rcur = cur;
1504         return head;
1505
1506 error:
1507         RD(5, "%s kring error: head %d cur %d tail %d rhead %d rcur %d rtail %d hwcur %d hwtail %d",
1508                 kring->name,
1509                 head, cur, ring->tail,
1510                 kring->rhead, kring->rcur, kring->rtail,
1511                 kring->nr_hwcur, kring->nr_hwtail);
1512         return n;
1513 #undef NM_ASSERT
1514 }
1515
1516
1517 /*
1518  * validate parameters on entry for *_rxsync()
1519  * Returns ring->head if ok, kring->nkr_num_slots on error.
1520  *
1521  * For a valid configuration,
1522  * hwcur <= head <= cur <= tail <= hwtail
1523  *
1524  * We only consider head and cur.
1525  * hwcur and hwtail are reliable.
1526  *
1527  */
1528 static u_int
1529 nm_rxsync_prologue(struct netmap_kring *kring)
1530 {
1531         struct netmap_ring *ring = kring->ring;
1532         uint32_t const n = kring->nkr_num_slots;
1533         uint32_t head, cur;
1534
1535         ND(5,"%s kc %d kt %d h %d c %d t %d",
1536                 kring->name,
1537                 kring->nr_hwcur, kring->nr_hwtail,
1538                 ring->head, ring->cur, ring->tail);
1539         /*
1540          * Before storing the new values, we should check they do not
1541          * move backwards. However:
1542          * - head is not an issue because the previous value is hwcur;
1543          * - cur could in principle go back, however it does not matter
1544          *   because we are processing a brand new rxsync()
1545          */
1546         cur = kring->rcur = ring->cur;  /* read only once */
1547         head = kring->rhead = ring->head;       /* read only once */
1548 #if 1 /* kernel sanity checks */
1549         if (kring->nr_hwcur >= n || kring->nr_hwtail >= n)
1550                 goto error;
1551 #endif /* kernel sanity checks */
1552         /* user sanity checks */
1553         if (kring->nr_hwtail >= kring->nr_hwcur) {
1554                 /* want hwcur <= rhead <= hwtail */
1555                 if (head < kring->nr_hwcur || head > kring->nr_hwtail)
1556                         goto error;
1557                 /* and also rhead <= rcur <= hwtail */
1558                 if (cur < head || cur > kring->nr_hwtail)
1559                         goto error;
1560         } else {
1561                 /* we need rhead outside hwtail..hwcur */
1562                 if (head < kring->nr_hwcur && head > kring->nr_hwtail)
1563                         goto error;
1564                 /* two cases now: head <= hwtail or head >= hwcur  */
1565                 if (head <= kring->nr_hwtail) {
1566                         /* want head <= cur <= hwtail */
1567                         if (cur < head || cur > kring->nr_hwtail)
1568                                 goto error;
1569                 } else {
1570                         /* cur must be outside hwtail..head */
1571                         if (cur < head && cur > kring->nr_hwtail)
1572                                 goto error;
1573                 }
1574         }
1575         if (ring->tail != kring->rtail) {
1576                 RD(5, "%s tail overwritten was %d need %d",
1577                         kring->name,
1578                         ring->tail, kring->rtail);
1579                 ring->tail = kring->rtail;
1580         }
1581         return head;
1582
1583 error:
1584         RD(5, "kring error: hwcur %d rcur %d hwtail %d head %d cur %d tail %d",
1585                 kring->nr_hwcur,
1586                 kring->rcur, kring->nr_hwtail,
1587                 kring->rhead, kring->rcur, ring->tail);
1588         return n;
1589 }
1590
1591
1592 /*
1593  * Error routine called when txsync/rxsync detects an error.
1594  * Can't do much more than resetting head =cur = hwcur, tail = hwtail
1595  * Return 1 on reinit.
1596  *
1597  * This routine is only called by the upper half of the kernel.
1598  * It only reads hwcur (which is changed only by the upper half, too)
1599  * and hwtail (which may be changed by the lower half, but only on
1600  * a tx ring and only to increase it, so any error will be recovered
1601  * on the next call). For the above, we don't strictly need to call
1602  * it under lock.
1603  */
1604 int
1605 netmap_ring_reinit(struct netmap_kring *kring)
1606 {
1607         struct netmap_ring *ring = kring->ring;
1608         u_int i, lim = kring->nkr_num_slots - 1;
1609         int errors = 0;
1610
1611         // XXX KASSERT nm_kr_tryget
1612         RD(10, "called for %s", kring->name);
1613         // XXX probably wrong to trust userspace
1614         kring->rhead = ring->head;
1615         kring->rcur  = ring->cur;
1616         kring->rtail = ring->tail;
1617
1618         if (ring->cur > lim)
1619                 errors++;
1620         if (ring->head > lim)
1621                 errors++;
1622         if (ring->tail > lim)
1623                 errors++;
1624         for (i = 0; i <= lim; i++) {
1625                 u_int idx = ring->slot[i].buf_idx;
1626                 u_int len = ring->slot[i].len;
1627                 if (idx < 2 || idx >= kring->na->na_lut.objtotal) {
1628                         RD(5, "bad index at slot %d idx %d len %d ", i, idx, len);
1629                         ring->slot[i].buf_idx = 0;
1630                         ring->slot[i].len = 0;
1631                 } else if (len > NETMAP_BUF_SIZE(kring->na)) {
1632                         ring->slot[i].len = 0;
1633                         RD(5, "bad len at slot %d idx %d len %d", i, idx, len);
1634                 }
1635         }
1636         if (errors) {
1637                 RD(10, "total %d errors", errors);
1638                 RD(10, "%s reinit, cur %d -> %d tail %d -> %d",
1639                         kring->name,
1640                         ring->cur, kring->nr_hwcur,
1641                         ring->tail, kring->nr_hwtail);
1642                 ring->head = kring->rhead = kring->nr_hwcur;
1643                 ring->cur  = kring->rcur  = kring->nr_hwcur;
1644                 ring->tail = kring->rtail = kring->nr_hwtail;
1645         }
1646         return (errors ? 1 : 0);
1647 }
1648
1649 /* interpret the ringid and flags fields of an nmreq, by translating them
1650  * into a pair of intervals of ring indices:
1651  *
1652  * [priv->np_txqfirst, priv->np_txqlast) and
1653  * [priv->np_rxqfirst, priv->np_rxqlast)
1654  *
1655  */
1656 int
1657 netmap_interp_ringid(struct netmap_priv_d *priv, uint16_t ringid, uint32_t flags)
1658 {
1659         struct netmap_adapter *na = priv->np_na;
1660         u_int j, i = ringid & NETMAP_RING_MASK;
1661         u_int reg = flags & NR_REG_MASK;
1662         enum txrx t;
1663
1664         if (reg == NR_REG_DEFAULT) {
1665                 /* convert from old ringid to flags */
1666                 if (ringid & NETMAP_SW_RING) {
1667                         reg = NR_REG_SW;
1668                 } else if (ringid & NETMAP_HW_RING) {
1669                         reg = NR_REG_ONE_NIC;
1670                 } else {
1671                         reg = NR_REG_ALL_NIC;
1672                 }
1673                 D("deprecated API, old ringid 0x%x -> ringid %x reg %d", ringid, i, reg);
1674         }
1675         switch (reg) {
1676         case NR_REG_ALL_NIC:
1677         case NR_REG_PIPE_MASTER:
1678         case NR_REG_PIPE_SLAVE:
1679                 for_rx_tx(t) {
1680                         priv->np_qfirst[t] = 0;
1681                         priv->np_qlast[t] = nma_get_nrings(na, t);
1682                 }
1683                 ND("%s %d %d", "ALL/PIPE",
1684                         priv->np_qfirst[NR_RX], priv->np_qlast[NR_RX]);
1685                 break;
1686         case NR_REG_SW:
1687         case NR_REG_NIC_SW:
1688                 if (!(na->na_flags & NAF_HOST_RINGS)) {
1689                         D("host rings not supported");
1690                         return EINVAL;
1691                 }
1692                 for_rx_tx(t) {
1693                         priv->np_qfirst[t] = (reg == NR_REG_SW ?
1694                                 nma_get_nrings(na, t) : 0);
1695                         priv->np_qlast[t] = nma_get_nrings(na, t) + 1;
1696                 }
1697                 ND("%s %d %d", reg == NR_REG_SW ? "SW" : "NIC+SW",
1698                         priv->np_qfirst[NR_RX], priv->np_qlast[NR_RX]);
1699                 break;
1700         case NR_REG_ONE_NIC:
1701                 if (i >= na->num_tx_rings && i >= na->num_rx_rings) {
1702                         D("invalid ring id %d", i);
1703                         return EINVAL;
1704                 }
1705                 for_rx_tx(t) {
1706                         /* if not enough rings, use the first one */
1707                         j = i;
1708                         if (j >= nma_get_nrings(na, t))
1709                                 j = 0;
1710                         priv->np_qfirst[t] = j;
1711                         priv->np_qlast[t] = j + 1;
1712                 }
1713                 break;
1714         default:
1715                 D("invalid regif type %d", reg);
1716                 return EINVAL;
1717         }
1718         priv->np_flags = (flags & ~NR_REG_MASK) | reg;
1719
1720         if (netmap_verbose) {
1721                 D("%s: tx [%d,%d) rx [%d,%d) id %d",
1722                         na->name,
1723                         priv->np_qfirst[NR_TX],
1724                         priv->np_qlast[NR_TX],
1725                         priv->np_qfirst[NR_RX],
1726                         priv->np_qlast[NR_RX],
1727                         i);
1728         }
1729         return 0;
1730 }
1731
1732
1733 /*
1734  * Set the ring ID. For devices with a single queue, a request
1735  * for all rings is the same as a single ring.
1736  */
1737 static int
1738 netmap_set_ringid(struct netmap_priv_d *priv, uint16_t ringid, uint32_t flags)
1739 {
1740         struct netmap_adapter *na = priv->np_na;
1741         int error;
1742         enum txrx t;
1743
1744         error = netmap_interp_ringid(priv, ringid, flags);
1745         if (error) {
1746                 return error;
1747         }
1748
1749         priv->np_txpoll = (ringid & NETMAP_NO_TX_POLL) ? 0 : 1;
1750
1751         /* optimization: count the users registered for more than
1752          * one ring, which are the ones sleeping on the global queue.
1753          * The default netmap_notify() callback will then
1754          * avoid signaling the global queue if nobody is using it
1755          */
1756         for_rx_tx(t) {
1757                 if (nm_si_user(priv, t))
1758                         na->si_users[t]++;
1759         }
1760         return 0;
1761 }
1762
1763 static void
1764 netmap_unset_ringid(struct netmap_priv_d *priv)
1765 {
1766         struct netmap_adapter *na = priv->np_na;
1767         enum txrx t;
1768
1769         for_rx_tx(t) {
1770                 if (nm_si_user(priv, t))
1771                         na->si_users[t]--;
1772                 priv->np_qfirst[t] = priv->np_qlast[t] = 0;
1773         }
1774         priv->np_flags = 0;
1775         priv->np_txpoll = 0;
1776 }
1777
1778
1779 /* check that the rings we want to bind are not exclusively owned by a previous
1780  * bind.  If exclusive ownership has been requested, we also mark the rings.
1781  */
1782 static int
1783 netmap_get_exclusive(struct netmap_priv_d *priv)
1784 {
1785         struct netmap_adapter *na = priv->np_na;
1786         u_int i;
1787         struct netmap_kring *kring;
1788         int excl = (priv->np_flags & NR_EXCLUSIVE);
1789         enum txrx t;
1790
1791         ND("%s: grabbing tx [%d, %d) rx [%d, %d)",
1792                         na->name,
1793                         priv->np_qfirst[NR_TX],
1794                         priv->np_qlast[NR_TX],
1795                         priv->np_qfirst[NR_RX],
1796                         priv->np_qlast[NR_RX]);
1797
1798         /* first round: check that all the requested rings
1799          * are neither alread exclusively owned, nor we
1800          * want exclusive ownership when they are already in use
1801          */
1802         for_rx_tx(t) {
1803                 for (i = priv->np_qfirst[t]; i < priv->np_qlast[t]; i++) {
1804                         kring = &NMR(na, t)[i];
1805                         if ((kring->nr_kflags & NKR_EXCLUSIVE) ||
1806                             (kring->users && excl))
1807                         {
1808                                 ND("ring %s busy", kring->name);
1809                                 return EBUSY;
1810                         }
1811                 }
1812         }
1813
1814         /* second round: increment usage cound and possibly
1815          * mark as exclusive
1816          */
1817
1818         for_rx_tx(t) {
1819                 for (i = priv->np_qfirst[t]; i < priv->np_qlast[t]; i++) {
1820                         kring = &NMR(na, t)[i];
1821                         kring->users++;
1822                         if (excl)
1823                                 kring->nr_kflags |= NKR_EXCLUSIVE;
1824                 }
1825         }
1826
1827         return 0;
1828
1829 }
1830
1831 /* undo netmap_get_ownership() */
1832 static void
1833 netmap_rel_exclusive(struct netmap_priv_d *priv)
1834 {
1835         struct netmap_adapter *na = priv->np_na;
1836         u_int i;
1837         struct netmap_kring *kring;
1838         int excl = (priv->np_flags & NR_EXCLUSIVE);
1839         enum txrx t;
1840
1841         ND("%s: releasing tx [%d, %d) rx [%d, %d)",
1842                         na->name,
1843                         priv->np_qfirst[NR_TX],
1844                         priv->np_qlast[NR_TX],
1845                         priv->np_qfirst[NR_RX],
1846                         priv->np_qlast[MR_RX]);
1847
1848
1849         for_rx_tx(t) {
1850                 for (i = priv->np_qfirst[t]; i < priv->np_qlast[t]; i++) {
1851                         kring = &NMR(na, t)[i];
1852                         if (excl)
1853                                 kring->nr_kflags &= ~NKR_EXCLUSIVE;
1854                         kring->users--;
1855                 }
1856         }
1857 }
1858
1859 /*
1860  * possibly move the interface to netmap-mode.
1861  * If success it returns a pointer to netmap_if, otherwise NULL.
1862  * This must be called with NMG_LOCK held.
1863  *
1864  * The following na callbacks are called in the process:
1865  *
1866  * na->nm_config()                      [by netmap_update_config]
1867  * (get current number and size of rings)
1868  *
1869  *      We have a generic one for linux (netmap_linux_config).
1870  *      The bwrap has to override this, since it has to forward
1871  *      the request to the wrapped adapter (netmap_bwrap_config).
1872  *
1873  *
1874  * na->nm_krings_create()
1875  * (create and init the krings array)
1876  *
1877  *      One of the following:
1878  *
1879  *      * netmap_hw_krings_create,                      (hw ports)
1880  *              creates the standard layout for the krings
1881  *              and adds the mbq (used for the host rings).
1882  *
1883  *      * netmap_vp_krings_create                       (VALE ports)
1884  *              add leases and scratchpads
1885  *
1886  *      * netmap_pipe_krings_create                     (pipes)
1887  *              create the krings and rings of both ends and
1888  *              cross-link them
1889  *
1890  *      * netmap_monitor_krings_create                  (monitors)
1891  *              avoid allocating the mbq
1892  *
1893  *      * netmap_bwrap_krings_create                    (bwraps)
1894  *              create both the brap krings array,
1895  *              the krings array of the wrapped adapter, and
1896  *              (if needed) the fake array for the host adapter
1897  *
1898  * na->nm_register(, 1)
1899  * (put the adapter in netmap mode)
1900  *
1901  *      This may be one of the following:
1902  *      (XXX these should be either all *_register or all *_reg 2014-03-15)
1903  *
1904  *      * netmap_hw_register                            (hw ports)
1905  *              checks that the ifp is still there, then calls
1906  *              the hardware specific callback;
1907  *
1908  *      * netmap_vp_reg                                 (VALE ports)
1909  *              If the port is connected to a bridge,
1910  *              set the NAF_NETMAP_ON flag under the
1911  *              bridge write lock.
1912  *
1913  *      * netmap_pipe_reg                               (pipes)
1914  *              inform the other pipe end that it is no
1915  *              longer responsible for the lifetime of this
1916  *              pipe end
1917  *
1918  *      * netmap_monitor_reg                            (monitors)
1919  *              intercept the sync callbacks of the monitored
1920  *              rings
1921  *
1922  *      * netmap_bwrap_register                         (bwraps)
1923  *              cross-link the bwrap and hwna rings,
1924  *              forward the request to the hwna, override
1925  *              the hwna notify callback (to get the frames
1926  *              coming from outside go through the bridge).
1927  *
1928  *
1929  */
1930 int
1931 netmap_do_regif(struct netmap_priv_d *priv, struct netmap_adapter *na,
1932         uint16_t ringid, uint32_t flags)
1933 {
1934         struct netmap_if *nifp = NULL;
1935         int error;
1936
1937         NMG_LOCK_ASSERT();
1938         /* ring configuration may have changed, fetch from the card */
1939         netmap_update_config(na);
1940         priv->np_na = na;     /* store the reference */
1941         error = netmap_set_ringid(priv, ringid, flags);
1942         if (error)
1943                 goto err;
1944         error = netmap_mem_finalize(na->nm_mem, na);
1945         if (error)
1946                 goto err;
1947
1948         if (na->active_fds == 0) {
1949                 /*
1950                  * If this is the first registration of the adapter,
1951                  * also create the netmap rings and their in-kernel view,
1952                  * the netmap krings.
1953                  */
1954
1955                 /*
1956                  * Depending on the adapter, this may also create
1957                  * the netmap rings themselves
1958                  */
1959                 error = na->nm_krings_create(na);
1960                 if (error)
1961                         goto err_drop_mem;
1962
1963                 /* create all missing netmap rings */
1964                 error = netmap_mem_rings_create(na);
1965                 if (error)
1966                         goto err_del_krings;
1967         }
1968
1969         /* now the kring must exist and we can check whether some
1970          * previous bind has exclusive ownership on them
1971          */
1972         error = netmap_get_exclusive(priv);
1973         if (error)
1974                 goto err_del_rings;
1975
1976         /* in all cases, create a new netmap if */
1977         nifp = netmap_mem_if_new(na);
1978         if (nifp == NULL) {
1979                 error = ENOMEM;
1980                 goto err_rel_excl;
1981         }
1982
1983         na->active_fds++;
1984         if (!nm_netmap_on(na)) {
1985                 /* Netmap not active, set the card in netmap mode
1986                  * and make it use the shared buffers.
1987                  */
1988                 /* cache the allocator info in the na */
1989                 netmap_mem_get_lut(na->nm_mem, &na->na_lut);
1990                 ND("%p->na_lut == %p", na, na->na_lut.lut);
1991                 error = na->nm_register(na, 1); /* mode on */
1992                 if (error) 
1993                         goto err_del_if;
1994         }
1995
1996         /*
1997          * advertise that the interface is ready by setting np_nifp.
1998          * The barrier is needed because readers (poll, *SYNC and mmap)
1999          * check for priv->np_nifp != NULL without locking
2000          */
2001         mb(); /* make sure previous writes are visible to all CPUs */
2002         priv->np_nifp = nifp;
2003
2004         return 0;
2005
2006 err_del_if:
2007         memset(&na->na_lut, 0, sizeof(na->na_lut));
2008         na->active_fds--;
2009         netmap_mem_if_delete(na, nifp);
2010 err_rel_excl:
2011         netmap_rel_exclusive(priv);
2012 err_del_rings:
2013         if (na->active_fds == 0)
2014                 netmap_mem_rings_delete(na);
2015 err_del_krings:
2016         if (na->active_fds == 0)
2017                 na->nm_krings_delete(na);
2018 err_drop_mem:
2019         netmap_mem_deref(na->nm_mem, na);
2020 err:
2021         priv->np_na = NULL;
2022         return error;
2023 }
2024
2025
2026 /*
2027  * update kring and ring at the end of txsync.
2028  */
2029 static inline void
2030 nm_txsync_finalize(struct netmap_kring *kring)
2031 {
2032         /* update ring tail to what the kernel knows */
2033         kring->ring->tail = kring->rtail = kring->nr_hwtail;
2034
2035         /* note, head/rhead/hwcur might be behind cur/rcur
2036          * if no carrier
2037          */
2038         ND(5, "%s now hwcur %d hwtail %d head %d cur %d tail %d",
2039                 kring->name, kring->nr_hwcur, kring->nr_hwtail,
2040                 kring->rhead, kring->rcur, kring->rtail);
2041 }
2042
2043
2044 /*
2045  * update kring and ring at the end of rxsync
2046  */
2047 static inline void
2048 nm_rxsync_finalize(struct netmap_kring *kring)
2049 {
2050         /* tell userspace that there might be new packets */
2051         //struct netmap_ring *ring = kring->ring;
2052         ND("head %d cur %d tail %d -> %d", ring->head, ring->cur, ring->tail,
2053                 kring->nr_hwtail);
2054         kring->ring->tail = kring->rtail = kring->nr_hwtail;
2055         /* make a copy of the state for next round */
2056         kring->rhead = kring->ring->head;
2057         kring->rcur = kring->ring->cur;
2058 }
2059
2060
2061
2062 /*
2063  * ioctl(2) support for the "netmap" device.
2064  *
2065  * Following a list of accepted commands:
2066  * - NIOCGINFO
2067  * - SIOCGIFADDR        just for convenience
2068  * - NIOCREGIF
2069  * - NIOCTXSYNC
2070  * - NIOCRXSYNC
2071  *
2072  * Return 0 on success, errno otherwise.
2073  */
2074 int
2075 netmap_ioctl(struct cdev *dev, u_long cmd, caddr_t data,
2076         int fflag, struct thread *td)
2077 {
2078         struct netmap_priv_d *priv = NULL;
2079         struct nmreq *nmr = (struct nmreq *) data;
2080         struct netmap_adapter *na = NULL;
2081         int error;
2082         u_int i, qfirst, qlast;
2083         struct netmap_if *nifp;
2084         struct netmap_kring *krings;
2085         enum txrx t;
2086
2087         (void)dev;      /* UNUSED */
2088         (void)fflag;    /* UNUSED */
2089
2090         if (cmd == NIOCGINFO || cmd == NIOCREGIF) {
2091                 /* truncate name */
2092                 nmr->nr_name[sizeof(nmr->nr_name) - 1] = '\0';
2093                 if (nmr->nr_version != NETMAP_API) {
2094                         D("API mismatch for %s got %d need %d",
2095                                 nmr->nr_name,
2096                                 nmr->nr_version, NETMAP_API);
2097                         nmr->nr_version = NETMAP_API;
2098                 }
2099                 if (nmr->nr_version < NETMAP_MIN_API ||
2100                     nmr->nr_version > NETMAP_MAX_API) {
2101                         return EINVAL;
2102                 }
2103         }
2104         CURVNET_SET(TD_TO_VNET(td));
2105
2106         error = devfs_get_cdevpriv((void **)&priv);
2107         if (error) {
2108                 CURVNET_RESTORE();
2109                 /* XXX ENOENT should be impossible, since the priv
2110                  * is now created in the open */
2111                 return (error == ENOENT ? ENXIO : error);
2112         }
2113
2114         switch (cmd) {
2115         case NIOCGINFO:         /* return capabilities etc */
2116                 if (nmr->nr_cmd == NETMAP_BDG_LIST) {
2117                         error = netmap_bdg_ctl(nmr, NULL);
2118                         break;
2119                 }
2120
2121                 NMG_LOCK();
2122                 do {
2123                         /* memsize is always valid */
2124                         struct netmap_mem_d *nmd = &nm_mem;
2125                         u_int memflags;
2126
2127                         if (nmr->nr_name[0] != '\0') {
2128                                 /* get a refcount */
2129                                 error = netmap_get_na(nmr, &na, 1 /* create */);
2130                                 if (error)
2131                                         break;
2132                                 nmd = na->nm_mem; /* get memory allocator */
2133                         }
2134
2135                         error = netmap_mem_get_info(nmd, &nmr->nr_memsize, &memflags,
2136                                 &nmr->nr_arg2);
2137                         if (error)
2138                                 break;
2139                         if (na == NULL) /* only memory info */
2140                                 break;
2141                         nmr->nr_offset = 0;
2142                         nmr->nr_rx_slots = nmr->nr_tx_slots = 0;
2143                         netmap_update_config(na);
2144                         nmr->nr_rx_rings = na->num_rx_rings;
2145                         nmr->nr_tx_rings = na->num_tx_rings;
2146                         nmr->nr_rx_slots = na->num_rx_desc;
2147                         nmr->nr_tx_slots = na->num_tx_desc;
2148                         netmap_adapter_put(na);
2149                 } while (0);
2150                 NMG_UNLOCK();
2151                 break;
2152
2153         case NIOCREGIF:
2154                 /* possibly attach/detach NIC and VALE switch */
2155                 i = nmr->nr_cmd;
2156                 if (i == NETMAP_BDG_ATTACH || i == NETMAP_BDG_DETACH
2157                                 || i == NETMAP_BDG_VNET_HDR
2158                                 || i == NETMAP_BDG_NEWIF
2159                                 || i == NETMAP_BDG_DELIF) {
2160                         error = netmap_bdg_ctl(nmr, NULL);
2161                         break;
2162                 } else if (i != 0) {
2163                         D("nr_cmd must be 0 not %d", i);
2164                         error = EINVAL;
2165                         break;
2166                 }
2167
2168                 /* protect access to priv from concurrent NIOCREGIF */
2169                 NMG_LOCK();
2170                 do {
2171                         u_int memflags;
2172
2173                         if (priv->np_nifp != NULL) {    /* thread already registered */
2174                                 error = EBUSY;
2175                                 break;
2176                         }
2177                         /* find the interface and a reference */
2178                         error = netmap_get_na(nmr, &na, 1 /* create */); /* keep reference */
2179                         if (error)
2180                                 break;
2181                         if (NETMAP_OWNED_BY_KERN(na)) {
2182                                 netmap_adapter_put(na);
2183                                 error = EBUSY;
2184                                 break;
2185                         }
2186                         error = netmap_do_regif(priv, na, nmr->nr_ringid, nmr->nr_flags);
2187                         if (error) {    /* reg. failed, release priv and ref */
2188                                 netmap_adapter_put(na);
2189                                 break;
2190                         }
2191                         nifp = priv->np_nifp;
2192                         priv->np_td = td; // XXX kqueue, debugging only
2193
2194                         /* return the offset of the netmap_if object */
2195                         nmr->nr_rx_rings = na->num_rx_rings;
2196                         nmr->nr_tx_rings = na->num_tx_rings;
2197                         nmr->nr_rx_slots = na->num_rx_desc;
2198                         nmr->nr_tx_slots = na->num_tx_desc;
2199                         error = netmap_mem_get_info(na->nm_mem, &nmr->nr_memsize, &memflags,
2200                                 &nmr->nr_arg2);
2201                         if (error) {
2202                                 netmap_do_unregif(priv);
2203                                 netmap_adapter_put(na);
2204                                 break;
2205                         }
2206                         if (memflags & NETMAP_MEM_PRIVATE) {
2207                                 *(uint32_t *)(uintptr_t)&nifp->ni_flags |= NI_PRIV_MEM;
2208                         }
2209                         for_rx_tx(t) {
2210                                 priv->np_si[t] = nm_si_user(priv, t) ?
2211                                         &na->si[t] : &NMR(na, t)[priv->np_qfirst[t]].si;
2212                         }
2213
2214                         if (nmr->nr_arg3) {
2215                                 D("requested %d extra buffers", nmr->nr_arg3);
2216                                 nmr->nr_arg3 = netmap_extra_alloc(na,
2217                                         &nifp->ni_bufs_head, nmr->nr_arg3);
2218                                 D("got %d extra buffers", nmr->nr_arg3);
2219                         }
2220                         nmr->nr_offset = netmap_mem_if_offset(na->nm_mem, nifp);
2221                 } while (0);
2222                 NMG_UNLOCK();
2223                 break;
2224
2225         case NIOCTXSYNC:
2226         case NIOCRXSYNC:
2227                 nifp = priv->np_nifp;
2228
2229                 if (nifp == NULL) {
2230                         error = ENXIO;
2231                         break;
2232                 }
2233                 mb(); /* make sure following reads are not from cache */
2234
2235                 na = priv->np_na;      /* we have a reference */
2236
2237                 if (na == NULL) {
2238                         D("Internal error: nifp != NULL && na == NULL");
2239                         error = ENXIO;
2240                         break;
2241                 }
2242
2243                 if (!nm_netmap_on(na)) {
2244                         error = ENXIO;
2245                         break;
2246                 }
2247
2248                 t = (cmd == NIOCTXSYNC ? NR_TX : NR_RX);
2249                 krings = NMR(na, t);
2250                 qfirst = priv->np_qfirst[t];
2251                 qlast = priv->np_qlast[t];
2252
2253                 for (i = qfirst; i < qlast; i++) {
2254                         struct netmap_kring *kring = krings + i;
2255                         if (nm_kr_tryget(kring)) {
2256                                 error = EBUSY;
2257                                 goto out;
2258                         }
2259                         if (cmd == NIOCTXSYNC) {
2260                                 if (netmap_verbose & NM_VERB_TXSYNC)
2261                                         D("pre txsync ring %d cur %d hwcur %d",
2262                                             i, kring->ring->cur,
2263                                             kring->nr_hwcur);
2264                                 if (nm_txsync_prologue(kring) >= kring->nkr_num_slots) {
2265                                         netmap_ring_reinit(kring);
2266                                 } else if (kring->nm_sync(kring, NAF_FORCE_RECLAIM) == 0) {
2267                                         nm_txsync_finalize(kring);
2268                                 }
2269                                 if (netmap_verbose & NM_VERB_TXSYNC)
2270                                         D("post txsync ring %d cur %d hwcur %d",
2271                                             i, kring->ring->cur,
2272                                             kring->nr_hwcur);
2273                         } else {
2274                                 if (nm_rxsync_prologue(kring) >= kring->nkr_num_slots) {
2275                                         netmap_ring_reinit(kring);
2276                                 } else if (kring->nm_sync(kring, NAF_FORCE_READ) == 0) {
2277                                         nm_rxsync_finalize(kring);
2278                                 }
2279                                 microtime(&na->rx_rings[i].ring->ts);
2280                         }
2281                         nm_kr_put(kring);
2282                 }
2283
2284                 break;
2285
2286 #ifdef WITH_VALE
2287         case NIOCCONFIG:
2288                 error = netmap_bdg_config(nmr);
2289                 break;
2290 #endif
2291 #ifdef __FreeBSD__
2292         case FIONBIO:
2293         case FIOASYNC:
2294                 ND("FIONBIO/FIOASYNC are no-ops");
2295                 break;
2296
2297         case BIOCIMMEDIATE:
2298         case BIOCGHDRCMPLT:
2299         case BIOCSHDRCMPLT:
2300         case BIOCSSEESENT:
2301                 D("ignore BIOCIMMEDIATE/BIOCSHDRCMPLT/BIOCSHDRCMPLT/BIOCSSEESENT");
2302                 break;
2303
2304         default:        /* allow device-specific ioctls */
2305             {
2306                 struct ifnet *ifp = ifunit_ref(nmr->nr_name);
2307                 if (ifp == NULL) {
2308                         error = ENXIO;
2309                 } else {
2310                         struct socket so;
2311
2312                         bzero(&so, sizeof(so));
2313                         so.so_vnet = ifp->if_vnet;
2314                         // so->so_proto not null.
2315                         error = ifioctl(&so, cmd, data, td);
2316                         if_rele(ifp);
2317                 }
2318                 break;
2319             }
2320
2321 #else /* linux */
2322         default:
2323                 error = EOPNOTSUPP;
2324 #endif /* linux */
2325         }
2326 out:
2327
2328         CURVNET_RESTORE();
2329         return (error);
2330 }
2331
2332
2333 /*
2334  * select(2) and poll(2) handlers for the "netmap" device.
2335  *
2336  * Can be called for one or more queues.
2337  * Return true the event mask corresponding to ready events.
2338  * If there are no ready events, do a selrecord on either individual
2339  * selinfo or on the global one.
2340  * Device-dependent parts (locking and sync of tx/rx rings)
2341  * are done through callbacks.
2342  *
2343  * On linux, arguments are really pwait, the poll table, and 'td' is struct file *
2344  * The first one is remapped to pwait as selrecord() uses the name as an
2345  * hidden argument.
2346  */
2347 int
2348 netmap_poll(struct cdev *dev, int events, struct thread *td)
2349 {
2350         struct netmap_priv_d *priv = NULL;
2351         struct netmap_adapter *na;
2352         struct netmap_kring *kring;
2353         u_int i, check_all_tx, check_all_rx, want[NR_TXRX], revents = 0;
2354 #define want_tx want[NR_TX]
2355 #define want_rx want[NR_RX]
2356         struct mbq q;           /* packets from hw queues to host stack */
2357         void *pwait = dev;      /* linux compatibility */
2358         int is_kevent = 0;
2359         enum txrx t;
2360
2361         /*
2362          * In order to avoid nested locks, we need to "double check"
2363          * txsync and rxsync if we decide to do a selrecord().
2364          * retry_tx (and retry_rx, later) prevent looping forever.
2365          */
2366         int retry_tx = 1, retry_rx = 1;
2367
2368         (void)pwait;
2369         mbq_init(&q);
2370
2371         /*
2372          * XXX kevent has curthread->tp_fop == NULL,
2373          * so devfs_get_cdevpriv() fails. We circumvent this by passing
2374          * priv as the first argument, which is also useful to avoid
2375          * the selrecord() which are not necessary in that case.
2376          */
2377         if (devfs_get_cdevpriv((void **)&priv) != 0) {
2378                 is_kevent = 1;
2379                 if (netmap_verbose)
2380                         D("called from kevent");
2381                 priv = (struct netmap_priv_d *)dev;
2382         }
2383         if (priv == NULL)
2384                 return POLLERR;
2385
2386         if (priv->np_nifp == NULL) {
2387                 D("No if registered");
2388                 return POLLERR;
2389         }
2390         mb(); /* make sure following reads are not from cache */
2391
2392         na = priv->np_na;
2393
2394         if (!nm_netmap_on(na))
2395                 return POLLERR;
2396
2397         if (netmap_verbose & 0x8000)
2398                 D("device %s events 0x%x", na->name, events);
2399         want_tx = events & (POLLOUT | POLLWRNORM);
2400         want_rx = events & (POLLIN | POLLRDNORM);
2401
2402
2403         /*
2404          * check_all_{tx|rx} are set if the card has more than one queue AND
2405          * the file descriptor is bound to all of them. If so, we sleep on
2406          * the "global" selinfo, otherwise we sleep on individual selinfo
2407          * (FreeBSD only allows two selinfo's per file descriptor).
2408          * The interrupt routine in the driver wake one or the other
2409          * (or both) depending on which clients are active.
2410          *
2411          * rxsync() is only called if we run out of buffers on a POLLIN.
2412          * txsync() is called if we run out of buffers on POLLOUT, or
2413          * there are pending packets to send. The latter can be disabled
2414          * passing NETMAP_NO_TX_POLL in the NIOCREG call.
2415          */
2416         check_all_tx = nm_si_user(priv, NR_TX);
2417         check_all_rx = nm_si_user(priv, NR_RX);
2418
2419         /*
2420          * We start with a lock free round which is cheap if we have
2421          * slots available. If this fails, then lock and call the sync
2422          * routines.
2423          */
2424         for_rx_tx(t) {
2425                 for (i = priv->np_qfirst[t]; want[t] && i < priv->np_qlast[t]; i++) {
2426                         kring = &NMR(na, t)[i];
2427                         /* XXX compare ring->cur and kring->tail */
2428                         if (!nm_ring_empty(kring->ring)) {
2429                                 revents |= want[t];
2430                                 want[t] = 0;    /* also breaks the loop */
2431                         }
2432                 }
2433         }
2434
2435         /*
2436          * If we want to push packets out (priv->np_txpoll) or
2437          * want_tx is still set, we must issue txsync calls
2438          * (on all rings, to avoid that the tx rings stall).
2439          * XXX should also check cur != hwcur on the tx rings.
2440          * Fortunately, normal tx mode has np_txpoll set.
2441          */
2442         if (priv->np_txpoll || want_tx) {
2443                 /*
2444                  * The first round checks if anyone is ready, if not
2445                  * do a selrecord and another round to handle races.
2446                  * want_tx goes to 0 if any space is found, and is
2447                  * used to skip rings with no pending transmissions.
2448                  */
2449 flush_tx:
2450                 for (i = priv->np_qfirst[NR_TX]; i < priv->np_qlast[NR_RX]; i++) {
2451                         int found = 0;
2452
2453                         kring = &na->tx_rings[i];
2454                         if (!want_tx && kring->ring->cur == kring->nr_hwcur)
2455                                 continue;
2456                         /* only one thread does txsync */
2457                         if (nm_kr_tryget(kring)) {
2458                                 /* either busy or stopped
2459                                  * XXX if the ring is stopped, sleeping would
2460                                  * be better. In current code, however, we only
2461                                  * stop the rings for brief intervals (2014-03-14)
2462                                  */
2463                                 if (netmap_verbose)
2464                                         RD(2, "%p lost race on txring %d, ok",
2465                                             priv, i);
2466                                 continue;
2467                         }
2468                         if (nm_txsync_prologue(kring) >= kring->nkr_num_slots) {
2469                                 netmap_ring_reinit(kring);
2470                                 revents |= POLLERR;
2471                         } else {
2472                                 if (kring->nm_sync(kring, 0))
2473                                         revents |= POLLERR;
2474                                 else
2475                                         nm_txsync_finalize(kring);
2476                         }
2477
2478                         /*
2479                          * If we found new slots, notify potential
2480                          * listeners on the same ring.
2481                          * Since we just did a txsync, look at the copies
2482                          * of cur,tail in the kring.
2483                          */
2484                         found = kring->rcur != kring->rtail;
2485                         nm_kr_put(kring);
2486                         if (found) { /* notify other listeners */
2487                                 revents |= want_tx;
2488                                 want_tx = 0;
2489                                 kring->nm_notify(kring, 0);
2490                         }
2491                 }
2492                 if (want_tx && retry_tx && !is_kevent) {
2493                         OS_selrecord(td, check_all_tx ?
2494                             &na->si[NR_TX] : &na->tx_rings[priv->np_qfirst[NR_TX]].si);
2495                         retry_tx = 0;
2496                         goto flush_tx;
2497                 }
2498         }
2499
2500         /*
2501          * If want_rx is still set scan receive rings.
2502          * Do it on all rings because otherwise we starve.
2503          */
2504         if (want_rx) {
2505                 int send_down = 0; /* transparent mode */
2506                 /* two rounds here for race avoidance */
2507 do_retry_rx:
2508                 for (i = priv->np_qfirst[NR_RX]; i < priv->np_qlast[NR_RX]; i++) {
2509                         int found = 0;
2510
2511                         kring = &na->rx_rings[i];
2512
2513                         if (nm_kr_tryget(kring)) {
2514                                 if (netmap_verbose)
2515                                         RD(2, "%p lost race on rxring %d, ok",
2516                                             priv, i);
2517                                 continue;
2518                         }
2519
2520                         if (nm_rxsync_prologue(kring) >= kring->nkr_num_slots) {
2521                                 netmap_ring_reinit(kring);
2522                                 revents |= POLLERR;
2523                         }
2524                         /* now we can use kring->rcur, rtail */
2525
2526                         /*
2527                          * transparent mode support: collect packets
2528                          * from the rxring(s).
2529                          * XXX NR_FORWARD should only be read on
2530                          * physical or NIC ports
2531                          */
2532                         if (netmap_fwd ||kring->ring->flags & NR_FORWARD) {
2533                                 ND(10, "forwarding some buffers up %d to %d",
2534                                     kring->nr_hwcur, kring->ring->cur);
2535                                 netmap_grab_packets(kring, &q, netmap_fwd);
2536                         }
2537
2538                         if (kring->nm_sync(kring, 0))
2539                                 revents |= POLLERR;
2540                         else
2541                                 nm_rxsync_finalize(kring);
2542                         if (netmap_no_timestamp == 0 ||
2543                                         kring->ring->flags & NR_TIMESTAMP) {
2544                                 microtime(&kring->ring->ts);
2545                         }
2546                         found = kring->rcur != kring->rtail;
2547                         nm_kr_put(kring);
2548                         if (found) {
2549                                 revents |= want_rx;
2550                                 retry_rx = 0;
2551                                 kring->nm_notify(kring, 0);
2552                         }
2553                 }
2554
2555                 /* transparent mode XXX only during first pass ? */
2556                 if (na->na_flags & NAF_HOST_RINGS) {
2557                         kring = &na->rx_rings[na->num_rx_rings];
2558                         if (check_all_rx
2559                             && (netmap_fwd || kring->ring->flags & NR_FORWARD)) {
2560                                 /* XXX fix to use kring fields */
2561                                 if (nm_ring_empty(kring->ring))
2562                                         send_down = netmap_rxsync_from_host(na, td, dev);
2563                                 if (!nm_ring_empty(kring->ring))
2564                                         revents |= want_rx;
2565                         }
2566                 }
2567
2568                 if (retry_rx && !is_kevent)
2569                         OS_selrecord(td, check_all_rx ?
2570                             &na->si[NR_RX] : &na->rx_rings[priv->np_qfirst[NR_RX]].si);
2571                 if (send_down > 0 || retry_rx) {
2572                         retry_rx = 0;
2573                         if (send_down)
2574                                 goto flush_tx; /* and retry_rx */
2575                         else
2576                                 goto do_retry_rx;
2577                 }
2578         }
2579
2580         /*
2581          * Transparent mode: marked bufs on rx rings between
2582          * kring->nr_hwcur and ring->head
2583          * are passed to the other endpoint.
2584          *
2585          * In this mode we also scan the sw rxring, which in
2586          * turn passes packets up.
2587          *
2588          * XXX Transparent mode at the moment requires to bind all
2589          * rings to a single file descriptor.
2590          */
2591
2592         if (q.head && na->ifp != NULL)
2593                 netmap_send_up(na->ifp, &q);
2594
2595         return (revents);
2596 #undef want_tx
2597 #undef want_rx
2598 }
2599
2600
2601 /*-------------------- driver support routines -------------------*/
2602
2603 static int netmap_hw_krings_create(struct netmap_adapter *);
2604
2605 /* default notify callback */
2606 static int
2607 netmap_notify(struct netmap_kring *kring, int flags)
2608 {
2609         struct netmap_adapter *na = kring->na;
2610         enum txrx t = kring->tx;
2611
2612         OS_selwakeup(&kring->si, PI_NET);
2613         /* optimization: avoid a wake up on the global
2614          * queue if nobody has registered for more
2615          * than one ring
2616          */
2617         if (na->si_users[t] > 0)
2618                 OS_selwakeup(&na->si[t], PI_NET);
2619
2620         return 0;
2621 }
2622
2623
2624 /* called by all routines that create netmap_adapters.
2625  * Attach na to the ifp (if any) and provide defaults
2626  * for optional callbacks. Defaults assume that we
2627  * are creating an hardware netmap_adapter.
2628  */
2629 int
2630 netmap_attach_common(struct netmap_adapter *na)
2631 {
2632         struct ifnet *ifp = na->ifp;
2633
2634         if (na->num_tx_rings == 0 || na->num_rx_rings == 0) {
2635                 D("%s: invalid rings tx %d rx %d",
2636                         na->name, na->num_tx_rings, na->num_rx_rings);
2637                 return EINVAL;
2638         }
2639         /* ifp is NULL for virtual adapters (bwrap, non-persistent VALE ports,
2640          * pipes, monitors). For bwrap we actually have a non-null ifp for
2641          * use by the external modules, but that is set after this
2642          * function has been called.
2643          * XXX this is ugly, maybe split this function in two (2014-03-14)
2644          */
2645         if (ifp != NULL) {
2646                 WNA(ifp) = na;
2647
2648         /* the following is only needed for na that use the host port.
2649          * XXX do we have something similar for linux ?
2650          */
2651 #ifdef __FreeBSD__
2652                 na->if_input = ifp->if_input; /* for netmap_send_up */
2653 #endif /* __FreeBSD__ */
2654
2655                 NETMAP_SET_CAPABLE(ifp);
2656         }
2657         if (na->nm_krings_create == NULL) {
2658                 /* we assume that we have been called by a driver,
2659                  * since other port types all provide their own
2660                  * nm_krings_create
2661                  */
2662                 na->nm_krings_create = netmap_hw_krings_create;
2663                 na->nm_krings_delete = netmap_hw_krings_delete;
2664         }
2665         if (na->nm_notify == NULL)
2666                 na->nm_notify = netmap_notify;
2667         na->active_fds = 0;
2668
2669         if (na->nm_mem == NULL)
2670                 /* use the global allocator */
2671                 na->nm_mem = &nm_mem;
2672         netmap_mem_get(na->nm_mem);
2673 #ifdef WITH_VALE
2674         if (na->nm_bdg_attach == NULL)
2675                 /* no special nm_bdg_attach callback. On VALE
2676                  * attach, we need to interpose a bwrap
2677                  */
2678                 na->nm_bdg_attach = netmap_bwrap_attach;
2679 #endif
2680         return 0;
2681 }
2682
2683
2684 /* standard cleanup, called by all destructors */
2685 void
2686 netmap_detach_common(struct netmap_adapter *na)
2687 {
2688         if (na->ifp != NULL)
2689                 WNA(na->ifp) = NULL; /* XXX do we need this? */
2690
2691         if (na->tx_rings) { /* XXX should not happen */
2692                 D("freeing leftover tx_rings");
2693                 na->nm_krings_delete(na);
2694         }
2695         netmap_pipe_dealloc(na);
2696         if (na->nm_mem)
2697                 netmap_mem_put(na->nm_mem);
2698         bzero(na, sizeof(*na));
2699         free(na, M_DEVBUF);
2700 }
2701
2702 /* Wrapper for the register callback provided hardware drivers.
2703  * na->ifp == NULL means the driver module has been
2704  * unloaded, so we cannot call into it.
2705  * Note that module unloading, in our patched linux drivers,
2706  * happens under NMG_LOCK and after having stopped all the
2707  * nic rings (see netmap_detach). This provides sufficient
2708  * protection for the other driver-provied callbacks
2709  * (i.e., nm_config and nm_*xsync), that therefore don't need
2710  * to wrapped.
2711  */
2712 static int
2713 netmap_hw_register(struct netmap_adapter *na, int onoff)
2714 {
2715         struct netmap_hw_adapter *hwna =
2716                 (struct netmap_hw_adapter*)na;
2717
2718         if (na->ifp == NULL)
2719                 return onoff ? ENXIO : 0;
2720
2721         return hwna->nm_hw_register(na, onoff);
2722 }
2723
2724
2725 /*
2726  * Initialize a ``netmap_adapter`` object created by driver on attach.
2727  * We allocate a block of memory with room for a struct netmap_adapter
2728  * plus two sets of N+2 struct netmap_kring (where N is the number
2729  * of hardware rings):
2730  * krings       0..N-1  are for the hardware queues.
2731  * kring        N       is for the host stack queue
2732  * kring        N+1     is only used for the selinfo for all queues. // XXX still true ?
2733  * Return 0 on success, ENOMEM otherwise.
2734  */
2735 int
2736 netmap_attach(struct netmap_adapter *arg)
2737 {
2738         struct netmap_hw_adapter *hwna = NULL;
2739         // XXX when is arg == NULL ?
2740         struct ifnet *ifp = arg ? arg->ifp : NULL;
2741
2742         if (arg == NULL || ifp == NULL)
2743                 goto fail;
2744         hwna = malloc(sizeof(*hwna), M_DEVBUF, M_NOWAIT | M_ZERO);
2745         if (hwna == NULL)
2746                 goto fail;
2747         hwna->up = *arg;
2748         hwna->up.na_flags |= NAF_HOST_RINGS | NAF_NATIVE;
2749         strncpy(hwna->up.name, ifp->if_xname, sizeof(hwna->up.name));
2750         hwna->nm_hw_register = hwna->up.nm_register;
2751         hwna->up.nm_register = netmap_hw_register;
2752         if (netmap_attach_common(&hwna->up)) {
2753                 free(hwna, M_DEVBUF);
2754                 goto fail;
2755         }
2756         netmap_adapter_get(&hwna->up);
2757
2758 #ifdef linux
2759         if (ifp->netdev_ops) {
2760                 /* prepare a clone of the netdev ops */
2761 #ifndef NETMAP_LINUX_HAVE_NETDEV_OPS
2762                 hwna->nm_ndo.ndo_start_xmit = ifp->netdev_ops;
2763 #else
2764                 hwna->nm_ndo = *ifp->netdev_ops;
2765 #endif
2766         }
2767         hwna->nm_ndo.ndo_start_xmit = linux_netmap_start_xmit;
2768         if (ifp->ethtool_ops) {
2769                 hwna->nm_eto = *ifp->ethtool_ops;
2770         }
2771         hwna->nm_eto.set_ringparam = linux_netmap_set_ringparam;
2772 #ifdef NETMAP_LINUX_HAVE_SET_CHANNELS
2773         hwna->nm_eto.set_channels = linux_netmap_set_channels;
2774 #endif
2775         if (arg->nm_config == NULL) {
2776                 hwna->up.nm_config = netmap_linux_config;
2777         }
2778 #endif /* linux */
2779
2780         if_printf(ifp, "netmap queues/slots: TX %d/%d, RX %d/%d\n",
2781             hwna->up.num_tx_rings, hwna->up.num_tx_desc,
2782             hwna->up.num_rx_rings, hwna->up.num_rx_desc);
2783         return 0;
2784
2785 fail:
2786         D("fail, arg %p ifp %p na %p", arg, ifp, hwna);
2787         if (ifp)
2788                 netmap_detach(ifp);
2789         return (hwna ? EINVAL : ENOMEM);
2790 }
2791
2792
2793 void
2794 NM_DBG(netmap_adapter_get)(struct netmap_adapter *na)
2795 {
2796         if (!na) {
2797                 return;
2798         }
2799
2800         refcount_acquire(&na->na_refcount);
2801 }
2802
2803
2804 /* returns 1 iff the netmap_adapter is destroyed */
2805 int
2806 NM_DBG(netmap_adapter_put)(struct netmap_adapter *na)
2807 {
2808         if (!na)
2809                 return 1;
2810
2811         if (!refcount_release(&na->na_refcount))
2812                 return 0;
2813
2814         if (na->nm_dtor)
2815                 na->nm_dtor(na);
2816
2817         netmap_detach_common(na);
2818
2819         return 1;
2820 }
2821
2822 /* nm_krings_create callback for all hardware native adapters */
2823 int
2824 netmap_hw_krings_create(struct netmap_adapter *na)
2825 {
2826         int ret = netmap_krings_create(na, 0);
2827         if (ret == 0) {
2828                 /* initialize the mbq for the sw rx ring */
2829                 mbq_safe_init(&na->rx_rings[na->num_rx_rings].rx_queue);
2830                 ND("initialized sw rx queue %d", na->num_rx_rings);
2831         }
2832         return ret;
2833 }
2834
2835
2836
2837 /*
2838  * Called on module unload by the netmap-enabled drivers
2839  */
2840 void
2841 netmap_detach(struct ifnet *ifp)
2842 {
2843         struct netmap_adapter *na = NA(ifp);
2844         int skip;
2845
2846         if (!na)
2847                 return;
2848
2849         skip = 0;
2850         NMG_LOCK();
2851         netmap_disable_all_rings(ifp);
2852         na->ifp = NULL;
2853         na->na_flags &= ~NAF_NETMAP_ON;
2854         /*
2855          * if the netmap adapter is not native, somebody
2856          * changed it, so we can not release it here.
2857          * The NULL na->ifp will notify the new owner that
2858          * the driver is gone.
2859          */
2860         if (na->na_flags & NAF_NATIVE) {
2861                 skip = netmap_adapter_put(na);
2862         }
2863         /* give them a chance to notice */
2864         if (skip == 0)
2865                 netmap_enable_all_rings(ifp);
2866         NMG_UNLOCK();
2867 }
2868
2869
2870 /*
2871  * Intercept packets from the network stack and pass them
2872  * to netmap as incoming packets on the 'software' ring.
2873  *
2874  * We only store packets in a bounded mbq and then copy them
2875  * in the relevant rxsync routine.
2876  *
2877  * We rely on the OS to make sure that the ifp and na do not go
2878  * away (typically the caller checks for IFF_DRV_RUNNING or the like).
2879  * In nm_register() or whenever there is a reinitialization,
2880  * we make sure to make the mode change visible here.
2881  */
2882 int
2883 netmap_transmit(struct ifnet *ifp, struct mbuf *m)
2884 {
2885         struct netmap_adapter *na = NA(ifp);
2886         struct netmap_kring *kring;
2887         u_int len = MBUF_LEN(m);
2888         u_int error = ENOBUFS;
2889         struct mbq *q;
2890         int space;
2891
2892         kring = &na->rx_rings[na->num_rx_rings];
2893         // XXX [Linux] we do not need this lock
2894         // if we follow the down/configure/up protocol -gl
2895         // mtx_lock(&na->core_lock);
2896
2897         if (!nm_netmap_on(na)) {
2898                 D("%s not in netmap mode anymore", na->name);
2899                 error = ENXIO;
2900                 goto done;
2901         }
2902
2903         q = &kring->rx_queue;
2904
2905         // XXX reconsider long packets if we handle fragments
2906         if (len > NETMAP_BUF_SIZE(na)) { /* too long for us */
2907                 D("%s from_host, drop packet size %d > %d", na->name,
2908                         len, NETMAP_BUF_SIZE(na));
2909                 goto done;
2910         }
2911
2912         /* protect against rxsync_from_host(), netmap_sw_to_nic()
2913          * and maybe other instances of netmap_transmit (the latter
2914          * not possible on Linux).
2915          * Also avoid overflowing the queue.
2916          */
2917         mbq_lock(q);
2918
2919         space = kring->nr_hwtail - kring->nr_hwcur;
2920         if (space < 0)
2921                 space += kring->nkr_num_slots;
2922         if (space + mbq_len(q) >= kring->nkr_num_slots - 1) { // XXX
2923                 RD(10, "%s full hwcur %d hwtail %d qlen %d len %d m %p",
2924                         na->name, kring->nr_hwcur, kring->nr_hwtail, mbq_len(q),
2925                         len, m);
2926         } else {
2927                 mbq_enqueue(q, m);
2928                 ND(10, "%s %d bufs in queue len %d m %p",
2929                         na->name, mbq_len(q), len, m);
2930                 /* notify outside the lock */
2931                 m = NULL;
2932                 error = 0;
2933         }
2934         mbq_unlock(q);
2935
2936 done:
2937         if (m)
2938                 m_freem(m);
2939         /* unconditionally wake up listeners */
2940         kring->nm_notify(kring, 0);
2941         /* this is normally netmap_notify(), but for nics
2942          * connected to a bridge it is netmap_bwrap_intr_notify(),
2943          * that possibly forwards the frames through the switch
2944          */
2945
2946         return (error);
2947 }
2948
2949
2950 /*
2951  * netmap_reset() is called by the driver routines when reinitializing
2952  * a ring. The driver is in charge of locking to protect the kring.
2953  * If native netmap mode is not set just return NULL.
2954  */
2955 struct netmap_slot *
2956 netmap_reset(struct netmap_adapter *na, enum txrx tx, u_int n,
2957         u_int new_cur)
2958 {
2959         struct netmap_kring *kring;
2960         int new_hwofs, lim;
2961
2962         if (!nm_native_on(na)) {
2963                 ND("interface not in native netmap mode");
2964                 return NULL;    /* nothing to reinitialize */
2965         }
2966
2967         /* XXX note- in the new scheme, we are not guaranteed to be
2968          * under lock (e.g. when called on a device reset).
2969          * In this case, we should set a flag and do not trust too
2970          * much the values. In practice: TODO
2971          * - set a RESET flag somewhere in the kring
2972          * - do the processing in a conservative way
2973          * - let the *sync() fixup at the end.
2974          */
2975         if (tx == NR_TX) {
2976                 if (n >= na->num_tx_rings)
2977                         return NULL;
2978                 kring = na->tx_rings + n;
2979                 // XXX check whether we should use hwcur or rcur
2980                 new_hwofs = kring->nr_hwcur - new_cur;
2981         } else {
2982                 if (n >= na->num_rx_rings)
2983                         return NULL;
2984                 kring = na->rx_rings + n;
2985                 new_hwofs = kring->nr_hwtail - new_cur;
2986         }
2987         lim = kring->nkr_num_slots - 1;
2988         if (new_hwofs > lim)
2989                 new_hwofs -= lim + 1;
2990
2991         /* Always set the new offset value and realign the ring. */
2992         if (netmap_verbose)
2993             D("%s %s%d hwofs %d -> %d, hwtail %d -> %d",
2994                 na->name,
2995                 tx == NR_TX ? "TX" : "RX", n,
2996                 kring->nkr_hwofs, new_hwofs,
2997                 kring->nr_hwtail,
2998                 tx == NR_TX ? lim : kring->nr_hwtail);
2999         kring->nkr_hwofs = new_hwofs;
3000         if (tx == NR_TX) {
3001                 kring->nr_hwtail = kring->nr_hwcur + lim;
3002                 if (kring->nr_hwtail > lim)
3003                         kring->nr_hwtail -= lim + 1;
3004         }
3005
3006 #if 0 // def linux
3007         /* XXX check that the mappings are correct */
3008         /* need ring_nr, adapter->pdev, direction */
3009         buffer_info->dma = dma_map_single(&pdev->dev, addr, adapter->rx_buffer_len, DMA_FROM_DEVICE);
3010         if (dma_mapping_error(&adapter->pdev->dev, buffer_info->dma)) {
3011                 D("error mapping rx netmap buffer %d", i);
3012                 // XXX fix error handling
3013         }
3014
3015 #endif /* linux */
3016         /*
3017          * Wakeup on the individual and global selwait
3018          * We do the wakeup here, but the ring is not yet reconfigured.
3019          * However, we are under lock so there are no races.
3020          */
3021         kring->nm_notify(kring, 0);
3022         return kring->ring->slot;
3023 }
3024
3025
3026 /*
3027  * Dispatch rx/tx interrupts to the netmap rings.
3028  *
3029  * "work_done" is non-null on the RX path, NULL for the TX path.
3030  * We rely on the OS to make sure that there is only one active
3031  * instance per queue, and that there is appropriate locking.
3032  *
3033  * The 'notify' routine depends on what the ring is attached to.
3034  * - for a netmap file descriptor, do a selwakeup on the individual
3035  *   waitqueue, plus one on the global one if needed
3036  *   (see netmap_notify)
3037  * - for a nic connected to a switch, call the proper forwarding routine
3038  *   (see netmap_bwrap_intr_notify)
3039  */
3040 void
3041 netmap_common_irq(struct ifnet *ifp, u_int q, u_int *work_done)
3042 {
3043         struct netmap_adapter *na = NA(ifp);
3044         struct netmap_kring *kring;
3045         enum txrx t = (work_done ? NR_RX : NR_TX);
3046
3047         q &= NETMAP_RING_MASK;
3048
3049         if (netmap_verbose) {
3050                 RD(5, "received %s queue %d", work_done ? "RX" : "TX" , q);
3051         }
3052
3053         if (q >= nma_get_nrings(na, t))
3054                 return; // not a physical queue
3055
3056         kring = NMR(na, t) + q;
3057
3058         if (t == NR_RX) {
3059                 kring->nr_kflags |= NKR_PENDINTR;       // XXX atomic ?
3060                 *work_done = 1; /* do not fire napi again */
3061         }
3062         kring->nm_notify(kring, 0);
3063 }
3064
3065
3066 /*
3067  * Default functions to handle rx/tx interrupts from a physical device.
3068  * "work_done" is non-null on the RX path, NULL for the TX path.
3069  *
3070  * If the card is not in netmap mode, simply return 0,
3071  * so that the caller proceeds with regular processing.
3072  * Otherwise call netmap_common_irq() and return 1.
3073  *
3074  * If the card is connected to a netmap file descriptor,
3075  * do a selwakeup on the individual queue, plus one on the global one
3076  * if needed (multiqueue card _and_ there are multiqueue listeners),
3077  * and return 1.
3078  *
3079  * Finally, if called on rx from an interface connected to a switch,
3080  * calls the proper forwarding routine, and return 1.
3081  */
3082 int
3083 netmap_rx_irq(struct ifnet *ifp, u_int q, u_int *work_done)
3084 {
3085         struct netmap_adapter *na = NA(ifp);
3086
3087         /*
3088          * XXX emulated netmap mode sets NAF_SKIP_INTR so
3089          * we still use the regular driver even though the previous
3090          * check fails. It is unclear whether we should use
3091          * nm_native_on() here.
3092          */
3093         if (!nm_netmap_on(na))
3094                 return 0;
3095
3096         if (na->na_flags & NAF_SKIP_INTR) {
3097                 ND("use regular interrupt");
3098                 return 0;
3099         }
3100
3101         netmap_common_irq(ifp, q, work_done);
3102         return 1;
3103 }
3104
3105
3106 /*
3107  * Module loader and unloader
3108  *
3109  * netmap_init() creates the /dev/netmap device and initializes
3110  * all global variables. Returns 0 on success, errno on failure
3111  * (but there is no chance)
3112  *
3113  * netmap_fini() destroys everything.
3114  */
3115
3116 static struct cdev *netmap_dev; /* /dev/netmap character device. */
3117 extern struct cdevsw netmap_cdevsw;
3118
3119
3120 void
3121 netmap_fini(void)
3122 {
3123         netmap_uninit_bridges();
3124         if (netmap_dev)
3125                 destroy_dev(netmap_dev);
3126         netmap_mem_fini();
3127         NMG_LOCK_DESTROY();
3128         printf("netmap: unloaded module.\n");
3129 }
3130
3131
3132 int
3133 netmap_init(void)
3134 {
3135         int error;
3136
3137         NMG_LOCK_INIT();
3138
3139         error = netmap_mem_init();
3140         if (error != 0)
3141                 goto fail;
3142         /*
3143          * MAKEDEV_ETERNAL_KLD avoids an expensive check on syscalls
3144          * when the module is compiled in.
3145          * XXX could use make_dev_credv() to get error number
3146          */
3147         netmap_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD,
3148                 &netmap_cdevsw, 0, NULL, UID_ROOT, GID_WHEEL, 0600,
3149                               "netmap");
3150         if (!netmap_dev)
3151                 goto fail;
3152
3153         error = netmap_init_bridges();
3154         if (error)
3155                 goto fail;
3156
3157 #ifdef __FreeBSD__
3158         nm_vi_init_index();
3159 #endif
3160
3161         printf("netmap: loaded module\n");
3162         return (0);
3163 fail:
3164         netmap_fini();
3165         return (EINVAL); /* may be incorrect */
3166 }