1/* $Id: capi.h,v 1.1.1.1 2008/10/15 03:26:33 james26_jang 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 */ 19typedef struct actcapi_msgcmd { 20 __u8 cmd; 21 __u8 subcmd; 22} actcapi_msgcmd; 23 24/* CAPI message header */ 25typedef 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) */ 33typedef struct actcapi_msgdsc { 34 actcapi_msgcmd cmd; 35 char *description; 36} actcapi_msgdsc; 37 38/* CAPI Address */ 39typedef 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 */ 46typedef 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 */ 57typedef 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 */ 78typedef struct actcapi_msn { 79 __u8 eaz; 80 __u8 len; /* Length of MSN */ 81 __u8 msn[15] __attribute__ ((packed)); 82} actcapi_msn; 83 84typedef 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 94typedef 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 139typedef 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 333static inline unsigned short 334actcapi_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 351extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *); 352extern int actcapi_listen_req(act2000_card *); 353extern int actcapi_manufacturer_req_net(act2000_card *); 354extern int actcapi_manufacturer_req_v42(act2000_card *, ulong); 355extern int actcapi_manufacturer_req_errh(act2000_card *); 356extern int actcapi_manufacturer_req_msn(act2000_card *); 357extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int); 358extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *); 359extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *); 360extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8); 361extern void actcapi_dispatch(act2000_card *); 362#ifdef DEBUG_MSG 363extern void actcapi_debug_msg(struct sk_buff *skb, int); 364#else 365#define actcapi_debug_msg(skb, len) 366#endif 367#endif 368