Sophie

Sophie

distrib > Fedora > 13 > x86_64 > by-pkgid > 82aff46dd098253bb15b21d897b22a32 > files > 5

mISDN-1.1.5-4.fc12.src.rpm

/* $Id: mISDNif.h,v 1.42 2006/12/27 18:50:50 jolly Exp $
 *
 */

#ifndef mISDNIF_H
#define mISDNIF_H

#include <stdarg.h>
#include <linux/types.h>
#include <linux/errno.h>

/*
 * ABI Version 32 bit
 *
 * <16 bit> Major version
 *		- changed if any interface become backwards incompatible
 *
 * <16 bit> Minor version
 *              - changed if any interface is extended but backwards compatible
 *
 */
#define	MISDN_MAJOR_VERSION	5
#define	MISDN_MINOR_VERSION	0
#define	MISDN_VERSION		((MISDN_MAJOR_VERSION<<16) | MISDN_MINOR_VERSION)

#define MISDN_REVISION		"$Revision: 1.42 $"
#define MISDN_DATE		"$Date: 2006/12/27 18:50:50 $"

/* collect some statistics about the message queues */
//#define MISDN_MSG_STATS

/* primitives for information exchange
 * generell format
 * <8 bit reserved>
 * <4 bit flags>
 * <4 bit layer>
 * <8 bit command>
 * <8 bit subcommand>
 *
 */

#define MISDN_CMD_MASK	0xffffff00
#define MISDN_SUB_MASK	0x000000ff

/* SUBCOMMANDS */
#define REQUEST		0x80
#define CONFIRM		0x81
#define INDICATION	0x82
#define RESPONSE	0x83
#define SUB_ERROR	0xff

/* management */
#define MGR_FUNCTION	0x0f0000
#define MGR_GETOBJECT	0x0f0100
#define MGR_NEWOBJECT	0x0f0200
#define MGR_DELOBJECT	0x0f0300
#define MGR_NEWENTITY	0x0f0600
#define MGR_DELENTITY	0x0f0700
#define MGR_GETSTACK	0x0f1100
#define MGR_NEWSTACK	0x0f1200
#define MGR_DELSTACK	0x0f1300
#define MGR_SETSTACK	0x0f1400
#define MGR_CLEARSTACK	0x0f1500
#define MGR_REGLAYER	0x0f1600
#define MGR_UNREGLAYER	0x0f1700
#define MGR_SELCHANNEL	0x0f1800
#define MGR_SETSTACK_NW	0x0f1900
#define MGR_ADDSTPARA	0x0f1A00
#define MGR_CLRSTPARA	0x0f1B00
#define MGR_ADDLAYER	0x0f1C00
#define MGR_GETLAYER	0x0f2100
#define MGR_GETLAYERID	0x0f2200
#define MGR_NEWLAYER	0x0f2300
#define MGR_DELLAYER	0x0f2400
//#define MGR_CLONELAYER	0x0f2500
//#define MGR_GETIF	0x0f3100
//#define MGR_CONNECT	0x0f3200
//#define MGR_DISCONNECT	0x0f3300
//#define MGR_SETIF	0x0f3400
//#define MGR_ADDIF	0x0f3500
//#define MGR_QUEUEIF	0x0f3600
#define MGR_CTRLREADY	0x0f4100
#define MGR_STACKREADY	0x0f4200
#define MGR_STOPSTACK	0x0f4300
#define MGR_STARTSTACK	0x0f4400
#define MGR_RELEASE	0x0f4500
#define MGR_GETDEVICE	0x0f5100
#define MGR_DELDEVICE	0x0f5200
#define MGR_SETDEVOPT	0x0f5300
#define MGR_GETDEVOPT	0x0f5400
#define MGR_INITTIMER	0x0f8100
#define MGR_ADDTIMER	0x0f8200
#define MGR_DELTIMER	0x0f8300
#define MGR_REMOVETIMER	0x0f8400
#define MGR_TIMER	0x0f8800
#define MGR_CONTROL	0x0fe100
#define MGR_STATUS	0x0fe200
#define MGR_HASPROTOCOL	0x0fe300
#define MGR_EVALSTACK	0x0fe400
#define MGR_GLOBALOPT	0x0fe500
#define MGR_SHORTSTATUS	0x0fe600
#define MGR_LOADFIRM	0x0ff000
#define MGR_LOGDATA	0x0ff100
#define MGR_DEBUGDATA	0x0ff200
#define MGR_VERSION	0x0fff00

/* layer 1 <-> hardware */
#define PH_SIGNAL	0x000100
#define PH_CONTROL	0x000200
#define PH_STATUS	0x000300

/* PH_SIGNAL parameter */
#define INFO0		0x1000
#define INFO1		0x1100
#define INFO2		0x1200
#define INFO3_P8	0x1308
#define INFO3_P10	0x130a
#define INFO4_P8	0x1408
#define INFO4_P10	0x140a
#define D_RX_MON0	0x1800
#define D_TX_MON0	0x1801
#define D_RX_MON1	0x1810
#define D_TX_MON1	0x1811
#define LOSTFRAMING	0x1f00
#define ANYSIGNAL	0x1f01

/* PH_CONTROL parameter */
#define HW_RESET	0x0001
#define HW_POWERDOWN	0x0100
#define HW_POWERUP	0x0101
#define HW_DEACTIVATE	0x0200
#define HW_ACTIVATE	0x0201
#define HW_MOD_FRM	0x0400
#define HW_MOD_FRH	0x0401
#define HW_MOD_FTM	0x0402
#define HW_MOD_FTH	0x0403
#define HW_MOD_FTS	0x0404
#define HW_MOD_CONNECT	0x0410
#define HW_MOD_OK	0x0411
#define HW_MOD_NOCARR	0x0412
#define HW_MOD_FCERROR	0x0413
#define HW_MOD_READY	0x0414
#define HW_MOD_LASTDATA	0x0415
#define HW_MOD_SILENCE	0x0416
#define HW_FEATURES	0x04ff
#define HW_HFC_COEFF	0x0500
#define HW_LOS		0x0501
#define HW_LOS_OFF	0x0502
#define HW_AIS		0x0503
#define HW_AIS_OFF	0x0504
#define HW_SLIP_TX	0x0505
#define HW_SLIP_RX	0x0506
#define HW_PCM_CONN	0x0580
#define HW_PCM_DISC	0x0581
#define HW_CONF_JOIN	0x0582
#define HW_CONF_SPLIT	0x0583
#define HW_RECEIVE_OFF	0x0584
#define HW_RECEIVE_ON	0x0585
#define HW_SPL_LOOP_ON	0x0586
#define HW_SPL_LOOP_OFF	0x0587
#define HW_ECHOCAN_ON 	0x0588
#define HW_ECHOCAN_OFF 	0x0589
#define HW_TESTLOOP	0xFF00
#define HW_FIRM_START	0xFF10
#define HW_FIRM_DATA	0xFF11
#define HW_FIRM_END	0xFF12
#define HW_D_BLOCKED	0xFF20
#define HW_D_NOBLOCKED	0xFF21
#define HW_TESTRX_RAW	0xFF40
#define HW_TESTRX_HDLC	0xFF41
#define HW_TESTRX_OFF	0xFF4f
/* TOUCH TONE IS 0x20XX  XX "0"..."9", "A","B","C","D","*","#" */
#define DTMF_TONE_VAL	0x2000
#define DTMF_TONE_MASK	0x007F
#define DTMF_TONE_START	0x2100
#define DTMF_TONE_STOP	0x2200
#define CMX_CONF_JOIN	0x2300
#define CMX_CONF_SPLIT	0x2301
#define CMX_ECHO_ON	0x2302
#define CMX_ECHO_OFF	0x2303
#define CMX_RECEIVE_OFF	0x2304
#define CMX_RECEIVE_ON	0x2305
#define CMX_MIX_ON	0x2306
#define CMX_MIX_OFF	0x2307
#define TONE_PATT_ON	0x2310
#define TONE_PATT_OFF	0x2311
#define VOL_CHANGE_TX	0x2312
#define VOL_CHANGE_RX	0x2313
#define BF_ENABLE_KEY	0x2314
#define BF_DISABLE	0x2315
#define BF_ACCEPT	0x2316
#define BF_REJECT	0x2317
#define ECHOCAN_ON	0x2318
#define ECHOCAN_OFF	0x2319
#define HW_POTS_ON		0x1001
#define HW_POTS_OFF		0x1002
#define HW_POTS_SETMICVOL	0x1100
#define HW_POTS_SETSPKVOL	0x1101
#define HW_POTS_GETMICVOL	0x1110
#define HW_POTS_GETSPKVOL	0x1111

/* TONE_PATT_ON parameter */
#define TONE_OFF			0x0000
#define TONE_GERMAN_DIALTONE		0x0001
#define TONE_GERMAN_OLDDIALTONE		0x0002
#define TONE_AMERICAN_DIALTONE		0x0003
#define TONE_GERMAN_DIALPBX		0x0004
#define TONE_GERMAN_OLDDIALPBX		0x0005
#define TONE_AMERICAN_DIALPBX		0x0006
#define TONE_GERMAN_RINGING		0x0007
#define TONE_GERMAN_OLDRINGING		0x0008
#define TONE_AMERICAN_RINGPBX		0x000b
#define TONE_GERMAN_RINGPBX		0x000c
#define TONE_GERMAN_OLDRINGPBX		0x000d
#define TONE_AMERICAN_RINGING		0x000e
#define TONE_GERMAN_BUSY		0x000f
#define TONE_GERMAN_OLDBUSY		0x0010
#define TONE_AMERICAN_BUSY		0x0011
#define TONE_GERMAN_HANGUP		0x0012
#define TONE_GERMAN_OLDHANGUP		0x0013
#define TONE_AMERICAN_HANGUP		0x0014
#define TONE_SPECIAL_INFO		0x0015
#define TONE_GERMAN_GASSENBESETZT	0x0016
#define TONE_GERMAN_AUFSCHALTTON	0x0016

#define GLOBALOPT_INTERNAL_CTRL		0x0001
#define GLOBALOPT_EXTERNAL_EQUIPMENT	0x0002
#define GLOBALOPT_HANDSET		0x0004
#define GLOBALOPT_DTMF			0x0008
#define GLOBALOPT_SUPPLEMENTARY_SERVICE	0x0010
#define GLOBALOPT_CHANNEL_ALLOCATION	0x0020
#define GLOBALOPT_PARAMETER_B_CHANNEL	0x0040
#define GLOBALOPT_LINE_INTERCONNECT	0x0080


/* layer 1 */
#define PH_ACTIVATE	0x010100
#define PH_DEACTIVATE	0x010000
#define PH_DATA		0x110200
#define MPH_DEACTIVATE	0x011000
#define MPH_ACTIVATE	0x011100
#define MPH_INFORMATION	0x012000

/* layer 2 */
#define DL_ESTABLISH	0x020100
#define DL_RELEASE	0x020000
#define DL_DATA		0x120200
#define DL_UNITDATA	0x120300
#define MDL_UNITDATA	0x121200
#define MDL_ASSIGN	0x022100
#define MDL_REMOVE	0x022000
#define MDL_ERROR	0x023000
#define MDL_INFORMATION	0x024000
#define MDL_STATUS	0x028100
#define MDL_FINDTEI	0x028200

/* layer 3 */
#define CC_ALERTING		0x030100
#define CC_PROCEEDING		0x030200
#define CC_PROGRESS		0x030300
#define CC_SETUP		0x030500
#define CC_CONNECT		0x030700
#define CC_SETUP_ACKNOWLEDGE	0x030d00
#define CC_CONNECT_ACKNOWLEDGE	0x030f00
#define CC_USER_INFORMATION	0x032000
#define CC_SUSPEND_REJECT	0x032100
#define CC_RESUME_REJECT	0x032200
#define CC_HOLD			0x032400
#define CC_SUSPEND		0x032500
#define CC_RESUME		0x032600
#define CC_HOLD_ACKNOWLEDGE	0x032800
#define CC_SUSPEND_ACKNOWLEDGE	0x032d00
#define CC_RESUME_ACKNOWLEDGE	0x032e00
#define CC_HOLD_REJECT		0x033000
#define CC_RETRIEVE		0x033100
#define CC_RETRIEVE_ACKNOWLEDGE	0x033300
#define CC_RETRIEVE_REJECT	0x033700
#define CC_DISCONNECT		0x034500
#define CC_RESTART		0x034600
#define CC_RELEASE		0x034d00
#define CC_RELEASE_COMPLETE	0x035a00
#define CC_FACILITY		0x036200
#define CC_NOTIFY		0x036e00
#define CC_STATUS_ENQUIRY	0x037500
#define CC_INFORMATION		0x037b00
#define CC_STATUS		0x037d00

#define CC_NEW_CR		0x03f000
#define CC_RELEASE_CR		0x03f100
#define CC_TIMEOUT		0x03ff00

#define CC_B3_DATA		0x138600

#define CAPI_MESSAGE_REQUEST	0x040080

#define LAYER_MASK	0x0F0000
#define COMMAND_MASK	0x00FF00
#define SUBCOMMAND_MASK	0x0000FF
#define DATA_COMMAND	0x100000
#define CMD_IS_DATA(p)	(p & DATA_COMMAND)

/* short cuts layer 1 */
#define PH_ACTIVATE_REQ		(PH_ACTIVATE | REQUEST)
#define PH_ACTIVATE_IND		(PH_ACTIVATE | INDICATION)
#define PH_DEACTIVATE_IND	(PH_DEACTIVATE | INDICATION)
#define PH_DATA_REQ		(PH_DATA | REQUEST)
#define PH_DATA_IND		(PH_DATA | INDICATION)
#define PH_DATA_CNF		(PH_DATA | CONFIRM)
#define PH_DATA_RSP		(PH_DATA | RESPONSE)
#define MPH_ACTIVATE_REQ	(MPH_ACTIVATE | REQUEST)
#define MPH_DEACTIVATE_REQ	(MPH_DEACTIVATE | REQUEST)
#define MPH_INFORMATION_IND	(MPH_INFORMATION | INDICATION)

/* short cuts layer 2 */
#define DL_ESTABLISH_REQ	(DL_ESTABLISH | REQUEST)
#define DL_ESTABLISH_IND	(DL_ESTABLISH | INDICATION)
#define DL_ESTABLISH_CNF	(DL_ESTABLISH | CONFIRM)
#define DL_RELEASE_REQ		(DL_RELEASE | REQUEST)
#define DL_RELEASE_IND		(DL_RELEASE | INDICATION)
#define DL_RELEASE_CNF		(DL_RELEASE | CONFIRM)
#define DL_DATA_REQ		(DL_DATA | REQUEST)
#define DL_DATA_IND		(DL_DATA | INDICATION)
#define DL_UNITDATA_REQ		(DL_UNITDATA | REQUEST)
#define DL_UNITDATA_IND		(DL_UNITDATA | INDICATION)
#define MDL_ASSIGN_REQ		(MDL_ASSIGN | REQUEST)
#define MDL_ASSIGN_IND		(MDL_ASSIGN | INDICATION)
#define MDL_REMOVE_REQ		(MDL_REMOVE | REQUEST)
#define MDL_ERROR_IND		(MDL_ERROR | INDICATION)
#define MDL_ERROR_RSP		(MDL_ERROR | RESPONSE)
#define MDL_INFORMATION_IND	(MDL_INFORMATION | INDICATION)

/* protocol id */
#define ISDN_PID_NONE			0
#define ISDN_PID_ANY			0xffffffff
#define ISDN_PID_L0_TE_S0		0x00000001
#define ISDN_PID_L0_NT_S0		0x00000100
#define ISDN_PID_L0_TE_U		0x00000002
#define ISDN_PID_L0_NT_U		0x00000200
#define ISDN_PID_L0_TE_UP2		0x00000004
#define ISDN_PID_L0_NT_UP2		0x00000400
#define ISDN_PID_L0_TE_E1		0x00000008
#define ISDN_PID_L0_NT_E1		0x00000800
#define ISDN_PID_L0_IP_S0		0x00000010
#define ISDN_PID_L0_IP_E1		0x00000020
#define ISDN_PID_L0_LOOP		0x00000030
#define ISDN_PID_L1_TE_S0		0x01000001
#define ISDN_PID_L1_NT_S0		0x01000100
#define ISDN_PID_L1_TE_U		0x01000002
#define ISDN_PID_L1_NT_U		0x01000200
#define ISDN_PID_L1_TE_UP2		0x01000004
#define ISDN_PID_L1_NT_UP2		0x01000400
#define ISDN_PID_L1_TE_E1		0x01000008
#define ISDN_PID_L1_NT_E1		0x01000800
#define ISDN_PID_L2_LAPD		0x02000001
#define ISDN_PID_L2_LAPD_NET		0x02000002
/* Bit 15-0  reserved for CAPI defined protocols */
#define ISDN_PID_L0_B_IP		0x40000001
#define ISDN_PID_L1_B_64HDLC		0x41000001
#define ISDN_PID_L1_B_64TRANS		0x41000002
#define ISDN_PID_L1_B_V110_ASYNC	0x41000004
#define ISDN_PID_L1_B_V110_HDLC		0x41000008
#define ISDN_PID_L1_B_T30FAX		0x41000010
#define ISDN_PID_L1_B_64HDLC_INV	0x41000020
#define ISDN_PID_L1_B_56TRANS		0x41000040
#define ISDN_PID_L1_B_MODEM_ALL		0x41000080
#define ISDN_PID_L1_B_MODEM_ASYNC	0x41000100
#define ISDN_PID_L1_B_MODEM_HDLC	0x41000200
/* Bit 15-0  reserved for CAPI defined protocols */
#define ISDN_PID_L2_B_X75SLP		0x42000001
#define ISDN_PID_L2_B_TRANS		0x42000002
#define ISDN_PID_L2_B_TRANSDTMF		0x42300002
#define ISDN_PID_L2_B_RAWDEV		0x42400002
#define ISDN_PID_L2_B_SDLC		0x42000004
#define ISDN_PID_L2_B_LAPD		0x42000008
#define ISDN_PID_L2_B_T30		0x42000010
#define ISDN_PID_L2_B_PPP		0x42000020
#define ISDN_PID_L2_B_TRANSNOERR	0x42000040
#define ISDN_PID_L2_B_MODEM		0x42000080
#define ISDN_PID_L2_B_X75SLPV42BIS	0x42000100
#define ISDN_PID_L2_B_V120ASYNC		0x42000200
#define ISDN_PID_L2_B_V120ASYNCV42BIS	0x42000400
#define ISDN_PID_L2_B_V120TRANS		0x42000800
#define ISDN_PID_L2_B_LAPDFREESAPI	0x42001000
#define ISDN_PID_L3_B_TRANS		0x43000001
#define ISDN_PID_L3_B_T90NL		0x43000002
#define ISDN_PID_L3_B_X25DTE		0x43000004
#define ISDN_PID_L3_B_X25DCE		0x43000008
#define ISDN_PID_L3_B_T30		0x43000010
#define ISDN_PID_L3_B_T30EXT		0x43000020
#define ISDN_PID_L3_B_MODEM		0x43000080
/* Bit 15-0  reserved for CAPI defined protocols */
#define ISDN_PID_L3_B_DSP		0x43010000
#define ISDN_PID_L3_DSS1USER		0x03000001
#define ISDN_PID_L3_DSS1NET		0x03000100
#define ISDN_PID_L4_CAPI20		0x04000001
#define ISDN_PID_L4_B_CAPI20		0x44000001

#define ISDN_PID_BCHANNEL_BIT		0x40000000
#define ISDN_PID_LAYER_MASK		0x0f000000
#define ISDN_PID_LAYER(n)		(n<<24)
#define ISDN_PID_FEATURE_MASK		0x00F00000
#define ISDN_PID_IDX_MAX		23

#define ISDN_PID_L2_DF_PTP		0x00100000
#define ISDN_PID_L2_DF_MULT_TEI		0x00200000
#define	ISDN_PID_L3_DF_PTP		0x00100000
#define ISDN_PID_L3_DF_EXTCID		0x00200000
#define ISDN_PID_L3_DF_CRLEN2		0x00400000


// short message status
#define SSTATUS_ALL		0x0fffffff
#define SSTATUS_BROADCAST_BIT	0x10000000
#define SSTATUS_L1		0x01ffffff
#define SSTATUS_L2		0x02ffffff
#define SSTATUS_L1_DEACTIVATED	0x01000000
#define SSTATUS_L1_ACTIVATED	0x01000001
#define SSTATUS_L2_RELEASED	0x02000000
#define SSTATUS_L2_ESTABLISHED	0x02000001


#define mISDN_CORE_DEVICE	0
#define mISDN_RAW_DEVICE	128

#define FLG_mISDNPORT_BUSY	1
#define FLG_mISDNPORT_ENABLED	2
#define FLG_mISDNPORT_BLOCK	3
#define FLG_mISDNPORT_OPEN	4
#define FLG_mISDNPORT_ONEFRAME	5


/*
 * A "ENTITY" is a instance which assign id's with a none local
 * scope. A id has a local part (a range of ids which the instance
 * maintains) and the global ENTITY ID.
 * A instance which wan't to assign IDs have to request a unique
 * ENTITY ID with MGR_NEWENTITY | REQUEST.
 * If the instance is deleted or don't need this feature anymore
 * it has to delete the ENTITY with MGR_DELENTITY | REQUEST.
 * ENTITY ID 0xFFFF is a special one.
 * One example for using this is the L3/L4 process ID.
 */

#define MISDN_MAX_ENTITY	2048
#define MISDN_ENTITY_NONE	0x0000ffff
#define MISDN_ID_ENTITYMASK	0xffff0000
#define MISDN_ID_LOCALMASK	0x0000FFFF
#define MISDN_ID_ANY		0xffffffff
#define MISDN_ID_NONE		0xfffffffe
#define MISDN_ID_DUMMY		0xffff0001
#define MISDN_ID_GLOBAL		0xffff0002

#define MAX_LAYER_NR		7
#define ISDN_LAYER(n)		(1<<n)
#define LAYER_OUTRANGE(layer)	((layer<0) || (layer>MAX_LAYER_NR))

/* should be in sync with linux/kobject.h:KOBJ_NAME_LEN */
#define mISDN_MAX_IDLEN		20

#ifdef OBSOLETE
#define IF_NOACTIV	0x00000000
#define IF_DOWN		0x01000000
#define IF_UP		0x02000000
#define IF_CHAIN	0x04000000
#define IF_HANDSHAKE	0x08000000
#define IF_TYPEMASK	0x07000000
#define IF_ADDRMASK	0xF0FFFFFF
#define IF_IADDRMASK	0xF0FFFFFF
#define IF_CONTRMASK	0x000000FF
#define IF_CHILDMASK	0x1000FF00
#define IF_CLONEMASK	0x2000FF00
#define IF_INSTMASK	0x400F0000
#define IF_LAYERMASK	0x00F00000
#define IF_TYPE(i)	((i)->stat & IF_TYPEMASK)
#endif

/*
 * general ID layout for instance and stack id's
 * 3322 2222 2222 1111 1111 1100 0000 0000
 * 1098 7654 3210 9876 5432 1098 7654 3210
 * FFFF FFFF CCCC CCCC SSSS SSSS RRRR LLLL
 *
 * L (bit 03-00) Layer ID
 * R (bit 06-04) reserved (0)
 * U (bit 07)    user device id
 * S (bit 15-08) Stack ID/controller number
 * C (bit 23-16) Child/Clone ID
 * F (bit 31-24) Flags as defined below
 *
 */

#define FLG_MSG_DOWN	0x01000000
#define FLG_MSG_UP	0x02000000
#define FLG_MSG_TARGET	0x04000000
#define FLG_MSG_CLONED	0x08000000
#define FLG_CHILD_STACK	0x10000000
#define FLG_CLONE_STACK	0x20000000
#define FLG_INSTANCE	0x40000000
#define FLG_MSG_TAGGED	0x80000000
#define MSG_DIR_MASK	0x03000000
#define MSG_BROADCAST	0x03000000
#define MSG_TO_OWNER	0x00000000

#define CHILD_ID_INC	0x00010000
#define CHILD_ID_MAX	0x10FF0000
#define CHILD_ID_MASK	0x00FF0000
#define CLONE_ID_INC	0x00010000
#define CLONE_ID_MAX	0x20FF0000
#define CLONE_ID_MASK	0x00FF0000
#define STACK_ID_INC	0x00000100
#define STACK_ID_MAX	0x00007F00
#define STACK_ID_MASK	0x30FFFF00
#define MASTER_ID_MASK	0x0000FF00
#define LAYER_ID_INC	0x00000001
#define LAYER_ID_MAX	MAX_LAYER_NR
#define LAYER_ID_MASK	0x0000000F
#define FLG_ID_USER	0x00000080
#define INST_ID_MASK	0x70FFFFFF

#define DUMMY_CR_FLAG	0x7FFFFF00
// #define CONTROLER_MASK	0x0000FF

/* stack channel values */
#define CHANNEL_NUMBER	0x000000FF
#define CHANNEL_RXSLOT	0x0000FF00
#define CHANNEL_TXSLOT	0x00FF0000
#define CHANNEL_EXTINFO	0xFF000000
#define CHANNEL_NR_D	0x00000000
#define CHANNEL_NR_B1	0x00000001
#define CHANNEL_NR_B2	0x00000002
#define CHANNEL_EXT_PCM	0x01000000
#define CHANNEL_EXT_REV	0x02000000

/* instance/stack extentions */
#define EXT_STACK_CLONE 0x00000001
#define EXT_INST_CLONE	0x00000100
#define EXT_INST_MGR	0x00000200
#define EXT_INST_MIDDLE	0x00000400
#define EXT_INST_UNUSED 0x00000800
//#define EXT_IF_CHAIN	0x00010000
//#define EXT_IF_EXCLUSIV	0x00020000
//#define EXT_IF_CREATE	0x00040000
//#define EXT_IF_SPLIT	0x00080000

/* stack status flag */
#define mISDN_STACK_ACTION_MASK		0x0000ffff
#define mISDN_STACK_COMMAND_MASK	0x000f0000
#define mISDN_STACK_STATUS_MASK		0xfff00000
/* action bits 0-15 */
#define mISDN_STACK_WORK	0
#define mISDN_STACK_SETUP	1
#define mISDN_STACK_CLEARING	2
#define mISDN_STACK_RESTART	3
#define mISDN_STACK_WAKEUP	4
#define mISDN_STACK_ABORT	15
/* status bits 16-31 */
#define mISDN_STACK_STOPPED	16
#define mISDN_STACK_INIT	17
#define mISDN_STACK_THREADSTART	18
#define mISDN_STACK_DELETED	28
#define mISDN_STACK_ACTIVE	29
#define mISDN_STACK_RUNNING	30
#define mISDN_STACK_KILLED	31

/* special packet type */
#define PACKET_NOACK	250

/* limits for buffers */

#define MAX_PHONE_DIGIT		31
#define MAX_DFRAME_LEN		260
#define MAX_DATA_SIZE		2048
#define MAX_DATA_MEM		2080
#define MAX_HEADER_LEN		4
#define	DEFAULT_PORT_QUEUELEN	256
#define PORT_SKB_RESERVE	L3_EXTRA_SIZE
#define PORT_SKB_MINIMUM	128

/* structure for information exchange between layer/entity boundaries */

#define STATUS_INFO_L1	1
#define STATUS_INFO_L2	2

typedef struct _mISDN_head {
	u_int	addr;
	u_int	prim;
	int	dinfo;
	int	len;
}  __attribute__((packed)) mISDN_head_t;

#define mISDN_HEADER_LEN	sizeof(mISDN_head_t)

typedef struct _status_info {
	int	len;
	int	typ;
	u_char	info[120];
} status_info_t;

typedef struct _logdata {
	char    *head;
	char	*fmt;
	va_list args;
} logdata_t;

typedef struct _moditem {
	char	*name;
	int	protocol;
} moditem_t;

typedef struct _mISDN_pid {
	int	protocol[MAX_LAYER_NR +1];
	int	layermask;
	int	maxplen;
	/* 0 is defined as no prameter, all other values are offsets into pbuf
	 * so pbuf[0] is always unused */
	u16	param[MAX_LAYER_NR +1];
	u16	global;
	u16	pidx;
	u_int modparm_protocol;
	u_char	*pbuf;
} mISDN_pid_t;

typedef struct _mISDN_stPara {
	int	maxdatalen;
	int	up_headerlen;
	int	down_headerlen;
} mISDN_stPara_t;

typedef struct _stack_info {
	u_int		id;
	mISDN_pid_t	pid;
	mISDN_stPara_t	para;
	u_int		extentions;
	u_int		mgr;
	u_int		master;
	u_int		clone;
	int		instcnt;
	int		inst[MAX_LAYER_NR +1];
	int		childcnt;
	u_int		child[2]; /* this is correct handled for PRI see get_stack_info() */
} stack_info_t;

typedef struct _layer_info {
	char		name[mISDN_MAX_IDLEN];
	int		object_id;
	int		extentions;
	u_int		id;
	u_int		st;
	u_int		clone;
	u_int		parent;
	mISDN_pid_t	pid;
} layer_info_t;

#ifdef OBSOLETE
typedef struct _interface_info {
	int		extentions;
	u_int		owner;
	u_int		peer;
	int		stat;
} interface_info_t;
#endif

typedef struct _channel_info {
	u_int		channel;
	union {
		u_int	id;
		void	*p;
	} st;
} channel_info_t;

/* l3 pointer arrays */

typedef struct _ie_info {
	u16	off	: 10,
		ridx	: 3,
		res1	: 1,
		cs_flg	: 1,
		repeated: 1;
} __attribute__((packed)) ie_info_t;

typedef struct _ie_val {
	u16	codeset	: 3,
		res1	: 5,
		val	: 8;
} __attribute__((packed)) ie_val_t;;

typedef struct _cs_info {
	u16	codeset	: 3,
		locked	: 1,
		res1	: 2,
		len	: 10;
} __attribute__((packed)) cs_info_t;

typedef struct _ie_info_ext {
	ie_info_t	ie;
	union {
		ie_val_t	v;
		cs_info_t	cs;
	};
} __attribute__((packed)) ie_info_ext_t;

typedef struct _Q931_info {
	u_char		type;
	u_char		crlen;
	u16		cr;
	ie_info_t	bearer_capability;
	ie_info_t	cause;
	ie_info_t	call_id;
	ie_info_t	call_state;
	ie_info_t	channel_id;
	ie_info_t	facility;
	ie_info_t	progress;
	ie_info_t	net_fac;
	ie_info_t	notify;
	ie_info_t	display;
	ie_info_t	date;
	ie_info_t	keypad;
	ie_info_t	signal;
	ie_info_t	info_rate;
	ie_info_t	end2end_transit;
	ie_info_t	transit_delay_sel;
	ie_info_t	pktl_bin_para;
	ie_info_t	pktl_window;
	ie_info_t	pkt_size;
	ie_info_t	closed_userg;
	ie_info_t	connected_nr;
	ie_info_t	connected_sub;
	ie_info_t	calling_nr;
	ie_info_t	calling_sub;
	ie_info_t	called_nr;
	ie_info_t	called_sub;
	ie_info_t	redirect_nr;
	ie_info_t	redirect_dn;
	ie_info_t	transit_net_sel;
	ie_info_t	restart_ind;
	ie_info_t	llc;
	ie_info_t	hlc;
	ie_info_t	useruser;
	ie_info_t	more_data;
	ie_info_t	sending_complete;
	ie_info_t	congestion_level;
	ie_info_t	comprehension_required;
	ie_info_ext_t	ext[8];
}  __attribute__((packed)) Q931_info_t;

#define L3_EXTRA_SIZE	sizeof(Q931_info_t)

#ifdef __KERNEL__
#include <linux/isdn_compat.h>
#include <linux/list.h>
#include <linux/skbuff.h>

typedef struct _mISDNobject	mISDNobject_t;
typedef struct _mISDNinstance	mISDNinstance_t;
typedef struct _mISDNstack	mISDNstack_t;
typedef struct _mISDNport	mISDNport_t;
typedef struct _mISDNdevice	mISDNdevice_t;
typedef int	(ctrl_func_t)(void *, u_int, void *);
typedef int	(if_func_t)(mISDNinstance_t *, struct sk_buff *);

#define mISDN_HEAD_P(s)		((mISDN_head_t *)&s->cb[0])
#define mISDN_HEAD_PRIM(s)	((mISDN_head_t *)&s->cb[0])->prim
#define mISDN_HEAD_DINFO(s)	((mISDN_head_t *)&s->cb[0])->dinfo

typedef struct _mISDN_headext {
	u_int	addr;
	u_int	prim;
	int	dinfo;
	void	*data[3];
	union {
		ctrl_func_t	*ctrl;
		if_func_t	*iff;
		void		*func;
	} func;
}  __attribute__((packed)) mISDN_headext_t;

#define mISDN_HEADEXT_P(s) ((mISDN_headext_t *)&s->cb[0])

/* Basic struct of a mISDN component */
struct _mISDNobject {
	struct list_head	list;
	char			*name;
	u_int			id;
	int			refcnt;
	mISDN_pid_t		DPROTO;
	mISDN_pid_t		BPROTO;
	ctrl_func_t		*own_ctrl;
	struct list_head	ilist;
	spinlock_t		lock;
	struct module		*owner;
	struct class_device	class_dev;
};

#ifdef OBSOLETE
/* the interface between two mISDNinstances */
struct _mISDNif {
	if_func_t		*func;
	void			*fdata;
	mISDNif_t		*clone;
	mISDNif_t		*predecessor;
	int			extentions;
	int			stat;
	mISDNstack_t		*st;
	mISDNinstance_t		*owner;
	mISDNinstance_t		*peer;
};
#endif

/* a instance of a mISDNobject */
struct _mISDNinstance {
	struct list_head	list;
	char			name[mISDN_MAX_IDLEN];
	int			extentions;
	u_int			id;
	int			regcnt;
	mISDN_pid_t		pid;
	mISDNstack_t		*st;
	mISDNobject_t		*obj;
	void			*privat;
	mISDNinstance_t		*clone;
	mISDNinstance_t		*parent;
	if_func_t		*function;
	spinlock_t		*hwlock;
	struct class_device	class_dev;
};

#ifdef OBSOLETE
/* a list of parallel (horizontal) mISDNinstances in the same layer
 * normally here is only one instance per layer only if the information
 * will be splitted here are more instances */
struct _mISDNlayer {
	struct list_head	list;
	mISDNinstance_t		*inst;
};
#endif
/* the STACK; a (vertical) chain of layers */
 
struct _mISDNstack {
	struct list_head	list;
	u_int			id;
	u_int			extentions;
	mISDN_pid_t		pid;
	mISDN_stPara_t		para;
	u_long			status;
	struct task_struct	*thread;
	struct semaphore	*notify;
	wait_queue_head_t	workq;
	struct sk_buff_head	msgq;
#ifdef MISDN_MSG_STATS
	u_int			msg_cnt;
	u_int			sleep_cnt;
	u_int			clone_cnt;
	u_int			stopped_cnt;
#endif
	mISDNinstance_t		*i_array[MAX_LAYER_NR + 1];
	struct list_head	prereg;
	mISDNinstance_t		*mgr;
	mISDNstack_t		*master;
	mISDNstack_t		*clone;
	mISDNstack_t		*parent;
	struct list_head	childlist;
	struct class_device	class_dev;
	/* temporary use */
	mISDN_pid_t		new_pid;
};

/* lowlevel read/write struct for the mISDNdevice */
struct _mISDNport {
	wait_queue_head_t	procq;
	spinlock_t		lock;
//	mISDNif_t		pif;
	u_long			Flag;
	struct sk_buff_head	queue;
	u_int			maxqlen;
};

/* the user interface to handle /dev/mISDN */
struct _mISDNdevice {
	struct list_head	list;
	int			minor;
	struct semaphore	io_sema;
	int			open_mode;
	mISDNport_t		rport;
	mISDNport_t		wport;
	struct list_head	layerlist;
	struct list_head	stacklist;
	struct list_head	timerlist;
	struct list_head	entitylist;
};

/* common helper functions */
extern int	mISDN_bprotocol2pid(void *, mISDN_pid_t *);
// extern int	mISDN_SetIF(mISDNinstance_t *, mISDNif_t *, u_int, void *, void *, void *);
// extern int	mISDN_ConnectIF(mISDNinstance_t *, mISDNinstance_t *);
// extern int	mISDN_DisConnectIF(mISDNinstance_t *, mISDNif_t *);
extern int	mISDN_queue_message(mISDNinstance_t *, u_int, struct sk_buff *);


/* global register/unregister functions */

extern int	mISDN_register(mISDNobject_t *obj);
extern int	mISDN_unregister(mISDNobject_t *obj);
extern int	mISDN_ctrl(void *, u_int, void *);

#endif /* __KERNEL__ */
#endif /* mISDNIF_H */