2005-04-17 06:20:36 +08: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>
|
2012-02-20 11:52:38 +08:00
|
|
|
*
|
2005-04-17 06:20:36 +08:00
|
|
|
* 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 */
|
2012-02-20 11:52:38 +08:00
|
|
|
unsigned codes:3; /* code set */
|
|
|
|
unsigned rsvd:5; /* reserved */
|
|
|
|
unsigned svind:1; /* single, variable length ind. */
|
|
|
|
unsigned wtype:7; /* W-element type */
|
2005-04-17 06:20:36 +08:00
|
|
|
} 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 */
|
2012-02-20 11:52:38 +08:00
|
|
|
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;
|
2005-04-17 06:20:36 +08:00
|
|
|
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 17:05:09 +08:00
|
|
|
__u8 msn[15];
|
|
|
|
} __attribute__((packed)) actcapi_msn;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
typedef struct actcapi_dlpd {
|
|
|
|
__u8 len; /* Length of structure */
|
2006-01-08 17:05:09 +08:00
|
|
|
__u16 dlen; /* Data Length */
|
|
|
|
__u8 laa; /* Link Address A */
|
2005-04-17 06:20:36 +08:00
|
|
|
__u8 lab; /* Link Address B */
|
|
|
|
__u8 modulo; /* Modulo Mode */
|
|
|
|
__u8 win; /* Window size */
|
|
|
|
__u8 xid[100]; /* XID Information */
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__((packed)) actcapi_dlpd;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
typedef struct actcapi_ncpd {
|
|
|
|
__u8 len; /* Length of structure */
|
2006-01-08 17:05:09 +08:00
|
|
|
__u16 lic;
|
|
|
|
__u16 hic;
|
|
|
|
__u16 ltc;
|
|
|
|
__u16 htc;
|
|
|
|
__u16 loc;
|
|
|
|
__u16 hoc;
|
|
|
|
__u8 modulo;
|
|
|
|
} __attribute__((packed)) actcapi_ncpd;
|
2005-04-17 06:20:36 +08: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
|
|
|
|
*/
|
2012-02-20 11:52:38 +08:00
|
|
|
#define MAKE_NCCI(plci, contr, ncci) \
|
|
|
|
((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2012-02-20 11:52:38 +08:00
|
|
|
#define EVAL_NCCI(fakencci, plci, contr, ncci) { \
|
|
|
|
plci = fakencci & 0x1f; \
|
|
|
|
contr = (fakencci >> 5) & 0x7; \
|
|
|
|
ncci = (fakencci >> 8) & 0xff; \
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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)
|
|
|
|
*/
|
2012-02-20 11:52:38 +08:00
|
|
|
#define MAKE_PLCI(plci, contr) \
|
|
|
|
((plci & 0x1f) | ((contr & 0x7) << 5))
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2012-02-20 11:52:38 +08:00
|
|
|
#define EVAL_PLCI(fakeplci, plci, contr) { \
|
|
|
|
plci = fakeplci & 0x1f; \
|
|
|
|
contr = (fakeplci >> 5) & 0x7; \
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
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 17:05:09 +08:00
|
|
|
} __attribute ((packed)) manufacturer_req_msn;
|
2005-04-17 06:20:36 +08:00
|
|
|
/* TODO: TraceInit-req/conf/ind/resp and
|
|
|
|
* TraceDump-req/conf/ind/resp
|
|
|
|
*/
|
|
|
|
struct connect_req {
|
|
|
|
__u8 controller;
|
|
|
|
__u8 bchan;
|
2006-01-08 17:05:09 +08:00
|
|
|
__u32 infomask;
|
2005-04-17 06:20:36 +08:00
|
|
|
__u8 si1;
|
|
|
|
__u8 si2;
|
|
|
|
__u8 eaz;
|
|
|
|
actcapi_addr addr;
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) connect_req;
|
2005-04-17 06:20:36 +08: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 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) connect_ind;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct connect_resp {
|
|
|
|
__u16 plci;
|
|
|
|
__u8 rejectcause;
|
|
|
|
} connect_resp;
|
|
|
|
struct connect_active_ind {
|
|
|
|
__u16 plci;
|
|
|
|
actcapi_addr addr;
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) connect_active_ind;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct connect_active_resp {
|
|
|
|
__u16 plci;
|
|
|
|
} connect_active_resp;
|
|
|
|
struct connect_b3_req {
|
|
|
|
__u16 plci;
|
|
|
|
actcapi_ncpi ncpi;
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) connect_b3_req;
|
2005-04-17 06:20:36 +08: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 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) connect_b3_ind;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct connect_b3_resp {
|
|
|
|
__u16 ncci;
|
|
|
|
__u8 rejectcause;
|
2006-01-08 17:05:09 +08:00
|
|
|
actcapi_ncpi ncpi;
|
|
|
|
} __attribute__ ((packed)) connect_b3_resp;
|
2005-04-17 06:20:36 +08: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 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) connect_b3_active_ind;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct connect_b3_active_resp {
|
|
|
|
__u16 ncci;
|
|
|
|
} connect_b3_active_resp;
|
|
|
|
struct disconnect_b3_req {
|
|
|
|
__u16 ncci;
|
|
|
|
actcapi_ncpi ncpi;
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) disconnect_b3_req;
|
2005-04-17 06:20:36 +08: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 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) disconnect_b3_ind;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct disconnect_b3_resp {
|
|
|
|
__u16 ncci;
|
|
|
|
} disconnect_b3_resp;
|
|
|
|
struct info_ind {
|
|
|
|
__u16 plci;
|
|
|
|
actcapi_infonr nr;
|
|
|
|
actcapi_infoel el;
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) info_ind;
|
2005-04-17 06:20:36 +08: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 17:05:09 +08:00
|
|
|
actcapi_dlpd dlpd;
|
|
|
|
} __attribute__ ((packed)) select_b2_protocol_req;
|
2005-04-17 06:20:36 +08: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 17:05:09 +08:00
|
|
|
actcapi_ncpd ncpd;
|
|
|
|
} __attribute__ ((packed)) select_b3_protocol_req;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct select_b3_protocol_conf {
|
|
|
|
__u16 plci;
|
|
|
|
__u16 info;
|
|
|
|
} select_b3_protocol_conf;
|
|
|
|
struct listen_req {
|
|
|
|
__u8 controller;
|
2006-01-08 17:05:09 +08:00
|
|
|
__u32 infomask;
|
|
|
|
__u16 eazmask;
|
|
|
|
__u16 simask;
|
|
|
|
} __attribute__ ((packed)) listen_req;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct listen_conf {
|
|
|
|
__u8 controller;
|
2006-01-08 17:05:09 +08:00
|
|
|
__u16 info;
|
|
|
|
} __attribute__ ((packed)) listen_conf;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct data_b3_req {
|
|
|
|
__u16 fakencci;
|
|
|
|
__u16 datalen;
|
|
|
|
__u32 unused;
|
|
|
|
__u8 blocknr;
|
2006-01-08 17:05:09 +08:00
|
|
|
__u16 flags;
|
|
|
|
} __attribute ((packed)) data_b3_req;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct data_b3_ind {
|
|
|
|
__u16 fakencci;
|
|
|
|
__u16 datalen;
|
|
|
|
__u32 unused;
|
|
|
|
__u8 blocknr;
|
2006-01-08 17:05:09 +08:00
|
|
|
__u16 flags;
|
|
|
|
} __attribute__ ((packed)) data_b3_ind;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct data_b3_resp {
|
|
|
|
__u16 ncci;
|
|
|
|
__u8 blocknr;
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) data_b3_resp;
|
2005-04-17 06:20:36 +08:00
|
|
|
struct data_b3_conf {
|
|
|
|
__u16 ncci;
|
|
|
|
__u8 blocknr;
|
2006-01-08 17:05:09 +08:00
|
|
|
__u16 info;
|
|
|
|
} __attribute__ ((packed)) data_b3_conf;
|
2005-04-17 06:20:36 +08:00
|
|
|
} msg;
|
2006-01-08 17:05:09 +08:00
|
|
|
} __attribute__ ((packed)) actcapi_msg;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2006-01-08 17:02:16 +08:00
|
|
|
static inline unsigned short
|
2005-04-17 06:20:36 +08: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 22:57:56 +08:00
|
|
|
extern void actcapi_dispatch(struct work_struct *);
|
2005-04-17 06:20:36 +08:00
|
|
|
#ifdef DEBUG_MSG
|
|
|
|
extern void actcapi_debug_msg(struct sk_buff *skb, int);
|
|
|
|
#else
|
|
|
|
#define actcapi_debug_msg(skb, len)
|
|
|
|
#endif
|
|
|
|
#endif
|