I hope it is know readable for everybody.

This commit is contained in:
Carsten Paeth 1998-08-30 09:57:22 +00:00
parent efbc36f4e7
commit 73f411e5c3
10 changed files with 3645 additions and 0 deletions

5
capi20/.cvsignore Normal file
View File

@ -0,0 +1,5 @@
config.log
config.cache
config.status
Makefile
comperr

52
capi20/Makefile.in Normal file
View File

@ -0,0 +1,52 @@
# $Id$
#
# Makefile for libcapi20
# (C) 1998 Carsten Paeth
#
# $Log$
# Revision 1.1 1998/08/25 16:33:14 calle
# Added CAPI2.0 library. First Version.
#
#
prefix := @prefix@
exec_prefix := @exec_prefix@
LIBDIR := @libdir@
INCLUDEDIR := @includedir@
INSTALL := @INSTALL@
INSTALL_DATA := $(INSTALL) -m 0644 -o 0 -g 0
all: libcapi20.a
install: all
$(INSTALL_DATA) libcapi20.a $(LIBDIR)
$(INSTALL_DATA) capi20.h $(INCLUDEDIR)
ifeq (.depend,$(wildcard .depend))
include .depend
endif
.depend:
$(CPP) -M $(CFLAGS) $(DEFS) *.c >.depend
depend: .depend
config:
@./configure
Makefile: Makefile.in config.status
./config.status
config.status: configure
./config.status --recheck
libcapi20.a: capi20.o capifunc.o convert.o
@rm -f $@
$(AR) cvq $@ $^
clean:
rm -f *.o libcapi20.a libcapi20.so.* comperr
distclean: clean
rm -f config.status config.cache config.log Makefile .depend

41
capi20/aclocal.m4 vendored Normal file
View File

@ -0,0 +1,41 @@
dnl
dnl Try finding linux sourcetree
dnl
AC_DEFUN(AC_FIND_KERNEL, [
OLD_CPPFLAGS="$CPPFLAGS"
lxdir="no"
eval tst_kerneldir=$CONFIG_KERNELDIR
AC_ARG_WITH(kernel,
[ --with-kernel=DIR Set kernel source directory [/usr/src/linux]],
DOTEST="y"; tst_kerneldir="${withval}")
if test "$DOTEST" = "y" || test "$CONFIG_KERNELDIR" != "" ; then
AC_MSG_CHECKING([for linux kernel source in ${tst_kerneldir}])
CPPFLAGS="-nostdinc -I${tst_kerneldir}/drivers/isdn"
AC_TRY_CPP([#include <isdn_common.h>], lxdir=${tst_kerneldir},
AC_MSG_RESULT("no"))
fi
if test "$lxdir" = "no" ; then
AC_MSG_CHECKING([for linux kernel source in /usr/src/linux])
CPPFLAGS="-nostdinc -I/usr/src/linux/drivers/isdn"
AC_TRY_CPP([#include <isdn_common.h>], lxdir=/usr/src/linux)
fi
if test "$lxdir" = "no" ; then
AC_MSG_RESULT("$lxdir")
AC_MSG_CHECKING([for linux kernel source in /usr/local/src/linux])
CPPFLAGS="-nostdinc -I/usr/local/src/linux/drivers/isdn"
AC_TRY_CPP([#include <isdn_common.h>], lxdir=/usr/local/src/linux)
fi
if test "$lxdir" != "no" ; then
AC_MSG_RESULT("yes")
else
lxdir=""
AC_MSG_ERROR("Kernel source not found. You MUST specify a correct path to the linux source in the configuration.")
fi
CONFIG_KERNELDIR="$lxdir"
CPPFLAGS="$OLD_CPPFLAGS"
AC_DEFINE_UNQUOTED(CONFIG_KERNELDIR,"$lxdir")
AC_SUBST(CONFIG_KERNELDIR)
])

323
capi20/capi20.c Normal file
View File

@ -0,0 +1,323 @@
/*
* $Id$
*
* $Log$
* Revision 1.1 1998/08/25 16:33:16 calle
* Added CAPI2.0 library. First Version.
*
*/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <linux/capi.h>
#include "capi20.h"
static int capi_fd = -1;
static capi_ioctl_struct ioctl_data;
static unsigned char rcvbuf[128+2048]; /* message + data */
static unsigned char sndbuf[128+2048]; /* message + data */
unsigned capi20_isinstalled (void)
{
if (capi_fd >= 0)
return 1;
/*----- open managment link -----*/
if ((capi_fd = open("/dev/capi20", O_RDWR, 0666)) < 0)
return 0;
return ioctl(capi_fd, CAPI_INSTALLED, 0) == 0;
}
/*
* managment of application ids
*/
static struct capi_applidmap {
int used;
int fd;
} capi_applidmap[CAPI_MAXAPPL] = {0};
static inline _cword allocapplid(int fd)
{
_cword i;
for (i=0; i < CAPI_MAXAPPL; i++) {
if (capi_applidmap[i].used == 0) {
capi_applidmap[i].used = 1;
capi_applidmap[i].fd = fd;
return i+1;
}
}
return 0;
}
static inline void freeapplid(_cword applid)
{
capi_applidmap[applid-1].used = 0;
capi_applidmap[applid-1].fd = -1;
}
static inline int validapplid(_cword applid)
{
return applid > 0 && applid <= CAPI_MAXAPPL
&& capi_applidmap[applid-1].used;
}
static inline int applid2fd(_cword applid)
{
if (applid < CAPI_MAXAPPL)
return capi_applidmap[applid-1].fd;
return -1;
}
/*
* CAPI2.0 functions
*/
_cword
capi20_register (unsigned MaxB3Connection,
unsigned MaxB3Blks,
unsigned MaxSizeB3,
CAPI_REGISTER_ERROR *ErrorCode)
{
_cword applid;
char buf[PATH_MAX];
int i, fd = -1;
if (!capi20_isinstalled()) {
*ErrorCode = CapiRegNotInstalled;
return 0;
}
*ErrorCode = CapiRegOSResourceErr;
for (i=0; fd < 0; i++) {
/*----- open pseudo-clone device -----*/
sprintf(buf, "/dev/capi20.%02d", i);
if ((fd = open(buf, O_RDWR|O_NONBLOCK, 0666)) < 0) {
switch (errno) {
case EEXIST:
break;
default:
return 0;
}
}
}
if ((applid = allocapplid(fd)) == 0)
return 0;
ioctl_data.rparams.level3cnt = MaxB3Connection;
ioctl_data.rparams.datablkcnt = MaxB3Blks;
ioctl_data.rparams.datablklen = MaxSizeB3;
if (ioctl(fd, CAPI_REGISTER, &ioctl_data) < 0) {
if (errno == EIO) {
if (ioctl(fd, CAPI_GET_ERRCODE, &ioctl_data) < 0)
return 0;
*ErrorCode = ioctl_data.errcode;
}
return 0;
}
return applid;
}
MESSAGE_EXCHANGE_ERROR
capi20_release (unsigned Appl_Id)
{
if (!capi20_isinstalled())
return CapiRegNotInstalled;
if (!validapplid(Appl_Id))
return CapiIllAppNr;
(void)close(applid2fd(Appl_Id));
freeapplid(Appl_Id);
return CapiNoError;
}
MESSAGE_EXCHANGE_ERROR
capi20_put_message (CAPI_MESSAGE Msg, unsigned Appl_Id)
{
MESSAGE_EXCHANGE_ERROR ret;
int len = (Msg[0] | (Msg[1] << 8));
int cmd = Msg[4];
int subcmd = Msg[5];
int rc;
int fd;
if (!capi20_isinstalled())
return CapiRegNotInstalled;
if (!validapplid(Appl_Id))
return CapiIllAppNr;
fd = applid2fd(Appl_Id);
memcpy(sndbuf, Msg, len);
if (cmd == CAPI_DATA_B3 && subcmd == CAPI_REQ) {
int datalen = (Msg[16] | (Msg[17] << 8));
void *dataptr = (void *)(Msg[12]|(Msg[13]<<8)|(Msg[14]<<16)|(Msg[15]<<24));
memcpy(sndbuf+len, dataptr, datalen);
len += datalen;
}
ret = CapiNoError;
errno = 0;
if ((rc = write(fd, sndbuf, len)) != len) {
switch (errno) {
case EFAULT:
case EINVAL:
ret = CapiIllCmdOrSubcmdOrMsgToSmall;
break;
case EBADF:
ret = CapiIllAppNr;
break;
case EIO:
if (ioctl(fd, CAPI_GET_ERRCODE, &ioctl_data) < 0)
ret = CapiMsgOSResourceErr;
else ret = (MESSAGE_EXCHANGE_ERROR)ioctl_data.errcode;
break;
default:
ret = CapiMsgOSResourceErr;
break;
}
}
return ret;
}
MESSAGE_EXCHANGE_ERROR
capi20_get_message (unsigned Appl_Id, CAPI_MESSAGE *ReturnMessage)
{
MESSAGE_EXCHANGE_ERROR ret;
int rc, fd;
if (!capi20_isinstalled())
return CapiRegNotInstalled;
if (!validapplid(Appl_Id))
return CapiIllAppNr;
fd = applid2fd(Appl_Id);
*ReturnMessage = rcvbuf;
if ((rc = read(fd, rcvbuf, sizeof(rcvbuf))) > 0) {
return CapiNoError;
}
if (rc == 0)
return CapiReceiveQueueEmpty;
switch (errno) {
case EMSGSIZE:
ret = CapiIllCmdOrSubcmdOrMsgToSmall;
break;
case EAGAIN:
return CapiReceiveQueueEmpty;
default:
ret = CapiMsgOSResourceErr;
break;
}
return ret;
}
CAPI_MESSAGE
capi20_get_manufacturer(unsigned contr, CAPI_MESSAGE LpBuffer)
{
if (!capi20_isinstalled())
return 0;
ioctl_data.contr = contr;
if (ioctl(capi_fd, CAPI_GET_MANUFACTURER, &ioctl_data) < 0)
return 0;
strncpy(LpBuffer, ioctl_data.manufacturer, CAPI_MANUFACTURER_LEN);
return LpBuffer;
}
CAPI_MESSAGE
capi20_get_version(unsigned contr, CAPI_MESSAGE version)
{
if (!capi20_isinstalled())
return 0;
ioctl_data.contr = contr;
if (ioctl(capi_fd, CAPI_GET_VERSION, &ioctl_data) < 0)
return 0;
memcpy(version, &ioctl_data.version, sizeof(capi_version));
return version;
}
CAPI_MESSAGE
capi20_get_serial_number(unsigned contr, CAPI_MESSAGE LpBuffer)
{
if (!capi20_isinstalled())
return 0;
ioctl_data.contr = contr;
if (ioctl(capi_fd, CAPI_GET_SERIAL, &ioctl_data) < 0)
return 0;
memcpy(LpBuffer, &ioctl_data.serial, CAPI_SERIAL_LEN);
return LpBuffer;
}
MESSAGE_EXCHANGE_ERROR
capi20_get_profile(unsigned Controller, CAPI_MESSAGE LpBuffer)
{
if (!capi20_isinstalled())
return CapiMsgNotInstalled;
ioctl_data.contr = Controller;
if (ioctl(capi_fd, CAPI_GET_PROFILE, &ioctl_data) < 0) {
if (errno != EIO)
return CapiMsgOSResourceErr;
if (ioctl(capi_fd, CAPI_GET_ERRCODE, &ioctl_data) < 0)
return CapiMsgOSResourceErr;
return (MESSAGE_EXCHANGE_ERROR)ioctl_data.errcode;
}
if (Controller)
memcpy(LpBuffer, &ioctl_data.profile, CAPI_SERIAL_LEN);
else
memcpy(LpBuffer, &ioctl_data.profile.ncontroller,
sizeof(ioctl_data.profile.ncontroller));
return CapiNoError;
}
/*
* functions added to the CAPI2.0 spec
*/
MESSAGE_EXCHANGE_ERROR
capi20_waitformessage(_cword Appl_Id, struct timeval *tvp)
{
int fd;
fd_set rfds;
int retval;
FD_ZERO(&rfds);
if(!capi20_isinstalled())
return CapiRegNotInstalled;
if(!validapplid(Appl_Id))
return CapiIllAppNr;
fd = applid2fd(Appl_Id);
FD_SET(fd, &rfds);
fcntl(fd, F_SETFL, !O_NONBLOCK);
retval = select(fd + 1, &rfds, NULL, NULL, tvp);
fcntl(fd, F_SETFL, O_NONBLOCK);
return(CapiNoError);
}
int
capi20_fileno(_cword applid)
{
return applid2fd(applid);
}

957
capi20/capi20.h Normal file
View File

@ -0,0 +1,957 @@
#ifndef __CAPI20_H
#define __CAPI20_H
#include <time.h>
#ifdef __cplusplus
extern "C" {
#endif
/*----- basic-type definitions -----*/
typedef unsigned char *CAPI_MESSAGE;
typedef unsigned char _cbyte;
typedef unsigned short _cword;
typedef unsigned long _cdword;
typedef CAPI_MESSAGE _cstruct;
typedef enum { CAPI_COMPOSE = 0, CAPI_DEFAULT = 1 } _cmstruct;
/*----- errornumbers -----*/
typedef enum {
CapiToManyAppls =0x1001,
CapiLogBlkSizeToSmall =0x1002,
CapiBuffExeceeds64k =0x1003,
CapiMsgBufSizeToSmall =0x1004,
CapiAnzLogConnNotSupported =0x1005,
CapiRegReserved =0x1006,
CapiRegBusy =0x1007,
CapiRegOSResourceErr =0x1008,
CapiRegNotInstalled =0x1009,
CapiRegCtrlerNotSupportExtEquip =0x100a,
CapiRegCtrlerOnlySupportExtEquip =0x100b
} CAPI_REGISTER_ERROR;
typedef enum {
CapiNoError =0x0000,
CapiIllAppNr =0x1101,
CapiIllCmdOrSubcmdOrMsgToSmall =0x1102,
CapiSendQueueFull =0x1103,
CapiReceiveQueueEmpty =0x1104,
CapiReceiveOverflow =0x1105,
CapiUnknownNotPar =0x1106,
CapiMsgBusy =0x1107,
CapiMsgOSResourceErr =0x1108,
CapiMsgNotInstalled =0x1109,
CapiMsgCtrlerNotSupportExtEquip =0x110a,
CapiMsgCtrlerOnlySupportExtEquip =0x110b
} MESSAGE_EXCHANGE_ERROR;
/*----- CAPI commands -----*/
#define CAPI_ALERT 0x01
#define CAPI_CONNECT 0x02
#define CAPI_CONNECT_ACTIVE 0x03
#define CAPI_CONNECT_B3_ACTIVE 0x83
#define CAPI_CONNECT_B3 0x82
#define CAPI_CONNECT_B3_T90_ACTIVE 0x88
#define CAPI_DATA_B3 0x86
#define CAPI_DISCONNECT_B3 0x84
#define CAPI_DISCONNECT 0x04
#define CAPI_FACILITY 0x80
#define CAPI_INFO 0x08
#define CAPI_LISTEN 0x05
#define CAPI_MANUFACTURER 0xff
#define CAPI_RESET_B3 0x87
#define CAPI_SELECT_B_PROTOCOL 0x41
/*----- CAPI subcommands -----*/
#define CAPI_REQ 0x80
#define CAPI_CONF 0x81
#define CAPI_IND 0x82
#define CAPI_RESP 0x83
/* standard CAPI2.0 functions */
unsigned capi20_isinstalled (void);
_cword capi20_register (unsigned MaxB3Connection,
unsigned MaxB3Blks,
unsigned MaxSizeB3,
CAPI_REGISTER_ERROR *ErrorCode);
MESSAGE_EXCHANGE_ERROR capi20_release (unsigned Appl_Id);
MESSAGE_EXCHANGE_ERROR capi20_put_message (CAPI_MESSAGE Msg, unsigned Appl_Id);
MESSAGE_EXCHANGE_ERROR capi20_get_message (unsigned Appl_Id, CAPI_MESSAGE *ReturnMessage);
CAPI_MESSAGE capi20_get_manufacturer (unsigned contr, CAPI_MESSAGE LpBuffer);
CAPI_MESSAGE capi20_get_version (unsigned contr, CAPI_MESSAGE version);
CAPI_MESSAGE capi20_get_serial_number (unsigned contr, CAPI_MESSAGE LpBuffer);
MESSAGE_EXCHANGE_ERROR capi20_get_profile (unsigned Controller, CAPI_MESSAGE LpBuffer);
/* CAPI2.0 Spec names */
#define CAPI20_REGISTER capi20_register
#define CAPI20_RELEASE capi20_release
#define CAPI20_PUT_MESSAGE capi20_put_message
#define CAPI20_GET_MESSAGE capi20_get_message
#define CAPI20_GET_MANUFACTURER capi20_get_manufacturer
#define CAPI20_GET_VERSION capi20_get_version
#define CAPI20_GET_SERIAL_NUMBER capi20_get_serial_number
#define CAPI20_GET_PROFILE capi20_get_profile
/* extra functions */
#define CAPI20_WaitforMessage capi20_waitformessage
MESSAGE_EXCHANGE_ERROR capi20_waitformessage(_cword Appl_Id, struct timeval *tvp);
int capi20_fileno(_cword applid);
/*
* The _cmsg structure contains all possible CAPI 2.0 parameter.
* All parameters are stored here first. The function capi_cmsg2message()
* assembles the parameter and builds CAPI2.0 conform messages.
* capi_message2cmsg disassembles CAPI 2.0 messages and stores the
* parameter in the _cmsg structure
*/
typedef struct {
/* Header */
_cword ApplId;
_cbyte Command;
_cbyte Subcommand;
_cword Messagenumber;
/* Parameter */
union {
_cdword adrController;
_cdword adrPLCI;
_cdword adrNCCI;
} adr;
_cmstruct AdditionalInfo;
_cstruct B1configuration;
_cword B1protocol;
_cstruct B2configuration;
_cword B2protocol;
_cstruct B3configuration;
_cword B3protocol;
_cstruct BC;
_cstruct BChannelinformation;
_cmstruct BProtocol;
_cstruct CalledPartyNumber;
_cstruct CalledPartySubaddress;
_cstruct CallingPartyNumber;
_cstruct CallingPartySubaddress;
_cdword CIPmask;
_cdword CIPmask2;
_cword CIPValue;
_cdword Class;
_cstruct ConnectedNumber;
_cstruct ConnectedSubaddress;
_cdword Data;
_cword DataHandle;
_cword DataLength;
_cstruct FacilityConfirmationParameter;
_cstruct Facilitydataarray;
_cstruct FacilityIndicationParameter;
_cstruct FacilityRequestParameter;
_cstruct FacilityResponseParameters;
_cword FacilitySelector;
_cword Flags;
_cdword Function;
_cstruct HLC;
_cword Info;
_cstruct InfoElement;
_cdword InfoMask;
_cword InfoNumber;
_cstruct Keypadfacility;
_cstruct LLC;
_cstruct ManuData;
_cdword ManuID;
_cstruct NCPI;
_cword Reason;
_cword Reason_B3;
_cword Reject;
_cstruct Useruserdata;
/* intern */
unsigned l,p;
unsigned char *par;
CAPI_MESSAGE m;
} _cmsg;
unsigned capi_cmsg2message(_cmsg *cmsg, CAPI_MESSAGE msg);
unsigned capi_message2cmsg (_cmsg *cmsg, CAPI_MESSAGE msg);
/*
* capi_put_cmsg() works like capi_put_message() but it converts the _cmsg
* first with capi_cmsg2message(). Possible errors from capi_put_message()
* will be returned.
*/
unsigned capi_put_cmsg(_cmsg *cmsg);
/*
* capi_get_cmsg() works like capi_get_message() and converts the CAPI message
* to a _cmsg with capi_message2cmsg(). Possible errors from capi_get_message()
* will be returned.
*/
unsigned capi_get_cmsg(_cmsg *cmsg, unsigned applid);
/*
* capi_cmsg_header() fills the _cmsg structure with default values, so only
* parameter with non default values must be changed before sending the
* message.
*/
unsigned capi_cmsg_header (_cmsg *cmsg, _cword _ApplId, _cbyte _Command, _cbyte _Subcommand, _cword _Messagenumber, _cdword _Controller);
/*
* capi_cmsg_answer() is used to answer indications. It changes the header
* of an indication to a response, and leaves all other parameters the same
*/
unsigned capi_cmsg_answer (_cmsg *cmsg);
/*----- defines to access specific parameter -----*/
#define ALERT_REQ_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define ALERT_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo)
/* Additional info elements */
#define ALERT_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation)
#define ALERT_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility)
/* coded according to ETS 300 102-1 / Q.931 */
#define ALERT_REQ_USERUSERDATA(x) ((x)->Useruserdata)
/* coded according to ETS 300 102-1 / Q.931 */
#define ALERT_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray)
/* which is used to transfer additional parameters coded */
/* according to ETS 300 102-1 / Q.931 starting from octet 1. */
/* This field is used to transport one or more complete facility */
/* data information elements. */
#define ALERT_CONF_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define ALERT_CONF_INFO(x) ((x)->Info)
/* 0: alert initiated */
/* 0x0003: alert already sent by another application */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal PLCI */
/* 0x2007: illegal message parameter coding */
#define CONNECT_REQ_CONTROLLER(x) ((x)->adr.adrController)
#define CONNECT_REQ_CIPVALUE(x) ((x)->CIPValue)
/* Compatibility Information Profile */
#define CONNECT_REQ_CALLEDPARTYNUMBER(x) ((x)->CalledPartyNumber)
/* Called party number */
#define CONNECT_REQ_CALLINGPARTYNUMBER(x) ((x)->CallingPartyNumber)
/* Calling party number */
#define CONNECT_REQ_CALLEDPARTYSUBADDRESS(x) ((x)->CalledPartySubaddress)
/* Called party subaddress */
#define CONNECT_REQ_CALLINGPARTYSUBADDRESS(x) ((x)->CallingPartySubaddress)
/* Calling party subaddress */
#define CONNECT_REQ_BPROTOCOL(x) ((x)->BProtocol)
/* B protocol to be used */
#define CONNECT_REQ_B1PROTOCOL(x) ((x)->B1protocol)
/* Physical layer and framing */
#define CONNECT_REQ_B2PROTOCOL(x) ((x)->B2protocol)
/* Data link layer */
#define CONNECT_REQ_B3PROTOCOL(x) ((x)->B3protocol)
/* Network layer */
#define CONNECT_REQ_B1CONFIGURATION(x) ((x)->B1configuration)
/* Physical layer and framing parameter */
#define CONNECT_REQ_B2CONFIGURATION(x) ((x)->B2configuration)
/* Data link layer parameter */
#define CONNECT_REQ_B3CONFIGURATION(x) ((x)->B3configuration)
/* Network layer parameter */
#define CONNECT_REQ_BC(x) ((x)->BC)
/* Bearer Capability */
#define CONNECT_REQ_LLC(x) ((x)->LLC)
/* Low Layer Compatibility */
#define CONNECT_REQ_HLC(x) ((x)->HLC)
/* High Layer Compatibility */
#define CONNECT_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo)
/* Additional information elements */
#define CONNECT_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation)
#define CONNECT_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility)
/* coded according to ETS 300 102-1 / Q.931 */
#define CONNECT_REQ_USERUSERDATA(x) ((x)->Useruserdata)
/* coded according to ETS 300 102-1 / Q.931 */
#define CONNECT_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray)
/* which is used to transfer additional parameters coded */
/* according to ETS 300 102-1 / Q.931 starting from octet 1. */
/* This field is used to transport one or more complete facility */
/* data information elements. */
#define CONNECT_CONF_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define CONNECT_CONF_INFO(x) ((x)->Info)
/* 0: connect initiated */
/* 0x2002: illegal controller */
/* 0x2003: out of PLCI */
/* 0x2007: illegal message parameter coding */
/* 0x3001: B1 protocol not supported */
/* 0x3002: B2 protocol not supported */
/* 0x3003: B3 protocol not supported */
/* 0x3004: B1 protocol parameter not supported */
/* 0x3005: B2 protocol parameter not supported */
/* 0x3006: B3 protocol parameter not supported */
/* 0x3007: B protocol combination not supported */
/* 0x300A: CIP Value unknown */
#define CONNECT_IND_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define CONNECT_IND_CIPVALUE(x) ((x)->CIPValue)
/* Compatibility Information Profile */
#define CONNECT_IND_CALLEDPARTYNUMBER(x) ((x)->CalledPartyNumber)
/* Called party number */
#define CONNECT_IND_CALLINGPARTYNUMBER(x) ((x)->CallingPartyNumber)
/* Calling party number */
#define CONNECT_IND_CALLEDPARTYSUBADDRESS(x) ((x)->CalledPartySubaddress)
/* Called party subaddress */
#define CONNECT_IND_CALLINGPARTYSUBADDRESS(x) ((x)->CallingPartySubaddress)
/* Calling party subaddress */
#define CONNECT_IND_BC(x) ((x)->BC)
/* Bearer compatibility */
#define CONNECT_IND_LLC(x) ((x)->LLC)
/* Low Layer Compatibility */
#define CONNECT_IND_HLC(x) ((x)->HLC)
/* High Layer Compatibility */
#define CONNECT_IND_ADDITIONALINFO(x) ((x)->AdditionalInfo)
/* Additional information elements */
#define CONNECT_IND_BCHANNELINFORMATION(x) ((x)->BChannelinformation)
#define CONNECT_IND_KEYPADFACILITY(x) ((x)->Keypadfacility)
/* coded according to ETS 300 102-1 / Q.931 */
#define CONNECT_IND_USERUSERDATA(x) ((x)->Useruserdata)
/* coded according to ETS 300 102-1 / Q.931 */
#define CONNECT_IND_FACILITYDATAARRAY(x) ((x)->Facilitydataarray)
/* which is used to transfer additional parameters coded */
/* according to ETS 300 102-1 / Q.931 starting from octet 1. */
/* This field is used to transport one or more complete facility */
/* data information elements. */
#define CONNECT_RESP_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define CONNECT_RESP_REJECT(x) ((x)->Reject)
/* 0: accept call */
/* 1: ignore call */
/* 2: reject call, normal call clearing */
/* 3: reject call, user busy */
/* 4: reject call, requestet circuit/channel not available */
/* 5: reject call, facility rejected */
/* 6: reject call, channel unacceptable */
/* 7: reject call, incompatible destination */
/* 8: reject call, destination out of order */
#define CONNECT_RESP_BPROTOCOL(x) ((x)->BProtocol)
/* B protocol to be used */
#define CONNECT_RESP_B1PROTOCOL(x) ((x)->B1protocol)
/* Physical layer and framing */
#define CONNECT_RESP_B2PROTOCOL(x) ((x)->B2protocol)
/* Data link layer */
#define CONNECT_RESP_B3PROTOCOL(x) ((x)->B3protocol)
/* Network layer */
#define CONNECT_RESP_B1CONFIGURATION(x) ((x)->B1configuration)
/* Physical layer and framing parameter */
#define CONNECT_RESP_B2CONFIGURATION(x) ((x)->B2configuration)
/* Data link layer parameter */
#define CONNECT_RESP_B3CONFIGURATION(x) ((x)->B3configuration)
/* Network layer parameter */
#define CONNECT_RESP_CONNECTEDNUMBER(x) ((x)->ConnectedNumber)
/* Connected number */
#define CONNECT_RESP_CONNECTEDSUBADDRESS(x) ((x)->ConnectedSubaddress)
/* Connected subaddress */
#define CONNECT_RESP_LLC(x) ((x)->LLC)
/* Low Layer Compatibility */
#define CONNECT_RESP_ADDITIONALINFO(x) ((x)->AdditionalInfo)
/* Additional information elements */
#define CONNECT_RESP_BCHANNELINFORMATION(x) ((x)->BChannelinformation)
#define CONNECT_RESP_KEYPADFACILITY(x) ((x)->Keypadfacility)
/* coded according to ETS 300 102-1 / Q.931 */
#define CONNECT_RESP_USERUSERDATA(x) ((x)->Useruserdata)
/* coded according to ETS 300 102-1 / Q.931 */
#define CONNECT_RESP_FACILITYDATAARRAY(x) ((x)->Facilitydataarray)
/* which is used to transfer additional parameters coded */
/* according to ETS 300 102-1 / Q.931 starting from octet 1. */
/* This field is used to transport one or more complete facility */
/* data information elements. */
#define CONNECT_ACTIVE_IND_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define CONNECT_ACTIVE_IND_CONNECTEDNUMBER(x) ((x)->ConnectedNumber)
/* Connected number */
#define CONNECT_ACTIVE_IND_CONNECTEDSUBADDRESS(x) ((x)->ConnectedSubaddress)
/* Connected subaddress */
#define CONNECT_ACTIVE_IND_LLC(x) ((x)->LLC)
/* Low Layer Compatibility */
#define CONNECT_ACTIVE_RESP_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define CONNECT_B3_ACTIVE_IND_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define CONNECT_B3_ACTIVE_IND_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define CONNECT_B3_ACTIVE_RESP_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define CONNECT_B3_REQ_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define CONNECT_B3_REQ_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define CONNECT_B3_CONF_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define CONNECT_B3_CONF_INFO(x) ((x)->Info)
/* 0: connect initiated */
/* 0x0001: NCPI not supported by current protocol, NCPI ignored */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal PLCI */
/* 0x2004: out of NCCI */
/* 0x3008: NCPI not supported */
#define CONNECT_B3_IND_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define CONNECT_B3_IND_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define CONNECT_B3_RESP_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define CONNECT_B3_RESP_REJECT(x) ((x)->Reject)
/* 0: accept call */
/* 2: reject call, normal call clearing */
#define CONNECT_B3_RESP_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define CONNECT_B3_T90_ACTIVE_IND_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define CONNECT_B3_T90_ACTIVE_IND_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define CONNECT_B3_T90_ACTIVE_RESP_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DATA_B3_REQ_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DATA_B3_REQ_DATA(x) ((x)->Data)
/* Pointer to the data to be sent */
#define DATA_B3_REQ_DATALENGTH(x) ((x)->DataLength)
/* Size of data area to be sent */
#define DATA_B3_REQ_DATAHANDLE(x) ((x)->DataHandle)
/* Referenced in DATA_B3_CONF */
#define DATA_B3_REQ_FLAGS(x) ((x)->Flags)
/* [0]: qualifier bit */
/* [1]: more data bit */
/* [2]: delivery confirmation bit */
/* [3]: expedited data */
/* [4] to [15]: reserved */
#define DATA_B3_CONF_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DATA_B3_CONF_DATAHANDLE(x) ((x)->DataHandle)
/* Identifies the data area of corresponding DATA_B3_REQ */
#define DATA_B3_CONF_INFO(x) ((x)->Info)
/* 0: data transmission initiated */
/* 0x0002: flags not supported by current protocol, flags ignored */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal NCCI */
/* 0x2007: illegal message parameter coding */
/* 0x300A: flags not supported (reserved bits) */
/* 0x300C: data length not supported by current protocol */
#define DATA_B3_IND_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DATA_B3_IND_DATA(x) ((x)->Data)
/* Pointer to data received */
#define DATA_B3_IND_DATALENGTH(x) ((x)->DataLength)
/* Size of data area received */
#define DATA_B3_IND_DATAHANDLE(x) ((x)->DataHandle)
/* handle to data area, referenced in DATA_B3_RESP */
#define DATA_B3_IND_FLAGS(x) ((x)->Flags)
/* 0: qualifier bit */
/* 1: more-data bit */
/* 2: delivery confirmation bit */
/* 3: expedited data */
/* 4 to 14: reserved */
/* [15]: framing error bit, data may be invalid (only with corresponding B2 protocol) */
#define DATA_B3_RESP_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DATA_B3_RESP_DATAHANDLE(x) ((x)->DataHandle)
/* Data area reference in corresponding DATA_B3_IND */
#define DISCONNECT_B3_REQ_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DISCONNECT_B3_REQ_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define DISCONNECT_B3_CONF_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DISCONNECT_B3_CONF_INFO(x) ((x)->Info)
/* 0: disconnect initiated */
/* 0x0001: NCPI not supported by current protocol, NCPI ignored */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal NCCI */
/* 0x2007: illegal message parameter coding */
/* 0x3008: NCPI not supported */
#define DISCONNECT_B3_IND_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DISCONNECT_B3_IND_REASON_B3(x) ((x)->Reason_B3)
/* 0: clearing according to protocol */
/* 0x3301: protocol error layer 1 */
/* 0x3302: protocol error layer 2 */
/* 0x3303: protocol error layer 3 */
/* protocol dependent values are described in chapter 6 */
#define DISCONNECT_B3_IND_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define DISCONNECT_B3_RESP_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define DISCONNECT_REQ_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define DISCONNECT_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo)
/* Additional information elements */
#define DISCONNECT_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation)
#define DISCONNECT_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility)
/* coded according to ETS 300 102-1 / Q.931 */
#define DISCONNECT_REQ_USERUSERDATA(x) ((x)->Useruserdata)
/* coded according to ETS 300 102-1 / Q.931 */
#define DISCONNECT_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray)
/* which is used to transfer additional parameters coded */
/* according to ETS 300 102-1 / Q.931 starting from octet 1. */
/* This field is used to transport one or more complete facility */
/* data information elements. */
#define DISCONNECT_CONF_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define DISCONNECT_CONF_INFO(x) ((x)->Info)
/* 0: disconnect initiated */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal PLCI */
/* 0x2007: illegal message parameter coding */
#define DISCONNECT_IND_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define DISCONNECT_IND_REASON(x) ((x)->Reason)
/* 0: no cause available */
/* 0x3301: protocol error layer 1 */
/* 0x3302: protocol error layer 2 */
/* 0x3303: protocol error layer 3 */
/* 0x3304: another application got that call */
/* 0x34xx: disconnect cause from the network according to Q.931/ETS 300 102-1. In the field 'xx' the cause value received within a cause information element (octet 4) from the network is indicated. */
#define DISCONNECT_RESP_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define FACILITY_REQ_CONTROLLER(x) ((x)->adr.adrController)
#define FACILITY_REQ_PLCI(x) ((x)->adr.adrPLCI)
#define FACILITY_REQ_NCCI(x) ((x)->adr.adrNCCI)
/* Depending on the facility selector */
#define FACILITY_REQ_FACILITYSELECTOR(x) ((x)->FacilitySelector)
/* 0: Handset Support */
/* 1: DTMF */
/* 2 to n: reserved */
#define FACILITY_REQ_FACILITYREQUESTPARAMETER(x) ((x)->FacilityRequestParameter)
/* Facility depending parameters */
#define FACILITY_CONF_CONTROLLER(x) ((x)->adr.adrController)
#define FACILITY_CONF_PLCI(x) ((x)->adr.adrPLCI)
#define FACILITY_CONF_NCCI(x) ((x)->adr.adrNCCI)
/* Depending on the facility selector */
#define FACILITY_CONF_INFO(x) ((x)->Info)
/* 0: request accepted */
/* 0x2001: message not supported in current state */
/* 0x2002: incorrect Controller/PLCI/NCCI */
/* 0x2007: illegal message parameter coding */
/* 0x300B: facility not supported */
#define FACILITY_CONF_FACILITYSELECTOR(x) ((x)->FacilitySelector)
/* 0: Handset Support */
/* 1: DTMF */
/* 2 to n: reserved */
#define FACILITY_CONF_FACILITYCONFIRMATIONPARAMETER(x) ((x)->FacilityConfirmationParameter)
/* Facility-depending parameters */
#define FACILITY_IND_CONTROLLER(x) ((x)->adr.adrController)
#define FACILITY_IND_PLCI(x) ((x)->adr.adrPLCI)
#define FACILITY_IND_NCCI(x) ((x)->adr.adrNCCI)
/* Depending on the facility selector */
#define FACILITY_IND_FACILITYSELECTOR(x) ((x)->FacilitySelector)
/* 0: Handset Support */
/* 1: DTMF */
/* 2 to n: reserved */
#define FACILITY_IND_FACILITYINDICATIONPARAMETER(x) ((x)->FacilityIndicationParameter)
/* Facility-depending parameters */
#define FACILITY_RESP_CONTROLLER(x) ((x)->adr.adrController)
#define FACILITY_RESP_PLCI(x) ((x)->adr.adrPLCI)
#define FACILITY_RESP_NCCI(x) ((x)->adr.adrNCCI)
/* Depending on the facility selector */
#define FACILITY_RESP_FACILITYSELECTOR(x) ((x)->FacilitySelector)
/* 0: Handset Support */
/* 1: DTMF */
/* 2 to n: reserved */
/* Facility response parameters */
/* struct */
/* Facility-depending parameters */
#define INFO_REQ_CONTROLLER(x) ((x)->adr.adrController)
#define INFO_REQ_PLCI(x) ((x)->adr.adrPLCI)
/* See note */
#define INFO_REQ_CALLEDPARTYNUMBER(x) ((x)->CalledPartyNumber)
/* Called party number */
#define INFO_REQ_ADDITIONALINFO(x) ((x)->AdditionalInfo)
/* Additional information elements */
#define INFO_REQ_BCHANNELINFORMATION(x) ((x)->BChannelinformation)
#define INFO_REQ_KEYPADFACILITY(x) ((x)->Keypadfacility)
/* coded according to ETS 300 102-1 / Q.931 */
#define INFO_REQ_USERUSERDATA(x) ((x)->Useruserdata)
/* coded according to ETS 300 102-1 / Q.931 */
#define INFO_REQ_FACILITYDATAARRAY(x) ((x)->Facilitydataarray)
/* which is used to transfer additional parameters coded */
/* according to ETS 300 102-1 / Q.931 starting from octet 1. */
/* This field is used to transport one or more complete facility */
/* data information elements. */
#define INFO_CONF_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define INFO_CONF_INFO(x) ((x)->Info)
/* 0: transmission of information initiated */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal Controller/PLCI */
/* 0x2003: out of PLCI */
/* 0x2007: illegal message parameter coding */
#define INFO_IND_CONTROLLER(x) ((x)->adr.adrController)
#define INFO_IND_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define INFO_IND_INFONUMBER(x) ((x)->InfoNumber)
/* Information element identifier */
#define INFO_IND_INFOELEMENT(x) ((x)->InfoElement)
/* Information element dependent structure */
#define INFO_RESP_CONTROLLER(x) ((x)->adr.adrController)
#define INFO_RESP_PLCI(x) ((x)->adr.adrPLCI)
/* As in INFO_IND */
#define LISTEN_REQ_CONTROLLER(x) ((x)->adr.adrController)
#define LISTEN_REQ_INFOMASK(x) ((x)->InfoMask)
/* Bit field, coding as follows: */
/* 0: cause */
/* 1: date/Time */
/* 2: display */
/* 3: user-user information */
/* 4: call progression */
/* 5: facility */
/* 6: charging */
/* 7 to 31: reserved */
#define LISTEN_REQ_CIPMASK(x) ((x)->CIPmask)
/* Bit field, coding as follows: */
/* 0: any match */
/* 1: speech */
/* 2: unrestricted digital information */
/* 3: restricted digital information */
/* 4: 3.1 kHz audio */
/* 5: 7.0 kHz audio */
/* 6: video */
/* 7: packet mode */
/* 8: 56 kBit/s rate adaptation */
/* 9: unrestricted digital information with tones/announcements */
/* 10..15: reserved */
/* 16: telephony */
/* 17: fax group 2/3 */
/* 18: fax group 4 class 1 */
/* 19: Teletex service (basic and mixed), fax group 4 class 2 */
/* 20: Teletex service (basic and processable) */
/* 21: Teletex service (basic) */
/* 22: Videotex */
/* 23: Telex */
/* reserved for additional services */
/* 25: OSI applications according X.200 */
/* 26: 7 kHz Telephony */
/* 27: Video Telephony F.721, first connection */
/* 28: Video Telephony F.721, second connection */
/* 29 to 31: reserved */
#define LISTEN_REQ_CIPMASK2(x) ((x)->CIPmask2)
/* reserved for additional services */
#define LISTEN_REQ_CALLINGPARTYNUMBER(x) ((x)->CallingPartyNumber)
/* Calling party number */
#define LISTEN_REQ_CALLINGPARTYSUBADDRESS(x) ((x)->CallingPartySubaddress)
/* Calling party subaddress */
#define LISTEN_CONF_CONTROLLER(x) ((x)->adr.adrController)
#define LISTEN_CONF_INFO(x) ((x)->Info)
/* 0: listen is active */
/* 0x2002: illegal controller */
/* 0x2005: out of LISTEN-Resources */
/* 0x2007: illegal message parameter coding */
#define MANUFACTURER_REQ_CONTROLLER(x) ((x)->adr.adrController)
#define MANUFACTURER_REQ_MANUID(x) ((x)->ManuID)
/* Manufacturer specific ID (should be unique) */
/* Manufacturer specific */
#define MANUFACTURER_REQ_CLASS(x) ((x)->Class)
#define MANUFACTURER_REQ_FUNCTION(x) ((x)->Function)
#define MANUFACTURER_REQ_MANUDATA(x) ((x)->ManuData)
/* Manufacturer specific data */
#define MANUFACTURER_CONF_CONTROLLER(x) ((x)->adr.adrController)
#define MANUFACTURER_CONF_MANUID(x) ((x)->ManuID)
/* Manufacturer specific ID (should be unique) */
/* Manufacturer specific */
#define MANUFACTURER_CONF_CLASS(x) ((x)->Class)
#define MANUFACTURER_CONF_FUNCTION(x) ((x)->Function)
#define MANUFACTURER_CONF_MANUDATA(x) ((x)->ManuData)
/* Manufacturer specific data */
#define MANUFACTURER_IND_CONTROLLER(x) ((x)->adr.adrController)
#define MANUFACTURER_IND_MANUID(x) ((x)->ManuID)
/* Manufacturer specific ID (should be unique) */
/* Manufacturer specific */
#define MANUFACTURER_IND_CLASS(x) ((x)->Class)
#define MANUFACTURER_IND_FUNCTION(x) ((x)->Function)
#define MANUFACTURER_IND_MANUDATA(x) ((x)->ManuData)
/* Manufacturer specific data */
#define MANUFACTURER_RESP_CONTROLLER(x) ((x)->adr.adrController)
#define MANUFACTURER_RESP_MANUID(x) ((x)->ManuID)
/* Manufacturer specific ID (should be unique) */
/* Manufacturer specific */
#define MANUFACTURER_RESP_CLASS(x) ((x)->Class)
#define MANUFACTURER_RESP_FUNCTION(x) ((x)->Function)
#define MANUFACTURER_RESP_MANUDATA(x) ((x)->ManuData)
/* Manufacturer specific data */
#define RESET_B3_REQ_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define RESET_B3_REQ_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define RESET_B3_CONF_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define RESET_B3_CONF_INFO(x) ((x)->Info)
/* 0: reset initiated */
/* 0x0001: NCPI not supported by current protocol, NCPI ignored */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal NCCI */
/* 0x2007: illegal message parameter coding */
/* 0x3008: NCPI not supported */
/* 0x300D: reset procedure not supported by current protocol */
#define RESET_B3_IND_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define RESET_B3_IND_NCPI(x) ((x)->NCPI)
/* Network Control Protocol Information */
#define RESET_B3_RESP_NCCI(x) ((x)->adr.adrNCCI)
/* Network Control Connection Identifier */
#define SELECT_B_PROTOCOL_REQ_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define SELECT_B_PROTOCOL_REQ_BPROTOCOL(x) ((x)->BProtocol)
/* Protocol definition */
#define SELECT_B_PROTOCOL_REQ_B1PROTOCOL(x) ((x)->B1protocol)
/* Physical layer and framing */
#define SELECT_B_PROTOCOL_REQ_B2PROTOCOL(x) ((x)->B2protocol)
/* Data link layer */
#define SELECT_B_PROTOCOL_REQ_B3PROTOCOL(x) ((x)->B3protocol)
/* Network layer */
#define SELECT_B_PROTOCOL_REQ_B1CONFIGURATION(x) ((x)->B1configuration)
/* Physical layer and framing parameter */
#define SELECT_B_PROTOCOL_REQ_B2CONFIGURATION(x) ((x)->B2configuration)
/* Data link layer parameter */
#define SELECT_B_PROTOCOL_REQ_B3CONFIGURATION(x) ((x)->B3configuration)
/* Network layer parameter */
#define SELECT_B_PROTOCOL_CONF_PLCI(x) ((x)->adr.adrPLCI)
/* Physical Link Connection Identifier */
#define SELECT_B_PROTOCOL_CONF_INFO(x) ((x)->Info)
/* 0: protocol switch successful */
/* 0x2001: message not supported in current state */
/* 0x2002: illegal PLCI */
/* 0x2007: illegal message parameter coding */
/* 0x3001: B1 protocol not supported */
/* 0x3002: B2 protocol not supported */
/* 0x3003: B3 protocol not supported */
/* 0x3004: B1 protocol parameter not supported */
/* 0x3005: B2 protocol parameter not supported */
/* 0x3006: B3 protocol parameter not supported */
/* 0x3007: B protocol combination not supported */
/*----- tests for specific commands -----*/
#define IS_CONNECT_IND(m) ((m)->Command==0x02 && (m)->Subcommand==0x82)
#define IS_CONNECT_ACTIVE_IND(m) ((m)->Command==0x03 && (m)->Subcommand==0x82)
#define IS_CONNECT_B3_ACTIVE_IND(m) ((m)->Command==0x83 && (m)->Subcommand==0x82)
#define IS_CONNECT_B3_IND(m) ((m)->Command==0x82 && (m)->Subcommand==0x82)
#define IS_CONNECT_B3_T90_ACTIVE_IND(m) ((m)->Command==0x88 && (m)->Subcommand==0x82)
#define IS_DATA_B3_IND(m) ((m)->Command==0x86 && (m)->Subcommand==0x82)
#define IS_DISCONNECT_B3_IND(m) ((m)->Command==0x84 && (m)->Subcommand==0x82)
#define IS_DISCONNECT_IND(m) ((m)->Command==0x04 && (m)->Subcommand==0x82)
#define IS_FACILITY_IND(m) ((m)->Command==0x80 && (m)->Subcommand==0x82)
#define IS_INFO_IND(m) ((m)->Command==0x08 && (m)->Subcommand==0x82)
#define IS_MANUFACTURER_IND(m) ((m)->Command==0xff && (m)->Subcommand==0x82)
#define IS_RESET_B3_IND(m) ((m)->Command==0x87 && (m)->Subcommand==0x82)
#define IS_ALERT_CONF(m) ((m)->Command==0x01 && (m)->Subcommand==0x81)
#define IS_CONNECT_CONF(m) ((m)->Command==0x02 && (m)->Subcommand==0x81)
#define IS_CONNECT_B3_CONF(m) ((m)->Command==0x82 && (m)->Subcommand==0x81)
#define IS_DATA_B3_CONF(m) ((m)->Command==0x86 && (m)->Subcommand==0x81)
#define IS_DISCONNECT_B3_CONF(m) ((m)->Command==0x84 && (m)->Subcommand==0x81)
#define IS_DISCONNECT_CONF(m) ((m)->Command==0x04 && (m)->Subcommand==0x81)
#define IS_FACILITY_CONF(m) ((m)->Command==0x80 && (m)->Subcommand==0x81)
#define IS_INFO_CONF(m) ((m)->Command==0x08 && (m)->Subcommand==0x81)
#define IS_LISTEN_CONF(m) ((m)->Command==0x05 && (m)->Subcommand==0x81)
#define IS_MANUFACTURER_CONF(m) ((m)->Command==0xff && (m)->Subcommand==0x81)
#define IS_RESET_B3_CONF(m) ((m)->Command==0x87 && (m)->Subcommand==0x81)
#define IS_SELECT_B_PROTOCOL_CONF(m) ((m)->Command==0x41 && (m)->Subcommand==0x81)
/*----- header functions that fill the _cmsg structure with default -----*/
/*----- values. Only nonstandard parameter need to be changed -----*/
#define ALERT_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x01,0x80,Messagenumber,adr)
#define CONNECT_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x02,0x80,Messagenumber,adr)
#define CONNECT_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x82,0x80,Messagenumber,adr)
#define DATA_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x86,0x80,Messagenumber,adr)
#define DISCONNECT_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x84,0x80,Messagenumber,adr)
#define DISCONNECT_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x04,0x80,Messagenumber,adr)
#define FACILITY_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x80,0x80,Messagenumber,adr)
#define INFO_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x08,0x80,Messagenumber,adr)
#define LISTEN_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x05,0x80,Messagenumber,adr)
#define MANUFACTURER_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0xff,0x80,Messagenumber,adr)
#define RESET_B3_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x87,0x80,Messagenumber,adr)
#define SELECT_B_PROTOCOL_REQ_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x41,0x80,Messagenumber,adr)
#define CONNECT_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x02,0x83,Messagenumber,adr)
#define CONNECT_ACTIVE_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x03,0x83,Messagenumber,adr)
#define CONNECT_B3_ACTIVE_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x83,0x83,Messagenumber,adr)
#define CONNECT_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x82,0x83,Messagenumber,adr)
#define CONNECT_B3_T90_ACTIVE_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x88,0x83,Messagenumber,adr)
#define DATA_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x86,0x83,Messagenumber,adr)
#define DISCONNECT_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x84,0x83,Messagenumber,adr)
#define DISCONNECT_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x04,0x83,Messagenumber,adr)
#define FACILITY_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x80,0x83,Messagenumber,adr)
#define INFO_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x08,0x83,Messagenumber,adr)
#define MANUFACTURER_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0xff,0x83,Messagenumber,adr)
#define RESET_B3_RESP_HEADER(cmsg,ApplId,Messagenumber,adr) \
CAPI_CMSG_HEADER(cmsg,ApplId,0x87,0x83,Messagenumber,adr)
/*
* CAPI-functions that correspond to the CAPI messages specified in the
* CAPI 2.0 specification. All possible parameter have to be specified.
* The CAPI message is sent immediately when calling these functions,
* return values are the same as in capi_put_message()
*/
unsigned ALERT_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cstruct BChannelinformation
,_cstruct Keypadfacility
,_cstruct Useruserdata
,_cstruct Facilitydataarray);
unsigned CONNECT_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cword CIPValue
,_cstruct CalledPartyNumber
,_cstruct CallingPartyNumber
,_cstruct CalledPartySubaddress
,_cstruct CallingPartySubaddress
,_cword B1protocol
,_cword B2protocol
,_cword B3protocol
,_cstruct B1configuration
,_cstruct B2configuration
,_cstruct B3configuration
,_cstruct BC
,_cstruct LLC
,_cstruct HLC
,_cstruct BChannelinformation
,_cstruct Keypadfacility
,_cstruct Useruserdata
,_cstruct Facilitydataarray);
unsigned CONNECT_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cstruct NCPI);
unsigned DATA_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cdword Data
,_cword DataLength
,_cword DataHandle
,_cword Flags);
unsigned DISCONNECT_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cstruct NCPI);
unsigned DISCONNECT_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cstruct BChannelinformation
,_cstruct Keypadfacility
,_cstruct Useruserdata
,_cstruct Facilitydataarray);
unsigned FACILITY_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cword FacilitySelector
,_cstruct FacilityRequestParameter);
unsigned INFO_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cstruct CalledPartyNumber
,_cstruct BChannelinformation
,_cstruct Keypadfacility
,_cstruct Useruserdata
,_cstruct Facilitydataarray);
unsigned LISTEN_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cdword InfoMask
,_cdword CIPmask
,_cdword CIPmask2
,_cstruct CallingPartyNumber
,_cstruct CallingPartySubaddress);
unsigned MANUFACTURER_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cdword ManuID
,_cdword Class
,_cdword Function
,_cstruct ManuData);
unsigned RESET_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cstruct NCPI);
unsigned SELECT_B_PROTOCOL_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cword B1protocol
,_cword B2protocol
,_cword B3protocol
,_cstruct B1configuration
,_cstruct B2configuration
,_cstruct B3configuration);
unsigned CONNECT_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cword Reject
,_cword B1protocol
,_cword B2protocol
,_cword B3protocol
,_cstruct B1configuration
,_cstruct B2configuration
,_cstruct B3configuration
,_cstruct ConnectedNumber
,_cstruct ConnectedSubaddress
,_cstruct LLC
,_cstruct BChannelinformation
,_cstruct Keypadfacility
,_cstruct Useruserdata
,_cstruct Facilitydataarray);
unsigned CONNECT_ACTIVE_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr);
unsigned CONNECT_B3_ACTIVE_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr);
unsigned CONNECT_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cword Reject
,_cstruct NCPI);
unsigned CONNECT_B3_T90_ACTIVE_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr);
unsigned DATA_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cword DataHandle);
unsigned DISCONNECT_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr);
unsigned DISCONNECT_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr);
unsigned FACILITY_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cword FacilitySelector
,_cstruct FacilityResponseParameters);
unsigned INFO_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr);
unsigned MANUFACTURER_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr
,_cdword ManuID
,_cdword Class
,_cdword Function
,_cstruct ManuData);
unsigned RESET_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber
,_cdword adr);
#ifdef __cplusplus
}
#endif
#endif /* __CAPI20_H */

310
capi20/capifunc.c Normal file
View File

@ -0,0 +1,310 @@
/*
* $Id$
*
* $Log$
* Revision 1.1 1998/08/25 16:33:19 calle
* Added CAPI2.0 library. First Version.
*
*/
#include "capi20.h"
unsigned ALERT_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cstruct BChannelinformation,
_cstruct Keypadfacility,
_cstruct Useruserdata,
_cstruct Facilitydataarray) {
capi_cmsg_header (cmsg,ApplId,0x01,0x80,Messagenumber,adr);
cmsg->BChannelinformation = BChannelinformation;
cmsg->Keypadfacility = Keypadfacility;
cmsg->Useruserdata = Useruserdata;
cmsg->Facilitydataarray = Facilitydataarray;
return capi_put_cmsg (cmsg);
}
unsigned CONNECT_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cword CIPValue,
_cstruct CalledPartyNumber,
_cstruct CallingPartyNumber,
_cstruct CalledPartySubaddress,
_cstruct CallingPartySubaddress,
_cword B1protocol,
_cword B2protocol,
_cword B3protocol,
_cstruct B1configuration,
_cstruct B2configuration,
_cstruct B3configuration,
_cstruct BC,
_cstruct LLC,
_cstruct HLC,
_cstruct BChannelinformation,
_cstruct Keypadfacility,
_cstruct Useruserdata,
_cstruct Facilitydataarray) {
capi_cmsg_header (cmsg,ApplId,0x02,0x80,Messagenumber,adr);
cmsg->CIPValue = CIPValue;
cmsg->CalledPartyNumber = CalledPartyNumber;
cmsg->CallingPartyNumber = CallingPartyNumber;
cmsg->CalledPartySubaddress = CalledPartySubaddress;
cmsg->CallingPartySubaddress = CallingPartySubaddress;
cmsg->B1protocol = B1protocol;
cmsg->B2protocol = B2protocol;
cmsg->B3protocol = B3protocol;
cmsg->B1configuration = B1configuration;
cmsg->B2configuration = B2configuration;
cmsg->B3configuration = B3configuration;
cmsg->BC = BC;
cmsg->LLC = LLC;
cmsg->HLC = HLC;
cmsg->BChannelinformation = BChannelinformation;
cmsg->Keypadfacility = Keypadfacility;
cmsg->Useruserdata = Useruserdata;
cmsg->Facilitydataarray = Facilitydataarray;
return capi_put_cmsg (cmsg);
}
unsigned CONNECT_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cstruct NCPI) {
capi_cmsg_header (cmsg,ApplId,0x82,0x80,Messagenumber,adr);
cmsg->NCPI = NCPI;
return capi_put_cmsg (cmsg);
}
unsigned DATA_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cdword Data,
_cword DataLength,
_cword DataHandle,
_cword Flags) {
capi_cmsg_header (cmsg,ApplId,0x86,0x80,Messagenumber,adr);
cmsg->Data = Data;
cmsg->DataLength = DataLength;
cmsg->DataHandle = DataHandle;
cmsg->Flags = Flags;
return capi_put_cmsg (cmsg);
}
unsigned DISCONNECT_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cstruct NCPI) {
capi_cmsg_header (cmsg,ApplId,0x84,0x80,Messagenumber,adr);
cmsg->NCPI = NCPI;
return capi_put_cmsg (cmsg);
}
unsigned DISCONNECT_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cstruct BChannelinformation,
_cstruct Keypadfacility,
_cstruct Useruserdata,
_cstruct Facilitydataarray) {
capi_cmsg_header (cmsg,ApplId,0x04,0x80,Messagenumber,adr);
cmsg->BChannelinformation = BChannelinformation;
cmsg->Keypadfacility = Keypadfacility;
cmsg->Useruserdata = Useruserdata;
cmsg->Facilitydataarray = Facilitydataarray;
return capi_put_cmsg (cmsg);
}
unsigned FACILITY_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cword FacilitySelector,
_cstruct FacilityRequestParameter) {
capi_cmsg_header (cmsg,ApplId,0x80,0x80,Messagenumber,adr);
cmsg->FacilitySelector = FacilitySelector;
cmsg->FacilityRequestParameter = FacilityRequestParameter;
return capi_put_cmsg (cmsg);
}
unsigned INFO_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cstruct CalledPartyNumber,
_cstruct BChannelinformation,
_cstruct Keypadfacility,
_cstruct Useruserdata,
_cstruct Facilitydataarray) {
capi_cmsg_header (cmsg,ApplId,0x08,0x80,Messagenumber,adr);
cmsg->CalledPartyNumber = CalledPartyNumber;
cmsg->BChannelinformation = BChannelinformation;
cmsg->Keypadfacility = Keypadfacility;
cmsg->Useruserdata = Useruserdata;
cmsg->Facilitydataarray = Facilitydataarray;
return capi_put_cmsg (cmsg);
}
unsigned LISTEN_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cdword InfoMask,
_cdword CIPmask,
_cdword CIPmask2,
_cstruct CallingPartyNumber,
_cstruct CallingPartySubaddress) {
capi_cmsg_header (cmsg,ApplId,0x05,0x80,Messagenumber,adr);
cmsg->InfoMask = InfoMask;
cmsg->CIPmask = CIPmask;
cmsg->CIPmask2 = CIPmask2;
cmsg->CallingPartyNumber = CallingPartyNumber;
cmsg->CallingPartySubaddress = CallingPartySubaddress;
return capi_put_cmsg (cmsg);
}
unsigned MANUFACTURER_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cdword ManuID,
_cdword Class,
_cdword Function,
_cstruct ManuData) {
capi_cmsg_header (cmsg,ApplId,0xff,0x80,Messagenumber,adr);
cmsg->ManuID = ManuID;
cmsg->Class = Class;
cmsg->Function = Function;
cmsg->ManuData = ManuData;
return capi_put_cmsg (cmsg);
}
unsigned RESET_B3_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cstruct NCPI) {
capi_cmsg_header (cmsg,ApplId,0x87,0x80,Messagenumber,adr);
cmsg->NCPI = NCPI;
return capi_put_cmsg (cmsg);
}
unsigned SELECT_B_PROTOCOL_REQ (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cword B1protocol,
_cword B2protocol,
_cword B3protocol,
_cstruct B1configuration,
_cstruct B2configuration,
_cstruct B3configuration) {
capi_cmsg_header (cmsg,ApplId,0x41,0x80,Messagenumber,adr);
cmsg->B1protocol = B1protocol;
cmsg->B2protocol = B2protocol;
cmsg->B3protocol = B3protocol;
cmsg->B1configuration = B1configuration;
cmsg->B2configuration = B2configuration;
cmsg->B3configuration = B3configuration;
return capi_put_cmsg (cmsg);
}
unsigned CONNECT_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cword Reject,
_cword B1protocol,
_cword B2protocol,
_cword B3protocol,
_cstruct B1configuration,
_cstruct B2configuration,
_cstruct B3configuration,
_cstruct ConnectedNumber,
_cstruct ConnectedSubaddress,
_cstruct LLC,
_cstruct BChannelinformation,
_cstruct Keypadfacility,
_cstruct Useruserdata,
_cstruct Facilitydataarray) {
capi_cmsg_header (cmsg,ApplId,0x02,0x83,Messagenumber,adr);
cmsg->Reject = Reject;
cmsg->B1protocol = B1protocol;
cmsg->B2protocol = B2protocol;
cmsg->B3protocol = B3protocol;
cmsg->B1configuration = B1configuration;
cmsg->B2configuration = B2configuration;
cmsg->B3configuration = B3configuration;
cmsg->ConnectedNumber = ConnectedNumber;
cmsg->ConnectedSubaddress = ConnectedSubaddress;
cmsg->LLC = LLC;
cmsg->BChannelinformation = BChannelinformation;
cmsg->Keypadfacility = Keypadfacility;
cmsg->Useruserdata = Useruserdata;
cmsg->Facilitydataarray = Facilitydataarray;
return capi_put_cmsg (cmsg);
}
unsigned CONNECT_ACTIVE_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr) {
capi_cmsg_header (cmsg,ApplId,0x03,0x83,Messagenumber,adr);
return capi_put_cmsg (cmsg);
}
unsigned CONNECT_B3_ACTIVE_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr) {
capi_cmsg_header (cmsg,ApplId,0x83,0x83,Messagenumber,adr);
return capi_put_cmsg (cmsg);
}
unsigned CONNECT_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cword Reject,
_cstruct NCPI) {
capi_cmsg_header (cmsg,ApplId,0x82,0x83,Messagenumber,adr);
cmsg->Reject = Reject;
cmsg->NCPI = NCPI;
return capi_put_cmsg (cmsg);
}
unsigned CONNECT_B3_T90_ACTIVE_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr) {
capi_cmsg_header (cmsg,ApplId,0x88,0x83,Messagenumber,adr);
return capi_put_cmsg (cmsg);
}
unsigned DATA_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cword DataHandle) {
capi_cmsg_header (cmsg,ApplId,0x86,0x83,Messagenumber,adr);
cmsg->DataHandle = DataHandle;
return capi_put_cmsg (cmsg);
}
unsigned DISCONNECT_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr) {
capi_cmsg_header (cmsg,ApplId,0x84,0x83,Messagenumber,adr);
return capi_put_cmsg (cmsg);
}
unsigned DISCONNECT_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr) {
capi_cmsg_header (cmsg,ApplId,0x04,0x83,Messagenumber,adr);
return capi_put_cmsg (cmsg);
}
unsigned FACILITY_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cword FacilitySelector,
_cstruct FacilityResponseParameters) {
capi_cmsg_header (cmsg,ApplId,0x80,0x83,Messagenumber,adr);
cmsg->FacilitySelector = FacilitySelector;
cmsg->FacilityResponseParameters = FacilityResponseParameters;
return capi_put_cmsg (cmsg);
}
unsigned INFO_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr) {
capi_cmsg_header (cmsg,ApplId,0x08,0x83,Messagenumber,adr);
return capi_put_cmsg (cmsg);
}
unsigned MANUFACTURER_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr,
_cdword ManuID,
_cdword Class,
_cdword Function,
_cstruct ManuData) {
capi_cmsg_header (cmsg,ApplId,0xff,0x83,Messagenumber,adr);
cmsg->ManuID = ManuID;
cmsg->Class = Class;
cmsg->Function = Function;
cmsg->ManuData = ManuData;
return capi_put_cmsg (cmsg);
}
unsigned RESET_B3_RESP (_cmsg *cmsg, _cword ApplId, _cword Messagenumber,
_cdword adr) {
capi_cmsg_header (cmsg,ApplId,0x87,0x83,Messagenumber,adr);
return capi_put_cmsg (cmsg);
}

1500
capi20/configure vendored Executable file

File diff suppressed because it is too large Load Diff

38
capi20/configure.in Normal file
View File

@ -0,0 +1,38 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(capi20.c)
AC_PREFIX_DEFAULT(/usr)
dnl Checks for programs.
AC_PROG_CC
AC_PROG_INSTALL
I4LCONFDIR=${I4LCONFDIR:-"/etc/isdn"}
I4LVERSION=${I4LVERSION:-"?.?"}
CONFIG_DATADIR=${CONFIG_DATADIR:-"/usr/lib/isdn"}
CONFIG_MANDIR=`eval echo ${CONFIG_MANDIR:-"/usr/man"}`
CONFIG_SBINDIR=`eval echo ${CONFIG_SBINDIR:-"/sbin"}`
CONFIG_KERNELDIR=`eval echo ${CONFIG_KERNELDIR:-"/usr/src/linux"}`
dnl Checks for libraries.
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(fcntl.h sys/ioctl.h unistd.h)
dnl Check for kernel stuff
AC_FIND_KERNEL
AC_CHECK_HEADERS($CONFIG_KERNELDIR/include/linux/capi.h $CONFIG_KERNELDIR/include/linux/kernelcapi.h,,
AC_MSG_ERROR("Missing $ac_hdr. Kernel source installed?"))
dnl Checks for typedefs, structures, and compiler characteristics.
dnl Checks for library functions.
AC_PROG_GCC_TRADITIONAL
AC_CHECK_FUNCS(select)
AC_SUBST(INSTALL)
AC_SUBST(I4LVERSION)
AC_SUBST(CONFIG_SBINDIR)
AC_SUBST(CONFIG_DATADIR)
AC_SUBST(CONFIG_MANDIR)
AC_SUBST(CONFIG_KERNELDIR)
AC_OUTPUT(Makefile)

417
capi20/convert.c Normal file
View File

@ -0,0 +1,417 @@
/*
* $Id$
*
* $Log$
* Revision 1.1 1998/08/25 16:33:23 calle
* Added CAPI2.0 library. First Version.
*
*/
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>
#include <ctype.h>
#include "capi20.h"
typedef struct {
int typ;
unsigned off;
} _cdef;
#define _CBYTE 1
#define _CWORD 2
#define _CDWORD 3
#define _CSTRUCT 4
#define _CMSTRUCT 5
#define _CEND 6
static _cdef cdef[] = {
/*00*/{_CEND},
/*01*/{_CEND},
/*02*/{_CEND},
/*03*/{_CDWORD, offsetof(_cmsg,adr.adrController) },
/*04*/{_CMSTRUCT, offsetof(_cmsg,AdditionalInfo) },
/*05*/{_CSTRUCT, offsetof(_cmsg,B1configuration) },
/*06*/{_CWORD, offsetof(_cmsg,B1protocol) },
/*07*/{_CSTRUCT, offsetof(_cmsg,B2configuration) },
/*08*/{_CWORD, offsetof(_cmsg,B2protocol) },
/*09*/{_CSTRUCT, offsetof(_cmsg,B3configuration) },
/*0a*/{_CWORD, offsetof(_cmsg,B3protocol) },
/*0b*/{_CSTRUCT, offsetof(_cmsg,BC) },
/*0c*/{_CSTRUCT, offsetof(_cmsg,BChannelinformation) },
/*0d*/{_CMSTRUCT, offsetof(_cmsg,BProtocol) },
/*0e*/{_CSTRUCT, offsetof(_cmsg,CalledPartyNumber) },
/*0f*/{_CSTRUCT, offsetof(_cmsg,CalledPartySubaddress) },
/*10*/{_CSTRUCT, offsetof(_cmsg,CallingPartyNumber) },
/*11*/{_CSTRUCT, offsetof(_cmsg,CallingPartySubaddress) },
/*12*/{_CDWORD, offsetof(_cmsg,CIPmask) },
/*13*/{_CDWORD, offsetof(_cmsg,CIPmask2) },
/*14*/{_CWORD, offsetof(_cmsg,CIPValue) },
/*15*/{_CDWORD, offsetof(_cmsg,Class) },
/*16*/{_CSTRUCT, offsetof(_cmsg,ConnectedNumber) },
/*17*/{_CSTRUCT, offsetof(_cmsg,ConnectedSubaddress) },
/*18*/{_CDWORD, offsetof(_cmsg,Data) },
/*19*/{_CWORD, offsetof(_cmsg,DataHandle) },
/*1a*/{_CWORD, offsetof(_cmsg,DataLength) },
/*1b*/{_CSTRUCT, offsetof(_cmsg,FacilityConfirmationParameter) },
/*1c*/{_CSTRUCT, offsetof(_cmsg,Facilitydataarray) },
/*1d*/{_CSTRUCT, offsetof(_cmsg,FacilityIndicationParameter) },
/*1e*/{_CSTRUCT, offsetof(_cmsg,FacilityRequestParameter) },
/*1f*/{_CSTRUCT, offsetof(_cmsg,FacilityResponseParameters) },
/*20*/{_CWORD, offsetof(_cmsg,FacilitySelector) },
/*21*/{_CWORD, offsetof(_cmsg,Flags) },
/*22*/{_CDWORD, offsetof(_cmsg,Function) },
/*23*/{_CSTRUCT, offsetof(_cmsg,HLC) },
/*24*/{_CWORD, offsetof(_cmsg,Info) },
/*25*/{_CSTRUCT, offsetof(_cmsg,InfoElement) },
/*26*/{_CDWORD, offsetof(_cmsg,InfoMask) },
/*27*/{_CWORD, offsetof(_cmsg,InfoNumber) },
/*28*/{_CSTRUCT, offsetof(_cmsg,Keypadfacility) },
/*29*/{_CSTRUCT, offsetof(_cmsg,LLC) },
/*2a*/{_CSTRUCT, offsetof(_cmsg,ManuData) },
/*2b*/{_CDWORD, offsetof(_cmsg,ManuID) },
/*2c*/{_CSTRUCT, offsetof(_cmsg,NCPI) },
/*2d*/{_CWORD, offsetof(_cmsg,Reason) },
/*2e*/{_CWORD, offsetof(_cmsg,Reason_B3) },
/*2f*/{_CWORD, offsetof(_cmsg,Reject) },
/*30*/{_CSTRUCT, offsetof(_cmsg,Useruserdata) },
};
static unsigned char *cpars[] = {
/*00*/ 0,
/*01 ALERT_REQ*/
(unsigned char*)"\x03\x04\x0c\x28\x30\x1c\x01\x01",
/*02 CONNECT_REQ*/
(unsigned char*)"\x03\x14\x0e\x10\x0f\x11\x0d\x06\x08\x0a\x05\x07\x09\x01\x0b\x29\x23\x04\x0c\x28\x30\x1c\x01\x01",
/*03*/ 0,
/*04 DISCONNECT_REQ*/
(unsigned char*)"\x03\x04\x0c\x28\x30\x1c\x01\x01",
/*05 LISTEN_REQ*/
(unsigned char*)"\x03\x26\x12\x13\x10\x11\x01",
/*06*/ 0,
/*07*/ 0,
/*08 INFO_REQ*/
(unsigned char*)"\x03\x0e\x04\x0c\x28\x30\x1c\x01\x01",
/*09 FACILITY_REQ*/
(unsigned char*)"\x03\x20\x1e\x01",
/*0a SELECT_B_PROTOCOL_REQ*/
(unsigned char*)"\x03\x0d\x06\x08\x0a\x05\x07\x09\x01\x01",
/*0b CONNECT_B3_REQ*/
(unsigned char*)"\x03\x2c\x01",
/*0c*/ 0,
/*0d DISCONNECT_B3_REQ*/
(unsigned char*)"\x03\x2c\x01",
/*0e*/ 0,
/*0f DATA_B3_REQ*/
(unsigned char*)"\x03\x18\x1a\x19\x21\x01",
/*10 RESET_B3_REQ*/
(unsigned char*)"\x03\x2c\x01",
/*11*/ 0,
/*12*/ 0,
/*13 ALERT_CONF*/
(unsigned char*)"\x03\x24\x01",
/*14 CONNECT_CONF*/
(unsigned char*)"\x03\x24\x01",
/*15*/ 0,
/*16 DISCONNECT_CONF*/
(unsigned char*)"\x03\x24\x01",
/*17 LISTEN_CONF*/
(unsigned char*)"\x03\x24\x01",
/*18 MANUFACTURER_REQ*/
(unsigned char*)"\x03\x2b\x15\x22\x2a\x01",
/*19*/ 0,
/*1a INFO_CONF*/
(unsigned char*)"\x03\x24\x01",
/*1b FACILITY_CONF*/
(unsigned char*)"\x03\x24\x20\x1b\x01",
/*1c SELECT_B_PROTOCOL_CONF*/
(unsigned char*)"\x03\x24\x01",
/*1d CONNECT_B3_CONF*/
(unsigned char*)"\x03\x24\x01",
/*1e*/ 0,
/*1f DISCONNECT_B3_CONF*/
(unsigned char*)"\x03\x24\x01",
/*20*/ 0,
/*21 DATA_B3_CONF*/
(unsigned char*)"\x03\x19\x24\x01",
/*22 RESET_B3_CONF*/
(unsigned char*)"\x03\x24\x01",
/*23*/ 0,
/*24*/ 0,
/*25*/ 0,
/*26 CONNECT_IND*/
(unsigned char*)"\x03\x14\x0e\x10\x0f\x11\x0b\x29\x23\x04\x0c\x28\x30\x1c\x01\x01",
/*27 CONNECT_ACTIVE_IND*/
(unsigned char*)"\x03\x16\x17\x29\x01",
/*28 DISCONNECT_IND*/
(unsigned char*)"\x03\x2d\x01",
/*29*/ 0,
/*2a MANUFACTURER_CONF*/
(unsigned char*)"\x03\x2b\x15\x22\x2a\x01",
/*2b*/ 0,
/*2c INFO_IND*/
(unsigned char*)"\x03\x27\x25\x01",
/*2d FACILITY_IND*/
(unsigned char*)"\x03\x20\x1d\x01",
/*2e*/ 0,
/*2f CONNECT_B3_IND*/
(unsigned char*)"\x03\x2c\x01",
/*30 CONNECT_B3_ACTIVE_IND*/
(unsigned char*)"\x03\x2c\x01",
/*31 DISCONNECT_B3_IND*/
(unsigned char*)"\x03\x2e\x2c\x01",
/*32*/ 0,
/*33 DATA_B3_IND*/
(unsigned char*)"\x03\x18\x1a\x19\x21\x01",
/*34 RESET_B3_IND*/
(unsigned char*)"\x03\x2c\x01",
/*35 CONNECT_B3_T90_ACTIVE_IND*/
(unsigned char*)"\x03\x2c\x01",
/*36*/ 0,
/*37*/ 0,
/*38 CONNECT_RESP*/
(unsigned char*)"\x03\x2f\x0d\x06\x08\x0a\x05\x07\x09\x01\x16\x17\x29\x04\x0c\x28\x30\x1c\x01\x01",
/*39 CONNECT_ACTIVE_RESP*/
(unsigned char*)"\x03\x01",
/*3a DISCONNECT_RESP*/
(unsigned char*)"\x03\x01",
/*3b*/ 0,
/*3c MANUFACTURER_IND*/
(unsigned char*)"\x03\x2b\x15\x22\x2a\x01",
/*3d*/ 0,
/*3e INFO_RESP*/
(unsigned char*)"\x03\x01",
/*3f FACILITY_RESP*/
(unsigned char*)"\x03\x20\x1f\x01",
/*40*/ 0,
/*41 CONNECT_B3_RESP*/
(unsigned char*)"\x03\x2f\x2c\x01",
/*42 CONNECT_B3_ACTIVE_RESP*/
(unsigned char*)"\x03\x01",
/*43 DISCONNECT_B3_RESP*/
(unsigned char*)"\x03\x01",
/*44*/ 0,
/*45 DATA_B3_RESP*/
(unsigned char*)"\x03\x19\x01",
/*46 RESET_B3_RESP*/
(unsigned char*)"\x03\x01",
/*47 CONNECT_B3_T90_ACTIVE_RESP*/
(unsigned char*)"\x03\x01",
/*48*/ 0,
/*49*/ 0,
/*4a*/ 0,
/*4b*/ 0,
/*4c*/ 0,
/*4d*/ 0,
/*4e MANUFACTURER_RESP*/
(unsigned char*)"\x03\x2b\x15\x22\x2a\x01",
};
/*-------------------------------------------------------*/
#define byteTLcpy(x,y) *(_cbyte *)(x)=*(_cbyte *)(y);
#define wordTLcpy(x,y) *(_cword *)(x)=*(_cword *)(y);
#define dwordTLcpy(x,y) memcpy(x,y,4);
#define structTLcpy(x,y,l) memcpy (x,y,l)
#define structTLcpyovl(x,y,l) memmove (x,y,l)
#define byteTRcpy(x,y) *(_cbyte *)(y)=*(_cbyte *)(x);
#define wordTRcpy(x,y) *(_cword *)(y)=*(_cword *)(x);
#define dwordTRcpy(x,y) memcpy(y,x,4);
#define structTRcpy(x,y,l) memcpy (y,x,l)
#define structTRcpyovl(x,y,l) memmove (y,x,l)
/*-------------------------------------------------------*/
static unsigned command_2_index (unsigned c, unsigned sc) {
if (c & 0x80) c = 0x9+(c&0x0f);
else if (c<=0x0f) ;
else if (c==0x41) c = 0x9+0x1;
else if (c==0xff) c = 0x00;
return (sc&3)*(0x9+0x9)+c;
}
/*-------------------------------------------------------*/
#define TYP (cdef[cmsg->par[cmsg->p]].typ)
#define OFF (((char *)cmsg)+cdef[cmsg->par[cmsg->p]].off)
static void jumpcstruct (_cmsg *cmsg) {
unsigned layer;
for (cmsg->p++,layer=1; layer;) {
assert (cmsg->p);
cmsg->p++;
switch (TYP) {
case _CMSTRUCT:
layer++;
break;
case _CEND:
layer--;
break;
}
}
}
/*-------------------------------------------------------*/
static void PARS_2_MESSAGE (_cmsg *cmsg) {
for (;TYP != _CEND; cmsg->p++) {
switch (TYP) {
case _CBYTE:
byteTLcpy (cmsg->m+cmsg->l, OFF);
cmsg->l++;
break;
case _CWORD:
wordTLcpy (cmsg->m+cmsg->l, OFF);
cmsg->l+=2;
break;
case _CDWORD:
dwordTLcpy (cmsg->m+cmsg->l, OFF);
cmsg->l+=4;
break;
case _CSTRUCT:
if (*(CAPI_MESSAGE *) OFF == 0) {
*(cmsg->m+cmsg->l)='\0';
cmsg->l++;
}
else if(**(_cstruct*)OFF != 0xff) {
structTLcpy (cmsg->m+cmsg->l, *(_cstruct*)OFF, 1+**(_cstruct*)OFF);
cmsg->l+=1+**(_cstruct*)OFF;
}
else {
_cstruct s = *(_cstruct*)OFF;
structTLcpy (cmsg->m+cmsg->l, s, 3+*(_cword*)(s+1));
cmsg->l+= 3+*(_cword*)(s+1);
}
break;
case _CMSTRUCT:
/*----- Metastruktur 0 -----*/
if (*(_cmstruct*)OFF == CAPI_DEFAULT) {
*(cmsg->m+cmsg->l)='\0';
cmsg->l++;
jumpcstruct (cmsg);
}
/*----- Metastruktur wird composed -----*/
else {
unsigned _l = cmsg->l;
unsigned _ls;
cmsg->l++;
cmsg->p++;
PARS_2_MESSAGE (cmsg);
_ls = cmsg->l-_l-1;
if (_ls < 255)
(cmsg->m+_l)[0] = (_cbyte)_ls;
else {
structTLcpyovl (cmsg->m+_l+3, cmsg->m+_l+1, _ls);
(cmsg->m+_l)[0] = 0xff;
wordTLcpy (cmsg->m+_l+1, &_ls);
cmsg->l+=2;
}
}
break;
}
}
}
/*-------------------------------------------------------*/
unsigned capi_cmsg2message (_cmsg *cmsg, CAPI_MESSAGE msg)
{
cmsg->m = msg;
cmsg->l = 8;
cmsg->p = 0;
cmsg->par = cpars [command_2_index (cmsg->Command,cmsg->Subcommand)];
PARS_2_MESSAGE (cmsg);
wordTLcpy (msg+0, &cmsg->l);
byteTLcpy (cmsg->m+4, &cmsg->Command);
byteTLcpy (cmsg->m+5, &cmsg->Subcommand);
wordTLcpy (cmsg->m+2, &cmsg->ApplId);
wordTLcpy (cmsg->m+6, &cmsg->Messagenumber);
return 0;
}
/*-------------------------------------------------------*/
static void MESSAGE_2_PARS (_cmsg *cmsg) {
for (;TYP != _CEND; cmsg->p++) {
switch (TYP) {
case _CBYTE:
byteTRcpy (cmsg->m+cmsg->l, OFF);
cmsg->l++;
break;
case _CWORD:
wordTRcpy (cmsg->m+cmsg->l, OFF);
cmsg->l+=2;
break;
case _CDWORD:
dwordTRcpy (cmsg->m+cmsg->l, OFF);
cmsg->l+=4;
break;
case _CSTRUCT:
*(CAPI_MESSAGE *)OFF = cmsg->m+cmsg->l;
if (cmsg->m[cmsg->l] != 0xff)
cmsg->l+= 1+ cmsg->m[cmsg->l];
else
cmsg->l+= 3+ *(_cword *)(cmsg->m+cmsg->l+1);
break;
case _CMSTRUCT:
/*----- Metastruktur 0 -----*/
if (cmsg->m[cmsg->l] == '\0') {
*(_cmstruct*)OFF = CAPI_DEFAULT;
cmsg->l++;
jumpcstruct (cmsg);
}
else {
unsigned _l = cmsg->l;
*(_cmstruct*)OFF = CAPI_COMPOSE;
cmsg->l = (cmsg->m+_l)[0] == 255 ? cmsg->l+3 : cmsg->l+1;
cmsg->p++;
MESSAGE_2_PARS (cmsg);
}
break;
}
}
}
/*-------------------------------------------------------*/
unsigned capi_message2cmsg (_cmsg *cmsg, CAPI_MESSAGE msg)
{
memset (cmsg, 0, sizeof(_cmsg));
cmsg->m = msg;
cmsg->l = 8;
cmsg->p = 0;
byteTRcpy (cmsg->m+4, &cmsg->Command);
byteTRcpy (cmsg->m+5, &cmsg->Subcommand);
cmsg->par = cpars [command_2_index (cmsg->Command,cmsg->Subcommand)];
MESSAGE_2_PARS (cmsg);
wordTRcpy (msg+0, &cmsg->l);
wordTRcpy (cmsg->m+2, &cmsg->ApplId);
wordTRcpy (cmsg->m+6, &cmsg->Messagenumber);
return 0;
}
/*-------------------------------------------------------*/
unsigned capi_cmsg_answer (_cmsg *cmsg)
{
cmsg->Subcommand |= 0x01;
return 0;
}
/*-------------------------------------------------------*/
unsigned capi_cmsg_header (_cmsg *cmsg, _cword _ApplId,
_cbyte _Command, _cbyte _Subcommand,
_cword _Messagenumber, _cdword _Controller) {
memset (cmsg, 0, sizeof(_cmsg));
cmsg->ApplId = _ApplId ;
cmsg->Command = _Command ;
cmsg->Subcommand = _Subcommand ;
cmsg->Messagenumber = _Messagenumber;
cmsg->adr.adrController = _Controller ;
return 0;
}

2
capi20/install-sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/sh
exit 0