OpenSS7 SS7 for the Common Man |
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
||||||||||||||||||||||||||
Home | Overview | Status | News | Documentation | Resources | About | |||||||||||||||||||||
File /code/strss7/drivers/dl/dl.c#ident "@(#) $RCSfile: dl.c,v $ $Name: $($Revision: 0.8.2.9 $) $Date: 2003/06/25 09:38:21 $" static char const ident[] = "$RCSfile: dl.c,v $ $Name: $($Revision: 0.8.2.9 $) $Date: 2003/06/25 09:38:21 $"; #include <linux/config.h> #include <linux/version.h> #ifdef MODVERSIONS #include <linux/modversions.h> #endif #include <linux/module.h> #include <sys/stream.h> #include <sys/stropts.h> #include <sys/cmn_err.h> #include <sys/dki.h> #include <sys/ddi.h> #include <sys/osif.h> #include "../debug.h" #define DL_DESCRIP "Data Link (DL) STREAMS MULTIPLEXING DRIVER ($Revision: 0.8.2.9 $)" #define DL_COPYRIGHT "Copyright (c) 1997-2003 OpenSS7 Corporation. All Rights Reserved." #define DL_DEVICE "OpenSS7 CDI Devices." #define DL_CONTACT "Brian Bidulock <bidulock@openss7.org>" #define DL_LICENSE "GPL" #define DL_BANNER DL_DESCRIP "\n" \ DL_COPYRIGHT "\n" \ DL_DEVICE "\n" \ DL_CONTACT MODULE_AUTHOR(DL_CONTACT); MODULE_DESCRIPTION(DL_DESCRIP); MODULE_SUPPORTED_DEVICE(DL_DEVICE); #ifdef MODULE_LICENSE MODULE_LICENSE(DL_LICENSE); #endif /* * ========================================================================= * * STREAMS Definitions * * ========================================================================= */ #define DL_DRV_ID 'd' #define DL_DRV_NAME "dl" STATIC struct module_info dl_xinfo = { mi_idnum:DL_DRV_ID, /* Module ID number */ mi_idname:DL_DRV_NAME, /* Module ID name */ mi_minpsz:(0), /* Min packet size accepted */ mi_maxpsz:INFPSZ, /* Max packet size accepted */ mi_hiwat:(1), /* Hi water mark */ mi_lowat:(0), /* Lo water mark */ }; STATIC int dl_open(queue_t *, dev_t *, int, int, cred_t *); STATIC int dl_close(queue_t *, int, cred_t *); STATIC struct qinit dl_xinit = { qi_qopen:dl_open, /* Each open */ qi_qclose:dl_close, /* Last close */ qi_minfo:&dl_xinfo, /* Information */ }; STATIC struct streamtab dl_info = { st_rdinit:&dl_xinit, /* Upper read queue */ st_wrinit:&dl_xinit, /* Upper write queue */ }; /* * ========================================================================= * * OPEN AND CLOSE * * ========================================================================= */ STATIC char drvname[LIS_NAMESZ+9]; STATIC int dl_majors[256]; STATIC const char *dl_modules[256] = { "dl", "dl-dua", "dl-gr303", "dl-gr303ua", "dl-gsma", "dl-h225", "dl-iua", "dl-lapb", "dl-lapd", "dl-lapf", "dl-v52", "dl-v5ua", }; /* * ========================================================================= * * OPEN AND CLOSE * * ========================================================================= */ STATIC int dl_find_strdev(const char *devname) { int i; for (i = 0; i < MAX_STRDEV; i++) if (lis_fstr_sw[i].f_str) if (strncmp(devname, lis_fstr_sw[i].f_name, LIS_NAMESZ) == 0) return (i); return (-1); } /* * Open * ------------------------------------------------------------------------- * This open function automatically loads the appropriate kernel modules and * calls the appropriate driver for the minor device number opened. Note * that we do an lis_setq and call the actual driver's open function, so we * should never return here. */ STATIC int dl_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *crp) { uchar cmajor; uchar cminor = getminor(*devp); const char *devname; struct streamtab *stab = NULL; int err; if (cminor == 0) return (ENOENT); /* would loop */ if ((cmajor = dl_majors[cminor])) { if (!(stab = lis_find_strdev(dl_majors[cminor]))) cmajor = dl_majors[cminor] = 0; else if (strncmp(dl_modules[cminor], lis_fstr_sw[cmajor].f_name, LIS_NAMESZ) != 0) { /* name changed */ stab = NULL; cmajor = dl_majors[cminor] = 0; } } if (!cmajor) { if (!(devname = dl_modules[cminor])) return (ENOENT); if ((err = dl_find_strdev(devname)) < 0) { sprintf(drvname, "streams-%s", devname); if ((err = request_module(drvname))) return (err < 0 ? -err : err); if ((err = dl_find_strdev(devname)) < 0) return (ENOENT); } cmajor = err; } if (!(stab = lis_find_strdev(cmajor))) return (ENOENT); lis_setq(q, stab->st_rdinit, stab->st_wrinit); if (!q->q_qinfo->qi_qopen) { swerr(); return (EIO); } return (*q->q_qinfo->qi_qopen) (q, devp, flag, CLONEOPEN, crp); } /* * Close * ------------------------------------------------------------------------- */ STATIC int dl_close(queue_t *q, int flag, cred_t *crp) { (void) q; (void) flag; (void) crp; swerr(); return (EIO); } /* * ========================================================================= * * LIS MODULE INITIALIZATION * * ========================================================================= */ #define MODULE_STATIC STATIC STATIC int dl_initialized = 0; MODULE_STATIC void dl_init(void) { int rtn; unless(dl_initialized, return); cmn_err(CE_NOTE, DL_BANNER); /* console splash */ if ((rtn = lis_register_strdev(dl_majors[0], &dl_info, 255, DL_DRV_NAME)) <= 0) { cmn_err(CE_PANIC, "%s: Cannot register major %d", DL_DRV_NAME, dl_majors[0]); dl_initialized = rtn; return; } dl_majors[0] = rtn; LIS_DEVFLAGS(rtn) |= LIS_MODFLG_CLONE; dl_initialized = 1; return; } MODULE_STATIC void dl_terminate(void) { int rtn; if (dl_majors[0]) { if ((rtn = lis_unregister_strdev(dl_majors[0]))) cmn_err(CE_PANIC, "%s: Cannot unregister major %d\n", DL_DRV_NAME, dl_majors[0]); dl_majors[0] = 0; } return; } /* * ========================================================================= * * LINUX MODULE INITIALIZATION * * ========================================================================= */ int init_module(void) { dl_init(); if (dl_initialized < 0) return dl_initialized; return (0); } void cleanup_module(void) { dl_terminate(); }
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |