This source file includes following definitions.
- ftmod_ss7_parse_xml
- ftmod_ss7_parse_sng_isup
- ftmod_ss7_parse_mtp_linksets
- ftmod_ss7_parse_mtp_linkset
- ftmod_ss7_parse_mtp_link
- ftmod_ss7_parse_mtp_routes
- ftmod_ss7_parse_mtp_route
- ftmod_ss7_parse_isup_interfaces
- ftmod_ss7_parse_isup_interface
- ftmod_ss7_fill_in_mtpLink
- ftmod_ss7_fill_in_mtpLinkSet
- ftmod_ss7_fill_in_mtp3_route
- ftmod_ss7_fill_in_nsap
- ftmod_ss7_fill_in_isup_interface
- ftmod_ss7_fill_in_isap
- ftmod_ss7_fill_in_self_route
- ftmod_ss7_fill_in_circuits
- ftmod_ss7_next_timeslot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #include "ftmod_sangoma_ss7_main.h"
36
37
38
39
40
41
42 typedef struct sng_timeslot
43 {
44 int channel;
45 int siglink;
46 int gap;
47 int hole;
48 }sng_timeslot_t;
49
50 typedef struct sng_isupCkt
51 {
52 ftdm_span_t *span;
53 uint32_t cicbase;
54 uint32_t typeCntrl;
55 char ch_map[MAX_CIC_MAP_LENGTH];
56 uint32_t isupInf;
57 uint32_t t3;
58 uint32_t t12;
59 uint32_t t13;
60 uint32_t t14;
61 uint32_t t15;
62 uint32_t t16;
63 uint32_t t17;
64 uint32_t tval;
65 } sng_isupCkt_t;
66
67 int cmbLinkSetId;
68
69
70
71 int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span);
72
73 static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup);
74
75 static int ftmod_ss7_parse_mtp_linksets(ftdm_conf_node_t *mtp_linksets);
76 static int ftmod_ss7_parse_mtp_linkset(ftdm_conf_node_t *mtp_linkset);
77 static int ftmod_ss7_parse_mtp_link(ftdm_conf_node_t *mtp_link, sng_mtp_link_t *mtpLink);
78
79 static int ftmod_ss7_parse_mtp_routes(ftdm_conf_node_t *mtp_routes);
80 static int ftmod_ss7_parse_mtp_route(ftdm_conf_node_t *mtp_route);
81
82 static int ftmod_ss7_parse_isup_interfaces(ftdm_conf_node_t *isup_interfaces);
83 static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface);
84
85 static int ftmod_ss7_fill_in_mtpLink(sng_mtp_link_t *mtpLink);
86
87 static int ftmod_ss7_fill_in_mtpLinkSet(sng_link_set_t *mtpLinkSet);
88
89 static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route);
90 static int ftmod_ss7_fill_in_nsap(sng_route_t *mtp3_route);
91
92 static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup);
93 static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap);
94
95 static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf);
96
97 static int ftmod_ss7_fill_in_circuits(sng_isupCkt_t *isupCkt);
98 static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot);
99
100
101
102
103 int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span)
104 {
105 int i = 0;
106 int x = 0;
107 const char *var = NULL;
108 const char *val = NULL;
109 ftdm_conf_node_t *ptr = NULL;
110 sng_route_t self_route;
111 sng_isupCkt_t isupCkt;
112
113
114 memset(&isupCkt, 0x0, sizeof(sng_isupCkt_t));
115
116
117 memset(&self_route, 0x0, sizeof(sng_route_t));
118
119 var = ftdm_parameters[i].var;
120 val = ftdm_parameters[i].val;
121 ptr = (ftdm_conf_node_t *)ftdm_parameters[i].ptr;
122
123
124 if (!strcasecmp(var, "confnode")) {
125
126 if (ftmod_ss7_parse_sng_isup(ptr)) {
127 SS7_ERROR("Failed to parse the \"confnode\"!\n");
128 goto ftmod_ss7_parse_xml_error;
129 }
130 } else {
131
132 SS7_ERROR("The \"confnode\" configuration was not the first parameter!\n");
133 SS7_ERROR("\tFound \"%s\" in the first slot\n", var);
134 goto ftmod_ss7_parse_xml_error;
135 }
136
137 i++;
138 while (ftdm_parameters[i].var != NULL) {
139
140 var = ftdm_parameters[i].var;
141 val = ftdm_parameters[i].val;
142
143 if (!strcasecmp(var, "ch_map")) {
144
145 strcpy(isupCkt.ch_map, val);
146 SS7_DEBUG("\tFound channel map \"%s\"\n", isupCkt.ch_map);
147
148 } else if (!strcasecmp(var, "typeCntrl")) {
149 if (!strcasecmp(val, "bothway")) {
150 isupCkt.typeCntrl = BOTHWAY;
151 SS7_DEBUG("\tFound control type \"bothway\"\n");
152 } else if (!strcasecmp(val, "incoming")) {
153 isupCkt.typeCntrl = INCOMING;
154 SS7_DEBUG("\tFound control type \"incoming\"\n");
155 } else if (!strcasecmp(val, "outgoing")) {
156 isupCkt.typeCntrl = OUTGOING;
157 SS7_DEBUG("\tFound control type \"outgoing\"\n");
158 } else if (!strcasecmp(val, "controlled")) {
159 isupCkt.typeCntrl = CONTROLLED;
160 SS7_DEBUG("\tFound control type \"controlled\"\n");
161 } else if (!strcasecmp(val, "controlling")) {
162 isupCkt.typeCntrl = CONTROLLING;
163 SS7_DEBUG("\tFound control type \"controlling\"\n");
164 } else {
165 SS7_ERROR("Found invalid circuit control type \"%s\"!", val);
166 goto ftmod_ss7_parse_xml_error;
167 }
168
169 } else if (!strcasecmp(var, "cicbase")) {
170 isupCkt.cicbase = atoi(val);
171 SS7_DEBUG("\tFound cicbase = %d\n", isupCkt.cicbase);
172
173 } else if (!strcasecmp(var, "dialplan")) {
174
175
176 } else if (!strcasecmp(var, "context")) {
177
178
179 } else if (!strcasecmp(var, "isup_interface")) {
180
181 x = 1;
182 while (g_ftdm_sngss7_data.cfg.isupIntf[x].id != 0) {
183 if (!strcasecmp(g_ftdm_sngss7_data.cfg.isupIntf[x].name, val)) {
184
185 break;
186 }
187
188 x++;
189 }
190
191 isupCkt.isupInf = x;
192 SS7_DEBUG("\tFound isup_interface = %s\n",g_ftdm_sngss7_data.cfg.isupIntf[x].name);
193
194 } else if (!strcasecmp(var, "isup.t3")) {
195 isupCkt.t3 = atoi(val);
196 SS7_DEBUG("\tFound isup t3 = \"%d\"\n", isupCkt.t3);
197
198 } else if (!strcasecmp(var, "isup.t12")) {
199 isupCkt.t12 = atoi(val);
200 SS7_DEBUG("\tFound isup t12 = \"%d\"\n", isupCkt.t12);
201
202 } else if (!strcasecmp(var, "isup.t13")) {
203 isupCkt.t13 = atoi(val);
204 SS7_DEBUG("\tFound isup t13 = \"%d\"\n", isupCkt.t13);
205
206 } else if (!strcasecmp(var, "isup.t14")) {
207 isupCkt.t14 = atoi(val);
208 SS7_DEBUG("\tFound isup t14 = \"%d\"\n", isupCkt.t14);
209
210 } else if (!strcasecmp(var, "isup.t15")) {
211 isupCkt.t15 = atoi(val);
212 SS7_DEBUG("\tFound isup t15 = \"%d\"\n", isupCkt.t15);
213
214 } else if (!strcasecmp(var, "isup.t16")) {
215 isupCkt.t16 = atoi(val);
216 SS7_DEBUG("\tFound isup t16 = \"%d\"\n", isupCkt.t16);
217
218 } else if (!strcasecmp(var, "isup.t17")) {
219 isupCkt.t17 = atoi(val);
220 SS7_DEBUG("\tFound isup t17 = \"%d\"\n", isupCkt.t17);
221
222 } else if (!strcasecmp(var, "isup.tval")) {
223 isupCkt.tval = atoi(val);
224 SS7_DEBUG("\tFound isup tval = \"%d\"\n", isupCkt.tval);
225
226 } else {
227 SS7_ERROR("Unknown parameter found =\"%s\"...ignoring it!\n", var);
228
229 }
230
231 i++;
232 }
233
234
235 i = g_ftdm_sngss7_data.cfg.isupIntf[x].mtpRouteId;
236
237 if(ftmod_ss7_fill_in_self_route(g_ftdm_sngss7_data.cfg.isupIntf[x].spc,
238 g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType,
239 g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType,
240 g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf)) {
241
242 SS7_ERROR("Failed to fill in self route structure!\n");
243 goto ftmod_ss7_parse_xml_error;
244
245 }
246
247
248 isupCkt.span = span;
249
250
251 if(ftmod_ss7_fill_in_circuits(&isupCkt)) {
252 SS7_ERROR("Failed to fill in circuits structure!\n");
253 goto ftmod_ss7_parse_xml_error;
254 }
255
256 return FTDM_SUCCESS;
257
258 ftmod_ss7_parse_xml_error:
259 return FTDM_FAIL;
260 }
261
262
263 static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup)
264 {
265 ftdm_conf_node_t *mtp_linksets = NULL;
266 ftdm_conf_node_t *mtp_routes = NULL;
267 ftdm_conf_node_t *isup_interfaces = NULL;
268 ftdm_conf_node_t *tmp_node = NULL;
269
270
271 if (strcasecmp(sng_isup->name, "sng_isup")) {
272 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"sng_isup\"!\n",sng_isup->name);
273 return FTDM_FAIL;
274 } else {
275 SS7_DEBUG("Parsing \"sng_isup\"...\n");
276 }
277
278
279 tmp_node = sng_isup->child;
280 while (tmp_node != NULL) {
281
282 if (!strcasecmp(tmp_node->name, "mtp_linksets")) {
283 if (mtp_linksets == NULL) {
284 mtp_linksets = tmp_node;
285 SS7_DEBUG("\tFound a \"mtp_linksets section!\n");
286 } else {
287 SS7_ERROR("\tFound a second \"mtp_linksets\" section!\n");
288 return FTDM_FAIL;
289 }
290 } else if (!strcasecmp(tmp_node->name, "mtp_routes")) {
291 if (mtp_routes == NULL) {
292 mtp_routes = tmp_node;
293 SS7_DEBUG("\tFound a \"mtp_routes\" section!\n");
294 } else {
295 SS7_ERROR("\tFound a second \"mtp_routes\" section!\n");
296 return FTDM_FAIL;
297 }
298 } else if (!strcasecmp(tmp_node->name, "isup_interfaces")) {
299 if (isup_interfaces == NULL) {
300 isup_interfaces = tmp_node;
301 SS7_DEBUG("\tFound a \"isup_interfaces\" section!\n");
302 } else {
303 SS7_ERROR("\tFound a second \"isup_interfaces\" section\n!");
304 return FTDM_FAIL;
305 }
306 } else {
307 SS7_ERROR("\tFound an unknown section \"%s\"!\n", tmp_node->name);
308 return FTDM_FAIL;
309 }
310
311
312 tmp_node = tmp_node->next;
313
314 }
315
316
317 if (ftmod_ss7_parse_mtp_linksets(mtp_linksets)) {
318 SS7_ERROR("Failed to parse \"mtp_linksets\"!\n");
319 return FTDM_FAIL;
320 }
321
322 if (ftmod_ss7_parse_mtp_routes(mtp_routes)) {
323 SS7_ERROR("Failed to parse \"mtp_routes\"!\n");
324 return FTDM_FAIL;
325 }
326
327 if (ftmod_ss7_parse_isup_interfaces(isup_interfaces)) {
328 SS7_ERROR("Failed to parse \"isup_interfaces\"!\n");
329 return FTDM_FAIL;
330 }
331
332 return FTDM_SUCCESS;
333 }
334
335
336 static int ftmod_ss7_parse_mtp_linksets(ftdm_conf_node_t *mtp_linksets)
337 {
338 ftdm_conf_node_t *mtp_linkset = NULL;
339
340
341 if (strcasecmp(mtp_linksets->name, "mtp_linksets")) {
342 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_linksets\"!\n",mtp_linksets->name);
343 return FTDM_FAIL;
344 } else {
345 SS7_DEBUG("Parsing \"mtp_linksets\"...\n");
346 }
347
348
349 mtp_linkset = mtp_linksets->child;
350
351
352 while (mtp_linkset != NULL) {
353
354 if (ftmod_ss7_parse_mtp_linkset(mtp_linkset)) {
355 SS7_ERROR("Failed to parse \"mtp_linkset\"!\n");
356 return FTDM_FAIL;
357 }
358
359
360 mtp_linkset = mtp_linkset->next;
361
362 }
363
364 return FTDM_SUCCESS;
365 }
366
367
368 static int ftmod_ss7_parse_mtp_linkset(ftdm_conf_node_t *mtp_linkset)
369 {
370 ftdm_conf_parameter_t *parm = mtp_linkset->parameters;
371 int num_parms = mtp_linkset->n_parameters;
372 ftdm_conf_node_t *mtp_link = NULL;
373 sng_mtp_link_t mtpLink[MAX_MTP_LINKS+1];
374 sng_link_set_t mtpLinkSet;
375 int count;
376 int i;
377
378
379 for (i = 0; i < (MAX_MTP_LINKS + 1); i++) {
380 memset(&mtpLink[i], 0x0, sizeof(mtpLink[i]));
381 }
382 memset(&mtpLinkSet, 0x0, sizeof(mtpLinkSet));
383
384
385 if (strcasecmp(mtp_linkset->name, "mtp_linkset")) {
386 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_linkset\"!\n",mtp_linkset->name);
387 return FTDM_FAIL;
388 } else {
389 SS7_DEBUG("Parsing \"mtp_linkset\"...\n");
390 }
391
392
393 for (i = 0; i < num_parms; i++) {
394
395 if (!strcasecmp(parm->var, "name")) {
396 strcpy((char *)mtpLinkSet.name, parm->val);
397 SS7_DEBUG("\tFound an \"mtp_linkset\" named = %s\n", mtpLinkSet.name);
398
399 } else if (!strcasecmp(parm->var, "apc")) {
400 mtpLinkSet.apc = atoi(parm->val);
401 SS7_DEBUG("\tFound mtpLinkSet->apc = %d\n", mtpLinkSet.apc);
402
403 } else if (!strcasecmp(parm->var, "minActive")) {
404 mtpLinkSet.minActive = atoi(parm->val);
405 SS7_DEBUG("\tFound mtpLinkSet->minActive = %d\n", mtpLinkSet.minActive);
406
407 } else {
408 SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
409 return FTDM_FAIL;
410 }
411
412
413 parm = parm + 1;
414
415 }
416
417
418 mtp_link = mtp_linkset->child->child;
419
420
421 count = 0;
422
423
424 while (mtp_link != NULL) {
425
426 if (ftmod_ss7_parse_mtp_link(mtp_link, &mtpLink[count] )) {
427 SS7_ERROR("Failed to parse \"mtp_link\"!\n");
428 return FTDM_FAIL;
429 }
430
431
432 count++;
433
434
435 mtp_link = mtp_link->next;
436
437 }
438
439
440 if (count < 1 || count > 15 ) {
441 SS7_ERROR("Invalid number of mtp_links found (%d)\n", count);
442 return FTDM_FAIL;
443 }
444
445
446 i = 1;
447 while (g_ftdm_sngss7_data.cfg.mtpLinkSet[i].id != 0) {
448 if (!strcasecmp((const char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[i].name, (const char *)mtpLinkSet.name)) {
449
450 break;
451 }
452 i++;
453
454 }
455
456
457 if (g_ftdm_sngss7_data.cfg.mtpLinkSet[i].id == 0) {
458 mtpLinkSet.id = i;
459 SS7_DEBUG("found new mtpLinkSet, id is = %d\n", mtpLinkSet.id);
460 } else {
461 mtpLinkSet.id = i;
462 SS7_DEBUG("found existing mtpLinkSet, id is = %d\n", mtpLinkSet.id);
463 }
464
465
466 i = 0;
467 count = 0;
468 while (mtpLink[i].mtp1.span != 0 ){
469
470
471 mtpLink[i].mtp3.apc = mtpLinkSet.apc;
472 mtpLink[i].mtp3.linkSetId = mtpLinkSet.id;
473
474 ftmod_ss7_fill_in_mtpLink(&mtpLink[i]);
475
476
477 count++;
478
479
480 i++;
481 }
482
483 mtpLinkSet.linkType = mtpLink[0].mtp3.linkType;
484 mtpLinkSet.switchType = mtpLink[0].mtp3.switchType;
485 mtpLinkSet.ssf = mtpLink[0].mtp3.ssf;
486
487 ftmod_ss7_fill_in_mtpLinkSet(&mtpLinkSet);
488
489 return FTDM_SUCCESS;
490 }
491
492
493 static int ftmod_ss7_parse_mtp_link(ftdm_conf_node_t *mtp_link, sng_mtp_link_t *mtpLink)
494 {
495 ftdm_conf_parameter_t *parm = mtp_link->parameters;
496 int num_parms = mtp_link->n_parameters;
497 int i;
498
499
500 if (strcasecmp(mtp_link->name, "mtp_link")) {
501 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_link\"!\n",mtp_link->name);
502 return FTDM_FAIL;
503 } else {
504 SS7_DEBUG("Parsing \"mtp_link\"...\n");
505 }
506
507 for (i = 0; i < num_parms; i++) {
508
509
510 if (!strcasecmp(parm->var, "name")) {
511 strcpy((char *)mtpLink->name, parm->val);
512 SS7_DEBUG("\tFound an \"mtp_link\" named = %s\n", mtpLink->name);
513
514 } else if (!strcasecmp(parm->var, "span")) {
515 mtpLink->mtp1.span = atoi(parm->val);
516 SS7_DEBUG("\tFound mtpLink->span = %d\n", mtpLink->mtp1.span);
517
518 } else if (!strcasecmp(parm->var, "chan")) {
519 mtpLink->mtp1.chan = atoi(parm->val);
520 SS7_DEBUG("\tFound mtpLink->chan = %d\n", mtpLink->mtp1.chan);
521
522 } else if (!strcasecmp(parm->var, "errorType")) {
523 if (!strcasecmp(parm->val, "basic")) {
524 mtpLink->mtp2.errorType = SD_ERR_NRM;
525 } else if (!strcasecmp(parm->val, "pcr")) {
526 mtpLink->mtp2.errorType = SD_ERR_CYC;
527 } else {
528 SS7_ERROR("\tFound an invalid \"errorType\" = %s\n", parm->var);
529 return FTDM_FAIL;
530 }
531 SS7_DEBUG("\tFound mtpLink->errorType=%s\n", parm->val);
532
533 } else if (!strcasecmp(parm->var, "lssuLength")) {
534 mtpLink->mtp2.lssuLength = atoi(parm->val);
535 if ((mtpLink->mtp2.lssuLength != 1) && (mtpLink->mtp2.lssuLength != 2)) {
536 SS7_ERROR("\tFound an invalid \"lssuLength\" = %d\n", mtpLink->mtp2.lssuLength);
537 return FTDM_FAIL;
538 } else {
539 SS7_DEBUG("\tFound mtpLink->lssuLength=%d\n", mtpLink->mtp2.lssuLength);
540 }
541
542 } else if (!strcasecmp(parm->var, "priority")) {
543 mtpLink->mtp3.priority = atoi(parm->val);
544 if ((mtpLink->mtp3.priority == 0) || (mtpLink->mtp3.priority == 1) ||
545 (mtpLink->mtp3.priority == 2) || (mtpLink->mtp3.priority == 3)) {
546 SS7_DEBUG("\tFound mtpLink->priority = %d\n",mtpLink->mtp3.priority);
547 } else {
548 SS7_ERROR("\tFound an invalid \"priority\"=%d\n",mtpLink->mtp3.priority);
549 return FTDM_FAIL;
550 }
551
552 } else if (!strcasecmp(parm->var, "linkType")) {
553 if (!strcasecmp(parm->val, "itu92")) {
554 mtpLink->mtp2.linkType = LSD_SW_ITU92;
555 mtpLink->mtp3.linkType = LSN_SW_ITU;
556 SS7_DEBUG("\tFound mtpLink->linkType = \"ITU92\"\n");
557 } else if (!strcasecmp(parm->val, "itu88")) {
558 mtpLink->mtp2.linkType = LSD_SW_ITU88;
559 mtpLink->mtp3.linkType = LSN_SW_ITU;
560 SS7_DEBUG("\tFound mtpLink->linkType = \"ITU88\"\n");
561 } else if (!strcasecmp(parm->val, "ansi96")) {
562 mtpLink->mtp2.linkType = LSD_SW_ANSI92;
563 mtpLink->mtp3.linkType = LSN_SW_ANS96;
564 SS7_DEBUG("\tFound mtpLink->linkType = \"ANSI96\"\n");
565 } else if (!strcasecmp(parm->val, "ansi92")) {
566 mtpLink->mtp2.linkType = LSD_SW_ANSI92;
567 mtpLink->mtp3.linkType = LSN_SW_ANS;
568 SS7_DEBUG("\tFound mtpLink->linkType = \"ANSI92\"\n");
569 } else if (!strcasecmp(parm->val, "ansi88")) {
570 mtpLink->mtp2.linkType = LSD_SW_ANSI88;
571 mtpLink->mtp3.linkType = LSN_SW_ANS;
572 SS7_DEBUG("\tFound mtpLink->linkType = \"ANSI88\"\n");
573 } else if (!strcasecmp(parm->val, "etsi")) {
574 mtpLink->mtp2.linkType = LSD_SW_ITU92;
575 mtpLink->mtp3.linkType = LSN_SW_ITU;
576 SS7_DEBUG("\tFound mtpLink->linkType = \"ETSI\"\n");
577 } else {
578 SS7_ERROR("\tFound an invalid linktype of \"%s\"!\n", parm->val);
579 return FTDM_FAIL;
580 }
581
582 } else if (!strcasecmp(parm->var, "switchType")) {
583 if (!strcasecmp(parm->val, "itu97")) {
584 mtpLink->mtp3.switchType = LSI_SW_ITU97;
585 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU97\"\n");
586 } else if (!strcasecmp(parm->val, "itu88")) {
587 mtpLink->mtp3.switchType = LSI_SW_ITU;
588 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU88\"\n");
589 } else if (!strcasecmp(parm->val, "itu92")) {
590 mtpLink->mtp3.switchType = LSI_SW_ITU;
591 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU92\"\n");
592 } else if (!strcasecmp(parm->val, "itu00")) {
593 mtpLink->mtp3.switchType = LSI_SW_ITU2000;
594 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU00\"\n");
595 } else if (!strcasecmp(parm->val, "ETSIV2")) {
596 mtpLink->mtp3.switchType = LSI_SW_ETSI;
597 SS7_DEBUG("\tFound mtpLink->switchType = \"ETSIV2\"\n");
598 } else if (!strcasecmp(parm->val, "ETSIV3")) {
599 mtpLink->mtp3.switchType = LSI_SW_ETSIV3;
600 SS7_DEBUG("\tFound mtpLink->switchType = \"ETSIV3\"\n");
601 } else if (!strcasecmp(parm->val, "UK")) {
602 mtpLink->mtp3.switchType = LSI_SW_UK;
603 SS7_DEBUG("\tFound mtpLink->switchType = \"UK\"\n");
604 } else if (!strcasecmp(parm->val, "RUSSIA")) {
605 mtpLink->mtp3.switchType = LSI_SW_RUSSIA;
606 SS7_DEBUG("\tFound mtpLink->switchType = \"RUSSIA\"\n");
607 } else if (!strcasecmp(parm->val, "INDIA")) {
608 mtpLink->mtp3.switchType = LSI_SW_INDIA;
609 SS7_DEBUG("\tFound mtpLink->switchType = \"INDIA\"\n");
610 } else if (!strcasecmp(parm->val, "ansi88")) {
611 mtpLink->mtp3.switchType = LSI_SW_ANS88;
612 SS7_DEBUG("\tFound mtpLink->switchType = \"ANSI88\"\n");
613 } else if (!strcasecmp(parm->val, "ansi92")) {
614 mtpLink->mtp3.switchType = LSI_SW_ANS92;
615 SS7_DEBUG("\tFound mtpLink->switchType = \"ANSI92\"\n");
616 } else if (!strcasecmp(parm->val, "ansi95")) {
617 mtpLink->mtp3.switchType = LSI_SW_ANS95;
618 SS7_DEBUG("\tFound mtpLink->switchType = \"ANSI95\"\n");
619 } else {
620 SS7_ERROR("\tFound an invalid linktype of \"%s\"!\n", parm->val);
621 return FTDM_FAIL;
622 }
623
624 } else if (!strcasecmp(parm->var, "ssf")) {
625 if (!strcasecmp(parm->val, "nat")) {
626 mtpLink->mtp3.ssf = SSF_NAT;
627 } else if (!strcasecmp(parm->val, "int")) {
628 mtpLink->mtp3.ssf = SSF_INTL;
629 } else {
630 SS7_ERROR("\tFound an invalid ssf of \"%s\"!\n", parm->val);
631 return FTDM_FAIL;
632 }
633
634 } else if (!strcasecmp(parm->var, "slc")) {
635 mtpLink->mtp3.slc = atoi(parm->val);
636 SS7_DEBUG("\tFound mtpLink->slc = \"%d\"\n",mtpLink->mtp3.slc);
637
638 } else if (!strcasecmp(parm->var, "mtp2.t1")) {
639 mtpLink->mtp2.t1 = atoi(parm->val);
640 SS7_DEBUG("\tFound mtp2 t1 = \"%d\"\n",mtpLink->mtp2.t1);
641
642 } else if (!strcasecmp(parm->var, "mtp2.t2")) {
643 mtpLink->mtp2.t2 = atoi(parm->val);
644 SS7_DEBUG("\tFound mtp2 t2 = \"%d\"\n",mtpLink->mtp2.t2);
645
646 } else if (!strcasecmp(parm->var, "mtp2.t3")) {
647 mtpLink->mtp2.t3 = atoi(parm->val);
648 SS7_DEBUG("\tFound mtp2 t3 = \"%d\"\n",mtpLink->mtp2.t3);
649
650 } else if (!strcasecmp(parm->var, "mtp2.t4n")) {
651 mtpLink->mtp2.t4n = atoi(parm->val);
652 SS7_DEBUG("\tFound mtp2 t4n = \"%d\"\n",mtpLink->mtp2.t4n);
653
654 } else if (!strcasecmp(parm->var, "mtp2.t4e")) {
655 mtpLink->mtp2.t4e = atoi(parm->val);
656 SS7_DEBUG("\tFound mtp2 t4e = \"%d\"\n",mtpLink->mtp2.t4e);
657
658 } else if (!strcasecmp(parm->var, "mtp2.t5")) {
659 mtpLink->mtp2.t5 = atoi(parm->val);
660 SS7_DEBUG("\tFound mtp2 t5 = \"%d\"\n",mtpLink->mtp2.t5);
661
662 } else if (!strcasecmp(parm->var, "mtp2.t6")) {
663 mtpLink->mtp2.t6 = atoi(parm->val);
664 SS7_DEBUG("\tFound mtp2 t6 = \"%d\"\n",mtpLink->mtp2.t6);
665
666 } else if (!strcasecmp(parm->var, "mtp2.t7")) {
667 mtpLink->mtp2.t7 = atoi(parm->val);
668 SS7_DEBUG("\tFound mtp2 t7 = \"%d\"\n",mtpLink->mtp2.t7);
669
670 } else if (!strcasecmp(parm->var, "mtp3.t1")) {
671 mtpLink->mtp3.t1 = atoi(parm->val);
672 SS7_DEBUG("\tFound mtp3 t1 = \"%d\"\n",mtpLink->mtp3.t1);
673
674 } else if (!strcasecmp(parm->var, "mtp3.t2")) {
675 mtpLink->mtp3.t2 = atoi(parm->val);
676 SS7_DEBUG("\tFound mtp3 t2 = \"%d\"\n",mtpLink->mtp3.t2);
677
678 } else if (!strcasecmp(parm->var, "mtp3.t3")) {
679 mtpLink->mtp3.t3 = atoi(parm->val);
680 SS7_DEBUG("\tFound mtp3 t3 = \"%d\"\n",mtpLink->mtp3.t3);
681
682 } else if (!strcasecmp(parm->var, "mtp3.t4")) {
683 mtpLink->mtp3.t4 = atoi(parm->val);
684 SS7_DEBUG("\tFound mtp3 t4 = \"%d\"\n",mtpLink->mtp3.t4);
685
686 } else if (!strcasecmp(parm->var, "mtp3.t5")) {
687 mtpLink->mtp3.t5 = atoi(parm->val);
688 SS7_DEBUG("\tFound mtp3 t5 = \"%d\"\n",mtpLink->mtp3.t5);
689
690 } else if (!strcasecmp(parm->var, "mtp3.t7")) {
691 mtpLink->mtp3.t7 = atoi(parm->val);
692 SS7_DEBUG("\tFound mtp3 t7 = \"%d\"\n",mtpLink->mtp3.t7);
693
694 } else if (!strcasecmp(parm->var, "mtp3.t12")) {
695 mtpLink->mtp3.t12 = atoi(parm->val);
696 SS7_DEBUG("\tFound mtp3 t12 = \"%d\"\n",mtpLink->mtp3.t12);
697
698 } else if (!strcasecmp(parm->var, "mtp3.t13")) {
699 mtpLink->mtp3.t13 = atoi(parm->val);
700 SS7_DEBUG("\tFound mtp3 t13 = \"%d\"\n",mtpLink->mtp3.t13);
701
702 } else if (!strcasecmp(parm->var, "mtp3.t14")) {
703 mtpLink->mtp3.t14 = atoi(parm->val);
704 SS7_DEBUG("\tFound mtp3 t14 = \"%d\"\n",mtpLink->mtp3.t14);
705
706 } else if (!strcasecmp(parm->var, "mtp3.t17")) {
707 mtpLink->mtp3.t17 = atoi(parm->val);
708 SS7_DEBUG("\tFound mtp3 t17 = \"%d\"\n",mtpLink->mtp3.t17);
709
710 } else if (!strcasecmp(parm->var, "mtp3.t22")) {
711 mtpLink->mtp3.t22 = atoi(parm->val);
712 SS7_DEBUG("\tFound mtp3 t22 = \"%d\"\n",mtpLink->mtp3.t22);
713
714 } else if (!strcasecmp(parm->var, "mtp3.t23")) {
715 mtpLink->mtp3.t23 = atoi(parm->val);
716 SS7_DEBUG("\tFound mtp3 t23 = \"%d\"\n",mtpLink->mtp3.t23);
717
718 } else if (!strcasecmp(parm->var, "mtp3.t24")) {
719 mtpLink->mtp3.t24 = atoi(parm->val);
720 SS7_DEBUG("\tFound mtp3 t24 = \"%d\"\n",mtpLink->mtp3.t24);
721
722 } else if (!strcasecmp(parm->var, "mtp3.t31")) {
723 mtpLink->mtp3.t31 = atoi(parm->val);
724 SS7_DEBUG("\tFound mtp3 t31 = \"%d\"\n",mtpLink->mtp3.t31);
725
726 } else if (!strcasecmp(parm->var, "mtp3.t32")) {
727 mtpLink->mtp3.t32 = atoi(parm->val);
728 SS7_DEBUG("\tFound mtp3 t32 = \"%d\"\n",mtpLink->mtp3.t32);
729
730 } else if (!strcasecmp(parm->var, "mtp3.t33")) {
731 mtpLink->mtp3.t33 = atoi(parm->val);
732 SS7_DEBUG("\tFound mtp3 t33 = \"%d\"\n",mtpLink->mtp3.t33);
733
734 } else if (!strcasecmp(parm->var, "mtp3.t34")) {
735 mtpLink->mtp3.t34 = atoi(parm->val);
736 SS7_DEBUG("\tFound mtp3 t34 = \"%d\"\n",mtpLink->mtp3.t34);
737
738 } else if (!strcasecmp(parm->var, "mtp3.t35")) {
739 mtpLink->mtp3.t35 = atoi(parm->val);
740 SS7_DEBUG("\tFound mtp3 t35 = \"%d\"\n",mtpLink->mtp3.t35);
741
742 } else if (!strcasecmp(parm->var, "mtp3.t36")) {
743 mtpLink->mtp3.t36 = atoi(parm->val);
744 SS7_DEBUG("\tFound mtp3 t36 = \"%d\"\n",mtpLink->mtp3.t36);
745
746 } else if (!strcasecmp(parm->var, "mtp3.t37")) {
747 mtpLink->mtp3.t37 = atoi(parm->val);
748 SS7_DEBUG("\tFound mtp3 t37 = \"%d\"\n",mtpLink->mtp3.t37);
749
750 } else if (!strcasecmp(parm->var, "mtp3.tcraft")) {
751 mtpLink->mtp3.tcraft = atoi(parm->val);
752 SS7_DEBUG("\tFound mtp3 tcraft = \"%d\"\n",mtpLink->mtp3.tcraft);
753
754 } else if (!strcasecmp(parm->var, "mtp3.tflc")) {
755 mtpLink->mtp3.tflc = atoi(parm->val);
756 SS7_DEBUG("\tFound mtp3 tflc = \"%d\"\n",mtpLink->mtp3.tflc);
757
758 } else if (!strcasecmp(parm->var, "mtp3.tbnd")) {
759 mtpLink->mtp3.tbnd = atoi(parm->val);
760 SS7_DEBUG("\tFound mtp3 tbnd = \"%d\"\n",mtpLink->mtp3.tbnd);
761
762 } else {
763 SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
764 return FTDM_FAIL;
765 }
766
767
768 parm = parm + 1;
769 }
770
771 return FTDM_SUCCESS;
772 }
773
774
775 static int ftmod_ss7_parse_mtp_routes(ftdm_conf_node_t *mtp_routes)
776 {
777 ftdm_conf_node_t *mtp_route = NULL;
778
779
780 if (strcasecmp(mtp_routes->name, "mtp_routes")) {
781 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_routes\"!\n",mtp_routes->name);
782 return FTDM_FAIL;
783 } else {
784 SS7_DEBUG("Parsing \"mtp_routes\"...\n");
785 }
786
787
788 mtp_route = mtp_routes->child;
789
790 while (mtp_route != NULL) {
791
792 if (ftmod_ss7_parse_mtp_route(mtp_route)) {
793 SS7_ERROR("Failed to parse \"mtp_route\"\n");
794 return FTDM_FAIL;
795 }
796
797
798 mtp_route = mtp_route->next;
799 }
800
801 return FTDM_SUCCESS;
802 }
803
804
805 static int ftmod_ss7_parse_mtp_route(ftdm_conf_node_t *mtp_route)
806 {
807 sng_route_t mtpRoute;
808 ftdm_conf_parameter_t *parm = mtp_route->parameters;
809 int num_parms = mtp_route->n_parameters;
810 int i;
811
812 memset(&mtpRoute, 0x0, sizeof(mtpRoute));
813
814
815 if (strcasecmp(mtp_route->name, "mtp_route")) {
816 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_route\"!\n",mtp_route->name);
817 return FTDM_FAIL;
818 } else {
819 SS7_DEBUG("Parsing \"mtp_route\"...\n");
820 }
821
822 for (i = 0; i < num_parms; i++) {
823
824
825 if (!strcasecmp(parm->var, "name")) {
826 strcpy((char *)mtpRoute.name, parm->val);
827 SS7_DEBUG("\tFound an \"mtp_route\" named = %s\n", mtpRoute.name);
828
829 } else if (!strcasecmp(parm->var, "dpc")) {
830 mtpRoute.dpc = atoi(parm->val);
831 SS7_DEBUG("\tFound mtpRoute->dpc = %d\n", mtpRoute.dpc);
832
833 } else if (!strcasecmp(parm->var, "mtp_linkset")) {
834
835
836 int x = 1;
837 while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
838
839 if (!strcasecmp((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name, parm->val)) {
840
841
842 mtpRoute.linkType = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].linkType;
843 mtpRoute.switchType = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].switchType;
844 mtpRoute.ssf = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].ssf;
845 mtpRoute.linkSetId = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id;
846 cmbLinkSetId++;
847 mtpRoute.cmbLinkSetId = cmbLinkSetId;
848
849
850 g_ftdm_sngss7_data.cfg.mtpLinkSet[x].numLinks++;
851 g_ftdm_sngss7_data.cfg.mtpLinkSet[x].links[g_ftdm_sngss7_data.cfg.mtpLinkSet[x].numLinks-1] = mtpRoute.cmbLinkSetId;
852 break;
853 }
854 x++;
855 }
856
857
858 if (mtpRoute.cmbLinkSetId == 0) {
859 SS7_ERROR("\tFailed to find the linkset = \"%s\"!\n", parm->val);
860 return FTDM_FAIL;
861 } else {
862 SS7_DEBUG("\tFound mtp3_route->linkset = %s\n", parm->val);
863 }
864
865 } else if (!strcasecmp(parm->var, "isSTP")) {
866 if (!strcasecmp(parm->val, "no")) {
867 mtpRoute.isSTP = 0;
868 SS7_DEBUG("\tFound mtpRoute->isSTP = no\n");
869 } else if (!strcasecmp(parm->val, "yes")) {
870 mtpRoute.isSTP = 1;
871 SS7_DEBUG("\tFound mtpRoute->isSTP = yes\n");
872 } else {
873 SS7_ERROR("\tFound an invalid parameter for isSTP \"%s\"!\n", parm->val);
874 return FTDM_FAIL;
875 }
876
877 } else if (!strcasecmp(parm->var, "mtp3.t6")) {
878 mtpRoute.t6 = atoi(parm->val);
879 SS7_DEBUG("\tFound mtp3 t6 = \"%d\"\n",mtpRoute.t6);
880
881 } else if (!strcasecmp(parm->var, "mtp3.t8")) {
882 mtpRoute.t8 = atoi(parm->val);
883 SS7_DEBUG("\tFound mtp3 t8 = \"%d\"\n",mtpRoute.t8);
884
885 } else if (!strcasecmp(parm->var, "mtp3.t10")) {
886 mtpRoute.t10 = atoi(parm->val);
887 SS7_DEBUG("\tFound mtp3 t10 = \"%d\"\n",mtpRoute.t10);
888
889 } else if (!strcasecmp(parm->var, "mtp3.t11")) {
890 mtpRoute.t11 = atoi(parm->val);
891 SS7_DEBUG("\tFound mtp3 t11 = \"%d\"\n",mtpRoute.t11);
892
893 } else if (!strcasecmp(parm->var, "mtp3.t15")) {
894 mtpRoute.t15 = atoi(parm->val);
895 SS7_DEBUG("\tFound mtp3 t15 = \"%d\"\n",mtpRoute.t15);
896
897 } else if (!strcasecmp(parm->var, "mtp3.t16")) {
898 mtpRoute.t16 = atoi(parm->val);
899 SS7_DEBUG("\tFound mtp3 t16 = \"%d\"\n",mtpRoute.t16);
900
901 } else if (!strcasecmp(parm->var, "mtp3.t18")) {
902 mtpRoute.t18 = atoi(parm->val);
903 SS7_DEBUG("\tFound mtp3 t18 = \"%d\"\n",mtpRoute.t18);
904
905 } else if (!strcasecmp(parm->var, "mtp3.t19")) {
906 mtpRoute.t19 = atoi(parm->val);
907 SS7_DEBUG("\tFound mtp3 t19 = \"%d\"\n",mtpRoute.t19);
908
909 } else if (!strcasecmp(parm->var, "mtp3.t21")) {
910 mtpRoute.t21 = atoi(parm->val);
911 SS7_DEBUG("\tFound mtp3 t21 = \"%d\"\n",mtpRoute.t21);
912
913 } else if (!strcasecmp(parm->var, "mtp3.t25")) {
914 mtpRoute.t25 = atoi(parm->val);
915 SS7_DEBUG("\tFound mtp3 t25 = \"%d\"\n",mtpRoute.t25);
916
917 } else if (!strcasecmp(parm->var, "mtp3.t26")) {
918 mtpRoute.t26 = atoi(parm->val);
919 SS7_DEBUG("\tFound mtp3 t26 = \"%d\"\n",mtpRoute.t26);
920
921 } else {
922 SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
923 return FTDM_FAIL;
924
925 }
926
927
928 parm = parm + 1;
929 }
930
931 ftmod_ss7_fill_in_nsap(&mtpRoute);
932
933 ftmod_ss7_fill_in_mtp3_route(&mtpRoute);
934
935
936
937 return FTDM_SUCCESS;
938 }
939
940
941 static int ftmod_ss7_parse_isup_interfaces(ftdm_conf_node_t *isup_interfaces)
942 {
943 ftdm_conf_node_t *isup_interface = NULL;
944
945
946 if (strcasecmp(isup_interfaces->name, "isup_interfaces")) {
947 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"isup_interfaces\"!\n",isup_interfaces->name);
948 return FTDM_FAIL;
949 } else {
950 SS7_DEBUG("Parsing \"isup_interfaces\"...\n");
951 }
952
953
954 isup_interface = isup_interfaces->child;
955
956 while (isup_interface != NULL) {
957
958 if (ftmod_ss7_parse_isup_interface(isup_interface)) {
959 SS7_ERROR("Failed to parse \"isup_interface\"\n");
960 return FTDM_FAIL;
961 }
962
963
964 isup_interface = isup_interface->next;
965 }
966
967 return FTDM_SUCCESS;
968 }
969
970
971 static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
972 {
973 sng_isup_inf_t sng_isup;
974 sng_isap_t sng_isap;
975 ftdm_conf_parameter_t *parm = isup_interface->parameters;
976 int num_parms = isup_interface->n_parameters;
977 int i;
978 int linkSetId;
979 int flag_cld_nadi = 0;
980 int flag_clg_nadi = 0;
981
982 memset(&sng_isup, 0x0, sizeof(sng_isup));
983 memset(&sng_isap, 0x0, sizeof(sng_isap));
984
985
986 if (strcasecmp(isup_interface->name, "isup_interface")) {
987 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"isup_interface\"!\n",isup_interface->name);
988 return FTDM_FAIL;
989 } else {
990 SS7_DEBUG("Parsing \"isup_interface\"...\n");
991 }
992
993
994 for (i = 0; i < num_parms; i++) {
995
996
997 if (!strcasecmp(parm->var, "name")) {
998 strcpy((char *)sng_isup.name, parm->val);
999 SS7_DEBUG("\tFound an \"isup_interface\" named = %s\n", sng_isup.name);
1000
1001 } else if (!strcasecmp(parm->var, "spc")) {
1002 sng_isup.spc = atoi(parm->val);
1003 g_ftdm_sngss7_data.cfg.spc = sng_isup.spc;
1004 SS7_DEBUG("\tFound SPC = %d\n", sng_isup.spc);
1005
1006 } else if (!strcasecmp(parm->var, "mtp_route")) {
1007
1008 int x = 1;
1009
1010 while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) {
1011
1012
1013 if (!strcasecmp((char *)g_ftdm_sngss7_data.cfg.mtpRoute[x].name, parm->val)) {
1014
1015 sng_isup.mtpRouteId = g_ftdm_sngss7_data.cfg.mtpRoute[x].id;
1016 sng_isup.dpc = g_ftdm_sngss7_data.cfg.mtpRoute[x].dpc;
1017 sng_isup.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType;
1018 sng_isap.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType;
1019
1020
1021 int z = 1;
1022 while (g_ftdm_sngss7_data.cfg.nsap[z].id != 0) {
1023 if ((g_ftdm_sngss7_data.cfg.nsap[z].linkType == g_ftdm_sngss7_data.cfg.mtpRoute[x].linkType) &&
1024 (g_ftdm_sngss7_data.cfg.nsap[z].switchType == g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType) &&
1025 (g_ftdm_sngss7_data.cfg.nsap[z].ssf == g_ftdm_sngss7_data.cfg.mtpRoute[x].ssf)) {
1026 sng_isup.nwId = g_ftdm_sngss7_data.cfg.nsap[z].nwId;
1027
1028 break;
1029 }
1030
1031 z++;
1032 }
1033 break;
1034 }
1035 x++;
1036 }
1037
1038
1039 if (sng_isup.mtpRouteId == 0) {
1040 SS7_ERROR("\tFailed to find the MTP3 Route = \"%s\"!\n", parm->val);
1041 return FTDM_FAIL;
1042 } else {
1043 SS7_DEBUG("\tFound MTP3 Route = %s\n", parm->val);
1044 }
1045
1046 } else if (!strcasecmp(parm->var, "ssf")) {
1047 if (!strcasecmp(parm->val, "nat")) {
1048 sng_isup.ssf = SSF_NAT;
1049 sng_isap.ssf = SSF_NAT;
1050 } else if (!strcasecmp(parm->val, "int")) {
1051 sng_isup.ssf = SSF_INTL;
1052 sng_isap.ssf = SSF_INTL;
1053 } else {
1054 SS7_ERROR("\tFound an invalid ssf of \"%s\"!\n", parm->val);
1055 return FTDM_FAIL;
1056 }
1057
1058 } else if (!strcasecmp(parm->var, "license")) {
1059
1060 strcpy(g_ftdm_sngss7_data.cfg.license, parm->val);
1061 strcpy(g_ftdm_sngss7_data.cfg.signature, parm->val);
1062 strcat(g_ftdm_sngss7_data.cfg.signature, ".sig");
1063 SS7_DEBUG("\tFound license file = %s\n", g_ftdm_sngss7_data.cfg.license);
1064 SS7_DEBUG("\tFound signature file = %s\n", g_ftdm_sngss7_data.cfg.signature);
1065
1066 } else if (!strcasecmp(parm->var, "isup.t1")) {
1067 sng_isap.t1 = atoi(parm->val);
1068 SS7_DEBUG("\tFound isup t1 = \"%d\"\n",sng_isap.t1);
1069
1070 } else if (!strcasecmp(parm->var, "isup.t2")) {
1071 sng_isap.t2 = atoi(parm->val);
1072 SS7_DEBUG("\tFound isup t2 = \"%d\"\n",sng_isap.t2);
1073
1074 } else if (!strcasecmp(parm->var, "isup.t4")) {
1075 sng_isup.t4 = atoi(parm->val);
1076 SS7_DEBUG("\tFound isup t4 = \"%d\"\n",sng_isup.t4);
1077
1078 } else if (!strcasecmp(parm->var, "isup.t5")) {
1079 sng_isap.t5 = atoi(parm->val);
1080 SS7_DEBUG("\tFound isup t5 = \"%d\"\n",sng_isap.t5);
1081
1082 } else if (!strcasecmp(parm->var, "isup.t6")) {
1083 sng_isap.t6 = atoi(parm->val);
1084 SS7_DEBUG("\tFound isup t6 = \"%d\"\n",sng_isap.t6);
1085
1086 } else if (!strcasecmp(parm->var, "isup.t7")) {
1087 sng_isap.t7 = atoi(parm->val);
1088 SS7_DEBUG("\tFound isup t7 = \"%d\"\n",sng_isap.t7);
1089
1090 } else if (!strcasecmp(parm->var, "isup.t8")) {
1091 sng_isap.t8 = atoi(parm->val);
1092 SS7_DEBUG("\tFound isup t8 = \"%d\"\n",sng_isap.t8);
1093
1094 } else if (!strcasecmp(parm->var, "isup.t9")) {
1095 sng_isap.t9 = atoi(parm->val);
1096 SS7_DEBUG("\tFound isup t9 = \"%d\"\n",sng_isap.t9);
1097
1098 } else if (!strcasecmp(parm->var, "isup.t10")) {
1099 sng_isup.t10 = atoi(parm->val);
1100 SS7_DEBUG("\tFound isup t10 = \"%d\"\n",sng_isup.t10);
1101
1102 } else if (!strcasecmp(parm->var, "isup.t11")) {
1103 sng_isup.t11 = atoi(parm->val);
1104 SS7_DEBUG("\tFound isup t11 = \"%d\"\n",sng_isup.t11);
1105
1106 } else if (!strcasecmp(parm->var, "isup.t18")) {
1107 sng_isup.t18 = atoi(parm->val);
1108 SS7_DEBUG("\tFound isup t18 = \"%d\"\n",sng_isup.t18);
1109
1110 } else if (!strcasecmp(parm->var, "isup.t19")) {
1111 sng_isup.t19 = atoi(parm->val);
1112 SS7_DEBUG("\tFound isup t19 = \"%d\"\n",sng_isup.t19);
1113
1114 } else if (!strcasecmp(parm->var, "isup.t20")) {
1115 sng_isup.t20 = atoi(parm->val);
1116 SS7_DEBUG("\tFound isup t20 = \"%d\"\n",sng_isup.t20);
1117
1118 } else if (!strcasecmp(parm->var, "isup.t21")) {
1119 sng_isup.t21 = atoi(parm->val);
1120 SS7_DEBUG("\tFound isup t21 = \"%d\"\n",sng_isup.t21);
1121
1122 } else if (!strcasecmp(parm->var, "isup.t22")) {
1123 sng_isup.t22 = atoi(parm->val);
1124 SS7_DEBUG("\tFound isup t22 = \"%d\"\n",sng_isup.t22);
1125
1126 } else if (!strcasecmp(parm->var, "isup.t23")) {
1127 sng_isup.t23 = atoi(parm->val);
1128 SS7_DEBUG("\tFound isup t23 = \"%d\"\n",sng_isup.t23);
1129
1130 } else if (!strcasecmp(parm->var, "isup.t24")) {
1131 sng_isup.t24 = atoi(parm->val);
1132 SS7_DEBUG("\tFound isup t24 = \"%d\"\n",sng_isup.t24);
1133
1134 } else if (!strcasecmp(parm->var, "isup.t25")) {
1135 sng_isup.t25 = atoi(parm->val);
1136 SS7_DEBUG("\tFound isup t25 = \"%d\"\n",sng_isup.t25);
1137
1138 } else if (!strcasecmp(parm->var, "isup.t26")) {
1139 sng_isup.t26 = atoi(parm->val);
1140 SS7_DEBUG("\tFound isup t26 = \"%d\"\n",sng_isup.t26);
1141
1142 } else if (!strcasecmp(parm->var, "isup.t28")) {
1143 sng_isup.t28 = atoi(parm->val);
1144 SS7_DEBUG("\tFound isup t28 = \"%d\"\n",sng_isup.t28);
1145
1146 } else if (!strcasecmp(parm->var, "isup.t29")) {
1147 sng_isup.t29 = atoi(parm->val);
1148 SS7_DEBUG("\tFound isup t29 = \"%d\"\n",sng_isup.t29);
1149
1150 } else if (!strcasecmp(parm->var, "isup.t30")) {
1151 sng_isup.t30 = atoi(parm->val);
1152 SS7_DEBUG("\tFound isup t30 = \"%d\"\n",sng_isup.t30);
1153
1154 } else if (!strcasecmp(parm->var, "isup.t31")) {
1155 sng_isap.t31 = atoi(parm->val);
1156 SS7_DEBUG("\tFound isup t31 = \"%d\"\n",sng_isap.t31);
1157
1158 } else if (!strcasecmp(parm->var, "isup.t32")) {
1159 sng_isup.t32 = atoi(parm->val);
1160 SS7_DEBUG("\tFound isup t32 = \"%d\"\n",sng_isup.t32);
1161
1162 } else if (!strcasecmp(parm->var, "isup.t33")) {
1163 sng_isap.t33 = atoi(parm->val);
1164 SS7_DEBUG("\tFound isup t33 = \"%d\"\n",sng_isap.t33);
1165
1166 } else if (!strcasecmp(parm->var, "isup.t34")) {
1167 sng_isap.t34 = atoi(parm->val);
1168 SS7_DEBUG("\tFound isup t34 = \"%d\"\n",sng_isap.t34);
1169
1170 } else if (!strcasecmp(parm->var, "isup.t35")) {
1171 sng_isup.t35 = atoi(parm->val);
1172 SS7_DEBUG("\tFound isup t35 = \"%d\"\n",sng_isup.t35);
1173
1174 } else if (!strcasecmp(parm->var, "isup.t36")) {
1175 sng_isap.t36 = atoi(parm->val);
1176 SS7_DEBUG("\tFound isup t36 = \"%d\"\n",sng_isap.t36);
1177
1178 } else if (!strcasecmp(parm->var, "isup.t37")) {
1179 sng_isup.t37 = atoi(parm->val);
1180 SS7_DEBUG("\tFound isup t37 = \"%d\"\n",sng_isup.t37);
1181
1182 } else if (!strcasecmp(parm->var, "isup.t38")) {
1183 sng_isup.t38 = atoi(parm->val);
1184 SS7_DEBUG("\tFound isup t38 = \"%d\"\n",sng_isup.t38);
1185
1186 } else if (!strcasecmp(parm->var, "isup.t39")) {
1187 sng_isup.t39 = atoi(parm->val);
1188 SS7_DEBUG("\tFound isup t39 = \"%d\"\n",sng_isup.t39);
1189
1190 } else if (!strcasecmp(parm->var, "isup.tccr")) {
1191 sng_isap.tccr = atoi(parm->val);
1192 SS7_DEBUG("\tFound isup tccr = \"%d\"\n",sng_isap.tccr);
1193
1194 } else if (!strcasecmp(parm->var, "isup.tccrt")) {
1195 sng_isap.tccrt = atoi(parm->val);
1196 SS7_DEBUG("\tFound isup tccrt = \"%d\"\n",sng_isap.tccrt);
1197
1198 } else if (!strcasecmp(parm->var, "isup.tex")) {
1199 sng_isap.tex = atoi(parm->val);
1200 SS7_DEBUG("\tFound isup tex = \"%d\"\n",sng_isap.tex);
1201
1202 } else if (!strcasecmp(parm->var, "isup.tect")) {
1203 sng_isap.tect = atoi(parm->val);
1204 SS7_DEBUG("\tFound isup tect = \"%d\"\n",sng_isap.tect);
1205
1206 } else if (!strcasecmp(parm->var, "isup.tcrm")) {
1207 sng_isap.tcrm = atoi(parm->val);
1208 SS7_DEBUG("\tFound isup tcrm = \"%d\"\n",sng_isap.tcrm);
1209
1210 } else if (!strcasecmp(parm->var, "isup.tcra")) {
1211 sng_isap.tcra = atoi(parm->val);
1212 SS7_DEBUG("\tFound isup tcra = \"%d\"\n",sng_isap.tcra);
1213
1214 } else if (!strcasecmp(parm->var, "isup.tfgr")) {
1215 sng_isup.tfgr = atoi(parm->val);
1216 SS7_DEBUG("\tFound isup tfgr = \"%d\"\n",sng_isup.tfgr);
1217
1218 } else if (!strcasecmp(parm->var, "isup.trelrsp")) {
1219 sng_isap.trelrsp = atoi(parm->val);
1220 SS7_DEBUG("\tFound isup trelrsp = \"%d\"\n",sng_isap.trelrsp);
1221
1222 } else if (!strcasecmp(parm->var, "isup.tfnlrelrsp")) {
1223 sng_isap.tfnlrelrsp = atoi(parm->val);
1224 SS7_DEBUG("\tFound isup tfnlrelrsp = \"%d\"\n",sng_isap.tfnlrelrsp);
1225
1226 } else if (!strcasecmp(parm->var, "isup.tfnlrelrsp")) {
1227 sng_isap.tfnlrelrsp = atoi(parm->val);
1228 SS7_DEBUG("\tFound isup tfnlrelrsp = \"%d\"\n",sng_isap.tfnlrelrsp);
1229
1230 } else if (!strcasecmp(parm->var, "isup.tpause")) {
1231 sng_isup.tpause = atoi(parm->val);
1232 SS7_DEBUG("\tFound isup tpause = \"%d\"\n",sng_isup.tpause);
1233
1234 } else if (!strcasecmp(parm->var, "isup.tstaenq")) {
1235 sng_isup.tstaenq = atoi(parm->val);
1236 SS7_DEBUG("\tFound isup tstaenq = \"%d\"\n",sng_isup.tstaenq);
1237
1238 } else if (!strcasecmp(parm->var, "clg_nadi")) {
1239
1240
1241 flag_clg_nadi = 1;
1242 sng_isup.clg_nadi = atoi(parm->val);
1243 SS7_DEBUG("\tFound default CLG_NADI value = %d\n", sng_isup.clg_nadi);
1244
1245 } else if (!strcasecmp(parm->var, "cld_nadi")) {
1246
1247
1248 flag_cld_nadi = 1;
1249 sng_isup.cld_nadi = atoi(parm->val);
1250 SS7_DEBUG("\tFound default CLD_NADI value = %d\n", sng_isup.cld_nadi);
1251
1252 } else if (!strcasecmp(parm->var, "obci_bita")) {
1253
1254 if (*parm->val == '1') {
1255 sngss7_set_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
1256 SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) enable option\n");
1257 } else if (*parm->val == '0') {
1258 sngss7_clear_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
1259 SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) disable option\n");
1260 } else {
1261 SS7_DEBUG("\tInvalid value for \"obci_bita\" option\n");
1262 }
1263
1264 } else if (!strcasecmp(parm->var, "lpa_on_cot")) {
1265
1266 if (*parm->val == '1') {
1267 sngss7_set_options(&sng_isup, SNGSS7_LPA_FOR_COT);
1268 SS7_DEBUG("\tFound Tx LPA on COT enable option\n");
1269 } else if (*parm->val == '0') {
1270 sngss7_clear_options(&sng_isup, SNGSS7_LPA_FOR_COT);
1271 SS7_DEBUG("\tFound Tx LPA on COT disable option\n");
1272 } else {
1273 SS7_DEBUG("\tInvalid value for \"lpa_on_cot\" option\n");
1274 }
1275
1276 } else {
1277 SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
1278 return FTDM_FAIL;
1279
1280 }
1281
1282
1283 parm = parm + 1;
1284 }
1285
1286
1287 if (!flag_cld_nadi) {
1288
1289 sng_isup.cld_nadi = 0x03;
1290 }
1291
1292 if (!flag_clg_nadi) {
1293
1294 sng_isup.clg_nadi = 0x03;
1295 }
1296
1297
1298 linkSetId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].linkSetId;
1299
1300 i = 1;
1301 while (g_ftdm_sngss7_data.cfg.mtpLink[i].id != 0) {
1302 if (g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkSetId == linkSetId) {
1303 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.spc = g_ftdm_sngss7_data.cfg.spc;
1304 }
1305
1306 i++;
1307 }
1308
1309 ftmod_ss7_fill_in_isap(&sng_isap);
1310
1311 sng_isup.isap = sng_isap.id;
1312
1313 ftmod_ss7_fill_in_isup_interface(&sng_isup);
1314
1315 return FTDM_SUCCESS;
1316 }
1317
1318
1319 static int ftmod_ss7_fill_in_mtpLink(sng_mtp_link_t *mtpLink)
1320 {
1321 int i;
1322
1323
1324 i = 1;
1325 while (g_ftdm_sngss7_data.cfg.mtpLink[i].id != 0) {
1326 if ((g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.span == mtpLink->mtp1.span) &&
1327 (g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.chan == mtpLink->mtp1.chan)) {
1328
1329
1330 break;
1331 }
1332
1333 i++;
1334 }
1335
1336
1337 if (g_ftdm_sngss7_data.cfg.mtpLink[i].id == 0) {
1338 mtpLink->id = i;
1339 SS7_DEBUG("found new mtpLink on span=%d, chan=%d, id = %d\n",
1340 mtpLink->mtp1.span,
1341 mtpLink->mtp1.chan,
1342 mtpLink->id);
1343 } else {
1344 mtpLink->id = i;
1345 SS7_DEBUG("found existing mtpLink on span=%d, chan=%d, id = %d\n",
1346 mtpLink->mtp1.span,
1347 mtpLink->mtp1.chan,
1348 mtpLink->id);
1349 }
1350
1351
1352 strcpy((char *)g_ftdm_sngss7_data.cfg.mtpLink[i].name, (char *)mtpLink->name);
1353
1354 g_ftdm_sngss7_data.cfg.mtpLink[i].id = mtpLink->id;
1355
1356 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.span = mtpLink->mtp1.span;
1357 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.chan = mtpLink->mtp1.chan;
1358
1359 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.linkType = mtpLink->mtp2.linkType;
1360 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.errorType = mtpLink->mtp2.errorType;
1361 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.lssuLength = mtpLink->mtp2.lssuLength;
1362 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.mtp1Id = mtpLink->id;
1363
1364 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.priority = mtpLink->mtp3.priority;
1365 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkType = mtpLink->mtp3.linkType;
1366 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.switchType = mtpLink->mtp3.switchType;
1367 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.apc = mtpLink->mtp3.apc;
1368 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.spc = g_ftdm_sngss7_data.cfg.spc;
1369 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.ssf = mtpLink->mtp3.ssf;
1370 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.slc = mtpLink->mtp3.slc;
1371 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkSetId = mtpLink->mtp3.linkSetId;
1372 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.mtp2Id = mtpLink->id;
1373
1374 if ( mtpLink->mtp2.t1 != 0 ) {
1375 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t1 = mtpLink->mtp2.t1;
1376 }else {
1377 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t1 = 500;
1378 }
1379 if ( mtpLink->mtp2.t2 != 0 ) {
1380 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t2 = mtpLink->mtp2.t2;
1381 }else {
1382 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t2 = 250;
1383 }
1384 if ( mtpLink->mtp2.t3 != 0 ) {
1385 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t3 = mtpLink->mtp2.t3;
1386 }else {
1387 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t3 = 20;
1388 }
1389 if ( mtpLink->mtp2.t4n != 0 ) {
1390 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4n = mtpLink->mtp2.t4n;
1391 }else {
1392 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4n = 80;
1393 }
1394 if ( mtpLink->mtp2.t4e != 0 ) {
1395 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4e = mtpLink->mtp2.t4e;
1396 }else {
1397 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4e = 5;
1398 }
1399 if ( mtpLink->mtp2.t5 != 0 ) {
1400 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t5 = mtpLink->mtp2.t5;
1401 }else {
1402 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t5 = 1;
1403 }
1404 if ( mtpLink->mtp2.t6 != 0 ) {
1405 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t6 = mtpLink->mtp2.t6;
1406 }else {
1407 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t6 = 60;
1408 }
1409 if ( mtpLink->mtp2.t7 != 0 ) {
1410 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t7 = mtpLink->mtp2.t7;
1411 }else {
1412 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t7 = 40;
1413 }
1414
1415 if (mtpLink->mtp3.t1 != 0) {
1416 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t1 = mtpLink->mtp3.t1;
1417 } else {
1418 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t1 = 8;
1419 }
1420 if (mtpLink->mtp3.t2 != 0) {
1421 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t2 = mtpLink->mtp3.t2;
1422 } else {
1423 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t2 = 14;
1424 }
1425 if (mtpLink->mtp3.t3 != 0) {
1426 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t3 = mtpLink->mtp3.t3;
1427 } else {
1428 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t3 = 8;
1429 }
1430 if (mtpLink->mtp3.t4 != 0) {
1431 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t4 = mtpLink->mtp3.t4;
1432 } else {
1433 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t4 = 8;
1434 }
1435 if (mtpLink->mtp3.t5 != 0) {
1436 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t5 = mtpLink->mtp3.t5;
1437 } else {
1438 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t5 = 8;
1439 }
1440 if (mtpLink->mtp3.t7 != 0) {
1441 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t7 = mtpLink->mtp3.t7;
1442 } else {
1443 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t7 = 15;
1444 }
1445 if (mtpLink->mtp3.t12 != 0) {
1446 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t12 = mtpLink->mtp3.t12;
1447 } else {
1448 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t12 = 15;
1449 }
1450 if (mtpLink->mtp3.t13 != 0) {
1451 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t13 = mtpLink->mtp3.t13;
1452 } else {
1453 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t13 = 15;
1454 }
1455 if (mtpLink->mtp3.t14 != 0) {
1456 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t14 = mtpLink->mtp3.t14;
1457 } else {
1458 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t14 = 30;
1459 }
1460 if (mtpLink->mtp3.t17 != 0) {
1461 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t17 = mtpLink->mtp3.t17;
1462 } else {
1463 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t17 = 15;
1464 }
1465 if (mtpLink->mtp3.t22 != 0) {
1466 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t22 = mtpLink->mtp3.t22;
1467 } else {
1468 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t22 = 1800;
1469 }
1470 if (mtpLink->mtp3.t23 != 0) {
1471 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t23 = mtpLink->mtp3.t23;
1472 } else {
1473 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t23 = 1800;
1474 }
1475 if (mtpLink->mtp3.t24 != 0) {
1476 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t24 = mtpLink->mtp3.t24;
1477 } else {
1478 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t24 = 5;
1479 }
1480 if (mtpLink->mtp3.t31 != 0) {
1481 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t31 = mtpLink->mtp3.t31;
1482 } else {
1483 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t31 = 50;
1484 }
1485 if (mtpLink->mtp3.t32 != 0) {
1486 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t32 = mtpLink->mtp3.t32;
1487 } else {
1488 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t32 = 120;
1489 }
1490 if (mtpLink->mtp3.t33 != 0) {
1491 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t33 = mtpLink->mtp3.t33;
1492 } else {
1493 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t33 = 3000;
1494 }
1495 if (mtpLink->mtp3.t34 != 0) {
1496 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t34 = mtpLink->mtp3.t34;
1497 } else {
1498 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t34 = 600;
1499 }
1500 if (mtpLink->mtp3.tflc != 0) {
1501 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.tflc = mtpLink->mtp3.tflc;
1502 } else {
1503 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.tflc = 300;
1504 }
1505 return (mtpLink->id);
1506 }
1507
1508
1509
1510 static int ftmod_ss7_fill_in_mtpLinkSet(sng_link_set_t *mtpLinkSet)
1511 {
1512 int i = mtpLinkSet->id;
1513
1514 strcpy((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[i].name, (char *)mtpLinkSet->name);
1515
1516 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].id = mtpLinkSet->id;
1517 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].apc = mtpLinkSet->apc;
1518 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].linkType = mtpLinkSet->linkType;
1519 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].switchType = mtpLinkSet->switchType;
1520 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].ssf = mtpLinkSet->ssf;
1521
1522
1523 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].minActive = mtpLinkSet->minActive;
1524 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].numLinks = 0;
1525 return 0;
1526 }
1527
1528
1529 static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
1530 {
1531 int i;
1532
1533
1534 i = 1;
1535 while (g_ftdm_sngss7_data.cfg.mtpRoute[i].id != 0) {
1536 if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpRoute[i].name, mtp3_route->name)) {
1537
1538 break;
1539 }
1540
1541 i++;
1542 }
1543
1544 if (g_ftdm_sngss7_data.cfg.mtpRoute[i].id == 0) {
1545 mtp3_route->id = i;
1546 SS7_DEBUG("found new mtp3_route, id is = %d\n", mtp3_route->id);
1547 } else {
1548 mtp3_route->id = i;
1549 SS7_DEBUG("found existing mtp3_route, id is = %d\n", mtp3_route->id);
1550 }
1551
1552 strcpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, (char *)mtp3_route->name);
1553
1554 g_ftdm_sngss7_data.cfg.mtpRoute[i].id = mtp3_route->id;
1555 g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc = mtp3_route->dpc;
1556 g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType = mtp3_route->linkType;
1557 g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType = mtp3_route->switchType;
1558 g_ftdm_sngss7_data.cfg.mtpRoute[i].cmbLinkSetId = mtp3_route->cmbLinkSetId;
1559 g_ftdm_sngss7_data.cfg.mtpRoute[i].isSTP = mtp3_route->isSTP;
1560 g_ftdm_sngss7_data.cfg.mtpRoute[i].nwId = mtp3_route->nwId;
1561 g_ftdm_sngss7_data.cfg.mtpRoute[i].linkSetId = mtp3_route->linkSetId;
1562 g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf = mtp3_route->ssf;
1563 if (mtp3_route->t6 != 0) {
1564 g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = mtp3_route->t6;
1565 } else {
1566 g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = 8;
1567 }
1568 if (mtp3_route->t8 != 0) {
1569 g_ftdm_sngss7_data.cfg.mtpRoute[i].t8 = mtp3_route->t8;
1570 } else {
1571 g_ftdm_sngss7_data.cfg.mtpRoute[i].t8 = 12;
1572 }
1573 if (mtp3_route->t10 != 0) {
1574 g_ftdm_sngss7_data.cfg.mtpRoute[i].t10 = mtp3_route->t10;
1575 } else {
1576 g_ftdm_sngss7_data.cfg.mtpRoute[i].t10 = 300;
1577 }
1578 if (mtp3_route->t11 != 0) {
1579 g_ftdm_sngss7_data.cfg.mtpRoute[i].t11 = mtp3_route->t11;
1580 } else {
1581 g_ftdm_sngss7_data.cfg.mtpRoute[i].t11 = 300;
1582 }
1583 if (mtp3_route->t15 != 0) {
1584 g_ftdm_sngss7_data.cfg.mtpRoute[i].t15 = mtp3_route->t15;
1585 } else {
1586 g_ftdm_sngss7_data.cfg.mtpRoute[i].t15 = 30;
1587 }
1588 if (mtp3_route->t16 != 0) {
1589 g_ftdm_sngss7_data.cfg.mtpRoute[i].t16 = mtp3_route->t16;
1590 } else {
1591 g_ftdm_sngss7_data.cfg.mtpRoute[i].t16 = 20;
1592 }
1593 if (mtp3_route->t18 != 0) {
1594 g_ftdm_sngss7_data.cfg.mtpRoute[i].t18 = mtp3_route->t18;
1595 } else {
1596 g_ftdm_sngss7_data.cfg.mtpRoute[i].t18 = 200;
1597 }
1598 if (mtp3_route->t19 != 0) {
1599 g_ftdm_sngss7_data.cfg.mtpRoute[i].t19 = mtp3_route->t19;
1600 } else {
1601 g_ftdm_sngss7_data.cfg.mtpRoute[i].t19 = 690;
1602 }
1603 if (mtp3_route->t21 != 0) {
1604 g_ftdm_sngss7_data.cfg.mtpRoute[i].t21 = mtp3_route->t21;
1605 } else {
1606 g_ftdm_sngss7_data.cfg.mtpRoute[i].t21 = 650;
1607 }
1608 if (mtp3_route->t25 != 0) {
1609 g_ftdm_sngss7_data.cfg.mtpRoute[i].t25 = mtp3_route->t25;
1610 } else {
1611 g_ftdm_sngss7_data.cfg.mtpRoute[i].t25 = 100;
1612 }
1613 if (mtp3_route->t26 != 0) {
1614 g_ftdm_sngss7_data.cfg.mtpRoute[i].t26 = mtp3_route->t26;
1615 } else {
1616 g_ftdm_sngss7_data.cfg.mtpRoute[i].t26 = 100;
1617 }
1618
1619 return 0;
1620 }
1621
1622
1623 static int ftmod_ss7_fill_in_nsap(sng_route_t *mtp3_route)
1624 {
1625 int i;
1626
1627
1628 i = 1;
1629 while (g_ftdm_sngss7_data.cfg.nsap[i].id != 0) {
1630 if ((g_ftdm_sngss7_data.cfg.nsap[i].linkType == mtp3_route->linkType) &&
1631 (g_ftdm_sngss7_data.cfg.nsap[i].switchType == mtp3_route->switchType) &&
1632 (g_ftdm_sngss7_data.cfg.nsap[i].ssf == mtp3_route->ssf)) {
1633
1634
1635 break;
1636 }
1637
1638 i++;
1639 }
1640
1641 if (g_ftdm_sngss7_data.cfg.nsap[i].id == 0) {
1642 g_ftdm_sngss7_data.cfg.nsap[i].id = i;
1643 mtp3_route->nwId = i;
1644 SS7_DEBUG("found new mtp3_isup interface, id is = %d\n", g_ftdm_sngss7_data.cfg.nsap[i].id);
1645 } else {
1646 g_ftdm_sngss7_data.cfg.nsap[i].id = i;
1647 mtp3_route->nwId = i;
1648 SS7_DEBUG("found existing mtp3_isup interface, id is = %d\n", g_ftdm_sngss7_data.cfg.nsap[i].id);
1649 }
1650
1651 g_ftdm_sngss7_data.cfg.nsap[i].spId = g_ftdm_sngss7_data.cfg.nsap[i].id;
1652 g_ftdm_sngss7_data.cfg.nsap[i].suId = g_ftdm_sngss7_data.cfg.nsap[i].id;
1653 g_ftdm_sngss7_data.cfg.nsap[i].nwId = mtp3_route->nwId;
1654 g_ftdm_sngss7_data.cfg.nsap[i].linkType = mtp3_route->linkType;
1655 g_ftdm_sngss7_data.cfg.nsap[i].switchType = mtp3_route->switchType;
1656 g_ftdm_sngss7_data.cfg.nsap[i].ssf = mtp3_route->ssf;
1657
1658 return 0;
1659 }
1660
1661
1662 static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup)
1663 {
1664 int i;
1665
1666
1667 i = 1;
1668 while (g_ftdm_sngss7_data.cfg.isupIntf[i].id != 0) {
1669 if (!strcasecmp(g_ftdm_sngss7_data.cfg.isupIntf[i].name, sng_isup->name)) {
1670
1671
1672 break;
1673 }
1674
1675 i++;
1676 }
1677
1678 if (g_ftdm_sngss7_data.cfg.isupIntf[i].id == 0) {
1679 sng_isup->id = i;
1680 SS7_DEBUG("found new isup interface, id is = %d\n", sng_isup->id);
1681 } else {
1682 sng_isup->id = i;
1683 SS7_DEBUG("found existing isup interface, id is = %d\n", sng_isup->id);
1684 }
1685
1686 strcpy((char *)g_ftdm_sngss7_data.cfg.isupIntf[i].name, (char *)sng_isup->name);
1687
1688 g_ftdm_sngss7_data.cfg.isupIntf[i].id = sng_isup->id;
1689 g_ftdm_sngss7_data.cfg.isupIntf[i].mtpRouteId = sng_isup->mtpRouteId;
1690 g_ftdm_sngss7_data.cfg.isupIntf[i].nwId = sng_isup->nwId;
1691 g_ftdm_sngss7_data.cfg.isupIntf[i].dpc = sng_isup->dpc;
1692 g_ftdm_sngss7_data.cfg.isupIntf[i].spc = sng_isup->spc;
1693 g_ftdm_sngss7_data.cfg.isupIntf[i].switchType = sng_isup->switchType;
1694 g_ftdm_sngss7_data.cfg.isupIntf[i].ssf = sng_isup->ssf;
1695 g_ftdm_sngss7_data.cfg.isupIntf[i].isap = sng_isup->isap;
1696 g_ftdm_sngss7_data.cfg.isupIntf[i].cld_nadi = sng_isup->cld_nadi;
1697 g_ftdm_sngss7_data.cfg.isupIntf[i].clg_nadi = sng_isup->clg_nadi;
1698 g_ftdm_sngss7_data.cfg.isupIntf[i].options = sng_isup->options;
1699 if (sng_isup->t4 != 0) {
1700 g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = sng_isup->t4;
1701 } else {
1702 g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = 3000;
1703 }
1704 if (sng_isup->t10 != 0) {
1705 g_ftdm_sngss7_data.cfg.isupIntf[i].t10 = sng_isup->t10;
1706 } else {
1707 g_ftdm_sngss7_data.cfg.isupIntf[i].t10 = 50;
1708 }
1709 if (sng_isup->t11 != 0) {
1710 g_ftdm_sngss7_data.cfg.isupIntf[i].t11 = sng_isup->t11;
1711 } else {
1712 g_ftdm_sngss7_data.cfg.isupIntf[i].t11 = 170;
1713 }
1714 if (sng_isup->t18 != 0) {
1715 g_ftdm_sngss7_data.cfg.isupIntf[i].t18 = sng_isup->t18;
1716 } else {
1717 g_ftdm_sngss7_data.cfg.isupIntf[i].t18 = 300;
1718 }
1719 if (sng_isup->t19 != 0) {
1720 g_ftdm_sngss7_data.cfg.isupIntf[i].t19 = sng_isup->t19;
1721 } else {
1722 g_ftdm_sngss7_data.cfg.isupIntf[i].t19 = 3000;
1723 }
1724 if (sng_isup->t20 != 0) {
1725 g_ftdm_sngss7_data.cfg.isupIntf[i].t20 = sng_isup->t20;
1726 } else {
1727 g_ftdm_sngss7_data.cfg.isupIntf[i].t20 = 300;
1728 }
1729 if (sng_isup->t21 != 0) {
1730 g_ftdm_sngss7_data.cfg.isupIntf[i].t21 = sng_isup->t21;
1731 } else {
1732 g_ftdm_sngss7_data.cfg.isupIntf[i].t21 = 3000;
1733 }
1734 if (sng_isup->t22 != 0) {
1735 g_ftdm_sngss7_data.cfg.isupIntf[i].t22 = sng_isup->t22;
1736 } else {
1737 g_ftdm_sngss7_data.cfg.isupIntf[i].t22 = 300;
1738 }
1739 if (sng_isup->t23 != 0) {
1740 g_ftdm_sngss7_data.cfg.isupIntf[i].t23 = sng_isup->t23;
1741 } else {
1742 g_ftdm_sngss7_data.cfg.isupIntf[i].t23 = 3000;
1743 }
1744 if (sng_isup->t24 != 0) {
1745 g_ftdm_sngss7_data.cfg.isupIntf[i].t24 = sng_isup->t24;
1746 } else {
1747 g_ftdm_sngss7_data.cfg.isupIntf[i].t24 = 10;
1748 }
1749 if (sng_isup->t25 != 0) {
1750 g_ftdm_sngss7_data.cfg.isupIntf[i].t25 = sng_isup->t25;
1751 } else {
1752 g_ftdm_sngss7_data.cfg.isupIntf[i].t25 = 20;
1753 }
1754 if (sng_isup->t26 != 0) {
1755 g_ftdm_sngss7_data.cfg.isupIntf[i].t26 = sng_isup->t26;
1756 } else {
1757 g_ftdm_sngss7_data.cfg.isupIntf[i].t26 = 600;
1758 }
1759 if (sng_isup->t28 != 0) {
1760 g_ftdm_sngss7_data.cfg.isupIntf[i].t28 = sng_isup->t28;
1761 } else {
1762 g_ftdm_sngss7_data.cfg.isupIntf[i].t28 = 100;
1763 }
1764 if (sng_isup->t29 != 0) {
1765 g_ftdm_sngss7_data.cfg.isupIntf[i].t29 = sng_isup->t29;
1766 } else {
1767 g_ftdm_sngss7_data.cfg.isupIntf[i].t29 = 6;
1768 }
1769 if (sng_isup->t30 != 0) {
1770 g_ftdm_sngss7_data.cfg.isupIntf[i].t30 = sng_isup->t30;
1771 } else {
1772 g_ftdm_sngss7_data.cfg.isupIntf[i].t30 = 50;
1773 }
1774 if (sng_isup->t32 != 0) {
1775 g_ftdm_sngss7_data.cfg.isupIntf[i].t32 = sng_isup->t32;
1776 } else {
1777 g_ftdm_sngss7_data.cfg.isupIntf[i].t32 = 30;
1778 }
1779 if (sng_isup->t35 != 0) {
1780 g_ftdm_sngss7_data.cfg.isupIntf[i].t35 = sng_isup->t35;
1781 } else {
1782 g_ftdm_sngss7_data.cfg.isupIntf[i].t35 = 170;
1783 }
1784 if (sng_isup->t37 != 0) {
1785 g_ftdm_sngss7_data.cfg.isupIntf[i].t37 = sng_isup->t37;
1786 } else {
1787 g_ftdm_sngss7_data.cfg.isupIntf[i].t37 = 20;
1788 }
1789 if (sng_isup->t38 != 0) {
1790 g_ftdm_sngss7_data.cfg.isupIntf[i].t38 = sng_isup->t38;
1791 } else {
1792 g_ftdm_sngss7_data.cfg.isupIntf[i].t38 = 1200;
1793 }
1794 if (sng_isup->t39 != 0) {
1795 g_ftdm_sngss7_data.cfg.isupIntf[i].t39 = sng_isup->t39;
1796 } else {
1797 g_ftdm_sngss7_data.cfg.isupIntf[i].t39 = 300;
1798 }
1799 if (sng_isup->tfgr != 0) {
1800 g_ftdm_sngss7_data.cfg.isupIntf[i].tfgr = sng_isup->tfgr;
1801 } else {
1802 g_ftdm_sngss7_data.cfg.isupIntf[i].tfgr = 50;
1803 }
1804 if (sng_isup->tpause != 0) {
1805 g_ftdm_sngss7_data.cfg.isupIntf[i].tpause = sng_isup->tpause;
1806 } else {
1807 g_ftdm_sngss7_data.cfg.isupIntf[i].tpause = 150;
1808 }
1809 if (sng_isup->tstaenq != 0) {
1810 g_ftdm_sngss7_data.cfg.isupIntf[i].tstaenq = sng_isup->tstaenq;
1811 } else {
1812 g_ftdm_sngss7_data.cfg.isupIntf[i].tstaenq = 5000;
1813 }
1814
1815 return 0;
1816 }
1817
1818
1819 static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap)
1820 {
1821 int i;
1822
1823
1824 i = 1;
1825 while (g_ftdm_sngss7_data.cfg.isap[i].id != 0) {
1826 if (g_ftdm_sngss7_data.cfg.isap[i].switchType == sng_isap->switchType) {
1827
1828
1829 break;
1830 }
1831
1832 i++;
1833 }
1834
1835 if (g_ftdm_sngss7_data.cfg.isap[i].id == 0) {
1836 sng_isap->id = i;
1837 SS7_DEBUG("found new isup to cc interface, id is = %d\n", g_ftdm_sngss7_data.cfg.isap[i].id);
1838 } else {
1839 sng_isap->id = i;
1840 SS7_DEBUG("found existing isup to cc interface, id is = %d\n", g_ftdm_sngss7_data.cfg.isap[i].id);
1841 }
1842
1843 g_ftdm_sngss7_data.cfg.isap[i].id = sng_isap->id;
1844 g_ftdm_sngss7_data.cfg.isap[i].suId = sng_isap->id;
1845 g_ftdm_sngss7_data.cfg.isap[i].spId = sng_isap->id;
1846 g_ftdm_sngss7_data.cfg.isap[i].switchType = sng_isap->switchType;
1847 g_ftdm_sngss7_data.cfg.isap[i].ssf = sng_isap->ssf;
1848
1849 if (sng_isap->t1 != 0) {
1850 g_ftdm_sngss7_data.cfg.isap[i].t1 = sng_isap->t1;
1851 } else {
1852 g_ftdm_sngss7_data.cfg.isap[i].t1 = 200;
1853 }
1854 if (sng_isap->t2 != 0) {
1855 g_ftdm_sngss7_data.cfg.isap[i].t2 = sng_isap->t2;
1856 } else {
1857 g_ftdm_sngss7_data.cfg.isap[i].t2 = 1800;
1858 }
1859 if (sng_isap->t5 != 0) {
1860 g_ftdm_sngss7_data.cfg.isap[i].t5 = sng_isap->t5;
1861 } else {
1862 g_ftdm_sngss7_data.cfg.isap[i].t5 = 3000;
1863 }
1864 if (sng_isap->t6 != 0) {
1865 g_ftdm_sngss7_data.cfg.isap[i].t6 = sng_isap->t6;
1866 } else {
1867 g_ftdm_sngss7_data.cfg.isap[i].t6 = 200;
1868 }
1869 if (sng_isap->t7 != 0) {
1870 g_ftdm_sngss7_data.cfg.isap[i].t7 = sng_isap->t7;
1871 } else {
1872 g_ftdm_sngss7_data.cfg.isap[i].t7 = 250;
1873 }
1874 if (sng_isap->t8 != 0) {
1875 g_ftdm_sngss7_data.cfg.isap[i].t8 = sng_isap->t8;
1876 } else {
1877 g_ftdm_sngss7_data.cfg.isap[i].t8 = 120;
1878 }
1879 if (sng_isap->t9 != 0) {
1880 g_ftdm_sngss7_data.cfg.isap[i].t9 = sng_isap->t9;
1881 } else {
1882 g_ftdm_sngss7_data.cfg.isap[i].t9 = 1800;
1883 }
1884 if (sng_isap->t27 != 0) {
1885 g_ftdm_sngss7_data.cfg.isap[i].t27 = sng_isap->t27;
1886 } else {
1887 g_ftdm_sngss7_data.cfg.isap[i].t27 = 2400;
1888 }
1889 if (sng_isap->t31 != 0) {
1890 g_ftdm_sngss7_data.cfg.isap[i].t31 = sng_isap->t31;
1891 } else {
1892 g_ftdm_sngss7_data.cfg.isap[i].t31 = 3650;
1893 }
1894 if (sng_isap->t33 != 0) {
1895 g_ftdm_sngss7_data.cfg.isap[i].t33 = sng_isap->t33;
1896 } else {
1897 g_ftdm_sngss7_data.cfg.isap[i].t33 = 120;
1898 }
1899 if (sng_isap->t34 != 0) {
1900 g_ftdm_sngss7_data.cfg.isap[i].t34 = sng_isap->t34;
1901 } else {
1902 g_ftdm_sngss7_data.cfg.isap[i].t34 = 40;
1903 }
1904 if (sng_isap->t36 != 0) {
1905 g_ftdm_sngss7_data.cfg.isap[i].t36 = sng_isap->t36;
1906 } else {
1907 g_ftdm_sngss7_data.cfg.isap[i].t36 = 120;
1908 }
1909 if (sng_isap->tccr != 0) {
1910 g_ftdm_sngss7_data.cfg.isap[i].tccr = sng_isap->tccr;
1911 } else {
1912 g_ftdm_sngss7_data.cfg.isap[i].tccr = 200;
1913 }
1914 if (sng_isap->tccrt != 0) {
1915 g_ftdm_sngss7_data.cfg.isap[i].tccrt = sng_isap->tccrt;
1916 } else {
1917 g_ftdm_sngss7_data.cfg.isap[i].tccrt = 20;
1918 }
1919 if (sng_isap->tex != 0) {
1920 g_ftdm_sngss7_data.cfg.isap[i].tex = sng_isap->tex;
1921 } else {
1922 g_ftdm_sngss7_data.cfg.isap[i].tex = 1000;
1923 }
1924 if (sng_isap->tcrm != 0) {
1925 g_ftdm_sngss7_data.cfg.isap[i].tcrm = sng_isap->tcrm;
1926 } else {
1927 g_ftdm_sngss7_data.cfg.isap[i].tcrm = 30;
1928 }
1929 if (sng_isap->tcra != 0) {
1930 g_ftdm_sngss7_data.cfg.isap[i].tcra = sng_isap->tcra;
1931 } else {
1932 g_ftdm_sngss7_data.cfg.isap[i].tcra = 100;
1933 }
1934 if (sng_isap->tect != 0) {
1935 g_ftdm_sngss7_data.cfg.isap[i].tect = sng_isap->tect;
1936 } else {
1937 g_ftdm_sngss7_data.cfg.isap[i].tect = 10;
1938 }
1939 if (sng_isap->trelrsp != 0) {
1940 g_ftdm_sngss7_data.cfg.isap[i].trelrsp = sng_isap->trelrsp;
1941 } else {
1942 g_ftdm_sngss7_data.cfg.isap[i].trelrsp = 10;
1943 }
1944 if (sng_isap->tfnlrelrsp != 0) {
1945 g_ftdm_sngss7_data.cfg.isap[i].tfnlrelrsp = sng_isap->tfnlrelrsp;
1946 } else {
1947 g_ftdm_sngss7_data.cfg.isap[i].tfnlrelrsp = 10;
1948 }
1949
1950 return 0;
1951 }
1952
1953
1954 static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
1955 {
1956
1957 if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == 0){
1958 SS7_DEBUG("found new mtp3 self route\n");
1959 } else if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == spc) {
1960 SS7_DEBUG("found existing mtp3 self route\n");
1961 return FTDM_SUCCESS;
1962 } else {
1963 SS7_ERROR("found new mtp3 self route but it does not match the route already configured (dpc=%d:spc=%d)\n",
1964 g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc,
1965 spc);
1966 return FTDM_FAIL;
1967 }
1968
1969 strcpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-route");
1970
1971 g_ftdm_sngss7_data.cfg.mtpRoute[0].id = 0;
1972 g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc = spc;
1973 g_ftdm_sngss7_data.cfg.mtpRoute[0].linkType = linkType;
1974 g_ftdm_sngss7_data.cfg.mtpRoute[0].switchType = switchType;
1975 g_ftdm_sngss7_data.cfg.mtpRoute[0].cmbLinkSetId = 0;
1976 g_ftdm_sngss7_data.cfg.mtpRoute[0].isSTP = 0;
1977 g_ftdm_sngss7_data.cfg.mtpRoute[0].ssf = ssf;
1978 g_ftdm_sngss7_data.cfg.mtpRoute[0].t6 = 8;
1979 g_ftdm_sngss7_data.cfg.mtpRoute[0].t8 = 12;
1980 g_ftdm_sngss7_data.cfg.mtpRoute[0].t10 = 300;
1981 g_ftdm_sngss7_data.cfg.mtpRoute[0].t11 = 300;
1982 g_ftdm_sngss7_data.cfg.mtpRoute[0].t15 = 30;
1983 g_ftdm_sngss7_data.cfg.mtpRoute[0].t16 = 20;
1984 g_ftdm_sngss7_data.cfg.mtpRoute[0].t18 = 200;
1985 g_ftdm_sngss7_data.cfg.mtpRoute[0].t19 = 690;
1986 g_ftdm_sngss7_data.cfg.mtpRoute[0].t21 = 650;
1987 g_ftdm_sngss7_data.cfg.mtpRoute[0].t25 = 100;
1988
1989 return 0;
1990 }
1991
1992
1993 static int ftmod_ss7_fill_in_circuits(sng_isupCkt_t *isupCkt)
1994 {
1995 sngss7_chan_data_t *ss7_info = NULL;
1996 ftdm_channel_t *ftdmchan = NULL;
1997 sng_timeslot_t timeslot;
1998 int count;
1999 int i;
2000 int x;
2001
2002 count = 1;
2003
2004 while (isupCkt->ch_map[0] != '\0') {
2005
2006
2007 if (ftmod_ss7_next_timeslot(isupCkt->ch_map, ×lot)) {
2008 SS7_ERROR("Failed to parse the channel map!\n");
2009 return FTDM_FAIL;
2010 }
2011
2012 if ((timeslot.siglink) || (timeslot.gap)) {
2013
2014 x = 1;
2015 while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
2016 if ((g_ftdm_sngss7_data.cfg.isupCkt[x].chan == count) &&
2017 (g_ftdm_sngss7_data.cfg.isupCkt[x].span == isupCkt->span->channels[1]->physical_span_id)) {
2018
2019 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is already exists...id=%d\n",
2020 isupCkt->span->channels[1]->physical_span_id,
2021 count,
2022 x);
2023
2024
2025 break;
2026 }
2027
2028 x++;
2029 }
2030
2031
2032 if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) {
2033 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2034 isupCkt->span->channels[1]->physical_span_id,
2035 count,
2036 x);
2037
2038
2039 ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
2040 ss7_info->ftdmchan = NULL;
2041 ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x];
2042
2043
2044 g_ftdm_sngss7_data.cfg.isupCkt[x].id = x;
2045 g_ftdm_sngss7_data.cfg.isupCkt[x].span = isupCkt->span->channels[1]->physical_span_id;
2046 g_ftdm_sngss7_data.cfg.isupCkt[x].chan = count;
2047 if (timeslot.siglink) {
2048 g_ftdm_sngss7_data.cfg.isupCkt[x].type = SIG;
2049 } else {
2050 g_ftdm_sngss7_data.cfg.isupCkt[x].type = HOLE;
2051 }
2052
2053 if (timeslot.channel) {
2054 g_ftdm_sngss7_data.cfg.isupCkt[x].cic = isupCkt->cicbase;
2055 isupCkt->cicbase++;
2056 } else {
2057 g_ftdm_sngss7_data.cfg.isupCkt[x].cic = 0;
2058 }
2059 g_ftdm_sngss7_data.cfg.isupCkt[x].infId = isupCkt->isupInf;
2060 g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = isupCkt->typeCntrl;
2061 g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].ssf;
2062 g_ftdm_sngss7_data.cfg.isupCkt[x].obj = ss7_info;
2063
2064 }
2065
2066
2067 count++;
2068
2069 } else {
2070
2071 i = 1;
2072 while (isupCkt->span->channels[i] != NULL) {
2073 if (isupCkt->span->channels[i]->physical_chan_id == timeslot.channel) {
2074 break;
2075 }
2076 i++;
2077 }
2078
2079 if (isupCkt->span->channels[i] == NULL) {
2080
2081 SS7_ERROR("Unable to find the requested channel %d in the FreeTDM channels!\n", timeslot.channel);
2082 return FTDM_FAIL;
2083 } else {
2084 ftdmchan = isupCkt->span->channels[i];
2085 }
2086
2087
2088 x = 1;
2089 while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
2090 if ((g_ftdm_sngss7_data.cfg.isupCkt[x].chan == ftdmchan->physical_chan_id) &&
2091 (g_ftdm_sngss7_data.cfg.isupCkt[x].span == ftdmchan->physical_span_id)) {
2092
2093
2094 break;
2095 }
2096
2097 x++;
2098 }
2099
2100
2101 if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) {
2102 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2103 ftdmchan->physical_span_id,
2104 ftdmchan->physical_chan_id,
2105 x);
2106
2107
2108 ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
2109 ss7_info->ftdmchan = ftdmchan;
2110 ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x];
2111 ftdmchan->call_data = ss7_info;
2112
2113
2114 ss7_info->t35.sched = ((sngss7_span_data_t *)isupCkt->span->mod_data)->sched;
2115 ss7_info->t35.counter = 1;
2116 ss7_info->t35.beat = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].t35*100;
2117 ss7_info->t35.callback = handle_isup_t35;
2118 ss7_info->t35.sngss7_info = ss7_info;
2119
2120
2121 g_ftdm_sngss7_data.cfg.isupCkt[x].id = x;
2122 g_ftdm_sngss7_data.cfg.isupCkt[x].span = ftdmchan->physical_span_id;
2123 g_ftdm_sngss7_data.cfg.isupCkt[x].chan = ftdmchan->physical_chan_id;
2124 g_ftdm_sngss7_data.cfg.isupCkt[x].type = VOICE;
2125 g_ftdm_sngss7_data.cfg.isupCkt[x].cic = isupCkt->cicbase;
2126 g_ftdm_sngss7_data.cfg.isupCkt[x].infId = isupCkt->isupInf;
2127 g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = isupCkt->typeCntrl;
2128 if (isupCkt->t3 == 0) {
2129 g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200;
2130 } else {
2131 g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = isupCkt->t3;
2132 }
2133 if (isupCkt->t12 == 0) {
2134 g_ftdm_sngss7_data.cfg.isupCkt[x].t12 = 300;
2135 } else {
2136 g_ftdm_sngss7_data.cfg.isupCkt[x].t12 = isupCkt->t12;
2137 }
2138 if (isupCkt->t13 == 0) {
2139 g_ftdm_sngss7_data.cfg.isupCkt[x].t13 = 3000;
2140 } else {
2141 g_ftdm_sngss7_data.cfg.isupCkt[x].t13 = isupCkt->t13;
2142 }
2143 if (isupCkt->t14 == 0) {
2144 g_ftdm_sngss7_data.cfg.isupCkt[x].t14 = 300;
2145 } else {
2146 g_ftdm_sngss7_data.cfg.isupCkt[x].t14 = isupCkt->t14;
2147 }
2148 if (isupCkt->t15 == 0) {
2149 g_ftdm_sngss7_data.cfg.isupCkt[x].t15 = 3000;
2150 } else {
2151 g_ftdm_sngss7_data.cfg.isupCkt[x].t15 = isupCkt->t15;
2152 }
2153 if (isupCkt->t16 == 0) {
2154 g_ftdm_sngss7_data.cfg.isupCkt[x].t16 = 300;
2155 } else {
2156 g_ftdm_sngss7_data.cfg.isupCkt[x].t16 = isupCkt->t16;
2157 }
2158 if (isupCkt->t17 == 0) {
2159 g_ftdm_sngss7_data.cfg.isupCkt[x].t17 = 3000;
2160 } else {
2161 g_ftdm_sngss7_data.cfg.isupCkt[x].t17 = isupCkt->t17;
2162 }
2163 if (isupCkt->tval == 0) {
2164 g_ftdm_sngss7_data.cfg.isupCkt[x].tval = 10;
2165 } else {
2166 g_ftdm_sngss7_data.cfg.isupCkt[x].tval = isupCkt->tval;
2167 }
2168 g_ftdm_sngss7_data.cfg.isupCkt[x].obj = ss7_info;
2169 g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].ssf;
2170
2171
2172 isupCkt->cicbase++;
2173 } else {
2174 SS7_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2175 ftdmchan->physical_span_id,
2176 ftdmchan->physical_chan_id,
2177 x);
2178
2179
2180 ss7_info = NULL;
2181
2182
2183 }
2184
2185
2186 count++;
2187 }
2188
2189 if (ss7_info == NULL) {
2190 SS7_ERROR("KONRAD -> circuit was not configured !\n");
2191 return FTDM_FAIL;
2192 }
2193
2194 if (ss7_info->ftdmchan == NULL) {
2195 SS7_INFO("Added span = %d, chan = %d, cic = %d, FTDM chan = %d, ISUP cirId = %d\n",
2196 g_ftdm_sngss7_data.cfg.isupCkt[x].span,
2197 g_ftdm_sngss7_data.cfg.isupCkt[x].chan,
2198 g_ftdm_sngss7_data.cfg.isupCkt[x].cic,
2199 0,
2200 g_ftdm_sngss7_data.cfg.isupCkt[x].id);
2201 } else {
2202 SS7_INFO("Added span = %d, chan = %d, cic = %d, FTDM chan = %d, ISUP cirId = %d\n",
2203 g_ftdm_sngss7_data.cfg.isupCkt[x].span,
2204 g_ftdm_sngss7_data.cfg.isupCkt[x].chan,
2205 g_ftdm_sngss7_data.cfg.isupCkt[x].cic,
2206 ss7_info->ftdmchan->chan_id,
2207 g_ftdm_sngss7_data.cfg.isupCkt[x].id);
2208 }
2209
2210 }
2211
2212 return 0;
2213 }
2214
2215
2216 static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot)
2217 {
2218 int i;
2219 int x;
2220 int lower;
2221 int upper;
2222 char tmp[5];
2223 char new_ch_map[MAX_CIC_LENGTH];
2224
2225 memset(&tmp[0], '\0', sizeof(tmp));
2226 memset(&new_ch_map[0], '\0', sizeof(new_ch_map));
2227 memset(timeslot, 0x0, sizeof(sng_timeslot_t));
2228
2229 SS7_DEVEL_DEBUG("Old channel map = \"%s\"\n", ch_map);
2230
2231
2232 x = 0;
2233
2234 switch (ch_map[x]) {
2235
2236 case 'S':
2237 case 's':
2238 timeslot->siglink = 1;
2239
2240
2241 x++;
2242 if (ch_map[x] == ',') {
2243 timeslot->hole = 1;
2244 SS7_DEVEL_DEBUG(" Found a siglink in the channel map with a hole in the cic map\n");
2245 } else if (isdigit(ch_map[x])) {
2246
2247 SS7_DEVEL_DEBUG(" Found a siglink in the channel map with out a hole in the cic map\n");
2248 } else {
2249 SS7_ERROR("Found an illegal channel map character after signal link flag = \"%c\"!\n", ch_map[x]);
2250 return FTDM_FAIL;
2251 }
2252 break;
2253
2254 case 'G':
2255 case 'g':
2256 timeslot->gap = 1;
2257
2258
2259 x++;
2260 if (ch_map[x] == ',') {
2261 timeslot->hole = 1;
2262 SS7_DEVEL_DEBUG(" Found a gap in the channel map with a hole in the cic map\n");
2263 } else if (isdigit(ch_map[x])) {
2264 SS7_DEVEL_DEBUG(" Found a gap in the channel map with out a hole in the cic map\n");
2265
2266 } else {
2267 SS7_ERROR("Found an illegal channel map character after signal link flag = \"%c\"!\n", ch_map[x]);
2268 return FTDM_FAIL;
2269 }
2270 break;
2271
2272 case '1':
2273 case '2':
2274 case '3':
2275 case '4':
2276 case '5':
2277 case '6':
2278 case '7':
2279 case '8':
2280 case '9':
2281
2282 SS7_DEVEL_DEBUG("Found a starting channel in the channel map\n");
2283 break;
2284
2285 default:
2286 SS7_ERROR("Found an illegal channel map character = \"%c\"!\n", ch_map[x]);
2287 return FTDM_FAIL;
2288
2289 }
2290
2291
2292 i = 0;
2293 while ((ch_map[x] != '\0') && (ch_map[x] != '-') && (ch_map[x] != ',')) {
2294 tmp[i] = ch_map[x];
2295 i++;
2296 x++;
2297 }
2298 tmp[i] = '\0';
2299 timeslot->channel = atoi(tmp);
2300 lower = timeslot->channel + 1;
2301
2302
2303 if (ch_map[x] == '-') {
2304
2305 x++;
2306 i = 0;
2307 while ((ch_map[x] != '\0') && (ch_map[x] != '-') && (ch_map[x] != ',')) {
2308 tmp[i] = ch_map[x];
2309 i++;
2310 x++;
2311 }
2312 tmp[i] = '\0';
2313 upper = atoi(tmp);
2314
2315
2316 if (upper == lower) {
2317
2318 sprintf(new_ch_map, "%d", lower);
2319 } else if ( upper > lower) {
2320
2321 sprintf(new_ch_map, "%d-%d", lower, upper);
2322 } else {
2323 SS7_ERROR("The upper is less then the lower end of the range...should not happen!\n");
2324 return FTDM_FAIL;
2325 }
2326
2327
2328 strncat(new_ch_map, &ch_map[x], strlen(&ch_map[x]));
2329
2330
2331 strcpy(ch_map, new_ch_map);
2332
2333 } else if (ch_map[x] == ',') {
2334
2335 x++;
2336
2337
2338 strcpy(new_ch_map, &ch_map[x]);
2339
2340
2341 strcpy(ch_map, new_ch_map);
2342
2343 } else if (ch_map[x] == '\0') {
2344
2345 strcpy(new_ch_map, &ch_map[x]);
2346
2347
2348 strcpy(ch_map, new_ch_map);
2349 } else {
2350
2351 }
2352
2353 SS7_DEVEL_DEBUG("New channel map = \"%s\"\n", ch_map);
2354
2355 return FTDM_SUCCESS;
2356 }
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371