Skip site navigation (1)Skip section navigation (2)
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>