aboutsummaryrefslogtreecommitdiffstats
path: root/src/libosmocc/message.h
blob: 9dee2c9728120d29f5267ec13b70fd1aa31db91f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
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
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
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
#ifndef OSMO_CC_MSG_H
#define OSMO_CC_MSG_H

#define OSMO_CC_VERSION "OSMOCCv1"

/* call control messages types */
enum osmo_cc_msg_type {
	OSMO_CC_MSG_SETUP_REQ =		0x00,
	OSMO_CC_MSG_SETUP_IND =		0x01,
	OSMO_CC_MSG_REJ_REQ =		0x10,
	OSMO_CC_MSG_REJ_IND =		0x11,
	OSMO_CC_MSG_SETUP_ACK_REQ =	0x20,
	OSMO_CC_MSG_SETUP_ACK_IND =	0x21,
	OSMO_CC_MSG_PROC_REQ =		0x30,
	OSMO_CC_MSG_PROC_IND =		0x31,
	OSMO_CC_MSG_ALERT_REQ =		0x40,
	OSMO_CC_MSG_ALERT_IND =		0x41,
	OSMO_CC_MSG_SETUP_RSP =		0x02,
	OSMO_CC_MSG_SETUP_CNF =		0x03,
	OSMO_CC_MSG_SETUP_COMP_REQ =	0x50,
	OSMO_CC_MSG_SETUP_COMP_IND =	0x51,
	OSMO_CC_MSG_DISC_REQ =		0x60,
	OSMO_CC_MSG_DISC_IND =		0x61,
	OSMO_CC_MSG_REL_REQ =		0x70,
	OSMO_CC_MSG_REL_CNF =		0x73,
	OSMO_CC_MSG_REL_IND =		0x71,
	OSMO_CC_MSG_PROGRESS_REQ =	0x80,
	OSMO_CC_MSG_PROGRESS_IND =	0x81,
	OSMO_CC_MSG_NOTIFY_REQ =	0x84,
	OSMO_CC_MSG_NOTIFY_IND =	0x85,
	OSMO_CC_MSG_INFO_REQ =		0x88,
	OSMO_CC_MSG_INFO_IND =		0x89,
	OSMO_CC_MSG_ATTACH_REQ =	0xf8,
	OSMO_CC_MSG_ATTACH_IND =	0xf9,
	OSMO_CC_MSG_ATTACH_RSP =	0xfa,
	OSMO_CC_MSG_ATTACH_CNF =	0xfb,
	OSMO_CC_MSG_DUMMY_REQ =		0xfc,
};

#define OSMO_CC_MSG_MASK		0x03,
#define OSMO_CC_MSG_REQ			0x00,
#define OSMO_CC_MSG_IND			0x01,
#define OSMO_CC_MSG_RSP			0x02,
#define OSMO_CC_MSG_CNF			0x03,

/* information elements */
enum osmo_cc_ie_type {
	OSMO_CC_IE_CALLED =		0x11,
	OSMO_CC_IE_CALLED_SUB =		0x12,
	OSMO_CC_IE_CALLED_NAME =	0x13,
	OSMO_CC_IE_CALLED_INTERFACE =	0x14,
	OSMO_CC_IE_DTMF =		0x1d,
	OSMO_CC_IE_KEYPAD =		0x1e,
	OSMO_CC_IE_COMPLETE =		0x1f,
	OSMO_CC_IE_CALLING =		0x21,
	OSMO_CC_IE_CALLING_SUB =	0x22,
	OSMO_CC_IE_CALLING_NAME =	0x23,
	OSMO_CC_IE_CALLING_INTERFACE =	0x24,
	OSMO_CC_IE_CALLING_NETWORK =	0x2f,
	OSMO_CC_IE_REDIR =		0x31,
	OSMO_CC_IE_PROGRESS =		0x32,
	OSMO_CC_IE_NOTIFY =		0x33,
	OSMO_CC_IE_DISPLAY =		0x34,
	OSMO_CC_IE_CAUSE =		0x41,
	OSMO_CC_IE_BEARER =		0x51,
	OSMO_CC_IE_SDP =		0x52,
	OSMO_CC_IE_SOCKET_ADDRESS =	0x5e,
	OSMO_CC_IE_PRIVATE =		0x5f,
};

/* type of number, see ITU-T Rec. Q.931 */
#define OSMO_CC_TYPE_UNKNOWN			0
#define OSMO_CC_TYPE_INTERNATIONAL		1
#define OSMO_CC_TYPE_NATIONAL			2
#define OSMO_CC_TYPE_NETWORK			3
#define OSMO_CC_TYPE_SUBSCRIBER			4
#define OSMO_CC_TYPE_ABBREVIATED		5
#define OSMO_CC_TYPE_RESERVED			7

/* numbering plan, see ITU-T Rec. Q.931 */
#define OSMO_CC_PLAN_UNKNOWN			0
#define OSMO_CC_PLAN_TELEPHONY			1
#define OSMO_CC_PLAN_DATA			3
#define OSMO_CC_PLAN_TTY			4
#define OSMO_CC_PLAN_NATIONAL_STANDARD		8
#define OSMO_CC_PLAN_PRIVATE			9
#define OSMO_CC_PLAN_RESERVED			15

/* presentation indicator, see ITU-T Rec. Q.931 */
#define OSMO_CC_PRESENT_ALLOWED			0
#define OSMO_CC_PRESENT_RESTRICTED		1
#define OSMO_CC_PRESENT_NOT_AVAIL		2
#define OSMO_CC_PRESENT_RESERVED		3

/* screening indicator, see ITU-T Rec. Q.931 */
#define OSMO_CC_SCREEN_USER_UNSCREENED		0
#define OSMO_CC_SCREEN_USER_VERIFIED_PASSED	1
#define OSMO_CC_SCREEN_USER_VERIFIED_FAILED	2
#define OSMO_CC_SCREEN_NETWORK			3

/* screening indicator, see ITU-T Rec. Q.931 */
#define OSMO_CC_REDIR_REASON_UNKNOWN		0
#define OSMO_CC_REDIR_REASON_CFB		1
#define OSMO_CC_REDIR_REASON_CFNR		2
#define OSMO_CC_REDIR_REASON_CD			4
#define OSMO_CC_REDIR_REASON_CF_OUTOFORDER	9
#define OSMO_CC_REDIR_REASON_CF_BY_DTE		10
#define OSMO_CC_REDIR_REASON_CFU		15

/* notification indicator, see ITU-T Rec. Q.931 ff. */
#define OSMO_CC_NOTIFY_USER_SUSPENDED		0x00    
#define OSMO_CC_NOTIFY_USER_RESUMED		0x01
#define OSMO_CC_NOTIFY_BEARER_SERVICE_CHANGE	0x02
#define OSMO_CC_NOTIFY_CALL_COMPLETION_DELAY	0x03
#define OSMO_CC_NOTIFY_CONFERENCE_ESTABLISHED	0x42
#define OSMO_CC_NOTIFY_CONFERENCE_DISCONNECTED	0x43
#define OSMO_CC_NOTIFY_OTHER_PARTY_ADDED	0x44
#define OSMO_CC_NOTIFY_ISOLATED			0x45
#define OSMO_CC_NOTIFY_REATTACHED		0x46
#define OSMO_CC_NOTIFY_OTHER_PARTY_ISOLATED	0x47
#define OSMO_CC_NOTIFY_OTHER_PARTY_REATTACHED	0x48
#define OSMO_CC_NOTIFY_OTHER_PARTY_SPLIT	0x49
#define OSMO_CC_NOTIFY_OTHER_PARTY_DISCONNECTED	0x4a
#define OSMO_CC_NOTIFY_CONFERENCE_FLOATING	0x4b
#define OSMO_CC_NOTIFY_CONFERENCE_DISC_PREEMPT	0x4c	/* disconnect preemted */
#define OSMO_CC_NOTIFY_CONFERENCE_FLOATING_SUP	0x4f	/* served user preemted */
#define OSMO_CC_NOTIFY_CALL_IS_A_WAITING_CALL	0x60
#define OSMO_CC_NOTIFY_DIVERSION_ACTIVATED	0x68
#define OSMO_CC_NOTIFY_RESERVED_CT_1		0x69
#define OSMO_CC_NOTIFY_RESERVED_CT_2		0x6a
#define OSMO_CC_NOTIFY_REVERSE_CHARGING		0x6e
#define OSMO_CC_NOTIFY_REMOTE_HOLD		0x79
#define OSMO_CC_NOTIFY_REMOTE_RETRIEVAL		0x7a
#define OSMO_CC_NOTIFY_CALL_IS_DIVERTING	0x7b

/* coding standard, see ITU-T Rec. Q.931 */
#define OSMO_CC_CODING_ITU_T			0
#define OSMO_CC_CODING_ISO_IEC			1
#define OSMO_CC_CODING_NATIONAL			2
#define OSMO_CC_CODING_STANDARD_SPECIFIC	3

/* cause, see ITU-T Rec. Q.850 */
#define	OSMO_CC_ISDN_CAUSE_UNASSIGNED_NR	1
#define	OSMO_CC_ISDN_CAUSE_NO_ROUTE		3
#define	OSMO_CC_ISDN_CAUSE_CHAN_UNACCEPT	6
#define	OSMO_CC_ISDN_CAUSE_OP_DET_BARRING	8
#define	OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR	16
#define	OSMO_CC_ISDN_CAUSE_USER_BUSY		17
#define	OSMO_CC_ISDN_CAUSE_USER_NOTRESPOND	18
#define	OSMO_CC_ISDN_CAUSE_USER_ALERTING_NA	19
#define	OSMO_CC_ISDN_CAUSE_CALL_REJECTED	21
#define	OSMO_CC_ISDN_CAUSE_NUMBER_CHANGED	22
#define	OSMO_CC_ISDN_CAUSE_PRE_EMPTION		25
#define	OSMO_CC_ISDN_CAUSE_NONSE_USER_CLR	26
#define	OSMO_CC_ISDN_CAUSE_DEST_OOO		27
#define	OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT	28
#define	OSMO_CC_ISDN_CAUSE_FACILITY_REJ		29
#define	OSMO_CC_ISDN_CAUSE_RESP_STATUS_INQ	30
#define	OSMO_CC_ISDN_CAUSE_NORMAL_UNSPEC	31
#define	OSMO_CC_ISDN_CAUSE_NO_CIRCUIT_CHAN	34
#define	OSMO_CC_ISDN_CAUSE_NETWORK_OOO		38
#define	OSMO_CC_ISDN_CAUSE_TEMP_FAILURE		41
#define	OSMO_CC_ISDN_CAUSE_SWITCH_CONG		42
#define	OSMO_CC_ISDN_CAUSE_ACC_INF_DISCARD	43
#define	OSMO_CC_ISDN_CAUSE_REQ_CHAN_UNAVAIL	44
#define	OSMO_CC_ISDN_CAUSE_RESOURCE_UNAVAIL	47
#define	OSMO_CC_ISDN_CAUSE_QOS_UNAVAIL		49
#define	OSMO_CC_ISDN_CAUSE_REQ_FAC_NOT_SUBSC	50
#define	OSMO_CC_ISDN_CAUSE_INC_BARRED_CUG	55
#define	OSMO_CC_ISDN_CAUSE_BEARER_CAP_UNAUTH	57
#define	OSMO_CC_ISDN_CAUSE_BEARER_CA_UNAVAIL	58
#define	OSMO_CC_ISDN_CAUSE_SERV_OPT_UNAVAIL	63
#define	OSMO_CC_ISDN_CAUSE_BEARERSERV_UNIMPL	65
#define	OSMO_CC_ISDN_CAUSE_ACM_GE_ACM_MAX	68
#define	OSMO_CC_ISDN_CAUSE_REQ_FAC_NOTIMPL	69
#define	OSMO_CC_ISDN_CAUSE_RESTR_BCAP_AVAIL	70
#define	OSMO_CC_ISDN_CAUSE_SERV_OPT_UNIMPL	79
#define	OSMO_CC_ISDN_CAUSE_INVAL_CALLREF	81
#define	OSMO_CC_ISDN_CAUSE_USER_NOT_IN_CUG	87
#define	OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST	88
#define	OSMO_CC_ISDN_CAUSE_INVAL_TRANS_NET	91
#define	OSMO_CC_ISDN_CAUSE_SEMANTIC_INCORR	95
#define	OSMO_CC_ISDN_CAUSE_INVAL_MAND_INF	96
#define	OSMO_CC_ISDN_CAUSE_MSGTYPE_NOTEXIST	97
#define	OSMO_CC_ISDN_CAUSE_MSGTYPE_INCOMPAT	98
#define	OSMO_CC_ISDN_CAUSE_IE_NOTEXIST		99
#define	OSMO_CC_ISDN_CAUSE_COND_IE_ERR		100
#define	OSMO_CC_ISDN_CAUSE_MSG_INCOMP_STATE	101
#define	OSMO_CC_ISDN_CAUSE_RECOVERY_TIMER	102
#define	OSMO_CC_ISDN_CAUSE_PROTO_ERR		111
#define	OSMO_CC_ISDN_CAUSE_INTERWORKING		127

/* location, see ITU-T Rec. Q.931 */
#define OSMO_CC_LOCATION_USER			0
#define OSMO_CC_LOCATION_PRIV_SERV_LOC_USER	1
#define OSMO_CC_LOCATION_PUB_SERV_LOC_USER	2
#define OSMO_CC_LOCATION_TRANSIT		3
#define OSMO_CC_LOCATION_PUB_SERV_REM_USER	4
#define OSMO_CC_LOCATION_PRIV_SERV_REM_USER	5
#define OSMO_CC_LOCATION_BEYOND_INTERWORKING	10

/* progress description, see ITU-T Rec. Q.931 */
#define OSMO_CC_PROGRESS_NOT_END_TO_END_ISDN	1
#define OSMO_CC_PROGRESS_DEST_NOT_ISDN		2
#define OSMO_CC_PROGRESS_ORIG_NOT_ISDN		3
#define OSMO_CC_PROGRESS_RETURN_TO_ISDN		4
#define OSMO_CC_PROGRESS_INTERWORKING		5
#define OSMO_CC_PROGRESS_INBAND_INFO_AVAILABLE	8

/* information transfer capability, see ITU-T Rec. Q.931 */
#define OSMO_CC_CAPABILITY_SPEECH		0
#define OSMO_CC_CAPABILITY_DATA			8
#define OSMO_CC_CAPABILITY_DATA_RESTRICTED	9
#define OSMO_CC_CAPABILITY_AUDIO		16
#define OSMO_CC_CAPABILITY_DATA_WITH_TONES	17
#define OSMO_CC_CAPABILITY_VIDEO		24

/* transfer mode, see ITU-T Rec. Q.931 */
#define OSMO_CC_MODE_CIRCUIT			0
#define OSMO_CC_MODE_PACKET			2

#define OSMO_CC_DTMF_MODE_OFF			0	/* stop tone */
#define OSMO_CC_DTMF_MODE_ON			1	/* start tone */
#define OSMO_CC_DTMF_MODE_DIGITS		2	/* play tone(s) with duration and pauses */

#define OSMO_CC_SOCKET_CAUSE_VERSION_MISMATCH	1	/* version missmatch */
#define OSMO_CC_SOCKET_CAUSE_FAILED		2	/* connection failed */
#define OSMO_CC_SOCKET_CAUSE_BROKEN_PIPE	3	/* connected socket failed */
#define OSMO_CC_SOCKET_CAUSE_TIMEOUT		4	/* keepalive packets timeout */
// if you add causes here, add them in process_cause.c also!

/* network type (network IE) and meaning of 'id' */
#define OSMO_CC_NETWORK_UNDEFINED		0x00
#define OSMO_CC_NETWORK_ALSA_NONE		0x01
#define OSMO_CC_NETWORK_POTS_NONE		0x02
#define OSMO_CC_NETWORK_ISDN_NONE		0x03
#define OSMO_CC_NETWORK_SIP_NONE		0x04
#define OSMO_CC_NETWORK_GSM_IMSI		0x05	/* id has decimal IMSI */
#define OSMO_CC_NETWORK_GSM_IMEI		0x06	/* id has decimal IMEI */
#define OSMO_CC_NETWORK_WEB_NONE		0x07
#define OSMO_CC_NETWORK_DECT_NONE		0x08
#define OSMO_CC_NETWORK_BLUETOOTH_NONE		0x09
#define OSMO_CC_NETWORK_SS5_NONE		0x0a
#define OSMO_CC_NETWORK_ANETZ_NONE		0x80
#define OSMO_CC_NETWORK_BNETZ_MUENZ		0x81	/* id starts with 'M' */
#define OSMO_CC_NETWORK_CNETZ_NONE		0x82
#define OSMO_CC_NETWORK_NMT_NONE		0x83	/* id has decimal password */
#define OSMO_CC_NETWORK_R2000_NONE		0x84
#define OSMO_CC_NETWORK_AMPS_ESN		0x85	/* if has decimal ESN (TACS also) */
#define OSMO_CC_NETWORK_MTS_NONE		0x86
#define OSMO_CC_NETWORK_IMTS_NONE		0x87
#define OSMO_CC_NETWORK_EUROSIGNAL_NONE		0x88
#define OSMO_CC_NETWORK_JOLLYCOM_NONE		0x89	/* call from JollyCom... */

typedef struct osmo_cc_msg {
	uint8_t type;
	uint16_t length_networkorder;
	uint8_t data[0];
} __attribute__((packed)) osmo_cc_msg_t;

typedef struct osmo_cc_msg_list {
	struct osmo_cc_msg_list *next;
	struct osmo_cc_msg *msg;
	uint32_t callref;
	char host[128];
	uint16_t port;
} osmo_cc_msg_list_t;

typedef struct osmo_cc_ie {
	uint8_t type;
	uint16_t length_networkorder;
	uint8_t data[0];
} __attribute__((packed)) osmo_cc_ie_t;

struct osmo_cc_ie_called {
	uint8_t type;
	uint8_t	plan;
	char digits[0];
} __attribute__((packed));

struct osmo_cc_ie_called_sub {
	uint8_t type;
	char digits[0];
} __attribute__((packed));

struct osmo_cc_ie_called_name {
	char name[0];
} __attribute__((packed));

struct osmo_cc_ie_called_interface {
	char name[0];
} __attribute__((packed));

struct osmo_cc_ie_calling {
	uint8_t type;
	uint8_t	plan;
	uint8_t present;
	uint8_t	screen;
	char digits[0];
} __attribute__((packed));

struct osmo_cc_ie_calling_sub {
	uint8_t type;
	char digits[0];
} __attribute__((packed));

struct osmo_cc_ie_calling_name {
	char name[0];
} __attribute__((packed));

struct osmo_cc_ie_calling_interface {
	char name[0];
} __attribute__((packed));

struct osmo_cc_ie_network {
	uint8_t type;
	char id[0];
} __attribute__((packed));

struct osmo_cc_ie_bearer {
	uint8_t coding;
	uint8_t capability;
	uint8_t mode;
} __attribute__((packed));

struct osmo_cc_ie_redir {
	uint8_t type;
	uint8_t	plan;
	uint8_t present;
	uint8_t	screen;
	uint8_t redir_reason;
	char digits[0];
} __attribute__((packed));

struct osmo_cc_ie_dtmf {
	uint8_t duration_ms;
	uint8_t pause_ms;
	uint8_t dtmf_mode;
	char digits[0];
} __attribute__((packed));

struct osmo_cc_ie_keypad {
	char digits[0];
} __attribute__((packed));

struct osmo_cc_ie_progress {
	uint8_t coding;
	uint8_t location;
	uint8_t progress;
} __attribute__((packed));

struct osmo_cc_ie_notify {
	uint8_t notify;
} __attribute__((packed));

struct osmo_cc_ie_cause {
	uint8_t location;
	uint8_t isdn_cause;
	uint16_t sip_cause_networkorder;
	uint8_t socket_cause;
} __attribute__((packed));

struct osmo_cc_ie_display {
	char text[0];
} __attribute__((packed));

struct osmo_cc_ie_sdp {
	char sdp[0];
} __attribute__((packed));

struct osmo_cc_ie_socket_address {
	char address[0];
} __attribute__((packed));

struct osmo_cc_ie_private {
	uint32_t unique_networkorder;
	uint8_t data[0];
} __attribute__((packed));

uint32_t osmo_cc_new_callref(void);
const char *osmo_cc_msg_name(uint8_t msg_type);
osmo_cc_msg_t *osmo_cc_new_msg(uint8_t msg_type);
osmo_cc_msg_t *osmo_cc_clone_msg(osmo_cc_msg_t *msg);
osmo_cc_msg_t *osmo_cc_msg_list_dequeue(osmo_cc_msg_list_t **mlp, uint32_t *callref_p);
osmo_cc_msg_list_t *osmo_cc_msg_list_enqueue(osmo_cc_msg_list_t **mlp, osmo_cc_msg_t *msg, uint32_t callref);
void osmo_cc_free_msg(osmo_cc_msg_t *msg);
int osmo_cc_get_ie_struct(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat, int ie_len, const osmo_cc_ie_t **ie_struct);
int osmo_cc_get_ie_data(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat, int ie_len, const void **ie_data);
int osmo_cc_has_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat);
int osmo_cc_remove_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat);
void *osmo_cc_add_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_len);
void *osmo_cc_msg_sep_ie(osmo_cc_msg_t *msg, void **iep, uint8_t *ie_type, uint16_t *ie_length);

void osmo_cc_add_ie_called(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, const char *dialing);
int osmo_cc_get_ie_called(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, char *dialing, size_t dialing_size);
void osmo_cc_add_ie_called_sub(osmo_cc_msg_t *msg, uint8_t type, const char *dialing);
int osmo_cc_get_ie_called_sub(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *dialing, size_t dialing_size);
void osmo_cc_add_ie_called_name(osmo_cc_msg_t *msg, const char *name);
int osmo_cc_get_ie_called_name(osmo_cc_msg_t *msg, int ie_repeat, char *name, size_t name_size);
void osmo_cc_add_ie_called_interface(osmo_cc_msg_t *msg, const char *interface);
int osmo_cc_get_ie_called_interface(osmo_cc_msg_t *msg, int ie_repeat, char *interface, size_t interface_size);
void osmo_cc_add_ie_complete(osmo_cc_msg_t *msg);
int osmo_cc_get_ie_complete(osmo_cc_msg_t *msg, int ie_repeat);
void osmo_cc_add_ie_calling(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, uint8_t present, uint8_t screen, const char *callerid);
int osmo_cc_get_ie_calling(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, uint8_t *present, uint8_t *screen, char *callerid, size_t callerid_size);
void osmo_cc_add_ie_calling_sub(osmo_cc_msg_t *msg, uint8_t type, const char *callerid);
int osmo_cc_get_ie_calling_sub(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *callerid, size_t callerid_size);
void osmo_cc_add_ie_calling_name(osmo_cc_msg_t *msg, const char *name);
int osmo_cc_get_ie_calling_name(osmo_cc_msg_t *msg, int ie_repeat, char *name, size_t name_size);
void osmo_cc_add_ie_calling_interface(osmo_cc_msg_t *msg, const char *interface);
int osmo_cc_get_ie_calling_interface(osmo_cc_msg_t *msg, int ie_repeat, char *interface, size_t interface_size);
void osmo_cc_add_ie_calling_network(osmo_cc_msg_t *msg, uint8_t type, const char *networkid);
int osmo_cc_get_ie_calling_network(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *networkid, size_t networkid_size);
void osmo_cc_add_ie_bearer(osmo_cc_msg_t *msg, uint8_t coding, uint8_t capability, uint8_t mode);
int osmo_cc_get_ie_bearer(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *coding, uint8_t *capability, uint8_t *mode);
void osmo_cc_add_ie_redir(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, uint8_t present, uint8_t screen, uint8_t redir_reason, const char *callerid);
int osmo_cc_get_ie_redir(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, uint8_t *present, uint8_t *screen, uint8_t *reason, char *callerid, size_t callerid_size);
void osmo_cc_add_ie_dtmf(osmo_cc_msg_t *msg, uint8_t duration_ms, uint8_t pause_ms, uint8_t dtmf_mode, const char *digits);
int osmo_cc_get_ie_dtmf(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *duration_ms, uint8_t *pause_ms, uint8_t *dtmf_mode, char *digits, size_t digits_size);
void osmo_cc_add_ie_keypad(osmo_cc_msg_t *msg, const char *digits);
int osmo_cc_get_ie_keypad(osmo_cc_msg_t *msg, int ie_repeat, char *digits, size_t digits_size);
void osmo_cc_add_ie_progress(osmo_cc_msg_t *msg, uint8_t coding, uint8_t location, uint8_t progress);
int osmo_cc_get_ie_progress(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *coding, uint8_t *location, uint8_t *progress);
void osmo_cc_add_ie_notify(osmo_cc_msg_t *msg, uint8_t notify);
int osmo_cc_get_ie_notify(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *notify);
void osmo_cc_add_ie_cause(osmo_cc_msg_t *msg, uint8_t location, uint8_t isdn_cause, uint16_t sip_cause, uint8_t socket_cause);
int osmo_cc_get_ie_cause(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *location, uint8_t *isdn_cause, uint16_t *sip_cause, uint8_t *socket_cause);
void osmo_cc_add_ie_display(osmo_cc_msg_t *msg, const char *text);
int osmo_cc_get_ie_display(osmo_cc_msg_t *msg, int ie_repeat, char *text, size_t text_size);
void osmo_cc_add_ie_sdp(osmo_cc_msg_t *msg, const char *sdp);
int osmo_cc_get_ie_sdp(osmo_cc_msg_t *msg, int ie_repeat, char *sdp, size_t sdp_size);
void osmo_cc_add_ie_socket_address(osmo_cc_msg_t *msg, const char *address);
int osmo_cc_get_ie_socket_address(osmo_cc_msg_t *msg, int ie_repeat, char *address, size_t address_size);
void osmo_cc_add_ie_private(osmo_cc_msg_t *msg, uint32_t unique, const uint8_t *data, size_t data_size);
int osmo_cc_get_ie_private(osmo_cc_msg_t *msg, int ie_repeat, uint32_t *unique, uint8_t *data, size_t data_size);

#endif /* OSMO_CC_MSG_H */