/* $Id: capi.h,v 1.6.6.2 2001/09/23 22:24:32 kai Exp $ * * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000. * * Author Fritz Elfert * Copyright by Fritz Elfert * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. * * Thanks to Friedemann Baitinger and IBM Germany * */ #ifndef CAPI_H #define CAPI_H /* Command-part of a CAPI message */ typedef struct actcapi_msgcmd { __u8 cmd; __u8 subcmd; } actcapi_msgcmd; /* CAPI message header */ typedef struct actcapi_msghdr { __u16 len; __u16 applicationID; actcapi_msgcmd cmd; __u16 msgnum; } actcapi_msghdr; /* CAPI message description (for debugging) */ typedef struct actcapi_msgdsc { actcapi_msgcmd cmd; char *description; } actcapi_msgdsc; /* CAPI Address */ typedef struct actcapi_addr { __u8 len; /* Length of element */ __u8 tnp; /* Type/Numbering Plan */ __u8 num[20]; /* Caller ID */ } actcapi_addr; /* CAPI INFO element mask */ typedef union actcapi_infonr { /* info number */ __u16 mask; /* info-mask field */ struct bmask { /* bit definitions */ unsigned codes : 3; /* code set */ unsigned rsvd : 5; /* reserved */ unsigned svind : 1; /* single, variable length ind. */ unsigned wtype : 7; /* W-element type */ } bmask; } actcapi_infonr; /* CAPI INFO element */ typedef union actcapi_infoel { /* info element */ __u8 len; /* length of info element */ __u8 display[40]; /* display contents */ __u8 uuinfo[40]; /* User-user info field */ struct cause { /* Cause information */ unsigned ext2 : 1; /* extension */ unsigned cod : 2; /* coding standard */ unsigned spare : 1; /* spare */ unsigned loc : 4; /* location */ unsigned ext1 : 1; /* extension */ unsigned cval : 7; /* Cause value */ } cause; struct charge { /* Charging information */ __u8 toc; /* type of charging info */ __u8 unit[10]; /* charging units */ } charge; __u8 date[20]; /* date fields */ __u8 stat; /* state of remote party */ } actcapi_infoel; /* Message for EAZ<->MSN Mapping */ typedef struct actcapi_msn { __u8 eaz; __u8 len; /* Length of MSN */ __u8 msn[15]; } __attribute__((packed)) actcapi_msn; typedef struct actcapi_dlpd { __u8 len; /* Length of structure */ __u16 dlen; /* Data Length */ __u8 laa; /* Link Address A */ __u8 lab; /* Link Address B */ __u8 modulo; /* Modulo Mode */ __u8 win; /* Window size */ __u8 xid[100]; /* XID Information */ } __attribute__((packed)) actcapi_dlpd; typedef struct actcapi_ncpd { __u8 len; /* Length of structure */ __u16 lic; __u16 hic; __u16 ltc; __u16 htc; __u16 loc; __u16 hoc; __u8 modulo; } __attribute__((packed)) actcapi_ncpd; #define actcapi_ncpi actcapi_ncpd /* * Layout of NCCI field in a B3 DATA CAPI message is different from * standard at act2000: * * Bit 0-4 = PLCI * Bit 5-7 = Controller * Bit 8-15 = NCCI */ #define MAKE_NCCI(plci,contr,ncci) \ ((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8)) #define EVAL_NCCI(fakencci,plci,contr,ncci) { \ plci = fakencci & 0x1f; \ contr = (fakencci >> 5) & 0x7; \ ncci = (fakencci >> 8) & 0xff; \ } /* * Layout of PLCI field in a B3 DATA CAPI message is different from * standard at act2000: * * Bit 0-4 = PLCI * Bit 5-7 = Controller * Bit 8-15 = reserved (must be 0) */ #define MAKE_PLCI(plci,contr) \ ((plci & 0x1f) | ((contr & 0x7) << 5)) #define EVAL_PLCI(fakeplci,plci,contr) { \ plci = fakeplci & 0x1f; \ contr = (fakeplci >> 5) & 0x7; \ } typedef struct actcapi_msg { actcapi_msghdr hdr; union { __u16 manuf_msg; struct manufacturer_req_net { __u16 manuf_msg; __u16 controller; __u8 nettype; } manufacturer_req_net; struct manufacturer_req_v42 { __u16 manuf_msg; __u16 controller; __u32 v42control; } manufacturer_req_v42; struct manufacturer_conf_v42 { __u16 manuf_msg; __u16 controller; } manufacturer_conf_v42; struct manufacturer_req_err { __u16 manuf_msg; __u16 controller; } manufacturer_req_err; struct manufacturer_ind_err { __u16 manuf_msg; __u16 controller; __u32 errcode; __u8 errstring; /* actually up to 160 */ } manufacturer_ind_err; struct manufacturer_req_msn { __u16 manuf_msg; __u16 controller; actcapi_msn msnmap; } __attribute ((packed)) manufacturer_req_msn; /* TODO: TraceInit-req/conf/ind/resp and * TraceDump-req/conf/ind/resp */ struct connect_req { __u8 controller; __u8 bchan; __u32 infomask; __u8 si1; __u8 si2; __u8 eaz; actcapi_addr addr; } __attribute__ ((packed)) connect_req; struct connect_conf { __u16 plci; __u16 info; } connect_conf; struct connect_ind { __u16 plci; __u8 controller; __u8 si1; __u8 si2; __u8 eaz; actcapi_addr addr; } __attribute__ ((packed)) connect_ind; struct connect_resp { __u16 plci; __u8 rejectcause; } connect_resp; struct connect_active_ind { __u16 plci; actcapi_addr addr; } __attribute__ ((packed)) connect_active_ind; struct connect_active_resp { __u16 plci; } connect_active_resp; struct connect_b3_req { __u16 plci; actcapi_ncpi ncpi; } __attribute__ ((packed)) connect_b3_req; struct connect_b3_conf { __u16 plci; __u16 ncci; __u16 info; } connect_b3_conf; struct connect_b3_ind { __u16 ncci; __u16 plci; actcapi_ncpi ncpi; } __attribute__ ((packed)) connect_b3_ind; struct connect_b3_resp { __u16 ncci; __u8 rejectcause; actcapi_ncpi ncpi; } __attribute__ ((packed)) connect_b3_resp; struct disconnect_req { __u16 plci; __u8 cause; } disconnect_req; struct disconnect_conf { __u16 plci; __u16 info; } disconnect_conf; struct disconnect_ind { __u16 plci; __u16 info; } disconnect_ind; struct disconnect_resp { __u16 plci; } disconnect_resp; struct connect_b3_active_ind { __u16 ncci; actcapi_ncpi ncpi; } __attribute__ ((packed)) connect_b3_active_ind; struct connect_b3_active_resp { __u16 ncci; } connect_b3_active_resp; struct disconnect_b3_req { __u16 ncci; actcapi_ncpi ncpi; } __attribute__ ((packed)) disconnect_b3_req; struct disconnect_b3_conf { __u16 ncci; __u16 info; } disconnect_b3_conf; struct disconnect_b3_ind { __u16 ncci; __u16 info; actcapi_ncpi ncpi; } __attribute__ ((packed)) disconnect_b3_ind; struct disconnect_b3_resp { __u16 ncci; } disconnect_b3_resp; struct info_ind { __u16 plci; actcapi_infonr nr; actcapi_infoel el; } __attribute__ ((packed)) info_ind; struct info_resp { __u16 plci; } info_resp; struct listen_b3_req { __u16 plci; } listen_b3_req; struct listen_b3_conf { __u16 plci; __u16 info; } listen_b3_conf; struct select_b2_protocol_req { __u16 plci; __u8 protocol; actcapi_dlpd dlpd; } __attribute__ ((packed)) select_b2_protocol_req; struct select_b2_protocol_conf { __u16 plci; __u16 info; } select_b2_protocol_conf; struct select_b3_protocol_req { __u16 plci; __u8 protocol; actcapi_ncpd ncpd; } __attribute__ ((packed)) select_b3_protocol_req; struct select_b3_protocol_conf { __u16 plci; __u16 info; } select_b3_protocol_conf; struct listen_req { __u8 controller; __u32 infomask; __u16 eazmask; __u16 simask; } __attribute__ ((packed)) listen_req; struct listen_conf { __u8 controller; __u16 info; } __attribute__ ((packed)) listen_conf; struct data_b3_req { __u16 fakencci; __u16 datalen; __u32 unused; __u8 blocknr; __u16 flags; } __attribute ((packed)) data_b3_req; struct data_b3_ind { __u16 fakencci; __u16 datalen; __u32 unused; __u8 blocknr; __u16 flags; } __attribute__ ((packed)) data_b3_ind; struct data_b3_resp { __u16 ncci; __u8 blocknr; } __attribute__ ((packed)) data_b3_resp; struct data_b3_conf { __u16 ncci; __u8 blocknr; __u16 info; } __attribute__ ((packed)) data_b3_conf; } msg; } __attribute__ ((packed)) actcapi_msg; static inline unsigned short actcapi_nextsmsg(act2000_card *card) { unsigned long flags; unsigned short n; spin_lock_irqsave(&card->mnlock, flags); n = card->msgnum; card->msgnum++; card->msgnum &= 0x7fff; spin_unlock_irqrestore(&card->mnlock, flags); return n; } #define DEBUG_MSG #undef DEBUG_DATA_MSG #undef DEBUG_DUMP_SKB extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *); extern int actcapi_listen_req(act2000_card *); extern int actcapi_manufacturer_req_net(act2000_card *); extern int actcapi_manufacturer_req_errh(act2000_card *); extern int actcapi_manufacturer_req_msn(act2000_card *); extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int); extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *); extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *); extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8); extern void actcapi_dispatch(struct work_struct *); #ifdef DEBUG_MSG extern void actcapi_debug_msg(struct sk_buff *skb, int); #else #define actcapi_debug_msg(skb, len) #endif #endif