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> | |
475be4d8 | 7 | * |
1da177e4 LT |
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 */ | |
475be4d8 JP |
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 */ | |
1da177e4 LT |
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 */ | |
475be4d8 JP |
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; | |
1da177e4 LT |
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 | */ | |
475be4d8 JP |
114 | #define MAKE_NCCI(plci, contr, ncci) \ |
115 | ((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8)) | |
1da177e4 | 116 | |
f775252f | 117 | #define EVAL_NCCI(fakencci, plci, ncci) { \ |
475be4d8 | 118 | plci = fakencci & 0x1f; \ |
475be4d8 JP |
119 | ncci = (fakencci >> 8) & 0xff; \ |
120 | } | |
1da177e4 LT |
121 | |
122 | /* | |
123 | * Layout of PLCI field in a B3 DATA CAPI message is different from | |
124 | * standard at act2000: | |
125 | * | |
126 | * Bit 0-4 = PLCI | |
127 | * Bit 5-7 = Controller | |
128 | * Bit 8-15 = reserved (must be 0) | |
129 | */ | |
1da177e4 LT |
130 | |
131 | typedef struct actcapi_msg { | |
132 | actcapi_msghdr hdr; | |
133 | union { | |
134 | __u16 manuf_msg; | |
135 | struct manufacturer_req_net { | |
136 | __u16 manuf_msg; | |
137 | __u16 controller; | |
138 | __u8 nettype; | |
139 | } manufacturer_req_net; | |
140 | struct manufacturer_req_v42 { | |
141 | __u16 manuf_msg; | |
142 | __u16 controller; | |
143 | __u32 v42control; | |
144 | } manufacturer_req_v42; | |
145 | struct manufacturer_conf_v42 { | |
146 | __u16 manuf_msg; | |
147 | __u16 controller; | |
148 | } manufacturer_conf_v42; | |
149 | struct manufacturer_req_err { | |
150 | __u16 manuf_msg; | |
151 | __u16 controller; | |
152 | } manufacturer_req_err; | |
153 | struct manufacturer_ind_err { | |
154 | __u16 manuf_msg; | |
155 | __u16 controller; | |
156 | __u32 errcode; | |
157 | __u8 errstring; /* actually up to 160 */ | |
158 | } manufacturer_ind_err; | |
159 | struct manufacturer_req_msn { | |
160 | __u16 manuf_msg; | |
161 | __u16 controller; | |
162 | actcapi_msn msnmap; | |
9fe656e9 | 163 | } __attribute ((packed)) manufacturer_req_msn; |
1da177e4 LT |
164 | /* TODO: TraceInit-req/conf/ind/resp and |
165 | * TraceDump-req/conf/ind/resp | |
166 | */ | |
167 | struct connect_req { | |
168 | __u8 controller; | |
169 | __u8 bchan; | |
9fe656e9 | 170 | __u32 infomask; |
1da177e4 LT |
171 | __u8 si1; |
172 | __u8 si2; | |
173 | __u8 eaz; | |
174 | actcapi_addr addr; | |
9fe656e9 | 175 | } __attribute__ ((packed)) connect_req; |
1da177e4 LT |
176 | struct connect_conf { |
177 | __u16 plci; | |
178 | __u16 info; | |
179 | } connect_conf; | |
180 | struct connect_ind { | |
181 | __u16 plci; | |
182 | __u8 controller; | |
183 | __u8 si1; | |
184 | __u8 si2; | |
185 | __u8 eaz; | |
186 | actcapi_addr addr; | |
9fe656e9 | 187 | } __attribute__ ((packed)) connect_ind; |
1da177e4 LT |
188 | struct connect_resp { |
189 | __u16 plci; | |
190 | __u8 rejectcause; | |
191 | } connect_resp; | |
192 | struct connect_active_ind { | |
193 | __u16 plci; | |
194 | actcapi_addr addr; | |
9fe656e9 | 195 | } __attribute__ ((packed)) connect_active_ind; |
1da177e4 LT |
196 | struct connect_active_resp { |
197 | __u16 plci; | |
198 | } connect_active_resp; | |
199 | struct connect_b3_req { | |
200 | __u16 plci; | |
201 | actcapi_ncpi ncpi; | |
9fe656e9 | 202 | } __attribute__ ((packed)) connect_b3_req; |
1da177e4 LT |
203 | struct connect_b3_conf { |
204 | __u16 plci; | |
205 | __u16 ncci; | |
206 | __u16 info; | |
207 | } connect_b3_conf; | |
208 | struct connect_b3_ind { | |
209 | __u16 ncci; | |
210 | __u16 plci; | |
211 | actcapi_ncpi ncpi; | |
9fe656e9 | 212 | } __attribute__ ((packed)) connect_b3_ind; |
1da177e4 LT |
213 | struct connect_b3_resp { |
214 | __u16 ncci; | |
215 | __u8 rejectcause; | |
9fe656e9 JB |
216 | actcapi_ncpi ncpi; |
217 | } __attribute__ ((packed)) connect_b3_resp; | |
1da177e4 LT |
218 | struct disconnect_req { |
219 | __u16 plci; | |
220 | __u8 cause; | |
221 | } disconnect_req; | |
222 | struct disconnect_conf { | |
223 | __u16 plci; | |
224 | __u16 info; | |
225 | } disconnect_conf; | |
226 | struct disconnect_ind { | |
227 | __u16 plci; | |
228 | __u16 info; | |
229 | } disconnect_ind; | |
230 | struct disconnect_resp { | |
231 | __u16 plci; | |
232 | } disconnect_resp; | |
233 | struct connect_b3_active_ind { | |
234 | __u16 ncci; | |
235 | actcapi_ncpi ncpi; | |
9fe656e9 | 236 | } __attribute__ ((packed)) connect_b3_active_ind; |
1da177e4 LT |
237 | struct connect_b3_active_resp { |
238 | __u16 ncci; | |
239 | } connect_b3_active_resp; | |
240 | struct disconnect_b3_req { | |
241 | __u16 ncci; | |
242 | actcapi_ncpi ncpi; | |
9fe656e9 | 243 | } __attribute__ ((packed)) disconnect_b3_req; |
1da177e4 LT |
244 | struct disconnect_b3_conf { |
245 | __u16 ncci; | |
246 | __u16 info; | |
247 | } disconnect_b3_conf; | |
248 | struct disconnect_b3_ind { | |
249 | __u16 ncci; | |
250 | __u16 info; | |
251 | actcapi_ncpi ncpi; | |
9fe656e9 | 252 | } __attribute__ ((packed)) disconnect_b3_ind; |
1da177e4 LT |
253 | struct disconnect_b3_resp { |
254 | __u16 ncci; | |
255 | } disconnect_b3_resp; | |
256 | struct info_ind { | |
257 | __u16 plci; | |
258 | actcapi_infonr nr; | |
259 | actcapi_infoel el; | |
9fe656e9 | 260 | } __attribute__ ((packed)) info_ind; |
1da177e4 LT |
261 | struct info_resp { |
262 | __u16 plci; | |
263 | } info_resp; | |
264 | struct listen_b3_req { | |
265 | __u16 plci; | |
266 | } listen_b3_req; | |
267 | struct listen_b3_conf { | |
268 | __u16 plci; | |
269 | __u16 info; | |
270 | } listen_b3_conf; | |
271 | struct select_b2_protocol_req { | |
272 | __u16 plci; | |
273 | __u8 protocol; | |
9fe656e9 JB |
274 | actcapi_dlpd dlpd; |
275 | } __attribute__ ((packed)) select_b2_protocol_req; | |
1da177e4 LT |
276 | struct select_b2_protocol_conf { |
277 | __u16 plci; | |
278 | __u16 info; | |
279 | } select_b2_protocol_conf; | |
280 | struct select_b3_protocol_req { | |
281 | __u16 plci; | |
282 | __u8 protocol; | |
9fe656e9 JB |
283 | actcapi_ncpd ncpd; |
284 | } __attribute__ ((packed)) select_b3_protocol_req; | |
1da177e4 LT |
285 | struct select_b3_protocol_conf { |
286 | __u16 plci; | |
287 | __u16 info; | |
288 | } select_b3_protocol_conf; | |
289 | struct listen_req { | |
290 | __u8 controller; | |
9fe656e9 JB |
291 | __u32 infomask; |
292 | __u16 eazmask; | |
293 | __u16 simask; | |
294 | } __attribute__ ((packed)) listen_req; | |
1da177e4 LT |
295 | struct listen_conf { |
296 | __u8 controller; | |
9fe656e9 JB |
297 | __u16 info; |
298 | } __attribute__ ((packed)) listen_conf; | |
1da177e4 LT |
299 | struct data_b3_req { |
300 | __u16 fakencci; | |
301 | __u16 datalen; | |
302 | __u32 unused; | |
303 | __u8 blocknr; | |
9fe656e9 JB |
304 | __u16 flags; |
305 | } __attribute ((packed)) data_b3_req; | |
1da177e4 LT |
306 | struct data_b3_ind { |
307 | __u16 fakencci; | |
308 | __u16 datalen; | |
309 | __u32 unused; | |
310 | __u8 blocknr; | |
9fe656e9 JB |
311 | __u16 flags; |
312 | } __attribute__ ((packed)) data_b3_ind; | |
1da177e4 LT |
313 | struct data_b3_resp { |
314 | __u16 ncci; | |
315 | __u8 blocknr; | |
9fe656e9 | 316 | } __attribute__ ((packed)) data_b3_resp; |
1da177e4 LT |
317 | struct data_b3_conf { |
318 | __u16 ncci; | |
319 | __u8 blocknr; | |
9fe656e9 JB |
320 | __u16 info; |
321 | } __attribute__ ((packed)) data_b3_conf; | |
1da177e4 | 322 | } msg; |
9fe656e9 | 323 | } __attribute__ ((packed)) actcapi_msg; |
1da177e4 | 324 | |
b7b4d7a4 | 325 | static inline unsigned short |
1da177e4 LT |
326 | actcapi_nextsmsg(act2000_card *card) |
327 | { | |
328 | unsigned long flags; | |
329 | unsigned short n; | |
330 | ||
331 | spin_lock_irqsave(&card->mnlock, flags); | |
332 | n = card->msgnum; | |
333 | card->msgnum++; | |
334 | card->msgnum &= 0x7fff; | |
335 | spin_unlock_irqrestore(&card->mnlock, flags); | |
336 | return n; | |
337 | } | |
338 | #define DEBUG_MSG | |
339 | #undef DEBUG_DATA_MSG | |
340 | #undef DEBUG_DUMP_SKB | |
341 | ||
342 | extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *); | |
343 | extern int actcapi_listen_req(act2000_card *); | |
344 | extern int actcapi_manufacturer_req_net(act2000_card *); | |
1da177e4 LT |
345 | extern int actcapi_manufacturer_req_errh(act2000_card *); |
346 | extern int actcapi_manufacturer_req_msn(act2000_card *); | |
347 | extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int); | |
348 | extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *); | |
349 | extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *); | |
350 | extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8); | |
c4028958 | 351 | extern void actcapi_dispatch(struct work_struct *); |
1da177e4 LT |
352 | #ifdef DEBUG_MSG |
353 | extern void actcapi_debug_msg(struct sk_buff *skb, int); | |
354 | #else | |
355 | #define actcapi_debug_msg(skb, len) | |
356 | #endif | |
357 | #endif |