linux/drivers/isdn/act2000/capi.h
<<
>>
Prefs
   1/* $Id: capi.h,v 1.6.6.2 2001/09/23 22:24:32 kai Exp $
   2 *
   3 * ISDN lowlevel-module for the IBM ISDN-S0 Active 2000.
   4 *
   5 * Author       Fritz Elfert
   6 * Copyright    by Fritz Elfert      <fritz@isdn4linux.de>
   7 * 
   8 * This software may be used and distributed according to the terms
   9 * of the GNU General Public License, incorporated herein by reference.
  10 *
  11 * Thanks to Friedemann Baitinger and IBM Germany
  12 *
  13 */
  14
  15#ifndef CAPI_H
  16#define CAPI_H
  17
  18/* Command-part of a CAPI message */
  19typedef struct actcapi_msgcmd {
  20        __u8 cmd;
  21        __u8 subcmd;
  22} actcapi_msgcmd;
  23
  24/* CAPI message header */
  25typedef struct actcapi_msghdr {
  26        __u16 len;
  27        __u16 applicationID;
  28        actcapi_msgcmd cmd;
  29        __u16 msgnum;
  30} actcapi_msghdr;
  31
  32/* CAPI message description (for debugging) */
  33typedef struct actcapi_msgdsc {
  34        actcapi_msgcmd cmd;
  35        char *description;
  36} actcapi_msgdsc;
  37
  38/* CAPI Address */
  39typedef struct actcapi_addr {
  40        __u8 len;                            /* Length of element            */
  41        __u8 tnp;                            /* Type/Numbering Plan          */
  42        __u8 num[20];                        /* Caller ID                    */
  43} actcapi_addr;
  44
  45/* CAPI INFO element mask */
  46typedef  union actcapi_infonr {              /* info number                  */
  47        __u16 mask;                          /* info-mask field              */
  48        struct bmask {                       /* bit definitions              */
  49                unsigned  codes : 3;         /* code set                     */
  50                unsigned  rsvd  : 5;         /* reserved                     */
  51                unsigned  svind : 1;         /* single, variable length ind. */
  52                unsigned  wtype : 7;         /* W-element type               */
  53        } bmask;
  54} actcapi_infonr;
  55
  56/* CAPI INFO element */
  57typedef union  actcapi_infoel {              /* info element                 */
  58        __u8 len;                            /* length of info element       */
  59        __u8 display[40];                    /* display contents             */
  60        __u8 uuinfo[40];                     /* User-user info field         */
  61        struct cause {                       /* Cause information            */
  62                unsigned ext2  : 1;          /* extension                    */
  63                unsigned cod   : 2;          /* coding standard              */
  64                unsigned spare : 1;          /* spare                        */
  65                unsigned loc   : 4;          /* location                     */
  66                unsigned ext1  : 1;          /* extension                    */
  67                unsigned cval  : 7;          /* Cause value                  */
  68        } cause;                     
  69        struct charge {                      /* Charging information         */
  70                __u8 toc;                    /* type of charging info        */
  71                __u8 unit[10];               /* charging units               */
  72        } charge;
  73        __u8 date[20];                       /* date fields                  */
  74        __u8 stat;                           /* state of remote party        */
  75} actcapi_infoel;
  76
  77/* Message for EAZ<->MSN Mapping */
  78typedef struct actcapi_msn {
  79        __u8 eaz;
  80        __u8 len;                            /* Length of MSN                */
  81        __u8 msn[15];
  82}  __attribute__((packed)) actcapi_msn;
  83
  84typedef struct actcapi_dlpd {
  85        __u8 len;                            /* Length of structure          */
  86        __u16 dlen;                          /* Data Length                  */
  87        __u8 laa;                            /* Link Address A               */
  88        __u8 lab;                            /* Link Address B               */
  89        __u8 modulo;                         /* Modulo Mode                  */
  90        __u8 win;                            /* Window size                  */
  91        __u8 xid[100];                       /* XID Information              */
  92} __attribute__((packed)) actcapi_dlpd;
  93
  94typedef struct actcapi_ncpd {
  95        __u8   len;                          /* Length of structure          */
  96        __u16  lic;
  97        __u16  hic;
  98        __u16  ltc;
  99        __u16  htc;
 100        __u16  loc;
 101        __u16  hoc;
 102        __u8   modulo;
 103} __attribute__((packed)) actcapi_ncpd;
 104#define actcapi_ncpi actcapi_ncpd
 105
 106/*
 107 * Layout of NCCI field in a B3 DATA CAPI message is different from
 108 * standard at act2000:
 109 *
 110 * Bit 0-4  = PLCI
 111 * Bit 5-7  = Controller
 112 * Bit 8-15 = NCCI
 113 */
 114#define MAKE_NCCI(plci,contr,ncci) \
 115        ((plci & 0x1f) | ((contr & 0x7) << 5) | ((ncci & 0xff) << 8))
 116
 117#define EVAL_NCCI(fakencci,plci,contr,ncci) { \
 118        plci  = fakencci & 0x1f; \
 119        contr = (fakencci >> 5) & 0x7; \
 120        ncci  = (fakencci >> 8) & 0xff; \
 121}
 122
 123/*
 124 * Layout of PLCI field in a B3 DATA CAPI message is different from
 125 * standard at act2000:
 126 *
 127 * Bit 0-4  = PLCI
 128 * Bit 5-7  = Controller
 129 * Bit 8-15 = reserved (must be 0)
 130 */
 131#define MAKE_PLCI(plci,contr) \
 132        ((plci & 0x1f) | ((contr & 0x7) << 5))
 133
 134#define EVAL_PLCI(fakeplci,plci,contr) { \
 135        plci  = fakeplci & 0x1f; \
 136        contr = (fakeplci >> 5) & 0x7; \
 137}
 138
 139typedef struct actcapi_msg {
 140        actcapi_msghdr hdr;
 141        union {
 142                __u16 manuf_msg;
 143                struct manufacturer_req_net {
 144                        __u16 manuf_msg;
 145                        __u16 controller;
 146                        __u8  nettype;
 147                } manufacturer_req_net;
 148                struct manufacturer_req_v42 {
 149                        __u16 manuf_msg;
 150                        __u16 controller;
 151                        __u32 v42control;
 152                } manufacturer_req_v42;
 153                struct manufacturer_conf_v42 {
 154                        __u16 manuf_msg;
 155                        __u16 controller;
 156                } manufacturer_conf_v42;
 157                struct manufacturer_req_err {
 158                        __u16 manuf_msg;
 159                        __u16 controller;
 160                } manufacturer_req_err;
 161                struct manufacturer_ind_err {
 162                        __u16 manuf_msg;
 163                        __u16 controller;
 164                        __u32 errcode;
 165                        __u8  errstring; /* actually up to 160 */
 166                } manufacturer_ind_err;
 167                struct manufacturer_req_msn {
 168                        __u16 manuf_msg;
 169                        __u16 controller;
 170                        actcapi_msn msnmap;
 171                } __attribute ((packed)) manufacturer_req_msn;
 172                /* TODO: TraceInit-req/conf/ind/resp and
 173                 *       TraceDump-req/conf/ind/resp
 174                 */
 175                struct connect_req {
 176                        __u8  controller;
 177                        __u8  bchan;
 178                        __u32 infomask;
 179                        __u8  si1;
 180                        __u8  si2;
 181                        __u8  eaz;
 182                        actcapi_addr addr;
 183                } __attribute__ ((packed)) connect_req;
 184                struct connect_conf {
 185                        __u16 plci;
 186                        __u16 info;
 187                } connect_conf;
 188                struct connect_ind {
 189                        __u16 plci;
 190                        __u8  controller;
 191                        __u8  si1;
 192                        __u8  si2;
 193                        __u8  eaz;
 194                        actcapi_addr addr;
 195                } __attribute__ ((packed)) connect_ind;
 196                struct connect_resp {
 197                        __u16 plci;
 198                        __u8  rejectcause;
 199                } connect_resp;
 200                struct connect_active_ind {
 201                        __u16 plci;
 202                        actcapi_addr addr;
 203                } __attribute__ ((packed)) connect_active_ind;
 204                struct connect_active_resp {
 205                        __u16 plci;
 206                } connect_active_resp;
 207                struct connect_b3_req {
 208                        __u16 plci;
 209                        actcapi_ncpi ncpi;
 210                } __attribute__ ((packed)) connect_b3_req;
 211                struct connect_b3_conf {
 212                        __u16 plci;
 213                        __u16 ncci;
 214                        __u16 info;
 215                } connect_b3_conf;
 216                struct connect_b3_ind {
 217                        __u16 ncci;
 218                        __u16 plci;
 219                        actcapi_ncpi ncpi;
 220                } __attribute__ ((packed)) connect_b3_ind;
 221                struct connect_b3_resp {
 222                        __u16 ncci;
 223                        __u8  rejectcause;
 224                        actcapi_ncpi ncpi;
 225                } __attribute__ ((packed)) connect_b3_resp;
 226                struct disconnect_req {
 227                        __u16 plci;
 228                        __u8  cause;
 229                } disconnect_req;
 230                struct disconnect_conf {
 231                        __u16 plci;
 232                        __u16 info;
 233                } disconnect_conf;
 234                struct disconnect_ind {
 235                        __u16 plci;
 236                        __u16 info;
 237                } disconnect_ind;
 238                struct disconnect_resp {
 239                        __u16 plci;
 240                } disconnect_resp;
 241                struct connect_b3_active_ind {
 242                        __u16 ncci;
 243                        actcapi_ncpi ncpi;
 244                } __attribute__ ((packed)) connect_b3_active_ind;
 245                struct connect_b3_active_resp {
 246                        __u16 ncci;
 247                } connect_b3_active_resp;
 248                struct disconnect_b3_req {
 249                        __u16 ncci;
 250                        actcapi_ncpi ncpi;
 251                } __attribute__ ((packed)) disconnect_b3_req;
 252                struct disconnect_b3_conf {
 253                        __u16 ncci;
 254                        __u16 info;
 255                } disconnect_b3_conf;
 256                struct disconnect_b3_ind {
 257                        __u16 ncci;
 258                        __u16 info;
 259                        actcapi_ncpi ncpi;
 260                } __attribute__ ((packed)) disconnect_b3_ind;
 261                struct disconnect_b3_resp {
 262                        __u16 ncci;
 263                } disconnect_b3_resp;
 264                struct info_ind {
 265                        __u16 plci;
 266                        actcapi_infonr nr;
 267                        actcapi_infoel el;
 268                } __attribute__ ((packed)) info_ind;
 269                struct info_resp {
 270                        __u16 plci;
 271                } info_resp;
 272                struct listen_b3_req {
 273                        __u16 plci;
 274                } listen_b3_req;
 275                struct listen_b3_conf {
 276                        __u16 plci;
 277                        __u16 info;
 278                } listen_b3_conf;
 279                struct select_b2_protocol_req {
 280                        __u16 plci;
 281                        __u8  protocol;
 282                        actcapi_dlpd dlpd;
 283                } __attribute__ ((packed)) select_b2_protocol_req;
 284                struct select_b2_protocol_conf {
 285                        __u16 plci;
 286                        __u16 info;
 287                } select_b2_protocol_conf;
 288                struct select_b3_protocol_req {
 289                        __u16 plci;
 290                        __u8  protocol;
 291                        actcapi_ncpd ncpd;
 292                } __attribute__ ((packed)) select_b3_protocol_req;
 293                struct select_b3_protocol_conf {
 294                        __u16 plci;
 295                        __u16 info;
 296                } select_b3_protocol_conf;
 297                struct listen_req {
 298                        __u8  controller;
 299                        __u32 infomask;
 300                        __u16 eazmask;
 301                        __u16 simask;
 302                } __attribute__ ((packed)) listen_req;
 303                struct listen_conf {
 304                        __u8  controller;
 305                        __u16 info;
 306                } __attribute__ ((packed)) listen_conf;
 307                struct data_b3_req {
 308                        __u16 fakencci;
 309                        __u16 datalen;
 310                        __u32 unused;
 311                        __u8  blocknr;
 312                        __u16 flags;
 313                } __attribute ((packed)) data_b3_req;
 314                struct data_b3_ind {
 315                        __u16 fakencci;
 316                        __u16 datalen;
 317                        __u32 unused;
 318                        __u8  blocknr;
 319                        __u16 flags;
 320                } __attribute__ ((packed)) data_b3_ind;
 321                struct data_b3_resp {
 322                        __u16 ncci;
 323                        __u8  blocknr;
 324                } __attribute__ ((packed)) data_b3_resp;
 325                struct data_b3_conf {
 326                        __u16 ncci;
 327                        __u8  blocknr;
 328                        __u16 info;
 329                } __attribute__ ((packed)) data_b3_conf;
 330        } msg;
 331} __attribute__ ((packed)) actcapi_msg;
 332
 333static inline unsigned short
 334actcapi_nextsmsg(act2000_card *card)
 335{
 336        unsigned long flags;
 337        unsigned short n;
 338
 339        spin_lock_irqsave(&card->mnlock, flags);
 340        n = card->msgnum;
 341        card->msgnum++;
 342        card->msgnum &= 0x7fff;
 343        spin_unlock_irqrestore(&card->mnlock, flags);
 344        return n;
 345}
 346#define DEBUG_MSG
 347#undef DEBUG_DATA_MSG
 348#undef DEBUG_DUMP_SKB
 349
 350extern int actcapi_chkhdr(act2000_card *, actcapi_msghdr *);
 351extern int actcapi_listen_req(act2000_card *);
 352extern int actcapi_manufacturer_req_net(act2000_card *);
 353extern int actcapi_manufacturer_req_errh(act2000_card *);
 354extern int actcapi_manufacturer_req_msn(act2000_card *);
 355extern int actcapi_connect_req(act2000_card *, act2000_chan *, char *, char, int, int);
 356extern void actcapi_select_b2_protocol_req(act2000_card *, act2000_chan *);
 357extern void actcapi_disconnect_b3_req(act2000_card *, act2000_chan *);
 358extern void actcapi_connect_resp(act2000_card *, act2000_chan *, __u8);
 359extern void actcapi_dispatch(struct work_struct *);
 360#ifdef DEBUG_MSG
 361extern void actcapi_debug_msg(struct sk_buff *skb, int);
 362#else
 363#define actcapi_debug_msg(skb, len)
 364#endif
 365#endif
 366