linux/include/linux/isdn/capiutil.h
<<
>>
Prefs
   1/* $Id: capiutil.h,v 1.5.6.2 2001/09/23 22:24:33 kai Exp $
   2 *
   3 * CAPI 2.0 defines & types
   4 *
   5 * From CAPI 2.0 Development Kit AVM 1995 (msg.c)
   6 * Rewritten for Linux 1996 by Carsten Paeth <calle@calle.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 */
  12
  13#ifndef __CAPIUTIL_H__
  14#define __CAPIUTIL_H__
  15
  16#include <asm/types.h>
  17
  18#define CAPIMSG_BASELEN         8
  19#define CAPIMSG_U8(m, off)      (m[off])
  20#define CAPIMSG_U16(m, off)     (m[off]|(m[(off)+1]<<8))
  21#define CAPIMSG_U32(m, off)     (m[off]|(m[(off)+1]<<8)|(m[(off)+2]<<16)|(m[(off)+3]<<24))
  22#define CAPIMSG_LEN(m)          CAPIMSG_U16(m,0)
  23#define CAPIMSG_APPID(m)        CAPIMSG_U16(m,2)
  24#define CAPIMSG_COMMAND(m)      CAPIMSG_U8(m,4)
  25#define CAPIMSG_SUBCOMMAND(m)   CAPIMSG_U8(m,5)
  26#define CAPIMSG_CMD(m)          (((m[4])<<8)|(m[5]))
  27#define CAPIMSG_MSGID(m)        CAPIMSG_U16(m,6)
  28#define CAPIMSG_CONTROLLER(m)   (m[8] & 0x7f)
  29#define CAPIMSG_CONTROL(m)      CAPIMSG_U32(m, 8)
  30#define CAPIMSG_NCCI(m)         CAPIMSG_CONTROL(m)
  31#define CAPIMSG_DATALEN(m)      CAPIMSG_U16(m,16) /* DATA_B3_REQ */
  32
  33static inline void capimsg_setu8(void *m, int off, __u8 val)
  34{
  35        ((__u8 *)m)[off] = val;
  36}
  37
  38static inline void capimsg_setu16(void *m, int off, __u16 val)
  39{
  40        ((__u8 *)m)[off] = val & 0xff;
  41        ((__u8 *)m)[off+1] = (val >> 8) & 0xff;
  42}
  43
  44static inline void capimsg_setu32(void *m, int off, __u32 val)
  45{
  46        ((__u8 *)m)[off] = val & 0xff;
  47        ((__u8 *)m)[off+1] = (val >> 8) & 0xff;
  48        ((__u8 *)m)[off+2] = (val >> 16) & 0xff;
  49        ((__u8 *)m)[off+3] = (val >> 24) & 0xff;
  50}
  51
  52#define CAPIMSG_SETLEN(m, len)          capimsg_setu16(m, 0, len)
  53#define CAPIMSG_SETAPPID(m, applid)     capimsg_setu16(m, 2, applid)
  54#define CAPIMSG_SETCOMMAND(m,cmd)       capimsg_setu8(m, 4, cmd)
  55#define CAPIMSG_SETSUBCOMMAND(m, cmd)   capimsg_setu8(m, 5, cmd)
  56#define CAPIMSG_SETMSGID(m, msgid)      capimsg_setu16(m, 6, msgid)
  57#define CAPIMSG_SETCONTROL(m, contr)    capimsg_setu32(m, 8, contr)
  58#define CAPIMSG_SETDATALEN(m, len)      capimsg_setu16(m, 16, len)
  59
  60/*----- basic-type definitions -----*/
  61
  62typedef __u8 *_cstruct;
  63
  64typedef enum {
  65        CAPI_COMPOSE,
  66        CAPI_DEFAULT
  67} _cmstruct;
  68
  69/*
  70   The _cmsg structure contains all possible CAPI 2.0 parameter.
  71   All parameters are stored here first. The function CAPI_CMSG_2_MESSAGE
  72   assembles the parameter and builds CAPI2.0 conform messages.
  73   CAPI_MESSAGE_2_CMSG disassembles CAPI 2.0 messages and stores the
  74   parameter in the _cmsg structure
  75 */
  76
  77typedef struct {
  78        /* Header */
  79        __u16 ApplId;
  80        __u8 Command;
  81        __u8 Subcommand;
  82        __u16 Messagenumber;
  83
  84        /* Parameter */
  85        union {
  86                __u32 adrController;
  87                __u32 adrPLCI;
  88                __u32 adrNCCI;
  89        } adr;
  90
  91        _cmstruct AdditionalInfo;
  92        _cstruct B1configuration;
  93        __u16 B1protocol;
  94        _cstruct B2configuration;
  95        __u16 B2protocol;
  96        _cstruct B3configuration;
  97        __u16 B3protocol;
  98        _cstruct BC;
  99        _cstruct BChannelinformation;
 100        _cmstruct BProtocol;
 101        _cstruct CalledPartyNumber;
 102        _cstruct CalledPartySubaddress;
 103        _cstruct CallingPartyNumber;
 104        _cstruct CallingPartySubaddress;
 105        __u32 CIPmask;
 106        __u32 CIPmask2;
 107        __u16 CIPValue;
 108        __u32 Class;
 109        _cstruct ConnectedNumber;
 110        _cstruct ConnectedSubaddress;
 111        __u32 Data;
 112        __u16 DataHandle;
 113        __u16 DataLength;
 114        _cstruct FacilityConfirmationParameter;
 115        _cstruct Facilitydataarray;
 116        _cstruct FacilityIndicationParameter;
 117        _cstruct FacilityRequestParameter;
 118        __u16 FacilitySelector;
 119        __u16 Flags;
 120        __u32 Function;
 121        _cstruct HLC;
 122        __u16 Info;
 123        _cstruct InfoElement;
 124        __u32 InfoMask;
 125        __u16 InfoNumber;
 126        _cstruct Keypadfacility;
 127        _cstruct LLC;
 128        _cstruct ManuData;
 129        __u32 ManuID;
 130        _cstruct NCPI;
 131        __u16 Reason;
 132        __u16 Reason_B3;
 133        __u16 Reject;
 134        _cstruct Useruserdata;
 135
 136        /* intern */
 137        unsigned l, p;
 138        unsigned char *par;
 139        __u8 *m;
 140
 141        /* buffer to construct message */
 142        __u8 buf[180];
 143
 144} _cmsg;
 145
 146/*
 147 * capi_cmsg2message() assembles the parameter from _cmsg to a CAPI 2.0
 148 * conform message
 149 */
 150unsigned capi_cmsg2message(_cmsg * cmsg, __u8 * msg);
 151
 152/*
 153 *  capi_message2cmsg disassembles a CAPI message an writes the parameter
 154 *  into _cmsg for easy access
 155 */
 156unsigned capi_message2cmsg(_cmsg * cmsg, __u8 * msg);
 157
 158/*
 159 * capi_cmsg_header() fills the _cmsg structure with default values, so only
 160 * parameter with non default values must be changed before sending the
 161 * message.
 162 */
 163unsigned capi_cmsg_header(_cmsg * cmsg, __u16 _ApplId,
 164                          __u8 _Command, __u8 _Subcommand,
 165                          __u16 _Messagenumber, __u32 _Controller);
 166
 167/*
 168 * capi_info2str generated a readable string for Capi2.0 reasons.
 169 */
 170char *capi_info2str(__u16 reason);
 171
 172/*-----------------------------------------------------------------------*/
 173
 174/*
 175 * Debugging / Tracing functions
 176 */
 177
 178char *capi_cmd2str(__u8 cmd, __u8 subcmd);
 179
 180typedef struct {
 181        u_char  *buf;
 182        u_char  *p;
 183        size_t  size;
 184        size_t  pos;
 185} _cdebbuf;
 186
 187#define CDEBUG_SIZE     1024
 188#define CDEBUG_GSIZE    4096
 189
 190void cdebbuf_free(_cdebbuf *cdb);
 191int cdebug_init(void);
 192void cdebug_exit(void);
 193
 194_cdebbuf *capi_cmsg2str(_cmsg *cmsg);
 195_cdebbuf *capi_message2str(__u8 *msg);
 196
 197/*-----------------------------------------------------------------------*/
 198
 199static inline void capi_cmsg_answer(_cmsg * cmsg)
 200{
 201        cmsg->Subcommand |= 0x01;
 202}
 203
 204/*-----------------------------------------------------------------------*/
 205
 206static inline void capi_fill_CONNECT_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 207                                            __u32 adr,
 208                                            _cstruct NCPI)
 209{
 210        capi_cmsg_header(cmsg, ApplId, 0x82, 0x80, Messagenumber, adr);
 211        cmsg->NCPI = NCPI;
 212}
 213
 214static inline void capi_fill_FACILITY_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 215                                          __u32 adr,
 216                                          __u16 FacilitySelector,
 217                                       _cstruct FacilityRequestParameter)
 218{
 219        capi_cmsg_header(cmsg, ApplId, 0x80, 0x80, Messagenumber, adr);
 220        cmsg->FacilitySelector = FacilitySelector;
 221        cmsg->FacilityRequestParameter = FacilityRequestParameter;
 222}
 223
 224static inline void capi_fill_INFO_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 225                                      __u32 adr,
 226                                      _cstruct CalledPartyNumber,
 227                                      _cstruct BChannelinformation,
 228                                      _cstruct Keypadfacility,
 229                                      _cstruct Useruserdata,
 230                                      _cstruct Facilitydataarray)
 231{
 232        capi_cmsg_header(cmsg, ApplId, 0x08, 0x80, Messagenumber, adr);
 233        cmsg->CalledPartyNumber = CalledPartyNumber;
 234        cmsg->BChannelinformation = BChannelinformation;
 235        cmsg->Keypadfacility = Keypadfacility;
 236        cmsg->Useruserdata = Useruserdata;
 237        cmsg->Facilitydataarray = Facilitydataarray;
 238}
 239
 240static inline void capi_fill_LISTEN_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 241                                        __u32 adr,
 242                                        __u32 InfoMask,
 243                                        __u32 CIPmask,
 244                                        __u32 CIPmask2,
 245                                        _cstruct CallingPartyNumber,
 246                                        _cstruct CallingPartySubaddress)
 247{
 248        capi_cmsg_header(cmsg, ApplId, 0x05, 0x80, Messagenumber, adr);
 249        cmsg->InfoMask = InfoMask;
 250        cmsg->CIPmask = CIPmask;
 251        cmsg->CIPmask2 = CIPmask2;
 252        cmsg->CallingPartyNumber = CallingPartyNumber;
 253        cmsg->CallingPartySubaddress = CallingPartySubaddress;
 254}
 255
 256static inline void capi_fill_ALERT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 257                                       __u32 adr,
 258                                       _cstruct BChannelinformation,
 259                                       _cstruct Keypadfacility,
 260                                       _cstruct Useruserdata,
 261                                       _cstruct Facilitydataarray)
 262{
 263        capi_cmsg_header(cmsg, ApplId, 0x01, 0x80, Messagenumber, adr);
 264        cmsg->BChannelinformation = BChannelinformation;
 265        cmsg->Keypadfacility = Keypadfacility;
 266        cmsg->Useruserdata = Useruserdata;
 267        cmsg->Facilitydataarray = Facilitydataarray;
 268}
 269
 270static inline void capi_fill_CONNECT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 271                                         __u32 adr,
 272                                         __u16 CIPValue,
 273                                         _cstruct CalledPartyNumber,
 274                                         _cstruct CallingPartyNumber,
 275                                         _cstruct CalledPartySubaddress,
 276                                         _cstruct CallingPartySubaddress,
 277                                         __u16 B1protocol,
 278                                         __u16 B2protocol,
 279                                         __u16 B3protocol,
 280                                         _cstruct B1configuration,
 281                                         _cstruct B2configuration,
 282                                         _cstruct B3configuration,
 283                                         _cstruct BC,
 284                                         _cstruct LLC,
 285                                         _cstruct HLC,
 286                                         _cstruct BChannelinformation,
 287                                         _cstruct Keypadfacility,
 288                                         _cstruct Useruserdata,
 289                                         _cstruct Facilitydataarray)
 290{
 291
 292        capi_cmsg_header(cmsg, ApplId, 0x02, 0x80, Messagenumber, adr);
 293        cmsg->CIPValue = CIPValue;
 294        cmsg->CalledPartyNumber = CalledPartyNumber;
 295        cmsg->CallingPartyNumber = CallingPartyNumber;
 296        cmsg->CalledPartySubaddress = CalledPartySubaddress;
 297        cmsg->CallingPartySubaddress = CallingPartySubaddress;
 298        cmsg->B1protocol = B1protocol;
 299        cmsg->B2protocol = B2protocol;
 300        cmsg->B3protocol = B3protocol;
 301        cmsg->B1configuration = B1configuration;
 302        cmsg->B2configuration = B2configuration;
 303        cmsg->B3configuration = B3configuration;
 304        cmsg->BC = BC;
 305        cmsg->LLC = LLC;
 306        cmsg->HLC = HLC;
 307        cmsg->BChannelinformation = BChannelinformation;
 308        cmsg->Keypadfacility = Keypadfacility;
 309        cmsg->Useruserdata = Useruserdata;
 310        cmsg->Facilitydataarray = Facilitydataarray;
 311}
 312
 313static inline void capi_fill_DATA_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 314                                         __u32 adr,
 315                                         __u32 Data,
 316                                         __u16 DataLength,
 317                                         __u16 DataHandle,
 318                                         __u16 Flags)
 319{
 320
 321        capi_cmsg_header(cmsg, ApplId, 0x86, 0x80, Messagenumber, adr);
 322        cmsg->Data = Data;
 323        cmsg->DataLength = DataLength;
 324        cmsg->DataHandle = DataHandle;
 325        cmsg->Flags = Flags;
 326}
 327
 328static inline void capi_fill_DISCONNECT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 329                                            __u32 adr,
 330                                            _cstruct BChannelinformation,
 331                                            _cstruct Keypadfacility,
 332                                            _cstruct Useruserdata,
 333                                            _cstruct Facilitydataarray)
 334{
 335
 336        capi_cmsg_header(cmsg, ApplId, 0x04, 0x80, Messagenumber, adr);
 337        cmsg->BChannelinformation = BChannelinformation;
 338        cmsg->Keypadfacility = Keypadfacility;
 339        cmsg->Useruserdata = Useruserdata;
 340        cmsg->Facilitydataarray = Facilitydataarray;
 341}
 342
 343static inline void capi_fill_DISCONNECT_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 344                                               __u32 adr,
 345                                               _cstruct NCPI)
 346{
 347
 348        capi_cmsg_header(cmsg, ApplId, 0x84, 0x80, Messagenumber, adr);
 349        cmsg->NCPI = NCPI;
 350}
 351
 352static inline void capi_fill_MANUFACTURER_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 353                                              __u32 adr,
 354                                              __u32 ManuID,
 355                                              __u32 Class,
 356                                              __u32 Function,
 357                                              _cstruct ManuData)
 358{
 359
 360        capi_cmsg_header(cmsg, ApplId, 0xff, 0x80, Messagenumber, adr);
 361        cmsg->ManuID = ManuID;
 362        cmsg->Class = Class;
 363        cmsg->Function = Function;
 364        cmsg->ManuData = ManuData;
 365}
 366
 367static inline void capi_fill_RESET_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 368                                          __u32 adr,
 369                                          _cstruct NCPI)
 370{
 371
 372        capi_cmsg_header(cmsg, ApplId, 0x87, 0x80, Messagenumber, adr);
 373        cmsg->NCPI = NCPI;
 374}
 375
 376static inline void capi_fill_SELECT_B_PROTOCOL_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 377                                                   __u32 adr,
 378                                                   __u16 B1protocol,
 379                                                   __u16 B2protocol,
 380                                                   __u16 B3protocol,
 381                                                _cstruct B1configuration,
 382                                                _cstruct B2configuration,
 383                                                _cstruct B3configuration)
 384{
 385
 386        capi_cmsg_header(cmsg, ApplId, 0x41, 0x80, Messagenumber, adr);
 387        cmsg->B1protocol = B1protocol;
 388        cmsg->B2protocol = B2protocol;
 389        cmsg->B3protocol = B3protocol;
 390        cmsg->B1configuration = B1configuration;
 391        cmsg->B2configuration = B2configuration;
 392        cmsg->B3configuration = B3configuration;
 393}
 394
 395static inline void capi_fill_CONNECT_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 396                                          __u32 adr,
 397                                          __u16 Reject,
 398                                          __u16 B1protocol,
 399                                          __u16 B2protocol,
 400                                          __u16 B3protocol,
 401                                          _cstruct B1configuration,
 402                                          _cstruct B2configuration,
 403                                          _cstruct B3configuration,
 404                                          _cstruct ConnectedNumber,
 405                                          _cstruct ConnectedSubaddress,
 406                                          _cstruct LLC,
 407                                          _cstruct BChannelinformation,
 408                                          _cstruct Keypadfacility,
 409                                          _cstruct Useruserdata,
 410                                          _cstruct Facilitydataarray)
 411{
 412        capi_cmsg_header(cmsg, ApplId, 0x02, 0x83, Messagenumber, adr);
 413        cmsg->Reject = Reject;
 414        cmsg->B1protocol = B1protocol;
 415        cmsg->B2protocol = B2protocol;
 416        cmsg->B3protocol = B3protocol;
 417        cmsg->B1configuration = B1configuration;
 418        cmsg->B2configuration = B2configuration;
 419        cmsg->B3configuration = B3configuration;
 420        cmsg->ConnectedNumber = ConnectedNumber;
 421        cmsg->ConnectedSubaddress = ConnectedSubaddress;
 422        cmsg->LLC = LLC;
 423        cmsg->BChannelinformation = BChannelinformation;
 424        cmsg->Keypadfacility = Keypadfacility;
 425        cmsg->Useruserdata = Useruserdata;
 426        cmsg->Facilitydataarray = Facilitydataarray;
 427}
 428
 429static inline void capi_fill_CONNECT_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 430                                                 __u32 adr)
 431{
 432
 433        capi_cmsg_header(cmsg, ApplId, 0x03, 0x83, Messagenumber, adr);
 434}
 435
 436static inline void capi_fill_CONNECT_B3_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 437                                                    __u32 adr)
 438{
 439
 440        capi_cmsg_header(cmsg, ApplId, 0x83, 0x83, Messagenumber, adr);
 441}
 442
 443static inline void capi_fill_CONNECT_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 444                                             __u32 adr,
 445                                             __u16 Reject,
 446                                             _cstruct NCPI)
 447{
 448        capi_cmsg_header(cmsg, ApplId, 0x82, 0x83, Messagenumber, adr);
 449        cmsg->Reject = Reject;
 450        cmsg->NCPI = NCPI;
 451}
 452
 453static inline void capi_fill_CONNECT_B3_T90_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 454                                                        __u32 adr)
 455{
 456
 457        capi_cmsg_header(cmsg, ApplId, 0x88, 0x83, Messagenumber, adr);
 458}
 459
 460static inline void capi_fill_DATA_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 461                                          __u32 adr,
 462                                          __u16 DataHandle)
 463{
 464
 465        capi_cmsg_header(cmsg, ApplId, 0x86, 0x83, Messagenumber, adr);
 466        cmsg->DataHandle = DataHandle;
 467}
 468
 469static inline void capi_fill_DISCONNECT_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 470                                                __u32 adr)
 471{
 472
 473        capi_cmsg_header(cmsg, ApplId, 0x84, 0x83, Messagenumber, adr);
 474}
 475
 476static inline void capi_fill_DISCONNECT_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 477                                             __u32 adr)
 478{
 479
 480        capi_cmsg_header(cmsg, ApplId, 0x04, 0x83, Messagenumber, adr);
 481}
 482
 483static inline void capi_fill_FACILITY_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 484                                           __u32 adr,
 485                                           __u16 FacilitySelector)
 486{
 487
 488        capi_cmsg_header(cmsg, ApplId, 0x80, 0x83, Messagenumber, adr);
 489        cmsg->FacilitySelector = FacilitySelector;
 490}
 491
 492static inline void capi_fill_INFO_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 493                                       __u32 adr)
 494{
 495
 496        capi_cmsg_header(cmsg, ApplId, 0x08, 0x83, Messagenumber, adr);
 497}
 498
 499static inline void capi_fill_MANUFACTURER_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 500                                               __u32 adr,
 501                                               __u32 ManuID,
 502                                               __u32 Class,
 503                                               __u32 Function,
 504                                               _cstruct ManuData)
 505{
 506
 507        capi_cmsg_header(cmsg, ApplId, 0xff, 0x83, Messagenumber, adr);
 508        cmsg->ManuID = ManuID;
 509        cmsg->Class = Class;
 510        cmsg->Function = Function;
 511        cmsg->ManuData = ManuData;
 512}
 513
 514static inline void capi_fill_RESET_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 515                                           __u32 adr)
 516{
 517
 518        capi_cmsg_header(cmsg, ApplId, 0x87, 0x83, Messagenumber, adr);
 519}
 520
 521#endif                          /* __CAPIUTIL_H__ */
 522