/* * add a netmap port. We add them in pairs, so forwarding occurs * between two of them. */ void netmap_add_port(const char *dev) { static struct sess *s1 = NULL; // XXX stateful; bad! struct my_netmap_port *port; int l; struct sess *s2; D("opening netmap device %s", dev); l = strlen(dev) + 1; if (l >= IFNAMSIZ) { D("name %s too long, max %d", dev, IFNAMSIZ - 1); sleep(2); return; } port = calloc(1, sizeof(*port)); port->d = nm_open(dev, NULL, 0, NULL); if (port->d == NULL) { D("error opening %s", dev); kern_free(port); // XXX compat return; } strncpy(port->ifp.if_xname, dev, IFNAMSIZ-1); port->allocator_id = port->d->req.nr_arg2; D("--- mem_id %d", port->allocator_id); s2 = new_session(port->d->fd, netmap_read, port, WANT_READ); port->sess = s2; D("create sess %p my_netmap_port %p", s2, port); if (s1 == NULL) { /* first of a pair */ s1 = s2; } else { /* second of a pair, cross link */ struct my_netmap_port *peer = s1->arg; port->peer = peer; peer->peer = port; port->can_swap_bufs = peer->can_swap_bufs = (port->allocator_id == peer->allocator_id); D("%p %s %d <-> %p %s %d %s", port, port->d->req.nr_name, port->allocator_id, peer, peer->d->req.nr_name, peer->allocator_id, port->can_swap_bufs ? "SWAP" : "COPY"); s1 = NULL; } }
/* * Destroy a DMA mapping from crosstalk space to system address space. * There is no actual mapping hardware to destroy, but we at least mark * the dmamap INVALID and free the space that it took. */ void hub_dmamap_free(hub_dmamap_t hub_dmamap) { hub_dmamap->hdma_flags &= ~HUB_DMAMAP_IS_VALID; kern_free(hub_dmamap); }