Home | History | Annotate | Line # | Download | only in altq
altq_conf.c revision 1.12.10.2
      1  1.12.10.2      elad /*	$NetBSD: altq_conf.c,v 1.12.10.2 2006/03/10 13:29:35 elad Exp $	*/
      2        1.6    itojun /*	$KAME: altq_conf.c,v 1.13 2002/01/29 10:16:01 kjc Exp $	*/
      3        1.1   thorpej 
      4        1.1   thorpej /*
      5        1.1   thorpej  * Copyright (C) 1997-2000
      6        1.1   thorpej  *	Sony Computer Science Laboratories Inc.  All rights reserved.
      7        1.1   thorpej  *
      8        1.1   thorpej  * Redistribution and use in source and binary forms, with or without
      9        1.1   thorpej  * modification, are permitted provided that the following conditions
     10        1.1   thorpej  * are met:
     11        1.1   thorpej  * 1. Redistributions of source code must retain the above copyright
     12        1.1   thorpej  *    notice, this list of conditions and the following disclaimer.
     13        1.1   thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     14        1.1   thorpej  *    notice, this list of conditions and the following disclaimer in the
     15        1.1   thorpej  *    documentation and/or other materials provided with the distribution.
     16        1.1   thorpej  *
     17        1.1   thorpej  * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
     18        1.1   thorpej  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19        1.1   thorpej  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20        1.1   thorpej  * ARE DISCLAIMED.  IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
     21        1.1   thorpej  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22        1.1   thorpej  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23        1.1   thorpej  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24        1.1   thorpej  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25        1.1   thorpej  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26        1.1   thorpej  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27        1.1   thorpej  * SUCH DAMAGE.
     28        1.1   thorpej  */
     29        1.5     lukem 
     30        1.5     lukem #include <sys/cdefs.h>
     31  1.12.10.2      elad __KERNEL_RCSID(0, "$NetBSD: altq_conf.c,v 1.12.10.2 2006/03/10 13:29:35 elad Exp $");
     32        1.1   thorpej 
     33        1.1   thorpej #if defined(__FreeBSD__) || defined(__NetBSD__)
     34        1.1   thorpej #include "opt_altq.h"
     35        1.1   thorpej #if (__FreeBSD__ != 2)
     36        1.1   thorpej #include "opt_inet.h"
     37        1.1   thorpej #ifdef __FreeBSD__
     38        1.1   thorpej #include "opt_inet6.h"
     39        1.1   thorpej #endif
     40        1.1   thorpej #endif
     41        1.1   thorpej #endif /* __FreeBSD__ || __NetBSD__ */
     42        1.1   thorpej 
     43        1.1   thorpej /*
     44        1.1   thorpej  * altq device interface.
     45        1.1   thorpej  */
     46        1.1   thorpej #include <sys/param.h>
     47        1.1   thorpej #include <sys/systm.h>
     48        1.1   thorpej #include <sys/socket.h>
     49        1.1   thorpej #include <sys/kernel.h>
     50        1.1   thorpej #include <sys/proc.h>
     51        1.1   thorpej #include <sys/errno.h>
     52        1.1   thorpej #if defined(__FreeBSD__) && (__FreeBSD_version < 400000) && defined(DEVFS)
     53        1.1   thorpej #include <sys/devfsext.h>
     54        1.1   thorpej #endif /*DEVFS*/
     55        1.1   thorpej #include <net/if.h>
     56        1.1   thorpej 
     57        1.1   thorpej #include <altq/altq.h>
     58        1.9  jdolecek #include <altq/altqconf.h>
     59        1.1   thorpej #include <altq/altq_conf.h>
     60        1.1   thorpej 
     61        1.1   thorpej #ifdef ALTQ_CBQ
     62        1.1   thorpej altqdev_decl(cbq);
     63        1.1   thorpej #endif
     64        1.1   thorpej #ifdef ALTQ_WFQ
     65        1.1   thorpej altqdev_decl(wfq);
     66        1.1   thorpej #endif
     67        1.1   thorpej #ifdef ALTQ_AFMAP
     68        1.1   thorpej altqdev_decl(afm);
     69        1.1   thorpej #endif
     70        1.1   thorpej #ifdef ALTQ_FIFOQ
     71        1.1   thorpej altqdev_decl(fifoq);
     72        1.1   thorpej #endif
     73        1.1   thorpej #ifdef ALTQ_RED
     74        1.1   thorpej altqdev_decl(red);
     75        1.1   thorpej #endif
     76        1.1   thorpej #ifdef ALTQ_RIO
     77        1.1   thorpej altqdev_decl(rio);
     78        1.1   thorpej #endif
     79        1.1   thorpej #ifdef ALTQ_LOCALQ
     80        1.1   thorpej altqdev_decl(localq);
     81        1.1   thorpej #endif
     82        1.1   thorpej #ifdef ALTQ_HFSC
     83        1.1   thorpej altqdev_decl(hfsc);
     84        1.1   thorpej #endif
     85        1.1   thorpej #ifdef ALTQ_CDNR
     86        1.1   thorpej altqdev_decl(cdnr);
     87        1.1   thorpej #endif
     88        1.1   thorpej #ifdef ALTQ_BLUE
     89        1.1   thorpej altqdev_decl(blue);
     90        1.1   thorpej #endif
     91        1.1   thorpej #ifdef ALTQ_PRIQ
     92        1.1   thorpej altqdev_decl(priq);
     93        1.1   thorpej #endif
     94        1.1   thorpej 
     95        1.1   thorpej /*
     96        1.1   thorpej  * altq minor device (discipline) table
     97        1.1   thorpej  */
     98        1.1   thorpej static struct altqsw altqsw[] = {				/* minor */
     99        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},  /* 0 (reserved) */
    100        1.1   thorpej #ifdef ALTQ_CBQ
    101        1.1   thorpej 	{"cbq",	cbqopen,	cbqclose,	cbqioctl},	/* 1 */
    102        1.1   thorpej #else
    103        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 1 */
    104        1.1   thorpej #endif
    105        1.1   thorpej #ifdef ALTQ_WFQ
    106        1.1   thorpej 	{"wfq",	wfqopen,	wfqclose,	wfqioctl},	/* 2 */
    107        1.1   thorpej #else
    108        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 2 */
    109        1.1   thorpej #endif
    110        1.1   thorpej #ifdef ALTQ_AFMAP
    111        1.1   thorpej 	{"afm",	afmopen,	afmclose,	afmioctl},	/* 3 */
    112        1.1   thorpej #else
    113        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 3 */
    114        1.1   thorpej #endif
    115        1.1   thorpej #ifdef ALTQ_FIFOQ
    116        1.1   thorpej 	{"fifoq", fifoqopen,	fifoqclose,	fifoqioctl},	/* 4 */
    117        1.1   thorpej #else
    118        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 4 */
    119        1.1   thorpej #endif
    120        1.1   thorpej #ifdef ALTQ_RED
    121        1.1   thorpej 	{"red", redopen,	redclose,	redioctl},	/* 5 */
    122        1.1   thorpej #else
    123        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 5 */
    124        1.1   thorpej #endif
    125        1.1   thorpej #ifdef ALTQ_RIO
    126        1.1   thorpej 	{"rio", rioopen,	rioclose,	rioioctl},	/* 6 */
    127        1.1   thorpej #else
    128        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 6 */
    129        1.1   thorpej #endif
    130        1.1   thorpej #ifdef ALTQ_LOCALQ
    131        1.1   thorpej 	{"localq",localqopen,	localqclose,	localqioctl}, /* 7 (local use) */
    132        1.1   thorpej #else
    133        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},  /* 7 (local use) */
    134        1.1   thorpej #endif
    135        1.1   thorpej #ifdef ALTQ_HFSC
    136        1.1   thorpej 	{"hfsc",hfscopen,	hfscclose,	hfscioctl},	/* 8 */
    137        1.1   thorpej #else
    138        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 8 */
    139        1.1   thorpej #endif
    140        1.1   thorpej #ifdef ALTQ_CDNR
    141        1.1   thorpej 	{"cdnr",cdnropen,	cdnrclose,	cdnrioctl},	/* 9 */
    142        1.1   thorpej #else
    143        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 9 */
    144        1.1   thorpej #endif
    145        1.1   thorpej #ifdef ALTQ_BLUE
    146        1.1   thorpej 	{"blue",blueopen,	blueclose,	blueioctl},	/* 10 */
    147        1.1   thorpej #else
    148        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 10 */
    149        1.1   thorpej #endif
    150        1.1   thorpej #ifdef ALTQ_PRIQ
    151        1.1   thorpej 	{"priq",priqopen,	priqclose,	priqioctl},	/* 11 */
    152        1.1   thorpej #else
    153        1.1   thorpej 	{"noq",	noopen,		noclose,	noioctl},	/* 11 */
    154        1.1   thorpej #endif
    155        1.1   thorpej };
    156        1.1   thorpej 
    157        1.1   thorpej /*
    158        1.1   thorpej  * altq major device support
    159        1.1   thorpej  */
    160        1.1   thorpej int	naltqsw = sizeof (altqsw) / sizeof (altqsw[0]);
    161        1.1   thorpej 
    162        1.8   gehenna #if defined(__NetBSD__)
    163        1.8   gehenna dev_type_open(altqopen);
    164        1.8   gehenna dev_type_close(altqclose);
    165        1.8   gehenna dev_type_ioctl(altqioctl);
    166        1.8   gehenna #endif
    167        1.8   gehenna #if defined(__OpenBSD__)
    168        1.1   thorpej static	d_open_t	altqopen;
    169        1.1   thorpej static	d_close_t	altqclose;
    170        1.1   thorpej static	d_ioctl_t	altqioctl;
    171        1.1   thorpej #endif
    172        1.1   thorpej #ifdef __FreeBSD__
    173        1.1   thorpej static void altq_drvinit __P((void *));
    174        1.1   thorpej #else
    175        1.1   thorpej void	altqattach __P((int));
    176        1.1   thorpej #endif
    177        1.1   thorpej 
    178        1.1   thorpej #if defined(__FreeBSD__)
    179        1.1   thorpej #define	CDEV_MAJOR 96		/* FreeBSD official number */
    180        1.1   thorpej #elif defined(__OpenBSD__)
    181        1.1   thorpej #if defined(__i386__)
    182        1.6    itojun #define	CDEV_MAJOR 74		/* OpenBSD i386 (official) */
    183        1.1   thorpej #elif defined(__alpha__)
    184        1.6    itojun #define	CDEV_MAJOR 53		/* OpenBSD alpha (official) */
    185        1.1   thorpej #else
    186        1.1   thorpej #error arch not supported
    187        1.1   thorpej #endif
    188        1.1   thorpej #endif
    189        1.1   thorpej 
    190        1.1   thorpej #if defined(__FreeBSD__)
    191        1.1   thorpej #if (__FreeBSD_version < 400000)
    192       1.11     perry static struct cdevsw altq_cdevsw =
    193        1.1   thorpej         { altqopen,	altqclose,	noread,	        nowrite,
    194        1.1   thorpej 	  altqioctl,	nostop,		nullreset,	nodevtotty,
    195        1.1   thorpej  	  seltrue,	nommap,		NULL,	"altq",	NULL,	  -1 };
    196        1.1   thorpej #else
    197       1.11     perry static struct cdevsw altq_cdevsw =
    198        1.1   thorpej         { altqopen,	altqclose,	noread,	        nowrite,
    199       1.11     perry 	  altqioctl,	seltrue,	nommap,		nostrategy,
    200        1.1   thorpej 	  "altq",	CDEV_MAJOR,	nodump,		nopsize,  0,  -1 };
    201        1.1   thorpej #endif
    202        1.7   gehenna #endif
    203        1.7   gehenna 
    204        1.7   gehenna #if defined(__NetBSD__)
    205        1.7   gehenna const struct cdevsw altq_cdevsw = {
    206        1.7   gehenna 	altqopen, altqclose, noread, nowrite, altqioctl,
    207       1.10  jdolecek 	nostop, notty, nopoll, nommap, nokqfilter
    208        1.7   gehenna };
    209        1.1   thorpej #endif
    210        1.1   thorpej 
    211        1.4   thorpej #if !defined(__NetBSD__) && !defined(__OpenBSD__)
    212        1.1   thorpej static
    213        1.1   thorpej #endif
    214        1.1   thorpej int
    215       1.12  christos altqopen(dev, flag, fmt, l)
    216        1.1   thorpej 	dev_t dev;
    217        1.1   thorpej 	int flag, fmt;
    218       1.12  christos 	struct lwp *l;
    219        1.1   thorpej {
    220        1.1   thorpej 	int unit = minor(dev);
    221        1.1   thorpej 
    222        1.1   thorpej 	if (unit == 0)
    223        1.1   thorpej 		return (0);
    224        1.1   thorpej 	if (unit < naltqsw)
    225       1.12  christos 		return (*altqsw[unit].d_open)(dev, flag, fmt, l);
    226        1.1   thorpej 
    227        1.1   thorpej 	return ENXIO;
    228        1.1   thorpej }
    229        1.1   thorpej 
    230        1.4   thorpej #if !defined(__NetBSD__) && !defined(__OpenBSD__)
    231        1.1   thorpej static
    232        1.1   thorpej #endif
    233        1.1   thorpej int
    234       1.12  christos altqclose(dev, flag, fmt, l)
    235        1.1   thorpej 	dev_t dev;
    236        1.1   thorpej 	int flag, fmt;
    237       1.12  christos 	struct lwp *l;
    238        1.1   thorpej {
    239        1.1   thorpej 	int unit = minor(dev);
    240        1.1   thorpej 
    241        1.1   thorpej 	if (unit == 0)
    242        1.1   thorpej 		return (0);
    243        1.1   thorpej 	if (unit < naltqsw)
    244       1.12  christos 		return (*altqsw[unit].d_close)(dev, flag, fmt, l);
    245        1.1   thorpej 
    246        1.1   thorpej 	return ENXIO;
    247        1.1   thorpej }
    248        1.1   thorpej 
    249        1.4   thorpej #if !defined(__NetBSD__) && !defined(__OpenBSD__)
    250        1.1   thorpej static
    251        1.1   thorpej #endif
    252        1.1   thorpej int
    253       1.12  christos altqioctl(dev, cmd, addr, flag, l)
    254        1.1   thorpej 	dev_t dev;
    255        1.1   thorpej 	ioctlcmd_t cmd;
    256        1.1   thorpej 	caddr_t addr;
    257        1.1   thorpej 	int flag;
    258       1.12  christos 	struct lwp *l;
    259        1.1   thorpej {
    260       1.12  christos 	struct proc *p = l->l_proc;
    261        1.1   thorpej 	int unit = minor(dev);
    262        1.1   thorpej 
    263        1.1   thorpej 	if (unit == 0) {
    264        1.1   thorpej 		struct ifnet *ifp;
    265        1.1   thorpej 		struct altqreq *typereq;
    266        1.1   thorpej 		struct tbrreq *tbrreq;
    267        1.1   thorpej 		int error;
    268        1.1   thorpej 
    269        1.1   thorpej 		switch (cmd) {
    270        1.1   thorpej 		case ALTQGTYPE:
    271        1.1   thorpej 		case ALTQTBRGET:
    272        1.1   thorpej 			break;
    273        1.1   thorpej 		default:
    274        1.1   thorpej #if (__FreeBSD_version > 400000)
    275        1.1   thorpej 			if ((error = suser(p)) != 0)
    276        1.1   thorpej 				return (error);
    277        1.1   thorpej #else
    278  1.12.10.2      elad 			if ((error = kauth_authorize_generic(p->p_cred,
    279  1.12.10.1      elad 						       KAUTH_GENERIC_ISSUSER,
    280  1.12.10.1      elad 						       &p->p_acflag)) != 0)
    281        1.1   thorpej 				return (error);
    282        1.1   thorpej #endif
    283        1.1   thorpej 			break;
    284        1.1   thorpej 		}
    285        1.1   thorpej 
    286        1.1   thorpej 		switch (cmd) {
    287        1.1   thorpej 		case ALTQGTYPE:
    288        1.1   thorpej 			typereq = (struct altqreq *)addr;
    289        1.1   thorpej 			if ((ifp = ifunit(typereq->ifname)) == NULL)
    290        1.1   thorpej 				return (EINVAL);
    291        1.1   thorpej 			typereq->arg = (u_long)ifp->if_snd.altq_type;
    292        1.1   thorpej 			return (0);
    293        1.1   thorpej 		case ALTQTBRSET:
    294        1.1   thorpej 			tbrreq = (struct tbrreq *)addr;
    295        1.1   thorpej 			if ((ifp = ifunit(tbrreq->ifname)) == NULL)
    296        1.1   thorpej 				return (EINVAL);
    297        1.1   thorpej 			return tbr_set(&ifp->if_snd, &tbrreq->tb_prof);
    298        1.1   thorpej 		case ALTQTBRGET:
    299        1.1   thorpej 			tbrreq = (struct tbrreq *)addr;
    300        1.1   thorpej 			if ((ifp = ifunit(tbrreq->ifname)) == NULL)
    301        1.1   thorpej 				return (EINVAL);
    302        1.1   thorpej 			return tbr_get(&ifp->if_snd, &tbrreq->tb_prof);
    303        1.1   thorpej 		default:
    304        1.1   thorpej 			return (EINVAL);
    305        1.1   thorpej 		}
    306        1.1   thorpej 	}
    307        1.1   thorpej 	if (unit < naltqsw)
    308       1.12  christos 		return (*altqsw[unit].d_ioctl)(dev, cmd, addr, flag, l);
    309        1.1   thorpej 
    310        1.1   thorpej 	return ENXIO;
    311        1.1   thorpej }
    312        1.1   thorpej 
    313        1.4   thorpej #if !defined(__NetBSD__)
    314        1.1   thorpej static int altq_devsw_installed = 0;
    315        1.4   thorpej #endif
    316        1.1   thorpej 
    317        1.1   thorpej #ifdef __FreeBSD__
    318        1.1   thorpej #if (__FreeBSD_version < 400000)
    319        1.1   thorpej #ifdef DEVFS
    320        1.1   thorpej static	void *altq_devfs_token[sizeof (altqsw) / sizeof (altqsw[0])];
    321        1.1   thorpej #endif
    322        1.1   thorpej 
    323        1.1   thorpej static void
    324        1.1   thorpej altq_drvinit(unused)
    325        1.1   thorpej 	void *unused;
    326        1.1   thorpej {
    327        1.1   thorpej 	dev_t dev;
    328        1.1   thorpej #ifdef DEVFS
    329        1.1   thorpej 	int i;
    330        1.1   thorpej #endif
    331        1.1   thorpej 
    332        1.1   thorpej 	if (!altq_devsw_installed) {
    333        1.1   thorpej 		dev = makedev(CDEV_MAJOR,0);
    334        1.1   thorpej 		cdevsw_add(&dev,&altq_cdevsw,NULL);
    335        1.1   thorpej 		altq_devsw_installed = 1;
    336        1.1   thorpej #ifdef DEVFS
    337        1.1   thorpej 		for (i=0; i<naltqsw; i++)
    338        1.1   thorpej 			altq_devfs_token[i] =
    339        1.1   thorpej 				devfs_add_devswf(&altq_cdevsw, i, DV_CHR,
    340        1.1   thorpej 						 0, 0, 0644, altqsw[i].d_name);
    341        1.1   thorpej #endif
    342        1.1   thorpej 		printf("altq: major number is %d\n", CDEV_MAJOR);
    343        1.1   thorpej 	}
    344        1.1   thorpej }
    345        1.1   thorpej 
    346        1.1   thorpej #else /* FreeBSD 4.x */
    347        1.1   thorpej 
    348        1.1   thorpej static void
    349        1.1   thorpej altq_drvinit(unused)
    350        1.1   thorpej 	void *unused;
    351        1.1   thorpej {
    352        1.1   thorpej 	int unit;
    353        1.1   thorpej 
    354        1.1   thorpej 	cdevsw_add(&altq_cdevsw);
    355        1.1   thorpej 	altq_devsw_installed = 1;
    356        1.1   thorpej 	printf("altq: major number is %d\n", CDEV_MAJOR);
    357        1.1   thorpej 
    358        1.1   thorpej 	/* create minor devices */
    359        1.1   thorpej 	for (unit = 0; unit < naltqsw; unit++)
    360        1.1   thorpej 		make_dev(&altq_cdevsw, unit, 0, 0, 0644,
    361        1.1   thorpej 			 altqsw[unit].d_name);
    362        1.1   thorpej }
    363        1.1   thorpej 
    364        1.1   thorpej #endif /* FreeBSD 4.x */
    365        1.1   thorpej 
    366        1.1   thorpej SYSINIT(altqdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,altq_drvinit,NULL)
    367        1.1   thorpej 
    368        1.1   thorpej #endif
    369        1.1   thorpej 
    370        1.1   thorpej #ifdef ALTQ_KLD
    371        1.1   thorpej /*
    372        1.1   thorpej  * KLD support
    373        1.1   thorpej  */
    374        1.1   thorpej static int altq_module_register __P((struct altq_module_data *));
    375        1.1   thorpej static int altq_module_deregister __P((struct altq_module_data *));
    376        1.1   thorpej 
    377        1.1   thorpej static struct altq_module_data *altq_modules[ALTQT_MAX];
    378        1.1   thorpej static struct altqsw noqdisc = {"noq", noopen, noclose, noioctl};
    379        1.1   thorpej 
    380        1.1   thorpej void altq_module_incref(type)
    381        1.1   thorpej 	int type;
    382        1.1   thorpej {
    383        1.1   thorpej 	if (type < 0 || type >= ALTQT_MAX || altq_modules[type] == NULL)
    384        1.1   thorpej 		return;
    385        1.1   thorpej 
    386        1.1   thorpej 	altq_modules[type]->ref++;
    387        1.1   thorpej }
    388        1.1   thorpej 
    389        1.1   thorpej void altq_module_declref(type)
    390        1.1   thorpej 	int type;
    391        1.1   thorpej {
    392        1.1   thorpej 	if (type < 0 || type >= ALTQT_MAX || altq_modules[type] == NULL)
    393        1.1   thorpej 		return;
    394        1.1   thorpej 
    395        1.1   thorpej 	altq_modules[type]->ref--;
    396        1.1   thorpej }
    397        1.1   thorpej 
    398       1.11     perry static int
    399        1.1   thorpej altq_module_register(mdata)
    400        1.1   thorpej 	struct altq_module_data *mdata;
    401        1.1   thorpej {
    402        1.1   thorpej 	int type = mdata->type;
    403        1.1   thorpej 
    404        1.1   thorpej 	if (type < 0 || type >= ALTQT_MAX)
    405        1.1   thorpej 		return (EINVAL);
    406        1.1   thorpej 	if (altqsw[type].d_open != noopen)
    407        1.1   thorpej 		return (EBUSY);
    408        1.1   thorpej 	altqsw[type] = *mdata->altqsw;	/* set discipline functions */
    409        1.1   thorpej 	altq_modules[type] = mdata;	/* save module data pointer */
    410        1.1   thorpej 	return (0);
    411        1.1   thorpej }
    412        1.1   thorpej 
    413       1.11     perry static int
    414        1.1   thorpej altq_module_deregister(mdata)
    415        1.1   thorpej 	struct altq_module_data *mdata;
    416        1.1   thorpej {
    417        1.1   thorpej 	int type = mdata->type;
    418        1.1   thorpej 
    419        1.1   thorpej 	if (type < 0 || type >= ALTQT_MAX)
    420        1.1   thorpej 		return (EINVAL);
    421        1.1   thorpej 	if (mdata != altq_modules[type])
    422        1.1   thorpej 		return (EINVAL);
    423        1.1   thorpej 	if (altq_modules[type]->ref > 0)
    424        1.1   thorpej 		return (EBUSY);
    425        1.1   thorpej 	altqsw[type] = noqdisc;
    426        1.1   thorpej 	altq_modules[type] = NULL;
    427        1.1   thorpej 	return (0);
    428        1.1   thorpej }
    429        1.1   thorpej 
    430        1.1   thorpej int
    431        1.1   thorpej altq_module_handler(mod, cmd, arg)
    432        1.1   thorpej     module_t	mod;
    433        1.1   thorpej     int cmd;
    434        1.1   thorpej     void * arg;
    435        1.1   thorpej {
    436        1.1   thorpej 	struct altq_module_data *data = (struct altq_module_data *)arg;
    437        1.1   thorpej 	int	error = 0;
    438        1.1   thorpej 
    439        1.1   thorpej 	switch (cmd) {
    440        1.1   thorpej 	case MOD_LOAD:
    441        1.1   thorpej 		error = altq_module_register(data);
    442        1.1   thorpej 		break;
    443        1.1   thorpej 
    444        1.1   thorpej 	case MOD_UNLOAD:
    445        1.1   thorpej 		error = altq_module_deregister(data);
    446        1.1   thorpej 		break;
    447        1.1   thorpej 
    448        1.1   thorpej 	default:
    449        1.1   thorpej 		error = EINVAL;
    450        1.1   thorpej 		break;
    451        1.1   thorpej 	}
    452        1.1   thorpej 
    453        1.1   thorpej 	return(error);
    454        1.1   thorpej }
    455        1.6    itojun 
    456        1.1   thorpej #endif  /* ALTQ_KLD */
    457