mISDNuser/include/mISDN/q931.h

364 lines
11 KiB
C

/* q931.h
*
* Basic Q931 defines
*
* Author Karsten Keil <kkeil@novell.com>
*
* Copyright 2007 by Karsten Keil <kkeil@novell.com>
*
* This code is free software; you can redistribute it and/or modify
* it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
* version 2.1 as published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU LESSER GENERAL PUBLIC LICENSE for more details.
*
*/
#ifndef _Q931_H
#define _Q931_H
#include <time.h>
/*
* Q931 protocol discriminator
*/
#define Q931_PD 0x08
/*
* Q931 Message-Types
*/
#define MT_ALERTING 0x01
#define MT_CALL_PROCEEDING 0x02
#define MT_CONNECT 0x07
#define MT_CONNECT_ACKNOWLEDGE 0x0f
#define MT_PROGRESS 0x03
#define MT_SETUP 0x05
#define MT_SETUP_ACKNOWLEDGE 0x0d
#define MT_RESUME 0x26
#define MT_RESUME_ACKNOWLEDGE 0x2e
#define MT_RESUME_REJECT 0x22
#define MT_SUSPEND 0x25
#define MT_SUSPEND_ACKNOWLEDGE 0x2d
#define MT_SUSPEND_REJECT 0x21
#define MT_USER_INFORMATION 0x20
#define MT_DISCONNECT 0x45
#define MT_RELEASE 0x4d
#define MT_RELEASE_COMPLETE 0x5a
#define MT_RESTART 0x46
#define MT_RESTART_ACKNOWLEDGE 0x4e
#define MT_SEGMENT 0x60
#define MT_CONGESTION_CONTROL 0x79
#define MT_INFORMATION 0x7b
#define MT_FACILITY 0x62
#define MT_NOTIFY 0x6e
#define MT_STATUS 0x7d
#define MT_STATUS_ENQUIRY 0x75
#define MT_HOLD 0x24
#define MT_HOLD_ACKNOWLEDGE 0x28
#define MT_HOLD_REJECT 0x30
#define MT_RETRIEVE 0x31
#define MT_RETRIEVE_ACKNOWLEDGE 0x33
#define MT_RETRIEVE_REJECT 0x37
#define MT_REGISTER 0x64
/*
* Info Elements
*/
// not implemented
// #define IE_SEGMENT 0x00
#define IE_BEARER 0x04
#define IE_CAUSE 0x08
#define IE_CALL_ID 0x10
#define IE_CALL_STATE 0x14
#define IE_CHANNEL_ID 0x18
#define IE_FACILITY 0x1c
#define IE_PROGRESS 0x1e
#define IE_NET_FAC 0x20
#define IE_NOTIFY 0x27
#define IE_DISPLAY 0x28
#define IE_DATE 0x29
#define IE_KEYPAD 0x2c
#define IE_SIGNAL 0x34
#define IE_INFORATE 0x40
#define IE_E2E_TDELAY 0x42
#define IE_TDELAY_SEL 0x43
#define IE_PACK_BINPARA 0x44
#define IE_PACK_WINSIZE 0x45
#define IE_PACK_SIZE 0x46
#define IE_CUG 0x47
#define IE_REV_CHARGE 0x4a
#define IE_CONNECT_PN 0x4c
#define IE_CONNECT_SUB 0x4d
#define IE_CALLING_PN 0x6c
#define IE_CALLING_SUB 0x6d
#define IE_CALLED_PN 0x70
#define IE_CALLED_SUB 0x71
#define IE_REDIRECTING_NR 0x74
#define IE_REDIRECTION_NR 0x76
#define IE_TRANS_SEL 0x78
#define IE_RESTART_IND 0x79
#define IE_LLC 0x7c
#define IE_HLC 0x7d
#define IE_USER_USER 0x7e
#define IE_COUNT 34
// not implemented
#define IE_ESCAPE 0x7f
// one octet IE
#define IE_SHIFT 0x90
#define IE_MORE_DATA 0xa0
#define IE_COMPLETE 0xa1
#define IE_CONGESTION 0xb0
// not allowed for ETSI
#define IE_REPEAT 0xd0
/*
* weight for IE in check lists
*/
#define IE_MANDATORY 0x0100
/* mandatory not in every case */
#define IE_MANDATORY_1 0x0200
/*
* Cause location
*/
#define CAUSE_LOC_USER 0
#define CAUSE_LOC_PRVN_LOCUSER 1
#define CAUSE_LOC_PUBN_LOCUSER 2
#define CAUSE_LOC_TRANSIT 3
#define CAUSE_LOC_PUBN_RMTUSER 4
#define CAUSE_LOC_PRVN_RMTUSER 5
/*
* Cause values
*/
#define CAUSE_UNASSIGNED_NUMBER 1
#define CAUSE_NO_TRANSIT_ROUTE 2
#define CAUSE_NO_ROUTE 3
#define CAUSE_CHANNEL_UNACCEPT 6
#define CAUSE_NORMAL_CLEARING 16
#define CAUSE_USER_BUSY 17
#define CAUSE_NOUSER_RESPONDING 18
#define CAUSE_ALERTED_NO_ANSWER 19
#define CAUSE_CALL_REJECTED 21
#define CAUSE_NONSELECTED_USER 26
#define CAUSE_DEST_OUT_OF_ORDER 27
#define CAUSE_INVALID_NUMBER 28
#define CAUSE_FACILITY_REJECTED 29
#define CAUSE_STATUS_RESPONSE 30
#define CAUSE_NORMALUNSPECIFIED 31
#define CAUSE_NO_CHANNEL 34
#define CAUSE_NET_OUT_OF_ORDER 28
#define CAUSE_TEMPORARY_FAILURE 41
#define CAUSE_SEQ_CONGESTION 42
#define CAUSE_REQUESTED_CHANNEL 44
#define CAUSE_RESOURCES_UNAVAIL 47
#define CAUSE_FACILITY_NOTSUBSCRIBED 50
#define CAUSE_FACILITY_NOTIMPLEMENTED 69
#define CAUSE_INVALID_CALLREF 81
#define CAUSE_INCOMPATIBLE_DEST 88
#define CAUSE_MANDATORY_IE_MISS 96
#define CAUSE_MT_NOTIMPLEMENTED 97
#define CAUSE_NOTCOMPAT_STATE_OR_MT_NOTIMPLEMENTED 98
#define CAUSE_IE_NOTIMPLEMENTED 99
#define CAUSE_INVALID_CONTENTS 100
#define CAUSE_NOTCOMPAT_STATE 101
#define CAUSE_TIMER_EXPIRED 102
#define CAUSE_PROTOCOL_ERROR 111
#define NO_CAUSE 254
/*
* Restart indication class values
*/
#define RESTART_CLASS_CHANNEL 0
#define RESTART_CLASS_SINGLE 6
#define RESTART_CLASS_ALL 7
/*
* Parser error codes
*/
#define Q931_ERROR_LEN 0x010000
#define Q931_ERROR_OVERFLOW 0x020000
#define Q931_ERROR_CREF 0x040000
#define Q931_ERROR_FATAL 0x0F0000
#define Q931_ERROR_IELEN 0x100000
#define Q931_ERROR_UNKNOWN 0x200000
#define Q931_ERROR_COMPREH 0x400000
#define Q931_ERROR_IESEQ 0x800000 /* do not care in our implementation */
/* Bearer capability */
#define Q931_CAP_SPEECH 0x00
#define Q931_CAP_UNRES_DIGITAL 0x08
#define Q931_CAP_RES_DIGITAL 0x09
#define Q931_CAP_3KHZ_AUDIO 0x10
#define Q931_CAP_7KHZ_AUDIO 0x11
#define Q931_CAP_VIDEO 0x18
/* Bearer L1 user info */
#define Q931_L1INFO_V110 0x01
#define Q931_L1INFO_ULAW 0x02
#define Q931_L1INFO_ALAW 0x03
#define Q931_L1INFO_G721 0x04
#define Q931_L1INFO_G722_5 0x05
#define Q931_L1INFO_G7XX_VIDEO 0x06
#define Q931_L1INFO_NONE_CCITT 0x07
#define Q931_L1INFO_V120 0x08
#define Q931_L1INFO_X31 0x09
struct misdn_channel_info {
unsigned char nr; /* channel number/slot or special */
unsigned char flags; /* exclusiv, not Basic, ANY, NONE */
unsigned char type; /* B-channel, D-channel, H0, H11, H12 */
unsigned char ctrl; /* Allocated, updated, needsend, sent */
} __attribute__((packed));
/*
* special channel number defines
*/
#define MI_CHAN_ANY 0xff
#define MI_CHAN_NONE 0xfe
#define MI_CHAN_DCHANNEL 0xfd
#define MI_CHAN_FLG_NONE 0x01
#define MI_CHAN_FLG_ANY 0x02
#define MI_CHAN_FLG_DCHANNEL 0x04
#define MI_CHAN_FLG_EXCLUSIVE 0x08
#define MI_CHAN_FLG_OTHER_IF 0x20
#define MI_CHAN_TYP_NONE 0
#define MI_CHAN_TYP_B 1
#define MI_CHAN_TYP_D 2
#define MI_CHAN_TYP_H0 3
#define MI_CHAN_TYP_H11 4
#define MI_CHAN_TYP_H12 5
#define MI_CHAN_CTRL_UPDATED 0x01
#define MI_CHAN_CTRL_NEEDSEND 0x02
#define MI_CHAN_CTRL_SENT 0x04
#define MI_CHAN_CTRL_ALLOCATED 0x10
#define MI_CHAN_CTRL_DOWN 0x20
/* progress info */
struct misdn_progress_info {
unsigned char loc; /* location, octet 3 */
unsigned char desc; /* description, octet 3 */
unsigned char resv; /* reserved */
unsigned char ctrl; /* ctrl info flags */
} __attribute__((packed));
/*
* Q931 location
*/
#define Q931_LOC_USER 0
#define Q931_LOC_PRVN_LOCUSER 1
#define Q931_LOC_PUBN_LOCUSER 2
#define Q931_LOC_PUBN_RMTUSER 4
#define Q931_LOC_PRVN_RMTUSER 5
#define Q931_LOC_INTERNATIONAL 7
/*
* Progress values
*/
#define PROGRESS_NOT_E2E_ISDN 1
#define PROGRESS_DEST_NOT_ISDN 2
#define PROGRESS_ORIG_NOT_ISDN 3
#define PROGRESS_RET_TO_ISDN 4
#define PROGRESS_INBAND 8
/* Progress control flags */
#define MI_PROG_CTRL_UPDATED 0x01
#define MI_PROG_CTRL_NEEDSEND 0x02
#define MI_PROG_CTRL_SENT 0x04
/* Reason for diversion */
#define MI_DIV_REASON_UNKNOWN 0x00
#define MI_DIV_REASON_CFB 0x01
#define MI_DIV_REASON_CFNR 0x02
#define MI_DIV_REASON_CD 0x0a
#define MI_DIV_REASON_CFU 0x0f
/* Number qualifiers */
#define Q931_NTYPE_UNKNOWN 0
#define Q931_NTYPE_INTERNATIONAL 1
#define Q931_NTYPE_NATIONAL 2
#define Q931_NTYPE_NETWORKSPECIFIC 3
#define Q931_NTYPE_SUBSCRIBER 4
#define Q931_NTYPE_ABBREVIATED 6
#define Q931_NTYPE_RESERVED 7
#define Q931_NPLAN_UNKNOWN 0x0
#define Q931_NPLAN_ISDN 0x1
#define Q931_NPLAN_DATA 0x3
#define Q931_NPLAN_TELEX 0x4
#define Q931_NPLAN_NATIONAL 0x8
#define Q931_NPLAN_PRIVATE 0x9
#define Q931_NPLAN_RESERVED 0xf
#define Q931_NPRESENTATION_ALLOWED 0
#define Q931_NPRESENTATION_RESTRICTED 1
#define Q931_NPRESENTATION_NOTAVAILABLE 2
#define Q931_NPRESENTATION_RESERVED 3
#define Q931_NSCREEN_USER_NOT 0
#define Q931_NSCREEN_USER_PASSED 1
#define Q931_NSCREEN_USER_FAILED 2
#define Q931_NSCREEN_NETWORK 3
/* Common IE encode helpers */
struct l3_msg;
struct asn1_parm;
extern int l3_ie2pos(unsigned char);
extern int mi_encode_bearer(struct l3_msg *, unsigned int, unsigned int, unsigned int, unsigned int);
extern int mi_encode_hlc(struct l3_msg *, int, int);
extern int mi_encode_channel_id(struct l3_msg *, struct misdn_channel_info *);
extern int mi_encode_calling_nr(struct l3_msg *, char *, int, unsigned int, unsigned int, unsigned int);
extern int mi_encode_connected_nr(struct l3_msg *, char *, int, unsigned int, unsigned int, unsigned int);
extern int mi_encode_called_nr(struct l3_msg *, char *, unsigned int, unsigned int);
extern int mi_encode_redirecting_nr(struct l3_msg *, char *, int, unsigned int, unsigned int, int);
extern int mi_encode_redirection_nr(struct l3_msg *, char *, int, unsigned int, unsigned int);
extern int mi_encode_useruser(struct l3_msg *, int, int, char *);
extern int mi_encode_cause(struct l3_msg *l, int cause, int, int, unsigned char *);
extern int mi_encode_progress(struct l3_msg *, struct misdn_progress_info *);
extern int mi_encode_date(struct l3_msg *, struct tm *);
extern int mi_encode_restart_ind(struct l3_msg *, unsigned char);
extern int mi_encode_facility(struct l3_msg *, struct asn1_parm *);
extern int mi_encode_notification_ind(struct l3_msg *, int);
/* Common IE decode helpers */
struct mbuffer;
extern int parseQ931(struct mbuffer *);
extern int l3_ie2pos(u_char);
extern unsigned char l3_pos2ie(int);
extern int mi_decode_progress(struct l3_msg *, struct misdn_progress_info *);
extern int mi_decode_bearer_capability(struct l3_msg *, int *, int *, int *, int *, int *,
int *, int *, int *, int *, int *, int *, int *, int *);
extern int mi_decode_hlc(struct l3_msg *l3m, int *, int *);
extern int mi_decode_cause(struct l3_msg *, int *, int *, int *, int *, int *, unsigned char *);
extern int mi_decode_channel_id(struct l3_msg *, struct misdn_channel_info *);
extern int mi_decode_calling_nr(struct l3_msg *, int *, int *, int *, int *, char *);
extern int mi_decode_connected_nr(struct l3_msg *, int *, int *, int *, int *, char *);
extern int mi_decode_called_nr(struct l3_msg *, int *, int *, char *);
extern int mi_decode_redirecting_nr(struct l3_msg *, int *, int *, int *, int *, int *, char *);
extern int mi_decode_redirection_nr(struct l3_msg *, int *, int *, int *, char *);
extern int mi_decode_display(struct l3_msg *, char *, int);
extern int mi_decode_useruser(struct l3_msg *, int *, int *, char *, int);
extern int mi_decode_date(struct l3_msg *, struct tm *);
extern int mi_decode_restart_ind(struct l3_msg *, unsigned char *);
extern int mi_decode_facility(struct l3_msg *, struct asn1_parm *);
extern int mi_decode_notification_ind(struct l3_msg *, int*);
/* some print helpers */
extern const char *mi_bearer2str(int);
extern const char *mi_msg_type2str(unsigned int);
extern const char *_mi_msg_type2str(unsigned int);
#endif