blob: 479623e1db2a449d3404f291c550dfe2b5a933a4 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Kernel CAPI 2.0 Module
Joe Perches475be4d2012-02-19 19:52:38 -08003 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 * Copyright 1999 by Carsten Paeth <calle@calle.de>
5 * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name>
Joe Perches475be4d2012-02-19 19:52:38 -08006 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 * This software may be used and distributed according to the terms
8 * of the GNU General Public License, incorporated herein by reference.
9 *
10 */
11
12
13#include <linux/kernel.h>
14#include <linux/spinlock.h>
15#include <linux/list.h>
16#include <linux/isdn/capilli.h>
17
18#ifdef KCAPI_DEBUG
Joe Perches475be4d2012-02-19 19:52:38 -080019#define DBG(format, arg...) do { \
20 printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \
21 } while (0)
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#else
23#define DBG(format, arg...) /* */
24#endif
25
26enum {
Jan Kiszka0ca3a012010-02-08 10:12:14 +000027 CAPI_CTR_DETACHED = 0,
Jan Kiszka52253032010-02-08 10:12:10 +000028 CAPI_CTR_DETECTED = 1,
29 CAPI_CTR_LOADING = 2,
30 CAPI_CTR_RUNNING = 3,
Linus Torvalds1da177e2005-04-16 15:20:36 -070031};
32
Jan Kiszka52253032010-02-08 10:12:10 +000033extern struct capi_ctr *capi_controller[CAPI_MAXCONTR];
Jan Kiszka0ca3a012010-02-08 10:12:14 +000034extern struct mutex capi_controller_lock;
35
36extern struct capi20_appl *capi_applications[CAPI_MAXAPPL];
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
Linus Torvalds1da177e2005-04-16 15:20:36 -070038void kcapi_proc_init(void);
39void kcapi_proc_exit(void);
40
Arnd Bergmannf59aba2f72019-12-10 21:59:16 +010041struct capi20_appl {
42 u16 applid;
43 capi_register_params rparam;
44 void (*recv_message)(struct capi20_appl *ap, struct sk_buff *skb);
45 void *private;
Linus Torvalds1da177e2005-04-16 15:20:36 -070046
Arnd Bergmannf59aba2f72019-12-10 21:59:16 +010047 /* internal to kernelcapi.o */
48 unsigned long nrecvctlpkt;
49 unsigned long nrecvdatapkt;
50 unsigned long nsentctlpkt;
51 unsigned long nsentdatapkt;
52 struct mutex recv_mtx;
53 struct sk_buff_head recv_queue;
54 struct work_struct recv_work;
55 int release_in_progress;
56};
Linus Torvalds1da177e2005-04-16 15:20:36 -070057
Arnd Bergmannf59aba2f72019-12-10 21:59:16 +010058u16 capi20_isinstalled(void);
59u16 capi20_register(struct capi20_appl *ap);
60u16 capi20_release(struct capi20_appl *ap);
61u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb);
62u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]);
63u16 capi20_get_version(u32 contr, struct capi_version *verp);
64u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]);
65u16 capi20_get_profile(u32 contr, struct capi_profile *profp);
66int capi20_manufacturer(unsigned long cmd, void __user *data);
67
68#define CAPICTR_UP 0
69#define CAPICTR_DOWN 1
70
71int kcapi_init(void);
72void kcapi_exit(void);
73
74/*----- basic-type definitions -----*/
75
76typedef __u8 *_cstruct;
77
78typedef enum {
79 CAPI_COMPOSE,
80 CAPI_DEFAULT
81} _cmstruct;
82
83/*
84 The _cmsg structure contains all possible CAPI 2.0 parameter.
85 All parameters are stored here first. The function CAPI_CMSG_2_MESSAGE
86 assembles the parameter and builds CAPI2.0 conform messages.
87 CAPI_MESSAGE_2_CMSG disassembles CAPI 2.0 messages and stores the
88 parameter in the _cmsg structure
89 */
90
91typedef struct {
92 /* Header */
93 __u16 ApplId;
94 __u8 Command;
95 __u8 Subcommand;
96 __u16 Messagenumber;
97
98 /* Parameter */
99 union {
100 __u32 adrController;
101 __u32 adrPLCI;
102 __u32 adrNCCI;
103 } adr;
104
105 _cmstruct AdditionalInfo;
106 _cstruct B1configuration;
107 __u16 B1protocol;
108 _cstruct B2configuration;
109 __u16 B2protocol;
110 _cstruct B3configuration;
111 __u16 B3protocol;
112 _cstruct BC;
113 _cstruct BChannelinformation;
114 _cmstruct BProtocol;
115 _cstruct CalledPartyNumber;
116 _cstruct CalledPartySubaddress;
117 _cstruct CallingPartyNumber;
118 _cstruct CallingPartySubaddress;
119 __u32 CIPmask;
120 __u32 CIPmask2;
121 __u16 CIPValue;
122 __u32 Class;
123 _cstruct ConnectedNumber;
124 _cstruct ConnectedSubaddress;
125 __u32 Data;
126 __u16 DataHandle;
127 __u16 DataLength;
128 _cstruct FacilityConfirmationParameter;
129 _cstruct Facilitydataarray;
130 _cstruct FacilityIndicationParameter;
131 _cstruct FacilityRequestParameter;
132 __u16 FacilitySelector;
133 __u16 Flags;
134 __u32 Function;
135 _cstruct HLC;
136 __u16 Info;
137 _cstruct InfoElement;
138 __u32 InfoMask;
139 __u16 InfoNumber;
140 _cstruct Keypadfacility;
141 _cstruct LLC;
142 _cstruct ManuData;
143 __u32 ManuID;
144 _cstruct NCPI;
145 __u16 Reason;
146 __u16 Reason_B3;
147 __u16 Reject;
148 _cstruct Useruserdata;
149
150 /* intern */
151 unsigned l, p;
152 unsigned char *par;
153 __u8 *m;
154
155 /* buffer to construct message */
156 __u8 buf[180];
157
158} _cmsg;
159
160/*-----------------------------------------------------------------------*/
161
162/*
163 * Debugging / Tracing functions
164 */
165
166char *capi_cmd2str(__u8 cmd, __u8 subcmd);
167
168typedef struct {
169 u_char *buf;
170 u_char *p;
171 size_t size;
172 size_t pos;
173} _cdebbuf;
174
175#define CDEBUG_SIZE 1024
176#define CDEBUG_GSIZE 4096
177
178void cdebbuf_free(_cdebbuf *cdb);
179int cdebug_init(void);
180void cdebug_exit(void);
181
182_cdebbuf *capi_message2str(__u8 *msg);