2005-04-16 15:20:36 -07:00
/* $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 < fritz @ isdn4linux . de >
*
* 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 */
2006-01-08 01:05:09 -08:00
__u8 msn [ 15 ] ;
} __attribute__ ( ( packed ) ) actcapi_msn ;
2005-04-16 15:20:36 -07:00
typedef struct actcapi_dlpd {
__u8 len ; /* Length of structure */
2006-01-08 01:05:09 -08:00
__u16 dlen ; /* Data Length */
__u8 laa ; /* Link Address A */
2005-04-16 15:20:36 -07:00
__u8 lab ; /* Link Address B */
__u8 modulo ; /* Modulo Mode */
__u8 win ; /* Window size */
__u8 xid [ 100 ] ; /* XID Information */
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) actcapi_dlpd ;
2005-04-16 15:20:36 -07:00
typedef struct actcapi_ncpd {
__u8 len ; /* Length of structure */
2006-01-08 01:05:09 -08:00
__u16 lic ;
__u16 hic ;
__u16 ltc ;
__u16 htc ;
__u16 loc ;
__u16 hoc ;
__u8 modulo ;
} __attribute__ ( ( packed ) ) actcapi_ncpd ;
2005-04-16 15:20:36 -07:00
# 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 ;
2006-01-08 01:05:09 -08:00
} __attribute ( ( packed ) ) manufacturer_req_msn ;
2005-04-16 15:20:36 -07:00
/* TODO: TraceInit-req/conf/ind/resp and
* TraceDump - req / conf / ind / resp
*/
struct connect_req {
__u8 controller ;
__u8 bchan ;
2006-01-08 01:05:09 -08:00
__u32 infomask ;
2005-04-16 15:20:36 -07:00
__u8 si1 ;
__u8 si2 ;
__u8 eaz ;
actcapi_addr addr ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) connect_req ;
2005-04-16 15:20:36 -07:00
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 ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) connect_ind ;
2005-04-16 15:20:36 -07:00
struct connect_resp {
__u16 plci ;
__u8 rejectcause ;
} connect_resp ;
struct connect_active_ind {
__u16 plci ;
actcapi_addr addr ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) connect_active_ind ;
2005-04-16 15:20:36 -07:00
struct connect_active_resp {
__u16 plci ;
} connect_active_resp ;
struct connect_b3_req {
__u16 plci ;
actcapi_ncpi ncpi ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) connect_b3_req ;
2005-04-16 15:20:36 -07:00
struct connect_b3_conf {
__u16 plci ;
__u16 ncci ;
__u16 info ;
} connect_b3_conf ;
struct connect_b3_ind {
__u16 ncci ;
__u16 plci ;
actcapi_ncpi ncpi ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) connect_b3_ind ;
2005-04-16 15:20:36 -07:00
struct connect_b3_resp {
__u16 ncci ;
__u8 rejectcause ;
2006-01-08 01:05:09 -08:00
actcapi_ncpi ncpi ;
} __attribute__ ( ( packed ) ) connect_b3_resp ;
2005-04-16 15:20:36 -07:00
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 ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) connect_b3_active_ind ;
2005-04-16 15:20:36 -07:00
struct connect_b3_active_resp {
__u16 ncci ;
} connect_b3_active_resp ;
struct disconnect_b3_req {
__u16 ncci ;
actcapi_ncpi ncpi ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) disconnect_b3_req ;
2005-04-16 15:20:36 -07:00
struct disconnect_b3_conf {
__u16 ncci ;
__u16 info ;
} disconnect_b3_conf ;
struct disconnect_b3_ind {
__u16 ncci ;
__u16 info ;
actcapi_ncpi ncpi ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) disconnect_b3_ind ;
2005-04-16 15:20:36 -07:00
struct disconnect_b3_resp {
__u16 ncci ;
} disconnect_b3_resp ;
struct info_ind {
__u16 plci ;
actcapi_infonr nr ;
actcapi_infoel el ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) info_ind ;
2005-04-16 15:20:36 -07:00
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 ;
2006-01-08 01:05:09 -08:00
actcapi_dlpd dlpd ;
} __attribute__ ( ( packed ) ) select_b2_protocol_req ;
2005-04-16 15:20:36 -07:00
struct select_b2_protocol_conf {
__u16 plci ;
__u16 info ;
} select_b2_protocol_conf ;
struct select_b3_protocol_req {
__u16 plci ;
__u8 protocol ;
2006-01-08 01:05:09 -08:00
actcapi_ncpd ncpd ;
} __attribute__ ( ( packed ) ) select_b3_protocol_req ;
2005-04-16 15:20:36 -07:00
struct select_b3_protocol_conf {
__u16 plci ;
__u16 info ;
} select_b3_protocol_conf ;
struct listen_req {
__u8 controller ;
2006-01-08 01:05:09 -08:00
__u32 infomask ;
__u16 eazmask ;
__u16 simask ;
} __attribute__ ( ( packed ) ) listen_req ;
2005-04-16 15:20:36 -07:00
struct listen_conf {
__u8 controller ;
2006-01-08 01:05:09 -08:00
__u16 info ;
} __attribute__ ( ( packed ) ) listen_conf ;
2005-04-16 15:20:36 -07:00
struct data_b3_req {
__u16 fakencci ;
__u16 datalen ;
__u32 unused ;
__u8 blocknr ;
2006-01-08 01:05:09 -08:00
__u16 flags ;
} __attribute ( ( packed ) ) data_b3_req ;
2005-04-16 15:20:36 -07:00
struct data_b3_ind {
__u16 fakencci ;
__u16 datalen ;
__u32 unused ;
__u8 blocknr ;
2006-01-08 01:05:09 -08:00
__u16 flags ;
} __attribute__ ( ( packed ) ) data_b3_ind ;
2005-04-16 15:20:36 -07:00
struct data_b3_resp {
__u16 ncci ;
__u8 blocknr ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) data_b3_resp ;
2005-04-16 15:20:36 -07:00
struct data_b3_conf {
__u16 ncci ;
__u8 blocknr ;
2006-01-08 01:05:09 -08:00
__u16 info ;
} __attribute__ ( ( packed ) ) data_b3_conf ;
2005-04-16 15:20:36 -07:00
} msg ;
2006-01-08 01:05:09 -08:00
} __attribute__ ( ( packed ) ) actcapi_msg ;
2005-04-16 15:20:36 -07:00
2006-01-08 01:02:16 -08:00
static inline unsigned short
2005-04-16 15:20:36 -07:00
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 ) ;
2006-11-22 14:57:56 +00:00
extern void actcapi_dispatch ( struct work_struct * ) ;
2005-04-16 15:20:36 -07:00
# ifdef DEBUG_MSG
extern void actcapi_debug_msg ( struct sk_buff * skb , int ) ;
# else
# define actcapi_debug_msg(skb, len)
# endif
# endif