1 /*
2  * Copyright (c) 2009, Konrad Hammel <konrad@sangoma.com>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of the original author; nor the names of any contributors
17  * may be used to endorse or promote products derived from this software
18  * without specific prior written permission.
19  *
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
25  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  *
34  * Contributors:
35  *
36  * James Zhang <jzhang@sangoma.com>
37  *
38  */
39 /******************************************************************************/
40 #ifndef __FTMOD_SNG_SS7_H__
41 #define __FTMOD_SNG_SS7_H__
42 /******************************************************************************/
43 
44 /* INCLUDE ********************************************************************/
45 #include <stdio.h>
46 #include <string.h>
47 #include <stdarg.h>
48 #include <stdint.h>
49 #include <unistd.h>
50 #include <ctype.h>
51 
52 #include "private/ftdm_core.h"
53 
54 #include "sng_ss7/sng_ss7.h"
55 #include "ftmod_sangoma_ss7_m2ua.h"
56 
57 /******************************************************************************/
58 
59 /* DEFINES ********************************************************************/
60 #define MAX_NAME_LEN			25
61 
62 #define MAX_CIC_LENGTH			5
63 #define MAX_CIC_MAP_LENGTH		1000
64 #define MAX_SCTP_LINK 			100
65 
66 #define SNGSS7_EVENT_QUEUE_SIZE	100
67 #define SNGSS7_PEER_CHANS_QUEUE_SIZE 100
68 #define SNGSS7_CHAN_EVENT_QUEUE_SIZE 100
69 
70 #define MAX_SIZEOF_SUBADDR_IE	24	/* as per Q931 4.5.9 */
71 
72 #define SNGSS7_SWITCHTYPE_ANSI(switchtype)	(switchtype == LSI_SW_ANS88) || \
73 											(switchtype == LSI_SW_ANS92) || \
74 											(switchtype == LSI_SW_ANS95)
75 
76 #define sngss7_flush_queue(queue) \
77 			do { \
78 					void *__queue_data = NULL; \
79 					while ((__queue_data = ftdm_queue_dequeue(queue))) { \
80 						ftdm_safe_free(__queue_data); \
81 					} \
82 			} while (0)
83 
84 typedef struct ftdm2trillium {
85 	uint8_t ftdm_val;
86 	uint8_t trillium_val;
87 } ftdm2trillium_t;
88 
89 typedef enum {
90 	SNGSS7_CON_IND_EVENT = 0,
91 	SNGSS7_CON_CFM_EVENT,
92 	SNGSS7_CON_STA_EVENT,
93 	SNGSS7_REL_IND_EVENT,
94 	SNGSS7_REL_CFM_EVENT,
95 	SNGSS7_DAT_IND_EVENT,
96 	SNGSS7_FAC_IND_EVENT,
97 	SNGSS7_FAC_CFM_EVENT,
98 	SNGSS7_UMSG_IND_EVENT,
99 	SNGSS7_STA_IND_EVENT,
100 	SNGSS7_SUSP_IND_EVENT,
101 	SNGSS7_RESM_IND_EVENT,
102 	SNGSS7_SSP_STA_CFM_EVENT,
103 	SNGSS7_INVALID_EVENT,
104 } sng_event_type_t;
105 #define SNG_EVENT_TYPE_STRINGS "CON_IND", "CON_CFM", "CON_STA", "REL_IND", "REL_CFM", "DAT_IND", "FAC_IND", \
106 	                       "FAC_CFM", "UMSG_IND", "STA_IND", "SUSP_IND", "RESM_IND", "SSP_STA_CFM", "INVALID"
107 FTDM_STR2ENUM_P(ftdm_str2sngss7_event, ftdm_sngss7_event2str, sng_event_type_t)
108 
109 typedef enum {
110 	SNG_BIT_A	= (1 << 0),
111 	SNG_BIT_B	= (1 << 1),
112 	SNG_BIT_C	= (1 << 2),
113 	SNG_BIT_D	= (1 << 3),
114 	SNG_BIT_E	= (1 << 4),
115 	SNG_BIT_F	= (1 << 5),
116 	SNG_BIT_G	= (1 << 6),
117 	SNG_BIT_H	= (1 << 7)
118 } sng_bit_enums_t;
119 
120 typedef enum {
121 	SNG_CKT_VOICE = 0,
122 	SNG_CKT_SIG,
123 	SNG_CKT_HOLE
124 } sng_ckt_type_t;
125 
126 typedef enum {
127 	SNG_RTE_UP	= 0,
128 	SNG_RTE_DN
129 } sng_route_direction_t;
130 
131 typedef enum {
132 	SNGSS7_LPA_FOR_COT		= (1 << 0),	/* send LPA when COT arrives */
133 	SNGSS7_ACM_OBCI_BITA	= (1 << 10)	/* in-band indication */
134 } sng_intf_options_t;
135 
136 typedef enum {
137 	SNG_CALLED			= 1,
138 	SNG_CALLING			= 2
139 } sng_addr_type_t;
140 
141 typedef enum {
142 	SNG_GEN_CFG_STATUS_INIT    = 0,
143 	SNG_GEN_CFG_STATUS_PENDING = 1,
144 	SNG_GEN_CFG_STATUS_DONE    = 2
145 } nsg_gen_cfg_type_t;
146 
147 typedef struct sng_mtp2_error_type {
148 	int	init;
149 	char sng_type[MAX_NAME_LEN];
150 	uint32_t tril_type;
151 } sng_mtp2_error_type_t;
152 
153 typedef struct sng_link_type {
154 	int init;
155 	char sng_type[MAX_NAME_LEN];
156 	uint32_t tril_mtp2_type;
157 	uint32_t tril_mtp3_type;
158 } sng_link_type_t;
159 
160 typedef struct sng_switch_type {
161 	int init;
162 	char sng_type[MAX_NAME_LEN];
163 	uint32_t tril_mtp3_type;
164 	uint32_t tril_isup_type;
165 } sng_switch_type_t;
166 
167 typedef struct sng_ssf_type {
168 	int init;
169 	char sng_type[MAX_NAME_LEN];
170 	uint32_t tril_type;
171 } sng_ssf_type_t;
172 
173 typedef struct sng_cic_cntrl_type {
174 	int init;
175 	char sng_type[MAX_NAME_LEN];
176 	uint32_t tril_type;
177 } sng_cic_cntrl_type_t;
178 
179 typedef struct sng_mtp1_link {
180 	char		name[MAX_NAME_LEN];
181 	uint32_t	flags;
182 	uint32_t	id;
183 	uint32_t	span;
184 	uint32_t	chan;
185 } sng_mtp1_link_t;
186 
187 typedef struct sng_mtp2_link {
188 	char		name[MAX_NAME_LEN];
189 	uint32_t	flags;
190 	uint32_t	id;
191 	uint32_t	lssuLength;
192 	uint32_t	errorType;
193 	uint32_t	linkType;
194 	uint32_t	mtp1Id;
195 	uint32_t	mtp1ProcId;
196 	uint32_t	t1;
197 	uint32_t	t2;
198 	uint32_t	t3;
199 	uint32_t	t4n;
200 	uint32_t	t4e;
201 	uint32_t	t5;
202 	uint32_t	t6;
203 	uint32_t	t7;
204 } sng_mtp2_link_t;
205 
206 /* defining glare handling methods:
207 	SNGSS7_GLARE_PC:
208 		higher PointCode controls even number CIC
209 		lower PointCode controls odd number CIC
210 	SNGSS7_GLARE_DOWN:
211 		always give control to the other side
212 	SNGSS7_GLARE_CONTROL:
213 		always trying to control
214 */
215 typedef enum {
216 	SNGSS7_GLARE_PC = 0,
217 	SNGSS7_GLARE_DOWN,
218 	SNGSS7_GLARE_CONTROL
219 } sng_glare_resolution;
220 
221 typedef struct sng_mtp3_link {
222 	char		name[MAX_NAME_LEN];
223 	uint32_t	flags;
224 	uint32_t	id;
225 	uint32_t	priority;
226 	uint32_t	linkType;
227 	uint32_t	switchType;
228 	uint32_t	apc;
229 	uint32_t	spc;
230 	uint32_t	ssf;
231 	uint32_t	slc;
232 	uint32_t	linkSetId;
233 	uint32_t	mtp2Id;
234 	uint32_t	mtp2ProcId;
235 	uint32_t	t1;
236 	uint32_t	t2;
237 	uint32_t	t3;
238 	uint32_t	t4;
239 	uint32_t	t5;
240 	uint32_t	t6;
241 	uint32_t	t7;
242 	uint32_t	t8;
243 	uint32_t	t9;
244 	uint32_t	t10;
245 	uint32_t	t11;
246 	uint32_t	t12;
247 	uint32_t	t13;
248 	uint32_t	t14;
249 	uint32_t	t15;
250 	uint32_t	t16;
251 	uint32_t	t17;
252 	uint32_t	t18;
253 	uint32_t	t19;
254 	uint32_t	t20;
255 	uint32_t	t21;
256 	uint32_t	t22;
257 	uint32_t	t23;
258 	uint32_t	t24;
259 	uint32_t	t25;
260 	uint32_t	t27;
261 	uint32_t	t28;
262 	uint32_t	t29;
263 	uint32_t	t30;
264 	uint32_t	t31;
265 	uint32_t	t32;
266 	uint32_t	t33;
267 	uint32_t	t34;
268 	uint32_t	t35;
269 	uint32_t	t36;
270 	uint32_t	t37;
271 	uint32_t	tcraft;
272 	uint32_t	tflc;
273 	uint32_t	tbnd;
274 } sng_mtp3_link_t;
275 
276 typedef struct sng_link_set {
277 	char			name[MAX_NAME_LEN];
278 	uint32_t		flags;
279 	uint32_t		id;
280 	uint32_t		apc;
281 	uint32_t		linkType;
282 	uint32_t		switchType;
283 	uint32_t		ssf;
284 	uint32_t 		minActive;
285 	uint32_t		numLinks;
286 	uint32_t		links[16];
287 } sng_link_set_t;
288 
289 typedef struct sng_link_set_list {
290 	uint32_t					lsId;
291 	struct sng_link_set_list	*next;
292 } sng_link_set_list_t;
293 
294 typedef struct sng_route {
295 	char			name[MAX_NAME_LEN];
296 	uint32_t		flags;
297 	uint32_t		id;
298 	uint32_t		dpc;
299 	uint32_t		cmbLinkSetId;
300 	struct sng_link_set_list	lnkSets;
301 	uint32_t		linkType;
302 	uint32_t		switchType;
303 	uint32_t		ssf;
304 	uint32_t		nwId;
305 	uint32_t		isSTP;
306 	uint32_t		dir;
307 	uint32_t		t6;
308 	uint32_t		t8;
309 	uint32_t		t10;
310 	uint32_t		t11;
311 	uint32_t		t15;
312 	uint32_t		t16;
313 	uint32_t		t18;
314 	uint32_t		t19;
315 	uint32_t		t21;
316 	uint32_t		t25;
317 	uint32_t		t26;
318 } sng_route_t;
319 
320 typedef struct sng_isup_intf {
321 	char			name[MAX_NAME_LEN];
322 	uint32_t		options;
323 	uint32_t		flags;
324 	uint32_t		id;
325 	uint32_t		spc;
326 	uint32_t		dpc;
327 	uint32_t		switchType;
328 	uint32_t		nwId;
329 	uint32_t		mtpRouteId;
330 	uint32_t		ssf;
331 	uint32_t		isap;
332 	uint16_t		t4;
333 	uint32_t		t11;
334 	uint32_t		t18;
335 	uint32_t		t19;
336 	uint32_t		t20;
337 	uint32_t		t21;
338 	uint32_t		t22;
339 	uint32_t		t23;
340 	uint32_t		t24;
341 	uint32_t		t25;
342 	uint32_t		t26;
343 	uint32_t		t28;
344 	uint32_t		t29;
345 	uint32_t		t30;
346 	uint32_t		t32;
347 	uint32_t		t37;
348 	uint32_t		t38;
349 	uint32_t		t39;
350 	uint32_t		tfgr;
351 	uint32_t		tpause;
352 	uint32_t		tstaenq;
353 } sng_isup_inf_t;
354 
355 typedef struct sng_isup_ckt {
356 	uint32_t		options;
357 	uint32_t		flags;
358 	uint32_t		procId;
359 	uint32_t		id;
360 	uint32_t		ccSpanId;
361 	uint32_t		span;
362 	uint32_t		chan;
363 	uint32_t		type;	/* VOICE/SIG/HOLE */
364 	uint32_t		cic;
365 	uint32_t		infId;
366 	uint32_t		typeCntrl;
367 	uint32_t		ssf;
368 	uint32_t		switchType;
369 
370 	uint32_t		clg_nadi;
371 	uint32_t		cld_nadi;
372 	uint8_t			rdnis_nadi;
373 	uint32_t		loc_nadi;
374 
375 	/* Generic Number defaults */
376 	uint8_t			gn_nmbqual;			/* Number Qualifier */
377 	uint8_t			gn_nadi;			/* Nature of Address indicator */
378 	uint8_t 		gn_screen_ind;		/* Screening Indicator */
379 	uint8_t			gn_pres_ind;		/* Presentation Indicator */
380 	uint8_t			gn_npi;				/* Numbering Plan Indicator */
381 	uint8_t			gn_num_inc_ind;		/* Number Incomplete Indicator */
382 	/* END - Generic Number defaults */
383 
384 	uint32_t		min_digits;
385 	uint32_t		transparent_iam_max_size;
386 	uint8_t			transparent_iam;
387 	uint8_t			cpg_on_progress_media;
388 	uint8_t			cpg_on_progress;
389 	uint8_t			itx_auto_reply;
390 	void			*obj;
391 	uint16_t		t3;
392 	uint32_t		t10;
393 	uint16_t		t12;
394 	uint16_t		t13;
395 	uint16_t		t14;
396 	uint16_t		t15;
397 	uint16_t		t16;
398 	uint16_t		t17;
399 	uint32_t		t35;
400 	uint32_t		t39;
401 	uint16_t		tval;
402 } sng_isup_ckt_t;
403 
404 typedef struct sng_nsap {
405 	uint32_t		flags;
406 	uint32_t		id;
407 	uint32_t		suId;
408 	uint32_t		spId;
409 	uint32_t		nwId;
410 	uint32_t		linkType;
411 	uint32_t		switchType;
412 	uint32_t		ssf;
413 } sng_nsap_t;
414 
415 typedef struct sng_isap {
416 	uint32_t		id;
417 	uint32_t		suId;
418 	uint32_t		spId;
419 	uint32_t		switchType;
420 	uint32_t		ssf;
421 	uint32_t		flags;
422 	uint32_t		t1;
423 	uint32_t		t2;
424 	uint32_t		t5;
425 	uint32_t		t6;
426 	uint32_t		t7;
427 	uint32_t		t8;
428 	uint32_t		t9;
429 	uint32_t		t27;
430 	uint32_t		t31;
431 	uint32_t		t33;
432 	uint32_t		t34;
433 	uint32_t		t36;
434 	uint32_t		tccr;
435 	uint32_t		tccrt;
436 	uint32_t		tex;
437 	uint32_t		tcrm;
438 	uint32_t		tcra;
439 	uint32_t		tect;
440 	uint32_t		trelrsp;
441 	uint32_t		tfnlrelrsp;
442 } sng_isap_t;
443 
444 typedef struct sng_relay {
445 	uint32_t		id;
446 	char			name[MAX_NAME_LEN];
447 	uint32_t		flags;
448 	uint32_t		type;
449 	uint32_t		port;
450 	char			hostname[RY_REMHOSTNAME_SIZE];
451 	uint32_t		procId;
452 } sng_relay_t;
453 
454 /**********************************************
455 sctp structures and data definitions
456 **********************************************/
457 
458 typedef struct sng_sctp_gen_cfg {
459 } sng_sctp_gen_cfg_t;
460 
461 typedef struct sng_sctp_link {
462 	char		name[MAX_NAME_LEN];
463 	uint32_t	flags;
464 	uint32_t	id;
465 	uint32_t	port;
466 	uint32_t	numSrcAddr;
467 	uint32_t	srcAddrList[SCT_MAX_NET_ADDRS+1];
468 } sng_sctp_link_t;
469 
470 typedef struct sng_sctp_cfg {
471 	sng_sctp_gen_cfg_t	genCfg;
472 	sng_sctp_link_t		linkCfg[MAX_SCTP_LINK+1];
473 } sng_sctp_cfg_t;
474 
475 
476 
477 typedef struct sng_ss7_cfg {
478 	uint32_t			spc;
479 	uint32_t			procId;
480 	char				license[MAX_SNGSS7_PATH];
481 	char				signature[MAX_SNGSS7_PATH];
482 	uint32_t			transparent_iam_max_size;
483 	uint32_t			flags;
484 	sng_relay_t			relay[MAX_RELAY_CHANNELS+1];
485 	sng_mtp1_link_t		mtp1Link[MAX_MTP_LINKS+1];
486 	sng_mtp2_link_t		mtp2Link[MAX_MTP_LINKS+1];
487 	sng_mtp3_link_t		mtp3Link[MAX_MTP_LINKS+1];
488 	sng_link_set_t		mtpLinkSet[MAX_MTP_LINKSETS+1];
489 	sng_route_t			mtpRoute[MAX_MTP_ROUTES+1];
490 	sng_isup_inf_t		isupIntf[MAX_ISUP_INFS+1];
491 	sng_isup_ckt_t		isupCkt[10000]; 	/* KONRAD - only need 2000 ( and 0-1000 aren't used) since other servers are registerd else where */
492 	sng_nsap_t			nsap[MAX_NSAPS+1];
493 	sng_isap_t			isap[MAX_ISAPS+1];
494 	sng_glare_resolution	glareResolution;
495 	uint32_t				force_inr;
496 	sng_m2ua_gbl_cfg_t 	g_m2ua_cfg;
497 	sng_sctp_cfg_t		sctpCfg;
498 } sng_ss7_cfg_t;
499 
500 typedef struct ftdm_sngss7_data {
501 	sng_ss7_cfg_t		cfg;
502 	int					gen_config;
503 	int					function_trace;
504 	int					function_trace_level;
505 	int					message_trace;
506 	int					message_trace_level;
507 	fio_signal_cb_t		sig_cb;
508 } ftdm_sngss7_data_t;
509 
510 typedef enum{
511 	SNG_SS7_OPR_MODE_NONE,
512 	SNG_SS7_OPR_MODE_M2UA_SG,
513 	SNG_SS7_OPR_MODE_ISUP,
514 }ftdm_sngss7_operating_modes_e;
515 
516 typedef ftdm_sngss7_operating_modes_e ftdm_sngss7_opr_mode;
517 
518 typedef struct sngss7_timer_data {
519 	ftdm_timer_id_t			hb_timer_id;
520 	int						beat;
521 	int						counter;
522 	ftdm_sched_callback_t	callback;
523 	ftdm_sched_t			*sched;
524 	void					*sngss7_info;
525 } sngss7_timer_data_t;
526 
527 typedef struct sngss7_glare_data {
528 	uint32_t				spInstId;
529 	uint32_t				circuit;
530 	SiConEvnt				iam;
531 } sngss7_glare_data_t;
532 
533 typedef struct sngss7_group_data {
534 	uint32_t				circuit;
535 	uint32_t				range;
536 	uint8_t					status[255];
537 	uint8_t					type;
538 	uint8_t					cause;
539 } sngss7_group_data_t;
540 
541 typedef struct sngss7_chan_data {
542 	ftdm_channel_t			*ftdmchan;
543 	sng_isup_ckt_t			*circuit;
544 	uint32_t				base_chan;
545 	uint32_t				suInstId;
546 	uint32_t				spInstId;
547 	uint32_t				spId;
548 	uint8_t					globalFlg;
549 	uint32_t				ckt_flags;
550 	uint32_t				blk_flags;
551 	ftdm_hash_t*			variables;		/* send on next sigevent */
552 	ftdm_size_t				raw_data_len;
553 	void					*raw_data;		/* send on next sigevent */
554 	sngss7_glare_data_t		glare;
555 	sngss7_timer_data_t		t35;
556 	sngss7_timer_data_t		t10;
557 	sngss7_timer_data_t		t39;
558 	sngss7_group_data_t		rx_grs;
559 	sngss7_group_data_t		rx_gra;
560 	sngss7_group_data_t		tx_grs;
561 	sngss7_group_data_t		ucic;
562 	ftdm_queue_t 			*event_queue;
563 	struct sngss7_chan_data         *peer_data;
564 	uint8_t peer_event_transfer_cnt;
565 } sngss7_chan_data_t;
566 
567 #define SNGSS7_RX_GRS_PENDING (1 << 0)
568 #define SNGSS7_UCIC_PENDING (1 << 1)
569 #define SNGSS7_RX_GRA_PENDING (1 << 2)
570 typedef struct sngss7_span_data {
571 	ftdm_sched_t			*sched;
572 	uint32_t                        flags;
573 	sngss7_group_data_t		rx_cgb;
574 	sngss7_group_data_t		tx_cgb;
575 	sngss7_group_data_t		rx_cgu;
576 	sngss7_group_data_t		tx_cgu;
577 	ftdm_queue_t 			*event_queue;
578 } sngss7_span_data_t;
579 
580 typedef struct sngss7_event_data
581 {
582 	uint32_t		event_id;
583 	uint32_t		spId;
584 	uint32_t		suId;
585 	uint32_t		spInstId;
586 	uint32_t		suInstId;
587 	uint32_t		circuit;
588 	uint8_t			globalFlg;
589 	uint8_t			evntType;
590 	union
591 	{
592 		SiConEvnt	siConEvnt;
593 		SiCnStEvnt	siCnStEvnt;
594 		SiRelEvnt	siRelEvnt;
595 		SiInfoEvnt	siInfoEvnt;
596 		SiFacEvnt	siFacEvnt;
597 		SiStaEvnt	siStaEvnt;
598 		SiSuspEvnt	siSuspEvnt;
599 		SiResmEvnt	siResmEvnt;
600 	} event;
601 } sngss7_event_data_t;
602 
603 
604 typedef enum {
605 	FLAG_RESET_RX			= (1 << 0),
606 	FLAG_RESET_TX			= (1 << 1),
607 	FLAG_RESET_SENT			= (1 << 2),
608 	FLAG_RESET_TX_RSP		= (1 << 3),
609 	FLAG_GRP_RESET_RX		= (1 << 4),
610 	FLAG_GRP_RESET_RX_DN	= (1 << 5),
611 	FLAG_GRP_RESET_RX_CMPLT	= (1 << 6),
612 	FLAG_GRP_RESET_BASE		= (1 << 7),
613 	FLAG_GRP_RESET_TX		= (1 << 8),
614 	FLAG_GRP_RESET_SENT		= (1 << 9),
615 	FLAG_GRP_RESET_TX_RSP	= (1 << 10),
616 	FLAG_REMOTE_REL			= (1 << 11),
617 	FLAG_LOCAL_REL			= (1 << 12),
618 	FLAG_GLARE				= (1 << 13),
619 	FLAG_INFID_RESUME		= (1 << 14),
620 	FLAG_INFID_PAUSED		= (1 << 15),
621 	FLAG_SENT_ACM			= (1 << 16),
622 	FLAG_SENT_CPG			= (1 << 17),
623 	FLAG_SUS_RECVD		    = (1 << 18),
624 	FLAG_T6_CANCELED 		= (1 << 19),
625 	FLAG_INR_TX			= (1 << 20),
626 	FLAG_INR_SENT			= (1 << 21),
627 	FLAG_INR_RX			= (1 << 22),
628 	FLAG_INR_RX_DN			= (1 << 23),
629 	FLAG_INF_TX			= (1 << 24),
630 	FLAG_INF_SENT			= (1 << 25),
631 	FLAG_INF_RX			= (1 << 26),
632 	FLAG_INF_RX_DN			= (1 << 27),
633 	FLAG_FULL_NUMBER			= (1 << 28),
634 	FLAG_RELAY_DOWN			= (1 << 30),
635 	FLAG_CKT_RECONFIG		= (1 << 31)
636 } sng_ckt_flag_t;
637 
638 #define CKT_FLAGS_STRING \
639 	"RX_RSC", \
640 	"TX_RSC", \
641 	"TX_RSC_REQ_SENT", \
642 	"TX_RSC_RSP_RECEIVED", \
643 	"RX_GRS", \
644 	"RX_GRS_DONE", \
645 	"RX_GRS_CMPLT", \
646 	"GRS_BASE", \
647 	"TX_GRS", \
648 	"TX_GRS_REQ_SENT", \
649 	"TX_GRS_RSP_RECEIVED", \
650 	"REMOTE_REL", \
651 	"LOCAL_REL", \
652 	"GLARE", \
653 	"INF_RESUME", \
654 	"INF_PAUSED", \
655 	"TX_ACM_SENT" \
656 	"TX_INR" \
657 	"INR_SENT" \
658 	"RX_INR" \
659 	"RX_INR_DN" \
660 	"TX_INF" \
661 	"INF SENT" \
662 	"RX_INF" \
663 	"RX_INF_DN" \
664 	"RELAY_DOWN", \
665 	"CKT_RECONFIG"
666 FTDM_STR2ENUM_P(ftmod_ss7_ckt_state2flag, ftmod_ss7_ckt_flag2str, sng_ckt_flag_t)
667 
668 /* ckt blocking flags */
669 typedef enum {
670 	FLAG_CKT_UCIC_BLOCK		= (1 << 0),
671 	FLAG_CKT_UCIC_BLOCK_DN	= (1 << 1),
672 	FLAG_CKT_UCIC_UNBLK		= (1 << 2),
673 	FLAG_CKT_UCIC_UNBLK_DN	= (1 << 3),
674 	FLAG_CKT_LC_BLOCK_RX	= (1 << 4),
675 	FLAG_CKT_LC_BLOCK_RX_DN	= (1 << 5),
676 	FLAG_CKT_LC_UNBLK_RX	= (1 << 6),
677 	FLAG_CKT_LC_UNBLK_RX_DN	= (1 << 7),
678 	FLAG_CKT_MN_BLOCK_RX	= (1 << 8),
679 	FLAG_CKT_MN_BLOCK_RX_DN	= (1 << 9),
680 	FLAG_CKT_MN_UNBLK_RX	= (1 << 10),
681 	FLAG_CKT_MN_UNBLK_RX_DN	= (1 << 11),
682 	FLAG_CKT_MN_BLOCK_TX	= (1 << 12),
683 	FLAG_CKT_MN_BLOCK_TX_DN	= (1 << 13),
684 	FLAG_CKT_MN_UNBLK_TX	= (1 << 14),
685 	FLAG_CKT_MN_UNBLK_TX_DN	= (1 << 15),
686 	FLAG_GRP_HW_BLOCK_RX	= (1 << 16),
687 	FLAG_GRP_HW_BLOCK_RX_DN	= (1 << 17),
688 	FLAG_GRP_HW_BLOCK_TX	= (1 << 18),
689 	FLAG_GRP_HW_BLOCK_TX_DN	= (1 << 19),
690 	FLAG_GRP_MN_BLOCK_RX	= (1 << 20),
691 	FLAG_GRP_MN_BLOCK_RX_DN	= (1 << 21),
692 	FLAG_GRP_MN_BLOCK_TX	= (1 << 22),
693 	FLAG_GRP_MN_BLOCK_TX_DN	= (1 << 23),
694 	FLAG_GRP_HW_UNBLK_TX	= (1 << 24),
695 	FLAG_GRP_HW_UNBLK_TX_DN	= (1 << 25),
696 	FLAG_GRP_MN_UNBLK_TX	= (1 << 26),
697 	FLAG_GRP_MN_UNBLK_TX_DN	= (1 << 27),
698 } sng_ckt_block_flag_t;
699 
700 #define BLK_FLAGS_STRING \
701 	"UCIC BLK", \
702 	"UCIC BLK DN", \
703 	"UCIC UNBLK", \
704 	"UCIC UNBLK DN", \
705 	"RX LC BLK", \
706 	"RX LC BLK DN", \
707 	"RX LC UNBLK", \
708 	"RX LC UNBLK DN", \
709 	"RX CKT BLK", \
710 	"RX CKT BLK DN", \
711 	"RX CKT UNBLK", \
712 	"RX CKT UNBLK DN", \
713 	"TX CKT BLK", \
714 	"TX CKT BLK DN", \
715 	"TX CKT UNBLK", \
716 	"TX CKT UNBLK DN", \
717 	"RX GRP HW BLK", \
718 	"RX GRP HW BLK DN", \
719 	"TX GRP HW BLK", \
720 	"TX GRP HW BLK DN", \
721 	"RX GRP MN BLK", \
722 	"RX GRP MN BLK DN", \
723 	"TX GRP MN BLK", \
724 	"TX GRP MN BLK DN", \
725 	"TX GRP HW UNBLK", \
726 	"TX GRP HW UNBLK DN", \
727 	"TX GRP MN UNBLK", \
728 	"TX GRP MN UNBLK DN", \
729 	"RX GRP HW UNBLK", \
730 	"RX GRP HW UNBLK DN"
731 FTDM_STR2ENUM_P(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_flag_t)
732 
733 /* valid for every cfg array except circuits */
734 typedef enum {
735 	SNGSS7_CONFIGURED		= (1 << 0),
736 	SNGSS7_ACTIVE			= (1 << 1),
737 	SNGSS7_RELAY_INIT		= (1 << 3),
738 	SNGSS7_PAUSED			= (1 << 7) /* for isup interfaces */
739 } sng_cfg_flag_t;
740 
741 typedef enum {
742 	SNGSS7_SM_STARTED	= (1 << 0),
743 
744 	SNGSS7_RY_PRESENT	= (1 << 2),
745 	SNGSS7_RY_STARTED	= (1 << 3),
746 
747 	SNGSS7_MTP1_PRESENT	= (1 << 4),
748 	SNGSS7_MTP1_STARTED	= (1 << 5),
749 
750 	SNGSS7_MTP2_PRESENT	= (1 << 6),
751 	SNGSS7_MTP2_STARTED     = (1 << 7),
752 
753 	SNGSS7_MTP3_PRESENT	= (1 << 8),
754 	SNGSS7_MTP3_STARTED     = (1 << 9),
755 
756 	SNGSS7_ISUP_PRESENT	= (1 << 10),
757 	SNGSS7_ISUP_STARTED     = (1 << 11),
758 
759 	SNGSS7_CC_PRESENT	= (1 << 12),
760 	SNGSS7_CC_STARTED       = (1 << 13),
761 
762 	SNGSS7_TUCL_PRESENT	 = (1 << 14),
763 	SNGSS7_TUCL_STARTED      = (1 << 15),
764 
765 	SNGSS7_SCTP_PRESENT	 = (1 << 16),
766 	SNGSS7_SCTP_STARTED      = (1 << 17),
767 
768 	SNGSS7_M2UA_PRESENT	 = (1 << 18),
769 	SNGSS7_M2UA_STARTED      = (1 << 19),
770 	SNGSS7_M2UA_EP_OPENED    = (1 << 20),
771 	SNGSS7_M2UA_INIT_ASSOC_DONE    = (1 << 21),
772 
773 	SNGSS7_NIF_PRESENT	 = (1 << 22),
774 	SNGSS7_NIF_STARTED       = (1 << 23),
775 
776 } sng_task_flag_t;
777 /******************************************************************************/
778 
779 /* GLOBALS ********************************************************************/
780 extern ftdm_sngss7_data_t		g_ftdm_sngss7_data;
781 extern ftdm_sngss7_opr_mode		g_ftdm_operating_mode;
782 extern sng_ssf_type_t			sng_ssf_type_map[];
783 extern sng_switch_type_t		sng_switch_type_map[];
784 extern sng_link_type_t			sng_link_type_map[];
785 extern sng_mtp2_error_type_t	sng_mtp2_error_type_map[];
786 extern sng_cic_cntrl_type_t 	sng_cic_cntrl_type_map[];
787 extern uint32_t					sngss7_id;
788 extern ftdm_sched_t				*sngss7_sched;
789 extern int						cmbLinkSetId;
790 /******************************************************************************/
791 
792 /* PROTOTYPES *****************************************************************/
793 /* in ftmod_sangoma_ss7_main.c */
794 ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan);
795 
796 /* in ftmod_sangoma_ss7_logger.c */
797 void handle_sng_log(uint8_t level, char *fmt,...);
798 void handle_sng_mtp1_alarm(Pst *pst, L1Mngmt *sta);
799 void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta);
800 void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta);
801 void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta);
802 void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta);
803 void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta);
804 void handle_sng_m2ua_alarm(Pst *pst, MwMgmt *sta);
805 void handle_sng_nif_alarm(Pst *pst, NwMgmt *sta);
806 void handle_sng_tucl_alarm(Pst *pst, HiMngmt *sta);
807 void handle_sng_sctp_alarm(Pst *pst, SbMgmt *sta);
808 
809 /* in ftmod_sangoma_ss7_relay.c */
810 ftdm_status_t handle_relay_connect(RyMngmt *sta);
811 ftdm_status_t handle_relay_disconnect_on_down(RyMngmt *sta);
812 ftdm_status_t handle_relay_disconnect_on_error(RyMngmt *sta);
813 
814 /* in ftmod_sangoma_ss7_cfg.c */
815 int ft_to_sngss7_cfg_all(void);
816 int ftmod_ss7_mtp1_gen_config(void);
817 int ftmod_ss7_mtp2_gen_config(void);
818 int ftmod_ss7_mtp3_gen_config(void);
819 int ftmod_ss7_isup_gen_config(void);
820 int ftmod_ss7_cc_gen_config(void);
821 int ftmod_ss7_mtp1_psap_config(int id);
822 int ftmod_ss7_mtp2_dlsap_config(int id);
823 int ftmod_ss7_mtp3_dlsap_config(int id);
824 int ftmod_ss7_mtp3_nsap_config(int id);
825 int ftmod_ss7_mtp3_linkset_config(int id);
826 int ftmod_ss7_mtp3_route_config(int id);
827 int ftmod_ss7_isup_nsap_config(int id);
828 int ftmod_ss7_isup_intf_config(int id);
829 int ftmod_ss7_isup_ckt_config(int id);
830 int ftmod_ss7_isup_isap_config(int id);
831 int ftmod_ss7_cc_isap_config(int id);
832 
833 /* in ftmod_sangoma_ss7_cntrl.c */
834 int  ft_to_sngss7_activate_all(void);
835 
836 int ftmod_ss7_inhibit_mtp3link(uint32_t id);
837 int ftmod_ss7_uninhibit_mtp3link(uint32_t id);
838 int ftmod_ss7_bind_mtp3link(uint32_t id);
839 int ftmod_ss7_unbind_mtp3link(uint32_t id);
840 int ftmod_ss7_activate_mtp3link(uint32_t id);
841 int ftmod_ss7_deactivate_mtp3link(uint32_t id);
842 int ftmod_ss7_deactivate2_mtp3link(uint32_t id);
843 int ftmod_ss7_activate_mtplinkSet(uint32_t id);
844 int ftmod_ss7_deactivate_mtplinkSet(uint32_t id);
845 int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id);
846 int ftmod_ss7_lpo_mtp3link(uint32_t id);
847 int ftmod_ss7_lpr_mtp3link(uint32_t id);
848 
849 int ftmod_ss7_shutdown_isup(void);
850 int ftmod_ss7_shutdown_mtp3(void);
851 int ftmod_ss7_shutdown_mtp2(void);
852 int ftmod_ss7_shutdown_relay(void);
853 int ftmod_ss7_disable_relay_channel(uint32_t chanId);
854 
855 int ftmod_ss7_disable_grp_mtp3Link(uint32_t procId);
856 int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId);
857 
858 int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId);
859 
860 #define ftmod_ss7_block_isup_ckt(x) 		__ftmod_ss7_block_isup_ckt(x,FTDM_TRUE)
861 #define ftmod_ss7_block_isup_ckt_nowait(x) 	__ftmod_ss7_block_isup_ckt(x,FTDM_FALSE)
862 int __ftmod_ss7_block_isup_ckt(uint32_t cktId, ftdm_bool_t wait);
863 int ftmod_ss7_unblock_isup_ckt(uint32_t cktId);
864 
865 
866 /* in ftmod_sangoma_ss7_sta.c */
867 int ftmod_ss7_mtp1link_sta(uint32_t id, L1Mngmt *cfm);
868 int ftmod_ss7_mtp2link_sta(uint32_t id, SdMngmt *cfm);
869 int ftmod_ss7_mtp3link_sta(uint32_t id, SnMngmt *cfm);
870 int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm);
871 int ftmod_ss7_isup_intf_sta(uint32_t id, uint8_t *status);
872 int ftmod_ss7_relay_status(uint32_t id, RyMngmt *cfm);
873 int ftmod_ss7_isup_ckt_sta(uint32_t id, unsigned char *state);
874 
875 
876 /* in ftmod_sangoma_ss7_out.c */
877 void ft_to_sngss7_iam(ftdm_channel_t *ftdmchan);
878 void ft_to_sngss7_acm(ftdm_channel_t *ftdmchan);
879 void ft_to_sngss7_cpg (ftdm_channel_t *ftdmchan);
880 void ft_to_sngss7_anm(ftdm_channel_t *ftdmchan);
881 void ft_to_sngss7_rel(ftdm_channel_t *ftdmchan);
882 void ft_to_sngss7_rlc(ftdm_channel_t *ftdmchan);
883 void ft_to_sngss7_rsc(ftdm_channel_t *ftdmchan);
884 void ft_to_sngss7_rsca(ftdm_channel_t *ftdmchan);
885 void ft_to_sngss7_blo(ftdm_channel_t *ftdmchan);
886 void ft_to_sngss7_bla(ftdm_channel_t *ftdmchan);
887 void ft_to_sngss7_ubl(ftdm_channel_t *ftdmchan);
888 void ft_to_sngss7_uba(ftdm_channel_t *ftdmchan);
889 void ft_to_sngss7_lpa(ftdm_channel_t *ftdmchan);
890 void ft_to_sngss7_gra(ftdm_channel_t *ftdmchan);
891 void ft_to_sngss7_grs(ftdm_channel_t *ftdmchan);
892 void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan);
893 void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan);
894 void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan);
895 void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan);
896 void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan);
897 void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan);
898 void ft_to_sngss7_inr(ftdm_channel_t * ftdmchan);
899 void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan, SiCnStEvnt *inr);
900 
901 
902 
903 /* in ftmod_sangoma_ss7_in.c */
904 void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
905 void sngss7_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt);
906 void sngss7_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt);
907 void sngss7_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType);
908 void sngss7_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt);
909 void sngss7_rel_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt);
910 void sngss7_dat_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiInfoEvnt *siInfoEvnt);
911 void sngss7_fac_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt);
912 void sngss7_fac_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt);
913 void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
914 void sngss7_umsg_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit);
915 void sngss7_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiResmEvnt *siResmEvnt);
916 void sngss7_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiSuspEvnt *siSuspEvnt);
917 void sngss7_ssp_sta_cfm(uint32_t infId);
918 
919 ftdm_status_t sngss7_bufferzero_iam(SiConEvnt *siConEvnt);
920 ftdm_status_t sngss7_retrieve_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt);
921 ftdm_status_t sngss7_save_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt);
922 
923 /* in ftmod_sangoma_ss7_handle.c */
924 ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt);
925 ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType);
926 ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt);
927 ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt);
928 ftdm_status_t handle_rel_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiRelEvnt *siRelEvnt);
929 ftdm_status_t handle_dat_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiInfoEvnt *siInfoEvnt);
930 ftdm_status_t handle_fac_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt);
931 ftdm_status_t handle_fac_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t evntType, SiFacEvnt *siFacEvnt);
932 ftdm_status_t handle_umsg_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit);
933 ftdm_status_t handle_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiSuspEvnt *siSuspEvnt);
934 ftdm_status_t handle_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiResmEvnt *siResmEvnt);
935 ftdm_status_t handle_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
936 
937 ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
938 ftdm_status_t handle_pause(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
939 ftdm_status_t handle_resume(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
940 ftdm_status_t handle_cot_start(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
941 ftdm_status_t handle_cot_stop(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
942 ftdm_status_t handle_cot(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
943 ftdm_status_t handle_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
944 ftdm_status_t handle_local_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
945 ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
946 ftdm_status_t handle_grs_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
947 ftdm_status_t handle_grs_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
948 ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
949 ftdm_status_t handle_blo_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
950 ftdm_status_t handle_ubl_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
951 ftdm_status_t handle_ubl_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
952 ftdm_status_t handle_local_blk(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
953 ftdm_status_t handle_local_ubl(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
954 ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt);
955 
956 /* in ftmod_sangoma_ss7_xml.c */
957 int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span);
958 
959 /* in ftmod_sangoma_ss7_cli.c */
960 ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const char *data);
961 
962 /* in ftmod_sangoma_ss7_support.c */
963 ftdm_status_t copy_cgPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum);
964 ftdm_status_t copy_cgPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum);
965 ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum);
966 ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum);
967 ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
968 ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
969 ftdm_status_t copy_redirgInfo_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo);
970 ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *redirInfo);
971 ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum);
972 ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum);
973 
974 ftdm_status_t copy_access_transport_from_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt);
975 ftdm_status_t copy_access_transport_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt);
976 ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum);
977 ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum);
978 ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb);
979 ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb);
980 ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat);
981 ftdm_status_t copy_cgPtyCat_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat);
982 ftdm_status_t copy_accTrnspt_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt);
983 ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd);
984 ftdm_status_t copy_fwdCallInd_hex_from_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd);
985 ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd);
986 ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq);
987 ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA);
988 ftdm_status_t copy_NatureOfConnection_from_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd );
989 ftdm_status_t copy_NatureOfConnection_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd);
990 
991 ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
992 ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
993 ftdm_status_t copy_tknStr_to_sngss7(char* str, TknStr *tknStr, TknU8 *oddEven);
994 
995 int check_for_state_change(ftdm_channel_t *ftdmchan);
996 int check_for_reset(sngss7_chan_data_t *sngss7_info);
997 ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan);
998 unsigned long get_unique_id(void);
999 
1000 ftdm_status_t check_if_rx_grs_started(ftdm_span_t *ftdmspan);
1001 ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan);
1002 ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan);
1003 ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan);
1004 
1005 ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan);
1006 
1007 ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info);
1008 ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info);
1009 ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info);
1010 ftdm_status_t clear_tx_rsc_flags(sngss7_chan_data_t *sngss7_info);
1011 ftdm_status_t clear_rx_grs_data(sngss7_chan_data_t *sngss7_info);
1012 ftdm_status_t clear_rx_gra_data(sngss7_chan_data_t *sngss7_info);
1013 ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info);
1014 
1015 ftdm_status_t encode_subAddrIE_nsap(const char *subAddr, char *subAddrIE, int type);
1016 ftdm_status_t encode_subAddrIE_nat(const char *subAddr, char *subAddrIE, int type);
1017 
1018 int find_mtp2_error_type_in_map(const char *err_type);
1019 int find_link_type_in_map(const char *linkType);
1020 int find_switch_type_in_map(const char *switchType);
1021 int find_ssf_type_in_map(const char *ssfType);
1022 int find_cic_cntrl_in_map(const char *cntrlType);
1023 
1024 ftdm_status_t check_status_of_all_isup_intf(void);
1025 ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan);
1026 
1027 void sngss7_send_signal(sngss7_chan_data_t *sngss7_info, ftdm_signal_event_t event_id);
1028 void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_status_t status);
1029 ftdm_status_t sngss7_add_var(sngss7_chan_data_t *ss7_info, const char* var, const char* val);
1030 ftdm_status_t sngss7_add_raw_data(sngss7_chan_data_t *sngss7_info, uint8_t* data, ftdm_size_t data_len);
1031 
1032 /* in ftmod_sangoma_ss7_timers.c */
1033 void handle_isup_t35(void *userdata);
1034 void handle_isup_t10(void *userdata);
1035 void handle_isup_t39(void *userdata);
1036 
1037 
1038 /******************************************************************************/
1039 
1040 /* MACROS *********************************************************************/
1041 #define SS7_STATE_CHANGE(ftdmchan, new_state) \
1042 if (ftdmchan->state == new_state) { \
1043 	ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_IDLE); \
1044 } else { \
1045 	ftdm_set_state(ftdmchan, new_state); \
1046 }
1047 
1048 #define SS7_DEBUG(a,...)	ftdm_log(FTDM_LOG_DEBUG,a , ##__VA_ARGS__ );
1049 #define SS7_INFO(a,...)	 ftdm_log(FTDM_LOG_INFO,a , ##__VA_ARGS__ );
1050 #define SS7_WARN(a,...)	 ftdm_log(FTDM_LOG_WARNING,a , ##__VA_ARGS__ );
1051 #define SS7_ERROR(a,...)	ftdm_log(FTDM_LOG_ERROR,a , ##__VA_ARGS__ );
1052 #define SS7_CRITICAL(a,...) ftdm_log(FTDM_LOG_CRIT,a , ##__VA_ARGS__ );
1053 
1054 #define SS7_DEBUG_CHAN(fchan, msg, args...)	ftdm_log_chan(fchan, FTDM_LOG_DEBUG, msg , ##args)
1055 #define SS7_INFO_CHAN(fchan, msg, args...)	ftdm_log_chan(fchan, FTDM_LOG_INFO, msg , ##args)
1056 #define SS7_WARN_CHAN(fchan, msg, args...)	ftdm_log_chan(fchan, FTDM_LOG_WARNING, msg , ##args)
1057 #define SS7_ERROR_CHAN(fchan, msg, args...)	ftdm_log_chan(fchan, FTDM_LOG_ERROR, msg , ##args)
1058 #define SS7_CRIT_CHAN(fchan, msg, args...)	ftdm_log_chan(fchan, FTDM_LOG_CRIT, msg , ##args)
1059 
1060 #ifdef SS7_CODE_DEVEL
1061 #define SS7_DEVEL_DEBUG(a,...)   ftdm_log(FTDM_LOG_DEBUG,a,##__VA_ARGS__ );
1062 #else
1063 #define SS7_DEVEL_DEBUG(a,...)
1064 #endif
1065 
1066 #define SS7_FUNC_TRACE_ENTER(a) if (g_ftdm_sngss7_data.function_trace) { \
1067 									switch (g_ftdm_sngss7_data.function_trace_level) { \
1068 										case 0: \
1069 											ftdm_log(FTDM_LOG_EMERG,"Entering %s\n", a); \
1070 											break; \
1071 										case 1: \
1072 											ftdm_log(FTDM_LOG_ALERT,"Entering %s\n", a); \
1073 											break; \
1074 										case 2: \
1075 											ftdm_log(FTDM_LOG_CRIT,"Entering %s\n", a); \
1076 											break; \
1077 										case 3: \
1078 											ftdm_log(FTDM_LOG_ERROR,"Entering %s\n", a); \
1079 											break; \
1080 										case 4: \
1081 											ftdm_log(FTDM_LOG_WARNING,"Entering %s\n", a); \
1082 											break; \
1083 										case 5: \
1084 											ftdm_log(FTDM_LOG_NOTICE,"Entering %s\n", a); \
1085 											break; \
1086 										case 6: \
1087 											ftdm_log(FTDM_LOG_INFO,"Entering %s\n", a); \
1088 											break; \
1089 										case 7: \
1090 											ftdm_log(FTDM_LOG_DEBUG,"Entering %s\n", a); \
1091 											break; \
1092 										default: \
1093 											ftdm_log(FTDM_LOG_INFO,"Entering %s\n", a); \
1094 											break; \
1095 										} /* switch (g_ftdm_sngss7_data.function_trace_level) */ \
1096 								} /*  if(g_ftdm_sngss7_data.function_trace) */
1097 
1098 #define SS7_FUNC_TRACE_EXIT(a) if (g_ftdm_sngss7_data.function_trace) { \
1099 									switch (g_ftdm_sngss7_data.function_trace_level) { \
1100 										case 0: \
1101 											ftdm_log(FTDM_LOG_EMERG,"Exiting %s\n", a); \
1102 											break; \
1103 										case 1: \
1104 											ftdm_log(FTDM_LOG_ALERT,"Exiting %s\n", a); \
1105 											break; \
1106 										case 2: \
1107 											ftdm_log(FTDM_LOG_CRIT,"Exiting %s\n", a); \
1108 											break; \
1109 										case 3: \
1110 											ftdm_log(FTDM_LOG_ERROR,"Exiting %s\n", a); \
1111 											break; \
1112 										case 4: \
1113 											ftdm_log(FTDM_LOG_WARNING,"Exiting %s\n", a); \
1114 											break; \
1115 										case 5: \
1116 											ftdm_log(FTDM_LOG_NOTICE,"Exiting %s\n", a); \
1117 											break; \
1118 										case 6: \
1119 											ftdm_log(FTDM_LOG_INFO,"Exiting %s\n", a); \
1120 											break; \
1121 										case 7: \
1122 											ftdm_log(FTDM_LOG_DEBUG,"Exiting %s\n", a); \
1123 											break; \
1124 										default: \
1125 											ftdm_log(FTDM_LOG_INFO,"Exiting %s\n", a); \
1126 											break; \
1127 										} /* switch (g_ftdm_sngss7_data.function_trace_level) */ \
1128 								} /*  if(g_ftdm_sngss7_data.function_trace) */
1129 
1130 #define SS7_MSG_TRACE(fchan, sngss7info ,msg) if (g_ftdm_sngss7_data.message_trace) { \
1131 								switch (g_ftdm_sngss7_data.message_trace_level) { \
1132 									case 0: \
1133 										ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1134 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1135 										break; \
1136 									case 1: \
1137 										ftdm_log_chan(fchan, FTDM_LOG_ALERT, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1138 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1139 										break; \
1140 									case 2: \
1141 										ftdm_log_chan(fchan, FTDM_LOG_CRIT, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1142 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1143 										break; \
1144 									case 3: \
1145 										ftdm_log_chan(fchan, FTDM_LOG_ERROR, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1146 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1147 										break; \
1148 									case 4: \
1149 										ftdm_log_chan(fchan, FTDM_LOG_WARNING, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1150 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1151 										break; \
1152 									case 5: \
1153 										ftdm_log_chan(fchan, FTDM_LOG_NOTICE, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1154 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1155 										break; \
1156 									case 6: \
1157 										ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1158 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1159 										break; \
1160 									case 7: \
1161 										ftdm_log_chan(fchan, FTDM_LOG_DEBUG, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1162 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1163 										break; \
1164 									default: \
1165 										ftdm_log_chan(fchan, FTDM_LOG_INFO, "[CIC:%d][SPINSTID:%d][SUINSTID:%d]%s", \
1166 														sngss7info->circuit->cic,sngss7info->spInstId,sngss7info->suInstId, msg); \
1167 										break; \
1168 									} /* switch (g_ftdm_sngss7_data.message_trace_level) */ \
1169 							} /* if(g_ftdm_sngss7_data.message_trace) */
1170 
1171 #define sngss7_test_flag(obj, flag)  ((obj)->flags & flag)
1172 #define sngss7_clear_flag(obj, flag) ((obj)->flags &= ~(flag))
1173 #define sngss7_set_flag(obj, flag)   ((obj)->flags |= (flag))
1174 
1175 #define sngss7_test_ckt_flag(obj, flag)  ((obj)->ckt_flags & flag)
1176 #define sngss7_clear_ckt_flag(obj, flag) ((obj)->ckt_flags &= ~(flag))
1177 #define sngss7_set_ckt_flag(obj, flag)   ((obj)->ckt_flags |= (flag))
1178 
1179 #define sngss7_test_ckt_blk_flag(obj, flag)  ((obj)->blk_flags & flag)
1180 #define sngss7_clear_ckt_blk_flag(obj, flag) ((obj)->blk_flags &= ~(flag))
1181 #define sngss7_set_ckt_blk_flag(obj, flag)   ((obj)->blk_flags |= (flag))
1182 
1183 #define sngss7_test_options(obj, option) ((obj)->options & option)
1184 #define sngss7_clear_options(obj, option) ((obj)->options &= ~(option))
1185 #define sngss7_set_options(obj, option)   ((obj)->options |= (option))
1186 
1187 #define sngss7_tx_block_status_clear(obj) (!sngss7_test_ckt_blk_flag(obj, (FLAG_CKT_MN_BLOCK_TX | \
1188 								           FLAG_CKT_MN_BLOCK_TX_DN | \
1189 									   FLAG_GRP_MN_BLOCK_TX | \
1190 									   FLAG_GRP_MN_BLOCK_TX_DN | \
1191 									   FLAG_GRP_HW_BLOCK_TX | \
1192 									   FLAG_GRP_HW_BLOCK_TX_DN | \
1193 			       						   FLAG_GRP_HW_UNBLK_TX | \
1194 									   FLAG_CKT_MN_UNBLK_TX	)))
1195 
1196 #define sngss7_block_status_clear(obj) (obj->blk_flags == 0)
1197 
1198 #define sngss7_reset_status_clear(obj) (!sngss7_test_ckt_flag(obj, (FLAG_RESET_TX | \
1199 														    FLAG_RESET_RX | \
1200 														  	FLAG_GRP_RESET_TX | \
1201 														  	FLAG_GRP_RESET_RX )))
1202 
1203 #define sngss7_tx_reset_sent(obj) ((sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) && \
1204 											  sngss7_test_ckt_flag(obj, (FLAG_RESET_SENT))) || \
1205 											 (sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)) && \
1206 											  sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_SENT))))
1207 
1208 #define sngss7_tx_reset_status_pending(obj) (sngss7_test_ckt_flag(obj, (FLAG_RESET_TX)) || sngss7_test_ckt_flag(obj, (FLAG_GRP_RESET_TX)))
1209 
1210 #define sngss7_channel_status_clear(obj) ((sngss7_block_status_clear(obj)) && \
1211 					  					  (sngss7_reset_status_clear(obj)) && \
1212 										  (!sngss7_test_ckt_flag((obj),FLAG_INFID_PAUSED)))
1213 
1214 #define sngss7_tx_reset_restart(obj) do { clear_tx_grs_flags((obj)); \
1215 										  clear_tx_grs_data((obj)); \
1216             							  clear_tx_rsc_flags((obj)); \
1217 										  sngss7_set_ckt_flag((obj), (FLAG_RESET_TX)); \
1218 								     } while (0);
1219 
1220 
1221 
1222 #ifdef SMG_RELAY_DBG
1223 #define SS7_RELAY_DBG(a,...)	printf(a"\n", ##__VA_ARGS__)
1224 #define SS7_RELAY_DBG_FUN(a)	printf(#a"\n")
1225 #else
1226 #define SS7_RELAY_DBG(a, ...)
1227 #define SS7_RELAY_DBG_FUN(a)
1228 #endif
1229 /******************************************************************************/
1230 
1231 /******************************************************************************/
1232 #endif /* __FTMOD_SNG_SS7_H__ */
1233 /******************************************************************************/
1234 
1235 /******************************************************************************/
1236 /* For Emacs:
1237  * Local Variables:
1238  * mode:c
1239  * indent-tabs-mode:t
1240  * tab-width:4
1241  * c-basic-offset:4
1242  * End:
1243  * For VIM:
1244  * vim:set softtabstop=4 shiftwidth=4 tabstop=4 noet:
1245  */
1246 /******************************************************************************/
1247