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; }
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; }
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; }