Date: Mon, 06 Nov 2000 10:36:32 -0800 From: Maksim Yevmenkin <myevmenk@digisle.net> To: Harti Brandt <brandt@fokus.gmd.de> Cc: current@FreeBSD.ORG, hackers@FreeBSD.ORG Subject: [PATCH] Re: if_tap and devfs Message-ID: <3A06FA30.CF5F720F@digisle.com> References: <Pine.BSF.4.21.0011061725230.326-100000@beagle.fokus.gmd.de>
next in thread | previous in thread | raw e-mail | index | archive | help
Hello, > I recently moved to using devfs and now if_tap seems unusable. Although > the module is loaded, it doesn't show up in /dev or as an interface. > >From a quick comparison with if_tun it seems that this is 'expected' > behaviour although I'm not a specialist with devfs. Is this so? If yes, > is there somebody working to make if_tap devfs-ready? Or I'm doing > something wrong? please try the following patch. it is not tested, sorry i dont have FreeBSD box available right now :( please let me know the results. thanks, emax ---- *** if_tap.c.orig Mon Nov 6 09:24:08 2000 --- if_tap.c Mon Nov 6 10:26:35 2000 *************** *** 79,84 **** --- 79,85 ---- static int tapmodevent __P((module_t, int, void *)); /* device */ + static void tapclone __P((void *, char *, int, dev_t *)); static void tapcreate __P((dev_t)); /* network interface */ *************** *** 131,157 **** int type; void *data; { ! static int attached = 0; ! struct ifnet *ifp = NULL; ! int unit, s; switch (type) { case MOD_LOAD: if (attached) return (EEXIST); cdevsw_add(&tap_cdevsw); attached = 1; break; ! case MOD_UNLOAD: if (taprefcnt > 0) return (EBUSY); cdevsw_remove(&tap_cdevsw); unit = 0; while (unit <= taplastunit) { s = splimp(); TAILQ_FOREACH(ifp, &ifnet, if_link) if ((strcmp(ifp->if_name, TAP) == 0) || --- 132,164 ---- int type; void *data; { ! static int attached = 0; ! static eventhandler_tag eh_tag = NULL; switch (type) { case MOD_LOAD: if (attached) return (EEXIST); + eh_tag = EVENTHANDLER_REGISTER(dev_clone, tapclone, 0, 1000); cdevsw_add(&tap_cdevsw); attached = 1; break; ! case MOD_UNLOAD: { ! int unit; ! if (taprefcnt > 0) return (EBUSY); + EVENTHANDLER_DEREGISTER(dev_clone, eh_tag); cdevsw_remove(&tap_cdevsw); unit = 0; while (unit <= taplastunit) { + int s; + struct ifnet *ifp = NULL; + s = splimp(); TAILQ_FOREACH(ifp, &ifnet, if_link) if ((strcmp(ifp->if_name, TAP) == 0) || *************** *** 179,185 **** } attached = 0; ! break; default: return (EOPNOTSUPP); --- 186,192 ---- } attached = 0; ! } break; default: return (EOPNOTSUPP); *************** *** 187,192 **** --- 194,234 ---- return (0); } /* tapmodevent */ + + + /* + * DEVFS handler + * + * We need to support two kind of devices - tap and vmnet + */ + static void + tapclone(arg, name, namlen, dev) + void *arg; + char *name; + int namelen; + dev_t *dev; + { + int unit, minor; + char *device_name = NULL; + + if (*dev != NODEV) + return; + + device_name = TAP; + if (dev_stdclone(name, NULL, device_name, &unit) != 1) { + device_name = VMNET; + + if (dev_stdclone(name, NULL, device_name, &unit) != 1) + return; + + minor = (unit | VMNET_DEV_MASK); + } + else + minor = unit; + + *dev = make_dev(&tap_cdevsw, minor, UID_ROOT, GID_WHEEL, 0600, "%s%d", + device_name, unit); + } /* tapclone */ /* To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3A06FA30.CF5F720F>