Пример #1
0
static bool init(void)
{
	int error;

	error = pool4db_init(&pool);
	if (error) {
		log_err("Errcode on pool4 init: %d", error);
		return false;
	}

	ns = get_net_ns_by_pid(task_pid_nr(current));
	if (IS_ERR(ns)) {
		log_err("Could not retrieve the current namespace.");
		pool4db_put(pool);
		return PTR_ERR(ns);
	}

	return true;
}
static long modem_net_flowcontrol_device_ioctl(
			struct file *filp, unsigned int cmd, unsigned long arg)
{
	struct net *this_net;
	struct net_device *ndev;
	char dev_name[NET_FLOWCONTROL_DEV_NAME_LEN];
	u8 chan;

	if (copy_from_user(&chan, (void __user *)arg, sizeof(char)))
		return -EFAULT;

	if (chan > 15)
		return -ENODEV;

	snprintf(dev_name, NET_FLOWCONTROL_DEV_NAME_LEN, "rmnet%d", (int)chan);
	this_net = get_net_ns_by_pid(current->pid);
	ndev = __dev_get_by_name(this_net, dev_name);
	if (ndev == NULL) {
		pr_err("MIF: %s: device = %s not exist\n", __func__,
					dev_name);
		return -ENODEV;
	}

	switch (cmd) {
	case IOCTL_MODEM_NET_SUSPEND:
		netif_stop_queue(ndev);
		pr_info("MIF: NET SUSPEND(%s)\n", dev_name);
		break;
	case IOCTL_MODEM_NET_RESUME:
		netif_wake_queue(ndev);
		pr_info("MIF: NET RESUME(%s)\n", dev_name);
		break;
	default:
		return -EINVAL;
	}
	return 0;
}
Пример #3
0
int sn_register_netdev(void *bar, struct sn_device *dev)
{
	struct sn_conf_space *conf = bar;

	int ret;

	struct net *net = NULL;		/* network namespace */

	rtnl_lock();

	if (conf->netns_fd >= 0) {
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0))
		log_err("'netns' option requires Linux kernel 4.0 or higher\n");
		ret = -EINVAL;
		goto fail_free;
#else
		net = get_net_ns_by_fd(conf->netns_fd);
		if (IS_ERR(net)) {
			log_err("invalid or not a net namespace fd %d\n",
					conf->netns_fd);

			ret = PTR_ERR(net);
			goto fail_free;
		}
#endif
	} else if (conf->container_pid) {
		net = get_net_ns_by_pid(conf->container_pid);
		if (IS_ERR(net)) {
			log_err("cannot find namespace of pid %d\n",
					conf->container_pid);

			ret = PTR_ERR(net);
			goto fail_free;
		}
	}

	if (!IS_ERR_OR_NULL(net)) {
		dev_net_set(dev->netdev, net);
		put_net(net);
	}

	ret = register_netdevice(dev->netdev);
	if (ret) {
		log_err("%s: register_netdev() failed (ret = %d)\n",
				dev->netdev->name, ret);
		goto fail_free;
	}

	/* interface "UP" by default */
	dev_open(dev->netdev);

	strcpy(conf->ifname, dev->netdev->name);

	log_info("%s: registered - %pM txq %d rxq %d\n",
			dev->netdev->name,
			dev->netdev->dev_addr,
			dev->netdev->real_num_tx_queues,
			dev->netdev->real_num_rx_queues);

	rtnl_unlock();

	return ret;

fail_free:
	rtnl_unlock();
	free_netdev(dev->netdev);

	return ret;
}
Пример #4
0
int sn_register_netdev(void *bar, struct sn_device *dev)
{
	struct sn_conf_space *conf = bar;

	int ret;

	rtnl_lock();
	
	ret = register_netdevice(dev->netdev);
	if (ret) {
		log_err("%s: register_netdev() failed (ret = %d)\n", 
				dev->netdev->name, ret);
		goto fail_free;
	}

	if (conf->container_pid) {
		struct net *net = NULL;		/* network namespace */

		net = get_net_ns_by_pid(conf->container_pid);
		if (IS_ERR(net)) {
			log_err("%s: cannot find namespace of pid %d\n",
					dev->netdev->name, 
					conf->container_pid);

			ret = PTR_ERR(net);
			goto fail_unregister;
		}

		ret = dev_change_net_namespace(dev->netdev, net, NULL);
		put_net(net);
		if (ret) {
			log_err("%s: fail to change namespace\n",
					dev->netdev->name);
			goto fail_unregister;
		}
	}

	/* interface "UP" by default */
	dev_open(dev->netdev);

	strcpy(conf->ifname, dev->netdev->name);

	log_info("%s: registered - %pM txq %d rxq %d\n",
			dev->netdev->name, 
			dev->netdev->dev_addr, 
			dev->netdev->real_num_tx_queues, 
			dev->netdev->real_num_rx_queues);

	rtnl_unlock();

	return ret;

fail_unregister:
	unregister_netdevice(dev->netdev);

fail_free:
	rtnl_unlock();
	free_netdev(dev->netdev);

	return ret;
}