Date: Tue, 07 Nov 2000 09:27:54 -0800 From: Maksim Yevmenkin <myevmenk@digisle.net> To: Harti Brandt <brandt@fokus.gmd.de> Cc: current@freebsd.org, hackers@freebsd.org Subject: [PATCH] Please review and commit (Re: if_tap and devfs) Message-ID: <3A083B9A.4C1DDD82@digisle.com> References: <Pine.BSF.4.21.0011071347290.303-100000@beagle.fokus.gmd.de>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------367164509B202DD0CF71424B Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hello Harti, > > > is there somebody working to make if_tap devfs-ready? Or I'm doing > > > something wrong? > > > > [SNIP] > > it seems to me that it did not get commited. i will look into it again > > today and re-send patch to the list. > > Great! It works. (Minus a spelling error: the parameter in > tapclone() should spell 'namelen'). Would nice if it get's committed. ooops :) sorry about that. unfortunately, i can not commit it. we have to ask one of the commiters. To ALL: anyone wants to review and commit the attached patch? thanks, emax --------------367164509B202DD0CF71424B Content-Type: text/plain; charset=us-ascii; name="if_tap.c.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="if_tap.c.diff" *** 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, namelen, 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 */ /* --------------367164509B202DD0CF71424B-- 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?3A083B9A.4C1DDD82>