Пример #1
0
/*
 * 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;
        }
}
Пример #2
0
/*
 * 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);
}