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/cd/cd_daed.c#ident "@(#) $RCSfile: cd_daed.c,v $ $Name: $($Revision: 0.8.2.2 $) $Date: 2003/06/25 09:54:03 $" static char const ident[] = "$RCSfile: cd_daed.c,v $ $Name: $($Revision: 0.8.2.2 $) $Date: 2003/06/25 09:54:03 $"; #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/cdi.h> #include <sys/cdi_daed.h> #include <ss7/chi.h> #include <ss7/chi_ioctl.h> #include <ss7/lmi.h> #include <ss7/lmi_ioctl.h> #include <ss7/hdlc_ioctl.h> #include "../debug.h" #include "../bufq.h" #include "../priv.h" #include "../lock.h" #include "../queue.h" #include "../allocb.h" #include "../timer.h" #include "cd.h" #define DAED_DESCRIP "Q.703/T1.111.3 DAED: (Delimination Alignment and Error Detection) STREAMS MODULE." #define DAED_COPYRIGHT "Copyright (c) 1997-2003 OpenSS7 Corporation. All Rights Reserved." #define DAED_DEVICES "Supports OpenSS7 Channel Drivers." #define DAED_CONTACT "Brian Bidulock <bidulock@openss7.org>" #define DAED_LICENSE "GPL" #define DAED_BANNER DAED_DESCRIP "\n" \ DAED_COPYRIGHT "\n" \ DAED_DEVICES "\n" \ DAED_CONTACT "\n" MODULE_AUTHOR(DAED_CONTACT); MODULE_DESCRIPTION(DAED_DESCRIP); MODULE_SUPPORTED_DEVICE(DAED_DEVICES); #ifdef MODULE_LICENSE MODULE_LICENSE(DAED_LICENSE); #endif /* * ======================================================================= * * STREAMS Definitions * * ======================================================================= */ #define DAED_MOD_ID 0 #define DAED_MOD_NAME "daed" STATIC struct module_info daed_winfo = { mi_idnum:DAED_MOD_ID, /* Module ID number */ mi_idname:DAED_MOD_NAME "-wr", /* Module name */ mi_minpsz:(1), /* Min packet size accepted */ mi_maxpsz:INFPSZ, /* Max packet size accepted */ mi_hiwat:(1), /* Hi water mark */ mi_lowat:(0), /* Lo water mark */ }; STATIC struct module_info daed_rinfo = { mi_idnum:DAED_MOD_ID, /* Module ID number */ mi_idname:DAED_MOD_NAME "-rd", /* Module name */ mi_minpsz:(1), /* 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 daed_open(queue_t *, dev_t *, int, int, cred_t *); STATIC int daed_close(queue_t *, int, cred_t *); STATIC struct qinit daed_rinit = { qi_putp:ss7_oput, /* Read put (message from below) */ qi_srvp:ss7_osrv, /* Read queue service */ qi_qopen:daed_open, /* Each open */ qi_qclose:daed_close, /* Last close */ qi_minfo:&daed_rinfo, /* Information */ }; STATIC struct qinit daed_winit = { qi_putp:ss7_iput, /* Write put (message from above) */ qi_srvp:ss7_isrv, /* Write queue service */ qi_minfo:&daed_winfo, /* Information */ }; STATIC struct streamtab daed_info = { st_rdinit:&daed_rinit, /* Upper read queue */ st_wrinit:&daed_winit, /* Upper write queue */ }; /* * ========================================================================= * * OPEN and CLOSE * * ========================================================================= */ /* * OPEN * ------------------------------------------------------------------------- */ STATIC struct str *daed_list = NULL; STATIC int daed_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *crp) { MOD_INC_USE_COUNT; /* keep module from unloading in our face */ if (q->q_ptr != NULL) { MOD_DEC_USE_COUNT; return (0); /* already open */ } if (sflag == MODOPEN || WR(q)->q_next != NULL) { int cmajor = getmajor(*devp); int cminor = getminor(*devp); struct str *str; /* test for multiple push */ for (str = daed_list; str; str = str->next) { if (str->u.dev.cmajor == cmajor && str->u.dev.cminor == cminor) { MOD_DEC_USE_COUNT; return (ENXIO); } } if (!(str = cd_alloc_priv(q, &daed_list, devp, crp, CD_DAED))) { MOD_DEC_USE_COUNT; return (ENOMEM); } return (0); } MOD_DEC_USE_COUNT; return (EIO); } /* * CLOSE * ------------------------------------------------------------------------- */ STATIC int daed_close(queue_t *q, int flag, cred_t *crp) { (void) flag; (void) crp; cd_free_priv(q); MOD_DEC_USE_COUNT; return (0); } /* * ======================================================================= * * LiS Module Initialization (For unregistered driver.) * * ======================================================================= */ STATIC int daed_initialized = 0; STATIC void daed_init(void) { unless(daed_initialized > 0, return); cmn_err(CE_NOTE, DAED_BANNER); /* console splash */ if ((daed_initialized = lis_register_strmod(&daed_info, DAED_MOD_NAME)) < 0) { cmn_err(CE_WARN, "%s: couldn't register module", DAED_MOD_NAME); return; } daed_initialized = 1; return; } STATIC void daed_terminate(void) { ensure(daed_initialized > 0, return); if ((daed_initialized = lis_unregister_strmod(&daed_info)) < 0) { cmn_err(CE_PANIC, "%s: couldn't unregister module", DAED_MOD_NAME); return; } daed_initialized = 0; return; } /* * ======================================================================= * * Kernel Module Initialization * * ======================================================================= */ int init_module(void) { daed_init(); if (daed_initialized < 0) return daed_initialized; return (0); } void cleanup_module(void) { daed_terminate(); }
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |