int vnet_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { struct vnet_softc *sc = ifp->if_softc; struct ifaddr *ifa = (struct ifaddr *)data; struct ifreq *ifr = (struct ifreq *)data; int s, error = 0; s = splnet(); switch (cmd) { case SIOCSIFADDR: ifp->if_flags |= IFF_UP; if (ifa->ifa_addr->sa_family == AF_INET) arp_ifinit(&sc->sc_ac, ifa); /* FALLTHROUGH */ case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { if ((ifp->if_flags & IFF_RUNNING) == 0) vnet_init(ifp); } else { if (ifp->if_flags & IFF_RUNNING) vnet_stop(ifp); } break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd); break; case SIOCADDMULTI: case SIOCDELMULTI: /* * XXX Removing all multicast addresses and adding * most of them back, is somewhat retarded. */ vnet_setmulti(sc, 0); error = ether_ioctl(ifp, &sc->sc_ac, cmd, data); vnet_setmulti(sc, 1); if (error == ENETRESET) error = 0; break; default: error = ether_ioctl(ifp, &sc->sc_ac, cmd, data); } splx(s); return (error); }
static int pdp_deactivate(struct pdp_arg *pdp_arg, int force) { struct pdp_info *dev = NULL; down(&pdp_lock); pdp_arg->id = pdp_arg->id + g_adjust; DPRINTK(2, "ID is adjusted, new ID: %d\n", pdp_arg->id); dev = pdp_get_dev(pdp_arg->id); if (dev == NULL) { pr_err("[MULTIPDP] not found id: %u\n", pdp_arg->id); up(&pdp_lock); return -EINVAL; } if (!force && dev->flags & DEV_FLAG_STICKY) { pr_err("[MULTIPDP] sticky id: %u\n", pdp_arg->id); up(&pdp_lock); return -EACCES; } pdp_remove_dev(pdp_arg->id); up(&pdp_lock); if (dev->type == DEV_TYPE_NET) { #ifdef NO_TTY_MUTEX_VNET vnet_stop(dev->vn_dev.net); down(&pdp_txlock); pdp_net_activation_count--; #endif vnet_del_dev(dev->vn_dev.net); #ifdef NO_TTY_MUTEX_VNET up(&pdp_txlock); #endif } else if (dev->type == DEV_TYPE_SERIAL) { vs_del_dev(dev); } vfree(dev); return 0; }
static int pdp_deactivate(pdp_arg_t *pdp_arg, int force) { struct pdp_info *dev = NULL; DPRINTK(1, "id: %d\n", pdp_arg->id); down(&pdp_lock); if (pdp_arg->id == 1) { DPRINTK(1, "Channel ID is 1, we will remove the network device (pdp) of channel ID: %d.\n", pdp_arg->id + g_adjust); } else { DPRINTK(1, "Channel ID: %d\n", pdp_arg->id); } pdp_arg->id = pdp_arg->id + g_adjust; //pdp_arg->id += PDP_ID_ADJUST; DPRINTK(1, "ID is adjusted, new ID: %d\n", pdp_arg->id); dev = pdp_get_dev(pdp_arg->id); if (dev == NULL) { DPRINTK(1, "not found id: %u\n", pdp_arg->id); up(&pdp_lock); return -EINVAL; } if (!force && dev->flags & DEV_FLAG_STICKY) { DPRINTK(1, "sticky id: %u\n", pdp_arg->id); up(&pdp_lock); return -EACCES; } pdp_remove_dev(pdp_arg->id); up(&pdp_lock); if (dev->type == DEV_TYPE_NET) { #ifdef NO_TTY_MUTEX_VNET //printk("<--- VNET Mutex lock : Before .. !!\n"); vnet_stop(dev->vn_dev.net); down(&pdp_txlock); pdp_net_activation_count--; //printk("<--- VNET Mutex lock : After .. !!\n"); #endif DPRINTK(1, "%s(id: %u) network device removed\n", dev->vn_dev.net->name, dev->id); vnet_del_dev(dev->vn_dev.net); #ifdef NO_TTY_MUTEX_VNET //printk("<--- VNET Mutex Unlock : Before .. !!\n"); up(&pdp_txlock); //printk("<--- VNET Mutex Unlock : After .. !!\n"); #endif } else if (dev->type == DEV_TYPE_SERIAL) { struct tty_driver * tty_driver = get_tty_driver_by_id(dev); DPRINTK(1, "%s(id: %u) serial device removed\n", tty_driver->name, dev->id); vs_del_dev(dev); } vfree(dev); return 0; }