[BACK]Return to if_tap.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / net

Annotation of src/sys/net/if_tap.c, Revision 1.21.4.2

1.21.4.2! yamt        1: /*     $NetBSD: if_tap.c,v 1.21.4.1 2006/10/22 06:07:25 yamt Exp $     */
1.1       cube        2:
                      3: /*
                      4:  *  Copyright (c) 2003, 2004 The NetBSD Foundation.
                      5:  *  All rights reserved.
                      6:  *
                      7:  *  This code is derived from software contributed to the NetBSD Foundation
                      8:  *   by Quentin Garnier.
1.6       perry       9:  *
1.1       cube       10:  *  Redistribution and use in source and binary forms, with or without
                     11:  *  modification, are permitted provided that the following conditions
                     12:  *  are met:
                     13:  *  1. Redistributions of source code must retain the above copyright
                     14:  *     notice, this list of conditions and the following disclaimer.
                     15:  *  2. Redistributions in binary form must reproduce the above copyright
                     16:  *     notice, this list of conditions and the following disclaimer in the
                     17:  *     documentation and/or other materials provided with the distribution.
                     18:  *  3. All advertising materials mentioning features or use of this software
                     19:  *     must display the following acknowledgement:
                     20:  *         This product includes software developed by the NetBSD
                     21:  *         Foundation, Inc. and its contributors.
                     22:  *  4. Neither the name of The NetBSD Foundation nor the names of its
                     23:  *     contributors may be used to endorse or promote products derived
                     24:  *     from this software without specific prior written permission.
1.6       perry      25:  *
1.1       cube       26:  *  THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     27:  *  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     28:  *  TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     29:  *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     30:  *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     31:  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     32:  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     33:  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     34:  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     35:  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     36:  *  POSSIBILITY OF SUCH DAMAGE.
                     37:  */
                     38:
                     39: /*
                     40:  * tap(4) is a virtual Ethernet interface.  It appears as a real Ethernet
                     41:  * device to the system, but can also be accessed by userland through a
                     42:  * character device interface, which allows reading and injecting frames.
                     43:  */
                     44:
                     45: #include <sys/cdefs.h>
1.21.4.2! yamt       46: __KERNEL_RCSID(0, "$NetBSD: if_tap.c,v 1.21.4.1 2006/10/22 06:07:25 yamt Exp $");
1.1       cube       47:
1.2       cube       48: #if defined(_KERNEL_OPT)
1.1       cube       49: #include "bpfilter.h"
1.2       cube       50: #endif
1.1       cube       51:
                     52: #include <sys/param.h>
                     53: #include <sys/systm.h>
                     54: #include <sys/kernel.h>
                     55: #include <sys/malloc.h>
                     56: #include <sys/conf.h>
                     57: #include <sys/device.h>
                     58: #include <sys/file.h>
                     59: #include <sys/filedesc.h>
                     60: #include <sys/ksyms.h>
                     61: #include <sys/poll.h>
                     62: #include <sys/select.h>
                     63: #include <sys/sockio.h>
                     64: #include <sys/sysctl.h>
1.17      elad       65: #include <sys/kauth.h>
1.1       cube       66:
                     67: #include <net/if.h>
                     68: #include <net/if_dl.h>
                     69: #include <net/if_ether.h>
                     70: #include <net/if_media.h>
                     71: #include <net/if_tap.h>
                     72: #if NBPFILTER > 0
                     73: #include <net/bpf.h>
                     74: #endif
                     75:
                     76: /*
                     77:  * sysctl node management
                     78:  *
                     79:  * It's not really possible to use a SYSCTL_SETUP block with
                     80:  * current LKM implementation, so it is easier to just define
                     81:  * our own function.
                     82:  *
                     83:  * The handler function is a "helper" in Andrew Brown's sysctl
                     84:  * framework terminology.  It is used as a gateway for sysctl
                     85:  * requests over the nodes.
                     86:  *
                     87:  * tap_log allows the module to log creations of nodes and
                     88:  * destroy them all at once using sysctl_teardown.
                     89:  */
                     90: static int tap_node;
                     91: static int     tap_sysctl_handler(SYSCTLFN_PROTO);
1.2       cube       92: SYSCTL_SETUP_PROTO(sysctl_tap_setup);
1.1       cube       93:
                     94: /*
                     95:  * Since we're an Ethernet device, we need the 3 following
                     96:  * components: a leading struct device, a struct ethercom,
                     97:  * and also a struct ifmedia since we don't attach a PHY to
                     98:  * ourselves. We could emulate one, but there's no real
                     99:  * point.
                    100:  */
                    101:
                    102: struct tap_softc {
                    103:        struct device   sc_dev;
                    104:        struct ifmedia  sc_im;
                    105:        struct ethercom sc_ec;
                    106:        int             sc_flags;
                    107: #define        TAP_INUSE       0x00000001      /* tap device can only be opened once */
                    108: #define TAP_ASYNCIO    0x00000002      /* user is using async I/O (SIGIO) on the device */
                    109: #define TAP_NBIO       0x00000004      /* user wants calls to avoid blocking */
                    110: #define TAP_GOING      0x00000008      /* interface is being destroyed */
                    111:        struct selinfo  sc_rsel;
                    112:        pid_t           sc_pgid; /* For async. IO */
                    113:        struct lock     sc_rdlock;
                    114:        struct simplelock       sc_kqlock;
                    115: };
                    116:
                    117: /* autoconf(9) glue */
                    118:
                    119: void   tapattach(int);
                    120:
                    121: static int     tap_match(struct device *, struct cfdata *, void *);
                    122: static void    tap_attach(struct device *, struct device *, void *);
                    123: static int     tap_detach(struct device*, int);
                    124:
                    125: CFATTACH_DECL(tap, sizeof(struct tap_softc),
                    126:     tap_match, tap_attach, tap_detach, NULL);
                    127: extern struct cfdriver tap_cd;
                    128:
                    129: /* Real device access routines */
                    130: static int     tap_dev_close(struct tap_softc *);
                    131: static int     tap_dev_read(int, struct uio *, int);
                    132: static int     tap_dev_write(int, struct uio *, int);
1.11      christos  133: static int     tap_dev_ioctl(int, u_long, caddr_t, struct lwp *);
                    134: static int     tap_dev_poll(int, int, struct lwp *);
1.1       cube      135: static int     tap_dev_kqfilter(int, struct knote *);
                    136:
                    137: /* Fileops access routines */
1.11      christos  138: static int     tap_fops_close(struct file *, struct lwp *);
1.1       cube      139: static int     tap_fops_read(struct file *, off_t *, struct uio *,
1.17      elad      140:     kauth_cred_t, int);
1.1       cube      141: static int     tap_fops_write(struct file *, off_t *, struct uio *,
1.17      elad      142:     kauth_cred_t, int);
1.1       cube      143: static int     tap_fops_ioctl(struct file *, u_long, void *,
1.11      christos  144:     struct lwp *);
                    145: static int     tap_fops_poll(struct file *, int, struct lwp *);
1.1       cube      146: static int     tap_fops_kqfilter(struct file *, struct knote *);
                    147:
                    148: static const struct fileops tap_fileops = {
                    149:        tap_fops_read,
                    150:        tap_fops_write,
                    151:        tap_fops_ioctl,
                    152:        fnullop_fcntl,
                    153:        tap_fops_poll,
                    154:        fbadop_stat,
                    155:        tap_fops_close,
                    156:        tap_fops_kqfilter,
                    157: };
                    158:
                    159: /* Helper for cloning open() */
1.11      christos  160: static int     tap_dev_cloner(struct lwp *);
1.1       cube      161:
                    162: /* Character device routines */
1.11      christos  163: static int     tap_cdev_open(dev_t, int, int, struct lwp *);
                    164: static int     tap_cdev_close(dev_t, int, int, struct lwp *);
1.1       cube      165: static int     tap_cdev_read(dev_t, struct uio *, int);
                    166: static int     tap_cdev_write(dev_t, struct uio *, int);
1.11      christos  167: static int     tap_cdev_ioctl(dev_t, u_long, caddr_t, int, struct lwp *);
                    168: static int     tap_cdev_poll(dev_t, int, struct lwp *);
1.1       cube      169: static int     tap_cdev_kqfilter(dev_t, struct knote *);
                    170:
                    171: const struct cdevsw tap_cdevsw = {
                    172:        tap_cdev_open, tap_cdev_close,
                    173:        tap_cdev_read, tap_cdev_write,
                    174:        tap_cdev_ioctl, nostop, notty,
                    175:        tap_cdev_poll, nommap,
                    176:        tap_cdev_kqfilter,
1.20      christos  177:        D_OTHER,
1.1       cube      178: };
                    179:
                    180: #define TAP_CLONER     0xfffff         /* Maximal minor value */
                    181:
                    182: /* kqueue-related routines */
                    183: static void    tap_kqdetach(struct knote *);
                    184: static int     tap_kqread(struct knote *, long);
                    185:
                    186: /*
                    187:  * Those are needed by the if_media interface.
                    188:  */
                    189:
                    190: static int     tap_mediachange(struct ifnet *);
                    191: static void    tap_mediastatus(struct ifnet *, struct ifmediareq *);
                    192:
                    193: /*
                    194:  * Those are needed by the ifnet interface, and would typically be
                    195:  * there for any network interface driver.
                    196:  * Some other routines are optional: watchdog and drain.
                    197:  */
                    198:
                    199: static void    tap_start(struct ifnet *);
                    200: static void    tap_stop(struct ifnet *, int);
                    201: static int     tap_init(struct ifnet *);
                    202: static int     tap_ioctl(struct ifnet *, u_long, caddr_t);
                    203:
                    204: /* This is an internal function to keep tap_ioctl readable */
                    205: static int     tap_lifaddr(struct ifnet *, u_long, struct ifaliasreq *);
                    206:
                    207: /*
                    208:  * tap is a clonable interface, although it is highly unrealistic for
                    209:  * an Ethernet device.
                    210:  *
                    211:  * Here are the bits needed for a clonable interface.
                    212:  */
                    213: static int     tap_clone_create(struct if_clone *, int);
                    214: static int     tap_clone_destroy(struct ifnet *);
                    215:
                    216: struct if_clone tap_cloners = IF_CLONE_INITIALIZER("tap",
                    217:                                        tap_clone_create,
                    218:                                        tap_clone_destroy);
                    219:
                    220: /* Helper functionis shared by the two cloning code paths */
                    221: static struct tap_softc *      tap_clone_creator(int);
1.12      cube      222: int    tap_clone_destroyer(struct device *);
1.1       cube      223:
                    224: void
1.21.4.2! yamt      225: tapattach(int n)
1.1       cube      226: {
                    227:        int error;
                    228:
                    229:        error = config_cfattach_attach(tap_cd.cd_name, &tap_ca);
                    230:        if (error) {
                    231:                aprint_error("%s: unable to register cfattach\n",
                    232:                    tap_cd.cd_name);
                    233:                (void)config_cfdriver_detach(&tap_cd);
                    234:                return;
                    235:        }
                    236:
                    237:        if_clone_attach(&tap_cloners);
                    238: }
                    239:
                    240: /* Pretty much useless for a pseudo-device */
                    241: static int
1.21.4.2! yamt      242: tap_match(struct device *self, struct cfdata *cfdata,
        !           243:     void *arg)
1.1       cube      244: {
                    245:        return (1);
                    246: }
                    247:
                    248: void
1.21.4.2! yamt      249: tap_attach(struct device *parent, struct device *self,
        !           250:     void *aux)
1.1       cube      251: {
                    252:        struct tap_softc *sc = (struct tap_softc *)self;
                    253:        struct ifnet *ifp;
1.18      kardel    254:        const struct sysctlnode *node;
1.1       cube      255:        u_int8_t enaddr[ETHER_ADDR_LEN] =
1.7       cube      256:            { 0xf2, 0x0b, 0xa4, 0xff, 0xff, 0xff };
1.14      christos  257:        char enaddrstr[3 * ETHER_ADDR_LEN];
1.18      kardel    258:        struct timeval tv;
1.1       cube      259:        uint32_t ui;
                    260:        int error;
                    261:
                    262:        aprint_normal("%s: faking Ethernet device\n",
                    263:            self->dv_xname);
                    264:
                    265:        /*
                    266:         * In order to obtain unique initial Ethernet address on a host,
1.18      kardel    267:         * do some randomisation using the current uptime.  It's not meant
                    268:         * for anything but avoiding hard-coding an address.
1.1       cube      269:         */
1.18      kardel    270:        getmicrouptime(&tv);
                    271:        ui = (tv.tv_sec ^ tv.tv_usec) & 0xffffff;
1.1       cube      272:        memcpy(enaddr+3, (u_int8_t *)&ui, 3);
                    273:
                    274:        aprint_normal("%s: Ethernet address %s\n", sc->sc_dev.dv_xname,
1.14      christos  275:            ether_snprintf(enaddrstr, sizeof(enaddrstr), enaddr));
1.1       cube      276:
                    277:        /*
                    278:         * Why 1000baseT? Why not? You can add more.
                    279:         *
                    280:         * Note that there are 3 steps: init, one or several additions to
                    281:         * list of supported media, and in the end, the selection of one
                    282:         * of them.
                    283:         */
                    284:        ifmedia_init(&sc->sc_im, 0, tap_mediachange, tap_mediastatus);
                    285:        ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_1000_T, 0, NULL);
                    286:        ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_1000_T|IFM_FDX, 0, NULL);
                    287:        ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_100_TX, 0, NULL);
                    288:        ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_100_TX|IFM_FDX, 0, NULL);
                    289:        ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_10_T, 0, NULL);
                    290:        ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_10_T|IFM_FDX, 0, NULL);
                    291:        ifmedia_add(&sc->sc_im, IFM_ETHER|IFM_AUTO, 0, NULL);
                    292:        ifmedia_set(&sc->sc_im, IFM_ETHER|IFM_AUTO);
                    293:
                    294:        /*
                    295:         * One should note that an interface must do multicast in order
                    296:         * to support IPv6.
                    297:         */
                    298:        ifp = &sc->sc_ec.ec_if;
                    299:        strcpy(ifp->if_xname, sc->sc_dev.dv_xname);
                    300:        ifp->if_softc   = sc;
                    301:        ifp->if_flags   = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
                    302:        ifp->if_ioctl   = tap_ioctl;
                    303:        ifp->if_start   = tap_start;
                    304:        ifp->if_stop    = tap_stop;
                    305:        ifp->if_init    = tap_init;
                    306:        IFQ_SET_READY(&ifp->if_snd);
                    307:
                    308:        sc->sc_ec.ec_capabilities = ETHERCAP_VLAN_MTU | ETHERCAP_JUMBO_MTU;
                    309:
                    310:        /* Those steps are mandatory for an Ethernet driver, the fisrt call
                    311:         * being common to all network interface drivers. */
                    312:        if_attach(ifp);
                    313:        ether_ifattach(ifp, enaddr);
                    314:
                    315:        sc->sc_flags = 0;
                    316:
                    317:        /*
                    318:         * Add a sysctl node for that interface.
                    319:         *
                    320:         * The pointer transmitted is not a string, but instead a pointer to
                    321:         * the softc structure, which we can use to build the string value on
                    322:         * the fly in the helper function of the node.  See the comments for
                    323:         * tap_sysctl_handler for details.
1.21      cube      324:         *
                    325:         * Usually sysctl_createv is called with CTL_CREATE as the before-last
                    326:         * component.  However, we can allocate a number ourselves, as we are
                    327:         * the only consumer of the net.link.<iface> node.  In this case, the
                    328:         * unit number is conveniently used to number the node.  CTL_CREATE
                    329:         * would just work, too.
1.1       cube      330:         */
                    331:        if ((error = sysctl_createv(NULL, 0, NULL,
                    332:            &node, CTLFLAG_READWRITE,
                    333:            CTLTYPE_STRING, sc->sc_dev.dv_xname, NULL,
                    334:            tap_sysctl_handler, 0, sc, 18,
1.15      thorpej   335:            CTL_NET, AF_LINK, tap_node, device_unit(&sc->sc_dev),
                    336:            CTL_EOL)) != 0)
1.1       cube      337:                aprint_error("%s: sysctl_createv returned %d, ignoring\n",
                    338:                    sc->sc_dev.dv_xname, error);
                    339:
                    340:        /*
                    341:         * Initialize the two locks for the device.
                    342:         *
                    343:         * We need a lock here because even though the tap device can be
                    344:         * opened only once, the file descriptor might be passed to another
                    345:         * process, say a fork(2)ed child.
                    346:         *
                    347:         * The Giant saves us from most of the hassle, but since the read
                    348:         * operation can sleep, we don't want two processes to wake up at
                    349:         * the same moment and both try and dequeue a single packet.
                    350:         *
                    351:         * The queue for event listeners (used by kqueue(9), see below) has
                    352:         * to be protected, too, but we don't need the same level of
                    353:         * complexity for that lock, so a simple spinning lock is fine.
                    354:         */
                    355:        lockinit(&sc->sc_rdlock, PSOCK|PCATCH, "tapl", 0, LK_SLEEPFAIL);
                    356:        simple_lock_init(&sc->sc_kqlock);
                    357: }
                    358:
                    359: /*
                    360:  * When detaching, we do the inverse of what is done in the attach
                    361:  * routine, in reversed order.
                    362:  */
                    363: static int
1.21.4.2! yamt      364: tap_detach(struct device* self, int flags)
1.1       cube      365: {
                    366:        struct tap_softc *sc = (struct tap_softc *)self;
                    367:        struct ifnet *ifp = &sc->sc_ec.ec_if;
                    368:        int error, s;
                    369:
                    370:        /*
                    371:         * Some processes might be sleeping on "tap", so we have to make
                    372:         * them release their hold on the device.
                    373:         *
                    374:         * The LK_DRAIN operation will wait for every locked process to
                    375:         * release their hold.
                    376:         */
                    377:        sc->sc_flags |= TAP_GOING;
                    378:        s = splnet();
                    379:        tap_stop(ifp, 1);
                    380:        if_down(ifp);
                    381:        splx(s);
                    382:        lockmgr(&sc->sc_rdlock, LK_DRAIN, NULL);
                    383:
                    384:        /*
                    385:         * Destroying a single leaf is a very straightforward operation using
                    386:         * sysctl_destroyv.  One should be sure to always end the path with
                    387:         * CTL_EOL.
                    388:         */
1.3       cube      389:        if ((error = sysctl_destroyv(NULL, CTL_NET, AF_LINK, tap_node,
1.15      thorpej   390:            device_unit(&sc->sc_dev), CTL_EOL)) != 0)
1.1       cube      391:                aprint_error("%s: sysctl_destroyv returned %d, ignoring\n",
                    392:                    sc->sc_dev.dv_xname, error);
                    393:        ether_ifdetach(ifp);
                    394:        if_detach(ifp);
                    395:        ifmedia_delete_instance(&sc->sc_im, IFM_INST_ANY);
                    396:
                    397:        return (0);
                    398: }
                    399:
                    400: /*
                    401:  * This function is called by the ifmedia layer to notify the driver
                    402:  * that the user requested a media change.  A real driver would
                    403:  * reconfigure the hardware.
                    404:  */
                    405: static int
1.21.4.2! yamt      406: tap_mediachange(struct ifnet *ifp)
1.1       cube      407: {
                    408:        return (0);
                    409: }
                    410:
                    411: /*
                    412:  * Here the user asks for the currently used media.
                    413:  */
                    414: static void
                    415: tap_mediastatus(struct ifnet *ifp, struct ifmediareq *imr)
                    416: {
                    417:        struct tap_softc *sc = (struct tap_softc *)ifp->if_softc;
                    418:        imr->ifm_active = sc->sc_im.ifm_cur->ifm_media;
                    419: }
                    420:
                    421: /*
                    422:  * This is the function where we SEND packets.
                    423:  *
                    424:  * There is no 'receive' equivalent.  A typical driver will get
                    425:  * interrupts from the hardware, and from there will inject new packets
                    426:  * into the network stack.
                    427:  *
                    428:  * Once handled, a packet must be freed.  A real driver might not be able
                    429:  * to fit all the pending packets into the hardware, and is allowed to
                    430:  * return before having sent all the packets.  It should then use the
                    431:  * if_flags flag IFF_OACTIVE to notify the upper layer.
                    432:  *
                    433:  * There are also other flags one should check, such as IFF_PAUSE.
                    434:  *
                    435:  * It is our duty to make packets available to BPF listeners.
                    436:  *
                    437:  * You should be aware that this function is called by the Ethernet layer
                    438:  * at splnet().
                    439:  *
                    440:  * When the device is opened, we have to pass the packet(s) to the
                    441:  * userland.  For that we stay in OACTIVE mode while the userland gets
                    442:  * the packets, and we send a signal to the processes waiting to read.
                    443:  *
                    444:  * wakeup(sc) is the counterpart to the tsleep call in
                    445:  * tap_dev_read, while selnotify() is used for kevent(2) and
                    446:  * poll(2) (which includes select(2)) listeners.
                    447:  */
                    448: static void
                    449: tap_start(struct ifnet *ifp)
                    450: {
                    451:        struct tap_softc *sc = (struct tap_softc *)ifp->if_softc;
                    452:        struct mbuf *m0;
                    453:
                    454:        if ((sc->sc_flags & TAP_INUSE) == 0) {
                    455:                /* Simply drop packets */
                    456:                for(;;) {
                    457:                        IFQ_DEQUEUE(&ifp->if_snd, m0);
                    458:                        if (m0 == NULL)
                    459:                                return;
                    460:
                    461:                        ifp->if_opackets++;
                    462: #if NBPFILTER > 0
                    463:                        if (ifp->if_bpf)
                    464:                                bpf_mtap(ifp->if_bpf, m0);
                    465: #endif
                    466:
                    467:                        m_freem(m0);
                    468:                }
                    469:        } else if (!IFQ_IS_EMPTY(&ifp->if_snd)) {
                    470:                ifp->if_flags |= IFF_OACTIVE;
                    471:                wakeup(sc);
                    472:                selnotify(&sc->sc_rsel, 1);
                    473:                if (sc->sc_flags & TAP_ASYNCIO)
                    474:                        fownsignal(sc->sc_pgid, SIGIO, POLL_IN,
                    475:                            POLLIN|POLLRDNORM, NULL);
                    476:        }
                    477: }
                    478:
                    479: /*
                    480:  * A typical driver will only contain the following handlers for
                    481:  * ioctl calls, except SIOCSIFPHYADDR.
                    482:  * The latter is a hack I used to set the Ethernet address of the
                    483:  * faked device.
                    484:  *
                    485:  * Note that both ifmedia_ioctl() and ether_ioctl() have to be
                    486:  * called under splnet().
                    487:  */
                    488: static int
                    489: tap_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
                    490: {
                    491:        struct tap_softc *sc = (struct tap_softc *)ifp->if_softc;
                    492:        struct ifreq *ifr = (struct ifreq *)data;
                    493:        int s, error;
                    494:
                    495:        s = splnet();
                    496:
                    497:        switch (cmd) {
                    498:        case SIOCSIFMEDIA:
                    499:        case SIOCGIFMEDIA:
                    500:                error = ifmedia_ioctl(ifp, ifr, &sc->sc_im, cmd);
                    501:                break;
                    502:        case SIOCSIFPHYADDR:
                    503:                error = tap_lifaddr(ifp, cmd, (struct ifaliasreq *)data);
                    504:                break;
                    505:        default:
                    506:                error = ether_ioctl(ifp, cmd, data);
                    507:                if (error == ENETRESET)
                    508:                        error = 0;
                    509:                break;
                    510:        }
                    511:
                    512:        splx(s);
                    513:
                    514:        return (error);
                    515: }
                    516:
                    517: /*
                    518:  * Helper function to set Ethernet address.  This shouldn't be done there,
                    519:  * and should actually be available to all Ethernet drivers, real or not.
                    520:  */
                    521: static int
1.21.4.2! yamt      522: tap_lifaddr(struct ifnet *ifp, u_long cmd, struct ifaliasreq *ifra)
1.1       cube      523: {
                    524:        struct sockaddr *sa = (struct sockaddr *)&ifra->ifra_addr;
                    525:
                    526:        if (sa->sa_family != AF_LINK)
                    527:                return (EINVAL);
                    528:
                    529:        memcpy(LLADDR(ifp->if_sadl), sa->sa_data, ETHER_ADDR_LEN);
                    530:
                    531:        return (0);
                    532: }
                    533:
                    534: /*
                    535:  * _init() would typically be called when an interface goes up,
                    536:  * meaning it should configure itself into the state in which it
                    537:  * can send packets.
                    538:  */
                    539: static int
                    540: tap_init(struct ifnet *ifp)
                    541: {
                    542:        ifp->if_flags |= IFF_RUNNING;
                    543:
                    544:        tap_start(ifp);
                    545:
                    546:        return (0);
                    547: }
                    548:
                    549: /*
                    550:  * _stop() is called when an interface goes down.  It is our
                    551:  * responsability to validate that state by clearing the
                    552:  * IFF_RUNNING flag.
                    553:  *
                    554:  * We have to wake up all the sleeping processes to have the pending
                    555:  * read requests cancelled.
                    556:  */
                    557: static void
1.21.4.2! yamt      558: tap_stop(struct ifnet *ifp, int disable)
1.1       cube      559: {
                    560:        struct tap_softc *sc = (struct tap_softc *)ifp->if_softc;
                    561:
                    562:        ifp->if_flags &= ~IFF_RUNNING;
                    563:        wakeup(sc);
                    564:        selnotify(&sc->sc_rsel, 1);
                    565:        if (sc->sc_flags & TAP_ASYNCIO)
                    566:                fownsignal(sc->sc_pgid, SIGIO, POLL_HUP, 0, NULL);
                    567: }
                    568:
                    569: /*
                    570:  * The 'create' command of ifconfig can be used to create
                    571:  * any numbered instance of a given device.  Thus we have to
                    572:  * make sure we have enough room in cd_devs to create the
                    573:  * user-specified instance.  config_attach_pseudo will do this
                    574:  * for us.
                    575:  */
                    576: static int
1.21.4.2! yamt      577: tap_clone_create(struct if_clone *ifc, int unit)
1.1       cube      578: {
                    579:        if (tap_clone_creator(unit) == NULL) {
                    580:                aprint_error("%s%d: unable to attach an instance\n",
                    581:                     tap_cd.cd_name, unit);
                    582:                return (ENXIO);
                    583:        }
                    584:
                    585:        return (0);
                    586: }
                    587:
                    588: /*
                    589:  * tap(4) can be cloned by two ways:
                    590:  *   using 'ifconfig tap0 create', which will use the network
                    591:  *     interface cloning API, and call tap_clone_create above.
                    592:  *   opening the cloning device node, whose minor number is TAP_CLONER.
                    593:  *     See below for an explanation on how this part work.
                    594:  *
                    595:  * config_attach_pseudo can be called with unit = DVUNIT_ANY to have
                    596:  * autoconf(9) choose a unit number for us.  This is what happens when
                    597:  * the cloner is openend, while the ifcloner interface creates a device
                    598:  * with a specific unit number.
                    599:  */
                    600: static struct tap_softc *
                    601: tap_clone_creator(int unit)
                    602: {
                    603:        struct cfdata *cf;
                    604:
                    605:        cf = malloc(sizeof(*cf), M_DEVBUF, M_WAITOK);
                    606:        cf->cf_name = tap_cd.cd_name;
                    607:        cf->cf_atname = tap_ca.ca_name;
                    608:        cf->cf_unit = unit;
                    609:        cf->cf_fstate = FSTATE_STAR;
                    610:
                    611:        return (struct tap_softc *)config_attach_pseudo(cf);
                    612: }
                    613:
                    614: /*
                    615:  * The clean design of if_clone and autoconf(9) makes that part
                    616:  * really straightforward.  The second argument of config_detach
                    617:  * means neither QUIET nor FORCED.
                    618:  */
                    619: static int
                    620: tap_clone_destroy(struct ifnet *ifp)
                    621: {
                    622:        return tap_clone_destroyer((struct device *)ifp->if_softc);
                    623: }
                    624:
1.12      cube      625: int
1.1       cube      626: tap_clone_destroyer(struct device *dev)
                    627: {
1.16      thorpej   628:        struct cfdata *cf = device_cfdata(dev);
1.1       cube      629:        int error;
                    630:
                    631:        if ((error = config_detach(dev, 0)) != 0)
                    632:                aprint_error("%s: unable to detach instance\n",
                    633:                    dev->dv_xname);
                    634:        free(cf, M_DEVBUF);
                    635:
                    636:        return (error);
                    637: }
                    638:
                    639: /*
                    640:  * tap(4) is a bit of an hybrid device.  It can be used in two different
                    641:  * ways:
                    642:  *  1. ifconfig tapN create, then use /dev/tapN to read/write off it.
                    643:  *  2. open /dev/tap, get a new interface created and read/write off it.
                    644:  *     That interface is destroyed when the process that had it created exits.
                    645:  *
                    646:  * The first way is managed by the cdevsw structure, and you access interfaces
                    647:  * through a (major, minor) mapping:  tap4 is obtained by the minor number
                    648:  * 4.  The entry points for the cdevsw interface are prefixed by tap_cdev_.
                    649:  *
                    650:  * The second way is the so-called "cloning" device.  It's a special minor
                    651:  * number (chosen as the maximal number, to allow as much tap devices as
                    652:  * possible).  The user first opens the cloner (e.g., /dev/tap), and that
                    653:  * call ends in tap_cdev_open.  The actual place where it is handled is
                    654:  * tap_dev_cloner.
                    655:  *
                    656:  * An tap device cannot be opened more than once at a time, so the cdevsw
                    657:  * part of open() does nothing but noting that the interface is being used and
                    658:  * hence ready to actually handle packets.
                    659:  */
                    660:
                    661: static int
1.21.4.2! yamt      662: tap_cdev_open(dev_t dev, int flags, int fmt, struct lwp *l)
1.1       cube      663: {
                    664:        struct tap_softc *sc;
                    665:
                    666:        if (minor(dev) == TAP_CLONER)
1.11      christos  667:                return tap_dev_cloner(l);
1.1       cube      668:
                    669:        sc = (struct tap_softc *)device_lookup(&tap_cd, minor(dev));
                    670:        if (sc == NULL)
                    671:                return (ENXIO);
                    672:
                    673:        /* The device can only be opened once */
                    674:        if (sc->sc_flags & TAP_INUSE)
                    675:                return (EBUSY);
                    676:        sc->sc_flags |= TAP_INUSE;
                    677:        return (0);
                    678: }
                    679:
                    680: /*
                    681:  * There are several kinds of cloning devices, and the most simple is the one
                    682:  * tap(4) uses.  What it does is change the file descriptor with a new one,
                    683:  * with its own fileops structure (which maps to the various read, write,
                    684:  * ioctl functions).  It starts allocating a new file descriptor with falloc,
                    685:  * then actually creates the new tap devices.
                    686:  *
                    687:  * Once those two steps are successful, we can re-wire the existing file
                    688:  * descriptor to its new self.  This is done with fdclone():  it fills the fp
                    689:  * structure as needed (notably f_data gets filled with the fifth parameter
                    690:  * passed, the unit of the tap device which will allows us identifying the
                    691:  * device later), and returns EMOVEFD.
                    692:  *
                    693:  * That magic value is interpreted by sys_open() which then replaces the
                    694:  * current file descriptor by the new one (through a magic member of struct
1.13      pooka     695:  * lwp, l_dupfd).
1.1       cube      696:  *
                    697:  * The tap device is flagged as being busy since it otherwise could be
                    698:  * externally accessed through the corresponding device node with the cdevsw
                    699:  * interface.
                    700:  */
                    701:
                    702: static int
1.11      christos  703: tap_dev_cloner(struct lwp *l)
1.1       cube      704: {
                    705:        struct tap_softc *sc;
                    706:        struct file *fp;
                    707:        int error, fd;
                    708:
1.19      ad        709:        if ((error = falloc(l, &fp, &fd)) != 0)
1.1       cube      710:                return (error);
                    711:
                    712:        if ((sc = tap_clone_creator(DVUNIT_ANY)) == NULL) {
1.11      christos  713:                FILE_UNUSE(fp, l);
1.1       cube      714:                ffree(fp);
                    715:                return (ENXIO);
                    716:        }
                    717:
                    718:        sc->sc_flags |= TAP_INUSE;
                    719:
1.11      christos  720:        return fdclone(l, fp, fd, FREAD|FWRITE, &tap_fileops,
1.15      thorpej   721:            (void *)(intptr_t)device_unit(&sc->sc_dev));
1.1       cube      722: }
                    723:
                    724: /*
                    725:  * While all other operations (read, write, ioctl, poll and kqfilter) are
                    726:  * really the same whether we are in cdevsw or fileops mode, the close()
                    727:  * function is slightly different in the two cases.
                    728:  *
                    729:  * As for the other, the core of it is shared in tap_dev_close.  What
                    730:  * it does is sufficient for the cdevsw interface, but the cloning interface
                    731:  * needs another thing:  the interface is destroyed when the processes that
                    732:  * created it closes it.
                    733:  */
                    734: static int
1.21.4.2! yamt      735: tap_cdev_close(dev_t dev, int flags, int fmt,
        !           736:     struct lwp *l)
1.1       cube      737: {
                    738:        struct tap_softc *sc =
                    739:            (struct tap_softc *)device_lookup(&tap_cd, minor(dev));
                    740:
                    741:        if (sc == NULL)
                    742:                return (ENXIO);
                    743:
                    744:        return tap_dev_close(sc);
                    745: }
                    746:
                    747: /*
                    748:  * It might happen that the administrator used ifconfig to externally destroy
                    749:  * the interface.  In that case, tap_fops_close will be called while
                    750:  * tap_detach is already happening.  If we called it again from here, we
                    751:  * would dead lock.  TAP_GOING ensures that this situation doesn't happen.
                    752:  */
                    753: static int
1.21.4.2! yamt      754: tap_fops_close(struct file *fp, struct lwp *l)
1.1       cube      755: {
                    756:        int unit = (intptr_t)fp->f_data;
                    757:        struct tap_softc *sc;
                    758:        int error;
                    759:
                    760:        sc = (struct tap_softc *)device_lookup(&tap_cd, unit);
                    761:        if (sc == NULL)
                    762:                return (ENXIO);
                    763:
                    764:        /* tap_dev_close currently always succeeds, but it might not
                    765:         * always be the case. */
                    766:        if ((error = tap_dev_close(sc)) != 0)
                    767:                return (error);
                    768:
                    769:        /* Destroy the device now that it is no longer useful,
                    770:         * unless it's already being destroyed. */
                    771:        if ((sc->sc_flags & TAP_GOING) != 0)
                    772:                return (0);
                    773:
                    774:        return tap_clone_destroyer((struct device *)sc);
                    775: }
                    776:
                    777: static int
                    778: tap_dev_close(struct tap_softc *sc)
                    779: {
                    780:        struct ifnet *ifp;
                    781:        int s;
                    782:
                    783:        s = splnet();
                    784:        /* Let tap_start handle packets again */
                    785:        ifp = &sc->sc_ec.ec_if;
                    786:        ifp->if_flags &= ~IFF_OACTIVE;
                    787:
                    788:        /* Purge output queue */
                    789:        if (!(IFQ_IS_EMPTY(&ifp->if_snd))) {
                    790:                struct mbuf *m;
                    791:
                    792:                for (;;) {
                    793:                        IFQ_DEQUEUE(&ifp->if_snd, m);
                    794:                        if (m == NULL)
                    795:                                break;
                    796:
                    797:                        ifp->if_opackets++;
                    798: #if NBPFILTER > 0
                    799:                        if (ifp->if_bpf)
                    800:                                bpf_mtap(ifp->if_bpf, m);
                    801: #endif
                    802:                }
                    803:        }
                    804:        splx(s);
                    805:
                    806:        sc->sc_flags &= ~(TAP_INUSE | TAP_ASYNCIO);
                    807:
                    808:        return (0);
                    809: }
                    810:
                    811: static int
                    812: tap_cdev_read(dev_t dev, struct uio *uio, int flags)
                    813: {
                    814:        return tap_dev_read(minor(dev), uio, flags);
                    815: }
                    816:
                    817: static int
1.21.4.2! yamt      818: tap_fops_read(struct file *fp, off_t *offp, struct uio *uio,
        !           819:     kauth_cred_t cred, int flags)
1.1       cube      820: {
                    821:        return tap_dev_read((intptr_t)fp->f_data, uio, flags);
                    822: }
                    823:
                    824: static int
1.21.4.2! yamt      825: tap_dev_read(int unit, struct uio *uio, int flags)
1.1       cube      826: {
                    827:        struct tap_softc *sc =
                    828:            (struct tap_softc *)device_lookup(&tap_cd, unit);
                    829:        struct ifnet *ifp;
                    830:        struct mbuf *m, *n;
                    831:        int error = 0, s;
                    832:
                    833:        if (sc == NULL)
                    834:                return (ENXIO);
                    835:
                    836:        ifp = &sc->sc_ec.ec_if;
                    837:        if ((ifp->if_flags & IFF_UP) == 0)
                    838:                return (EHOSTDOWN);
                    839:
                    840:        /*
                    841:         * In the TAP_NBIO case, we have to make sure we won't be sleeping
                    842:         */
                    843:        if ((sc->sc_flags & TAP_NBIO) &&
                    844:            lockstatus(&sc->sc_rdlock) == LK_EXCLUSIVE)
                    845:                return (EWOULDBLOCK);
                    846:        error = lockmgr(&sc->sc_rdlock, LK_EXCLUSIVE, NULL);
                    847:        if (error != 0)
                    848:                return (error);
                    849:
                    850:        s = splnet();
                    851:        if (IFQ_IS_EMPTY(&ifp->if_snd)) {
                    852:                ifp->if_flags &= ~IFF_OACTIVE;
                    853:                splx(s);
                    854:                /*
                    855:                 * We must release the lock before sleeping, and re-acquire it
                    856:                 * after.
                    857:                 */
                    858:                (void)lockmgr(&sc->sc_rdlock, LK_RELEASE, NULL);
                    859:                if (sc->sc_flags & TAP_NBIO)
                    860:                        error = EWOULDBLOCK;
                    861:                else
                    862:                        error = tsleep(sc, PSOCK|PCATCH, "tap", 0);
                    863:
                    864:                if (error != 0)
                    865:                        return (error);
                    866:                /* The device might have been downed */
                    867:                if ((ifp->if_flags & IFF_UP) == 0)
                    868:                        return (EHOSTDOWN);
                    869:                if ((sc->sc_flags & TAP_NBIO) &&
                    870:                    lockstatus(&sc->sc_rdlock) == LK_EXCLUSIVE)
                    871:                        return (EWOULDBLOCK);
                    872:                error = lockmgr(&sc->sc_rdlock, LK_EXCLUSIVE, NULL);
                    873:                if (error != 0)
                    874:                        return (error);
                    875:                s = splnet();
                    876:        }
                    877:
                    878:        IFQ_DEQUEUE(&ifp->if_snd, m);
                    879:        ifp->if_flags &= ~IFF_OACTIVE;
                    880:        splx(s);
                    881:        if (m == NULL) {
                    882:                error = 0;
                    883:                goto out;
                    884:        }
                    885:
                    886:        ifp->if_opackets++;
                    887: #if NBPFILTER > 0
                    888:        if (ifp->if_bpf)
                    889:                bpf_mtap(ifp->if_bpf, m);
                    890: #endif
                    891:
                    892:        /*
                    893:         * One read is one packet.
                    894:         */
                    895:        do {
                    896:                error = uiomove(mtod(m, caddr_t),
                    897:                    min(m->m_len, uio->uio_resid), uio);
                    898:                MFREE(m, n);
                    899:                m = n;
                    900:        } while (m != NULL && uio->uio_resid > 0 && error == 0);
                    901:
                    902:        if (m != NULL)
                    903:                m_freem(m);
                    904:
                    905: out:
                    906:        (void)lockmgr(&sc->sc_rdlock, LK_RELEASE, NULL);
                    907:        return (error);
                    908: }
                    909:
                    910: static int
                    911: tap_cdev_write(dev_t dev, struct uio *uio, int flags)
                    912: {
                    913:        return tap_dev_write(minor(dev), uio, flags);
                    914: }
                    915:
                    916: static int
1.21.4.2! yamt      917: tap_fops_write(struct file *fp, off_t *offp, struct uio *uio,
        !           918:     kauth_cred_t cred, int flags)
1.1       cube      919: {
                    920:        return tap_dev_write((intptr_t)fp->f_data, uio, flags);
                    921: }
                    922:
                    923: static int
1.21.4.2! yamt      924: tap_dev_write(int unit, struct uio *uio, int flags)
1.1       cube      925: {
                    926:        struct tap_softc *sc =
                    927:            (struct tap_softc *)device_lookup(&tap_cd, unit);
                    928:        struct ifnet *ifp;
                    929:        struct mbuf *m, **mp;
                    930:        int error = 0;
1.9       bouyer    931:        int s;
1.1       cube      932:
                    933:        if (sc == NULL)
                    934:                return (ENXIO);
                    935:
                    936:        ifp = &sc->sc_ec.ec_if;
                    937:
                    938:        /* One write, one packet, that's the rule */
                    939:        MGETHDR(m, M_DONTWAIT, MT_DATA);
                    940:        if (m == NULL) {
                    941:                ifp->if_ierrors++;
                    942:                return (ENOBUFS);
                    943:        }
                    944:        m->m_pkthdr.len = uio->uio_resid;
                    945:
                    946:        mp = &m;
                    947:        while (error == 0 && uio->uio_resid > 0) {
                    948:                if (*mp != m) {
                    949:                        MGET(*mp, M_DONTWAIT, MT_DATA);
                    950:                        if (*mp == NULL) {
                    951:                                error = ENOBUFS;
                    952:                                break;
                    953:                        }
                    954:                }
                    955:                (*mp)->m_len = min(MHLEN, uio->uio_resid);
                    956:                error = uiomove(mtod(*mp, caddr_t), (*mp)->m_len, uio);
                    957:                mp = &(*mp)->m_next;
                    958:        }
                    959:        if (error) {
                    960:                ifp->if_ierrors++;
                    961:                m_freem(m);
                    962:                return (error);
                    963:        }
                    964:
                    965:        ifp->if_ipackets++;
                    966:        m->m_pkthdr.rcvif = ifp;
                    967:
                    968: #if NBPFILTER > 0
                    969:        if (ifp->if_bpf)
                    970:                bpf_mtap(ifp->if_bpf, m);
                    971: #endif
1.9       bouyer    972:        s =splnet();
1.1       cube      973:        (*ifp->if_input)(ifp, m);
1.9       bouyer    974:        splx(s);
1.1       cube      975:
                    976:        return (0);
                    977: }
                    978:
                    979: static int
1.21.4.2! yamt      980: tap_cdev_ioctl(dev_t dev, u_long cmd, caddr_t data, int flags,
1.11      christos  981:     struct lwp *l)
1.1       cube      982: {
1.11      christos  983:        return tap_dev_ioctl(minor(dev), cmd, data, l);
1.1       cube      984: }
                    985:
                    986: static int
1.11      christos  987: tap_fops_ioctl(struct file *fp, u_long cmd, void *data, struct lwp *l)
1.1       cube      988: {
1.11      christos  989:        return tap_dev_ioctl((intptr_t)fp->f_data, cmd, (caddr_t)data, l);
1.1       cube      990: }
                    991:
                    992: static int
1.11      christos  993: tap_dev_ioctl(int unit, u_long cmd, caddr_t data, struct lwp *l)
1.1       cube      994: {
                    995:        struct tap_softc *sc =
                    996:            (struct tap_softc *)device_lookup(&tap_cd, unit);
                    997:        int error = 0;
                    998:
                    999:        if (sc == NULL)
                   1000:                return (ENXIO);
                   1001:
                   1002:        switch (cmd) {
                   1003:        case FIONREAD:
                   1004:                {
                   1005:                        struct ifnet *ifp = &sc->sc_ec.ec_if;
                   1006:                        struct mbuf *m;
                   1007:                        int s;
                   1008:
                   1009:                        s = splnet();
                   1010:                        IFQ_POLL(&ifp->if_snd, m);
                   1011:
                   1012:                        if (m == NULL)
                   1013:                                *(int *)data = 0;
                   1014:                        else
                   1015:                                *(int *)data = m->m_pkthdr.len;
                   1016:                        splx(s);
                   1017:                } break;
                   1018:        case TIOCSPGRP:
                   1019:        case FIOSETOWN:
1.11      christos 1020:                error = fsetown(l->l_proc, &sc->sc_pgid, cmd, data);
1.1       cube     1021:                break;
                   1022:        case TIOCGPGRP:
                   1023:        case FIOGETOWN:
1.11      christos 1024:                error = fgetown(l->l_proc, sc->sc_pgid, cmd, data);
1.1       cube     1025:                break;
                   1026:        case FIOASYNC:
                   1027:                if (*(int *)data)
                   1028:                        sc->sc_flags |= TAP_ASYNCIO;
                   1029:                else
                   1030:                        sc->sc_flags &= ~TAP_ASYNCIO;
                   1031:                break;
                   1032:        case FIONBIO:
                   1033:                if (*(int *)data)
                   1034:                        sc->sc_flags |= TAP_NBIO;
                   1035:                else
                   1036:                        sc->sc_flags &= ~TAP_NBIO;
                   1037:                break;
                   1038:        case TAPGIFNAME:
                   1039:                {
                   1040:                        struct ifreq *ifr = (struct ifreq *)data;
                   1041:                        struct ifnet *ifp = &sc->sc_ec.ec_if;
                   1042:
                   1043:                        strlcpy(ifr->ifr_name, ifp->if_xname, IFNAMSIZ);
                   1044:                } break;
                   1045:        default:
                   1046:                error = ENOTTY;
                   1047:                break;
                   1048:        }
                   1049:
                   1050:        return (0);
                   1051: }
                   1052:
                   1053: static int
1.11      christos 1054: tap_cdev_poll(dev_t dev, int events, struct lwp *l)
1.1       cube     1055: {
1.11      christos 1056:        return tap_dev_poll(minor(dev), events, l);
1.1       cube     1057: }
                   1058:
                   1059: static int
1.11      christos 1060: tap_fops_poll(struct file *fp, int events, struct lwp *l)
1.1       cube     1061: {
1.11      christos 1062:        return tap_dev_poll((intptr_t)fp->f_data, events, l);
1.1       cube     1063: }
                   1064:
                   1065: static int
1.11      christos 1066: tap_dev_poll(int unit, int events, struct lwp *l)
1.1       cube     1067: {
                   1068:        struct tap_softc *sc =
                   1069:            (struct tap_softc *)device_lookup(&tap_cd, unit);
                   1070:        int revents = 0;
                   1071:
                   1072:        if (sc == NULL)
                   1073:                return (ENXIO);
                   1074:
                   1075:        if (events & (POLLIN|POLLRDNORM)) {
                   1076:                struct ifnet *ifp = &sc->sc_ec.ec_if;
                   1077:                struct mbuf *m;
                   1078:                int s;
                   1079:
                   1080:                s = splnet();
                   1081:                IFQ_POLL(&ifp->if_snd, m);
                   1082:                splx(s);
                   1083:
                   1084:                if (m != NULL)
                   1085:                        revents |= events & (POLLIN|POLLRDNORM);
                   1086:                else {
1.4       ragge    1087:                        simple_lock(&sc->sc_kqlock);
1.11      christos 1088:                        selrecord(l, &sc->sc_rsel);
1.1       cube     1089:                        simple_unlock(&sc->sc_kqlock);
                   1090:                }
                   1091:        }
                   1092:        revents |= events & (POLLOUT|POLLWRNORM);
                   1093:
                   1094:        return (revents);
                   1095: }
                   1096:
                   1097: static struct filterops tap_read_filterops = { 1, NULL, tap_kqdetach,
                   1098:        tap_kqread };
                   1099: static struct filterops tap_seltrue_filterops = { 1, NULL, tap_kqdetach,
                   1100:        filt_seltrue };
                   1101:
                   1102: static int
                   1103: tap_cdev_kqfilter(dev_t dev, struct knote *kn)
                   1104: {
                   1105:        return tap_dev_kqfilter(minor(dev), kn);
                   1106: }
                   1107:
                   1108: static int
                   1109: tap_fops_kqfilter(struct file *fp, struct knote *kn)
                   1110: {
                   1111:        return tap_dev_kqfilter((intptr_t)fp->f_data, kn);
                   1112: }
                   1113:
                   1114: static int
                   1115: tap_dev_kqfilter(int unit, struct knote *kn)
                   1116: {
                   1117:        struct tap_softc *sc =
                   1118:            (struct tap_softc *)device_lookup(&tap_cd, unit);
                   1119:
                   1120:        if (sc == NULL)
                   1121:                return (ENXIO);
                   1122:
                   1123:        switch(kn->kn_filter) {
                   1124:        case EVFILT_READ:
                   1125:                kn->kn_fop = &tap_read_filterops;
                   1126:                break;
                   1127:        case EVFILT_WRITE:
                   1128:                kn->kn_fop = &tap_seltrue_filterops;
                   1129:                break;
                   1130:        default:
                   1131:                return (1);
                   1132:        }
                   1133:
                   1134:        kn->kn_hook = sc;
1.4       ragge    1135:        simple_lock(&sc->sc_kqlock);
1.1       cube     1136:        SLIST_INSERT_HEAD(&sc->sc_rsel.sel_klist, kn, kn_selnext);
                   1137:        simple_unlock(&sc->sc_kqlock);
                   1138:        return (0);
                   1139: }
                   1140:
                   1141: static void
                   1142: tap_kqdetach(struct knote *kn)
                   1143: {
                   1144:        struct tap_softc *sc = (struct tap_softc *)kn->kn_hook;
                   1145:
1.4       ragge    1146:        simple_lock(&sc->sc_kqlock);
1.1       cube     1147:        SLIST_REMOVE(&sc->sc_rsel.sel_klist, kn, knote, kn_selnext);
                   1148:        simple_unlock(&sc->sc_kqlock);
                   1149: }
                   1150:
                   1151: static int
1.21.4.2! yamt     1152: tap_kqread(struct knote *kn, long hint)
1.1       cube     1153: {
                   1154:        struct tap_softc *sc = (struct tap_softc *)kn->kn_hook;
                   1155:        struct ifnet *ifp = &sc->sc_ec.ec_if;
                   1156:        struct mbuf *m;
                   1157:        int s;
                   1158:
                   1159:        s = splnet();
                   1160:        IFQ_POLL(&ifp->if_snd, m);
                   1161:
                   1162:        if (m == NULL)
                   1163:                kn->kn_data = 0;
                   1164:        else
                   1165:                kn->kn_data = m->m_pkthdr.len;
                   1166:        splx(s);
                   1167:        return (kn->kn_data != 0 ? 1 : 0);
                   1168: }
                   1169:
                   1170: /*
                   1171:  * sysctl management routines
                   1172:  * You can set the address of an interface through:
                   1173:  * net.link.tap.tap<number>
                   1174:  *
                   1175:  * Note the consistent use of tap_log in order to use
                   1176:  * sysctl_teardown at unload time.
                   1177:  *
                   1178:  * In the kernel you will find a lot of SYSCTL_SETUP blocks.  Those
                   1179:  * blocks register a function in a special section of the kernel
                   1180:  * (called a link set) which is used at init_sysctl() time to cycle
                   1181:  * through all those functions to create the kernel's sysctl tree.
                   1182:  *
                   1183:  * It is not (currently) possible to use link sets in a LKM, so the
                   1184:  * easiest is to simply call our own setup routine at load time.
                   1185:  *
                   1186:  * In the SYSCTL_SETUP blocks you find in the kernel, nodes have the
                   1187:  * CTLFLAG_PERMANENT flag, meaning they cannot be removed.  Once the
                   1188:  * whole kernel sysctl tree is built, it is not possible to add any
                   1189:  * permanent node.
                   1190:  *
                   1191:  * It should be noted that we're not saving the sysctlnode pointer
                   1192:  * we are returned when creating the "tap" node.  That structure
                   1193:  * cannot be trusted once out of the calling function, as it might
                   1194:  * get reused.  So we just save the MIB number, and always give the
                   1195:  * full path starting from the root for later calls to sysctl_createv
                   1196:  * and sysctl_destroyv.
                   1197:  */
                   1198: SYSCTL_SETUP(sysctl_tap_setup, "sysctl net.link.tap subtree setup")
                   1199: {
1.10      atatat   1200:        const struct sysctlnode *node;
1.1       cube     1201:        int error = 0;
                   1202:
                   1203:        if ((error = sysctl_createv(clog, 0, NULL, NULL,
                   1204:            CTLFLAG_PERMANENT,
                   1205:            CTLTYPE_NODE, "net", NULL,
                   1206:            NULL, 0, NULL, 0,
                   1207:            CTL_NET, CTL_EOL)) != 0)
                   1208:                return;
                   1209:
                   1210:        if ((error = sysctl_createv(clog, 0, NULL, NULL,
                   1211:            CTLFLAG_PERMANENT,
                   1212:            CTLTYPE_NODE, "link", NULL,
                   1213:            NULL, 0, NULL, 0,
1.3       cube     1214:            CTL_NET, AF_LINK, CTL_EOL)) != 0)
1.1       cube     1215:                return;
                   1216:
                   1217:        /*
                   1218:         * The first four parameters of sysctl_createv are for management.
                   1219:         *
                   1220:         * The four that follows, here starting with a '0' for the flags,
                   1221:         * describe the node.
                   1222:         *
                   1223:         * The next series of four set its value, through various possible
                   1224:         * means.
                   1225:         *
                   1226:         * Last but not least, the path to the node is described.  That path
                   1227:         * is relative to the given root (third argument).  Here we're
                   1228:         * starting from the root.
                   1229:         */
                   1230:        if ((error = sysctl_createv(clog, 0, NULL, &node,
                   1231:            CTLFLAG_PERMANENT,
                   1232:            CTLTYPE_NODE, "tap", NULL,
                   1233:            NULL, 0, NULL, 0,
1.3       cube     1234:            CTL_NET, AF_LINK, CTL_CREATE, CTL_EOL)) != 0)
1.1       cube     1235:                return;
                   1236:        tap_node = node->sysctl_num;
                   1237: }
                   1238:
                   1239: /*
                   1240:  * The helper functions make Andrew Brown's interface really
                   1241:  * shine.  It makes possible to create value on the fly whether
                   1242:  * the sysctl value is read or written.
                   1243:  *
                   1244:  * As shown as an example in the man page, the first step is to
                   1245:  * create a copy of the node to have sysctl_lookup work on it.
                   1246:  *
                   1247:  * Here, we have more work to do than just a copy, since we have
                   1248:  * to create the string.  The first step is to collect the actual
                   1249:  * value of the node, which is a convenient pointer to the softc
                   1250:  * of the interface.  From there we create the string and use it
                   1251:  * as the value, but only for the *copy* of the node.
                   1252:  *
                   1253:  * Then we let sysctl_lookup do the magic, which consists in
                   1254:  * setting oldp and newp as required by the operation.  When the
                   1255:  * value is read, that means that the string will be copied to
                   1256:  * the user, and when it is written, the new value will be copied
                   1257:  * over in the addr array.
                   1258:  *
                   1259:  * If newp is NULL, the user was reading the value, so we don't
                   1260:  * have anything else to do.  If a new value was written, we
                   1261:  * have to check it.
                   1262:  *
                   1263:  * If it is incorrect, we can return an error and leave 'node' as
                   1264:  * it is:  since it is a copy of the actual node, the change will
                   1265:  * be forgotten.
                   1266:  *
                   1267:  * Upon a correct input, we commit the change to the ifnet
                   1268:  * structure of our interface.
                   1269:  */
                   1270: static int
                   1271: tap_sysctl_handler(SYSCTLFN_ARGS)
                   1272: {
                   1273:        struct sysctlnode node;
                   1274:        struct tap_softc *sc;
                   1275:        struct ifnet *ifp;
                   1276:        int error;
                   1277:        size_t len;
1.14      christos 1278:        char addr[3 * ETHER_ADDR_LEN];
1.1       cube     1279:
                   1280:        node = *rnode;
                   1281:        sc = node.sysctl_data;
                   1282:        ifp = &sc->sc_ec.ec_if;
1.14      christos 1283:        (void)ether_snprintf(addr, sizeof(addr), LLADDR(ifp->if_sadl));
1.1       cube     1284:        node.sysctl_data = addr;
                   1285:        error = sysctl_lookup(SYSCTLFN_CALL(&node));
                   1286:        if (error || newp == NULL)
                   1287:                return (error);
                   1288:
                   1289:        len = strlen(addr);
                   1290:        if (len < 11 || len > 17)
                   1291:                return (EINVAL);
                   1292:
                   1293:        /* Commit change */
1.21.4.2! yamt     1294:        if (ether_nonstatic_aton(LLADDR(ifp->if_sadl), addr) != 0)
1.1       cube     1295:                return (EINVAL);
                   1296:        return (error);
                   1297: }

CVSweb <webmaster@jp.NetBSD.org>