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
 169/*
 170 * Debugging / Tracing functions
 171 */
 172
 173char *capi_cmd2str(__u8 cmd, __u8 subcmd);
 174
 175typedef struct {
 176        u_char  *buf;
 177        u_char  *p;
 178        size_t  size;
 179        size_t  pos;
 180} _cdebbuf;
 181
 182#define CDEBUG_SIZE     1024
 183#define CDEBUG_GSIZE    4096
 184
 185void cdebbuf_free(_cdebbuf *cdb);
 186int cdebug_init(void);
 187void cdebug_exit(void);
 188
 189_cdebbuf *capi_cmsg2str(_cmsg *cmsg);
 190_cdebbuf *capi_message2str(__u8 *msg);
 191
 192/*-----------------------------------------------------------------------*/
 193
 194static inline void capi_cmsg_answer(_cmsg * cmsg)
 195{
 196        cmsg->Subcommand |= 0x01;
 197}
 198
 199/*-----------------------------------------------------------------------*/
 200
 201static inline void capi_fill_CONNECT_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 202                                            __u32 adr,
 203                                            _cstruct NCPI)
 204{
 205        capi_cmsg_header(cmsg, ApplId, 0x82, 0x80, Messagenumber, adr);
 206        cmsg->NCPI = NCPI;
 207}
 208
 209static inline void capi_fill_FACILITY_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 210                                          __u32 adr,
 211                                          __u16 FacilitySelector,
 212                                       _cstruct FacilityRequestParameter)
 213{
 214        capi_cmsg_header(cmsg, ApplId, 0x80, 0x80, Messagenumber, adr);
 215        cmsg->FacilitySelector = FacilitySelector;
 216        cmsg->FacilityRequestParameter = FacilityRequestParameter;
 217}
 218
 219static inline void capi_fill_INFO_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 220                                      __u32 adr,
 221                                      _cstruct CalledPartyNumber,
 222                                      _cstruct BChannelinformation,
 223                                      _cstruct Keypadfacility,
 224                                      _cstruct Useruserdata,
 225                                      _cstruct Facilitydataarray)
 226{
 227        capi_cmsg_header(cmsg, ApplId, 0x08, 0x80, Messagenumber, adr);
 228        cmsg->CalledPartyNumber = CalledPartyNumber;
 229        cmsg->BChannelinformation = BChannelinformation;
 230        cmsg->Keypadfacility = Keypadfacility;
 231        cmsg->Useruserdata = Useruserdata;
 232        cmsg->Facilitydataarray = Facilitydataarray;
 233}
 234
 235static inline void capi_fill_LISTEN_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 236                                        __u32 adr,
 237                                        __u32 InfoMask,
 238                                        __u32 CIPmask,
 239                                        __u32 CIPmask2,
 240                                        _cstruct CallingPartyNumber,
 241                                        _cstruct CallingPartySubaddress)
 242{
 243        capi_cmsg_header(cmsg, ApplId, 0x05, 0x80, Messagenumber, adr);
 244        cmsg->InfoMask = InfoMask;
 245        cmsg->CIPmask = CIPmask;
 246        cmsg->CIPmask2 = CIPmask2;
 247        cmsg->CallingPartyNumber = CallingPartyNumber;
 248        cmsg->CallingPartySubaddress = CallingPartySubaddress;
 249}
 250
 251static inline void capi_fill_ALERT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 252                                       __u32 adr,
 253                                       _cstruct BChannelinformation,
 254                                       _cstruct Keypadfacility,
 255                                       _cstruct Useruserdata,
 256                                       _cstruct Facilitydataarray)
 257{
 258        capi_cmsg_header(cmsg, ApplId, 0x01, 0x80, Messagenumber, adr);
 259        cmsg->BChannelinformation = BChannelinformation;
 260        cmsg->Keypadfacility = Keypadfacility;
 261        cmsg->Useruserdata = Useruserdata;
 262        cmsg->Facilitydataarray = Facilitydataarray;
 263}
 264
 265static inline void capi_fill_CONNECT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 266                                         __u32 adr,
 267                                         __u16 CIPValue,
 268                                         _cstruct CalledPartyNumber,
 269                                         _cstruct CallingPartyNumber,
 270                                         _cstruct CalledPartySubaddress,
 271                                         _cstruct CallingPartySubaddress,
 272                                         __u16 B1protocol,
 273                                         __u16 B2protocol,
 274                                         __u16 B3protocol,
 275                                         _cstruct B1configuration,
 276                                         _cstruct B2configuration,
 277                                         _cstruct B3configuration,
 278                                         _cstruct BC,
 279                                         _cstruct LLC,
 280                                         _cstruct HLC,
 281                                         _cstruct BChannelinformation,
 282                                         _cstruct Keypadfacility,
 283                                         _cstruct Useruserdata,
 284                                         _cstruct Facilitydataarray)
 285{
 286
 287        capi_cmsg_header(cmsg, ApplId, 0x02, 0x80, Messagenumber, adr);
 288        cmsg->CIPValue = CIPValue;
 289        cmsg->CalledPartyNumber = CalledPartyNumber;
 290        cmsg->CallingPartyNumber = CallingPartyNumber;
 291        cmsg->CalledPartySubaddress = CalledPartySubaddress;
 292        cmsg->CallingPartySubaddress = CallingPartySubaddress;
 293        cmsg->B1protocol = B1protocol;
 294        cmsg->B2protocol = B2protocol;
 295        cmsg->B3protocol = B3protocol;
 296        cmsg->B1configuration = B1configuration;
 297        cmsg->B2configuration = B2configuration;
 298        cmsg->B3configuration = B3configuration;
 299        cmsg->BC = BC;
 300        cmsg->LLC = LLC;
 301        cmsg->HLC = HLC;
 302        cmsg->BChannelinformation = BChannelinformation;
 303        cmsg->Keypadfacility = Keypadfacility;
 304        cmsg->Useruserdata = Useruserdata;
 305        cmsg->Facilitydataarray = Facilitydataarray;
 306}
 307
 308static inline void capi_fill_DATA_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 309                                         __u32 adr,
 310                                         __u32 Data,
 311                                         __u16 DataLength,
 312                                         __u16 DataHandle,
 313                                         __u16 Flags)
 314{
 315
 316        capi_cmsg_header(cmsg, ApplId, 0x86, 0x80, Messagenumber, adr);
 317        cmsg->Data = Data;
 318        cmsg->DataLength = DataLength;
 319        cmsg->DataHandle = DataHandle;
 320        cmsg->Flags = Flags;
 321}
 322
 323static inline void capi_fill_DISCONNECT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 324                                            __u32 adr,
 325                                            _cstruct BChannelinformation,
 326                                            _cstruct Keypadfacility,
 327                                            _cstruct Useruserdata,
 328                                            _cstruct Facilitydataarray)
 329{
 330
 331        capi_cmsg_header(cmsg, ApplId, 0x04, 0x80, Messagenumber, adr);
 332        cmsg->BChannelinformation = BChannelinformation;
 333        cmsg->Keypadfacility = Keypadfacility;
 334        cmsg->Useruserdata = Useruserdata;
 335        cmsg->Facilitydataarray = Facilitydataarray;
 336}
 337
 338static inline void capi_fill_DISCONNECT_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 339                                               __u32 adr,
 340                                               _cstruct NCPI)
 341{
 342
 343        capi_cmsg_header(cmsg, ApplId, 0x84, 0x80, Messagenumber, adr);
 344        cmsg->NCPI = NCPI;
 345}
 346
 347static inline void capi_fill_MANUFACTURER_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 348                                              __u32 adr,
 349                                              __u32 ManuID,
 350                                              __u32 Class,
 351                                              __u32 Function,
 352                                              _cstruct ManuData)
 353{
 354
 355        capi_cmsg_header(cmsg, ApplId, 0xff, 0x80, Messagenumber, adr);
 356        cmsg->ManuID = ManuID;
 357        cmsg->Class = Class;
 358        cmsg->Function = Function;
 359        cmsg->ManuData = ManuData;
 360}
 361
 362static inline void capi_fill_RESET_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 363                                          __u32 adr,
 364                                          _cstruct NCPI)
 365{
 366
 367        capi_cmsg_header(cmsg, ApplId, 0x87, 0x80, Messagenumber, adr);
 368        cmsg->NCPI = NCPI;
 369}
 370
 371static inline void capi_fill_SELECT_B_PROTOCOL_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 372                                                   __u32 adr,
 373                                                   __u16 B1protocol,
 374                                                   __u16 B2protocol,
 375                                                   __u16 B3protocol,
 376                                                _cstruct B1configuration,
 377                                                _cstruct B2configuration,
 378                                                _cstruct B3configuration)
 379{
 380
 381        capi_cmsg_header(cmsg, ApplId, 0x41, 0x80, Messagenumber, adr);
 382        cmsg->B1protocol = B1protocol;
 383        cmsg->B2protocol = B2protocol;
 384        cmsg->B3protocol = B3protocol;
 385        cmsg->B1configuration = B1configuration;
 386        cmsg->B2configuration = B2configuration;
 387        cmsg->B3configuration = B3configuration;
 388}
 389
 390static inline void capi_fill_CONNECT_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 391                                          __u32 adr,
 392                                          __u16 Reject,
 393                                          __u16 B1protocol,
 394                                          __u16 B2protocol,
 395                                          __u16 B3protocol,
 396                                          _cstruct B1configuration,
 397                                          _cstruct B2configuration,
 398                                          _cstruct B3configuration,
 399                                          _cstruct ConnectedNumber,
 400                                          _cstruct ConnectedSubaddress,
 401                                          _cstruct LLC,
 402                                          _cstruct BChannelinformation,
 403                                          _cstruct Keypadfacility,
 404                                          _cstruct Useruserdata,
 405                                          _cstruct Facilitydataarray)
 406{
 407        capi_cmsg_header(cmsg, ApplId, 0x02, 0x83, Messagenumber, adr);
 408        cmsg->Reject = Reject;
 409        cmsg->B1protocol = B1protocol;
 410        cmsg->B2protocol = B2protocol;
 411        cmsg->B3protocol = B3protocol;
 412        cmsg->B1configuration = B1configuration;
 413        cmsg->B2configuration = B2configuration;
 414        cmsg->B3configuration = B3configuration;
 415        cmsg->ConnectedNumber = ConnectedNumber;
 416        cmsg->ConnectedSubaddress = ConnectedSubaddress;
 417        cmsg->LLC = LLC;
 418        cmsg->BChannelinformation = BChannelinformation;
 419        cmsg->Keypadfacility = Keypadfacility;
 420        cmsg->Useruserdata = Useruserdata;
 421        cmsg->Facilitydataarray = Facilitydataarray;
 422}
 423
 424static inline void capi_fill_CONNECT_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 425                                                 __u32 adr)
 426{
 427
 428        capi_cmsg_header(cmsg, ApplId, 0x03, 0x83, Messagenumber, adr);
 429}
 430
 431static inline void capi_fill_CONNECT_B3_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 432                                                    __u32 adr)
 433{
 434
 435        capi_cmsg_header(cmsg, ApplId, 0x83, 0x83, Messagenumber, adr);
 436}
 437
 438static inline void capi_fill_CONNECT_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 439                                             __u32 adr,
 440                                             __u16 Reject,
 441                                             _cstruct NCPI)
 442{
 443        capi_cmsg_header(cmsg, ApplId, 0x82, 0x83, Messagenumber, adr);
 444        cmsg->Reject = Reject;
 445        cmsg->NCPI = NCPI;
 446}
 447
 448static inline void capi_fill_CONNECT_B3_T90_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 449                                                        __u32 adr)
 450{
 451
 452        capi_cmsg_header(cmsg, ApplId, 0x88, 0x83, Messagenumber, adr);
 453}
 454
 455static inline void capi_fill_DATA_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 456                                          __u32 adr,
 457                                          __u16 DataHandle)
 458{
 459
 460        capi_cmsg_header(cmsg, ApplId, 0x86, 0x83, Messagenumber, adr);
 461        cmsg->DataHandle = DataHandle;
 462}
 463
 464static inline void capi_fill_DISCONNECT_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 465                                                __u32 adr)
 466{
 467
 468        capi_cmsg_header(cmsg, ApplId, 0x84, 0x83, Messagenumber, adr);
 469}
 470
 471static inline void capi_fill_DISCONNECT_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 472                                             __u32 adr)
 473{
 474
 475        capi_cmsg_header(cmsg, ApplId, 0x04, 0x83, Messagenumber, adr);
 476}
 477
 478static inline void capi_fill_FACILITY_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 479                                           __u32 adr,
 480                                           __u16 FacilitySelector)
 481{
 482
 483        capi_cmsg_header(cmsg, ApplId, 0x80, 0x83, Messagenumber, adr);
 484        cmsg->FacilitySelector = FacilitySelector;
 485}
 486
 487static inline void capi_fill_INFO_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 488                                       __u32 adr)
 489{
 490
 491        capi_cmsg_header(cmsg, ApplId, 0x08, 0x83, Messagenumber, adr);
 492}
 493
 494static inline void capi_fill_MANUFACTURER_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 495                                               __u32 adr,
 496                                               __u32 ManuID,
 497                                               __u32 Class,
 498                                               __u32 Function,
 499                                               _cstruct ManuData)
 500{
 501
 502        capi_cmsg_header(cmsg, ApplId, 0xff, 0x83, Messagenumber, adr);
 503        cmsg->ManuID = ManuID;
 504        cmsg->Class = Class;
 505        cmsg->Function = Function;
 506        cmsg->ManuData = ManuData;
 507}
 508
 509static inline void capi_fill_RESET_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
 510                                           __u32 adr)
 511{
 512
 513        capi_cmsg_header(cmsg, ApplId, 0x87, 0x83, Messagenumber, adr);
 514}
 515
 516#endif                          /* __CAPIUTIL_H__ */
 517