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 SCTPs message queue reaches this value, flow control starts. */
672 c->reConfig.flcUpThr = 8;
673 /* Flow control stop threshold. When the number of messages in SCTPs 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