1 /* $Id: capi.h,v 1.1.4.1 2001/11/20 14:19:34 kai Exp $
2  *
3  * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000.
4  *
5  * Author       Fritz Elfert
6  * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
7  *
8  * This software may be used and distributed according to the terms
9  * of the GNU General Public License, incorporated herein by reference.
10  *
11  * Thanks to Friedemann Baitinger and IBM Germany
12  *
13  */
14 
15 #ifndef CAPI_H
16 #define CAPI_H
17 
18 /* Command-part of a CAPI message */
19 typedef struct actcapi_msgcmd {
20 	__u8 cmd;
21 	__u8 subcmd;
22 } actcapi_msgcmd;
23 
24 /* CAPI message header */
25 typedef struct actcapi_msghdr {
26 	__u16 len;
27 	__u16 applicationID;
28 	actcapi_msgcmd cmd;
29 	__u16 msgnum;
30 } actcapi_msghdr;
31 
32 /* CAPI message description (for debugging) */
33 typedef struct actcapi_msgdsc {
34 	actcapi_msgcmd cmd;
35 	char *description;
36 } actcapi_msgdsc;
37 
38 /* CAPI Address */
39 typedef struct actcapi_addr {
40 	__u8 len;                            /* Length of element            */
41 	__u8 tnp;                            /* Type/Numbering Plan          */
42 	__u8 num[20];                        /* Caller ID                    */
43 } actcapi_addr;
44 
45 /* CAPI INFO element mask */
46 typedef  union actcapi_infonr {              /* info number                  */
47 	__u16 mask;                          /* info-mask field              */
48 	struct bmask {                       /* bit definitions              */
49 		unsigned  codes : 3;         /* code set                     */
50 		unsigned  rsvd  : 5;         /* reserved                     */
51 		unsigned  svind : 1;         /* single, variable length ind. */
52 		unsigned  wtype : 7;         /* W-element type               */
53 	} bmask;
54 } actcapi_infonr;
55 
56 /* CAPI INFO element */
57 typedef union  actcapi_infoel {              /* info element                 */
58 	__u8 len;                            /* length of info element       */
59 	__u8 display[40];                    /* display contents             */
60 	__u8 uuinfo[40];                     /* User-user info field         */
61 	struct cause {                       /* Cause information            */
62 		unsigned ext2  : 1;          /* extension                    */
63 		unsigned cod   : 2;          /* coding standard              */
64 		unsigned spare : 1;          /* spare                        */
65 		unsigned loc   : 4;          /* location                     */
66 		unsigned ext1  : 1;          /* extension                    */
67 		unsigned cval  : 7;          /* Cause value                  */
68 	} cause;
69 	struct charge {                      /* Charging information         */
70 		__u8 toc;                    /* type of charging info        */
71 		__u8 unit[10];               /* charging units               */
72 	} charge;
73 	__u8 date[20];                       /* date fields                  */
74 	__u8 stat;                           /* state of remote party        */
75 } actcapi_infoel;
76 
77 /* Message for EAZ<->MSN Mapping */
78 typedef struct actcapi_msn {
79 	__u8 eaz;
80 	__u8 len;                            /* Length of MSN                */
81 	__u8 msn[15] __attribute__ ((packed));
82 } actcapi_msn;
83 
84 typedef struct actcapi_dlpd {
85 	__u8 len;                            /* Length of structure          */
86 	__u16 dlen __attribute__ ((packed)); /* Data Length                  */
87 	__u8 laa __attribute__ ((packed));   /* Link Address A               */
88 	__u8 lab;                            /* Link Address B               */
89 	__u8 modulo;                         /* Modulo Mode                  */
90 	__u8 win;                            /* Window size                  */
91 	__u8 xid[100];                       /* XID Information              */
92 } actcapi_dlpd;
93 
94 typedef struct actcapi_ncpd {
95 	__u8   len;                          /* Length of structure          */
96 	__u16  lic __attribute__ ((packed));
97 	__u16  hic __attribute__ ((packed));
98 	__u16  ltc __attribute__ ((packed));
99 	__u16  htc __attribute__ ((packed));
100 	__u16  loc __attribute__ ((packed));
101 	__u16  hoc __attribute__ ((packed));
102 	__u8   modulo __attribute__ ((packed));
103 } actcapi_ncpd;
104 #define actcapi_ncpi actcapi_ncpd
105 
106 /*
107  * Layout of NCCI field in a B3 DATA CAPI message is different from
108  * standard at act2000:
109  *
110  * Bit 0-4  = PLCI
111  * Bit 5-7  = Controller
112  * Bit 8-15 = NCCI
113  */
114 #define MAKE_NCCI(plci,contr,ncci) \
115         ((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
116 
117 #define EVAL_NCCI(fakencci,plci,contr,ncci) { \
118 	plci  = fakencci & 0x1f; \
119 	contr = (fakencci >> 5) & 0x7; \
120 	ncci  = (fakencci >> 8) & 0xff; \
121 }
122 
123 /*
124  * Layout of PLCI field in a B3 DATA CAPI message is different from
125  * standard at act2000:
126  *
127  * Bit 0-4  = PLCI
128  * Bit 5-7  = Controller
129  * Bit 8-15 = reserved (must be 0)
130  */
131 #define MAKE_PLCI(plci,contr) \
132         ((plci & 0x1f) | ((contr & 0x7) << 5))
133 
134 #define EVAL_PLCI(fakeplci,plci,contr) { \
135 	plci  = fakeplci & 0x1f; \
136 	contr = (fakeplci >> 5) & 0x7; \
137 }
138 
139 typedef struct actcapi_msg {
140 	actcapi_msghdr hdr;
141 	union msg {
142 		__u16 manuf_msg;
143 		struct manufacturer_req_net {
144 			__u16 manuf_msg;
145 			__u16 controller;
146 			__u8  nettype;
147 		} manufacturer_req_net;
148 		struct manufacturer_req_v42 {
149 			__u16 manuf_msg;
150 			__u16 controller;
151 			__u32 v42control;
152 		} manufacturer_req_v42;
153 		struct manufacturer_conf_v42 {
154 			__u16 manuf_msg;
155 			__u16 controller;
156 		} manufacturer_conf_v42;
157 		struct manufacturer_req_err {
158 			__u16 manuf_msg;
159 			__u16 controller;
160 		} manufacturer_req_err;
161 		struct manufacturer_ind_err {
162 			__u16 manuf_msg;
163 			__u16 controller;
164 			__u32 errcode;
165 			__u8  errstring; /* actually up to 160 */
166 		} manufacturer_ind_err;
167 		struct manufacturer_req_msn {
168 			__u16 manuf_msg;
169 			__u16 controller;
170 			actcapi_msn msnmap;
171 		} manufacturer_req_msn;
172 		/* TODO: TraceInit-req/conf/ind/resp and
173 		 *       TraceDump-req/conf/ind/resp
174 		 */
175 		struct connect_req {
176 			__u8  controller;
177 			__u8  bchan;
178 			__u32 infomask __attribute__ ((packed));
179 			__u8  si1;
180 			__u8  si2;
181 			__u8  eaz;
182 			actcapi_addr addr;
183 		} connect_req;
184 		struct connect_conf {
185 			__u16 plci;
186 			__u16 info;
187 		} connect_conf;
188 		struct connect_ind {
189 			__u16 plci;
190 			__u8  controller;
191 			__u8  si1;
192 			__u8  si2;
193 			__u8  eaz;
194 			actcapi_addr addr;
195 		} connect_ind;
196 		struct connect_resp {
197 			__u16 plci;
198 			__u8  rejectcause;
199 		} connect_resp;
200 		struct connect_active_ind {
201 			__u16 plci;
202 			actcapi_addr addr;
203 		} connect_active_ind;
204 		struct connect_active_resp {
205 			__u16 plci;
206 		} connect_active_resp;
207 		struct connect_b3_req {
208 			__u16 plci;
209 			actcapi_ncpi ncpi;
210 		} connect_b3_req;
211 		struct connect_b3_conf {
212 			__u16 plci;
213 			__u16 ncci;
214 			__u16 info;
215 		} connect_b3_conf;
216 		struct connect_b3_ind {
217 			__u16 ncci;
218 			__u16 plci;
219 			actcapi_ncpi ncpi;
220 		} connect_b3_ind;
221 		struct connect_b3_resp {
222 			__u16 ncci;
223 			__u8  rejectcause;
224 			actcapi_ncpi ncpi __attribute__ ((packed));
225 		} connect_b3_resp;
226 		struct disconnect_req {
227 			__u16 plci;
228 			__u8  cause;
229 		} disconnect_req;
230 		struct disconnect_conf {
231 			__u16 plci;
232 			__u16 info;
233 		} disconnect_conf;
234 		struct disconnect_ind {
235 			__u16 plci;
236 			__u16 info;
237 		} disconnect_ind;
238 		struct disconnect_resp {
239 			__u16 plci;
240 		} disconnect_resp;
241 		struct connect_b3_active_ind {
242 			__u16 ncci;
243 			actcapi_ncpi ncpi;
244 		} connect_b3_active_ind;
245 		struct connect_b3_active_resp {
246 			__u16 ncci;
247 		} connect_b3_active_resp;
248 		struct disconnect_b3_req {
249 			__u16 ncci;
250 			actcapi_ncpi ncpi;
251 		} disconnect_b3_req;
252 		struct disconnect_b3_conf {
253 			__u16 ncci;
254 			__u16 info;
255 		} disconnect_b3_conf;
256 		struct disconnect_b3_ind {
257 			__u16 ncci;
258 			__u16 info;
259 			actcapi_ncpi ncpi;
260 		} disconnect_b3_ind;
261 		struct disconnect_b3_resp {
262 			__u16 ncci;
263 		} disconnect_b3_resp;
264 		struct info_ind {
265 			__u16 plci;
266 			actcapi_infonr nr;
267 			actcapi_infoel el;
268 		} info_ind;
269 		struct info_resp {
270 			__u16 plci;
271 		} info_resp;
272 		struct listen_b3_req {
273 			__u16 plci;
274 		} listen_b3_req;
275 		struct listen_b3_conf {
276 			__u16 plci;
277 			__u16 info;
278 		} listen_b3_conf;
279 		struct select_b2_protocol_req {
280 			__u16 plci;
281 			__u8  protocol;
282 			actcapi_dlpd dlpd __attribute__ ((packed));
283 		} select_b2_protocol_req;
284 		struct select_b2_protocol_conf {
285 			__u16 plci;
286 			__u16 info;
287 		} select_b2_protocol_conf;
288 		struct select_b3_protocol_req {
289 			__u16 plci;
290 			__u8  protocol;
291 			actcapi_ncpd ncpd __attribute__ ((packed));
292 		} select_b3_protocol_req;
293 		struct select_b3_protocol_conf {
294 			__u16 plci;
295 			__u16 info;
296 		} select_b3_protocol_conf;
297 		struct listen_req {
298 			__u8  controller;
299 			__u32 infomask __attribute__ ((packed));
300 			__u16 eazmask __attribute__ ((packed));
301 			__u16 simask __attribute__ ((packed));
302 		} listen_req;
303 		struct listen_conf {
304 			__u8  controller;
305 			__u16 info __attribute__ ((packed));
306 		} listen_conf;
307 		struct data_b3_req {
308 			__u16 fakencci;
309 			__u16 datalen;
310 			__u32 unused;
311 			__u8  blocknr;
312 			__u16 flags __attribute__ ((packed));
313 		} data_b3_req;
314 		struct data_b3_ind {
315 			__u16 fakencci;
316 			__u16 datalen;
317 			__u32 unused;
318 			__u8  blocknr;
319 			__u16 flags __attribute__ ((packed));
320 		} data_b3_ind;
321 		struct data_b3_resp {
322 			__u16 ncci;
323 			__u8  blocknr;
324 		} data_b3_resp;
325 		struct data_b3_conf {
326 			__u16 ncci;
327 			__u8  blocknr;
328 			__u16 info __attribute__ ((packed));
329 		} data_b3_conf;
330 	} msg;
331 } actcapi_msg;
332 
333 static inline unsigned short
actcapi_nextsmsg(act2000_card * card)334 actcapi_nextsmsg(act2000_card *card)
335 {
336 	unsigned long flags;
337 	unsigned short n;
338 
339 	save_flags(flags);
340 	cli();
341 	n = card->msgnum;
342 	card->msgnum++;
343 	card->msgnum &= 0x7fff;
344 	restore_flags(flags);
345 	return n;
346 }
347 #define DEBUG_MSG
348 #undef DEBUG_DATA_MSG
349 #undef DEBUG_DUMP_SKB
350 
351 extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *);
352 extern int actcapi_listen_req(act2000_card *);
353 extern int actcapi_manufacturer_req_net(act2000_card *);
354 extern int actcapi_manufacturer_req_v42(act2000_card *, ulong);
355 extern int actcapi_manufacturer_req_errh(act2000_card *);
356 extern int actcapi_manufacturer_req_msn(act2000_card *);
357 extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int);
358 extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *);
359 extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *);
360 extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8);
361 extern void actcapi_dispatch(act2000_card *);
362 #ifdef DEBUG_MSG
363 extern void actcapi_debug_msg(struct sk_buff *skb, int);
364 #else
365 #define actcapi_debug_msg(skb, len)
366 #endif
367 #endif
368