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
*** 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 */
  
  
  /*

Reply via email to