xref: /freebsd/sys/dev/netmap/netmap_bdg.c (revision d9a42747950146bf03cda7f6e25d219253f8a57a)
1 /*
2  * Copyright (C) 2013-2016 Universita` di Pisa
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *   1. Redistributions of source code must retain the above copyright
9  *      notice, this list of conditions and the following disclaimer.
10  *   2. Redistributions in binary form must reproduce the above copyright
11  *      notice, this list of conditions and the following disclaimer in the
12  *      documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 
28 /*
29  * This module implements the VALE switch for netmap
30 
31 --- VALE SWITCH ---
32 
33 NMG_LOCK() serializes all modifications to switches and ports.
34 A switch cannot be deleted until all ports are gone.
35 
36 For each switch, an SX lock (RWlock on linux) protects
37 deletion of ports. When configuring or deleting a new port, the
38 lock is acquired in exclusive mode (after holding NMG_LOCK).
39 When forwarding, the lock is acquired in shared mode (without NMG_LOCK).
40 The lock is held throughout the entire forwarding cycle,
41 during which the thread may incur in a page fault.
42 Hence it is important that sleepable shared locks are used.
43 
44 On the rx ring, the per-port lock is grabbed initially to reserve
45 a number of slot in the ring, then the lock is released,
46 packets are copied from source to destination, and then
47 the lock is acquired again and the receive ring is updated.
48 (A similar thing is done on the tx ring for NIC and host stack
49 ports attached to the switch)
50 
51  */
52 
53 /*
54  * OS-specific code that is used only within this file.
55  * Other OS-specific code that must be accessed by drivers
56  * is present in netmap_kern.h
57  */
58 
59 #if defined(__FreeBSD__)
60 #include <sys/cdefs.h> /* prerequisite */
61 __FBSDID("$FreeBSD$");
62 
63 #include <sys/types.h>
64 #include <sys/errno.h>
65 #include <sys/param.h>	/* defines used in kernel.h */
66 #include <sys/kernel.h>	/* types used in module initialization */
67 #include <sys/conf.h>	/* cdevsw struct, UID, GID */
68 #include <sys/sockio.h>
69 #include <sys/socketvar.h>	/* struct socket */
70 #include <sys/malloc.h>
71 #include <sys/poll.h>
72 #include <sys/rwlock.h>
73 #include <sys/socket.h> /* sockaddrs */
74 #include <sys/selinfo.h>
75 #include <sys/sysctl.h>
76 #include <net/if.h>
77 #include <net/if_var.h>
78 #include <net/bpf.h>		/* BIOCIMMEDIATE */
79 #include <machine/bus.h>	/* bus_dmamap_* */
80 #include <sys/endian.h>
81 #include <sys/refcount.h>
82 #include <sys/smp.h>
83 
84 
85 #elif defined(linux)
86 
87 #include "bsd_glue.h"
88 
89 #elif defined(__APPLE__)
90 
91 #warning OSX support is only partial
92 #include "osx_glue.h"
93 
94 #elif defined(_WIN32)
95 #include "win_glue.h"
96 
97 #else
98 
99 #error	Unsupported platform
100 
101 #endif /* unsupported */
102 
103 /*
104  * common headers
105  */
106 
107 #include <net/netmap.h>
108 #include <dev/netmap/netmap_kern.h>
109 #include <dev/netmap/netmap_mem2.h>
110 
111 #include <dev/netmap/netmap_bdg.h>
112 
113 const char*
114 netmap_bdg_name(struct netmap_vp_adapter *vp)
115 {
116 	struct nm_bridge *b = vp->na_bdg;
117 	if (b == NULL)
118 		return NULL;
119 	return b->bdg_basename;
120 }
121 
122 
123 #ifndef CONFIG_NET_NS
124 /*
125  * XXX in principle nm_bridges could be created dynamically
126  * Right now we have a static array and deletions are protected
127  * by an exclusive lock.
128  */
129 struct nm_bridge *nm_bridges;
130 #endif /* !CONFIG_NET_NS */
131 
132 
133 static int
134 nm_is_id_char(const char c)
135 {
136 	return (c >= 'a' && c <= 'z') ||
137 	       (c >= 'A' && c <= 'Z') ||
138 	       (c >= '0' && c <= '9') ||
139 	       (c == '_');
140 }
141 
142 /* Validate the name of a bdg port and return the
143  * position of the ":" character. */
144 static int
145 nm_bdg_name_validate(const char *name, size_t prefixlen)
146 {
147 	int colon_pos = -1;
148 	int i;
149 
150 	if (!name || strlen(name) < prefixlen) {
151 		return -1;
152 	}
153 
154 	for (i = 0; i < NM_BDG_IFNAMSIZ && name[i]; i++) {
155 		if (name[i] == ':') {
156 			colon_pos = i;
157 			break;
158 		} else if (!nm_is_id_char(name[i])) {
159 			return -1;
160 		}
161 	}
162 
163 	if (strlen(name) - colon_pos > IFNAMSIZ) {
164 		/* interface name too long */
165 		return -1;
166 	}
167 
168 	return colon_pos;
169 }
170 
171 /*
172  * locate a bridge among the existing ones.
173  * MUST BE CALLED WITH NMG_LOCK()
174  *
175  * a ':' in the name terminates the bridge name. Otherwise, just NM_NAME.
176  * We assume that this is called with a name of at least NM_NAME chars.
177  */
178 struct nm_bridge *
179 nm_find_bridge(const char *name, int create, struct netmap_bdg_ops *ops)
180 {
181 	int i, namelen;
182 	struct nm_bridge *b = NULL, *bridges;
183 	u_int num_bridges;
184 
185 	NMG_LOCK_ASSERT();
186 
187 	netmap_bns_getbridges(&bridges, &num_bridges);
188 
189 	namelen = nm_bdg_name_validate(name,
190 			(ops != NULL ? strlen(ops->name) : 0));
191 	if (namelen < 0) {
192 		nm_prerr("invalid bridge name %s", name ? name : NULL);
193 		return NULL;
194 	}
195 
196 	/* lookup the name, remember empty slot if there is one */
197 	for (i = 0; i < num_bridges; i++) {
198 		struct nm_bridge *x = bridges + i;
199 
200 		if ((x->bdg_flags & NM_BDG_ACTIVE) + x->bdg_active_ports == 0) {
201 			if (create && b == NULL)
202 				b = x;	/* record empty slot */
203 		} else if (x->bdg_namelen != namelen) {
204 			continue;
205 		} else if (strncmp(name, x->bdg_basename, namelen) == 0) {
206 			nm_prdis("found '%.*s' at %d", namelen, name, i);
207 			b = x;
208 			break;
209 		}
210 	}
211 	if (i == num_bridges && b) { /* name not found, can create entry */
212 		/* initialize the bridge */
213 		nm_prdis("create new bridge %s with ports %d", b->bdg_basename,
214 			b->bdg_active_ports);
215 		b->ht = nm_os_malloc(sizeof(struct nm_hash_ent) * NM_BDG_HASH);
216 		if (b->ht == NULL) {
217 			nm_prerr("failed to allocate hash table");
218 			return NULL;
219 		}
220 		strncpy(b->bdg_basename, name, namelen);
221 		b->bdg_namelen = namelen;
222 		b->bdg_active_ports = 0;
223 		for (i = 0; i < NM_BDG_MAXPORTS; i++)
224 			b->bdg_port_index[i] = i;
225 		/* set the default function */
226 		b->bdg_ops = b->bdg_saved_ops = *ops;
227 		b->private_data = b->ht;
228 		b->bdg_flags = 0;
229 		NM_BNS_GET(b);
230 	}
231 	return b;
232 }
233 
234 
235 int
236 netmap_bdg_free(struct nm_bridge *b)
237 {
238 	if ((b->bdg_flags & NM_BDG_ACTIVE) + b->bdg_active_ports != 0) {
239 		return EBUSY;
240 	}
241 
242 	nm_prdis("marking bridge %s as free", b->bdg_basename);
243 	nm_os_free(b->ht);
244 	memset(&b->bdg_ops, 0, sizeof(b->bdg_ops));
245 	memset(&b->bdg_saved_ops, 0, sizeof(b->bdg_saved_ops));
246 	b->bdg_flags = 0;
247 	NM_BNS_PUT(b);
248 	return 0;
249 }
250 
251 /* Called by external kernel modules (e.g., Openvswitch).
252  * to modify the private data previously given to regops().
253  * 'name' may be just bridge's name (including ':' if it
254  * is not just NM_BDG_NAME).
255  * Called without NMG_LOCK.
256  */
257 int
258 netmap_bdg_update_private_data(const char *name, bdg_update_private_data_fn_t callback,
259 	void *callback_data, void *auth_token)
260 {
261 	void *private_data = NULL;
262 	struct nm_bridge *b;
263 	int error = 0;
264 
265 	NMG_LOCK();
266 	b = nm_find_bridge(name, 0 /* don't create */, NULL);
267 	if (!b) {
268 		error = EINVAL;
269 		goto unlock_update_priv;
270 	}
271 	if (!nm_bdg_valid_auth_token(b, auth_token)) {
272 		error = EACCES;
273 		goto unlock_update_priv;
274 	}
275 	BDG_WLOCK(b);
276 	private_data = callback(b->private_data, callback_data, &error);
277 	b->private_data = private_data;
278 	BDG_WUNLOCK(b);
279 
280 unlock_update_priv:
281 	NMG_UNLOCK();
282 	return error;
283 }
284 
285 
286 
287 /* remove from bridge b the ports in slots hw and sw
288  * (sw can be -1 if not needed)
289  */
290 void
291 netmap_bdg_detach_common(struct nm_bridge *b, int hw, int sw)
292 {
293 	int s_hw = hw, s_sw = sw;
294 	int i, lim =b->bdg_active_ports;
295 	uint32_t *tmp = b->tmp_bdg_port_index;
296 
297 	/*
298 	New algorithm:
299 	make a copy of bdg_port_index;
300 	lookup NA(ifp)->bdg_port and SWNA(ifp)->bdg_port
301 	in the array of bdg_port_index, replacing them with
302 	entries from the bottom of the array;
303 	decrement bdg_active_ports;
304 	acquire BDG_WLOCK() and copy back the array.
305 	 */
306 
307 	if (netmap_debug & NM_DEBUG_BDG)
308 		nm_prinf("detach %d and %d (lim %d)", hw, sw, lim);
309 	/* make a copy of the list of active ports, update it,
310 	 * and then copy back within BDG_WLOCK().
311 	 */
312 	memcpy(b->tmp_bdg_port_index, b->bdg_port_index, sizeof(b->tmp_bdg_port_index));
313 	for (i = 0; (hw >= 0 || sw >= 0) && i < lim; ) {
314 		if (hw >= 0 && tmp[i] == hw) {
315 			nm_prdis("detach hw %d at %d", hw, i);
316 			lim--; /* point to last active port */
317 			tmp[i] = tmp[lim]; /* swap with i */
318 			tmp[lim] = hw;	/* now this is inactive */
319 			hw = -1;
320 		} else if (sw >= 0 && tmp[i] == sw) {
321 			nm_prdis("detach sw %d at %d", sw, i);
322 			lim--;
323 			tmp[i] = tmp[lim];
324 			tmp[lim] = sw;
325 			sw = -1;
326 		} else {
327 			i++;
328 		}
329 	}
330 	if (hw >= 0 || sw >= 0) {
331 		nm_prerr("delete failed hw %d sw %d, should panic...", hw, sw);
332 	}
333 
334 	BDG_WLOCK(b);
335 	if (b->bdg_ops.dtor)
336 		b->bdg_ops.dtor(b->bdg_ports[s_hw]);
337 	b->bdg_ports[s_hw] = NULL;
338 	if (s_sw >= 0) {
339 		b->bdg_ports[s_sw] = NULL;
340 	}
341 	memcpy(b->bdg_port_index, b->tmp_bdg_port_index, sizeof(b->tmp_bdg_port_index));
342 	b->bdg_active_ports = lim;
343 	BDG_WUNLOCK(b);
344 
345 	nm_prdis("now %d active ports", lim);
346 	netmap_bdg_free(b);
347 }
348 
349 
350 /* nm_bdg_ctl callback for VALE ports */
351 int
352 netmap_vp_bdg_ctl(struct nmreq_header *hdr, struct netmap_adapter *na)
353 {
354 	struct netmap_vp_adapter *vpna = (struct netmap_vp_adapter *)na;
355 	struct nm_bridge *b = vpna->na_bdg;
356 
357 	if (hdr->nr_reqtype == NETMAP_REQ_VALE_ATTACH) {
358 		return 0; /* nothing to do */
359 	}
360 	if (b) {
361 		netmap_set_all_rings(na, 0 /* disable */);
362 		netmap_bdg_detach_common(b, vpna->bdg_port, -1);
363 		vpna->na_bdg = NULL;
364 		netmap_set_all_rings(na, 1 /* enable */);
365 	}
366 	/* I have took reference just for attach */
367 	netmap_adapter_put(na);
368 	return 0;
369 }
370 
371 int
372 netmap_default_bdg_attach(const char *name, struct netmap_adapter *na,
373 		struct nm_bridge *b)
374 {
375 	return NM_NEED_BWRAP;
376 }
377 
378 /* Try to get a reference to a netmap adapter attached to a VALE switch.
379  * If the adapter is found (or is created), this function returns 0, a
380  * non NULL pointer is returned into *na, and the caller holds a
381  * reference to the adapter.
382  * If an adapter is not found, then no reference is grabbed and the
383  * function returns an error code, or 0 if there is just a VALE prefix
384  * mismatch. Therefore the caller holds a reference when
385  * (*na != NULL && return == 0).
386  */
387 int
388 netmap_get_bdg_na(struct nmreq_header *hdr, struct netmap_adapter **na,
389 	struct netmap_mem_d *nmd, int create, struct netmap_bdg_ops *ops)
390 {
391 	char *nr_name = hdr->nr_name;
392 	const char *ifname;
393 	if_t ifp = NULL;
394 	int error = 0;
395 	struct netmap_vp_adapter *vpna, *hostna = NULL;
396 	struct nm_bridge *b;
397 	uint32_t i, j;
398 	uint32_t cand = NM_BDG_NOPORT, cand2 = NM_BDG_NOPORT;
399 	int needed;
400 
401 	*na = NULL;     /* default return value */
402 
403 	/* first try to see if this is a bridge port. */
404 	NMG_LOCK_ASSERT();
405 	if (strncmp(nr_name, ops->name, strlen(ops->name) - 1)) {
406 		return 0;  /* no error, but no VALE prefix */
407 	}
408 
409 	b = nm_find_bridge(nr_name, create, ops);
410 	if (b == NULL) {
411 		nm_prdis("no bridges available for '%s'", nr_name);
412 		return (create ? ENOMEM : ENXIO);
413 	}
414 	if (strlen(nr_name) < b->bdg_namelen) /* impossible */
415 		panic("x");
416 
417 	/* Now we are sure that name starts with the bridge's name,
418 	 * lookup the port in the bridge. We need to scan the entire
419 	 * list. It is not important to hold a WLOCK on the bridge
420 	 * during the search because NMG_LOCK already guarantees
421 	 * that there are no other possible writers.
422 	 */
423 
424 	/* lookup in the local list of ports */
425 	for (j = 0; j < b->bdg_active_ports; j++) {
426 		i = b->bdg_port_index[j];
427 		vpna = b->bdg_ports[i];
428 		nm_prdis("checking %s", vpna->up.name);
429 		if (!strcmp(vpna->up.name, nr_name)) {
430 			netmap_adapter_get(&vpna->up);
431 			nm_prdis("found existing if %s refs %d", nr_name)
432 			*na = &vpna->up;
433 			return 0;
434 		}
435 	}
436 	/* not found, should we create it? */
437 	if (!create)
438 		return ENXIO;
439 	/* yes we should, see if we have space to attach entries */
440 	needed = 2; /* in some cases we only need 1 */
441 	if (b->bdg_active_ports + needed >= NM_BDG_MAXPORTS) {
442 		nm_prerr("bridge full %d, cannot create new port", b->bdg_active_ports);
443 		return ENOMEM;
444 	}
445 	/* record the next two ports available, but do not allocate yet */
446 	cand = b->bdg_port_index[b->bdg_active_ports];
447 	cand2 = b->bdg_port_index[b->bdg_active_ports + 1];
448 	nm_prdis("+++ bridge %s port %s used %d avail %d %d",
449 		b->bdg_basename, ifname, b->bdg_active_ports, cand, cand2);
450 
451 	/*
452 	 * try see if there is a matching NIC with this name
453 	 * (after the bridge's name)
454 	 */
455 	ifname = nr_name + b->bdg_namelen + 1;
456 	ifp = ifunit_ref(ifname);
457 	if (!ifp) {
458 		/* Create an ephemeral virtual port.
459 		 * This block contains all the ephemeral-specific logic.
460 		 */
461 
462 		if (hdr->nr_reqtype != NETMAP_REQ_REGISTER) {
463 			error = EINVAL;
464 			goto out;
465 		}
466 
467 		/* bdg_netmap_attach creates a struct netmap_adapter */
468 		error = b->bdg_ops.vp_create(hdr, NULL, nmd, &vpna);
469 		if (error) {
470 			if (netmap_debug & NM_DEBUG_BDG)
471 				nm_prerr("error %d", error);
472 			goto out;
473 		}
474 		/* shortcut - we can skip get_hw_na(),
475 		 * ownership check and nm_bdg_attach()
476 		 */
477 
478 	} else {
479 		struct netmap_adapter *hw;
480 
481 		/* the vale:nic syntax is only valid for some commands */
482 		switch (hdr->nr_reqtype) {
483 		case NETMAP_REQ_VALE_ATTACH:
484 		case NETMAP_REQ_VALE_DETACH:
485 		case NETMAP_REQ_VALE_POLLING_ENABLE:
486 		case NETMAP_REQ_VALE_POLLING_DISABLE:
487 			break; /* ok */
488 		default:
489 			error = EINVAL;
490 			goto out;
491 		}
492 
493 		error = netmap_get_hw_na(ifp, nmd, &hw);
494 		if (error || hw == NULL)
495 			goto out;
496 
497 		/* host adapter might not be created */
498 		error = hw->nm_bdg_attach(nr_name, hw, b);
499 		if (error == NM_NEED_BWRAP) {
500 			error = b->bdg_ops.bwrap_attach(nr_name, hw);
501 		}
502 		if (error)
503 			goto out;
504 		vpna = hw->na_vp;
505 		hostna = hw->na_hostvp;
506 		if (hdr->nr_reqtype == NETMAP_REQ_VALE_ATTACH) {
507 			/* Check if we need to skip the host rings. */
508 			struct nmreq_vale_attach *areq =
509 				(struct nmreq_vale_attach *)(uintptr_t)hdr->nr_body;
510 			if (areq->reg.nr_mode != NR_REG_NIC_SW) {
511 				hostna = NULL;
512 			}
513 		}
514 	}
515 
516 	BDG_WLOCK(b);
517 	vpna->bdg_port = cand;
518 	nm_prdis("NIC  %p to bridge port %d", vpna, cand);
519 	/* bind the port to the bridge (virtual ports are not active) */
520 	b->bdg_ports[cand] = vpna;
521 	vpna->na_bdg = b;
522 	b->bdg_active_ports++;
523 	if (hostna != NULL) {
524 		/* also bind the host stack to the bridge */
525 		b->bdg_ports[cand2] = hostna;
526 		hostna->bdg_port = cand2;
527 		hostna->na_bdg = b;
528 		b->bdg_active_ports++;
529 		nm_prdis("host %p to bridge port %d", hostna, cand2);
530 	}
531 	nm_prdis("if %s refs %d", ifname, vpna->up.na_refcount);
532 	BDG_WUNLOCK(b);
533 	*na = &vpna->up;
534 	netmap_adapter_get(*na);
535 
536 out:
537 	if (ifp)
538 		if_rele(ifp);
539 
540 	return error;
541 }
542 
543 /* Process NETMAP_REQ_VALE_ATTACH.
544  */
545 int
546 netmap_bdg_attach(struct nmreq_header *hdr, void *auth_token)
547 {
548 	struct nmreq_vale_attach *req =
549 		(struct nmreq_vale_attach *)(uintptr_t)hdr->nr_body;
550 	struct netmap_vp_adapter * vpna;
551 	struct netmap_adapter *na = NULL;
552 	struct netmap_mem_d *nmd = NULL;
553 	struct nm_bridge *b = NULL;
554 	int error;
555 
556 	NMG_LOCK();
557 	/* permission check for modified bridges */
558 	b = nm_find_bridge(hdr->nr_name, 0 /* don't create */, NULL);
559 	if (b && !nm_bdg_valid_auth_token(b, auth_token)) {
560 		error = EACCES;
561 		goto unlock_exit;
562 	}
563 
564 	if (req->reg.nr_mem_id) {
565 		nmd = netmap_mem_find(req->reg.nr_mem_id);
566 		if (nmd == NULL) {
567 			error = EINVAL;
568 			goto unlock_exit;
569 		}
570 	}
571 
572 	/* check for existing one */
573 	error = netmap_get_vale_na(hdr, &na, nmd, 0);
574 	if (na) {
575 		error = EBUSY;
576 		goto unref_exit;
577 	}
578 	error = netmap_get_vale_na(hdr, &na,
579 				nmd, 1 /* create if not exists */);
580 	if (error) { /* no device */
581 		goto unlock_exit;
582 	}
583 
584 	if (na == NULL) { /* VALE prefix missing */
585 		error = EINVAL;
586 		goto unlock_exit;
587 	}
588 
589 	if (NETMAP_OWNED_BY_ANY(na)) {
590 		error = EBUSY;
591 		goto unref_exit;
592 	}
593 
594 	if (na->nm_bdg_ctl) {
595 		/* nop for VALE ports. The bwrap needs to put the hwna
596 		 * in netmap mode (see netmap_bwrap_bdg_ctl)
597 		 */
598 		error = na->nm_bdg_ctl(hdr, na);
599 		if (error)
600 			goto unref_exit;
601 		nm_prdis("registered %s to netmap-mode", na->name);
602 	}
603 	vpna = (struct netmap_vp_adapter *)na;
604 	req->port_index = vpna->bdg_port;
605 
606 	if (nmd)
607 		netmap_mem_put(nmd);
608 
609 	NMG_UNLOCK();
610 	return 0;
611 
612 unref_exit:
613 	netmap_adapter_put(na);
614 unlock_exit:
615 	if (nmd)
616 		netmap_mem_put(nmd);
617 
618 	NMG_UNLOCK();
619 	return error;
620 }
621 
622 
623 int
624 nm_is_bwrap(struct netmap_adapter *na)
625 {
626 	return na->nm_register == netmap_bwrap_reg;
627 }
628 
629 /* Process NETMAP_REQ_VALE_DETACH.
630  */
631 int
632 netmap_bdg_detach(struct nmreq_header *hdr, void *auth_token)
633 {
634 	int error;
635 
636 	NMG_LOCK();
637 	error = netmap_bdg_detach_locked(hdr, auth_token);
638 	NMG_UNLOCK();
639 	return error;
640 }
641 
642 int
643 netmap_bdg_detach_locked(struct nmreq_header *hdr, void *auth_token)
644 {
645 	struct nmreq_vale_detach *nmreq_det = (void *)(uintptr_t)hdr->nr_body;
646 	struct netmap_vp_adapter *vpna;
647 	struct netmap_adapter *na;
648 	struct nm_bridge *b = NULL;
649 	int error;
650 
651 	/* permission check for modified bridges */
652 	b = nm_find_bridge(hdr->nr_name, 0 /* don't create */, NULL);
653 	if (b && !nm_bdg_valid_auth_token(b, auth_token)) {
654 		error = EACCES;
655 		goto error_exit;
656 	}
657 
658 	error = netmap_get_vale_na(hdr, &na, NULL, 0 /* don't create */);
659 	if (error) { /* no device, or another bridge or user owns the device */
660 		goto error_exit;
661 	}
662 
663 	if (na == NULL) { /* VALE prefix missing */
664 		error = EINVAL;
665 		goto error_exit;
666 	} else if (nm_is_bwrap(na) &&
667 		   ((struct netmap_bwrap_adapter *)na)->na_polling_state) {
668 		/* Don't detach a NIC with polling */
669 		error = EBUSY;
670 		goto unref_exit;
671 	}
672 
673 	vpna = (struct netmap_vp_adapter *)na;
674 	if (na->na_vp != vpna) {
675 		/* trying to detach first attach of VALE persistent port attached
676 		 * to 2 bridges
677 		 */
678 		error = EBUSY;
679 		goto unref_exit;
680 	}
681 	nmreq_det->port_index = vpna->bdg_port;
682 
683 	if (na->nm_bdg_ctl) {
684 		/* remove the port from bridge. The bwrap
685 		 * also needs to put the hwna in normal mode
686 		 */
687 		error = na->nm_bdg_ctl(hdr, na);
688 	}
689 
690 unref_exit:
691 	netmap_adapter_put(na);
692 error_exit:
693 	return error;
694 
695 }
696 
697 
698 struct nm_bdg_polling_state;
699 struct
700 nm_bdg_kthread {
701 	struct nm_kctx *nmk;
702 	u_int qfirst;
703 	u_int qlast;
704 	struct nm_bdg_polling_state *bps;
705 };
706 
707 struct nm_bdg_polling_state {
708 	bool configured;
709 	bool stopped;
710 	struct netmap_bwrap_adapter *bna;
711 	uint32_t mode;
712 	u_int qfirst;
713 	u_int qlast;
714 	u_int cpu_from;
715 	u_int ncpus;
716 	struct nm_bdg_kthread *kthreads;
717 };
718 
719 static void
720 netmap_bwrap_polling(void *data)
721 {
722 	struct nm_bdg_kthread *nbk = data;
723 	struct netmap_bwrap_adapter *bna;
724 	u_int qfirst, qlast, i;
725 	struct netmap_kring **kring0, *kring;
726 
727 	if (!nbk)
728 		return;
729 	qfirst = nbk->qfirst;
730 	qlast = nbk->qlast;
731 	bna = nbk->bps->bna;
732 	kring0 = NMR(bna->hwna, NR_RX);
733 
734 	for (i = qfirst; i < qlast; i++) {
735 		kring = kring0[i];
736 		kring->nm_notify(kring, 0);
737 	}
738 }
739 
740 static int
741 nm_bdg_create_kthreads(struct nm_bdg_polling_state *bps)
742 {
743 	struct nm_kctx_cfg kcfg;
744 	int i, j;
745 
746 	bps->kthreads = nm_os_malloc(sizeof(struct nm_bdg_kthread) * bps->ncpus);
747 	if (bps->kthreads == NULL)
748 		return ENOMEM;
749 
750 	bzero(&kcfg, sizeof(kcfg));
751 	kcfg.worker_fn = netmap_bwrap_polling;
752 	for (i = 0; i < bps->ncpus; i++) {
753 		struct nm_bdg_kthread *t = bps->kthreads + i;
754 		int all = (bps->ncpus == 1 &&
755 			bps->mode == NETMAP_POLLING_MODE_SINGLE_CPU);
756 		int affinity = bps->cpu_from + i;
757 
758 		t->bps = bps;
759 		t->qfirst = all ? bps->qfirst /* must be 0 */: affinity;
760 		t->qlast = all ? bps->qlast : t->qfirst + 1;
761 		if (netmap_verbose)
762 			nm_prinf("kthread %d a:%u qf:%u ql:%u", i, affinity, t->qfirst,
763 				t->qlast);
764 
765 		kcfg.type = i;
766 		kcfg.worker_private = t;
767 		t->nmk = nm_os_kctx_create(&kcfg, NULL);
768 		if (t->nmk == NULL) {
769 			goto cleanup;
770 		}
771 		nm_os_kctx_worker_setaff(t->nmk, affinity);
772 	}
773 	return 0;
774 
775 cleanup:
776 	for (j = 0; j < i; j++) {
777 		struct nm_bdg_kthread *t = bps->kthreads + i;
778 		nm_os_kctx_destroy(t->nmk);
779 	}
780 	nm_os_free(bps->kthreads);
781 	return EFAULT;
782 }
783 
784 /* A variant of ptnetmap_start_kthreads() */
785 static int
786 nm_bdg_polling_start_kthreads(struct nm_bdg_polling_state *bps)
787 {
788 	int error, i, j;
789 
790 	if (!bps) {
791 		nm_prerr("polling is not configured");
792 		return EFAULT;
793 	}
794 	bps->stopped = false;
795 
796 	for (i = 0; i < bps->ncpus; i++) {
797 		struct nm_bdg_kthread *t = bps->kthreads + i;
798 		error = nm_os_kctx_worker_start(t->nmk);
799 		if (error) {
800 			nm_prerr("error in nm_kthread_start(): %d", error);
801 			goto cleanup;
802 		}
803 	}
804 	return 0;
805 
806 cleanup:
807 	for (j = 0; j < i; j++) {
808 		struct nm_bdg_kthread *t = bps->kthreads + i;
809 		nm_os_kctx_worker_stop(t->nmk);
810 	}
811 	bps->stopped = true;
812 	return error;
813 }
814 
815 static void
816 nm_bdg_polling_stop_delete_kthreads(struct nm_bdg_polling_state *bps)
817 {
818 	int i;
819 
820 	if (!bps)
821 		return;
822 
823 	for (i = 0; i < bps->ncpus; i++) {
824 		struct nm_bdg_kthread *t = bps->kthreads + i;
825 		nm_os_kctx_worker_stop(t->nmk);
826 		nm_os_kctx_destroy(t->nmk);
827 	}
828 	bps->stopped = true;
829 }
830 
831 static int
832 get_polling_cfg(struct nmreq_vale_polling *req, struct netmap_adapter *na,
833 		struct nm_bdg_polling_state *bps)
834 {
835 	unsigned int avail_cpus, core_from;
836 	unsigned int qfirst, qlast;
837 	uint32_t i = req->nr_first_cpu_id;
838 	uint32_t req_cpus = req->nr_num_polling_cpus;
839 
840 	avail_cpus = nm_os_ncpus();
841 
842 	if (req_cpus == 0) {
843 		nm_prerr("req_cpus must be > 0");
844 		return EINVAL;
845 	} else if (req_cpus >= avail_cpus) {
846 		nm_prerr("Cannot use all the CPUs in the system");
847 		return EINVAL;
848 	}
849 
850 	if (req->nr_mode == NETMAP_POLLING_MODE_MULTI_CPU) {
851 		/* Use a separate core for each ring. If nr_num_polling_cpus>1
852 		 * more consecutive rings are polled.
853 		 * For example, if nr_first_cpu_id=2 and nr_num_polling_cpus=2,
854 		 * ring 2 and 3 are polled by core 2 and 3, respectively. */
855 		if (i + req_cpus > nma_get_nrings(na, NR_RX)) {
856 			nm_prerr("Rings %u-%u not in range (have %d rings)",
857 				i, i + req_cpus, nma_get_nrings(na, NR_RX));
858 			return EINVAL;
859 		}
860 		qfirst = i;
861 		qlast = qfirst + req_cpus;
862 		core_from = qfirst;
863 
864 	} else if (req->nr_mode == NETMAP_POLLING_MODE_SINGLE_CPU) {
865 		/* Poll all the rings using a core specified by nr_first_cpu_id.
866 		 * the number of cores must be 1. */
867 		if (req_cpus != 1) {
868 			nm_prerr("ncpus must be 1 for NETMAP_POLLING_MODE_SINGLE_CPU "
869 				"(was %d)", req_cpus);
870 			return EINVAL;
871 		}
872 		qfirst = 0;
873 		qlast = nma_get_nrings(na, NR_RX);
874 		core_from = i;
875 	} else {
876 		nm_prerr("Invalid polling mode");
877 		return EINVAL;
878 	}
879 
880 	bps->mode = req->nr_mode;
881 	bps->qfirst = qfirst;
882 	bps->qlast = qlast;
883 	bps->cpu_from = core_from;
884 	bps->ncpus = req_cpus;
885 	nm_prinf("%s qfirst %u qlast %u cpu_from %u ncpus %u",
886 		req->nr_mode == NETMAP_POLLING_MODE_MULTI_CPU ?
887 		"MULTI" : "SINGLE",
888 		qfirst, qlast, core_from, req_cpus);
889 	return 0;
890 }
891 
892 static int
893 nm_bdg_ctl_polling_start(struct nmreq_vale_polling *req, struct netmap_adapter *na)
894 {
895 	struct nm_bdg_polling_state *bps;
896 	struct netmap_bwrap_adapter *bna;
897 	int error;
898 
899 	bna = (struct netmap_bwrap_adapter *)na;
900 	if (bna->na_polling_state) {
901 		nm_prerr("ERROR adapter already in polling mode");
902 		return EFAULT;
903 	}
904 
905 	bps = nm_os_malloc(sizeof(*bps));
906 	if (!bps)
907 		return ENOMEM;
908 	bps->configured = false;
909 	bps->stopped = true;
910 
911 	if (get_polling_cfg(req, na, bps)) {
912 		nm_os_free(bps);
913 		return EINVAL;
914 	}
915 
916 	if (nm_bdg_create_kthreads(bps)) {
917 		nm_os_free(bps);
918 		return EFAULT;
919 	}
920 
921 	bps->configured = true;
922 	bna->na_polling_state = bps;
923 	bps->bna = bna;
924 
925 	/* disable interrupts if possible */
926 	nma_intr_enable(bna->hwna, 0);
927 	/* start kthread now */
928 	error = nm_bdg_polling_start_kthreads(bps);
929 	if (error) {
930 		nm_prerr("ERROR nm_bdg_polling_start_kthread()");
931 		nm_os_free(bps->kthreads);
932 		nm_os_free(bps);
933 		bna->na_polling_state = NULL;
934 		nma_intr_enable(bna->hwna, 1);
935 	}
936 	return error;
937 }
938 
939 static int
940 nm_bdg_ctl_polling_stop(struct netmap_adapter *na)
941 {
942 	struct netmap_bwrap_adapter *bna = (struct netmap_bwrap_adapter *)na;
943 	struct nm_bdg_polling_state *bps;
944 
945 	if (!bna->na_polling_state) {
946 		nm_prerr("ERROR adapter is not in polling mode");
947 		return EFAULT;
948 	}
949 	bps = bna->na_polling_state;
950 	nm_bdg_polling_stop_delete_kthreads(bna->na_polling_state);
951 	bps->configured = false;
952 	nm_os_free(bps);
953 	bna->na_polling_state = NULL;
954 	/* re-enable interrupts */
955 	nma_intr_enable(bna->hwna, 1);
956 	return 0;
957 }
958 
959 int
960 nm_bdg_polling(struct nmreq_header *hdr)
961 {
962 	struct nmreq_vale_polling *req =
963 		(struct nmreq_vale_polling *)(uintptr_t)hdr->nr_body;
964 	struct netmap_adapter *na = NULL;
965 	int error = 0;
966 
967 	NMG_LOCK();
968 	error = netmap_get_vale_na(hdr, &na, NULL, /*create=*/0);
969 	if (na && !error) {
970 		if (!nm_is_bwrap(na)) {
971 			error = EOPNOTSUPP;
972 		} else if (hdr->nr_reqtype == NETMAP_BDG_POLLING_ON) {
973 			error = nm_bdg_ctl_polling_start(req, na);
974 			if (!error)
975 				netmap_adapter_get(na);
976 		} else {
977 			error = nm_bdg_ctl_polling_stop(na);
978 			if (!error)
979 				netmap_adapter_put(na);
980 		}
981 		netmap_adapter_put(na);
982 	} else if (!na && !error) {
983 		/* Not VALE port. */
984 		error = EINVAL;
985 	}
986 	NMG_UNLOCK();
987 
988 	return error;
989 }
990 
991 /* Called by external kernel modules (e.g., Openvswitch).
992  * to set configure/lookup/dtor functions of a VALE instance.
993  * Register callbacks to the given bridge. 'name' may be just
994  * bridge's name (including ':' if it is not just NM_BDG_NAME).
995  *
996  * Called without NMG_LOCK.
997  */
998 
999 int
1000 netmap_bdg_regops(const char *name, struct netmap_bdg_ops *bdg_ops, void *private_data, void *auth_token)
1001 {
1002 	struct nm_bridge *b;
1003 	int error = 0;
1004 
1005 	NMG_LOCK();
1006 	b = nm_find_bridge(name, 0 /* don't create */, NULL);
1007 	if (!b) {
1008 		error = ENXIO;
1009 		goto unlock_regops;
1010 	}
1011 	if (!nm_bdg_valid_auth_token(b, auth_token)) {
1012 		error = EACCES;
1013 		goto unlock_regops;
1014 	}
1015 
1016 	BDG_WLOCK(b);
1017 	if (!bdg_ops) {
1018 		/* resetting the bridge */
1019 		bzero(b->ht, sizeof(struct nm_hash_ent) * NM_BDG_HASH);
1020 		b->bdg_ops = b->bdg_saved_ops;
1021 		b->private_data = b->ht;
1022 	} else {
1023 		/* modifying the bridge */
1024 		b->private_data = private_data;
1025 #define nm_bdg_override(m) if (bdg_ops->m) b->bdg_ops.m = bdg_ops->m
1026 		nm_bdg_override(lookup);
1027 		nm_bdg_override(config);
1028 		nm_bdg_override(dtor);
1029 		nm_bdg_override(vp_create);
1030 		nm_bdg_override(bwrap_attach);
1031 #undef nm_bdg_override
1032 
1033 	}
1034 	BDG_WUNLOCK(b);
1035 
1036 unlock_regops:
1037 	NMG_UNLOCK();
1038 	return error;
1039 }
1040 
1041 
1042 int
1043 netmap_bdg_config(struct nm_ifreq *nr)
1044 {
1045 	struct nm_bridge *b;
1046 	int error = EINVAL;
1047 
1048 	NMG_LOCK();
1049 	b = nm_find_bridge(nr->nifr_name, 0, NULL);
1050 	if (!b) {
1051 		NMG_UNLOCK();
1052 		return error;
1053 	}
1054 	NMG_UNLOCK();
1055 	/* Don't call config() with NMG_LOCK() held */
1056 	BDG_RLOCK(b);
1057 	if (b->bdg_ops.config != NULL)
1058 		error = b->bdg_ops.config(nr);
1059 	BDG_RUNLOCK(b);
1060 	return error;
1061 }
1062 
1063 
1064 /* nm_register callback for VALE ports */
1065 int
1066 netmap_vp_reg(struct netmap_adapter *na, int onoff)
1067 {
1068 	struct netmap_vp_adapter *vpna =
1069 		(struct netmap_vp_adapter*)na;
1070 
1071 	/* persistent ports may be put in netmap mode
1072 	 * before being attached to a bridge
1073 	 */
1074 	if (vpna->na_bdg)
1075 		BDG_WLOCK(vpna->na_bdg);
1076 	if (onoff) {
1077 		netmap_krings_mode_commit(na, onoff);
1078 		if (na->active_fds == 0)
1079 			na->na_flags |= NAF_NETMAP_ON;
1080 		 /* XXX on FreeBSD, persistent VALE ports should also
1081 		 * toggle IFCAP_NETMAP in na->ifp (2014-03-16)
1082 		 */
1083 	} else {
1084 		if (na->active_fds == 0)
1085 			na->na_flags &= ~NAF_NETMAP_ON;
1086 		netmap_krings_mode_commit(na, onoff);
1087 	}
1088 	if (vpna->na_bdg)
1089 		BDG_WUNLOCK(vpna->na_bdg);
1090 	return 0;
1091 }
1092 
1093 
1094 /* rxsync code used by VALE ports nm_rxsync callback and also
1095  * internally by the brwap
1096  */
1097 static int
1098 netmap_vp_rxsync_locked(struct netmap_kring *kring, int flags)
1099 {
1100 	struct netmap_adapter *na = kring->na;
1101 	struct netmap_ring *ring = kring->ring;
1102 	u_int nm_i, lim = kring->nkr_num_slots - 1;
1103 	u_int head = kring->rhead;
1104 	int n;
1105 
1106 	if (head > lim) {
1107 		nm_prerr("ouch dangerous reset!!!");
1108 		n = netmap_ring_reinit(kring);
1109 		goto done;
1110 	}
1111 
1112 	/* First part, import newly received packets. */
1113 	/* actually nothing to do here, they are already in the kring */
1114 
1115 	/* Second part, skip past packets that userspace has released. */
1116 	nm_i = kring->nr_hwcur;
1117 	if (nm_i != head) {
1118 		/* consistency check, but nothing really important here */
1119 		for (n = 0; likely(nm_i != head); n++) {
1120 			struct netmap_slot *slot = &ring->slot[nm_i];
1121 			void *addr = NMB(na, slot);
1122 
1123 			if (addr == NETMAP_BUF_BASE(kring->na)) { /* bad buf */
1124 				nm_prerr("bad buffer index %d, ignore ?",
1125 					slot->buf_idx);
1126 			}
1127 			slot->flags &= ~NS_BUF_CHANGED;
1128 			nm_i = nm_next(nm_i, lim);
1129 		}
1130 		kring->nr_hwcur = head;
1131 	}
1132 
1133 	n = 0;
1134 done:
1135 	return n;
1136 }
1137 
1138 /*
1139  * nm_rxsync callback for VALE ports
1140  * user process reading from a VALE switch.
1141  * Already protected against concurrent calls from userspace,
1142  * but we must acquire the queue's lock to protect against
1143  * writers on the same queue.
1144  */
1145 int
1146 netmap_vp_rxsync(struct netmap_kring *kring, int flags)
1147 {
1148 	int n;
1149 
1150 	mtx_lock(&kring->q_lock);
1151 	n = netmap_vp_rxsync_locked(kring, flags);
1152 	mtx_unlock(&kring->q_lock);
1153 	return n;
1154 }
1155 
1156 int
1157 netmap_bwrap_attach(const char *nr_name, struct netmap_adapter *hwna,
1158 		struct netmap_bdg_ops *ops)
1159 {
1160 	return ops->bwrap_attach(nr_name, hwna);
1161 }
1162 
1163 
1164 /* Bridge wrapper code (bwrap).
1165  * This is used to connect a non-VALE-port netmap_adapter (hwna) to a
1166  * VALE switch.
1167  * The main task is to swap the meaning of tx and rx rings to match the
1168  * expectations of the VALE switch code (see nm_bdg_flush).
1169  *
1170  * The bwrap works by interposing a netmap_bwrap_adapter between the
1171  * rest of the system and the hwna. The netmap_bwrap_adapter looks like
1172  * a netmap_vp_adapter to the rest the system, but, internally, it
1173  * translates all callbacks to what the hwna expects.
1174  *
1175  * Note that we have to intercept callbacks coming from two sides:
1176  *
1177  *  - callbacks coming from the netmap module are intercepted by
1178  *    passing around the netmap_bwrap_adapter instead of the hwna
1179  *
1180  *  - callbacks coming from outside of the netmap module only know
1181  *    about the hwna. This, however, only happens in interrupt
1182  *    handlers, where only the hwna->nm_notify callback is called.
1183  *    What the bwrap does is to overwrite the hwna->nm_notify callback
1184  *    with its own netmap_bwrap_intr_notify.
1185  *    XXX This assumes that the hwna->nm_notify callback was the
1186  *    standard netmap_notify(), as it is the case for nic adapters.
1187  *    Any additional action performed by hwna->nm_notify will not be
1188  *    performed by netmap_bwrap_intr_notify.
1189  *
1190  * Additionally, the bwrap can optionally attach the host rings pair
1191  * of the wrapped adapter to a different port of the switch.
1192  */
1193 
1194 
1195 static void
1196 netmap_bwrap_dtor(struct netmap_adapter *na)
1197 {
1198 	struct netmap_bwrap_adapter *bna = (struct netmap_bwrap_adapter*)na;
1199 	struct netmap_adapter *hwna = bna->hwna;
1200 	struct nm_bridge *b = bna->up.na_bdg,
1201 		*bh = bna->host.na_bdg;
1202 
1203 	if (bna->host.up.nm_mem)
1204 		netmap_mem_put(bna->host.up.nm_mem);
1205 
1206 	if (b) {
1207 		netmap_bdg_detach_common(b, bna->up.bdg_port,
1208 			    (bh ? bna->host.bdg_port : -1));
1209 	}
1210 
1211 	nm_prdis("na %p", na);
1212 	na->ifp = NULL;
1213 	bna->host.up.ifp = NULL;
1214 	hwna->na_vp = bna->saved_na_vp;
1215 	hwna->na_hostvp = NULL;
1216 	hwna->na_private = NULL;
1217 	hwna->na_flags &= ~NAF_BUSY;
1218 	netmap_adapter_put(hwna);
1219 
1220 }
1221 
1222 
1223 /*
1224  * Intr callback for NICs connected to a bridge.
1225  * Simply ignore tx interrupts (maybe we could try to recover space ?)
1226  * and pass received packets from nic to the bridge.
1227  *
1228  * XXX TODO check locking: this is called from the interrupt
1229  * handler so we should make sure that the interface is not
1230  * disconnected while passing down an interrupt.
1231  *
1232  * Note, no user process can access this NIC or the host stack.
1233  * The only part of the ring that is significant are the slots,
1234  * and head/cur/tail are set from the kring as needed
1235  * (part as a receive ring, part as a transmit ring).
1236  *
1237  * callback that overwrites the hwna notify callback.
1238  * Packets come from the outside or from the host stack and are put on an
1239  * hwna rx ring.
1240  * The bridge wrapper then sends the packets through the bridge.
1241  */
1242 int
1243 netmap_bwrap_intr_notify(struct netmap_kring *kring, int flags)
1244 {
1245 	struct netmap_adapter *na = kring->na;
1246 	struct netmap_bwrap_adapter *bna = na->na_private;
1247 	struct netmap_kring *bkring;
1248 	struct netmap_vp_adapter *vpna = &bna->up;
1249 	u_int ring_nr = kring->ring_id;
1250 	int ret = NM_IRQ_COMPLETED;
1251 	int error;
1252 
1253 	if (netmap_debug & NM_DEBUG_RXINTR)
1254 	    nm_prinf("%s %s 0x%x", na->name, kring->name, flags);
1255 
1256 	bkring = vpna->up.tx_rings[ring_nr];
1257 
1258 	/* make sure the ring is not disabled */
1259 	if (nm_kr_tryget(kring, 0 /* can't sleep */, NULL)) {
1260 		return EIO;
1261 	}
1262 
1263 	if (netmap_debug & NM_DEBUG_RXINTR)
1264 	    nm_prinf("%s head %d cur %d tail %d",  na->name,
1265 		kring->rhead, kring->rcur, kring->rtail);
1266 
1267 	/* simulate a user wakeup on the rx ring
1268 	 * fetch packets that have arrived.
1269 	 */
1270 	error = kring->nm_sync(kring, 0);
1271 	if (error)
1272 		goto put_out;
1273 	if (kring->nr_hwcur == kring->nr_hwtail) {
1274 		if (netmap_verbose)
1275 			nm_prlim(1, "interrupt with no packets on %s",
1276 				kring->name);
1277 		goto put_out;
1278 	}
1279 
1280 	/* new packets are kring->rcur to kring->nr_hwtail, and the bkring
1281 	 * had hwcur == bkring->rhead. So advance bkring->rhead to kring->nr_hwtail
1282 	 * to push all packets out.
1283 	 */
1284 	bkring->rhead = bkring->rcur = kring->nr_hwtail;
1285 
1286 	bkring->nm_sync(bkring, flags);
1287 
1288 	/* mark all buffers as released on this ring */
1289 	kring->rhead = kring->rcur = kring->rtail = kring->nr_hwtail;
1290 	/* another call to actually release the buffers */
1291 	error = kring->nm_sync(kring, 0);
1292 
1293 	/* The second rxsync may have further advanced hwtail. If this happens,
1294 	 *  return NM_IRQ_RESCHED, otherwise just return NM_IRQ_COMPLETED. */
1295 	if (kring->rcur != kring->nr_hwtail) {
1296 		ret = NM_IRQ_RESCHED;
1297 	}
1298 put_out:
1299 	nm_kr_put(kring);
1300 
1301 	return error ? error : ret;
1302 }
1303 
1304 
1305 /* nm_register callback for bwrap */
1306 int
1307 netmap_bwrap_reg(struct netmap_adapter *na, int onoff)
1308 {
1309 	struct netmap_bwrap_adapter *bna =
1310 		(struct netmap_bwrap_adapter *)na;
1311 	struct netmap_adapter *hwna = bna->hwna;
1312 	struct netmap_vp_adapter *hostna = &bna->host;
1313 	int error, i;
1314 	enum txrx t;
1315 
1316 	nm_prdis("%s %s", na->name, onoff ? "on" : "off");
1317 
1318 	if (onoff) {
1319 		/* netmap_do_regif has been called on the bwrap na.
1320 		 * We need to pass the information about the
1321 		 * memory allocator down to the hwna before
1322 		 * putting it in netmap mode
1323 		 */
1324 		hwna->na_lut = na->na_lut;
1325 
1326 		if (hostna->na_bdg) {
1327 			/* if the host rings have been attached to switch,
1328 			 * we need to copy the memory allocator information
1329 			 * in the hostna also
1330 			 */
1331 			hostna->up.na_lut = na->na_lut;
1332 		}
1333 
1334 	}
1335 
1336 	/* pass down the pending ring state information */
1337 	for_rx_tx(t) {
1338 		for (i = 0; i < netmap_all_rings(na, t); i++) {
1339 			NMR(hwna, nm_txrx_swap(t))[i]->nr_pending_mode =
1340 				NMR(na, t)[i]->nr_pending_mode;
1341 		}
1342 	}
1343 
1344 	/* forward the request to the hwna */
1345 	error = hwna->nm_register(hwna, onoff);
1346 	if (error)
1347 		return error;
1348 
1349 	/* copy up the current ring state information */
1350 	for_rx_tx(t) {
1351 		for (i = 0; i < netmap_all_rings(na, t); i++) {
1352 			struct netmap_kring *kring = NMR(hwna, nm_txrx_swap(t))[i];
1353 			NMR(na, t)[i]->nr_mode = kring->nr_mode;
1354 		}
1355 	}
1356 
1357 	/* impersonate a netmap_vp_adapter */
1358 	netmap_vp_reg(na, onoff);
1359 	if (hostna->na_bdg)
1360 		netmap_vp_reg(&hostna->up, onoff);
1361 
1362 	if (onoff) {
1363 		u_int i;
1364 		/* intercept the hwna nm_nofify callback on the hw rings */
1365 		for (i = 0; i < hwna->num_rx_rings; i++) {
1366 			hwna->rx_rings[i]->save_notify = hwna->rx_rings[i]->nm_notify;
1367 			hwna->rx_rings[i]->nm_notify = bna->nm_intr_notify;
1368 		}
1369 		i = hwna->num_rx_rings; /* for safety */
1370 		/* save the host ring notify unconditionally */
1371 		for (; i < netmap_real_rings(hwna, NR_RX); i++) {
1372 			hwna->rx_rings[i]->save_notify =
1373 				hwna->rx_rings[i]->nm_notify;
1374 			if (hostna->na_bdg) {
1375 				/* also intercept the host ring notify */
1376 				hwna->rx_rings[i]->nm_notify =
1377 					netmap_bwrap_intr_notify;
1378 				na->tx_rings[i]->nm_sync = na->nm_txsync;
1379 			}
1380 		}
1381 		if (na->active_fds == 0)
1382 			na->na_flags |= NAF_NETMAP_ON;
1383 	} else {
1384 		u_int i;
1385 
1386 		if (na->active_fds == 0)
1387 			na->na_flags &= ~NAF_NETMAP_ON;
1388 
1389 		/* reset all notify callbacks (including host ring) */
1390 		for (i = 0; i < netmap_all_rings(hwna, NR_RX); i++) {
1391 			hwna->rx_rings[i]->nm_notify =
1392 				hwna->rx_rings[i]->save_notify;
1393 			hwna->rx_rings[i]->save_notify = NULL;
1394 		}
1395 		hwna->na_lut.lut = NULL;
1396 		hwna->na_lut.plut = NULL;
1397 		hwna->na_lut.objtotal = 0;
1398 		hwna->na_lut.objsize = 0;
1399 
1400 		/* reset the number of host rings to default */
1401 		for_rx_tx(t) {
1402 			nma_set_host_nrings(hwna, t, 1);
1403 		}
1404 
1405 	}
1406 
1407 	return 0;
1408 }
1409 
1410 /* nm_config callback for bwrap */
1411 static int
1412 netmap_bwrap_config(struct netmap_adapter *na, struct nm_config_info *info)
1413 {
1414 	struct netmap_bwrap_adapter *bna =
1415 		(struct netmap_bwrap_adapter *)na;
1416 	struct netmap_adapter *hwna = bna->hwna;
1417 	int error;
1418 
1419 	/* cache the lut in the embedded host adapter */
1420 	error = netmap_mem_get_lut(hwna->nm_mem, &bna->host.up.na_lut);
1421 	if (error)
1422 		return error;
1423 
1424 	/* Forward the request to the hwna. It may happen that nobody
1425 	 * registered hwna yet, so netmap_mem_get_lut() may have not
1426 	 * been called yet. */
1427 	error = netmap_mem_get_lut(hwna->nm_mem, &hwna->na_lut);
1428 	if (error)
1429 		return error;
1430 	netmap_update_config(hwna);
1431 	/* swap the results and propagate */
1432 	info->num_tx_rings = hwna->num_rx_rings;
1433 	info->num_tx_descs = hwna->num_rx_desc;
1434 	info->num_rx_rings = hwna->num_tx_rings;
1435 	info->num_rx_descs = hwna->num_tx_desc;
1436 	info->rx_buf_maxsize = hwna->rx_buf_maxsize;
1437 
1438 	if (na->na_flags & NAF_HOST_RINGS) {
1439 		struct netmap_adapter *hostna = &bna->host.up;
1440 		enum txrx t;
1441 
1442 		/* limit the number of host rings to that of hw */
1443 		if (na->na_flags & NAF_HOST_ALL) {
1444 			hostna->num_tx_rings = nma_get_nrings(hwna, NR_RX);
1445 			hostna->num_rx_rings = nma_get_nrings(hwna, NR_TX);
1446 		} else {
1447 			nm_bound_var(&hostna->num_tx_rings, 1, 1,
1448 				nma_get_nrings(hwna, NR_TX), NULL);
1449 			nm_bound_var(&hostna->num_rx_rings, 1, 1,
1450 				nma_get_nrings(hwna, NR_RX), NULL);
1451 		}
1452 		for_rx_tx(t) {
1453 			enum txrx r = nm_txrx_swap(t);
1454 			u_int nr = nma_get_nrings(hostna, t);
1455 
1456 			nma_set_host_nrings(na, t, nr);
1457 			if (nma_get_host_nrings(hwna, t) < nr) {
1458 				nma_set_host_nrings(hwna, t, nr);
1459 			}
1460 			nma_set_ndesc(hostna, t, nma_get_ndesc(hwna, r));
1461 		}
1462 	}
1463 
1464 	return 0;
1465 }
1466 
1467 /* nm_bufcfg callback for bwrap */
1468 static int
1469 netmap_bwrap_bufcfg(struct netmap_kring *kring, uint64_t target)
1470 {
1471 	struct netmap_adapter *na = kring->na;
1472 	struct netmap_bwrap_adapter *bna =
1473 		(struct netmap_bwrap_adapter *)na;
1474 	struct netmap_adapter *hwna = bna->hwna;
1475 	struct netmap_kring *hwkring;
1476 	enum txrx r;
1477 	int error;
1478 
1479 	/* we need the hw kring that corresponds to the bwrap one:
1480 	 * remember that rx and tx are swapped
1481 	 */
1482 	r = nm_txrx_swap(kring->tx);
1483 	hwkring = NMR(hwna, r)[kring->ring_id];
1484 
1485 	/* copy down the offset information, forward the request
1486 	 * and copy up the results
1487 	 */
1488 	hwkring->offset_mask = kring->offset_mask;
1489 	hwkring->offset_max  = kring->offset_max;
1490 	hwkring->offset_gap  = kring->offset_gap;
1491 
1492 	error = hwkring->nm_bufcfg(hwkring, target);
1493 	if (error)
1494 		return error;
1495 
1496 	kring->hwbuf_len = hwkring->hwbuf_len;
1497 	kring->buf_align = hwkring->buf_align;
1498 
1499 	return 0;
1500 }
1501 
1502 /* nm_krings_create callback for bwrap */
1503 int
1504 netmap_bwrap_krings_create_common(struct netmap_adapter *na)
1505 {
1506 	struct netmap_bwrap_adapter *bna =
1507 		(struct netmap_bwrap_adapter *)na;
1508 	struct netmap_adapter *hwna = bna->hwna;
1509 	struct netmap_adapter *hostna = &bna->host.up;
1510 	int i, error = 0;
1511 	enum txrx t;
1512 
1513 	/* also create the hwna krings */
1514 	error = hwna->nm_krings_create(hwna);
1515 	if (error) {
1516 		return error;
1517 	}
1518 
1519 	/* increment the usage counter for all the hwna krings */
1520 	for_rx_tx(t) {
1521 		for (i = 0; i < netmap_all_rings(hwna, t); i++) {
1522 			NMR(hwna, t)[i]->users++;
1523 			/* this to prevent deletion of the rings through
1524 			 * our krings, instead of through the hwna ones */
1525 			NMR(na, t)[i]->nr_kflags |= NKR_NEEDRING;
1526 		}
1527 	}
1528 
1529 	/* now create the actual rings */
1530 	error = netmap_mem_rings_create(hwna);
1531 	if (error) {
1532 		goto err_dec_users;
1533 	}
1534 
1535 	/* cross-link the netmap rings
1536 	 * The original number of rings comes from hwna,
1537 	 * rx rings on one side equals tx rings on the other.
1538 	 */
1539 	for_rx_tx(t) {
1540 		enum txrx r = nm_txrx_swap(t); /* swap NR_TX <-> NR_RX */
1541 		for (i = 0; i < netmap_all_rings(hwna, r); i++) {
1542 			NMR(na, t)[i]->nkr_num_slots = NMR(hwna, r)[i]->nkr_num_slots;
1543 			NMR(na, t)[i]->ring = NMR(hwna, r)[i]->ring;
1544 		}
1545 	}
1546 
1547 	if (na->na_flags & NAF_HOST_RINGS) {
1548 		/* the hostna rings are the host rings of the bwrap.
1549 		 * The corresponding krings must point back to the
1550 		 * hostna
1551 		 */
1552 		hostna->tx_rings = &na->tx_rings[na->num_tx_rings];
1553 		hostna->rx_rings = &na->rx_rings[na->num_rx_rings];
1554 		for_rx_tx(t) {
1555 			for (i = 0; i < nma_get_nrings(hostna, t); i++) {
1556 				NMR(hostna, t)[i]->na = hostna;
1557 			}
1558 		}
1559 	}
1560 
1561 	return 0;
1562 
1563 err_dec_users:
1564 	for_rx_tx(t) {
1565 		for (i = 0; i < netmap_all_rings(hwna, t); i++) {
1566 			NMR(hwna, t)[i]->users--;
1567 			NMR(na, t)[i]->users--;
1568 		}
1569 	}
1570 	hwna->nm_krings_delete(hwna);
1571 	return error;
1572 }
1573 
1574 
1575 void
1576 netmap_bwrap_krings_delete_common(struct netmap_adapter *na)
1577 {
1578 	struct netmap_bwrap_adapter *bna =
1579 		(struct netmap_bwrap_adapter *)na;
1580 	struct netmap_adapter *hwna = bna->hwna;
1581 	enum txrx t;
1582 	int i;
1583 
1584 	nm_prdis("%s", na->name);
1585 
1586 	/* decrement the usage counter for all the hwna krings */
1587 	for_rx_tx(t) {
1588 		for (i = 0; i < netmap_all_rings(hwna, t); i++) {
1589 			NMR(hwna, t)[i]->users--;
1590 			NMR(na, t)[i]->users--;
1591 		}
1592 	}
1593 
1594 	/* delete any netmap rings that are no longer needed */
1595 	netmap_mem_rings_delete(hwna);
1596 	hwna->nm_krings_delete(hwna);
1597 }
1598 
1599 
1600 /* notify method for the bridge-->hwna direction */
1601 int
1602 netmap_bwrap_notify(struct netmap_kring *kring, int flags)
1603 {
1604 	struct netmap_adapter *na = kring->na;
1605 	struct netmap_bwrap_adapter *bna = na->na_private;
1606 	struct netmap_adapter *hwna = bna->hwna;
1607 	u_int ring_n = kring->ring_id;
1608 	u_int lim = kring->nkr_num_slots - 1;
1609 	struct netmap_kring *hw_kring;
1610 	int error;
1611 
1612 	nm_prdis("%s: na %s hwna %s",
1613 			(kring ? kring->name : "NULL!"),
1614 			(na ? na->name : "NULL!"),
1615 			(hwna ? hwna->name : "NULL!"));
1616 	hw_kring = hwna->tx_rings[ring_n];
1617 
1618 	if (nm_kr_tryget(hw_kring, 0, NULL)) {
1619 		return ENXIO;
1620 	}
1621 
1622 	/* first step: simulate a user wakeup on the rx ring */
1623 	netmap_vp_rxsync(kring, flags);
1624 	nm_prdis("%s[%d] PRE rx(c%3d t%3d l%3d) ring(h%3d c%3d t%3d) tx(c%3d ht%3d t%3d)",
1625 		na->name, ring_n,
1626 		kring->nr_hwcur, kring->nr_hwtail, kring->nkr_hwlease,
1627 		kring->rhead, kring->rcur, kring->rtail,
1628 		hw_kring->nr_hwcur, hw_kring->nr_hwtail, hw_kring->rtail);
1629 	/* second step: the new packets are sent on the tx ring
1630 	 * (which is actually the same ring)
1631 	 */
1632 	hw_kring->rhead = hw_kring->rcur = kring->nr_hwtail;
1633 	error = hw_kring->nm_sync(hw_kring, flags);
1634 	if (error)
1635 		goto put_out;
1636 
1637 	/* third step: now we are back the rx ring */
1638 	/* claim ownership on all hw owned bufs */
1639 	kring->rhead = kring->rcur = nm_next(hw_kring->nr_hwtail, lim); /* skip past reserved slot */
1640 
1641 	/* fourth step: the user goes to sleep again, causing another rxsync */
1642 	netmap_vp_rxsync(kring, flags);
1643 	nm_prdis("%s[%d] PST rx(c%3d t%3d l%3d) ring(h%3d c%3d t%3d) tx(c%3d ht%3d t%3d)",
1644 		na->name, ring_n,
1645 		kring->nr_hwcur, kring->nr_hwtail, kring->nkr_hwlease,
1646 		kring->rhead, kring->rcur, kring->rtail,
1647 		hw_kring->nr_hwcur, hw_kring->nr_hwtail, hw_kring->rtail);
1648 put_out:
1649 	nm_kr_put(hw_kring);
1650 
1651 	return error ? error : NM_IRQ_COMPLETED;
1652 }
1653 
1654 
1655 /* nm_bdg_ctl callback for the bwrap.
1656  * Called on bridge-attach and detach, as an effect of valectl -[ahd].
1657  * On attach, it needs to provide a fake netmap_priv_d structure and
1658  * perform a netmap_do_regif() on the bwrap. This will put both the
1659  * bwrap and the hwna in netmap mode, with the netmap rings shared
1660  * and cross linked. Moroever, it will start intercepting interrupts
1661  * directed to hwna.
1662  */
1663 static int
1664 netmap_bwrap_bdg_ctl(struct nmreq_header *hdr, struct netmap_adapter *na)
1665 {
1666 	struct netmap_priv_d *npriv;
1667 	struct netmap_bwrap_adapter *bna = (struct netmap_bwrap_adapter*)na;
1668 	int error = 0;
1669 
1670 	if (hdr->nr_reqtype == NETMAP_REQ_VALE_ATTACH) {
1671 		struct nmreq_vale_attach *req =
1672 			(struct nmreq_vale_attach *)(uintptr_t)hdr->nr_body;
1673 		if (req->reg.nr_ringid != 0 ||
1674 			(req->reg.nr_mode != NR_REG_ALL_NIC &&
1675 				req->reg.nr_mode != NR_REG_NIC_SW)) {
1676 			/* We only support attaching all the NIC rings
1677 			 * and/or the host stack. */
1678 			return EINVAL;
1679 		}
1680 		if (NETMAP_OWNED_BY_ANY(na)) {
1681 			return EBUSY;
1682 		}
1683 		if (bna->na_kpriv) {
1684 			/* nothing to do */
1685 			return 0;
1686 		}
1687 		npriv = netmap_priv_new();
1688 		if (npriv == NULL)
1689 			return ENOMEM;
1690 		npriv->np_ifp = na->ifp; /* let the priv destructor release the ref */
1691 		error = netmap_do_regif(npriv, na, hdr);
1692 		if (error) {
1693 			netmap_priv_delete(npriv);
1694 			netmap_mem_restore(bna->hwna);
1695 			return error;
1696 		}
1697 		bna->na_kpriv = npriv;
1698 		na->na_flags |= NAF_BUSY;
1699 	} else {
1700 		if (na->active_fds == 0) /* not registered */
1701 			return EINVAL;
1702 		netmap_priv_delete(bna->na_kpriv);
1703 		bna->na_kpriv = NULL;
1704 		na->na_flags &= ~NAF_BUSY;
1705 		netmap_mem_restore(bna->hwna);
1706 	}
1707 
1708 	return error;
1709 }
1710 
1711 /* attach a bridge wrapper to the 'real' device */
1712 int
1713 netmap_bwrap_attach_common(struct netmap_adapter *na,
1714 		struct netmap_adapter *hwna)
1715 {
1716 	struct netmap_bwrap_adapter *bna;
1717 	struct netmap_adapter *hostna = NULL;
1718 	int error = 0;
1719 	enum txrx t;
1720 
1721 	/* make sure the NIC is not already in use */
1722 	if (NETMAP_OWNED_BY_ANY(hwna)) {
1723 		nm_prerr("NIC %s busy, cannot attach to bridge", hwna->name);
1724 		return EBUSY;
1725 	}
1726 
1727 	bna = (struct netmap_bwrap_adapter *)na;
1728 	/* make bwrap ifp point to the real ifp */
1729 	na->ifp = hwna->ifp;
1730 	if_ref(na->ifp);
1731 	na->na_private = bna;
1732 	/* fill the ring data for the bwrap adapter with rx/tx meanings
1733 	 * swapped. The real cross-linking will be done during register,
1734 	 * when all the krings will have been created.
1735 	 */
1736 	for_rx_tx(t) {
1737 		enum txrx r = nm_txrx_swap(t); /* swap NR_TX <-> NR_RX */
1738 		nma_set_nrings(na, t, nma_get_nrings(hwna, r));
1739 		nma_set_ndesc(na, t, nma_get_ndesc(hwna, r));
1740 	}
1741 	na->nm_dtor = netmap_bwrap_dtor;
1742 	na->nm_config = netmap_bwrap_config;
1743 	na->nm_bufcfg = netmap_bwrap_bufcfg;
1744 	na->nm_bdg_ctl = netmap_bwrap_bdg_ctl;
1745 	na->pdev = hwna->pdev;
1746 	na->nm_mem = netmap_mem_get(hwna->nm_mem);
1747 	na->virt_hdr_len = hwna->virt_hdr_len;
1748 	na->rx_buf_maxsize = hwna->rx_buf_maxsize;
1749 
1750 	bna->hwna = hwna;
1751 	netmap_adapter_get(hwna);
1752 	hwna->na_private = bna; /* weak reference */
1753 	bna->saved_na_vp = hwna->na_vp;
1754 	hwna->na_vp = &bna->up;
1755 	bna->up.up.na_vp = &(bna->up);
1756 
1757 	if (hwna->na_flags & NAF_HOST_RINGS) {
1758 		if (hwna->na_flags & NAF_SW_ONLY)
1759 			na->na_flags |= NAF_SW_ONLY;
1760 		na->na_flags |= NAF_HOST_RINGS;
1761 		hostna = &bna->host.up;
1762 
1763 		snprintf(hostna->name, sizeof(hostna->name), "%s^", na->name);
1764 		hostna->ifp = hwna->ifp;
1765 		// hostna->nm_txsync = netmap_bwrap_host_txsync;
1766 		// hostna->nm_rxsync = netmap_bwrap_host_rxsync;
1767 		hostna->nm_mem = netmap_mem_get(na->nm_mem);
1768 		hostna->na_private = bna;
1769 		hostna->na_vp = &bna->up;
1770 		na->na_hostvp = hwna->na_hostvp =
1771 			hostna->na_hostvp = &bna->host;
1772 		hostna->na_flags = NAF_BUSY; /* prevent NIOCREGIF */
1773 		hostna->rx_buf_maxsize = hwna->rx_buf_maxsize;
1774 		/* bwrap_config() will determine the number of host rings */
1775 	}
1776 	if (hwna->na_flags & NAF_MOREFRAG)
1777 		na->na_flags |= NAF_MOREFRAG;
1778 
1779 	nm_prdis("%s<->%s txr %d txd %d rxr %d rxd %d",
1780 		na->name, if_name(ifp),
1781 		na->num_tx_rings, na->num_tx_desc,
1782 		na->num_rx_rings, na->num_rx_desc);
1783 
1784 	error = netmap_attach_common(na);
1785 	if (error) {
1786 		goto err_put;
1787 	}
1788 	hwna->na_flags |= NAF_BUSY;
1789 	return 0;
1790 
1791 err_put:
1792 	hwna->na_vp = hwna->na_hostvp = NULL;
1793 	netmap_adapter_put(hwna);
1794 	return error;
1795 
1796 }
1797 
1798 struct nm_bridge *
1799 netmap_init_bridges2(u_int n)
1800 {
1801 	int i;
1802 	struct nm_bridge *b;
1803 
1804 	b = nm_os_malloc(sizeof(struct nm_bridge) * n);
1805 	if (b == NULL)
1806 		return NULL;
1807 	for (i = 0; i < n; i++)
1808 		BDG_RWINIT(&b[i]);
1809 	return b;
1810 }
1811 
1812 void
1813 netmap_uninit_bridges2(struct nm_bridge *b, u_int n)
1814 {
1815 	int i;
1816 
1817 	if (b == NULL)
1818 		return;
1819 
1820 	for (i = 0; i < n; i++)
1821 		BDG_RWDESTROY(&b[i]);
1822 	nm_os_free(b);
1823 }
1824 
1825 int
1826 netmap_init_bridges(void)
1827 {
1828 #ifdef CONFIG_NET_NS
1829 	return netmap_bns_register();
1830 #else
1831 	nm_bridges = netmap_init_bridges2(vale_max_bridges);
1832 	if (nm_bridges == NULL)
1833 		return ENOMEM;
1834 	return 0;
1835 #endif
1836 }
1837 
1838 void
1839 netmap_uninit_bridges(void)
1840 {
1841 #ifdef CONFIG_NET_NS
1842 	netmap_bns_unregister();
1843 #else
1844 	netmap_uninit_bridges2(nm_bridges, vale_max_bridges);
1845 #endif
1846 }
1847