365 lines
		
	
	
	
		
			10 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			365 lines
		
	
	
	
		
			10 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $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                */
 | |
| 	__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
 | 
