Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
capi.h
Go to the documentation of this file.
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 <[email protected]>
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 {
23 
24 /* CAPI message header */
25 typedef struct actcapi_msghdr {
31 
32 /* CAPI message description (for debugging) */
33 typedef struct actcapi_msgdsc {
35  char *description;
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;
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 */
76 
77 /* Message for EAZ<->MSN Mapping */
78 typedef struct actcapi_msn {
80  __u8 len; /* Length of MSN */
81  __u8 msn[15];
82 } __attribute__((packed)) actcapi_msn;
83 
85  __u8 len; /* Length of structure */
86  __u16 dlen; /* Data Length */
87  __u8 laa; /* 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 } __attribute__((packed)) actcapi_dlpd;
93 
95  __u8 len; /* Length of structure */
103 } __attribute__((packed)) actcapi_ncpd;
104 #define actcapi_ncpi actcapi_ncpd
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 {
141  union {
143  struct manufacturer_req_net {
148  struct manufacturer_req_v42 {
153  struct manufacturer_conf_v42 {
157  struct manufacturer_req_err {
161  struct manufacturer_ind_err {
165  __u8 errstring; /* actually up to 160 */
167  struct manufacturer_req_msn {
171  } __attribute ((packed)) manufacturer_req_msn;
172  /* TODO: TraceInit-req/conf/ind/resp and
173  * TraceDump-req/conf/ind/resp
174  */
175  struct connect_req {
183  } __attribute__ ((packed)) connect_req;
188  struct connect_ind {
189  __u16 plci;
191  __u8 si1;
192  __u8 si2;
193  __u8 eaz;
195  } __attribute__ ((packed)) connect_ind;
197  __u16 plci;
199  } connect_resp;
200  struct connect_active_ind {
201  __u16 plci;
203  } __attribute__ ((packed)) connect_active_ind;
205  __u16 plci;
207  struct connect_b3_req {
208  __u16 plci;
210  } __attribute__ ((packed)) connect_b3_req;
214  __u16 info;
215  } connect_b3_conf;
216  struct connect_b3_ind {
217  __u16 ncci;
218  __u16 plci;
220  } __attribute__ ((packed)) connect_b3_ind;
221  struct connect_b3_resp {
222  __u16 ncci;
225  } __attribute__ ((packed)) connect_b3_resp;
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;
244  } __attribute__ ((packed)) connect_b3_active_ind;
246  __u16 ncci;
248  struct disconnect_b3_req {
249  __u16 ncci;
251  } __attribute__ ((packed)) disconnect_b3_req;
253  __u16 ncci;
254  __u16 info;
256  struct disconnect_b3_ind {
257  __u16 ncci;
258  __u16 info;
260  } __attribute__ ((packed)) disconnect_b3_ind;
264  struct info_ind {
265  __u16 plci;
268  } __attribute__ ((packed)) info_ind;
269  struct 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;
283  } __attribute__ ((packed)) select_b2_protocol_req;
288  struct select_b3_protocol_req {
289  __u16 plci;
290  __u8 protocol;
291  actcapi_ncpd ncpd;
292  } __attribute__ ((packed)) select_b3_protocol_req;
294  __u16 plci;
297  struct listen_req {
299  __u32 infomask;
302  } __attribute__ ((packed)) listen_req;
303  struct listen_conf {
306  } __attribute__ ((packed)) listen_conf;
307  struct data_b3_req {
313  } __attribute ((packed)) data_b3_req;
314  struct data_b3_ind {
319  __u16 flags;
320  } __attribute__ ((packed)) data_b3_ind;
321  struct data_b3_resp {
322  __u16 ncci;
323  __u8 blocknr;
324  } __attribute__ ((packed)) data_b3_resp;
325  struct data_b3_conf {
326  __u16 ncci;
327  __u8 blocknr;
328  __u16 info;
329  } __attribute__ ((packed)) data_b3_conf;
330  } msg;
331 } __attribute__ ((packed)) actcapi_msg;
333 static inline unsigned short
334 actcapi_nextsmsg(act2000_card *card)
335 {
336  unsigned long flags;
337  unsigned short n;
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 *);
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);
359 extern void actcapi_dispatch(struct work_struct *);
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