Ejemplo n.º 1
0
int
main (int argc, char *argv[]) {
    char *ifname, *hwaddr = NULL, *ipaddr;
    sigset_t sigset;
    int signo;
    struct netdev *dev;
    struct netif_ip iface = {};

    switch (argc) {
    case 4:
        hwaddr = argv[2];
        /* fall through */
    case 3:
        ipaddr = argv[argc-1];
        ifname = argv[1];
        break;
    default:
        fprintf(stderr, "usage: %s interface [mac_address] ip_address\n", argv[0]);
        return -1;
    }
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGINT);
    sigprocmask(SIG_BLOCK, &sigset, NULL);
    setup();
    dev = netdev_alloc(NETDEV_TYPE_ETHERNET);
    if (!dev) {
        return -1;
    }
    strncpy(dev->name, ifname, sizeof(dev->name) -1);
    if (hwaddr) {
        ethernet_addr_pton(hwaddr, (ethernet_addr_t *)dev->addr);
    }
    if (dev->ops->open(dev, RAWDEV_TYPE_AUTO) == -1) {
        return -1;
    }
    iface.netif.family = NETIF_FAMILY_IPV4;
    ip_addr_pton(ipaddr, &iface.unicast);
    netdev_add_netif(dev, (struct netif *)&iface);
    dev->ops->run(dev);
    while (1) {
        sigwait(&sigset, &signo);
        if (signo == SIGINT) {
            break;
        }
    }
    dev->ops->close(dev);
    return 0;
}
Ejemplo n.º 2
0
static int tun_init(void) {
	int err;
	struct net_device *tdev;
	char tun_name[16];
	int i;

	for (i = 0; i < TUN_N; i++) {
		struct tun *tun;

		snprintf(tun_name, sizeof(tun_name), "tun%d", i);

		tdev = netdev_alloc(tun_name, &tun_setup, sizeof(struct tun));
		if (tdev == NULL) {
			err = -ENOMEM;
			goto err_deinit;
		}

		err = inetdev_register_dev(tdev);
		if (err != 0) {
			goto err_netdev_free;
		}

		err = char_dev_register(tun_name, &tun_dev_file_ops);
		if (err != 0) {
			goto err_inetdev_deregister;
		}

		tun = netdev_priv(tdev, struct tun);
		mutex_init(&tun->mtx_use);

		tun_g_array[i] = tdev;
	}

	return 0;

err_inetdev_deregister:
	/* inetdev_deregister */
err_netdev_free:
	netdev_free(tdev);
err_deinit:
	tun_deinit();
	return err;

}
Ejemplo n.º 3
0
int
main (int argc, char *argv[]) {
    sigset_t sigset;
    int signo;
    struct netdev *dev;

    if (argc != 2) {
        fprintf(stderr, "usage: %s interface\n", argv[0]);
        return -1;
    }
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGINT);
    sigprocmask(SIG_BLOCK, &sigset, NULL);
    if (setup() == -1) {
        return -1;
    }
    dev = netdev_alloc(NETDEV_TYPE_ETHERNET);
    if (!dev) {
        return -1;
    }
    strncpy(dev->name, argv[1], sizeof(dev->name) -1);
    if (dev->ops->open(dev, RAWDEV_TYPE_AUTO) == -1) {
        return -1;
    }
    dev->ops->run(dev);
    while (1) {
        sigwait(&sigset, &signo);
        if (signo == SIGINT) {
            break;
        }
    }
    if (dev->ops->close) {
        dev->ops->close(dev);
    }
    return 0;
}
Ejemplo n.º 4
0
int kni_dev_init(struct rte_mempool *mbuf_pool)
{
	struct conf_sect *s = conf_get_sect("interface");
	struct conf_opt *opt;
	struct rte_kni_conf conf;
	struct rte_kni_ops ops;
	struct rte_kni *kni;
	struct net_device *dev;
	struct knidev *knidev;
	pthread_t tid;
	struct ifconfig_arg arg;
	int i = 0, x = rte_eth_dev_count();

	for (opt = s->opt; opt; opt = opt->next) {
		const char *busid = conf_get_subopt(opt, "busid");
		if (!strcmp(busid, "kni"))
			kni_cnt++;
	}

	if (!kni_cnt)
		return 0;

	rte_kni_init(kni_cnt);

	dev_list = rte_malloc(NULL, kni_cnt * sizeof(void *), 0);

	memset(&conf, 0, sizeof(conf));
	memset(&ops, 0, sizeof(ops));

	ops.change_mtu = kni_change_mtu;
	ops.config_network_if = kni_config_network_if;

	for (opt = s->opt; opt; opt = opt->next) {
		const char *busid = conf_get_subopt(opt, "busid");
		if (strcmp(busid, "kni"))
			continue;

		strcpy(conf.name, opt->name);
		conf.group_id = i;
		conf.mbuf_size = ETHER_MAX_LEN + 8;

		ops.port_id = i;

		kni = rte_kni_alloc(mbuf_pool, &conf, &ops);

		if (!kni) {
			fprintf(stderr, "failed to create %s\n", opt->name);
			return -1;
		}

		dev = netdev_alloc(opt->name, sizeof(*knidev), NULL);
		dev->xmit = knidev_xmit;
		knidev = netdev_priv(dev);
		knidev->port = i;
		knidev->xport = i + x;
		knidev->dev = dev;
		knidev->kni = kni;

		dev_list[i] = knidev;

		arg.dev = knidev;
		arg.opt = opt;
		arg.err = -1;

		pthread_create(&tid, NULL, kni_ifconfig, &arg);

		while (arg.err == -1)
			rte_kni_handle_request(kni);

		pthread_join(tid, NULL);

		if (arg.err != 0)
			return -1;
	}

	return 0;
}
Ejemplo n.º 5
0
Archivo: veth.c Proyecto: 0xcc/tapip
void veth_init(void)
{
	veth = netdev_alloc("veth", &veth_ops);
}