2005-04-17 02:20:36 +04:00
/*
* Kernel CAPI 2.0 Module
2012-02-20 07:52:38 +04:00
*
2005-04-17 02:20:36 +04:00
* Copyright 1999 by Carsten Paeth < calle @ calle . de >
* Copyright 2002 by Kai Germaschewski < kai @ germaschewski . name >
2012-02-20 07:52:38 +04:00
*
2005-04-17 02:20:36 +04:00
* This software may be used and distributed according to the terms
* of the GNU General Public License , incorporated herein by reference .
*
*/
# include <linux/kernel.h>
# include <linux/spinlock.h>
# include <linux/list.h>
# include <linux/isdn/capilli.h>
# ifdef KCAPI_DEBUG
2012-02-20 07:52:38 +04:00
# define DBG(format, arg...) do { \
printk ( KERN_DEBUG " %s: " format " \n " , __func__ , # # arg ) ; \
} while ( 0 )
2005-04-17 02:20:36 +04:00
# else
# define DBG(format, arg...) /* */
# endif
enum {
2010-02-08 13:12:14 +03:00
CAPI_CTR_DETACHED = 0 ,
2010-02-08 13:12:10 +03:00
CAPI_CTR_DETECTED = 1 ,
CAPI_CTR_LOADING = 2 ,
CAPI_CTR_RUNNING = 3 ,
2005-04-17 02:20:36 +04:00
} ;
2010-02-08 13:12:10 +03:00
extern struct capi_ctr * capi_controller [ CAPI_MAXCONTR ] ;
2010-02-08 13:12:14 +03:00
extern struct mutex capi_controller_lock ;
extern struct capi20_appl * capi_applications [ CAPI_MAXAPPL ] ;
2005-04-17 02:20:36 +04:00
void kcapi_proc_init ( void ) ;
void kcapi_proc_exit ( void ) ;
2019-12-10 23:59:16 +03:00
struct capi20_appl {
u16 applid ;
capi_register_params rparam ;
void ( * recv_message ) ( struct capi20_appl * ap , struct sk_buff * skb ) ;
void * private ;
2005-04-17 02:20:36 +04:00
2019-12-10 23:59:16 +03:00
/* internal to kernelcapi.o */
unsigned long nrecvctlpkt ;
unsigned long nrecvdatapkt ;
unsigned long nsentctlpkt ;
unsigned long nsentdatapkt ;
struct mutex recv_mtx ;
struct sk_buff_head recv_queue ;
struct work_struct recv_work ;
int release_in_progress ;
} ;
2005-04-17 02:20:36 +04:00
2019-12-10 23:59:16 +03:00
u16 capi20_isinstalled ( void ) ;
u16 capi20_register ( struct capi20_appl * ap ) ;
u16 capi20_release ( struct capi20_appl * ap ) ;
u16 capi20_put_message ( struct capi20_appl * ap , struct sk_buff * skb ) ;
u16 capi20_get_manufacturer ( u32 contr , u8 buf [ CAPI_MANUFACTURER_LEN ] ) ;
u16 capi20_get_version ( u32 contr , struct capi_version * verp ) ;
u16 capi20_get_serial ( u32 contr , u8 serial [ CAPI_SERIAL_LEN ] ) ;
u16 capi20_get_profile ( u32 contr , struct capi_profile * profp ) ;
int capi20_manufacturer ( unsigned long cmd , void __user * data ) ;
# define CAPICTR_UP 0
# define CAPICTR_DOWN 1
int kcapi_init ( void ) ;
void kcapi_exit ( void ) ;
/*----- basic-type definitions -----*/
typedef __u8 * _cstruct ;
typedef enum {
CAPI_COMPOSE ,
CAPI_DEFAULT
} _cmstruct ;
/*
The _cmsg structure contains all possible CAPI 2.0 parameter .
All parameters are stored here first . The function CAPI_CMSG_2_MESSAGE
assembles the parameter and builds CAPI2 .0 conform messages .
CAPI_MESSAGE_2_CMSG disassembles CAPI 2.0 messages and stores the
parameter in the _cmsg structure
*/
typedef struct {
/* Header */
__u16 ApplId ;
__u8 Command ;
__u8 Subcommand ;
__u16 Messagenumber ;
/* Parameter */
union {
__u32 adrController ;
__u32 adrPLCI ;
__u32 adrNCCI ;
} adr ;
_cmstruct AdditionalInfo ;
_cstruct B1configuration ;
__u16 B1protocol ;
_cstruct B2configuration ;
__u16 B2protocol ;
_cstruct B3configuration ;
__u16 B3protocol ;
_cstruct BC ;
_cstruct BChannelinformation ;
_cmstruct BProtocol ;
_cstruct CalledPartyNumber ;
_cstruct CalledPartySubaddress ;
_cstruct CallingPartyNumber ;
_cstruct CallingPartySubaddress ;
__u32 CIPmask ;
__u32 CIPmask2 ;
__u16 CIPValue ;
__u32 Class ;
_cstruct ConnectedNumber ;
_cstruct ConnectedSubaddress ;
__u32 Data ;
__u16 DataHandle ;
__u16 DataLength ;
_cstruct FacilityConfirmationParameter ;
_cstruct Facilitydataarray ;
_cstruct FacilityIndicationParameter ;
_cstruct FacilityRequestParameter ;
__u16 FacilitySelector ;
__u16 Flags ;
__u32 Function ;
_cstruct HLC ;
__u16 Info ;
_cstruct InfoElement ;
__u32 InfoMask ;
__u16 InfoNumber ;
_cstruct Keypadfacility ;
_cstruct LLC ;
_cstruct ManuData ;
__u32 ManuID ;
_cstruct NCPI ;
__u16 Reason ;
__u16 Reason_B3 ;
__u16 Reject ;
_cstruct Useruserdata ;
/* intern */
unsigned l , p ;
unsigned char * par ;
__u8 * m ;
/* buffer to construct message */
__u8 buf [ 180 ] ;
} _cmsg ;
/*-----------------------------------------------------------------------*/
/*
* Debugging / Tracing functions
*/
char * capi_cmd2str ( __u8 cmd , __u8 subcmd ) ;
typedef struct {
u_char * buf ;
u_char * p ;
size_t size ;
size_t pos ;
} _cdebbuf ;
# define CDEBUG_SIZE 1024
# define CDEBUG_GSIZE 4096
void cdebbuf_free ( _cdebbuf * cdb ) ;
int cdebug_init ( void ) ;
void cdebug_exit ( void ) ;
_cdebbuf * capi_message2str ( __u8 * msg ) ;