libpri.h 72.6 KB
Newer Older
Mark Spencer's avatar
Mark Spencer committed
1 2 3
/*
 * libpri: An implementation of Primary Rate ISDN
 *
4
 * Written by Mark Spencer <markster@digium.com>
Mark Spencer's avatar
Mark Spencer committed
5
 *
6
 * Copyright (C) 2001, Digium, Inc.
Mark Spencer's avatar
Mark Spencer committed
7
 * All Rights Reserved.
8 9 10 11 12 13 14 15
 */

/*
 * See http://www.asterisk.org for more information about
 * the Asterisk project. Please do not directly contact
 * any of the maintainers of this project for assistance;
 * the project provides a web site, mailing lists and IRC
 * channels for your use.
Mark Spencer's avatar
Mark Spencer committed
16
 *
17 18 19 20
 * This program is free software, distributed under the terms of
 * the GNU General Public License Version 2 as published by the
 * Free Software Foundation. See the LICENSE file included with
 * this program for more details.
Mark Spencer's avatar
Mark Spencer committed
21
 *
22 23 24 25 26 27
 * In addition, when this program is distributed with Asterisk in
 * any form that would qualify as a 'combined work' or as a
 * 'derivative work' (but not mere aggregation), you can redistribute
 * and/or modify the combination under the terms of the license
 * provided with that copy of Asterisk, instead of the license
 * terms granted here.
Mark Spencer's avatar
Mark Spencer committed
28
 */
29 30 31 32 33 34 35 36

/*
 * NOTE:
 * All new global identifiers that are added to this file MUST be
 * prefixed with PRI_ or pri_ to indicate that they are part of this
 * library and to reduce potential naming conflicts.
 */

Mark Spencer's avatar
Mark Spencer committed
37 38
#ifndef _LIBPRI_H
#define _LIBPRI_H
Mark Spencer's avatar
Mark Spencer committed
39 40 41 42 43 44 45 46 47 48 49 50

/* Node types */
#define PRI_NETWORK		1
#define PRI_CPE			2

/* Debugging */
#define PRI_DEBUG_Q921_RAW		(1 << 0)	/* Show raw HDLC frames */
#define PRI_DEBUG_Q921_DUMP		(1 << 1)	/* Show each interpreted Q.921 frame */
#define PRI_DEBUG_Q921_STATE 	(1 << 2)	/* Debug state machine changes */
#define PRI_DEBUG_CONFIG		(1 << 3) 	/* Display error events on stdout */
#define PRI_DEBUG_Q931_DUMP		(1 << 5)	/* Show interpreted Q.931 frames */
#define PRI_DEBUG_Q931_STATE	(1 << 6)	/* Debug Q.931 state machine changes */
Mark Spencer's avatar
Mark Spencer committed
51
#define	PRI_DEBUG_Q931_ANOMALY 	(1 << 7)	/* Show unexpected events */
52 53
#define PRI_DEBUG_APDU			(1 << 8)	/* Debug of APDU components such as ROSE */
#define PRI_DEBUG_AOC			(1 << 9)	/* Debug of Advice of Charge ROSE Messages */
54
#define PRI_DEBUG_CC			(1 << 10)	/* Debug call-completion. */
Mark Spencer's avatar
Mark Spencer committed
55 56 57 58

#define PRI_DEBUG_ALL			(0xffff)	/* Everything */

/* Switch types */
Mark Spencer's avatar
Mark Spencer committed
59 60 61 62 63
#define PRI_SWITCH_UNKNOWN 		0
#define PRI_SWITCH_NI2	   		1	/* National ISDN 2 */
#define PRI_SWITCH_DMS100		2	/* DMS 100 */
#define PRI_SWITCH_LUCENT5E		3	/* Lucent 5E */
#define PRI_SWITCH_ATT4ESS		4	/* AT&T 4ESS */
64 65
#define PRI_SWITCH_EUROISDN_E1		5	/* Standard EuroISDN (CTR4, ETSI 300-102) */
#define PRI_SWITCH_EUROISDN_T1		6	/* T1 EuroISDN variant (ETSI 300-102) */
66
#define PRI_SWITCH_NI1			7	/* National ISDN 1 */
67 68
#define PRI_SWITCH_GR303_EOC		8	/* GR-303 Embedded Operations Channel */
#define PRI_SWITCH_GR303_TMC		9	/* GR-303 Timeslot Management Channel */
69
#define PRI_SWITCH_QSIG			10	/* QSIG Switch */
70
/* Switchtypes 11 - 20 are reserved for internal use */
71

Mark Spencer's avatar
Mark Spencer committed
72 73

/* PRI D-Channel Events */
74
#define PRI_EVENT_DCHAN_UP		 1	/* D-channel is up */
75
#define PRI_EVENT_DCHAN_DOWN	 2	/* D-channel is down */
76 77
#define PRI_EVENT_RESTART		 3	/* B-channel is restarted */
#define PRI_EVENT_CONFIG_ERR 	 4	/* Configuration Error Detected */
78 79 80 81
#define PRI_EVENT_RING			 5	/* Incoming call (SETUP) */
#define PRI_EVENT_HANGUP		 6	/* Call got hung up (RELEASE/RELEASE_COMPLETE/other) */
#define PRI_EVENT_RINGING		 7	/* Call is ringing (ALERTING) */
#define PRI_EVENT_ANSWER		 8	/* Call has been answered (CONNECT) */
82
#define PRI_EVENT_HANGUP_ACK	 9	/* Call hangup has been acknowledged */
83
#define PRI_EVENT_RESTART_ACK	10	/* Restart complete on a given channel (RESTART_ACKNOWLEDGE) */
84 85
#define PRI_EVENT_FACNAME		11	/* Caller*ID Name received on Facility (DEPRECATED) */
#define PRI_EVENT_FACILITY		11	/* Facility received (FACILITY) */
86 87
#define PRI_EVENT_INFO_RECEIVED 12	/* Additional info (digits) received (INFORMATION) */
#define PRI_EVENT_PROCEEDING	13	/* When we get CALL_PROCEEDING */
88
#define PRI_EVENT_SETUP_ACK		14	/* When we get SETUP_ACKNOWLEDGE */
89 90 91 92
#define PRI_EVENT_HANGUP_REQ	15	/* Requesting the higher layer to hangup (DISCONNECT) */
#define PRI_EVENT_NOTIFY		16	/* Notification received (NOTIFY) */
#define PRI_EVENT_PROGRESS		17	/* When we get PROGRESS */
#define PRI_EVENT_KEYPAD_DIGIT	18	/* When we receive during ACTIVE state (INFORMATION) */
93 94
#define PRI_EVENT_SERVICE       19	/* SERVICE maintenance message */
#define PRI_EVENT_SERVICE_ACK   20	/* SERVICE maintenance acknowledgement message */
95 96 97 98 99 100
#define PRI_EVENT_HOLD			21	/* HOLD request received */
#define PRI_EVENT_HOLD_ACK		22	/* HOLD_ACKNOWLEDGE received */
#define PRI_EVENT_HOLD_REJ		23	/* HOLD_REJECT received */
#define PRI_EVENT_RETRIEVE		24	/* RETRIEVE request received */
#define PRI_EVENT_RETRIEVE_ACK	25	/* RETRIEVE_ACKNOWLEDGE received */
#define PRI_EVENT_RETRIEVE_REJ	26	/* RETRIEVE_REJECT received */
101
#define PRI_EVENT_CONNECT_ACK	27	/* CONNECT_ACKNOWLEDGE received */
Mark Spencer's avatar
Mark Spencer committed
102 103 104 105 106

/* Simple states */
#define PRI_STATE_DOWN		0
#define PRI_STATE_UP		1

107 108 109 110 111 112 113 114 115 116 117 118
#define PRI_PROGRESS_MASK

/* Progress indicator values */
#define PRI_PROG_CALL_NOT_E2E_ISDN						(1 << 0)
#define PRI_PROG_CALLED_NOT_ISDN						(1 << 1)
#define PRI_PROG_CALLER_NOT_ISDN						(1 << 2)
#define PRI_PROG_INBAND_AVAILABLE						(1 << 3)
#define PRI_PROG_DELAY_AT_INTERF						(1 << 4)
#define PRI_PROG_INTERWORKING_WITH_PUBLIC				(1 << 5)
#define PRI_PROG_INTERWORKING_NO_RELEASE				(1 << 6)
#define PRI_PROG_INTERWORKING_NO_RELEASE_PRE_ANSWER		(1 << 7)
#define PRI_PROG_INTERWORKING_NO_RELEASE_POST_ANSWER	(1 << 8)
119
#define PRI_PROG_CALLER_RETURNED_TO_ISDN					(1 << 9)
120

Mark Spencer's avatar
Mark Spencer committed
121
/* Numbering plan identifier */
122 123 124 125 126 127 128
#define PRI_NPI_UNKNOWN					0x0 /*!< Unknown numbering plan */
#define PRI_NPI_E163_E164				0x1 /*!< ISDN/telephony numbering plan (public) */
#define PRI_NPI_X121					0x3 /*!< Data numbering plan */
#define PRI_NPI_F69						0x4 /*!< Telex numbering plan */
#define PRI_NPI_NATIONAL				0x8 /*!< National standard numbering plan */
#define PRI_NPI_PRIVATE					0x9 /*!< Private numbering plan */
#define PRI_NPI_RESERVED				0xF /*!< Reserved for extension */
Mark Spencer's avatar
Mark Spencer committed
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147

/* Type of number */
#define PRI_TON_UNKNOWN					0x0
#define PRI_TON_INTERNATIONAL			0x1
#define PRI_TON_NATIONAL				0x2
#define PRI_TON_NET_SPECIFIC			0x3
#define PRI_TON_SUBSCRIBER				0x4
#define PRI_TON_ABBREVIATED				0x6
#define PRI_TON_RESERVED				0x7

/* Redirection reasons */
#define PRI_REDIR_UNKNOWN				0x0
#define PRI_REDIR_FORWARD_ON_BUSY		0x1
#define PRI_REDIR_FORWARD_ON_NO_REPLY	0x2
#define PRI_REDIR_DEFLECTION			0x3
#define PRI_REDIR_DTE_OUT_OF_ORDER		0x9
#define PRI_REDIR_FORWARDED_BY_DTE		0xA
#define PRI_REDIR_UNCONDITIONAL			0xF

Mark Spencer's avatar
Mark Spencer committed
148 149 150 151 152 153 154 155
/* Dialing plan */
#define PRI_INTERNATIONAL_ISDN		0x11
#define PRI_NATIONAL_ISDN			0x21
#define PRI_LOCAL_ISDN				0x41
#define PRI_PRIVATE					0x49
#define PRI_UNKNOWN					0x0

/* Presentation */
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
#define PRI_PRES_NUMBER_TYPE				0x03
#define PRI_PRES_USER_NUMBER_UNSCREENED		0x00
#define PRI_PRES_USER_NUMBER_PASSED_SCREEN	0x01
#define PRI_PRES_USER_NUMBER_FAILED_SCREEN	0x02
#define PRI_PRES_NETWORK_NUMBER				0x03

#define PRI_PRES_RESTRICTION				0x60
#define PRI_PRES_ALLOWED					0x00
#define PRI_PRES_RESTRICTED					0x20
#define PRI_PRES_UNAVAILABLE				0x40
#define PRI_PRES_RESERVED					0x60

#define PRES_ALLOWED_USER_NUMBER_NOT_SCREENED \
	(PRI_PRES_ALLOWED | PRI_PRES_USER_NUMBER_UNSCREENED)

#define PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN \
	(PRI_PRES_ALLOWED | PRI_PRES_USER_NUMBER_PASSED_SCREEN)

#define PRES_ALLOWED_USER_NUMBER_FAILED_SCREEN \
	(PRI_PRES_ALLOWED | PRI_PRES_USER_NUMBER_FAILED_SCREEN)

#define PRES_ALLOWED_NETWORK_NUMBER	\
	(PRI_PRES_ALLOWED | PRI_PRES_NETWORK_NUMBER)

#define PRES_PROHIB_USER_NUMBER_NOT_SCREENED \
	(PRI_PRES_RESTRICTED | PRI_PRES_USER_NUMBER_UNSCREENED)

#define PRES_PROHIB_USER_NUMBER_PASSED_SCREEN \
	(PRI_PRES_RESTRICTED | PRI_PRES_USER_NUMBER_PASSED_SCREEN)

#define PRES_PROHIB_USER_NUMBER_FAILED_SCREEN \
	(PRI_PRES_RESTRICTED | PRI_PRES_USER_NUMBER_FAILED_SCREEN)

#define PRES_PROHIB_NETWORK_NUMBER \
	(PRI_PRES_RESTRICTED | PRI_PRES_NETWORK_NUMBER)

#define PRES_NUMBER_NOT_AVAILABLE \
	(PRI_PRES_UNAVAILABLE | PRI_PRES_NETWORK_NUMBER)
Mark Spencer's avatar
Mark Spencer committed
194

195 196 197 198
/* Reverse Charging Indication */
#define PRI_REVERSECHARGE_NONE      -1
#define PRI_REVERSECHARGE_REQUESTED  1

Richard Mudgett's avatar
Richard Mudgett committed
199 200
/* Causes for disconnection (See Q.850) */
#define PRI_CAUSE_UNALLOCATED					1	/*!< Called number unassigned. */
201
#define PRI_CAUSE_NO_ROUTE_TRANSIT_NET			2	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
202 203
#define PRI_CAUSE_NO_ROUTE_DESTINATION			3
#define PRI_CAUSE_CHANNEL_UNACCEPTABLE			6
204
#define PRI_CAUSE_CALL_AWARDED_DELIVERED		7	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
205 206 207 208 209
#define PRI_CAUSE_NORMAL_CLEARING				16
#define PRI_CAUSE_USER_BUSY						17
#define PRI_CAUSE_NO_USER_RESPONSE				18
#define PRI_CAUSE_NO_ANSWER						19
#define PRI_CAUSE_CALL_REJECTED					21
Mark Spencer's avatar
Mark Spencer committed
210
#define PRI_CAUSE_NUMBER_CHANGED				22
211
#define PRI_CAUSE_NONSELECTED_USER_CLEARING		26
Mark Spencer's avatar
Mark Spencer committed
212 213
#define PRI_CAUSE_DESTINATION_OUT_OF_ORDER		27
#define PRI_CAUSE_INVALID_NUMBER_FORMAT			28
214
#define PRI_CAUSE_FACILITY_REJECTED				29	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
215 216 217
#define PRI_CAUSE_RESPONSE_TO_STATUS_ENQUIRY	30
#define PRI_CAUSE_NORMAL_UNSPECIFIED			31
#define PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION		34
218
#define PRI_CAUSE_NETWORK_OUT_OF_ORDER			38	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
219
#define PRI_CAUSE_NORMAL_TEMPORARY_FAILURE		41
220 221
#define PRI_CAUSE_SWITCH_CONGESTION				42	/* !Q.SIG */
#define PRI_CAUSE_ACCESS_INFO_DISCARDED			43	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
222
#define PRI_CAUSE_REQUESTED_CHAN_UNAVAIL		44
223
#define PRI_CAUSE_PRE_EMPTED					45	/* !Q.SIG */
224
#define PRI_CAUSE_RESOURCE_UNAVAIL_UNSPECIFIED	47
225 226 227
#define PRI_CAUSE_FACILITY_NOT_SUBSCRIBED  		50	/* !Q.SIG */
#define PRI_CAUSE_OUTGOING_CALL_BARRED     		52	/* !Q.SIG */
#define PRI_CAUSE_INCOMING_CALL_BARRED     		54	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
228
#define PRI_CAUSE_BEARERCAPABILITY_NOTAUTH		57
Mark Spencer's avatar
Mark Spencer committed
229
#define PRI_CAUSE_BEARERCAPABILITY_NOTAVAIL     58
230
#define PRI_CAUSE_SERVICEOROPTION_NOTAVAIL		63	/* Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
231
#define PRI_CAUSE_BEARERCAPABILITY_NOTIMPL		65
232 233
#define PRI_CAUSE_CHAN_NOT_IMPLEMENTED     		66	/* !Q.SIG */
#define PRI_CAUSE_FACILITY_NOT_IMPLEMENTED      69	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
234
#define PRI_CAUSE_INVALID_CALL_REFERENCE		81
235
#define PRI_CAUSE_IDENTIFIED_CHANNEL_NOTEXIST	82	/* Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
236
#define PRI_CAUSE_INCOMPATIBLE_DESTINATION		88
237
#define PRI_CAUSE_INVALID_MSG_UNSPECIFIED  		95	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
238 239
#define PRI_CAUSE_MANDATORY_IE_MISSING			96
#define PRI_CAUSE_MESSAGE_TYPE_NONEXIST			97
Mark Spencer's avatar
Mark Spencer committed
240
#define PRI_CAUSE_WRONG_MESSAGE					98
Mark Spencer's avatar
Mark Spencer committed
241 242 243 244
#define PRI_CAUSE_IE_NONEXIST					99
#define PRI_CAUSE_INVALID_IE_CONTENTS			100
#define PRI_CAUSE_WRONG_CALL_STATE				101
#define PRI_CAUSE_RECOVERY_ON_TIMER_EXPIRE		102
245
#define PRI_CAUSE_MANDATORY_IE_LENGTH_ERROR		103	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
246
#define PRI_CAUSE_PROTOCOL_ERROR				111
247
#define PRI_CAUSE_INTERWORKING					127	/* !Q.SIG */
Mark Spencer's avatar
Mark Spencer committed
248 249

/* Transmit capabilities */
Mark Spencer's avatar
Mark Spencer committed
250 251 252 253
#define PRI_TRANS_CAP_SPEECH					0x0
#define PRI_TRANS_CAP_DIGITAL					0x08
#define PRI_TRANS_CAP_RESTRICTED_DIGITAL		0x09
#define PRI_TRANS_CAP_3_1K_AUDIO				0x10
254 255
#define PRI_TRANS_CAP_7K_AUDIO					0x11	/* Depriciated ITU Q.931 (05/1998)*/
#define PRI_TRANS_CAP_DIGITAL_W_TONES			0x11
Mark Spencer's avatar
Mark Spencer committed
256
#define PRI_TRANS_CAP_VIDEO						0x18
Mark Spencer's avatar
Mark Spencer committed
257

Mark Spencer's avatar
Mark Spencer committed
258
#define PRI_LAYER_1_ITU_RATE_ADAPT	0x21
Mark Spencer's avatar
Mark Spencer committed
259 260 261
#define PRI_LAYER_1_ULAW			0x22
#define PRI_LAYER_1_ALAW			0x23
#define PRI_LAYER_1_G721			0x24
Mark Spencer's avatar
Mark Spencer committed
262
#define PRI_LAYER_1_G722_G725		0x25
263
#define PRI_LAYER_1_H223_H245		0x26
Mark Spencer's avatar
Mark Spencer committed
264 265 266 267
#define PRI_LAYER_1_NON_ITU_ADAPT	0x27
#define PRI_LAYER_1_V120_RATE_ADAPT	0x28
#define PRI_LAYER_1_X31_RATE_ADAPT	0x29

268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313

/* Intermediate rates for V.110 */
#define PRI_INT_RATE_8K			1
#define PRI_INT_RATE_16K		2
#define PRI_INT_RATE_32K		3


/* Rate adaption for bottom 5 bits of rateadaption */
#define PRI_RATE_USER_RATE_MASK		0x1F
#define PRI_RATE_ADAPT_UNSPEC		0x00
#define PRI_RATE_ADAPT_0K6		0x01
#define PRI_RATE_ADAPT_1K2		0x02
#define PRI_RATE_ADAPT_2K4		0x03
#define PRI_RATE_ADAPT_3K6		0x04
#define PRI_RATE_ADAPT_4K8		0x05
#define PRI_RATE_ADAPT_7K2		0x06
#define PRI_RATE_ADAPT_8K		0x07
#define PRI_RATE_ADAPT_9K6		0x08
#define PRI_RATE_ADAPT_14K4		0x09
#define PRI_RATE_ADAPT_16K		0x0A
#define PRI_RATE_ADAPT_19K2		0x0B
#define PRI_RATE_ADAPT_32K		0x0C
#define PRI_RATE_ADAPT_38K4		0x0D
#define PRI_RATE_ADAPT_48K		0x0E
#define PRI_RATE_ADAPT_56K		0x0F
#define PRI_RATE_ADAPT_57K6		0x12
#define PRI_RATE_ADAPT_28K8		0x13
#define PRI_RATE_ADAPT_24K		0x14
#define PRI_RATE_ADAPT_0K1345		0x15
#define PRI_RATE_ADAPT_0K1		0x16
#define PRI_RATE_ADAPT_0K075_1K2	0x17
#define PRI_RATE_ADAPT_1K2_0K075	0x18
#define PRI_RATE_ADAPT_0K05		0x19
#define PRI_RATE_ADAPT_0K075		0x1A
#define PRI_RATE_ADAPT_0K110		0x1B
#define PRI_RATE_ADAPT_0K150		0x1C
#define PRI_RATE_ADAPT_0K200		0x1D
#define PRI_RATE_ADAPT_0K300		0x1E
#define PRI_RATE_ADAPT_12K		0x1F

/* in-band negotiation flag for rateadaption bit 5 */
#define PRI_RATE_ADAPT_NEGOTIATION_POSS	0x20

/* async flag for rateadaption bit 6 */
#define PRI_RATE_ADAPT_ASYNC		0x40

314
/* Notifications */
315 316
#define PRI_NOTIFY_USER_SUSPENDED		0x00	/* User suspended (Q.931) (Call is placed on hold) */
#define PRI_NOTIFY_USER_RESUMED			0x01	/* User resumed (Q.931) (Call is taken off hold) */
317 318 319 320 321 322 323 324 325 326 327 328 329 330
#define PRI_NOTIFY_BEARER_CHANGE		0x02	/* Bearer service change (DSS1) */
#define PRI_NOTIFY_ASN1_COMPONENT		0x03	/* ASN.1 encoded component (DSS1) */
#define PRI_NOTIFY_COMPLETION_DELAY		0x04	/* Call completion delay */
#define PRI_NOTIFY_CONF_ESTABLISHED		0x42	/* Conference established */
#define PRI_NOTIFY_CONF_DISCONNECTED		0x43	/* Conference disconnected */
#define PRI_NOTIFY_CONF_PARTY_ADDED		0x44	/* Other party added */
#define PRI_NOTIFY_CONF_ISOLATED		0x45	/* Isolated */
#define PRI_NOTIFY_CONF_REATTACHED		0x46	/* Reattached */
#define PRI_NOTIFY_CONF_OTHER_ISOLATED		0x47	/* Other party isolated */
#define PRI_NOTIFY_CONF_OTHER_REATTACHED	0x48	/* Other party reattached */
#define PRI_NOTIFY_CONF_OTHER_SPLIT		0x49	/* Other party split */
#define PRI_NOTIFY_CONF_OTHER_DISCONNECTED	0x4a	/* Other party disconnected */
#define PRI_NOTIFY_CONF_FLOATING		0x4b	/* Conference floating */
#define PRI_NOTIFY_WAITING_CALL			0x60	/* Call is waiting call */
331 332 333
#define PRI_NOTIFY_DIVERSION_ACTIVATED		0x68	/* Diversion activated (DSS1) (cfu, cfb, cfnr) (EN 300 207-1 Section 7.2.1) */
#define PRI_NOTIFY_TRANSFER_ALERTING		0x69	/* Call transfer, alerting (EN 300 369-1 Section 7.2) */
#define PRI_NOTIFY_TRANSFER_ACTIVE		0x6a	/* Call transfer, active(answered) (EN 300 369-1 Section 7.2) */
334 335
#define PRI_NOTIFY_REMOTE_HOLD			0x79	/* Remote hold */
#define PRI_NOTIFY_REMOTE_RETRIEVAL		0x7a	/* Remote retrieval */
336
#define PRI_NOTIFY_CALL_DIVERTING		0x7b	/* Call is diverting (EN 300 207-1 Section 7.2.1) */
337

338 339
#define PRI_COPY_DIGITS_CALLED_NUMBER

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
/* Network Specific Facilities (AT&T) */
#define PRI_NSF_NONE                   -1
#define PRI_NSF_SID_PREFERRED          0xB1
#define PRI_NSF_ANI_PREFERRED          0xB2
#define PRI_NSF_SID_ONLY               0xB3
#define PRI_NSF_ANI_ONLY               0xB4
#define PRI_NSF_CALL_ASSOC_TSC         0xB9
#define PRI_NSF_NOTIF_CATSC_CLEARING   0xBA
#define PRI_NSF_OPERATOR               0xB5
#define PRI_NSF_PCCO                   0xB6
#define PRI_NSF_SDN                    0xE1
#define PRI_NSF_TOLL_FREE_MEGACOM      0xE2
#define PRI_NSF_MEGACOM                        0xE3
#define PRI_NSF_ACCUNET                        0xE6
#define PRI_NSF_LONG_DISTANCE_SERVICE  0xE7
#define PRI_NSF_INTERNATIONAL_TOLL_FREE        0xE8
#define PRI_NSF_ATT_MULTIQUEST         0xF0
#define PRI_NSF_CALL_REDIRECTION_SERVICE       0xF7

Mark Spencer's avatar
Mark Spencer committed
359 360
typedef struct q931_call q931_call;

361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
/* Name character set enumeration values */
#define PRI_CHAR_SET_UNKNOWN				0
#define PRI_CHAR_SET_ISO8859_1				1
#define PRI_CHAR_SET_WITHDRAWN				2
#define PRI_CHAR_SET_ISO8859_2				3
#define PRI_CHAR_SET_ISO8859_3				4
#define PRI_CHAR_SET_ISO8859_4				5
#define PRI_CHAR_SET_ISO8859_5				6
#define PRI_CHAR_SET_ISO8859_7				7
#define PRI_CHAR_SET_ISO10646_BMPSTRING		8
#define PRI_CHAR_SET_ISO10646_UTF_8STRING	9

/*! \brief Q.SIG name information. */
struct pri_party_name {
	/*! \brief TRUE if the name information is valid/present */
	int valid;
	/*!
	 * \brief Q.931 presentation-indicator encoded field
	 * \note Must tollerate the Q.931 screening-indicator field values being present.
	 */
	int presentation;
	/*!
	 * \brief Character set the name is using.
	 * \details
	 * unknown(0),
	 * iso8859-1(1),
	 * enum-value-withdrawn-by-ITU-T(2)
	 * iso8859-2(3),
	 * iso8859-3(4),
	 * iso8859-4(5),
	 * iso8859-5(6),
	 * iso8859-7(7),
	 * iso10646-BmpString(8),
	 * iso10646-utf-8String(9)
	 * \details
	 * Set to iso8859-1(1) if unsure what to use.
	 */
	int char_set;
	/*! \brief Name data with null terminator. */
	char str[64];
};

struct pri_party_number {
	/*! \brief TRUE if the number information is valid/present */
	int valid;
	/*! \brief Q.931 presentation-indicator and screening-indicator encoded fields */
	int presentation;
	/*! \brief Q.931 Type-Of-Number and numbering-plan encoded fields */
	int plan;
	/*! \brief Number data with null terminator. */
	char str[64];
};

/*!
 * \note This structure is a place holder for possible future subaddress support
 * to maintain ABI compatibility.
 */
struct pri_party_subaddress {
	/*! \brief TRUE if the subaddress information is valid/present */
	int valid;
	/*!
	 * \brief Subaddress type.
	 * \details
	 * nsap(0),
	 * user_specified(2)
	 */
	int type;
	/*!
	 * \brief TRUE if odd number of address signals
	 * \note The odd/even indicator is used when the type of subaddress is
	 * user_specified and the coding is BCD.
	 */
	int odd_even_indicator;
	/*! \brief Length of the subaddress data */
	int length;
	/*!
	 * \brief Subaddress data with null terminator.
	 * \note The null terminator is a convenience only since the data could be
	 * BCD/binary and thus have a null byte as part of the contents.
	 */
441
	unsigned char data[32];
442 443
};

444 445 446 447 448 449 450 451
/*! \brief Addressing information needed to identify an endpoint in a call. */
struct pri_party_address {
	/*! \brief Subscriber phone number */
	struct pri_party_number number;
	/*! \brief Subscriber subaddress */
	struct pri_party_subaddress subaddress;
};

452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
/*! \brief Information needed to identify an endpoint in a call. */
struct pri_party_id {
	/*! \brief Subscriber name */
	struct pri_party_name name;
	/*! \brief Subscriber phone number */
	struct pri_party_number number;
	/*! \brief Subscriber subaddress */
	struct pri_party_subaddress subaddress;
};

/*! \brief Connected Line/Party information */
struct pri_party_connected_line {
	/*! Connected party ID */
	struct pri_party_id id;
};

/*!
 * \brief Redirecting Line information.
 * \details
 * RDNIS (Redirecting Directory Number Information Service)
 * Where a call diversion or transfer was invoked.
 */
struct pri_party_redirecting {
	/*! Who is redirecting the call (Sent to the party the call is redirected toward) */
	struct pri_party_id from;
	/*! Call is redirecting to a new party (Sent to the caller) */
	struct pri_party_id to;
	/*! Originally called party (in cases of multiple redirects) */
	struct pri_party_id orig_called;
	/*! Number of times the call was redirected */
	int count;
	/*! Original reason for redirect (in cases of multiple redirects) */
	int orig_reason;
	/*! Redirection reason */
	int reason;
};

489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
/*!
 * \brief Information for rerouting/deflecting the call.
 */
struct pri_rerouting_data {
	/*!
	 * \brief Updated caller-id information.
	 * \note The information may have been altered by procedure in the private network.
	 */
	struct pri_party_id caller;
	/*!
	 * \note
	 * deflection.to is the new called number and must always be present.
	 */
	struct pri_party_redirecting deflection;
	/*!
	 * \brief Diverting user subscription option to specify if caller is notified.
	 * \details
	 * noNotification(0),
	 * notificationWithoutDivertedToNr(1),
	 * notificationWithDivertedToNr(2),
	 * notApplicable(3) (Status only.)
	 */
	int subscription_option;
	/*! Invocation ID to use when sending a reply to the call rerouting/deflection request. */
	int invoke_id;
};

516 517 518 519 520 521 522
/*
 * NOTE:
 * The code surrounded by STATUS_REQUEST_PLACE_HOLDER is not implemented.
 * The STATUS_REQUEST_PLACE_HOLDER code will be made unconditional if support
 * for the messages is ever needed (and gets written).
 */

523
/* Subcommands derived from supplementary services. */
524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541
#define PRI_SUBCMD_REDIRECTING				1	/*!< Redirecting information update */
#define PRI_SUBCMD_CONNECTED_LINE			2	/*!< Connected line information update */
#define PRI_SUBCMD_REROUTING				3	/*!< CallRerouting/CallDeflection received. */
#if defined(STATUS_REQUEST_PLACE_HOLDER)
#define PRI_SUBCMD_STATUS_REQ				4	/*!< Determine the status of the given party. */
#define PRI_SUBCMD_STATUS_REQ_RSP			5	/*!< Status request response */
#endif	/* defined(STATUS_REQUEST_PLACE_HOLDER) */
#define PRI_SUBCMD_CC_AVAILABLE				6	/*!< Indicate that CC is available */
#define PRI_SUBCMD_CC_REQ					7	/*!< CC activation request */
#define PRI_SUBCMD_CC_REQ_RSP				8	/*!< CC activation request response */
#define PRI_SUBCMD_CC_REMOTE_USER_FREE		9	/*!< Indicate that CC party B is available, party A is considered free. */
#define PRI_SUBCMD_CC_B_FREE				10	/*!< Indicate that CC party B is available, party A is considered busy. */
#define PRI_SUBCMD_CC_STATUS_REQ			11	/*!< Request/prod to receive updates of CC party A status */
#define PRI_SUBCMD_CC_STATUS_REQ_RSP		12	/*!< Requested update of CC party A status */
#define PRI_SUBCMD_CC_STATUS				13	/*!< Unsolicited update of CC party A status */
#define PRI_SUBCMD_CC_CALL					14	/*!< Indicate that this call is a CC callback */
#define PRI_SUBCMD_CC_CANCEL				15	/*!< Unsolicited indication that CC is canceled */
#define PRI_SUBCMD_CC_STOP_ALERTING			16	/*!< Indicate that someone else has responed to remote user free */
542
#define PRI_SUBCMD_TRANSFER_CALL			17	/*!< Request to transfer the specified calls together. */
543 544 545
#define PRI_SUBCMD_AOC_S					18	/*!< Advice Of Charge Start information (Rate list) */
#define PRI_SUBCMD_AOC_D					19	/*!< Advice Of Charge During information */
#define PRI_SUBCMD_AOC_E					20	/*!< Advice Of Charge End information */
546 547
#define PRI_SUBCMD_AOC_CHARGING_REQ			21	/*!< Advice Of Charge Request information */
#define PRI_SUBCMD_AOC_CHARGING_REQ_RSP		22	/*!< Advice Of Charge Request Response information */
548 549
#define PRI_SUBCMD_MCID_REQ					23	/*!< Malicious Call ID Request */
#define PRI_SUBCMD_MCID_RSP					24	/*!< Malicious Call ID Request response */
550
#define PRI_SUBCMD_DISPLAY_TEXT				25	/*!< Received display ie text */
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583

#if defined(STATUS_REQUEST_PLACE_HOLDER)
struct pri_subcmd_status_request {
	/*!
	 * \brief Invoke id in case there are multiple outstanding requests.
	 * \note Used to match any responses with the original invoke in case
	 * there are several requests active.
	 */
	int invoke_id;
	/*! \brief Party address requesting status about. */
	struct pri_party_address party;
};
#endif	/* defined(STATUS_REQUEST_PLACE_HOLDER) */

#if defined(STATUS_REQUEST_PLACE_HOLDER)
struct pri_subcmd_status_request_rsp {
	/*!
	 * \brief Request id in case there are multiple outstanding requests.
	 * \note Used to match any responses with the request in case there
	 * are several requests active.
	 */
	int request_id;
	/*!
	 * \brief Response status to the status request.
	 * \details
	 * free(0),
	 * busy(1),
	 * incompatible(2)
	 * timeout(3),
	 */
	int status;
};
#endif	/* defined(STATUS_REQUEST_PLACE_HOLDER) */
584

585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
struct pri_subcmd_cc_id {
	/*! \brief Call-Completion record id */
	long cc_id;
};

struct pri_subcmd_cc_request {
	/*! \brief Call-Completion record id */
	long cc_id;
	/*!
	 * \brief Mode of call-completion requested.
	 * \details
	 * ccbs(0),
	 * ccnr(1)
	 */
	int mode;
};

struct pri_subcmd_cc_request_rsp {
	/*! \brief Call-Completion record id */
	long cc_id;
	/*!
	 * \brief Status of the requested call-completion activation.
	 * \details
	 * success(0),
	 * timeout(1),
	 * error(2),
	 * reject(3)
	 */
	int status;
	/*!
	 * \brief Failure code that can be converted to a string to further
	 * explain the non-timeout failure.
	 * \note Valid when status is error or reject.
	 * \note Use pri_facility_error2str() to convert the error_code.
	 * \note Use pri_facility_reject2str() to convert the reject_code.
	 */
	int fail_code;
};

struct pri_subcmd_cc_status {
	/*! \brief Call-Completion record id */
	long cc_id;
	/*!
	 * \brief Party A status.
	 * \details
	 * free(0),
	 * busy(1)
	 */
	int status;
};

struct pri_subcmd_cc_cancel {
	/*! \brief Call-Completion record id */
	long cc_id;
	/*!
	 * \brief TRUE if the cc_id is for an agent.
	 * \note This is a convenience value so the upper layer can know which
	 * list it should search for the cc_id.
	 */
	int is_agent;
};
646

647 648 649 650 651 652 653 654 655 656 657 658 659
struct pri_subcmd_transfer {
	/*! \brief Opaque call pointer for transfer with other call. */
	q931_call *call_1;
	/*! \brief Opaque call pointer for transfer with other call. */
	q931_call *call_2;
	/*! TRUE if call_1 is on hold. */
	int is_call_1_held;
	/*! TRUE if call_2 is on hold. */
	int is_call_2_held;
	/*! Invocation ID to use when sending a reply to the transfer request. */
	int invoke_id;
};

660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880
/*! \brief What is being charged. */
enum PRI_AOC_CHARGED_ITEM {
	PRI_AOC_CHARGED_ITEM_NOT_AVAILABLE,
	PRI_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT,
	PRI_AOC_CHARGED_ITEM_BASIC_COMMUNICATION,
	PRI_AOC_CHARGED_ITEM_CALL_ATTEMPT,
	PRI_AOC_CHARGED_ITEM_CALL_SETUP,
	PRI_AOC_CHARGED_ITEM_USER_USER_INFO,
	PRI_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE,
};

/*! \brief Rate method being used. */
enum PRI_AOC_RATE_TYPE {
	PRI_AOC_RATE_TYPE_NOT_AVAILABLE,
	PRI_AOC_RATE_TYPE_FREE,
	PRI_AOC_RATE_TYPE_FREE_FROM_BEGINNING,
	PRI_AOC_RATE_TYPE_DURATION,
	PRI_AOC_RATE_TYPE_FLAT,
	PRI_AOC_RATE_TYPE_VOLUME,
	PRI_AOC_RATE_TYPE_SPECIAL_CODE,
};

enum PRI_AOC_TIME_SCALE {
	PRI_AOC_TIME_SCALE_HUNDREDTH_SECOND,
	PRI_AOC_TIME_SCALE_TENTH_SECOND,
	PRI_AOC_TIME_SCALE_SECOND,
	PRI_AOC_TIME_SCALE_TEN_SECOND,
	PRI_AOC_TIME_SCALE_MINUTE,
	PRI_AOC_TIME_SCALE_HOUR,
	PRI_AOC_TIME_SCALE_DAY,
};

struct pri_aoc_time {
	/*! LengthOfTimeUnit (Not valid if length is zero.) */
	long length;
	/*! \see enum PRI_AOC_TIME_SCALE */
	int scale;
};

enum PRI_AOC_MULTIPLIER {
	PRI_AOC_MULTIPLIER_THOUSANDTH,
	PRI_AOC_MULTIPLIER_HUNDREDTH,
	PRI_AOC_MULTIPLIER_TENTH,
	PRI_AOC_MULTIPLIER_ONE,
	PRI_AOC_MULTIPLIER_TEN,
	PRI_AOC_MULTIPLIER_HUNDRED,
	PRI_AOC_MULTIPLIER_THOUSAND,
};

struct pri_aoc_amount {
	long cost;
	/*! \see enum PRI_AOC_MULTIPLIER */
	int multiplier;
};

struct pri_aoc_duration {
	struct pri_aoc_amount amount;
	struct pri_aoc_time time;
	/*! Not present if the granularity time is zero. */
	struct pri_aoc_time granularity;
	/*!
	 * \brief Charging interval type
	 * \details
	 * continuousCharging(0),
	 * stepFunction(1)
	 */
	int charging_type;
	/*! Name of currency involved.  Null terminated. */
	char currency[10 + 1];
};

struct pri_aoc_flat {
	struct pri_aoc_amount amount;
	/*! Name of currency involved.  Null terminated. */
	char currency[10 + 1];
};

enum PRI_AOC_VOLUME_UNIT {
	PRI_AOC_VOLUME_UNIT_OCTET,
	PRI_AOC_VOLUME_UNIT_SEGMENT,
	PRI_AOC_VOLUME_UNIT_MESSAGE,
};

struct pri_aoc_volume {
	struct pri_aoc_amount amount;
	/*! \see enum PRI_AOC_VOLUME_UNIT */
	int unit;
	/*! Name of currency involved.  Null terminated. */
	char currency[10 + 1];
};

struct pri_aoc_s_element {
	/*!
	 * \brief What is being charged.
	 * \see enum PRI_AOC_CHARGED_ITEM
	 */
	int chargeable;
	/*!
	 * \brief Rate method being used.
	 * \see enum PRI_AOC_RATE_TYPE
	 */
	int rate_type;
	/*! \brief Charge rate being applied. */
	union {
		struct pri_aoc_duration duration;
		struct pri_aoc_flat flat;
		struct pri_aoc_volume volume;
		int special;
	} rate;
};

struct pri_subcmd_aoc_s {
	/*!
	 * \brief Number of items in the rate list.
	 * \note If the list is empty then the charging information is not available.
	 */
	int num_items;
	struct pri_aoc_s_element item[10];
};

enum PRI_AOC_DE_CHARGE {
	PRI_AOC_DE_CHARGE_NOT_AVAILABLE,
	PRI_AOC_DE_CHARGE_FREE,
	PRI_AOC_DE_CHARGE_CURRENCY,
	PRI_AOC_DE_CHARGE_UNITS,
};

struct pri_aoc_recorded_currency {
	struct pri_aoc_amount amount;
	/*! Name of currency involved.  Null terminated. */
	char currency[10 + 1];
};

struct pri_aoc_units_element {
	/*! Number of units recorded. -1 if not available. */
	long number;
	/*! Type of unit recorded. -1 if not available. */
	int type;
};

struct pri_aoc_recorded_units {
	int num_items;
	struct pri_aoc_units_element item[32];
};

enum PRI_AOC_D_BILLING_ID {
	PRI_AOC_D_BILLING_ID_NOT_AVAILABLE,
	PRI_AOC_D_BILLING_ID_NORMAL,
	PRI_AOC_D_BILLING_ID_REVERSE,
	PRI_AOC_D_BILLING_ID_CREDIT_CARD,
};
struct pri_subcmd_aoc_d {
	/*!
	 * \brief What is being charged.
	 * \see enum PRI_AOC_DE_CHARGE
	 */
	int charge;
	/*!
	 * \brief Billing accumulation
	 * \details
	 * subTotal(0),
	 * total(1)
	 */
	int billing_accumulation;
	/*! \see enum PRI_AOC_D_BILLING_ID */
	int billing_id;
	union {
		/*! Recorded currency */
		struct pri_aoc_recorded_currency money;
		/*! Recorded units list */
		struct pri_aoc_recorded_units unit;
	} recorded;
};

enum PRI_AOC_E_BILLING_ID {
	PRI_AOC_E_BILLING_ID_NOT_AVAILABLE,
	PRI_AOC_E_BILLING_ID_NORMAL,
	PRI_AOC_E_BILLING_ID_REVERSE,
	PRI_AOC_E_BILLING_ID_CREDIT_CARD,
	PRI_AOC_E_BILLING_ID_CALL_FORWARDING_UNCONDITIONAL,
	PRI_AOC_E_BILLING_ID_CALL_FORWARDING_BUSY,
	PRI_AOC_E_BILLING_ID_CALL_FORWARDING_NO_REPLY,
	PRI_AOC_E_BILLING_ID_CALL_DEFLECTION,
	PRI_AOC_E_BILLING_ID_CALL_TRANSFER,
};

enum PRI_AOC_E_CHARGING_ASSOCIATION {
	PRI_AOC_E_CHARGING_ASSOCIATION_NOT_AVAILABLE,
	PRI_AOC_E_CHARGING_ASSOCIATION_NUMBER,
	PRI_AOC_E_CHARGING_ASSOCIATION_ID,
};

struct pri_aoc_e_charging_association {
	union {
		/*! Charged number */
		struct pri_party_number number;
		/*! Charge identifier */
		int id;
	} charge;
	/*! \see enum PRI_AOC_E_CHARGING_ASSOCIATION */
	int charging_type;
};

struct pri_subcmd_aoc_e {
	/*!
	 * \brief What is being charged.
	 * \see enum PRI_AOC_DE_CHARGE
	 */
	int charge;
	/*! \see enum PRI_AOC_E_BILLING_ID */
	int billing_id;
	union {
		/*! Recorded currency */
		struct pri_aoc_recorded_currency money;
		/*! Recorded units list */
		struct pri_aoc_recorded_units unit;
	} recorded;
	/*! Charging association. */
	struct pri_aoc_e_charging_association associated;
};

881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
enum PRI_AOC_REQ_RSP {
	/* Error Results */
	PRI_AOC_REQ_RSP_ERROR_NOT_IMPLEMENTED,
	PRI_AOC_REQ_RSP_ERROR_NOT_AVAILABLE,
	PRI_AOC_REQ_RSP_ERROR_TIMEOUT,
	PRI_AOC_REQ_RSP_ERROR_REJECT,
	/* generic error result all other errors are lumped into */
	PRI_AOC_REQ_RSP_ERROR,

	/* AOC Results */
	PRI_AOC_REQ_RSP_CHARGING_INFO_FOLLOWS,
	PRI_AOC_REQ_RSP_CURRENCY_INFO_LIST,
	PRI_AOC_REQ_RSP_SPECIAL_ARR,
};

enum PRI_AOC_REQUEST {
	PRI_AOC_REQUEST_S = (1 << 0),
	PRI_AOC_REQUEST_D = (1 << 1),
	PRI_AOC_REQUEST_E = (1 << 2),
};

struct pri_subcmd_aoc_request_response {
	/*!
	 * \brief aoc_s data from response
	 */
	struct pri_subcmd_aoc_s aoc_s;

	/*!
	 * \brief if the aoc_s msg is present, this will be set
	 */
	int valid_aoc_s;

	/*!
	 * \brief What type of aoc was requested.
	 * \see enum PRI_AOC_REQUEST
	 */
	int charging_request;

	/*!
	 * \brief response to the charging_request
	 * \see enum PRI_AOC_REQ_RSP
	 */
	int charging_response;
};

struct pri_subcmd_aoc_request {
	/*!
	 * \brief What types of aoc are being requested.
	 * \see enum PRI_AOC_REQUEST
	 */
	int charging_request;

	/*!
	 * \brief Value given by the initiating request.
	 */
	 int invoke_id;
};

939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
struct pri_subcmd_mcid_req {
	/*!
	 * \brief Information libpri knows about the malicious caller.
	 * \note For the convenience of the upper layer.  This information
	 * may be incomplete if the upper layer redacted some caller
	 * information because it was restricted.
	 */
	struct pri_party_id originator;
	/*! \brief Information libpri knows about the callee. */
	struct pri_party_id answerer;
};

struct pri_subcmd_mcid_rsp {
	/*!
	 * \brief MCID request response status.
	 * \details
	 * success(0),
	 * timeout(1),
	 * error(2),
	 * reject(3)
	 */
	int status;
	/*!
	 * \brief Failure code that can be converted to a string to further
	 * explain the non-timeout failure.
	 * \note Valid when status is error or reject.
	 * \note Use pri_facility_error2str() to convert the error_code.
	 * \note Use pri_facility_reject2str() to convert the reject_code.
	 */
	int fail_code;
};

971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999
struct pri_subcmd_display_txt {
	/*!
	 * \brief Character set the text is using.
	 * \details
	 * unknown(0),
	 * iso8859-1(1),
	 * enum-value-withdrawn-by-ITU-T(2)
	 * iso8859-2(3),
	 * iso8859-3(4),
	 * iso8859-4(5),
	 * iso8859-5(6),
	 * iso8859-7(7),
	 * iso10646-BmpString(8),
	 * iso10646-utf-8String(9)
	 */
	int char_set;
	/*!
	 * \brief Number of octets in the display message.
	 * \note Not including any added null terminator.
	 */
	int length;
	/*!
	 * \brief Display text data.
	 * \note Null terminated on receive.
	 * \note Does not need to be null terminated on send.
	 */
	char text[128];
};

1000 1001 1002 1003 1004 1005 1006 1007
struct pri_subcommand {
	/*! PRI_SUBCMD_xxx defined values */
	int cmd;
	union {
		/*! Reserve room for possible expansion to maintain ABI compatibility. */
		char reserve_space[512];
		struct pri_party_connected_line connected_line;
		struct pri_party_redirecting redirecting;
1008
		struct pri_rerouting_data rerouting;
1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
#if defined(STATUS_REQUEST_PLACE_HOLDER)
		struct pri_subcmd_status_request status_request;
		struct pri_subcmd_status_request_rsp status_request_rsp;
#endif	/* defined(STATUS_REQUEST_PLACE_HOLDER) */
		struct pri_subcmd_cc_id cc_available;
		struct pri_subcmd_cc_request cc_request;
		struct pri_subcmd_cc_request_rsp cc_request_rsp;
		struct pri_subcmd_cc_id cc_remote_user_free;
		struct pri_subcmd_cc_id cc_b_free;
		struct pri_subcmd_cc_id cc_stop_alerting;
		struct pri_subcmd_cc_id cc_status_req;
		struct pri_subcmd_cc_status cc_status_req_rsp;
		struct pri_subcmd_cc_status cc_status;
		struct pri_subcmd_cc_id cc_call;
		struct pri_subcmd_cc_cancel cc_cancel;
1024
		struct pri_subcmd_transfer transfer;
1025 1026
		struct pri_subcmd_aoc_request aoc_request;
		struct pri_subcmd_aoc_request_response aoc_request_response;
1027 1028 1029
		struct pri_subcmd_aoc_s aoc_s;
		struct pri_subcmd_aoc_d aoc_d;
		struct pri_subcmd_aoc_e aoc_e;
1030 1031
		struct pri_subcmd_mcid_req mcid_req;
		struct pri_subcmd_mcid_rsp mcid_rsp;
1032
		struct pri_subcmd_display_txt display;
1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044
	} u;
};

/* Max number of subcommands per event message */
#define PRI_MAX_SUBCOMMANDS	8

struct pri_subcommands {
	int counter_subcmd;
	struct pri_subcommand subcmd[PRI_MAX_SUBCOMMANDS];
};


1045 1046 1047 1048
/*
 * Event channel parameter encoding:
 * 3322 2222 2222 1111 1111 1100 0000 0000
 * 1098 7654 3210 9876 5432 1098 7654 3210
1049
 * xxxx xxxx xxxx xEDC BBBBBBBBB AAAAAAAAA
1050 1051 1052 1053 1054 1055
 *
 * Bit field
 * A - B channel
 * B - Span (DS1) (0 - 127)
 * C - DS1 Explicit bit
 * D - D channel (cis_call) bit (status only)
1056
 * E - Call is held bit (status only)
1057 1058 1059 1060 1061 1062 1063 1064
 *
 * B channel values:
 * 0     - No channel (ISDN uses for call waiting feature)
 * 1-127 - B channel #
 * 0xFF  - Any channel (Also if whole channel value is -1 in event)
 */


Mark Spencer's avatar
Mark Spencer committed
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
typedef struct pri_event_generic {
	/* Events with no additional information fall in this category */
	int e;
} pri_event_generic;

typedef struct pri_event_error {
	int e;
	char err[256];
} pri_event_error;

typedef struct pri_event_restart {
	int e;
	int channel;
} pri_event_restart;

typedef struct pri_event_ringing {
	int e;
	int channel;
	int cref;
1084
	int progress;
1085
	int progressmask;
Mark Spencer's avatar
Mark Spencer committed
1086
	q931_call *call;
1087
	char useruserinfo[260];		/* User->User info */
1088
	struct pri_subcommands *subcmds;
Mark Spencer's avatar
Mark Spencer committed
1089 1090 1091 1092 1093 1094
} pri_event_ringing;

typedef struct pri_event_answer {
	int e;
	int channel;
	int cref;
1095
	int progress;
1096
	int progressmask;
Mark Spencer's avatar
Mark Spencer committed
1097
	q931_call *call;
1098
	char useruserinfo[260];		/* User->User info */
1099
	struct pri_subcommands *subcmds;
Mark Spencer's avatar
Mark Spencer committed
1100 1101
} pri_event_answer;

1102
/*! Deprecated replaced by struct pri_event_facility. */
1103 1104 1105 1106 1107 1108 1109
typedef struct pri_event_facname {
	int e;
	char callingname[256];
	char callingnum[256];
	int channel;
	int cref;
	q931_call *call;
1110 1111
	int callingpres;			/* Presentation of Calling CallerID */
	int callingplan;			/* Dialing plan of Calling entity */
1112 1113
} pri_event_facname;

1114 1115 1116 1117 1118 1119
struct pri_event_facility {
	int e;
	char callingname[256];		/*!< Deprecated, preserved for struct pri_event_facname compatibility */
	char callingnum[256];		/*!< Deprecated, preserved for struct pri_event_facname compatibility */
	int channel;
	int cref;
1120 1121 1122 1123 1124
	/*!
	 * \brief Master call or normal call.
	 * \note Call pointer known about by upper layer.
	 * \note NULL if dummy call reference.
	 */
1125 1126 1127 1128
	q931_call *call;
	int callingpres;			/*!< Presentation of Calling CallerID (Deprecated, preserved for struct pri_event_facname compatibility) */
	int callingplan;			/*!< Dialing plan of Calling entity (Deprecated, preserved for struct pri_event_facname compatibility) */
	struct pri_subcommands *subcmds;
1129
	q931_call *subcall;			/*!< Subcall to send any reply toward. */
1130 1131
};

1132
#define PRI_CALLINGPLANANI
1133
#define PRI_CALLINGPLANRDNIS
Mark Spencer's avatar
Mark Spencer committed
1134 1135 1136 1137
typedef struct pri_event_ring {
	int e;
	int channel;				/* Channel requested */
	int callingpres;			/* Presentation of Calling CallerID */
1138
	int callingplanani;			/* Dialing plan of Calling entity ANI */
Mark Spencer's avatar
Mark Spencer committed
1139
	int callingplan;			/* Dialing plan of Calling entity */
1140
	char callingani[256];		/* Calling ANI */
Mark Spencer's avatar
Mark Spencer committed
1141
	char callingnum[256];		/* Calling number */
1142
	char callingname[256];		/* Calling name (if provided) */
Mark Spencer's avatar
Mark Spencer committed
1143
	int calledplan;				/* Dialing plan of Called number */
1144
	int ani2;                   /* ANI II */
Mark Spencer's avatar
Mark Spencer committed
1145
	char callednum[256];		/* Called number */
1146 1147 1148
	char redirectingnum[256];	/* Redirecting number */
	char redirectingname[256];	/* Redirecting name */
	int redirectingreason;		/* Reason for redirect */
1149
	int callingplanrdnis;			/* Dialing plan of Redirecting Number */
1150
	char useruserinfo[260];		/* User->User info */
Mark Spencer's avatar
Mark Spencer committed
1151 1152 1153
	int flexible;				/* Are we flexible with our channel selection? */
	int cref;					/* Call Reference Number */
	int ctype;					/* Call type (see PRI_TRANS_CAP_* */
1154
	int layer1;					/* User layer 1 */
Mark Spencer's avatar
Mark Spencer committed
1155
	int complete;				/* Have we seen "Complete" i.e. no more number? */
Mark Spencer's avatar
Mark Spencer committed
1156
	q931_call *call;			/* Opaque call pointer */
1157
	char callingsubaddr[256];	/* Calling parties subaddress, backwards compatibility */
1158 1159
	int progress;
	int progressmask;
1160 1161
	char origcalledname[256];
	char origcallednum[256];
1162
	int callingplanorigcalled;		/* Dialing plan of Originally Called Number */
1163
	int origredirectingreason;
1164
	int reversecharge;
1165
	struct pri_subcommands *subcmds;
1166 1167
	struct pri_party_id calling;			/* Calling Party's info, initially subaddress' */
	struct pri_party_subaddress called_subaddress;	/* Called party's subaddress */
1168
	char keypad_digits[64];		/* Keypad digits in the SETUP message. */
Mark Spencer's avatar
Mark Spencer committed
1169 1170 1171 1172 1173 1174 1175
} pri_event_ring;

typedef struct pri_event_hangup {
	int e;
	int channel;				/* Channel requested */
	int cause;
	int cref;
1176
	q931_call *call;			/* Opaque call pointer of call hanging up. */
1177
	long aoc_units;				/* Advice of Charge number of charged units */
1178
	char useruserinfo[260];		/* User->User info */
1179
	struct pri_subcommands *subcmds;
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191
	/*!
	 * \brief Opaque held call pointer for possible transfer to active call.
	 * \note The call_held and call_active pointers must not be NULL if
	 * transfer held call on disconnect is available.
	 */
	q931_call *call_held;
	/*!
	 * \brief Opaque active call pointer for possible transfer with held call.
	 * \note The call_held and call_active pointers must not be NULL if
	 * transfer held call on disconnect is available.
	 */
	q931_call *call_active;
1192
} pri_event_hangup;
Mark Spencer's avatar
Mark Spencer committed
1193

Mark Spencer's avatar
Mark Spencer committed
1194 1195 1196 1197 1198
typedef struct pri_event_restart_ack {
	int e;
	int channel;
} pri_event_restart_ack;

Matthew Fredrickson's avatar
Matthew Fredrickson committed
1199
#define PRI_PROGRESS_CAUSE
1200 1201 1202
typedef struct pri_event_proceeding {
	int e;
	int channel;
1203 1204
	int cref;
	int progress;
1205
	int progressmask;
1206
	int cause;
1207
	q931_call *call;
1208
	struct pri_subcommands *subcmds;
1209
} pri_event_proceeding;
1210

1211 1212 1213
typedef struct pri_event_setup_ack {
	int e;
	int channel;
1214
	q931_call *call;
1215
	struct pri_subcommands *subcmds;
1216
	int progressmask;
1217
} pri_event_setup_ack;
1218

1219 1220 1221 1222
typedef struct pri_event_notify {
	int e;
	int channel;
	int info;
1223
	struct pri_subcommands *subcmds;
1224
	q931_call *call;
1225 1226
} pri_event_notify;

1227 1228 1229 1230 1231
typedef struct pri_event_keypad_digit {
	int e;
	int channel;
	q931_call *call;
	char digits[64];
1232
	struct pri_subcommands *subcmds;
1233 1234
} pri_event_keypad_digit;

1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246
typedef struct pri_event_service {
	int e;
	int channel;
	int changestatus;
} pri_event_service;

typedef struct pri_event_service_ack {
	int e;
	int channel;
	int changestatus;
} pri_event_service_ack;

1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
struct pri_event_hold {
	int e;
	int channel;
	q931_call *call;
	struct pri_subcommands *subcmds;
};

struct pri_event_hold_ack {
	int e;
	int channel;
	q931_call *call;
	struct pri_subcommands *subcmds;
};

struct pri_event_hold_rej {
	int e;
	int channel;
	q931_call *call;
	int cause;
	struct pri_subcommands *subcmds;
};

struct pri_event_retrieve {
	int e;
	int channel;
	q931_call *call;
	int flexible;				/* Are we flexible with our channel selection? */
	struct pri_subcommands *subcmds;
};

struct pri_event_retrieve_ack {
	int e;
	int channel;
	q931_call *call;
	struct pri_subcommands *subcmds;
};

struct pri_event_retrieve_rej {
	int e;
	int channel;
	q931_call *call;
	int cause;
	struct pri_subcommands *subcmds;
};

1292 1293 1294 1295 1296 1297 1298
struct pri_event_connect_ack {
	int e;
	int channel;
	q931_call *call;
	struct pri_subcommands *subcmds;
};

Mark Spencer's avatar
Mark Spencer committed
1299 1300 1301 1302 1303
typedef union {
	int e;
	pri_event_generic gen;		/* Generic view */
	pri_event_restart restart;	/* Restart view */
	pri_event_error	  err;		/* Error view */
1304
	pri_event_facname facname;	/* Caller*ID Name on Facility (Deprecated, use pri_event.facility) */
Mark Spencer's avatar
Mark Spencer committed
1305 1306 1307
	pri_event_ring	  ring;		/* Ring */
	pri_event_hangup  hangup;	/* Hang up */
	pri_event_ringing ringing;	/* Ringing */
1308
	pri_event_answer  answer;	/* Answer */
Mark Spencer's avatar
Mark Spencer committed
1309
	pri_event_restart_ack restartack;	/* Restart Acknowledge */
1310
	pri_event_proceeding  proceeding;	/* Call proceeding & Progress */
1311
	pri_event_setup_ack   setup_ack;	/* SETUP_ACKNOWLEDGE structure */
1312
	pri_event_notify notify;		/* Notification */
1313
	pri_event_keypad_digit digit;			/* Digits that come during a call */
1314 1315
	pri_event_service service;				/* service message */
	pri_event_service_ack service_ack;		/* service acknowledgement message */
1316
	struct pri_event_facility facility;
1317 1318 1319 1320 1321 1322
	struct pri_event_hold hold;
	struct pri_event_hold_ack hold_ack;
	struct pri_event_hold_rej hold_rej;
	struct pri_event_retrieve retrieve;
	struct pri_event_retrieve_ack retrieve_ack;
	struct pri_event_retrieve_rej retrieve_rej;
1323
	struct pri_event_connect_ack connect_ack;
Mark Spencer's avatar
Mark Spencer committed
1324 1325 1326
} pri_event;

struct pri;
1327
struct pri_sr;
Mark Spencer's avatar
Mark Spencer committed
1328

1329 1330 1331
#define PRI_IO_FUNCS
/* Type declaration for callbacks to read or write a HDLC frame as below */
typedef int (*pri_io_cb)(struct pri *pri, void *buf, int buflen);
Mark Spencer's avatar
Mark Spencer committed
1332 1333 1334

/* Create a D-channel on a given file descriptor.  The file descriptor must be a
   channel operating in HDLC mode with FCS computed by the fd's driver.  Also it
1335
   must be NON-BLOCKING! Frames received on the fd should include FCS.  Nodetype
Mark Spencer's avatar
Mark Spencer committed
1336
   must be one of PRI_NETWORK or PRI_CPE.  switchtype should be PRI_SWITCH_* */
1337 1338
struct pri *pri_new(int fd, int nodetype, int switchtype);
struct pri *pri_new_bri(int fd, int ptpmode, int nodetype, int switchtype);
Mark Spencer's avatar
Mark Spencer committed
1339

1340
/* Create D-channel just as above with user defined I/O callbacks and data */
1341
struct pri *pri_new_cb(int fd, int nodetype, int switchtype, pri_io_cb io_read, pri_io_cb io_write, void *userdata);
1342

1343 1344 1345
/* Create BRI D-channel just as above with user defined I/O callbacks and data */
struct pri *pri_new_bri_cb(int fd, int ptpmode, int nodetype, int switchtype, pri_io_cb io_read, pri_io_cb io_write, void *userdata);

1346
/* Retrieve the user data associated with the D channel */
1347
void *pri_get_userdata(struct pri *pri);
1348 1349

/* Set the user data associated with the D channel */
1350
void pri_set_userdata(struct pri *pri, void *userdata);
1351

1352
/* Set Network Specific Facility for PRI */
1353
void pri_set_nsf(struct pri *pri, int nsf);
1354

Mark Spencer's avatar
Mark Spencer committed
1355
/* Set debug parameters on PRI -- see above debug definitions */
1356
void pri_set_debug(struct pri *pri, int debug);
Mark Spencer's avatar
Mark Spencer committed
1357

1358
/* Get debug parameters on PRI -- see above debug definitions */
1359
int pri_get_debug(struct pri *pri);
1360

1361 1362
#define PRI_FACILITY_ENABLE
/* Enable transmission support of Facility IEs on the pri */
1363
void pri_facility_enable(struct pri *pri);
1364

Mark Spencer's avatar
Mark Spencer committed
1365 1366 1367
/* Run PRI on the given D-channel, taking care of any events that
   need to be handled.  If block is set, it will block until an event
   occurs which needs to be handled */
1368
pri_event *pri_dchannel_run(struct pri *pri, int block);
Mark Spencer's avatar
Mark Spencer committed
1369 1370 1371 1372 1373

/* Check for an outstanding event on the PRI */
pri_event *pri_check_event(struct pri *pri);

/* Give a name to a given event ID */
1374
char *pri_event2str(int id);
Mark Spencer's avatar
Mark Spencer committed
1375

1376
/* Give a name to a node type */
1377
char *pri_node2str(int id);
Mark Spencer's avatar
Mark Spencer committed
1378 1379

/* Give a name to a switch type */
1380
char *pri_switch2str(int id);
Mark Spencer's avatar
Mark Spencer committed
1381 1382

/* Print an event */
1383
void pri_dump_event(struct pri *pri, pri_event *e);
Mark Spencer's avatar
Mark Spencer committed
1384 1385

/* Turn presentation into a string */
1386
char *pri_pres2str(int pres);
Mark Spencer's avatar
Mark Spencer committed
1387 1388

/* Turn numbering plan into a string */
1389
char *pri_plan2str(int plan);
Mark Spencer's avatar
Mark Spencer committed
1390 1391

/* Turn cause into a string */
1392
char *pri_cause2str(int cause);
Mark Spencer's avatar
Mark Spencer committed
1393

1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411
/*!
 * \brief Convert the given facility error code to a descriptive string.
 *
 * \param facility_error_code Error code to convert to a string.
 *
 * \return Descriptive error string.
 */
const char *pri_facility_error2str(int facility_error_code);

/*!
 * \brief Convert the given facility reject code to a descriptive string.
 *
 * \param facility_reject_code Error code to convert to a string.
 *
 * \return Descriptive reject string.
 */
const char *pri_facility_reject2str(int facility_reject_code);

1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
/*!
 * \brief Send the ALERTING message.
 *
 * \param pri D channel controller.
 * \param call Q.931 call leg.
 * \param channel Encoded channel id to use.  If zero do not change channel id.
 * \param info Nonzero to include a progress ie indicating inband audio available (ie ringback).
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
1423
int pri_acknowledge(struct pri *pri, q931_call *call, int channel, int info);
Mark Spencer's avatar
Mark Spencer committed
1424

1425
/* Send a digit in overlap mode */
1426
int pri_information(struct pri *pri, q931_call *call, char digit);
1427

1428
#define PRI_KEYPAD_FACILITY_TX
1429
/* Send a keypad facility string of digits */
1430
int pri_keypad_facility(struct pri *pri, q931_call *call, const char *digits);
1431

1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
/*!
 * \brief Send the SETUP_ACKNOWLEDGE message.
 *
 * \param pri D channel controller.
 * \param call Q.931 call leg.
 * \param channel Encoded channel id to use.  If zero do not change channel id.
 * \param nonisdn Nonzero to include a progress ie indicating non-end-to-end-ISDN.
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
1443
int pri_need_more_info(struct pri *pri, q931_call *call, int channel, int nonisdn);
1444

1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
/*!
 * \brief Send the SETUP_ACKNOWLEDGE message.
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param channel Encoded channel id to use.  If zero do not change channel id.
 * \param nonisdn Nonzero to include a progress ie indicating non-end-to-end-ISDN.
 * \param inband Nonzero to include a progress ie indicating inband audio available (ie dialtone).
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
int pri_setup_ack(struct pri *ctrl, q931_call *call, int channel, int nonisdn, int inband);

/*!
 * \brief Send the CONNECT message.
 *
 * \param pri D channel controller.
 * \param call Q.931 call leg.
 * \param channel Encoded channel id to use.  If zero do not change channel id.
 * \param nonisdn Nonzero to include a progress ie indicating non-end-to-end-ISDN.
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
1470
int pri_answer(struct pri *pri, q931_call *call, int channel, int nonisdn);
Mark Spencer's avatar
Mark Spencer committed
1471

1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494
/*!
 * \brief Send the manual CONNECT_ACKNOWLEDGE message.
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param channel Selected channel to assign to the call waiting call.
 * Zero if do not include the channel id ie in the CONNECT_ACKNOWLEDGE message.
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
int pri_connect_ack(struct pri *ctrl, q931_call *call, int channel);

/*!
 * \brief Set the manual CONNECT_ACKNOWLEDGE message enable flag.
 *
 * \param ctrl D channel controller.
 * \param enable TRUE to enable manual CONNECT_ACKNOWLEDGE message feature.
 *
 * \return Nothing
 */
void pri_connect_ack_enable(struct pri *ctrl, int enable);

1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506
/*!
 * \brief Give connected line information to a call
 * \note Could be used instead of pri_sr_set_caller_party() before calling pri_setup().
 */
int pri_connected_line_update(struct pri *pri, q931_call *call, const struct pri_party_connected_line *connected);

/*!
 * \brief Give redirection information to a call
 * \note Could be used instead of pri_sr_set_redirecting_parties() before calling pri_setup().
 */
int pri_redirecting_update(struct pri *pri, q931_call *call, const struct pri_party_redirecting *redirecting);

1507
/* Set CRV reference for GR-303 calls */
Mark Spencer's avatar
Mark Spencer committed
1508

1509

1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
#undef pri_release
#undef pri_disconnect

/* backwards compatibility for those who don't use asterisk with libpri */
#define pri_release(a,b,c) \
	pri_hangup(a,b,c)

#define pri_disconnect(a,b,c) \
	pri_hangup(a,b,c)

1520
/* Hangup a call */
1521
#define PRI_HANGUP
1522
int pri_hangup(struct pri *pri, q931_call *call, int cause);
Mark Spencer's avatar
Mark Spencer committed
1523

1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534
/*!
 * \brief Set the call hangup fix enable flag.
 *
 * \param ctrl D channel controller.
 * \param enable TRUE to follow Q.931 Section 5.3.2 call hangup better.
 * FALSE for legacy behaviour. (Default FALSE if not called.)
 *
 * \return Nothing
 */
void pri_hangup_fix_enable(struct pri *ctrl, int enable);

Martin Pycko's avatar
Martin Pycko committed
1535
#define PRI_DESTROYCALL
1536
void pri_destroycall(struct pri *pri, q931_call *call);
Martin Pycko's avatar
Martin Pycko committed
1537

1538
#define PRI_RESTART
1539
int pri_restart(struct pri *pri);
1540

1541
int pri_reset(struct pri *pri, int channel);
Mark Spencer's avatar
Mark Spencer committed
1542

1543 1544 1545
/* handle b-channel maintenance messages */
extern int pri_maintenance_service(struct pri *pri, int span, int channel, int changestatus);

Mark Spencer's avatar
Mark Spencer committed
1546
/* Create a new call */
1547
q931_call *pri_new_call(struct pri *pri);
Mark Spencer's avatar
Mark Spencer committed
1548

1549 1550 1551 1552 1553 1554 1555 1556
/*!
 * \brief Deterimine if the given call control pointer is a dummy call.
 *
 * \retval TRUE if given call is a dummy call.
 * \retval FALSE otherwise.
 */
int pri_is_dummy_call(q931_call *call);

1557
/* Retrieve CRV reference for GR-303 calls.  Returns >0 on success. */
1558
int pri_get_crv(struct pri *pri, q931_call *call, int *callmode);
1559 1560

/* Retrieve CRV reference for GR-303 calls.  CRV must be >0, call mode should be 0 */
1561
int pri_set_crv(struct pri *pri, q931_call *call, int crv, int callmode);
1562

Mark Spencer's avatar
Mark Spencer committed
1563
/* How long until you need to poll for a new event */
1564
struct timeval *pri_schedule_next(struct pri *pri);
Mark Spencer's avatar
Mark Spencer committed
1565 1566

/* Run any pending schedule events */
Mark Spencer's avatar
Mark Spencer committed
1567
extern pri_event *pri_schedule_run(struct pri *pri);
1568
extern pri_event *pri_schedule_run_tv(struct pri *pri, const struct timeval *now);
Mark Spencer's avatar
Mark Spencer committed
1569

1570
int pri_call(struct pri *pri, q931_call *c, int transmode, int channel,
1571 1572
    int exclusive, int nonisdn, char *caller, int callerplan, char *callername, int callerpres,
    char *called, int calledplan, int ulayer1);
1573

1574 1575
struct pri_sr *pri_sr_new(void);
void pri_sr_free(struct pri_sr *sr);
1576

1577 1578 1579
int pri_sr_set_channel(struct pri_sr *sr, int channel, int exclusive, int nonisdn);
int pri_sr_set_bearer(struct pri_sr *sr, int transmode, int userl1);
int pri_sr_set_called(struct pri_sr *sr, char *called, int calledplan, int complete);
1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590

/*!
 * \brief Set the caller party ID information in the call SETUP record.
 *
 * \param sr New call SETUP record.
 * \param caller Caller party ID information to set.
 *
 * \return Nothing
 */
void pri_sr_set_caller_party(struct pri_sr *sr, const struct pri_party_id *caller);
/*! \note Use pri_sr_set_caller_party() instead to pass more precise caller information. */
1591
int pri_sr_set_caller(struct pri_sr *sr, char *caller, char *callername, int callerplan, int callerpres);
1592

1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612
/*!
 * \brief Set the calling subaddress information in the call SETUP record.
 *
 * \param sr New call SETUP record.
 * \param subaddress information to set.
 *
 * \return Nothing
 */
void pri_sr_set_caller_subaddress(struct pri_sr *sr, const struct pri_party_subaddress *subaddress);

/*!
 * \brief Set the called subaddress information in the call SETUP record.
 *
 * \param sr New call SETUP record.
 * \param subaddress information to set.
 *
 * \return Nothing
 */
void pri_sr_set_called_subaddress(struct pri_sr *sr, const struct pri_party_subaddress *subaddress);

1613 1614 1615 1616 1617 1618 1619 1620 1621 1622
/*!
 * \brief Set the redirecting information in the call SETUP record.
 *
 * \param sr New call SETUP record.
 * \param caller Redirecting information to set.
 *
 * \return Nothing
 */
void pri_sr_set_redirecting_parties(struct pri_sr *sr, const struct pri_party_redirecting *redirecting);
/*! \note Use pri_sr_set_redirecting_parties() instead to pass more precise redirecting information. */
1623
int pri_sr_set_redirecting(struct pri_sr *sr, char *num, int plan, int pres, int reason);
1624

1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
/*!
 * \brief Set the keypad digits in the call SETUP record.
 *
 * \param sr New call SETUP record.
 * \param keypad_digits Keypad digits to send.
 *
 * \return Nothing
 */
void pri_sr_set_keypad_digits(struct pri_sr *sr, const char *keypad_digits);

1635
#define PRI_USER_USER_TX
1636
/* Set the user user field.  Warning!  don't send binary data accross this field */
1637
void pri_sr_set_useruser(struct pri_sr *sr, const char *userchars);
1638
void pri_sr_set_reversecharge(struct pri_sr *sr, int requested);
1639

1640
void pri_call_set_useruser(q931_call *sr, const char *userchars);
1641

1642
int pri_setup(struct pri *pri, q931_call *call, struct pri_sr *req);
1643

1644 1645 1646 1647
/*!
 * \brief Set a call as a call indpendent signalling connection (i.e. no bchan)
 * \note Call will automaticlly disconnect after signalling sent.
 */
1648
int pri_sr_set_connection_call_independent(struct pri_sr *req);
1649

1650 1651 1652 1653 1654 1655
/*!
 * \brief Set a call as a call indpendent signalling connection (i.e. no bchan)
 * \note Call will stay connected until explicitly disconnected.
 */
int pri_sr_set_no_channel_call(struct pri_sr *req);

1656
/* Send an MWI indication to a remote location.  If activate is non zero, activates, if zero, deactivates */
1657
int pri_mwi_activate(struct pri *pri, q931_call *c, char *caller, int callerplan, char *callername, int callerpres, char *called, int calledplan);
1658 1659

/* Send an MWI deactivate request to a remote location */
1660
int pri_mwi_deactivate(struct pri *pri, q931_call *c, char *caller, int callerplan, char *callername, int callerpres, char *called, int calledplan);
1661

1662 1663 1664 1665
/*!
 * \brief Send a MWI indication on the specified D channel.
 *
 * \param ctrl D channel controller.
1666
 * \param mailbox Party receiving notification.
1667 1668
 * \param basic_service Basic service enum (-1 if not present).
 * \param num_messages NumberOfMessages (-1 if not present).
1669 1670
 * \param caller_id Party leaving message (NULL if not present).
 * \param timestamp When message left. (Generalized Time format, NULL if not present)
1671 1672 1673 1674 1675 1676 1677 1678 1679 1680
 * \param message_reference Message reference number (-1 if not present).
 * \param message_status Message status: added(0), removed(1).
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
int pri_mwi_indicate(struct pri *ctrl, const struct pri_party_id *mailbox,
	int basic_service, int num_messages, const struct pri_party_id *caller_id,
	const char *timestamp, int message_reference, int message_status);

1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701
/*!
 * \brief Send a MWI indication on the specified D channel. (Take two)
 *
 * \param ctrl D channel controller.
 * \param mailbox Party receiving notification.
 * \param vm_id Voicemail system number (NULL if not present).
 * \param basic_service Basic service enum (-1 if not present).
 * \param num_messages NumberOfMessages (-1 if not present).
 * \param caller_id Party leaving message (NULL if not present).
 * \param timestamp When message left. (Generalized Time format, NULL if not present)
 * \param message_reference Message reference number (-1 if not present).
 * \param message_status Message status: added(0), removed(1).
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
int pri_mwi_indicate_v2(struct pri *ctrl, const struct pri_party_id *mailbox,
	const struct pri_party_id *vm_id, int basic_service, int num_messages,
	const struct pri_party_id *caller_id, const char *timestamp, int message_reference,
	int message_status);

1702 1703 1704
/* Set service message support flag */
int pri_set_service_message_support(struct pri *pri, int supportflag);

1705 1706
#define PRI_2BCT
/* Attempt to pass the channels back to the NET side if compatable and
1707
 * subscribed.  Sometimes called 2 bchannel transfer (2BCT) */
1708 1709
int pri_channel_bridge(q931_call *call1, q931_call *call2);

1710
/* Override message and error stuff */
1711
#define PRI_NEW_SET_API
1712 1713
void pri_set_message(void (*__pri_error)(struct pri *pri, char *));
void pri_set_error(void (*__pri_error)(struct pri *pri, char *));
1714 1715 1716

/* Set overlap mode */
#define PRI_SET_OVERLAPDIAL
1717
void pri_set_overlapdial(struct pri *pri,int state);
1718

1719 1720 1721 1722
/* QSIG logical channel mapping option, do not skip channel 16 */
#define PRI_SET_CHAN_MAPPING_LOGICAL
void pri_set_chan_mapping_logical(struct pri *pri, int state);

1723
#define PRI_DUMP_INFO_STR
1724
char *pri_dump_info_str(struct pri *pri);
1725

1726
/* Get file descriptor */
1727
int pri_fd(struct pri *pri);
1728

1729
#define PRI_PROGRESS
1730
/* Send progress */
1731
int pri_progress(struct pri *pri, q931_call *c, int channel, int info);
1732

1733 1734 1735
/* Send progress with cause IE */
int pri_progress_with_cause(struct pri *pri, q931_call *c, int channel, int info, int cause);

1736
#define PRI_PROCEEDING_FULL
1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747
/*!
 * \brief Send the PROCEEDING message.
 *
 * \param pri D channel controller.
 * \param c Q.931 call leg.
 * \param channel Encoded channel id to use.  If zero do not change channel id.
 * \param info Nonzero to include a progress ie indicating inband audio available.
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
1748
int pri_proceeding(struct pri *pri, q931_call *c, int channel, int info);
1749

1750
/* Enable inband progress when a DISCONNECT is received */
1751
void pri_set_inbanddisconnect(struct pri *pri, unsigned int enable);
1752

1753 1754
/* Enslave a PRI to another, so they share the same call list
   (and maybe some timers) */
1755
void pri_enslave(struct pri *master, struct pri *slave);
1756

1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829
/*!
 * \brief  Request AOC on call setup
 *
 * \param call setup struct to set charging request info on
 * \param charging request to set on setup struct
 *
 * \retval 0 on success
 * \retval -1 on failure
 */
int pri_sr_set_aoc_charging_request(struct pri_sr *sr, int charging_request);

/*!
 * \brief Send AOC Request Response to a request for AOC-S
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param invoke_id for response message
 * \param aoc_s message for response
 *
 * \retval 0 on success
 * \retval -1 on failure
 */
int pri_aoc_s_request_response_send(struct pri *ctrl, q931_call *call, int invoke_id, const struct pri_subcmd_aoc_s *aoc_s);

/*!
 * \brief Send AOC Request Response to a request for AOC-D or AOC-E
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param response in form of enum PRI_AOC_REQ_RSP
 * \param invoke_id for response message
 *
 * \retval 0 on success
 * \retval -1 on failure
 */
int pri_aoc_de_request_response_send(struct pri *ctrl, q931_call *call, int response, int invoke_id);

/*!
 * \brief Send AOC-S message.
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param aoc_s message to send
 *
 * \retval 0 on success
 * \retval -1 on failure
 */
int pri_aoc_s_send(struct pri *ctrl, q931_call *c, const struct pri_subcmd_aoc_s *aoc_s);

/*!
 * \brief Send AOC-D message.
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param aoc_d message to send
 *
 * \retval 0 on success
 * \retval -1 on failure
 */
int pri_aoc_d_send(struct pri *ctrl, q931_call *c, const struct pri_subcmd_aoc_d *aoc_d);

/*!
 * \brief Send AOC-E message.
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param aoc_e message to send
 *
 * \retval 0 on success
 * \retval -1 on failure
 */
int pri_aoc_e_send(struct pri *ctrl, q931_call *c, const struct pri_subcmd_aoc_e *aoc_e);

1830
#define PRI_GR303_SUPPORT
1831
#define PRI_ENSLAVE_SUPPORT
1832
#define PRI_SETUP_CALL
Mark Spencer's avatar
Mark Spencer committed
1833
#define PRI_RECEIVE_SUBADDR
1834
#define PRI_REDIRECTING_REASON
1835
#define PRI_AOC_UNITS
1836
#define PRI_ANI
1837 1838

/* Send notification */
1839
int pri_notify(struct pri *pri, q931_call *c, int channel, int info);
1840

1841 1842
int pri_callrerouting_facility(struct pri *pri, q931_call *call, const char *dest, const char* original, const char* reason);

1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913
/*!
 * \brief Set the call deflection/rerouting feature enable flag.
 *
 * \param ctrl D channel controller.
 * \param enable TRUE to enable call deflection/rerouting feature.
 *
 * \return Nothing
 */
void pri_reroute_enable(struct pri *ctrl, int enable);

/*!
 * \brief Send the CallRerouting/CallDeflection message.
 *
 * \param ctrl D channel controller.
 * \param call Q.931 call leg.
 * \param caller Call rerouting/deflecting updated caller data. (NULL if data not updated.)
 * \param deflection Call rerouting/deflecting redirection data.
 * \param subscription_option Diverting user subscription option to specify if caller is notified.
 *
 * \note
 * deflection->to is the new called number and must always be present.
 * \note
 * subscription option:
 * noNotification(0),
 * notificationWithoutDivertedToNr(1),
 * notificationWithDivertedToNr(2)
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
int pri_reroute_call(struct pri *ctrl, q931_call *call, const struct pri_party_id *caller, const struct pri_party_redirecting *deflection, int subscription_option);

enum PRI_REROUTING_RSP_CODE {
	/*!
	 * Rerouting invocation accepted and the network provider option