Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* $Id: capi.h,v 1.6.6.2 2001/09/23 22:24:32 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 */ | |
9fe656e9 JB |
81 | __u8 msn[15]; |
82 | } __attribute__((packed)) actcapi_msn; | |
1da177e4 LT |
83 | |
84 | typedef struct actcapi_dlpd { | |
85 | __u8 len; /* Length of structure */ | |
9fe656e9 JB |
86 | __u16 dlen; /* Data Length */ |
87 | __u8 laa; /* Link Address A */ | |
1da177e4 LT |
88 | __u8 lab; /* Link Address B */ |
89 | __u8 modulo; /* Modulo Mode */ | |
90 | __u8 win; /* Window size */ | |
91 | __u8 xid[100]; /* XID Information */ | |
9fe656e9 | 92 | } __attribute__((packed)) actcapi_dlpd; |
1da177e4 LT |
93 | |
94 | typedef struct actcapi_ncpd { | |
95 | __u8 len; /* Length of structure */ | |
9fe656e9 JB |
96 | __u16 lic; |
97 | __u16 hic; | |
98 | __u16 ltc; | |
99 | __u16 htc; | |
100 | __u16 loc; | |
101 | __u16 hoc; | |
102 | __u8 modulo; | |
103 | } __attribute__((packed)) actcapi_ncpd; | |
1da177e4 LT |
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 { | |
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; | |
9fe656e9 | 171 | } __attribute ((packed)) manufacturer_req_msn; |
1da177e4 LT |
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; | |
9fe656e9 | 178 | __u32 infomask; |
1da177e4 LT |
179 | __u8 si1; |
180 | __u8 si2; | |
181 | __u8 eaz; | |
182 | actcapi_addr addr; | |
9fe656e9 | 183 | } __attribute__ ((packed)) connect_req; |
1da177e4 LT |
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; | |
9fe656e9 | 195 | } __attribute__ ((packed)) connect_ind; |
1da177e4 LT |
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; | |
9fe656e9 | 203 | } __attribute__ ((packed)) connect_active_ind; |
1da177e4 LT |
204 | struct connect_active_resp { |
205 | __u16 plci; | |
206 | } connect_active_resp; | |
207 | struct connect_b3_req { | |
208 | __u16 plci; | |
209 | actcapi_ncpi ncpi; | |
9fe656e9 | 210 | } __attribute__ ((packed)) connect_b3_req; |
1da177e4 LT |
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; | |
9fe656e9 | 220 | } __attribute__ ((packed)) connect_b3_ind; |
1da177e4 LT |
221 | struct connect_b3_resp { |
222 | __u16 ncci; | |
223 | __u8 rejectcause; | |
9fe656e9 JB |
224 | actcapi_ncpi ncpi; |
225 | } __attribute__ ((packed)) connect_b3_resp; | |
1da177e4 LT |
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; | |
9fe656e9 | 244 | } __attribute__ ((packed)) connect_b3_active_ind; |
1da177e4 LT |
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; | |
9fe656e9 | 251 | } __attribute__ ((packed)) disconnect_b3_req; |
1da177e4 LT |
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; | |
9fe656e9 | 260 | } __attribute__ ((packed)) disconnect_b3_ind; |
1da177e4 LT |
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; | |
9fe656e9 | 268 | } __attribute__ ((packed)) info_ind; |
1da177e4 LT |
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; | |
9fe656e9 JB |
282 | actcapi_dlpd dlpd; |
283 | } __attribute__ ((packed)) select_b2_protocol_req; | |
1da177e4 LT |
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; | |
9fe656e9 JB |
291 | actcapi_ncpd ncpd; |
292 | } __attribute__ ((packed)) select_b3_protocol_req; | |
1da177e4 LT |
293 | struct select_b3_protocol_conf { |
294 | __u16 plci; | |
295 | __u16 info; | |
296 | } select_b3_protocol_conf; | |
297 | struct listen_req { | |
298 | __u8 controller; | |
9fe656e9 JB |
299 | __u32 infomask; |
300 | __u16 eazmask; | |
301 | __u16 simask; | |
302 | } __attribute__ ((packed)) listen_req; | |
1da177e4 LT |
303 | struct listen_conf { |
304 | __u8 controller; | |
9fe656e9 JB |
305 | __u16 info; |
306 | } __attribute__ ((packed)) listen_conf; | |
1da177e4 LT |
307 | struct data_b3_req { |
308 | __u16 fakencci; | |
309 | __u16 datalen; | |
310 | __u32 unused; | |
311 | __u8 blocknr; | |
9fe656e9 JB |
312 | __u16 flags; |
313 | } __attribute ((packed)) data_b3_req; | |
1da177e4 LT |
314 | struct data_b3_ind { |
315 | __u16 fakencci; | |
316 | __u16 datalen; | |
317 | __u32 unused; | |
318 | __u8 blocknr; | |
9fe656e9 JB |
319 | __u16 flags; |
320 | } __attribute__ ((packed)) data_b3_ind; | |
1da177e4 LT |
321 | struct data_b3_resp { |
322 | __u16 ncci; | |
323 | __u8 blocknr; | |
9fe656e9 | 324 | } __attribute__ ((packed)) data_b3_resp; |
1da177e4 LT |
325 | struct data_b3_conf { |
326 | __u16 ncci; | |
327 | __u8 blocknr; | |
9fe656e9 JB |
328 | __u16 info; |
329 | } __attribute__ ((packed)) data_b3_conf; | |
1da177e4 | 330 | } msg; |
9fe656e9 | 331 | } __attribute__ ((packed)) actcapi_msg; |
1da177e4 | 332 | |
b7b4d7a4 | 333 | static inline unsigned short |
1da177e4 LT |
334 | actcapi_nextsmsg(act2000_card *card) |
335 | { | |
336 | unsigned long flags; | |
337 | unsigned short n; | |
338 | ||
339 | spin_lock_irqsave(&card->mnlock, flags); | |
340 | n = card->msgnum; | |
341 | card->msgnum++; | |
342 | card->msgnum &= 0x7fff; | |
343 | spin_unlock_irqrestore(&card->mnlock, flags); | |
344 | return n; | |
345 | } | |
346 | #define DEBUG_MSG | |
347 | #undef DEBUG_DATA_MSG | |
348 | #undef DEBUG_DUMP_SKB | |
349 | ||
350 | extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *); | |
351 | extern int actcapi_listen_req(act2000_card *); | |
352 | extern int actcapi_manufacturer_req_net(act2000_card *); | |
1da177e4 LT |
353 | extern int actcapi_manufacturer_req_errh(act2000_card *); |
354 | extern int actcapi_manufacturer_req_msn(act2000_card *); | |
355 | extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int); | |
356 | extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *); | |
357 | extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *); | |
358 | extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8); | |
c4028958 | 359 | extern void actcapi_dispatch(struct work_struct *); |
1da177e4 LT |
360 | #ifdef DEBUG_MSG |
361 | extern void actcapi_debug_msg(struct sk_buff *skb, int); | |
362 | #else | |
363 | #define actcapi_debug_msg(skb, len) | |
364 | #endif | |
365 | #endif |