1 /*
2  * Copyright (c) 2012, Kapil Gupta <kgupta@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  *
37  */
38 
39 /* INCLUDE ********************************************************************/
40 #include "ftmod_sangoma_ss7_main.h"
41 /******************************************************************************/
42 
43 /* DEFINES ********************************************************************/
44 /******************************************************************************/
45 /* FUNCTION PROTOTYPES ********************************************************/
46 static int ftmod_tucl_gen_config(void);
47 static int ftmod_tucl_sap_config(int id);
48 static int ftmod_sctp_gen_config(void);
49 static int ftmod_cfg_sctp(void);
50 static int ftmod_sctp_config(int id);
51 static ftdm_status_t ftmod_sctp_sap_config(int id);
52 static ftdm_status_t ftmod_sctp_tsap_config(int id);
53 static int ftmod_m2ua_gen_config(void);
54 static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id);
55 static int ftmod_m2ua_peer_config(int id);
56 static int ftmod_m2ua_peer_config1(int m2ua_inf_id, int peer_id);
57 static int ftmod_m2ua_cluster_config(int idx);
58 static int ftmod_m2ua_dlsap_config(int idx);
59 static int ftmod_nif_gen_config(void);
60 static int ftmod_nif_dlsap_config(int idx);
61 static int ftmod_sctp_tucl_tsap_bind(int idx);
62 static int ftmod_m2ua_sctp_sctsap_bind(int idx);
63 static int ftmod_open_endpoint(int idx);
64 static int ftmod_init_sctp_assoc(int peer_id);
65 static int ftmod_nif_m2ua_dlsap_bind(int id);
66 static int ftmod_nif_mtp2_dlsap_bind(int id);
67 static int ftmod_m2ua_debug(int action);
68 static int ftmod_tucl_debug(int action);
69 static int ftmod_sctp_debug(int action);
70 
71 static int ftmod_ss7_sctp_shutdown(void);
72 static int ftmod_ss7_m2ua_shutdown(void);
73 static int ftmod_ss7_tucl_shutdown(void);
74 
75 
76 /******************************************************************************/
ftmod_ss7_m2ua_init(void)77 ftdm_status_t ftmod_ss7_m2ua_init(void)
78 {
79 	/****************************************************************************************************/
80 	if (sng_isup_init_nif()) {
81 		ftdm_log (FTDM_LOG_ERROR , "Failed to start NIF\n");
82 		return FTDM_FAIL;
83 	} else {
84 		ftdm_log (FTDM_LOG_INFO ,"Started NIF!\n");
85 	}
86 	/****************************************************************************************************/
87 
88 	if (sng_isup_init_m2ua()) {
89 		ftdm_log (FTDM_LOG_ERROR ,"Failed to start M2UA\n");
90 		return FTDM_FAIL;
91 	} else {
92 		ftdm_log (FTDM_LOG_INFO ,"Started M2UA!\n");
93 	}
94 	/****************************************************************************************************/
95 
96 	if (sng_isup_init_sctp()) {
97 		ftdm_log (FTDM_LOG_ERROR ,"Failed to start SCTP\n");
98 		return FTDM_FAIL;
99 	} else {
100 		ftdm_log (FTDM_LOG_INFO ,"Started SCTP!\n");
101 	}
102 	/****************************************************************************************************/
103 
104 	if (sng_isup_init_tucl()) {
105 		ftdm_log (FTDM_LOG_ERROR ,"Failed to start TUCL\n");
106 		return FTDM_FAIL;
107 	} else {
108 		ftdm_log (FTDM_LOG_INFO ,"Started TUCL!\n");
109 		sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_TUCL_PRESENT);
110 	}
111 	/****************************************************************************************************/
112 
113 	if(ftmod_tucl_gen_config()){
114 		ftdm_log (FTDM_LOG_ERROR ,"TUCL GEN configuration: NOT OK\n");
115 		return FTDM_FAIL;
116 	} else {
117 		ftdm_log (FTDM_LOG_INFO ,"TUCL GEN configuration: OK\n");
118 	}
119 	/****************************************************************************************************/
120 	if(ftmod_sctp_gen_config()){
121 		ftdm_log (FTDM_LOG_ERROR ,"SCTP GEN configuration: NOT OK\n");
122 		return FTDM_FAIL;
123 	} else {
124 		ftdm_log (FTDM_LOG_INFO ,"SCTP GEN configuration: OK\n");
125 	}
126 	/****************************************************************************************************/
127 	if(ftmod_m2ua_gen_config()) {
128 		ftdm_log (FTDM_LOG_ERROR ,"M2UA General configuration: NOT OK\n");
129 		return FTDM_FAIL;
130 	}else {
131 		ftdm_log (FTDM_LOG_INFO ,"M2UA General configuration: OK\n");
132 	}
133 	/****************************************************************************************************/
134 	if(ftmod_nif_gen_config()){
135 		ftdm_log (FTDM_LOG_ERROR ,"NIF General configuration: NOT OK\n");
136 		return FTDM_FAIL;
137 	}else {
138 		ftdm_log (FTDM_LOG_INFO ,"NIF General configuration: OK\n");
139 	}
140 	/****************************************************************************************************/
141 
142 
143 	return FTDM_SUCCESS;
144 }
145 
146 /******************************************************************************/
ftmod_ss7_m2ua_free()147 void ftmod_ss7_m2ua_free()
148 {
149 	if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_PRESENT)) {
150 		ftmod_ss7_m2ua_shutdown();
151 		sng_isup_free_m2ua();
152 	}
153 	if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_PRESENT)) {
154 		ftmod_ss7_sctp_shutdown();
155 		sng_isup_free_sctp();
156 	}
157 	if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_TUCL_PRESENT)) {
158 		ftmod_ss7_tucl_shutdown();
159 		sng_isup_free_tucl();
160 	}
161 }
162 
163 /******************************************************************************/
ftmod_ss7_tucl_shutdown()164 static int ftmod_ss7_tucl_shutdown()
165 {
166 	Pst pst;
167 	HiMngmt cntrl;
168 
169 	memset((U8 *)&pst, 0, sizeof(Pst));
170 	memset((U8 *)&cntrl, 0, sizeof(HiMngmt));
171 
172 	smPstInit(&pst);
173 
174 	pst.dstEnt = ENTHI;
175 
176 	/* prepare header */
177 	cntrl.hdr.msgType     = TCNTRL;         /* message type */
178 	cntrl.hdr.entId.ent   = ENTHI;          /* entity */
179 	cntrl.hdr.entId.inst  = 0;              /* instance */
180 	cntrl.hdr.elmId.elmnt = STGEN;       /* General */
181 
182 	cntrl.hdr.response.selector    = 0;
183 	cntrl.hdr.response.prior       = PRIOR0;
184 	cntrl.hdr.response.route       = RTESPEC;
185 	cntrl.hdr.response.mem.region  = S_REG;
186 	cntrl.hdr.response.mem.pool    = S_POOL;
187 
188 	cntrl.t.cntrl.action    = ASHUTDOWN;
189 
190 	return (sng_cntrl_tucl (&pst, &cntrl));
191 }
192 /******************************************************************************/
ftmod_ss7_m2ua_shutdown()193 static int ftmod_ss7_m2ua_shutdown()
194 {
195 	Pst pst;
196 	MwMgmt cntrl;
197 
198 	memset((U8 *)&pst, 0, sizeof(Pst));
199 	memset((U8 *)&cntrl, 0, sizeof(MwMgmt));
200 
201 	smPstInit(&pst);
202 
203 	pst.dstEnt = ENTMW;
204 
205 	/* prepare header */
206 	cntrl.hdr.msgType     = TCNTRL;         /* message type */
207 	cntrl.hdr.entId.ent   = ENTMW;          /* entity */
208 	cntrl.hdr.entId.inst  = 0;              /* instance */
209 	cntrl.hdr.elmId.elmnt = STMWGEN;       /* General */
210 
211 	cntrl.hdr.response.selector    = 0;
212 	cntrl.hdr.response.prior       = PRIOR0;
213 	cntrl.hdr.response.route       = RTESPEC;
214 	cntrl.hdr.response.mem.region  = S_REG;
215 	cntrl.hdr.response.mem.pool    = S_POOL;
216 
217 	cntrl.t.cntrl.action = ASHUTDOWN;
218 
219 	return (sng_cntrl_m2ua (&pst, &cntrl));
220 }
221 /***********************************************************************************************************************/
ftmod_ss7_sctp_shutdown()222 static int ftmod_ss7_sctp_shutdown()
223 {
224 	Pst pst;
225 	SbMgmt cntrl;
226 
227 	memset((U8 *)&pst, 0, sizeof(Pst));
228 	memset((U8 *)&cntrl, 0, sizeof(SbMgmt));
229 
230 	smPstInit(&pst);
231 
232 	pst.dstEnt = ENTSB;
233 
234 	/* prepare header */
235 	cntrl.hdr.msgType     = TCNTRL;         /* message type */
236 	cntrl.hdr.entId.ent   = ENTSB;          /* entity */
237 	cntrl.hdr.entId.inst  = 0;              /* instance */
238 	cntrl.hdr.elmId.elmnt = STSBGEN;       /* General */
239 
240 	cntrl.hdr.response.selector    = 0;
241 	cntrl.hdr.response.prior       = PRIOR0;
242 	cntrl.hdr.response.route       = RTESPEC;
243 	cntrl.hdr.response.mem.region  = S_REG;
244 	cntrl.hdr.response.mem.pool    = S_POOL;
245 
246 	cntrl.t.cntrl.action = ASHUTDOWN;
247 
248 	return (sng_cntrl_sctp (&pst, &cntrl));
249 }
250 
251 /******************************************************************************/
252 
253 
254 
ftmod_ss7_m2ua_cfg(void)255 ftdm_status_t ftmod_ss7_m2ua_cfg(void)
256 {
257 	int x=0;
258 
259 	/* SCTP configuration */
260 	if(ftmod_cfg_sctp()){
261 		ftdm_log (FTDM_LOG_ERROR ,"SCTP Configuration : NOT OK\n");
262 		return FTDM_FAIL;
263 	} else {
264 		ftdm_log (FTDM_LOG_INFO ,"SCTP Configuration : OK\n");
265 	}
266 
267 	/****************************************************************************************************/
268 	/* M2UA SCTP SAP configurations */
269 	x = 1;
270 	while(x<MW_MAX_NUM_OF_INTF){
271 		if((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0) &&
272 				(!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_CONFIGURED))) {
273 
274 			/****************************************************************************************************/
275 			/* M2UA PEER configurations */
276 
277 			if(ftmod_m2ua_peer_config(x)) {
278 				ftdm_log (FTDM_LOG_ERROR ,"M2UA PEER configuration for M2UA INTF[%d] : NOT OK\n", x);
279 				return FTDM_FAIL;
280 			}else {
281 				ftdm_log (FTDM_LOG_INFO ,"M2UA PEER configuration for M2UA INTF[%d] : OK\n", x);
282 			}
283 			/****************************************************************************************************/
284 			/* M2UA Cluster configurations */
285 
286 			if(ftmod_m2ua_cluster_config(x)) {
287 				ftdm_log (FTDM_LOG_ERROR ,"M2UA CLUSTER configuration for M2UA INTF[%d] : NOT OK\n", x);
288 				return FTDM_FAIL;
289 			}else {
290 				ftdm_log (FTDM_LOG_INFO ,"M2UA CLUSTER configuration for M2UA INTF[%d]: OK\n", x);
291 			}
292 
293 			/****************************************************************************************************/
294 
295 			/* Send the USAP (DLSAP) configuration request for M2UA layer; fill the number
296 			 * of saps required to be configured. Max is 3 */
297 			if(ftmod_m2ua_dlsap_config(x)) {
298 				ftdm_log (FTDM_LOG_ERROR ,"M2UA DLSAP[%d] configuration: NOT OK\n", x);
299 				return FTDM_FAIL;
300 			}else {
301 				ftdm_log (FTDM_LOG_INFO ,"M2UA DLSAP[%d] configuration: OK\n", x);
302 			}
303 		} /* END - SNGSS7_CONFIGURED */
304 		g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags |= SNGSS7_CONFIGURED;
305 		x++;
306 	}/* END - M2UA Interfaces for loop*/
307 /****************************************************************************************************/
308 	/* NIF DLSAP */
309 
310 	x = 1;
311 	while(x<MW_MAX_NUM_OF_INTF){
312 		if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].id !=0) &&
313 				(!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags & SNGSS7_CONFIGURED))) {
314 			if(ftmod_nif_dlsap_config(x)) {
315 				ftdm_log (FTDM_LOG_ERROR ,"NIF DLSAP[%d] configuration: NOT OK\n", x);
316 				return FTDM_FAIL;
317 			}else{
318 				ftdm_log (FTDM_LOG_INFO ,"NIF DLSAP[%d] configuration: OK\n", x);
319 			}
320 		}
321 		g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags |= SNGSS7_CONFIGURED;
322 		x++;
323 	}
324 
325 	/* successfully started all the layers , not SET STARTED FLAGS */
326 	sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_NIF_STARTED);
327 	sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_M2UA_STARTED);
328 	sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SCTP_STARTED);
329 	sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_TUCL_STARTED);
330 
331 
332 	return 0;
333 }
334 
335 /****************************************************************************************************/
ftmod_tucl_gen_config(void)336 static int ftmod_tucl_gen_config(void)
337 {
338 	HiMngmt cfg;
339 	Pst             pst;
340 
341 	/* initalize the post structure */
342 	smPstInit(&pst);
343 
344 	/* insert the destination Entity */
345 	pst.dstEnt = ENTHI;
346 
347 	/* clear the configuration structure */
348 	memset(&cfg, 0, sizeof(cfg));
349 
350 	/* fill in the post structure */
351 	smPstInit(&cfg.t.cfg.s.hiGen.lmPst);
352 	/*fill in the specific fields of the header */
353 	cfg.hdr.msgType                 		= TCFG;
354 	cfg.hdr.entId.ent               		= ENTHI;
355 	cfg.hdr.entId.inst              		= S_INST;
356 	cfg.hdr.elmId.elmnt     			= STGEN;
357 
358 	cfg.t.cfg.s.hiGen.numSaps                       = HI_MAX_SAPS;          		/* number of SAPs */
359 	cfg.t.cfg.s.hiGen.numCons                       = HI_MAX_NUM_OF_CON;    		/* maximum num of connections */
360 	cfg.t.cfg.s.hiGen.numFdsPerSet                  = HI_MAX_NUM_OF_FD_PER_SET;     	/* maximum num of fds to use per set */
361 	cfg.t.cfg.s.hiGen.numFdBins                     = HI_MAX_NUM_OF_FD_HASH_BINS;   	/* for fd hash lists */
362 	cfg.t.cfg.s.hiGen.numClToAccept                 = HI_MAX_NUM_OF_CLIENT_TO_ACCEPT; 	/* clients to accept simultaneously */
363 	cfg.t.cfg.s.hiGen.permTsk                       = TRUE;                 		/* schedule as perm task or timer */
364 	cfg.t.cfg.s.hiGen.schdTmrVal                    = HI_MAX_SCHED_TMR_VALUE;               /* if !permTsk - probably ignored */
365 	cfg.t.cfg.s.hiGen.selTimeout                    = HI_MAX_SELECT_TIMEOUT_VALUE;          /* select() timeout */
366 
367 	/* number of raw/UDP messages to read in one iteration */
368 	cfg.t.cfg.s.hiGen.numRawMsgsToRead              = HI_MAX_RAW_MSG_TO_READ;
369 	cfg.t.cfg.s.hiGen.numUdpMsgsToRead              = HI_MAX_UDP_MSG_TO_READ;
370 
371 	/* thresholds for congestion on the memory pool */
372 	cfg.t.cfg.s.hiGen.poolStrtThr                   = HI_MEM_POOL_START_THRESHOLD;
373 	cfg.t.cfg.s.hiGen.poolDropThr                   = HI_MEM_POOL_DROP_THRESHOLD;
374 	cfg.t.cfg.s.hiGen.poolStopThr                   = HI_MEM_POOL_STOP_THRESHOLD;
375 
376 	cfg.t.cfg.s.hiGen.timeRes                       = SI_PERIOD;        /* time resolution */
377 
378 #ifdef HI_SPECIFY_GENSOCK_ADDR
379 	cfg.t.cfg.s.hiGen.ipv4GenSockAddr.address = CM_INET_INADDR_ANY;
380 	cfg.t.cfg.s.hiGen.ipv4GenSockAddr.port  = 0;                            /* DAVIDY - why 0? */
381 #ifdef IPV6_SUPPORTED
382 	cfg.t.cfg.s.hiGen.ipv6GenSockAddr.address = CM_INET_INADDR6_ANY;
383 	cfg.t.cfg.s.hiGen.ipv4GenSockAddr.port  = 0;
384 #endif
385 #endif
386 
387 	return(sng_cfg_tucl(&pst, &cfg));
388 }
389 /****************************************************************************************************/
390 
ftmod_tucl_sap_config(int id)391 static int ftmod_tucl_sap_config(int id)
392 {
393         HiMngmt cfg;
394         Pst     pst;
395         HiSapCfg  *pCfg;
396 
397 	sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id];
398 
399         /* initalize the post structure */
400         smPstInit(&pst);
401 
402         /* insert the destination Entity */
403         pst.dstEnt = ENTHI;
404 
405         /* clear the configuration structure */
406         memset(&cfg, 0, sizeof(cfg));
407 
408 	/*fill LM  post structure*/
409 	cfg.t.cfg.s.hiGen.lmPst.dstProcId   = SFndProcId();
410 	cfg.t.cfg.s.hiGen.lmPst.dstInst     = S_INST;
411 
412 	cfg.t.cfg.s.hiGen.lmPst.dstProcId   = SFndProcId();
413 	cfg.t.cfg.s.hiGen.lmPst.dstEnt      = ENTSM;
414 	cfg.t.cfg.s.hiGen.lmPst.dstInst     = S_INST;
415 
416 	cfg.t.cfg.s.hiGen.lmPst.prior       = PRIOR0;
417 	cfg.t.cfg.s.hiGen.lmPst.route       = RTESPEC;
418 	cfg.t.cfg.s.hiGen.lmPst.region      = S_REG;
419 	cfg.t.cfg.s.hiGen.lmPst.pool        = S_POOL;
420 	cfg.t.cfg.s.hiGen.lmPst.selector    = 0;
421 
422 
423         /*fill in the specific fields of the header */
424         cfg.hdr.msgType         = TCFG;
425         cfg.hdr.entId.ent       = ENTHI;
426         cfg.hdr.entId.inst      = 0;
427         cfg.hdr.elmId.elmnt     = STTSAP;
428 
429         pCfg = &cfg.t.cfg.s.hiSap;
430 
431         pCfg->spId 	= k->id ; /* each SCTP link there will be one tucl sap */
432         pCfg->uiSel 	= 0x00;  /*loosley coupled */
433         pCfg->flcEnb = TRUE;
434         pCfg->txqCongStrtLim = HI_SAP_TXN_QUEUE_CONG_START_LIMIT;
435         pCfg->txqCongDropLim = HI_SAP_TXN_QUEUE_CONG_DROP_LIMIT;
436         pCfg->txqCongStopLim = HI_SAP_TXN_QUEUE_CONG_STOP_LIMIT;
437         pCfg->numBins = 10;
438 
439         pCfg->uiMemId.region = S_REG;
440         pCfg->uiMemId.pool   = S_POOL;
441         pCfg->uiPrior        = PRIOR0;
442         pCfg->uiRoute        = RTESPEC;
443 
444         return(sng_cfg_tucl(&pst, &cfg));
445 }
446 
447 /****************************************************************************************************/
448 
ftmod_sctp_gen_config(void)449 static int ftmod_sctp_gen_config(void)
450 {
451 	SbMgmt  cfg;
452 	Pst             pst;
453 
454 	/* initalize the post structure */
455 	smPstInit(&pst);
456 
457 	/* insert the destination Entity */
458 	pst.dstEnt = ENTSB;
459 
460 	/* clear the configuration structure */
461 	memset(&cfg, 0, sizeof(cfg));
462 
463 	/* fill in the post structure */
464 	smPstInit(&cfg.t.cfg.s.genCfg.smPst);
465 	/*fill in the specific fields of the header */
466 	cfg.hdr.msgType                                         = TCFG;
467 	cfg.hdr.entId.ent                                       = ENTSB;
468 	cfg.hdr.entId.inst                                      = S_INST;
469 	cfg.hdr.elmId.elmnt                             	= STSBGEN;
470 
471 #ifdef SB_IPV6_SUPPORTED
472 	/* U8          ipv6SrvcReqdFlg; */ /* IPV6 service required for sctp */
473 #endif
474 
475 	cfg.t.cfg.s.genCfg.serviceType                          = HI_SRVC_RAW_SCTP;             	/* Usr packetized TCP Data */    /* TUCL transport protocol (IP/UDP) */
476 	cfg.t.cfg.s.genCfg.maxNmbSctSaps                        = SB_MAX_SCT_SAPS;                      /* max no. SCT SAPS */
477 	cfg.t.cfg.s.genCfg.maxNmbTSaps                          = SB_MAX_T_SAPS;                        /* max no. Transport SAPS */
478 	cfg.t.cfg.s.genCfg.maxNmbEndp                           = SB_MAX_NUM_OF_ENDPOINTS;              /* max no. endpoints */
479 	cfg.t.cfg.s.genCfg.maxNmbAssoc                          = SB_MAX_NUM_OF_ASSOC;                  /* max no. associations */
480 	cfg.t.cfg.s.genCfg.maxNmbDstAddr                        = SB_MAX_NUM_OF_DST_ADDR;               /* max no. dest. addresses */
481 	cfg.t.cfg.s.genCfg.maxNmbSrcAddr                        = SB_MAX_NUM_OF_SRC_ADDR;               /* max no. src. addresses */
482 	cfg.t.cfg.s.genCfg.maxNmbTxChunks                       = SB_MAX_NUM_OF_TX_CHUNKS;
483 	cfg.t.cfg.s.genCfg.maxNmbRxChunks                       = SB_MAX_NUM_OF_RX_CHUNKS;
484 	cfg.t.cfg.s.genCfg.maxNmbInStrms                        = SB_MAX_INC_STREAMS;
485 	cfg.t.cfg.s.genCfg.maxNmbOutStrms                       = SB_MAX_OUT_STREAMS;
486 	cfg.t.cfg.s.genCfg.initARwnd                            = SB_MAX_RWND_SIZE;
487 	cfg.t.cfg.s.genCfg.mtuInitial                           = SB_MTU_INITIAL;
488 	cfg.t.cfg.s.genCfg.mtuMinInitial                        = SB_MTU_MIN_INITIAL;
489 	cfg.t.cfg.s.genCfg.mtuMaxInitial                        = SB_MTU_MAX_INITIAL;
490 	cfg.t.cfg.s.genCfg.performMtu                           = FALSE;
491 	cfg.t.cfg.s.genCfg.timeRes                              = 1;
492 	sprintf((char*)cfg.t.cfg.s.genCfg.hostname, "www.sangoma.com"); /* DAVIDY - Fix this later, probably ignored */
493 	cfg.t.cfg.s.genCfg.useHstName                           = FALSE;      /* Flag whether hostname is to be used in INIT and INITACK msg */
494 	cfg.t.cfg.s.genCfg.reConfig.maxInitReTx         = 8;
495 	cfg.t.cfg.s.genCfg.reConfig.maxAssocReTx        = 10;
496 	cfg.t.cfg.s.genCfg.reConfig.maxPathReTx         = 10;
497 	cfg.t.cfg.s.genCfg.reConfig.altAcceptFlg        = TRUE;
498 	cfg.t.cfg.s.genCfg.reConfig.keyTm                       = 600; /* initial value for MD5 Key expiry timer */
499 	cfg.t.cfg.s.genCfg.reConfig.alpha                       = 12;
500 	cfg.t.cfg.s.genCfg.reConfig.beta                        = 25;
501 #ifdef SB_ECN
502 	cfg.t.cfg.s.genCfg.reConfig.ecnFlg                      = TRUE;
503 #endif
504 
505 	return(sng_cfg_sctp(&pst, &cfg));
506 }
507 
508 /****************************************************************************************************/
ftmod_cfg_sctp(void)509 static int ftmod_cfg_sctp(void)
510 {
511 	int x=0;
512 
513 	x = 1;
514 	while(x<MAX_SCTP_LINK){
515 
516 		if((g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0) &&
517 				(!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_CONFIGURED))) {
518 
519 			if (  ftmod_sctp_config(x) == FTDM_FAIL) {
520 				SS7_CRITICAL("SCTP %d configuration FAILED!\n", x);
521 				return FTDM_FAIL;
522 			} else {
523 				SS7_INFO("SCTP %d configuration DONE!\n", x);
524 			}
525 			g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags |= SNGSS7_CONFIGURED;
526 		}
527 		x++;
528 	}
529 	return FTDM_SUCCESS;
530 }
531 
532 /****************************************************************************************************/
ftmod_sctp_config(int id)533 int ftmod_sctp_config(int id)
534 {
535 	if  (FTDM_SUCCESS != ftmod_sctp_tsap_config(id))
536 		return FTDM_FAIL;
537 
538 	if  (FTDM_SUCCESS != ftmod_sctp_sap_config(id))
539 		return FTDM_FAIL;
540 
541 	/* each sctp link there will be one tucl sap */
542 	if(ftmod_tucl_sap_config(id)){
543 		ftdm_log (FTDM_LOG_ERROR ,"TUCL SAP[%d] configuration: NOT OK\n", id);
544 		return FTDM_FAIL;
545 	} else {
546 		ftdm_log (FTDM_LOG_INFO ,"TUCL SAP[%d] configuration: OK\n", id);
547 	}
548 
549 	return FTDM_SUCCESS;
550 }
551 /****************************************************************************************************/
552 
ftmod_sctp_tsap_config(int id)553 ftdm_status_t ftmod_sctp_tsap_config(int id)
554 {
555 	Pst			pst;
556 	SbMgmt		cfg;
557 	SbTSapCfg	*c;
558 
559 	int 			i = 0;
560 	int			ret = -1;
561 
562 	sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id];
563 
564 	smPstInit(&pst);
565 	pst.dstEnt = ENTSB;
566 
567 	memset(&cfg, 0x0, sizeof(cfg));
568 	smHdrInit(&cfg.hdr);
569 
570 	cfg.hdr.msgType			= TCFG;
571 	cfg.hdr.entId.ent		= ENTSB;
572 	cfg.hdr.entId.inst		= S_INST;
573 	cfg.hdr.elmId.elmnt		= STSBTSAP;
574 	cfg.hdr.elmId.elmntInst1 	= k->id;
575 
576 	c = &cfg.t.cfg.s.tSapCfg;
577 	c->swtch			= LSB_SW_RFC_REL0;
578 	c->suId				= k->id;
579 	c->sel				= 0;
580 	c->ent				= ENTHI;
581 	c->inst				= S_INST;
582 	c->procId			= g_ftdm_sngss7_data.cfg.procId;
583 	c->memId.region			= S_REG;
584 	c->memId.pool			= S_POOL;
585 	c->prior			= PRIOR1;
586 	c->route			= RTESPEC;
587 	c->srcNAddrLst.nmb 		= k->numSrcAddr;
588 	for (i=0; i <= (k->numSrcAddr-1); i++) {
589 		c->srcNAddrLst.nAddr[i].type = CM_NETADDR_IPV4;
590 		c->srcNAddrLst.nAddr[i].u.ipv4NetAddr = k->srcAddrList[i+1];
591 	}
592 
593 	c->reConfig.spId		= k->id;
594 	c->reConfig.maxBndRetry 	= 3;
595 	c->reConfig.tIntTmr 		= 200;
596 
597 	ret = sng_cfg_sctp(&pst, &cfg);
598 	if (0 == ret) {
599 		SS7_INFO("SCTP TSAP [%d] configuration DONE!\n", id);
600 		return FTDM_SUCCESS;
601 	} else {
602 		SS7_CRITICAL("SCTP TSAP [%d] configuration FAILED!\n", id);
603 		return FTDM_FAIL;
604 	}
605 }
606 
607 /****************************************************************************************************/
608 
ftmod_sctp_sap_config(int id)609 ftdm_status_t ftmod_sctp_sap_config(int id)
610 {
611 	Pst			pst;
612 	SbMgmt		cfg;
613 	SbSctSapCfg	*c;
614 
615 	int		ret = -1;
616 	sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id];
617 
618 	smPstInit(&pst);
619 	pst.dstEnt = ENTSB;
620 
621 	memset(&cfg, 0x0, sizeof(cfg));
622 	smHdrInit(&cfg.hdr);
623 
624 	cfg.hdr.msgType			= TCFG;
625 	cfg.hdr.entId.ent		= ENTSB;
626 	cfg.hdr.entId.inst		= S_INST;
627 	cfg.hdr.elmId.elmnt		= STSBSCTSAP;
628 	cfg.hdr.elmId.elmntInst1 	= k->id;
629 
630 	c = &cfg.t.cfg.s.sctSapCfg;
631 	c->swtch 			= LSB_SW_RFC_REL0;
632 	c->spId				= k->id;	/* Service Provider SAP Id */
633 	c->sel				= 0;
634 	c->memId.region			= S_REG;
635 	c->memId.pool			= S_POOL;
636 	c->prior			= PRIOR1;
637 	c->route			= RTESPEC;
638 
639 	/* Maximum time to wait before the SCTP layer must send a Selective Acknowledgement (SACK) message. Valid range is 1 -165535. */
640 	c->reConfig.maxAckDelayTm 	= 200;
641 	/* Maximum number of messages to receive before the SCTP layer must send a SACK message. Valid range is 1 - 165535. */
642 	c->reConfig.maxAckDelayDg 	= 2;
643 	/* Initial value of the retransmission timer (RTO). The SCTP layer retransmits data after waiting for feedback during this time period. Valid range is 1 - 65535. */
644 	c->reConfig.rtoInitial 		= 3000;
645 	/* Minimum value used for the RTO. If the computed value of RTO is less than rtoMin, the computed value is rounded up to this value. */
646 	c->reConfig.rtoMin 		= 1000;
647 	/* Maxiumum value used for RTO. If the computed value of RTO is greater than rtoMax, the computed value is rounded down to this value. */
648 	c->reConfig.rtoMax 		= 10000;
649 	/* Default Freeze timer value */
650 	c->reConfig.freezeTm 		= 3000;
651 	/* Base cookie lifetime for the cookie in the Initiation Acknowledgement (INIT ACK) message. */
652 	c->reConfig.cookieLife 		= 60000;
653 	/* Default heartbeat interval timer. Valid range is 1 - 65535. */
654 	c->reConfig.intervalTm 		= 3000;
655 	/* Maximum burst value. Valid range is 1 - 65535. */
656 	c->reConfig.maxBurst 		= 4;
657 	/*Maximum number of heartbeats sent at each retransmission timeout (RTO). Valid range is 1 - 65535. */
658 	c->reConfig.maxHbBurst 		= 1;
659 	/*Shutdown guard timer value for graceful shutdowns. */
660 	c->reConfig.t5SdownGrdTm 	= 15000;
661 	/*	Action to take when the receiver's number of incoming streams is less than the sender's number of outgoing streams. Valid values are:
662 		TRUE = Accept incoming stream and continue association.
663 		FALSE = Abort the association.
664 	*/
665 	c->reConfig.negAbrtFlg 		= FALSE;
666 	/* 	Whether to enable or disable heartbeat by default. Valid values are:
667 		TRUE = Enable heartbeat.
668 		FALSE = Disable heartbeat.
669 	*/
670 	c->reConfig.hBeatEnable 	= TRUE;
671 	/* Flow control start threshold. When the number of messages in SCTP’s message queue reaches this value, flow control starts. */
672 	c->reConfig.flcUpThr 		= 8;
673 	/* Flow control stop threshold. When the number of messages in SCTP’s message queue reaches this value, flow control stops. */
674 	c->reConfig.flcLowThr 		= 6;
675 
676 	c->reConfig.handleInitFlg 	= FALSE;
677 
678 	ret = sng_cfg_sctp(&pst, &cfg);
679 	if (0 == ret) {
680 		SS7_INFO("SCTP SAP [%d] configuration DONE!\n", id);
681 		return FTDM_SUCCESS;
682 	} else {
683 		SS7_CRITICAL("SCTP SAP [%d] configuration FAILED!\n", id);
684 		return FTDM_FAIL;
685 	}
686 }
687 
688 /**********************************************************************************************/
689 /* M2UA - General configuration */
ftmod_m2ua_gen_config(void)690 static int ftmod_m2ua_gen_config(void)
691 {
692 	Pst    pst;
693 	MwMgmt cfg;
694 
695 	memset((U8 *)&cfg, 0, sizeof(MwMgmt));
696 	memset((U8 *)&pst, 0, sizeof(Pst));
697 
698 	smPstInit(&pst);
699 
700 	pst.dstEnt = ENTMW;
701 
702 	/* prepare header */
703 	cfg.hdr.msgType     = TCFG;           /* message type */
704 	cfg.hdr.entId.ent   = ENTMW;          /* entity */
705 	cfg.hdr.entId.inst  = 0;              /* instance */
706 	cfg.hdr.elmId.elmnt = STMWGEN;        /* General */
707 	cfg.hdr.transId     = 0;     /* transaction identifier */
708 
709 	cfg.hdr.response.selector    = 0;
710 	cfg.hdr.response.prior       = PRIOR0;
711 	cfg.hdr.response.route       = RTESPEC;
712 	cfg.hdr.response.mem.region  = S_REG;
713 	cfg.hdr.response.mem.pool    = S_POOL;
714 
715 
716 
717 	cfg.t.cfg.s.genCfg.nodeType          = LMW_TYPE_SGP; /* NodeType ==  SGP or ASP  */
718 	cfg.t.cfg.s.genCfg.maxNmbIntf        = MW_MAX_NUM_OF_INTF;
719 	cfg.t.cfg.s.genCfg.maxNmbCluster     = MW_MAX_NUM_OF_CLUSTER;
720 	cfg.t.cfg.s.genCfg.maxNmbPeer        = MW_MAX_NUM_OF_PEER;
721 	cfg.t.cfg.s.genCfg.maxNmbSctSap      = MW_MAX_NUM_OF_SCT_SAPS;
722 	cfg.t.cfg.s.genCfg.timeRes           = 1;              /* timer resolution */
723 	cfg.t.cfg.s.genCfg.maxClusterQSize   = MW_MAX_CLUSTER_Q_SIZE;
724 	cfg.t.cfg.s.genCfg.maxIntfQSize      = MW_MAX_INTF_Q_SIZE;
725 
726 #ifdef LCMWMILMW
727 	cfg.t.cfg.s.genCfg.reConfig.smPst.selector  = 0;     /* selector */
728 #else /* LCSBMILSB */
729 	cfg.t.cfg.s.genCfg.reConfig.smPst.selector  = 1;     /* selector */
730 #endif /* LCSBMILSB */
731 
732 	cfg.t.cfg.s.genCfg.reConfig.smPst.region    = S_REG;   /* region */
733 	cfg.t.cfg.s.genCfg.reConfig.smPst.pool      = S_POOL;     /* pool */
734 	cfg.t.cfg.s.genCfg.reConfig.smPst.prior     = PRIOR0;        /* priority */
735 	cfg.t.cfg.s.genCfg.reConfig.smPst.route     = RTESPEC;       /* route */
736 
737 	cfg.t.cfg.s.genCfg.reConfig.smPst.dstEnt    = ENTSM;         /* dst entity */
738 	cfg.t.cfg.s.genCfg.reConfig.smPst.dstInst   = S_INST;             /* dst inst */
739 	cfg.t.cfg.s.genCfg.reConfig.smPst.dstProcId = SFndProcId();  /* src proc id */
740 
741 	cfg.t.cfg.s.genCfg.reConfig.smPst.srcEnt    = ENTMW;         /* src entity */
742 	cfg.t.cfg.s.genCfg.reConfig.smPst.srcInst   = S_INST;             /* src inst */
743 	cfg.t.cfg.s.genCfg.reConfig.smPst.srcProcId = SFndProcId();  /* src proc id */
744 
745 	cfg.t.cfg.s.genCfg.reConfig.tmrFlcPoll.enb = TRUE;            /* SCTP Flc Poll timer */
746 	cfg.t.cfg.s.genCfg.reConfig.tmrFlcPoll.val = 10;
747 
748 #ifdef MWASP
749 	cfg.t.cfg.s.genCfg.reConfig.tmrAspm.enb    = TRUE;         /* ASPM  timer */
750 	cfg.t.cfg.s.genCfg.reConfig.tmrAspm.val    = 10;
751 	cfg.t.cfg.s.genCfg.reConfig.tmrHeartBeat.enb  = TRUE;       /* Heartbeat timer */
752 	cfg.t.cfg.s.genCfg.reConfig.tmrHeartBeat.val  = 10;
753 #endif
754 
755 #ifdef MWSG
756 	cfg.t.cfg.s.genCfg.reConfig.tmrAsPend.enb  = TRUE;   /* AS-PENDING timer */
757 	cfg.t.cfg.s.genCfg.reConfig.tmrAsPend.val  = 10;
758 	cfg.t.cfg.s.genCfg.reConfig.tmrCongPoll.enb = TRUE;  /* SS7 Congestion poll timer */
759 	cfg.t.cfg.s.genCfg.reConfig.tmrCongPoll.val = 10;
760 	cfg.t.cfg.s.genCfg.reConfig.tmrHeartBeat.enb  = FALSE;       /* HBtimer only at ASP */
761 #endif
762 	cfg.t.cfg.s.genCfg.reConfig.aspmRetry = 5;
763 
764 	return (sng_cfg_m2ua (&pst, &cfg));
765 }
766 
767 /**********************************************************************************************/
ftmod_m2ua_peer_config(int id)768 static int ftmod_m2ua_peer_config(int id)
769 {
770 	int x = 0;
771 	int peer_id = 0;
772 	sng_m2ua_cfg_t* 	    m2ua  = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
773 	sng_m2ua_cluster_cfg_t*     clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId];
774 	sng_m2ua_peer_cfg_t* 	    peer  = NULL;
775 
776 	if((clust->flags & SNGSS7_CONFIGURED)){
777 		ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config: Cluster [%s] is already configured \n", clust->name);
778 		return 0x00;
779 	}
780 
781 	/*NOTE : SCTSAP is based on per source address , so if we have same Cluster / peer shared across many <m2ua_interface> then
782 	 * we dont have do configuration for each time */
783 
784 	/* loop through peer list from cluster to configure SCTSAP */
785 
786 	for(x = 0; x < clust->numOfPeers;x++){
787 		peer_id = clust->peerIdLst[x];
788 		peer = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id];
789 		if(ftmod_m2ua_sctsap_config(id, peer->sctpId)){
790 			ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config FAILED \n", id);
791 			return 0x01;
792 		}else{
793 			ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_sctsap_config: M2UA SCTSAP for M2UA Intf Id[%d] config SUCCESS \n", id);
794 		}
795 		if(ftmod_m2ua_peer_config1(id, peer_id)){
796 			ftdm_log (FTDM_LOG_ERROR, " ftmod_m2ua_peer_config1: M2UA Peer[%d] configuration for M2UA Intf Id[%d] config FAILED \n", peer_id, id);
797 			return 0x01;
798 		}else{
799 			ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_peer_config1: M2UA Peer[%d] configuration for M2UA Intf Id[%d] config SUCCESS \n", peer_id, id);
800 		}
801 
802 		clust->sct_sap_id = id;
803 
804 		/* set configured flag for cluster and peer */
805 		clust->flags |= SNGSS7_CONFIGURED;
806 		peer->flags |= SNGSS7_CONFIGURED;
807 	}
808 
809 	return 0x0;;
810 }
811 
812 
ftmod_m2ua_sctsap_config(int sct_sap_id,int sctp_id)813 static int ftmod_m2ua_sctsap_config(int sct_sap_id, int sctp_id)
814 {
815    int    i;
816    int    ret;
817    Pst    pst;
818    MwMgmt cfg;
819    MwMgmt cfm;
820    sng_sctp_link_t *sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[sctp_id];
821 
822 
823 
824    memset((U8 *)&cfg, 0, sizeof(MwMgmt));
825    memset((U8 *)&cfm, 0, sizeof(MwMgmt));
826    memset((U8 *)&pst, 0, sizeof(Pst));
827 
828    /* check is sct_sap is already configured */
829    if(!ftmod_m2ua_ssta_req(STMWSCTSAP, sct_sap_id, &cfm )){
830 	   ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_sctsap_config: SCT SAP [%s] is already configured \n", sctp->name);
831 	   return 0x00;
832    }
833 
834    if(LCM_REASON_INVALID_SAP == cfm.cfm.reason){
835 	   ftdm_log (FTDM_LOG_INFO, " ftmod_m2ua_sctsap_config: SCT SAP [%s] is not configured..configuring now \n", sctp->name);
836    }
837 
838    smPstInit(&pst);
839 
840    pst.dstEnt = ENTMW;
841 
842    /* prepare header */
843    cfg.hdr.msgType     = TCFG;           /* message type */
844    cfg.hdr.entId.ent   = ENTMW;          /* entity */
845    cfg.hdr.entId.inst  = 0;              /* instance */
846    cfg.hdr.elmId.elmnt = STMWSCTSAP;     /* SCTSAP */
847    cfg.hdr.transId     = 0;     /* transaction identifier */
848 
849     cfg.hdr.response.selector    = 0;
850    cfg.hdr.response.prior       = PRIOR0;
851    cfg.hdr.response.route       = RTESPEC;
852    cfg.hdr.response.mem.region  = S_REG;
853    cfg.hdr.response.mem.pool    = S_POOL;
854 
855    cfg.t.cfg.s.sctSapCfg.reConfig.selector     = 0;
856 
857    /* service user SAP ID */
858    cfg.t.cfg.s.sctSapCfg.suId                   = sct_sap_id;
859    /* service provider ID   */
860    cfg.t.cfg.s.sctSapCfg.spId                   = sctp_id;
861    /* source port number */
862    cfg.t.cfg.s.sctSapCfg.srcPort                = sctp->port;
863    /* interface address */
864    /*For multiple IP address support */
865 #ifdef SCT_ENDP_MULTI_IPADDR
866    cfg.t.cfg.s.sctSapCfg.srcAddrLst.nmb  	= sctp->numSrcAddr;
867    for (i=0; i <= (sctp->numSrcAddr-1); i++) {
868 	   cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[i].type = CM_NETADDR_IPV4;
869 	   cfg.t.cfg.s.sctSapCfg.srcAddrLst.nAddr[i].u.ipv4NetAddr = sctp->srcAddrList[i+1];
870    }
871 #else
872    /* for single ip support ,src address will always be one */
873    cfg.t.cfg.s.sctSapCfg.intfAddr.type          = CM_NETADDR_IPV4;
874    cfg.t.cfg.s.sctSapCfg.intfAddr.u.ipv4NetAddr = sctp->srcAddrList[1];
875 #endif
876 
877    /* lower SAP primitive timer */
878    cfg.t.cfg.s.sctSapCfg.reConfig.tmrPrim.enb   = TRUE;
879    cfg.t.cfg.s.sctSapCfg.reConfig.tmrPrim.val   = 10;
880    /* Association primitive timer */
881    cfg.t.cfg.s.sctSapCfg.reConfig.tmrAssoc.enb   = TRUE;
882    cfg.t.cfg.s.sctSapCfg.reConfig.tmrAssoc.val   = 10;
883    /* maxnumber of retries */
884    cfg.t.cfg.s.sctSapCfg.reConfig.nmbMaxPrimRetry  = 5;
885    /* Life Time of Packets  */
886    cfg.t.cfg.s.sctSapCfg.reConfig.lifeTime  = 200;
887    /* priority */
888    cfg.t.cfg.s.sctSapCfg.reConfig.prior       =  PRIOR0;
889    /* route */
890    cfg.t.cfg.s.sctSapCfg.reConfig.route       =  RTESPEC;
891    cfg.t.cfg.s.sctSapCfg.reConfig.ent         =  ENTSB;
892    cfg.t.cfg.s.sctSapCfg.reConfig.inst        =  0;
893    cfg.t.cfg.s.sctSapCfg.reConfig.procId      =  SFndProcId();
894    /* memory region and pool ID */
895    cfg.t.cfg.s.sctSapCfg.reConfig.mem.region    = S_REG;
896    cfg.t.cfg.s.sctSapCfg.reConfig.mem.pool      = S_POOL;
897 
898      if (0 == (ret = sng_cfg_m2ua (&pst, &cfg))){
899 		sctp->flags |= SNGSS7_CONFIGURED;
900      }
901 
902      return ret;
903 }
904 
905 /****************************************************************************************************/
906 
907 /* M2UA - Peer configuration */
ftmod_m2ua_peer_config1(int m2ua_inf_id,int peer_id)908 static int ftmod_m2ua_peer_config1(int m2ua_inf_id, int peer_id)
909 {
910    int    i;
911    Pst    pst;
912    MwMgmt cfg;
913    sng_m2ua_peer_cfg_t* peer  = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[peer_id];
914    sng_sctp_link_t 	*sctp = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[peer->sctpId];
915 
916    memset((U8 *)&cfg, 0, sizeof(MwMgmt));
917    memset((U8 *)&pst, 0, sizeof(Pst));
918 
919    smPstInit(&pst);
920 
921    pst.dstEnt = ENTMW;
922 
923    /* prepare header */
924    cfg.hdr.msgType     = TCFG;           /* message type */
925    cfg.hdr.entId.ent   = ENTMW;          /* entity */
926    cfg.hdr.entId.inst  = 0;              /* instance */
927    cfg.hdr.elmId.elmnt = STMWPEER;       /* Peer */
928    cfg.hdr.transId     = 0;     /* transaction identifier */
929 
930    cfg.hdr.response.selector    = 0;
931    cfg.hdr.response.prior       = PRIOR0;
932    cfg.hdr.response.route       = RTESPEC;
933    cfg.hdr.response.mem.region  = S_REG;
934    cfg.hdr.response.mem.pool    = S_POOL;
935 
936 
937 
938    cfg.t.cfg.s.peerCfg.peerId 		= peer->id;               /* peer id */
939    cfg.t.cfg.s.peerCfg.aspIdFlag 	= peer->aspIdFlag;        /* aspId flag */
940 #ifdef MWASP
941    cfg.t.cfg.s.peerCfg.selfAspId 	= peer->selfAspId;  	  /* aspId */
942 #endif
943    cfg.t.cfg.s.peerCfg.assocCfg.suId    = peer->sctpId; 	  /* SCTSAP ID */
944    cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nmb = peer->numDestAddr;
945    for (i=0; i <= (peer->numDestAddr); i++) {
946 	   cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[i].type = CM_NETADDR_IPV4;
947 	   cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[i].u.ipv4NetAddr = peer->destAddrList[i];
948    }
949 #ifdef MW_CFG_DSTPORT
950    cfg.t.cfg.s.peerCfg.assocCfg.dstPort = peer->port; /* Port on which M2UA runs */
951 #endif
952    cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nmb = sctp->numSrcAddr; /* source address list */
953    for (i=0; i <= (sctp->numSrcAddr-1); i++) {
954 	   cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[i].type =  CM_NETADDR_IPV4;
955 	   cfg.t.cfg.s.peerCfg.assocCfg.srcAddrLst.nAddr[i].u.ipv4NetAddr = sctp->srcAddrList[i+1];
956    }
957 
958    cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.type = CM_NETADDR_IPV4;
959    cfg.t.cfg.s.peerCfg.assocCfg.priDstAddr.u.ipv4NetAddr = cfg.t.cfg.s.peerCfg.assocCfg.dstAddrLst.nAddr[0].u.ipv4NetAddr;
960 
961    cfg.t.cfg.s.peerCfg.assocCfg.locOutStrms = peer->locOutStrms;
962 #ifdef SCT3
963    cfg.t.cfg.s.peerCfg.assocCfg.tos = 0;
964 #endif
965 
966      return (sng_cfg_m2ua (&pst, &cfg));
967 }
968 /**********************************************************************************************/
969 /* M2UA - Cluster configuration */
ftmod_m2ua_cluster_config(int id)970 static int ftmod_m2ua_cluster_config(int id)
971 {
972    int i;
973    Pst    pst;
974    MwMgmt cfg;
975    sng_m2ua_cfg_t* 	    m2ua  = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
976    sng_m2ua_cluster_cfg_t*  clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId];
977 
978    memset((U8 *)&cfg, 0, sizeof(MwMgmt));
979    memset((U8 *)&pst, 0, sizeof(Pst));
980 
981    smPstInit(&pst);
982 
983    pst.dstEnt = ENTMW;
984 
985    /* prepare header */
986    cfg.hdr.msgType     = TCFG;           /* message type */
987    cfg.hdr.entId.ent   = ENTMW;          /* entity */
988    cfg.hdr.entId.inst  = 0;              /* instance */
989    cfg.hdr.elmId.elmnt = STMWCLUSTER;    /* Cluster */
990    cfg.hdr.transId     = 0;     /* transaction identifier */
991 
992    cfg.hdr.response.selector    = 0;
993    cfg.hdr.response.prior       = PRIOR0;
994    cfg.hdr.response.route       = RTESPEC;
995    cfg.hdr.response.mem.region  = S_REG;
996    cfg.hdr.response.mem.pool    = S_POOL;
997 
998 
999    cfg.t.cfg.s.clusterCfg.clusterId 	= clust->id;
1000    cfg.t.cfg.s.clusterCfg.trfMode   	= clust->trfMode;
1001    cfg.t.cfg.s.clusterCfg.loadshareMode = clust->loadShareAlgo;
1002    cfg.t.cfg.s.clusterCfg.reConfig.nmbPeer = clust->numOfPeers;
1003    for(i=0; i<(clust->numOfPeers);i++) {
1004 	   cfg.t.cfg.s.clusterCfg.reConfig.peer[i] = clust->peerIdLst[i];
1005    }
1006 
1007      return (sng_cfg_m2ua (&pst, &cfg));
1008 }
1009 
1010 /**********************************************************************************************/
1011 
1012 /* M2UA - DLSAP configuration */
ftmod_m2ua_dlsap_config(int id)1013 static int ftmod_m2ua_dlsap_config(int id)
1014 {
1015    Pst    pst;
1016    MwMgmt cfg;
1017    sng_m2ua_cfg_t* 	    m2ua  = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
1018 
1019    memset((U8 *)&cfg, 0, sizeof(MwMgmt));
1020    memset((U8 *)&pst, 0, sizeof(Pst));
1021 
1022    smPstInit(&pst);
1023 
1024    pst.dstEnt = ENTMW;
1025 
1026    /* prepare header */
1027    cfg.hdr.msgType     = TCFG;           /* message type */
1028    cfg.hdr.entId.ent   = ENTMW;          /* entity */
1029    cfg.hdr.entId.inst  = 0;              /* instance */
1030    cfg.hdr.elmId.elmnt = STMWDLSAP;      /* DLSAP */
1031    cfg.hdr.transId     = 0;     /* transaction identifier */
1032 
1033    cfg.hdr.response.selector    = 0;
1034    cfg.hdr.response.prior       = PRIOR0;
1035    cfg.hdr.response.route       = RTESPEC;
1036    cfg.hdr.response.mem.region  = S_REG;
1037    cfg.hdr.response.mem.pool    = S_POOL;
1038 
1039 
1040    cfg.t.cfg.s.dlSapCfg.lnkNmb 	= id; /* SapId */
1041    cfg.t.cfg.s.dlSapCfg.intfId.type = LMW_INTFID_INT;
1042    cfg.t.cfg.s.dlSapCfg.intfId.id.intId = m2ua->iid;
1043 
1044    cfg.t.cfg.s.dlSapCfg.swtch = LMW_SAP_ITU;
1045 
1046    cfg.t.cfg.s.dlSapCfg.reConfig.clusterId =  m2ua->clusterId;
1047    cfg.t.cfg.s.dlSapCfg.reConfig.selector  =  0; /* Loosely couple mode */
1048    /* memory region and pool id*/
1049    cfg.t.cfg.s.dlSapCfg.reConfig.mem.region  =  S_REG;
1050    cfg.t.cfg.s.dlSapCfg.reConfig.mem.pool    =  S_POOL;
1051    /* priority */
1052    cfg.t.cfg.s.dlSapCfg.reConfig.prior       =  PRIOR0;
1053    /* route */
1054    cfg.t.cfg.s.dlSapCfg.reConfig.route       =  RTESPEC;
1055 
1056      return (sng_cfg_m2ua (&pst, &cfg));
1057 
1058 }
1059 /*****************************************************************************/
1060 /* NIF - General configuration */
ftmod_nif_gen_config(void)1061 static int ftmod_nif_gen_config(void)
1062 {
1063    Pst    pst;
1064    NwMgmt cfg;
1065 
1066    memset((U8 *)&cfg, 0, sizeof(NwMgmt));
1067    memset((U8 *)&pst, 0, sizeof(Pst));
1068 
1069    smPstInit(&pst);
1070 
1071    pst.dstEnt = ENTNW;
1072 
1073    /* prepare header */
1074    cfg.hdr.msgType     = TCFG;           /* message type */
1075    cfg.hdr.entId.ent   = ENTNW;          /* entity */
1076    cfg.hdr.entId.inst  = 0;              /* instance */
1077    cfg.hdr.elmId.elmnt = STNWGEN;      /* DLSAP */
1078    cfg.hdr.transId     = 0;     /* transaction identifier */
1079 
1080    cfg.hdr.response.selector    = 0;
1081    cfg.hdr.response.prior       = PRIOR0;
1082    cfg.hdr.response.route       = RTESPEC;
1083    cfg.hdr.response.mem.region  = S_REG;
1084    cfg.hdr.response.mem.pool    = S_POOL;
1085 
1086    cfg.t.cfg.s.genCfg.maxNmbDlSap       = NW_MAX_NUM_OF_DLSAPS;
1087    cfg.t.cfg.s.genCfg.timeRes           = 1;    /* timer resolution */
1088 
1089    cfg.t.cfg.s.genCfg.reConfig.maxNmbRetry    = NW_MAX_NUM_OF_RETRY;
1090    cfg.t.cfg.s.genCfg.reConfig.tmrRetry.enb =   TRUE;     /* SS7 Congestion poll timer */
1091    cfg.t.cfg.s.genCfg.reConfig.tmrRetry.val =   NW_RETRY_TMR_VALUE;
1092 
1093 #ifdef LCNWMILNW
1094    cfg.t.cfg.s.genCfg.reConfig.smPst.selector  = 0;     /* selector */
1095 #else /* LCSBMILSB */
1096    cfg.t.cfg.s.genCfg.reConfig.smPst.selector  = 1;     /* selector */
1097 #endif /* LCSBMILSB */
1098 
1099    cfg.t.cfg.s.genCfg.reConfig.smPst.region    = S_REG;   /* region */
1100    cfg.t.cfg.s.genCfg.reConfig.smPst.pool      = S_POOL;     /* pool */
1101    cfg.t.cfg.s.genCfg.reConfig.smPst.prior     = PRIOR0;        /* priority */
1102    cfg.t.cfg.s.genCfg.reConfig.smPst.route     = RTESPEC;       /* route */
1103 
1104    cfg.t.cfg.s.genCfg.reConfig.smPst.dstEnt    = ENTSM;         /* dst entity */
1105    cfg.t.cfg.s.genCfg.reConfig.smPst.dstInst   = 0;             /* dst inst */
1106    cfg.t.cfg.s.genCfg.reConfig.smPst.dstProcId = SFndProcId();  /* src proc id */
1107 
1108    cfg.t.cfg.s.genCfg.reConfig.smPst.srcEnt    = ENTNW;         /* src entity */
1109    cfg.t.cfg.s.genCfg.reConfig.smPst.srcInst   = 0;             /* src inst */
1110    cfg.t.cfg.s.genCfg.reConfig.smPst.srcProcId = SFndProcId();  /* src proc id */
1111 
1112      return (sng_cfg_nif (&pst, &cfg));
1113 
1114 }
1115 
1116 /*****************************************************************************/
1117 
1118 /* NIF - DLSAP configuration */
ftmod_nif_dlsap_config(int id)1119 static int ftmod_nif_dlsap_config(int id)
1120 {
1121    Pst    pst;
1122    NwMgmt cfg;
1123    sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id];
1124 
1125    memset((U8 *)&cfg, 0, sizeof(NwMgmt));
1126    memset((U8 *)&pst, 0, sizeof(Pst));
1127 
1128    smPstInit(&pst);
1129 
1130    pst.dstEnt = ENTNW;
1131 
1132    /* prepare header */
1133    cfg.hdr.msgType     = TCFG;           /* message type */
1134    cfg.hdr.entId.ent   = ENTNW;          /* entity */
1135    cfg.hdr.entId.inst  = 0;              /* instance */
1136    cfg.hdr.elmId.elmnt = STNWDLSAP;      /* DLSAP */
1137    cfg.hdr.transId     = 0;     /* transaction identifier */
1138 
1139    cfg.hdr.response.selector    = 0;
1140    cfg.hdr.response.prior       = PRIOR0;
1141    cfg.hdr.response.route       = RTESPEC;
1142    cfg.hdr.response.mem.region  = S_REG;
1143    cfg.hdr.response.mem.pool    = S_POOL;
1144    cfg.t.cfg.s.dlSapCfg.suId 	    = nif->id;
1145    cfg.t.cfg.s.dlSapCfg.m2uaLnkNmb  = nif->m2uaLnkNmb;
1146    cfg.t.cfg.s.dlSapCfg.mtp2LnkNmb  = nif->mtp2LnkNmb;
1147 
1148    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.selector   = 0;
1149    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.region     = S_REG;
1150    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.pool       = S_POOL;
1151    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.route      = RTESPEC;
1152    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.prior      = PRIOR0;
1153    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.srcEnt     = ENTNW;
1154    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.srcInst    = 0;
1155    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.srcProcId  = SFndProcId();
1156    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.dstEnt     = ENTMW;
1157    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.dstInst    = 0;
1158    cfg.t.cfg.s.dlSapCfg.reConfig.m2uaPst.dstProcId  = SFndProcId();
1159 
1160    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.selector   = 0;
1161    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.region     = S_REG;
1162    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.pool       = S_POOL;
1163    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.route      = RTESPEC;
1164    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.prior      = PRIOR0;
1165    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.srcEnt     = ENTNW;
1166    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.srcInst    = 0;
1167    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.srcProcId  = SFndProcId();
1168    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.dstEnt     = ENTSD;
1169    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.dstInst    = 0;
1170    cfg.t.cfg.s.dlSapCfg.reConfig.mtp2Pst.dstProcId  = SFndProcId();
1171 
1172      return (sng_cfg_nif (&pst, &cfg));
1173 }
1174 
1175 /*****************************************************************************/
iptoul(const char * ip)1176 uint32_t iptoul(const char *ip)
1177 {
1178         char i,*tmp;
1179         int strl;
1180         char strIp[16];
1181         unsigned long val=0, cvt;
1182         if (!ip)
1183                 return 0;
1184 
1185         memset(strIp, 0, sizeof(char)*16);
1186         strl = strlen(ip);
1187         strncpy(strIp, ip, strl>=15?15:strl);
1188 
1189 
1190         tmp=strtok(strIp, ".");
1191         for (i=0;i<4;i++)
1192         {
1193                 sscanf(tmp, "%lu", &cvt);
1194                 val <<= 8;
1195                 val |= (unsigned char)cvt;
1196                 tmp=strtok(NULL,".");
1197         }
1198         return (uint32_t)val;
1199 }
1200 /***********************************************************************************************************************/
ftmod_ss7_enable_m2ua_sg_logging(void)1201 void ftmod_ss7_enable_m2ua_sg_logging(void){
1202 
1203 	/* Enable DEBUGs*/
1204 	ftmod_sctp_debug(AENA);
1205 	ftmod_m2ua_debug(AENA);
1206 	ftmod_tucl_debug(AENA);
1207 }
1208 
1209 /***********************************************************************************************************************/
ftmod_ss7_disable_m2ua_sg_logging(void)1210 void ftmod_ss7_disable_m2ua_sg_logging(void){
1211 
1212 	/* DISABLE DEBUGs*/
1213 	ftmod_sctp_debug(ADISIMM);
1214 	ftmod_m2ua_debug(ADISIMM);
1215 	ftmod_tucl_debug(ADISIMM);
1216 }
1217 
1218 /***********************************************************************************************************************/
ftmod_ss7_m2ua_start(void)1219 int ftmod_ss7_m2ua_start(void){
1220 	int x=0;
1221 
1222 /***********************************************************************************************************************/
1223 	x = 1;
1224 	while(x<MAX_SCTP_LINK){
1225 		if((g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].id !=0) &&
1226 				(!(g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags & SNGSS7_ACTIVE))) {
1227 
1228 			/* Send a control request to bind the TSAP between SCTP and TUCL */
1229 			if(ftmod_sctp_tucl_tsap_bind(x)) {
1230 				ftdm_log (FTDM_LOG_ERROR ,"\nControl request to bind TSAP[%d] of SCTP and TUCL : NOT OK\n", x);
1231 				return 1;
1232 			} else {
1233 				ftdm_log (FTDM_LOG_INFO ,"\nControl request to bind TSAP[%d] of SCTP and TUCL: OK\n", x);
1234 			}
1235 			g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[x].flags |= SNGSS7_ACTIVE;
1236 		}
1237 		x++;
1238 	}
1239 
1240 /***********************************************************************************************************************/
1241 	/* Send a control request to bind the SCTSAP between SCTP and M2UA */
1242 	x = 1;
1243 	while(x<MW_MAX_NUM_OF_INTF){
1244 		if((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0) &&
1245 				(!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags & SNGSS7_ACTIVE))) {
1246 			if(ftmod_m2ua_sctp_sctsap_bind(x)) {
1247 				ftdm_log (FTDM_LOG_ERROR ,"Control request to bind SCTSAP[%d] of M2UA and SCTP : NOT OK\n", x);
1248 				return 1;
1249 			} else {
1250 				ftdm_log (FTDM_LOG_INFO ,"Control request to bind SCTSAP[%d] of M2UA and SCTP: OK\n", x);
1251 			}
1252 			g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].flags |= SNGSS7_ACTIVE;
1253 		}
1254 		x++;
1255 	}/* END - M2UA Interfaces while loop*/
1256 /***********************************************************************************************************************/
1257 
1258 	x = 1;
1259 	while(x<MW_MAX_NUM_OF_INTF){
1260 		if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].id !=0) &&
1261 				(!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags & SNGSS7_ACTIVE))) {
1262 			/* Send a control request to bind the DLSAP between NIF, M2UA and MTP-2 */
1263 			if(ftmod_nif_m2ua_dlsap_bind(x)) {
1264 				ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP[%d] between NIF and M2UA: NOT OK\n", x);
1265 				return 1;
1266 			}else {
1267 				ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP[%d] between NIF and M2UA : OK\n", x);
1268 			}
1269 			if(ftmod_nif_mtp2_dlsap_bind(x)) {
1270 				ftdm_log (FTDM_LOG_ERROR ,"Control request to bind DLSAP[%d] between NIF and MTP2: NOT OK\n", x);
1271 				return 1;
1272 			}else {
1273 				ftdm_log (FTDM_LOG_INFO ,"Control request to bind DLSAP[%d] between NIF and MTP2 : OK\n", x);
1274 			}
1275 			g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[x].flags |= SNGSS7_ACTIVE;
1276 		}
1277 		x++;
1278 	}/* END - NIF Interfaces for loop*/
1279 
1280 /***********************************************************************************************************************/
1281 
1282 	x = 1;
1283 	while(x<MW_MAX_NUM_OF_INTF){
1284 		if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].id !=0) &&
1285 				(!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].end_point_opened))) {
1286 			/* Send a control request to open endpoint */
1287 			if(ftmod_open_endpoint(x)) {
1288 				ftdm_log (FTDM_LOG_ERROR ,"ftmod_open_endpoint FAIL  \n");
1289 				return 1;
1290 			}else {
1291 				ftdm_log (FTDM_LOG_INFO ,"ftmod_open_endpoint SUCCESS  \n");
1292 			}
1293 			g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[x].end_point_opened = 0x01;
1294 		}
1295 		x++;
1296 	}
1297 
1298 /***********************************************************************************************************************/
1299 	sleep(2);
1300 
1301 	x = 1;
1302 	while (x < (MW_MAX_NUM_OF_PEER)) {
1303 		if ((g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].id !=0) &&
1304 				(!(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].flags & SNGSS7_M2UA_INIT_ASSOC_DONE)) &&
1305 				(g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].init_sctp_assoc)) {
1306 			if(ftmod_init_sctp_assoc(x)) {
1307 				ftdm_log (FTDM_LOG_ERROR ,"ftmod_init_sctp_assoc FAIL for peerId[%d] \n", x);
1308 				return 1;
1309 			}else {
1310 				ftdm_log (FTDM_LOG_INFO ,"ftmod_init_sctp_assoc SUCCESS for peerId[%d] \n", x);
1311 			}
1312 			g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_peer[x].flags |= SNGSS7_M2UA_INIT_ASSOC_DONE;
1313 		}
1314 		x++;
1315 	}
1316 
1317 
1318 
1319 
1320 	return 0;
1321 }
1322 /***********************************************************************************************************************/
1323 
ftmod_open_endpoint(int id)1324 static int ftmod_open_endpoint(int id)
1325 {
1326 	int ret = 0x00;
1327 	Pst pst;
1328 	MwMgmt cntrl;
1329 	sng_m2ua_cfg_t* m2ua  = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
1330 	sng_m2ua_cluster_cfg_t*     clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId];
1331 
1332 	if(clust->flags & SNGSS7_M2UA_EP_OPENED) {
1333 		ftdm_log (FTDM_LOG_INFO ," END-POINT already opened\n");
1334 		return ret;
1335 	}
1336 
1337 	memset((U8 *)&pst, 0, sizeof(Pst));
1338 	memset((U8 *)&cntrl, 0, sizeof(MwMgmt));
1339 
1340 	smPstInit(&pst);
1341 
1342 	pst.dstEnt = ENTMW;
1343 
1344 	/* prepare header */
1345 	cntrl.hdr.msgType     = TCNTRL;         /* message type */
1346 	cntrl.hdr.entId.ent   = ENTMW;          /* entity */
1347 	cntrl.hdr.entId.inst  = 0;              /* instance */
1348 	cntrl.hdr.elmId.elmnt = STMWSCTSAP;       /* General */
1349 	cntrl.hdr.transId     = 1;     /* transaction identifier */
1350 
1351 	cntrl.hdr.response.selector    = 0;
1352 	cntrl.hdr.response.prior       = PRIOR0;
1353 	cntrl.hdr.response.route       = RTESPEC;
1354 	cntrl.hdr.response.mem.region  = S_REG;
1355 	cntrl.hdr.response.mem.pool    = S_POOL;
1356 
1357 
1358 	cntrl.t.cntrl.action = AMWENDPOPEN;
1359 	cntrl.t.cntrl.s.suId = m2ua->id; /* M2UA sct sap Id */
1360 
1361 
1362 	if(0 == (ret = sng_cntrl_m2ua (&pst, &cntrl))){
1363 		clust->flags |= SNGSS7_M2UA_EP_OPENED;
1364 	}
1365 	return ret;
1366 
1367 }
1368 
1369 /***********************************************************************************************************************/
ftmod_init_sctp_assoc(int peer_id)1370 static int ftmod_init_sctp_assoc(int peer_id)
1371 {
1372 
1373         Pst pst;
1374         MwMgmt cntrl;
1375 
1376         memset((U8 *)&pst, 0, sizeof(Pst));
1377         memset((U8 *)&cntrl, 0, sizeof(MwMgmt));
1378 
1379         smPstInit(&pst);
1380 
1381         pst.dstEnt = ENTMW;
1382 
1383         /* prepare header */
1384         cntrl.hdr.msgType     = TCNTRL;         /* message type */
1385         cntrl.hdr.entId.ent   = ENTMW;          /* entity */
1386         cntrl.hdr.entId.inst  = 0;              /* instance */
1387         cntrl.hdr.elmId.elmnt = STMWPEER;       /* General */
1388         cntrl.hdr.transId     = 1;     /* transaction identifier */
1389 
1390         cntrl.hdr.response.selector    = 0;
1391         cntrl.hdr.response.prior       = PRIOR0;
1392         cntrl.hdr.response.route       = RTESPEC;
1393         cntrl.hdr.response.mem.region  = S_REG;
1394         cntrl.hdr.response.mem.pool    = S_POOL;
1395 
1396 
1397         cntrl.t.cntrl.action = AMWESTABLISH;
1398         /*cntrl.t.cntrl.s.suId = 1;*/
1399 
1400         cntrl.t.cntrl.s.peerId = (MwPeerId) peer_id;
1401 
1402         return (sng_cntrl_m2ua (&pst, &cntrl));
1403 }
1404 
1405 /***********************************************************************************************************************/
ftmod_sctp_tucl_tsap_bind(int id)1406 static int ftmod_sctp_tucl_tsap_bind(int id)
1407 {
1408   Pst pst;
1409   SbMgmt cntrl;
1410   sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id];
1411 
1412   memset((U8 *)&pst, 0, sizeof(Pst));
1413   memset((U8 *)&cntrl, 0, sizeof(SbMgmt));
1414 
1415   smPstInit(&pst);
1416 
1417   pst.dstEnt = ENTSB;
1418 
1419   /* prepare header */
1420    cntrl.hdr.msgType     = TCNTRL;         /* message type */
1421    cntrl.hdr.entId.ent   = ENTSB;          /* entity */
1422    cntrl.hdr.entId.inst  = 0;              /* instance */
1423    cntrl.hdr.elmId.elmnt = STSBTSAP;       /* General */
1424    cntrl.hdr.transId     = 1;     /* transaction identifier */
1425 
1426    cntrl.hdr.response.selector    = 0;
1427 
1428    cntrl.hdr.response.prior       = PRIOR0;
1429    cntrl.hdr.response.route       = RTESPEC;
1430    cntrl.hdr.response.mem.region  = S_REG;
1431    cntrl.hdr.response.mem.pool    = S_POOL;
1432 
1433    cntrl.t.cntrl.action = ABND_ENA;
1434    cntrl.t.cntrl.sapId  = k->id;  /* SCT sap id configured at SCTP layer */
1435 
1436      return (sng_cntrl_sctp (&pst, &cntrl));
1437 }
1438 /***********************************************************************************************************************/
1439 
ftmod_m2ua_sctp_sctsap_bind(int id)1440 static int ftmod_m2ua_sctp_sctsap_bind(int id)
1441 {
1442   int ret = 0x00;
1443   Pst pst;
1444   MwMgmt cntrl;
1445   sng_m2ua_cfg_t* m2ua  = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
1446   sng_m2ua_cluster_cfg_t*     clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId];
1447 
1448   if(clust->flags & SNGSS7_ACTIVE) {
1449 	  ftdm_log (FTDM_LOG_INFO ," SCT-SAP is already enabled\n");
1450 	  return ret;
1451   }
1452 
1453 
1454   memset((U8 *)&pst, 0, sizeof(Pst));
1455   memset((U8 *)&cntrl, 0, sizeof(MwMgmt));
1456 
1457   smPstInit(&pst);
1458 
1459   pst.dstEnt = ENTMW;
1460 
1461   /* prepare header */
1462   cntrl.hdr.msgType     = TCNTRL;         /* message type */
1463    cntrl.hdr.entId.ent   = ENTMW;          /* entity */
1464    cntrl.hdr.entId.inst  = 0;              /* instance */
1465    cntrl.hdr.elmId.elmnt = STMWSCTSAP;       /* General */
1466    cntrl.hdr.transId     = 1;     /* transaction identifier */
1467 
1468    cntrl.hdr.response.selector    = 0;
1469    cntrl.hdr.response.prior       = PRIOR0;
1470    cntrl.hdr.response.route       = RTESPEC;
1471    cntrl.hdr.response.mem.region  = S_REG;
1472    cntrl.hdr.response.mem.pool    = S_POOL;
1473 
1474    cntrl.t.cntrl.action = ABND;
1475    cntrl.t.cntrl.s.suId = m2ua->id;
1476 
1477    if(0 == (ret = sng_cntrl_m2ua (&pst, &cntrl))){
1478 	   clust->flags |= SNGSS7_ACTIVE;
1479    }
1480    return ret;
1481 }
1482 /***********************************************************************************************************************/
ftmod_nif_m2ua_dlsap_bind(int id)1483 static int ftmod_nif_m2ua_dlsap_bind(int id)
1484 {
1485   Pst pst;
1486   NwMgmt cntrl;
1487   sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id];
1488 
1489   memset((U8 *)&pst, 0, sizeof(Pst));
1490   memset((U8 *)&cntrl, 0, sizeof(NwMgmt));
1491 
1492   smPstInit(&pst);
1493 
1494   pst.dstEnt = ENTNW;
1495 
1496   /* prepare header */
1497   cntrl.hdr.msgType     = TCNTRL;         /* message type */
1498    cntrl.hdr.entId.ent   = ENTNW;          /* entity */
1499    cntrl.hdr.entId.inst  = 0;              /* instance */
1500    cntrl.hdr.elmId.elmnt = STNWDLSAP;       /* General */
1501    cntrl.hdr.transId     = 1;     /* transaction identifier */
1502 
1503    cntrl.hdr.response.selector    = 0;
1504    cntrl.hdr.response.prior       = PRIOR0;
1505    cntrl.hdr.response.route       = RTESPEC;
1506    cntrl.hdr.response.mem.region  = S_REG;
1507    cntrl.hdr.response.mem.pool    = S_POOL;
1508 
1509    cntrl.t.cntrl.action = ABND;
1510    cntrl.t.cntrl.suId = nif->id;      /* NIF DL sap Id */
1511    cntrl.t.cntrl.entity = ENTMW; /* M2UA */
1512 
1513      return (sng_cntrl_nif (&pst, &cntrl));
1514 
1515 }
1516 
1517 /***********************************************************************************************************************/
ftmod_nif_mtp2_dlsap_bind(int id)1518 static int ftmod_nif_mtp2_dlsap_bind(int id)
1519 {
1520   Pst pst;
1521   NwMgmt cntrl;
1522   sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id];
1523 
1524   memset((U8 *)&pst, 0, sizeof(Pst));
1525   memset((U8 *)&cntrl, 0, sizeof(NwMgmt));
1526 
1527   smPstInit(&pst);
1528 
1529   pst.dstEnt = ENTNW;
1530 
1531   /* prepare header */
1532   cntrl.hdr.msgType     = TCNTRL;         /* message type */
1533    cntrl.hdr.entId.ent   = ENTNW;          /* entity */
1534    cntrl.hdr.entId.inst  = 0;              /* instance */
1535    cntrl.hdr.elmId.elmnt = STNWDLSAP;       /* General */
1536    cntrl.hdr.transId     = 1;     /* transaction identifier */
1537 
1538    cntrl.hdr.response.selector    = 0;
1539    cntrl.hdr.response.prior       = PRIOR0;
1540    cntrl.hdr.response.route       = RTESPEC;
1541    cntrl.hdr.response.mem.region  = S_REG;
1542    cntrl.hdr.response.mem.pool    = S_POOL;
1543 
1544    cntrl.t.cntrl.action = ABND;
1545    cntrl.t.cntrl.suId = nif->id;      /* NIF DL sap Id */
1546    cntrl.t.cntrl.entity = ENTSD;      /* MTP2 */
1547 
1548      return (sng_cntrl_nif (&pst, &cntrl));
1549 
1550 }
1551 
1552 /***********************************************************************************************************************/
ftmod_sctp_debug(int action)1553 static int ftmod_sctp_debug(int action)
1554 {
1555 	Pst pst;
1556 	SbMgmt cntrl;
1557 
1558 	memset((U8 *)&pst, 0, sizeof(Pst));
1559 	memset((U8 *)&cntrl, 0, sizeof(SbMgmt));
1560 
1561 	smPstInit(&pst);
1562 
1563 	pst.dstEnt = ENTSB;
1564 
1565 	/* prepare header */
1566 	cntrl.hdr.msgType     = TCNTRL;         /* message type */
1567 	cntrl.hdr.entId.ent   = ENTSB;          /* entity */
1568 	cntrl.hdr.entId.inst  = 0;              /* instance */
1569 	cntrl.hdr.elmId.elmnt = STSBGEN;       /* General */
1570 
1571 	cntrl.hdr.response.selector    = 0;
1572 	cntrl.hdr.response.prior       = PRIOR0;
1573 	cntrl.hdr.response.route       = RTESPEC;
1574 	cntrl.hdr.response.mem.region  = S_REG;
1575 	cntrl.hdr.response.mem.pool    = S_POOL;
1576 
1577 	cntrl.t.cntrl.action = action;
1578 	cntrl.t.cntrl.subAction = SADBG;
1579 	cntrl.t.cntrl.dbgMask   = 0xFFFF;
1580 
1581 	return (sng_cntrl_sctp (&pst, &cntrl));
1582 }
1583 /***********************************************************************************************************************/
1584 
ftmod_m2ua_debug(int action)1585 static int ftmod_m2ua_debug(int action)
1586 {
1587 	Pst pst;
1588 	MwMgmt cntrl;
1589 
1590 	memset((U8 *)&pst, 0, sizeof(Pst));
1591 	memset((U8 *)&cntrl, 0, sizeof(MwMgmt));
1592 
1593 	smPstInit(&pst);
1594 
1595 	pst.dstEnt = ENTMW;
1596 
1597 	/* prepare header */
1598 	cntrl.hdr.msgType     = TCNTRL;         /* message type */
1599 	cntrl.hdr.entId.ent   = ENTMW;          /* entity */
1600 	cntrl.hdr.entId.inst  = 0;              /* instance */
1601 	cntrl.hdr.elmId.elmnt = STMWGEN;       /* General */
1602 
1603 	cntrl.hdr.response.selector    = 0;
1604 	cntrl.hdr.response.prior       = PRIOR0;
1605 	cntrl.hdr.response.route       = RTESPEC;
1606 	cntrl.hdr.response.mem.region  = S_REG;
1607 	cntrl.hdr.response.mem.pool    = S_POOL;
1608 
1609 	cntrl.t.cntrl.action = action;
1610 	cntrl.t.cntrl.subAction = SADBG;
1611 	cntrl.t.cntrl.s.dbgMask   = 0xFFFF;
1612 
1613 	return (sng_cntrl_m2ua (&pst, &cntrl));
1614 }
1615 /***********************************************************************************************************************/
ftmod_tucl_debug(int action)1616 static int ftmod_tucl_debug(int action)
1617 {
1618 	Pst pst;
1619 	HiMngmt cntrl;
1620 
1621 	memset((U8 *)&pst, 0, sizeof(Pst));
1622 	memset((U8 *)&cntrl, 0, sizeof(HiMngmt));
1623 
1624 	smPstInit(&pst);
1625 
1626 	pst.dstEnt = ENTHI;
1627 
1628 	/* prepare header */
1629 	cntrl.hdr.msgType     = TCNTRL;         /* message type */
1630 	cntrl.hdr.entId.ent   = ENTHI;          /* entity */
1631 	cntrl.hdr.entId.inst  = 0;              /* instance */
1632 	cntrl.hdr.elmId.elmnt = STGEN;       /* General */
1633 
1634 	cntrl.hdr.response.selector    = 0;
1635 	cntrl.hdr.response.prior       = PRIOR0;
1636 	cntrl.hdr.response.route       = RTESPEC;
1637 	cntrl.hdr.response.mem.region  = S_REG;
1638 	cntrl.hdr.response.mem.pool    = S_POOL;
1639 
1640 	cntrl.t.cntrl.action    = action;
1641 	cntrl.t.cntrl.subAction = SADBG;
1642 	cntrl.t.cntrl.ctlType.hiDbg.dbgMask = 0xFFFF;
1643 
1644 	return (sng_cntrl_tucl (&pst, &cntrl));
1645 }
1646 /***********************************************************************************************************************/
1647 
1648 /***********************************************************************************************************************/
ftmod_sctp_ssta_req(int elemt,int id,SbMgmt * cfm)1649 int ftmod_sctp_ssta_req(int elemt, int id, SbMgmt* cfm)
1650 {
1651 	SbMgmt ssta;
1652 	Pst pst;
1653 	sng_sctp_link_t *k = &g_ftdm_sngss7_data.cfg.sctpCfg.linkCfg[id];
1654 
1655 	memset((U8 *)&pst, 0, sizeof(Pst));
1656 	memset((U8 *)&ssta, 0, sizeof(SbMgmt));
1657 
1658 	smPstInit(&pst);
1659 
1660 	pst.dstEnt = ENTSB;
1661 
1662 	/* prepare header */
1663 	ssta.hdr.msgType     = TSSTA;         /* message type */
1664 	ssta.hdr.entId.ent   = ENTSB;          /* entity */
1665 	ssta.hdr.entId.inst  = 0;              /* instance */
1666 	ssta.hdr.elmId.elmnt = elemt;  		/* STSBGEN */ /* Others are STSBTSAP, STSBSCTSAP, STSBASSOC, STSBDTA, STSBTMR */
1667 	ssta.hdr.transId     = 1;     /* transaction identifier */
1668 
1669 	ssta.hdr.response.selector    = 0;
1670 	ssta.hdr.response.prior       = PRIOR0;
1671 	ssta.hdr.response.route       = RTESPEC;
1672 	ssta.hdr.response.mem.region  = S_REG;
1673 	ssta.hdr.response.mem.pool    = S_POOL;
1674 
1675 	if((ssta.hdr.elmId.elmnt == STSBSCTSAP) || (ssta.hdr.elmId.elmnt == STSBTSAP))
1676 	{
1677 		ssta.t.ssta.sapId = k->id; /* SapId */
1678 	}
1679         if(ssta.hdr.elmId.elmnt == STSBASSOC)
1680         {
1681 		/*TODO - how to get assoc Id*/
1682                 ssta.t.ssta.s.assocSta.assocId = 0; /* association id */
1683         }
1684 	return(sng_sta_sctp(&pst,&ssta,cfm));
1685 }
1686 
ftmod_m2ua_ssta_req(int elemt,int id,MwMgmt * cfm)1687 int ftmod_m2ua_ssta_req(int elemt, int id, MwMgmt* cfm)
1688 {
1689 	MwMgmt ssta;
1690 	Pst pst;
1691 	sng_m2ua_cfg_t* 	 m2ua  = NULL;
1692 	sng_m2ua_cluster_cfg_t*  clust = NULL;
1693 
1694 	memset((U8 *)&pst, 0, sizeof(Pst));
1695 	memset((U8 *)&ssta, 0, sizeof(MwMgmt));
1696 
1697 	smPstInit(&pst);
1698 
1699 	pst.dstEnt = ENTMW;
1700 
1701 	/* prepare header */
1702 	ssta.hdr.msgType     = TSSTA;         /* message type */
1703 	ssta.hdr.entId.ent   = ENTMW;          /* entity */
1704 	ssta.hdr.entId.inst  = 0;              /* instance */
1705 	ssta.hdr.elmId.elmnt = elemt; 	      /*STMWGEN */ /* Others are STMWSCTSAP, STMWCLUSTER, STMWPEER,STMWSID, STMWDLSAP */
1706 	ssta.hdr.transId     = 1;     /* transaction identifier */
1707 
1708 	ssta.hdr.response.selector    = 0;
1709 	ssta.hdr.response.prior       = PRIOR0;
1710 	ssta.hdr.response.route       = RTESPEC;
1711 	ssta.hdr.response.mem.region  = S_REG;
1712 	ssta.hdr.response.mem.pool    = S_POOL;
1713 
1714        switch(ssta.hdr.elmId.elmnt)
1715        {
1716           case STMWSCTSAP:
1717                 {
1718 		   m2ua  = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua[id];
1719 		   clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[m2ua->clusterId];
1720                    ssta.t.ssta.id.suId = clust->sct_sap_id ; /* lower sap Id */
1721                    break;
1722                 }
1723           case STMWDLSAP:
1724                 {
1725                    ssta.t.ssta.id.lnkNmb = id ; /* upper sap Id */
1726                    break;
1727                 }
1728           case STMWPEER:
1729                 {
1730                    ssta.t.ssta.id.peerId = id ; /* peer Id */
1731                    break;
1732                 }
1733           case STMWCLUSTER:
1734                 {
1735 		   clust = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.m2ua_clus[id];
1736                    ssta.t.ssta.id.clusterId = clust->id ; /* cluster Id */
1737                    break;
1738                 }
1739            default:
1740                    break;
1741         }
1742 
1743 	return(sng_sta_m2ua(&pst,&ssta,cfm));
1744 }
1745 
ftmod_nif_ssta_req(int elemt,int id,NwMgmt * cfm)1746 int ftmod_nif_ssta_req(int elemt, int id, NwMgmt* cfm)
1747 {
1748 	NwMgmt ssta;
1749 	Pst pst;
1750 	sng_nif_cfg_t* nif = &g_ftdm_sngss7_data.cfg.g_m2ua_cfg.nif[id];
1751 
1752 	memset((U8 *)&pst, 0, sizeof(Pst));
1753 	memset((U8 *)&ssta, 0, sizeof(NwMgmt));
1754 
1755 	smPstInit(&pst);
1756 
1757 	pst.dstEnt = ENTNW;
1758 
1759 	/* prepare header */
1760 	ssta.hdr.msgType     = TSSTA;         /* message type */
1761 	ssta.hdr.entId.ent   = ENTNW;          /* entity */
1762 	ssta.hdr.entId.inst  = 0;              /* instance */
1763 	ssta.hdr.elmId.elmnt = elemt;
1764 
1765 	ssta.hdr.response.selector    = 0;
1766 	ssta.hdr.response.prior       = PRIOR0;
1767 	ssta.hdr.response.route       = RTESPEC;
1768 	ssta.hdr.response.mem.region  = S_REG;
1769 	ssta.hdr.response.mem.pool    = S_POOL;
1770 	ssta.t.ssta.suId = nif->id; /*  Lower sapId */
1771 
1772 	return(sng_sta_nif(&pst,&ssta,cfm));
1773 }
1774