Logo Search packages:      
Sourcecode: linux version File versions  Download package

capi.h

/* $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

Generated by  Doxygen 1.6.0   Back to index