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 strncpy(isupCkt.ch_map, val, MAX_CIC_MAP_LENGTH-1);
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 strncpy((char *)mtpLinkSet.name, parm->val, MAX_NAME_LEN-1);
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 strncpy((char *)mtpLink->name, parm->val, MAX_NAME_LEN-1);
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 if (!strcasecmp(parm->val, "spare")) {
630 mtpLink->mtp3.ssf = SSF_SPARE;
631 } else if (!strcasecmp(parm->val, "res")) {
632 mtpLink->mtp3.ssf = SSF_RES;
633 } else {
634 SS7_ERROR("\tFound an invalid ssf of \"%s\"!\n", parm->val);
635 return FTDM_FAIL;
636 }
637
638 } else if (!strcasecmp(parm->var, "slc")) {
639 mtpLink->mtp3.slc = atoi(parm->val);
640 SS7_DEBUG("\tFound mtpLink->slc = \"%d\"\n",mtpLink->mtp3.slc);
641
642 } else if (!strcasecmp(parm->var, "mtp2.t1")) {
643 mtpLink->mtp2.t1 = atoi(parm->val);
644 SS7_DEBUG("\tFound mtp2 t1 = \"%d\"\n",mtpLink->mtp2.t1);
645
646 } else if (!strcasecmp(parm->var, "mtp2.t2")) {
647 mtpLink->mtp2.t2 = atoi(parm->val);
648 SS7_DEBUG("\tFound mtp2 t2 = \"%d\"\n",mtpLink->mtp2.t2);
649
650 } else if (!strcasecmp(parm->var, "mtp2.t3")) {
651 mtpLink->mtp2.t3 = atoi(parm->val);
652 SS7_DEBUG("\tFound mtp2 t3 = \"%d\"\n",mtpLink->mtp2.t3);
653
654 } else if (!strcasecmp(parm->var, "mtp2.t4n")) {
655 mtpLink->mtp2.t4n = atoi(parm->val);
656 SS7_DEBUG("\tFound mtp2 t4n = \"%d\"\n",mtpLink->mtp2.t4n);
657
658 } else if (!strcasecmp(parm->var, "mtp2.t4e")) {
659 mtpLink->mtp2.t4e = atoi(parm->val);
660 SS7_DEBUG("\tFound mtp2 t4e = \"%d\"\n",mtpLink->mtp2.t4e);
661
662 } else if (!strcasecmp(parm->var, "mtp2.t5")) {
663 mtpLink->mtp2.t5 = atoi(parm->val);
664 SS7_DEBUG("\tFound mtp2 t5 = \"%d\"\n",mtpLink->mtp2.t5);
665
666 } else if (!strcasecmp(parm->var, "mtp2.t6")) {
667 mtpLink->mtp2.t6 = atoi(parm->val);
668 SS7_DEBUG("\tFound mtp2 t6 = \"%d\"\n",mtpLink->mtp2.t6);
669
670 } else if (!strcasecmp(parm->var, "mtp2.t7")) {
671 mtpLink->mtp2.t7 = atoi(parm->val);
672 SS7_DEBUG("\tFound mtp2 t7 = \"%d\"\n",mtpLink->mtp2.t7);
673
674 } else if (!strcasecmp(parm->var, "mtp3.t1")) {
675 mtpLink->mtp3.t1 = atoi(parm->val);
676 SS7_DEBUG("\tFound mtp3 t1 = \"%d\"\n",mtpLink->mtp3.t1);
677
678 } else if (!strcasecmp(parm->var, "mtp3.t2")) {
679 mtpLink->mtp3.t2 = atoi(parm->val);
680 SS7_DEBUG("\tFound mtp3 t2 = \"%d\"\n",mtpLink->mtp3.t2);
681
682 } else if (!strcasecmp(parm->var, "mtp3.t3")) {
683 mtpLink->mtp3.t3 = atoi(parm->val);
684 SS7_DEBUG("\tFound mtp3 t3 = \"%d\"\n",mtpLink->mtp3.t3);
685
686 } else if (!strcasecmp(parm->var, "mtp3.t4")) {
687 mtpLink->mtp3.t4 = atoi(parm->val);
688 SS7_DEBUG("\tFound mtp3 t4 = \"%d\"\n",mtpLink->mtp3.t4);
689
690 } else if (!strcasecmp(parm->var, "mtp3.t5")) {
691 mtpLink->mtp3.t5 = atoi(parm->val);
692 SS7_DEBUG("\tFound mtp3 t5 = \"%d\"\n",mtpLink->mtp3.t5);
693
694 } else if (!strcasecmp(parm->var, "mtp3.t7")) {
695 mtpLink->mtp3.t7 = atoi(parm->val);
696 SS7_DEBUG("\tFound mtp3 t7 = \"%d\"\n",mtpLink->mtp3.t7);
697
698 } else if (!strcasecmp(parm->var, "mtp3.t12")) {
699 mtpLink->mtp3.t12 = atoi(parm->val);
700 SS7_DEBUG("\tFound mtp3 t12 = \"%d\"\n",mtpLink->mtp3.t12);
701
702 } else if (!strcasecmp(parm->var, "mtp3.t13")) {
703 mtpLink->mtp3.t13 = atoi(parm->val);
704 SS7_DEBUG("\tFound mtp3 t13 = \"%d\"\n",mtpLink->mtp3.t13);
705
706 } else if (!strcasecmp(parm->var, "mtp3.t14")) {
707 mtpLink->mtp3.t14 = atoi(parm->val);
708 SS7_DEBUG("\tFound mtp3 t14 = \"%d\"\n",mtpLink->mtp3.t14);
709
710 } else if (!strcasecmp(parm->var, "mtp3.t17")) {
711 mtpLink->mtp3.t17 = atoi(parm->val);
712 SS7_DEBUG("\tFound mtp3 t17 = \"%d\"\n",mtpLink->mtp3.t17);
713
714 } else if (!strcasecmp(parm->var, "mtp3.t22")) {
715 mtpLink->mtp3.t22 = atoi(parm->val);
716 SS7_DEBUG("\tFound mtp3 t22 = \"%d\"\n",mtpLink->mtp3.t22);
717
718 } else if (!strcasecmp(parm->var, "mtp3.t23")) {
719 mtpLink->mtp3.t23 = atoi(parm->val);
720 SS7_DEBUG("\tFound mtp3 t23 = \"%d\"\n",mtpLink->mtp3.t23);
721
722 } else if (!strcasecmp(parm->var, "mtp3.t24")) {
723 mtpLink->mtp3.t24 = atoi(parm->val);
724 SS7_DEBUG("\tFound mtp3 t24 = \"%d\"\n",mtpLink->mtp3.t24);
725
726 } else if (!strcasecmp(parm->var, "mtp3.t31")) {
727 mtpLink->mtp3.t31 = atoi(parm->val);
728 SS7_DEBUG("\tFound mtp3 t31 = \"%d\"\n",mtpLink->mtp3.t31);
729
730 } else if (!strcasecmp(parm->var, "mtp3.t32")) {
731 mtpLink->mtp3.t32 = atoi(parm->val);
732 SS7_DEBUG("\tFound mtp3 t32 = \"%d\"\n",mtpLink->mtp3.t32);
733
734 } else if (!strcasecmp(parm->var, "mtp3.t33")) {
735 mtpLink->mtp3.t33 = atoi(parm->val);
736 SS7_DEBUG("\tFound mtp3 t33 = \"%d\"\n",mtpLink->mtp3.t33);
737
738 } else if (!strcasecmp(parm->var, "mtp3.t34")) {
739 mtpLink->mtp3.t34 = atoi(parm->val);
740 SS7_DEBUG("\tFound mtp3 t34 = \"%d\"\n",mtpLink->mtp3.t34);
741
742 } else if (!strcasecmp(parm->var, "mtp3.t35")) {
743 mtpLink->mtp3.t35 = atoi(parm->val);
744 SS7_DEBUG("\tFound mtp3 t35 = \"%d\"\n",mtpLink->mtp3.t35);
745
746 } else if (!strcasecmp(parm->var, "mtp3.t36")) {
747 mtpLink->mtp3.t36 = atoi(parm->val);
748 SS7_DEBUG("\tFound mtp3 t36 = \"%d\"\n",mtpLink->mtp3.t36);
749
750 } else if (!strcasecmp(parm->var, "mtp3.t37")) {
751 mtpLink->mtp3.t37 = atoi(parm->val);
752 SS7_DEBUG("\tFound mtp3 t37 = \"%d\"\n",mtpLink->mtp3.t37);
753
754 } else if (!strcasecmp(parm->var, "mtp3.tcraft")) {
755 mtpLink->mtp3.tcraft = atoi(parm->val);
756 SS7_DEBUG("\tFound mtp3 tcraft = \"%d\"\n",mtpLink->mtp3.tcraft);
757
758 } else if (!strcasecmp(parm->var, "mtp3.tflc")) {
759 mtpLink->mtp3.tflc = atoi(parm->val);
760 SS7_DEBUG("\tFound mtp3 tflc = \"%d\"\n",mtpLink->mtp3.tflc);
761
762 } else if (!strcasecmp(parm->var, "mtp3.tbnd")) {
763 mtpLink->mtp3.tbnd = atoi(parm->val);
764 SS7_DEBUG("\tFound mtp3 tbnd = \"%d\"\n",mtpLink->mtp3.tbnd);
765
766 } else {
767 SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
768 return FTDM_FAIL;
769 }
770
771
772 parm = parm + 1;
773 }
774
775 return FTDM_SUCCESS;
776 }
777
778
779 static int ftmod_ss7_parse_mtp_routes(ftdm_conf_node_t *mtp_routes)
780 {
781 ftdm_conf_node_t *mtp_route = NULL;
782
783
784 if (strcasecmp(mtp_routes->name, "mtp_routes")) {
785 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_routes\"!\n",mtp_routes->name);
786 return FTDM_FAIL;
787 } else {
788 SS7_DEBUG("Parsing \"mtp_routes\"...\n");
789 }
790
791
792 mtp_route = mtp_routes->child;
793
794 while (mtp_route != NULL) {
795
796 if (ftmod_ss7_parse_mtp_route(mtp_route)) {
797 SS7_ERROR("Failed to parse \"mtp_route\"\n");
798 return FTDM_FAIL;
799 }
800
801
802 mtp_route = mtp_route->next;
803 }
804
805 return FTDM_SUCCESS;
806 }
807
808
809 static int ftmod_ss7_parse_mtp_route(ftdm_conf_node_t *mtp_route)
810 {
811 sng_route_t mtpRoute;
812 ftdm_conf_parameter_t *parm = mtp_route->parameters;
813 int num_parms = mtp_route->n_parameters;
814 int i;
815
816 memset(&mtpRoute, 0x0, sizeof(mtpRoute));
817
818
819 if (strcasecmp(mtp_route->name, "mtp_route")) {
820 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_route\"!\n",mtp_route->name);
821 return FTDM_FAIL;
822 } else {
823 SS7_DEBUG("Parsing \"mtp_route\"...\n");
824 }
825
826 for (i = 0; i < num_parms; i++) {
827
828
829 if (!strcasecmp(parm->var, "name")) {
830 strncpy((char *)mtpRoute.name, parm->val, MAX_NAME_LEN-1);
831 SS7_DEBUG("\tFound an \"mtp_route\" named = %s\n", mtpRoute.name);
832
833 } else if (!strcasecmp(parm->var, "dpc")) {
834 mtpRoute.dpc = atoi(parm->val);
835 SS7_DEBUG("\tFound mtpRoute->dpc = %d\n", mtpRoute.dpc);
836
837 } else if (!strcasecmp(parm->var, "mtp_linkset")) {
838
839
840 int x = 1;
841 while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
842
843 if (!strcasecmp((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name, parm->val)) {
844
845
846 mtpRoute.linkType = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].linkType;
847 mtpRoute.switchType = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].switchType;
848 mtpRoute.ssf = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].ssf;
849 mtpRoute.linkSetId = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id;
850 cmbLinkSetId++;
851 mtpRoute.cmbLinkSetId = cmbLinkSetId;
852
853
854 g_ftdm_sngss7_data.cfg.mtpLinkSet[x].numLinks++;
855 g_ftdm_sngss7_data.cfg.mtpLinkSet[x].links[g_ftdm_sngss7_data.cfg.mtpLinkSet[x].numLinks-1] = mtpRoute.cmbLinkSetId;
856 break;
857 }
858 x++;
859 }
860
861
862 if (mtpRoute.cmbLinkSetId == 0) {
863 SS7_ERROR("\tFailed to find the linkset = \"%s\"!\n", parm->val);
864 return FTDM_FAIL;
865 } else {
866 SS7_DEBUG("\tFound mtp3_route->linkset = %s\n", parm->val);
867 }
868
869 } else if (!strcasecmp(parm->var, "isSTP")) {
870 if (!strcasecmp(parm->val, "no")) {
871 mtpRoute.isSTP = 0;
872 SS7_DEBUG("\tFound mtpRoute->isSTP = no\n");
873 } else if (!strcasecmp(parm->val, "yes")) {
874 mtpRoute.isSTP = 1;
875 SS7_DEBUG("\tFound mtpRoute->isSTP = yes\n");
876 } else {
877 SS7_ERROR("\tFound an invalid parameter for isSTP \"%s\"!\n", parm->val);
878 return FTDM_FAIL;
879 }
880
881 } else if (!strcasecmp(parm->var, "mtp3.t6")) {
882 mtpRoute.t6 = atoi(parm->val);
883 SS7_DEBUG("\tFound mtp3 t6 = \"%d\"\n",mtpRoute.t6);
884
885 } else if (!strcasecmp(parm->var, "mtp3.t8")) {
886 mtpRoute.t8 = atoi(parm->val);
887 SS7_DEBUG("\tFound mtp3 t8 = \"%d\"\n",mtpRoute.t8);
888
889 } else if (!strcasecmp(parm->var, "mtp3.t10")) {
890 mtpRoute.t10 = atoi(parm->val);
891 SS7_DEBUG("\tFound mtp3 t10 = \"%d\"\n",mtpRoute.t10);
892
893 } else if (!strcasecmp(parm->var, "mtp3.t11")) {
894 mtpRoute.t11 = atoi(parm->val);
895 SS7_DEBUG("\tFound mtp3 t11 = \"%d\"\n",mtpRoute.t11);
896
897 } else if (!strcasecmp(parm->var, "mtp3.t15")) {
898 mtpRoute.t15 = atoi(parm->val);
899 SS7_DEBUG("\tFound mtp3 t15 = \"%d\"\n",mtpRoute.t15);
900
901 } else if (!strcasecmp(parm->var, "mtp3.t16")) {
902 mtpRoute.t16 = atoi(parm->val);
903 SS7_DEBUG("\tFound mtp3 t16 = \"%d\"\n",mtpRoute.t16);
904
905 } else if (!strcasecmp(parm->var, "mtp3.t18")) {
906 mtpRoute.t18 = atoi(parm->val);
907 SS7_DEBUG("\tFound mtp3 t18 = \"%d\"\n",mtpRoute.t18);
908
909 } else if (!strcasecmp(parm->var, "mtp3.t19")) {
910 mtpRoute.t19 = atoi(parm->val);
911 SS7_DEBUG("\tFound mtp3 t19 = \"%d\"\n",mtpRoute.t19);
912
913 } else if (!strcasecmp(parm->var, "mtp3.t21")) {
914 mtpRoute.t21 = atoi(parm->val);
915 SS7_DEBUG("\tFound mtp3 t21 = \"%d\"\n",mtpRoute.t21);
916
917 } else if (!strcasecmp(parm->var, "mtp3.t25")) {
918 mtpRoute.t25 = atoi(parm->val);
919 SS7_DEBUG("\tFound mtp3 t25 = \"%d\"\n",mtpRoute.t25);
920
921 } else if (!strcasecmp(parm->var, "mtp3.t26")) {
922 mtpRoute.t26 = atoi(parm->val);
923 SS7_DEBUG("\tFound mtp3 t26 = \"%d\"\n",mtpRoute.t26);
924
925 } else {
926 SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
927 return FTDM_FAIL;
928
929 }
930
931
932 parm = parm + 1;
933 }
934
935 ftmod_ss7_fill_in_nsap(&mtpRoute);
936
937 ftmod_ss7_fill_in_mtp3_route(&mtpRoute);
938
939
940
941 return FTDM_SUCCESS;
942 }
943
944
945 static int ftmod_ss7_parse_isup_interfaces(ftdm_conf_node_t *isup_interfaces)
946 {
947 ftdm_conf_node_t *isup_interface = NULL;
948
949
950 if (strcasecmp(isup_interfaces->name, "isup_interfaces")) {
951 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"isup_interfaces\"!\n",isup_interfaces->name);
952 return FTDM_FAIL;
953 } else {
954 SS7_DEBUG("Parsing \"isup_interfaces\"...\n");
955 }
956
957
958 isup_interface = isup_interfaces->child;
959
960 while (isup_interface != NULL) {
961
962 if (ftmod_ss7_parse_isup_interface(isup_interface)) {
963 SS7_ERROR("Failed to parse \"isup_interface\"\n");
964 return FTDM_FAIL;
965 }
966
967
968 isup_interface = isup_interface->next;
969 }
970
971 return FTDM_SUCCESS;
972 }
973
974
975 static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
976 {
977 sng_isup_inf_t sng_isup;
978 sng_isap_t sng_isap;
979 ftdm_conf_parameter_t *parm = isup_interface->parameters;
980 int num_parms = isup_interface->n_parameters;
981 int i;
982 int linkSetId;
983 int flag_cld_nadi = 0;
984 int flag_clg_nadi = 0;
985
986 memset(&sng_isup, 0x0, sizeof(sng_isup));
987 memset(&sng_isap, 0x0, sizeof(sng_isap));
988
989
990 if (strcasecmp(isup_interface->name, "isup_interface")) {
991 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"isup_interface\"!\n",isup_interface->name);
992 return FTDM_FAIL;
993 } else {
994 SS7_DEBUG("Parsing \"isup_interface\"...\n");
995 }
996
997
998 for (i = 0; i < num_parms; i++) {
999
1000
1001 if (!strcasecmp(parm->var, "name")) {
1002 strncpy((char *)sng_isup.name, parm->val, MAX_NAME_LEN-1);
1003 SS7_DEBUG("\tFound an \"isup_interface\" named = %s\n", sng_isup.name);
1004
1005 } else if (!strcasecmp(parm->var, "spc")) {
1006 sng_isup.spc = atoi(parm->val);
1007 g_ftdm_sngss7_data.cfg.spc = sng_isup.spc;
1008 SS7_DEBUG("\tFound SPC = %d\n", sng_isup.spc);
1009
1010 } else if (!strcasecmp(parm->var, "mtp_route")) {
1011
1012 int x = 1;
1013
1014 while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) {
1015
1016
1017 if (!strcasecmp((char *)g_ftdm_sngss7_data.cfg.mtpRoute[x].name, parm->val)) {
1018
1019 sng_isup.mtpRouteId = g_ftdm_sngss7_data.cfg.mtpRoute[x].id;
1020 sng_isup.dpc = g_ftdm_sngss7_data.cfg.mtpRoute[x].dpc;
1021 sng_isup.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType;
1022 sng_isap.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType;
1023
1024
1025 int z = 1;
1026 while (g_ftdm_sngss7_data.cfg.nsap[z].id != 0) {
1027 if ((g_ftdm_sngss7_data.cfg.nsap[z].linkType == g_ftdm_sngss7_data.cfg.mtpRoute[x].linkType) &&
1028 (g_ftdm_sngss7_data.cfg.nsap[z].switchType == g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType) &&
1029 (g_ftdm_sngss7_data.cfg.nsap[z].ssf == g_ftdm_sngss7_data.cfg.mtpRoute[x].ssf)) {
1030 sng_isup.nwId = g_ftdm_sngss7_data.cfg.nsap[z].nwId;
1031
1032 break;
1033 }
1034
1035 z++;
1036 }
1037 break;
1038 }
1039 x++;
1040 }
1041
1042
1043 if (sng_isup.mtpRouteId == 0) {
1044 SS7_ERROR("\tFailed to find the MTP3 Route = \"%s\"!\n", parm->val);
1045 return FTDM_FAIL;
1046 } else {
1047 SS7_DEBUG("\tFound MTP3 Route = %s\n", parm->val);
1048 }
1049
1050 } else if (!strcasecmp(parm->var, "min_digits")) {
1051 sng_isup.min_digits = atoi(parm->val);
1052
1053 SS7_DEBUG("\tFound min_digits = %d\n", sng_isup.min_digits);
1054
1055 } else if (!strcasecmp(parm->var, "ssf")) {
1056 if (!strcasecmp(parm->val, "nat")) {
1057 sng_isup.ssf = SSF_NAT;
1058 sng_isap.ssf = SSF_NAT;
1059 } else if (!strcasecmp(parm->val, "int")) {
1060 sng_isup.ssf = SSF_INTL;
1061 sng_isap.ssf = SSF_INTL;
1062 } else if (!strcasecmp(parm->val, "spare")) {
1063 sng_isup.ssf = SSF_SPARE;
1064 sng_isap.ssf = SSF_SPARE;
1065 } else if (!strcasecmp(parm->val, "res")) {
1066 sng_isup.ssf = SSF_RES;
1067 sng_isap.ssf = SSF_RES;
1068 } else {
1069 SS7_ERROR("\tFound an invalid ssf of \"%s\"!\n", parm->val);
1070 return FTDM_FAIL;
1071 }
1072
1073 } else if (!strcasecmp(parm->var, "license")) {
1074
1075 strncpy(g_ftdm_sngss7_data.cfg.license, parm->val, MAX_PATH-1);
1076 strncpy(g_ftdm_sngss7_data.cfg.signature, parm->val, MAX_PATH-1);
1077 strcat(g_ftdm_sngss7_data.cfg.signature, ".sig");
1078 SS7_DEBUG("\tFound license file = %s\n", g_ftdm_sngss7_data.cfg.license);
1079 SS7_DEBUG("\tFound signature file = %s\n", g_ftdm_sngss7_data.cfg.signature);
1080
1081 } else if (!strcasecmp(parm->var, "isup.t1")) {
1082 sng_isap.t1 = atoi(parm->val);
1083 SS7_DEBUG("\tFound isup t1 = \"%d\"\n",sng_isap.t1);
1084
1085 } else if (!strcasecmp(parm->var, "isup.t2")) {
1086 sng_isap.t2 = atoi(parm->val);
1087 SS7_DEBUG("\tFound isup t2 = \"%d\"\n",sng_isap.t2);
1088
1089 } else if (!strcasecmp(parm->var, "isup.t4")) {
1090 sng_isup.t4 = atoi(parm->val);
1091 SS7_DEBUG("\tFound isup t4 = \"%d\"\n",sng_isup.t4);
1092
1093 } else if (!strcasecmp(parm->var, "isup.t5")) {
1094 sng_isap.t5 = atoi(parm->val);
1095 SS7_DEBUG("\tFound isup t5 = \"%d\"\n",sng_isap.t5);
1096
1097 } else if (!strcasecmp(parm->var, "isup.t6")) {
1098 sng_isap.t6 = atoi(parm->val);
1099 SS7_DEBUG("\tFound isup t6 = \"%d\"\n",sng_isap.t6);
1100
1101 } else if (!strcasecmp(parm->var, "isup.t7")) {
1102 sng_isap.t7 = atoi(parm->val);
1103 SS7_DEBUG("\tFound isup t7 = \"%d\"\n",sng_isap.t7);
1104
1105 } else if (!strcasecmp(parm->var, "isup.t8")) {
1106 sng_isap.t8 = atoi(parm->val);
1107 SS7_DEBUG("\tFound isup t8 = \"%d\"\n",sng_isap.t8);
1108
1109 } else if (!strcasecmp(parm->var, "isup.t9")) {
1110 sng_isap.t9 = atoi(parm->val);
1111 SS7_DEBUG("\tFound isup t9 = \"%d\"\n",sng_isap.t9);
1112
1113 } else if (!strcasecmp(parm->var, "isup.t10")) {
1114 sng_isup.t10 = atoi(parm->val);
1115 SS7_DEBUG("\tFound isup t10 = \"%d\"\n",sng_isup.t10);
1116
1117 } else if (!strcasecmp(parm->var, "isup.t11")) {
1118 sng_isup.t11 = atoi(parm->val);
1119 SS7_DEBUG("\tFound isup t11 = \"%d\"\n",sng_isup.t11);
1120
1121 } else if (!strcasecmp(parm->var, "isup.t18")) {
1122 sng_isup.t18 = atoi(parm->val);
1123 SS7_DEBUG("\tFound isup t18 = \"%d\"\n",sng_isup.t18);
1124
1125 } else if (!strcasecmp(parm->var, "isup.t19")) {
1126 sng_isup.t19 = atoi(parm->val);
1127 SS7_DEBUG("\tFound isup t19 = \"%d\"\n",sng_isup.t19);
1128
1129 } else if (!strcasecmp(parm->var, "isup.t20")) {
1130 sng_isup.t20 = atoi(parm->val);
1131 SS7_DEBUG("\tFound isup t20 = \"%d\"\n",sng_isup.t20);
1132
1133 } else if (!strcasecmp(parm->var, "isup.t21")) {
1134 sng_isup.t21 = atoi(parm->val);
1135 SS7_DEBUG("\tFound isup t21 = \"%d\"\n",sng_isup.t21);
1136
1137 } else if (!strcasecmp(parm->var, "isup.t22")) {
1138 sng_isup.t22 = atoi(parm->val);
1139 SS7_DEBUG("\tFound isup t22 = \"%d\"\n",sng_isup.t22);
1140
1141 } else if (!strcasecmp(parm->var, "isup.t23")) {
1142 sng_isup.t23 = atoi(parm->val);
1143 SS7_DEBUG("\tFound isup t23 = \"%d\"\n",sng_isup.t23);
1144
1145 } else if (!strcasecmp(parm->var, "isup.t24")) {
1146 sng_isup.t24 = atoi(parm->val);
1147 SS7_DEBUG("\tFound isup t24 = \"%d\"\n",sng_isup.t24);
1148
1149 } else if (!strcasecmp(parm->var, "isup.t25")) {
1150 sng_isup.t25 = atoi(parm->val);
1151 SS7_DEBUG("\tFound isup t25 = \"%d\"\n",sng_isup.t25);
1152
1153 } else if (!strcasecmp(parm->var, "isup.t26")) {
1154 sng_isup.t26 = atoi(parm->val);
1155 SS7_DEBUG("\tFound isup t26 = \"%d\"\n",sng_isup.t26);
1156
1157 } else if (!strcasecmp(parm->var, "isup.t28")) {
1158 sng_isup.t28 = atoi(parm->val);
1159 SS7_DEBUG("\tFound isup t28 = \"%d\"\n",sng_isup.t28);
1160
1161 } else if (!strcasecmp(parm->var, "isup.t29")) {
1162 sng_isup.t29 = atoi(parm->val);
1163 SS7_DEBUG("\tFound isup t29 = \"%d\"\n",sng_isup.t29);
1164
1165 } else if (!strcasecmp(parm->var, "isup.t30")) {
1166 sng_isup.t30 = atoi(parm->val);
1167 SS7_DEBUG("\tFound isup t30 = \"%d\"\n",sng_isup.t30);
1168
1169 } else if (!strcasecmp(parm->var, "isup.t31")) {
1170 sng_isap.t31 = atoi(parm->val);
1171 SS7_DEBUG("\tFound isup t31 = \"%d\"\n",sng_isap.t31);
1172
1173 } else if (!strcasecmp(parm->var, "isup.t32")) {
1174 sng_isup.t32 = atoi(parm->val);
1175 SS7_DEBUG("\tFound isup t32 = \"%d\"\n",sng_isup.t32);
1176
1177 } else if (!strcasecmp(parm->var, "isup.t33")) {
1178 sng_isap.t33 = atoi(parm->val);
1179 SS7_DEBUG("\tFound isup t33 = \"%d\"\n",sng_isap.t33);
1180
1181 } else if (!strcasecmp(parm->var, "isup.t34")) {
1182 sng_isap.t34 = atoi(parm->val);
1183 SS7_DEBUG("\tFound isup t34 = \"%d\"\n",sng_isap.t34);
1184
1185 } else if (!strcasecmp(parm->var, "isup.t35")) {
1186 sng_isup.t35 = atoi(parm->val);
1187 SS7_DEBUG("\tFound isup t35 = \"%d\"\n",sng_isup.t35);
1188
1189 } else if (!strcasecmp(parm->var, "isup.t36")) {
1190 sng_isap.t36 = atoi(parm->val);
1191 SS7_DEBUG("\tFound isup t36 = \"%d\"\n",sng_isap.t36);
1192
1193 } else if (!strcasecmp(parm->var, "isup.t37")) {
1194 sng_isup.t37 = atoi(parm->val);
1195 SS7_DEBUG("\tFound isup t37 = \"%d\"\n",sng_isup.t37);
1196
1197 } else if (!strcasecmp(parm->var, "isup.t38")) {
1198 sng_isup.t38 = atoi(parm->val);
1199 SS7_DEBUG("\tFound isup t38 = \"%d\"\n",sng_isup.t38);
1200
1201 } else if (!strcasecmp(parm->var, "isup.t39")) {
1202 sng_isup.t39 = atoi(parm->val);
1203 SS7_DEBUG("\tFound isup t39 = \"%d\"\n",sng_isup.t39);
1204
1205 } else if (!strcasecmp(parm->var, "isup.tccr")) {
1206 sng_isap.tccr = atoi(parm->val);
1207 SS7_DEBUG("\tFound isup tccr = \"%d\"\n",sng_isap.tccr);
1208
1209 } else if (!strcasecmp(parm->var, "isup.tccrt")) {
1210 sng_isap.tccrt = atoi(parm->val);
1211 SS7_DEBUG("\tFound isup tccrt = \"%d\"\n",sng_isap.tccrt);
1212
1213 } else if (!strcasecmp(parm->var, "isup.tex")) {
1214 sng_isap.tex = atoi(parm->val);
1215 SS7_DEBUG("\tFound isup tex = \"%d\"\n",sng_isap.tex);
1216
1217 } else if (!strcasecmp(parm->var, "isup.tect")) {
1218 sng_isap.tect = atoi(parm->val);
1219 SS7_DEBUG("\tFound isup tect = \"%d\"\n",sng_isap.tect);
1220
1221 } else if (!strcasecmp(parm->var, "isup.tcrm")) {
1222 sng_isap.tcrm = atoi(parm->val);
1223 SS7_DEBUG("\tFound isup tcrm = \"%d\"\n",sng_isap.tcrm);
1224
1225 } else if (!strcasecmp(parm->var, "isup.tcra")) {
1226 sng_isap.tcra = atoi(parm->val);
1227 SS7_DEBUG("\tFound isup tcra = \"%d\"\n",sng_isap.tcra);
1228
1229 } else if (!strcasecmp(parm->var, "isup.tfgr")) {
1230 sng_isup.tfgr = atoi(parm->val);
1231 SS7_DEBUG("\tFound isup tfgr = \"%d\"\n",sng_isup.tfgr);
1232
1233 } else if (!strcasecmp(parm->var, "isup.trelrsp")) {
1234 sng_isap.trelrsp = atoi(parm->val);
1235 SS7_DEBUG("\tFound isup trelrsp = \"%d\"\n",sng_isap.trelrsp);
1236
1237 } else if (!strcasecmp(parm->var, "isup.tfnlrelrsp")) {
1238 sng_isap.tfnlrelrsp = atoi(parm->val);
1239 SS7_DEBUG("\tFound isup tfnlrelrsp = \"%d\"\n",sng_isap.tfnlrelrsp);
1240
1241 } else if (!strcasecmp(parm->var, "isup.tfnlrelrsp")) {
1242 sng_isap.tfnlrelrsp = atoi(parm->val);
1243 SS7_DEBUG("\tFound isup tfnlrelrsp = \"%d\"\n",sng_isap.tfnlrelrsp);
1244
1245 } else if (!strcasecmp(parm->var, "isup.tpause")) {
1246 sng_isup.tpause = atoi(parm->val);
1247 SS7_DEBUG("\tFound isup tpause = \"%d\"\n",sng_isup.tpause);
1248
1249 } else if (!strcasecmp(parm->var, "isup.tstaenq")) {
1250 sng_isup.tstaenq = atoi(parm->val);
1251 SS7_DEBUG("\tFound isup tstaenq = \"%d\"\n",sng_isup.tstaenq);
1252
1253 } else if (!strcasecmp(parm->var, "clg_nadi")) {
1254
1255
1256 flag_clg_nadi = 1;
1257 sng_isup.clg_nadi = atoi(parm->val);
1258 SS7_DEBUG("\tFound default CLG_NADI value = %d\n", sng_isup.clg_nadi);
1259
1260 } else if (!strcasecmp(parm->var, "cld_nadi")) {
1261
1262
1263 flag_cld_nadi = 1;
1264 sng_isup.cld_nadi = atoi(parm->val);
1265 SS7_DEBUG("\tFound default CLD_NADI value = %d\n", sng_isup.cld_nadi);
1266
1267 } else if (!strcasecmp(parm->var, "obci_bita")) {
1268
1269 if (*parm->val == '1') {
1270 sngss7_set_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
1271 SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) enable option\n");
1272 } else if (*parm->val == '0') {
1273 sngss7_clear_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
1274 SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) disable option\n");
1275 } else {
1276 SS7_DEBUG("\tInvalid value for \"obci_bita\" option\n");
1277 }
1278
1279 } else if (!strcasecmp(parm->var, "lpa_on_cot")) {
1280
1281 if (*parm->val == '1') {
1282 sngss7_set_options(&sng_isup, SNGSS7_LPA_FOR_COT);
1283 SS7_DEBUG("\tFound Tx LPA on COT enable option\n");
1284 } else if (*parm->val == '0') {
1285 sngss7_clear_options(&sng_isup, SNGSS7_LPA_FOR_COT);
1286 SS7_DEBUG("\tFound Tx LPA on COT disable option\n");
1287 } else {
1288 SS7_DEBUG("\tInvalid value for \"lpa_on_cot\" option\n");
1289 }
1290
1291 } else {
1292 SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
1293 return FTDM_FAIL;
1294
1295 }
1296
1297
1298 parm = parm + 1;
1299 }
1300
1301
1302 if (!flag_cld_nadi) {
1303
1304 sng_isup.cld_nadi = 0x03;
1305 }
1306
1307 if (!flag_clg_nadi) {
1308
1309 sng_isup.clg_nadi = 0x03;
1310 }
1311
1312
1313 if (sng_isup.min_digits == 0) {
1314
1315 sng_isup.min_digits = 7;
1316 }
1317
1318
1319
1320 linkSetId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].linkSetId;
1321
1322 i = 1;
1323 while (g_ftdm_sngss7_data.cfg.mtpLink[i].id != 0) {
1324 if (g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkSetId == linkSetId) {
1325 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.spc = g_ftdm_sngss7_data.cfg.spc;
1326 }
1327
1328 i++;
1329 }
1330
1331 ftmod_ss7_fill_in_isap(&sng_isap);
1332
1333 sng_isup.isap = sng_isap.id;
1334
1335 ftmod_ss7_fill_in_isup_interface(&sng_isup);
1336
1337 return FTDM_SUCCESS;
1338 }
1339
1340
1341 static int ftmod_ss7_fill_in_mtpLink(sng_mtp_link_t *mtpLink)
1342 {
1343 int i;
1344
1345
1346 i = 1;
1347 while (g_ftdm_sngss7_data.cfg.mtpLink[i].id != 0) {
1348 if ((g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.span == mtpLink->mtp1.span) &&
1349 (g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.chan == mtpLink->mtp1.chan)) {
1350
1351
1352 break;
1353 }
1354
1355 i++;
1356 }
1357
1358
1359 if (g_ftdm_sngss7_data.cfg.mtpLink[i].id == 0) {
1360 mtpLink->id = i;
1361 SS7_DEBUG("found new mtpLink on span=%d, chan=%d, id = %d\n",
1362 mtpLink->mtp1.span,
1363 mtpLink->mtp1.chan,
1364 mtpLink->id);
1365 } else {
1366 mtpLink->id = i;
1367 SS7_DEBUG("found existing mtpLink on span=%d, chan=%d, id = %d\n",
1368 mtpLink->mtp1.span,
1369 mtpLink->mtp1.chan,
1370 mtpLink->id);
1371 }
1372
1373
1374 strncpy((char *)g_ftdm_sngss7_data.cfg.mtpLink[i].name, (char *)mtpLink->name, MAX_NAME_LEN-1);
1375
1376 g_ftdm_sngss7_data.cfg.mtpLink[i].id = mtpLink->id;
1377
1378 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.span = mtpLink->mtp1.span;
1379 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.chan = mtpLink->mtp1.chan;
1380
1381 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.linkType = mtpLink->mtp2.linkType;
1382 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.errorType = mtpLink->mtp2.errorType;
1383 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.lssuLength = mtpLink->mtp2.lssuLength;
1384 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.mtp1Id = mtpLink->id;
1385
1386 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.priority = mtpLink->mtp3.priority;
1387 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkType = mtpLink->mtp3.linkType;
1388 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.switchType = mtpLink->mtp3.switchType;
1389 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.apc = mtpLink->mtp3.apc;
1390 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.spc = g_ftdm_sngss7_data.cfg.spc;
1391 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.ssf = mtpLink->mtp3.ssf;
1392 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.slc = mtpLink->mtp3.slc;
1393 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkSetId = mtpLink->mtp3.linkSetId;
1394 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.mtp2Id = mtpLink->id;
1395
1396 if ( mtpLink->mtp2.t1 != 0 ) {
1397 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t1 = mtpLink->mtp2.t1;
1398 }else {
1399 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t1 = 500;
1400 }
1401 if ( mtpLink->mtp2.t2 != 0 ) {
1402 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t2 = mtpLink->mtp2.t2;
1403 }else {
1404 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t2 = 250;
1405 }
1406 if ( mtpLink->mtp2.t3 != 0 ) {
1407 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t3 = mtpLink->mtp2.t3;
1408 }else {
1409 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t3 = 20;
1410 }
1411 if ( mtpLink->mtp2.t4n != 0 ) {
1412 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4n = mtpLink->mtp2.t4n;
1413 }else {
1414 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4n = 80;
1415 }
1416 if ( mtpLink->mtp2.t4e != 0 ) {
1417 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4e = mtpLink->mtp2.t4e;
1418 }else {
1419 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4e = 5;
1420 }
1421 if ( mtpLink->mtp2.t5 != 0 ) {
1422 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t5 = mtpLink->mtp2.t5;
1423 }else {
1424 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t5 = 1;
1425 }
1426 if ( mtpLink->mtp2.t6 != 0 ) {
1427 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t6 = mtpLink->mtp2.t6;
1428 }else {
1429 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t6 = 60;
1430 }
1431 if ( mtpLink->mtp2.t7 != 0 ) {
1432 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t7 = mtpLink->mtp2.t7;
1433 }else {
1434 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t7 = 40;
1435 }
1436
1437 if (mtpLink->mtp3.t1 != 0) {
1438 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t1 = mtpLink->mtp3.t1;
1439 } else {
1440 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t1 = 8;
1441 }
1442 if (mtpLink->mtp3.t2 != 0) {
1443 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t2 = mtpLink->mtp3.t2;
1444 } else {
1445 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t2 = 14;
1446 }
1447 if (mtpLink->mtp3.t3 != 0) {
1448 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t3 = mtpLink->mtp3.t3;
1449 } else {
1450 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t3 = 8;
1451 }
1452 if (mtpLink->mtp3.t4 != 0) {
1453 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t4 = mtpLink->mtp3.t4;
1454 } else {
1455 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t4 = 8;
1456 }
1457 if (mtpLink->mtp3.t5 != 0) {
1458 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t5 = mtpLink->mtp3.t5;
1459 } else {
1460 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t5 = 8;
1461 }
1462 if (mtpLink->mtp3.t7 != 0) {
1463 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t7 = mtpLink->mtp3.t7;
1464 } else {
1465 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t7 = 15;
1466 }
1467 if (mtpLink->mtp3.t12 != 0) {
1468 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t12 = mtpLink->mtp3.t12;
1469 } else {
1470 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t12 = 15;
1471 }
1472 if (mtpLink->mtp3.t13 != 0) {
1473 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t13 = mtpLink->mtp3.t13;
1474 } else {
1475 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t13 = 15;
1476 }
1477 if (mtpLink->mtp3.t14 != 0) {
1478 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t14 = mtpLink->mtp3.t14;
1479 } else {
1480 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t14 = 30;
1481 }
1482 if (mtpLink->mtp3.t17 != 0) {
1483 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t17 = mtpLink->mtp3.t17;
1484 } else {
1485 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t17 = 15;
1486 }
1487 if (mtpLink->mtp3.t22 != 0) {
1488 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t22 = mtpLink->mtp3.t22;
1489 } else {
1490 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t22 = 1800;
1491 }
1492 if (mtpLink->mtp3.t23 != 0) {
1493 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t23 = mtpLink->mtp3.t23;
1494 } else {
1495 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t23 = 1800;
1496 }
1497 if (mtpLink->mtp3.t24 != 0) {
1498 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t24 = mtpLink->mtp3.t24;
1499 } else {
1500 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t24 = 5;
1501 }
1502 if (mtpLink->mtp3.t31 != 0) {
1503 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t31 = mtpLink->mtp3.t31;
1504 } else {
1505 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t31 = 50;
1506 }
1507 if (mtpLink->mtp3.t32 != 0) {
1508 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t32 = mtpLink->mtp3.t32;
1509 } else {
1510 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t32 = 120;
1511 }
1512 if (mtpLink->mtp3.t33 != 0) {
1513 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t33 = mtpLink->mtp3.t33;
1514 } else {
1515 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t33 = 3000;
1516 }
1517 if (mtpLink->mtp3.t34 != 0) {
1518 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t34 = mtpLink->mtp3.t34;
1519 } else {
1520 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t34 = 600;
1521 }
1522 if (mtpLink->mtp3.tflc != 0) {
1523 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.tflc = mtpLink->mtp3.tflc;
1524 } else {
1525 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.tflc = 300;
1526 }
1527 return (mtpLink->id);
1528 }
1529
1530
1531
1532 static int ftmod_ss7_fill_in_mtpLinkSet(sng_link_set_t *mtpLinkSet)
1533 {
1534 int i = mtpLinkSet->id;
1535
1536 strncpy((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[i].name, (char *)mtpLinkSet->name, MAX_NAME_LEN-1);
1537
1538 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].id = mtpLinkSet->id;
1539 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].apc = mtpLinkSet->apc;
1540 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].linkType = mtpLinkSet->linkType;
1541 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].switchType = mtpLinkSet->switchType;
1542 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].ssf = mtpLinkSet->ssf;
1543
1544
1545 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].minActive = mtpLinkSet->minActive;
1546 g_ftdm_sngss7_data.cfg.mtpLinkSet[i].numLinks = 0;
1547 return 0;
1548 }
1549
1550
1551 static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
1552 {
1553 int i;
1554
1555
1556 i = 1;
1557 while (g_ftdm_sngss7_data.cfg.mtpRoute[i].id != 0) {
1558 if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpRoute[i].name, mtp3_route->name)) {
1559
1560 break;
1561 }
1562
1563 i++;
1564 }
1565
1566 if (g_ftdm_sngss7_data.cfg.mtpRoute[i].id == 0) {
1567 mtp3_route->id = i;
1568 SS7_DEBUG("found new mtp3_route, id is = %d\n", mtp3_route->id);
1569 } else {
1570 mtp3_route->id = i;
1571 SS7_DEBUG("found existing mtp3_route, id is = %d\n", mtp3_route->id);
1572 }
1573
1574 strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, (char *)mtp3_route->name, MAX_NAME_LEN-1);
1575
1576 g_ftdm_sngss7_data.cfg.mtpRoute[i].id = mtp3_route->id;
1577 g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc = mtp3_route->dpc;
1578 g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType = mtp3_route->linkType;
1579 g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType = mtp3_route->switchType;
1580 g_ftdm_sngss7_data.cfg.mtpRoute[i].cmbLinkSetId = mtp3_route->cmbLinkSetId;
1581 g_ftdm_sngss7_data.cfg.mtpRoute[i].isSTP = mtp3_route->isSTP;
1582 g_ftdm_sngss7_data.cfg.mtpRoute[i].nwId = mtp3_route->nwId;
1583 g_ftdm_sngss7_data.cfg.mtpRoute[i].linkSetId = mtp3_route->linkSetId;
1584 g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf = mtp3_route->ssf;
1585 if (mtp3_route->t6 != 0) {
1586 g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = mtp3_route->t6;
1587 } else {
1588 g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = 8;
1589 }
1590 if (mtp3_route->t8 != 0) {
1591 g_ftdm_sngss7_data.cfg.mtpRoute[i].t8 = mtp3_route->t8;
1592 } else {
1593 g_ftdm_sngss7_data.cfg.mtpRoute[i].t8 = 12;
1594 }
1595 if (mtp3_route->t10 != 0) {
1596 g_ftdm_sngss7_data.cfg.mtpRoute[i].t10 = mtp3_route->t10;
1597 } else {
1598 g_ftdm_sngss7_data.cfg.mtpRoute[i].t10 = 300;
1599 }
1600 if (mtp3_route->t11 != 0) {
1601 g_ftdm_sngss7_data.cfg.mtpRoute[i].t11 = mtp3_route->t11;
1602 } else {
1603 g_ftdm_sngss7_data.cfg.mtpRoute[i].t11 = 300;
1604 }
1605 if (mtp3_route->t15 != 0) {
1606 g_ftdm_sngss7_data.cfg.mtpRoute[i].t15 = mtp3_route->t15;
1607 } else {
1608 g_ftdm_sngss7_data.cfg.mtpRoute[i].t15 = 30;
1609 }
1610 if (mtp3_route->t16 != 0) {
1611 g_ftdm_sngss7_data.cfg.mtpRoute[i].t16 = mtp3_route->t16;
1612 } else {
1613 g_ftdm_sngss7_data.cfg.mtpRoute[i].t16 = 20;
1614 }
1615 if (mtp3_route->t18 != 0) {
1616 g_ftdm_sngss7_data.cfg.mtpRoute[i].t18 = mtp3_route->t18;
1617 } else {
1618 g_ftdm_sngss7_data.cfg.mtpRoute[i].t18 = 200;
1619 }
1620 if (mtp3_route->t19 != 0) {
1621 g_ftdm_sngss7_data.cfg.mtpRoute[i].t19 = mtp3_route->t19;
1622 } else {
1623 g_ftdm_sngss7_data.cfg.mtpRoute[i].t19 = 690;
1624 }
1625 if (mtp3_route->t21 != 0) {
1626 g_ftdm_sngss7_data.cfg.mtpRoute[i].t21 = mtp3_route->t21;
1627 } else {
1628 g_ftdm_sngss7_data.cfg.mtpRoute[i].t21 = 650;
1629 }
1630 if (mtp3_route->t25 != 0) {
1631 g_ftdm_sngss7_data.cfg.mtpRoute[i].t25 = mtp3_route->t25;
1632 } else {
1633 g_ftdm_sngss7_data.cfg.mtpRoute[i].t25 = 100;
1634 }
1635 if (mtp3_route->t26 != 0) {
1636 g_ftdm_sngss7_data.cfg.mtpRoute[i].t26 = mtp3_route->t26;
1637 } else {
1638 g_ftdm_sngss7_data.cfg.mtpRoute[i].t26 = 100;
1639 }
1640
1641 return 0;
1642 }
1643
1644
1645 static int ftmod_ss7_fill_in_nsap(sng_route_t *mtp3_route)
1646 {
1647 int i;
1648
1649
1650 i = 1;
1651 while (g_ftdm_sngss7_data.cfg.nsap[i].id != 0) {
1652 if ((g_ftdm_sngss7_data.cfg.nsap[i].linkType == mtp3_route->linkType) &&
1653 (g_ftdm_sngss7_data.cfg.nsap[i].switchType == mtp3_route->switchType) &&
1654 (g_ftdm_sngss7_data.cfg.nsap[i].ssf == mtp3_route->ssf)) {
1655
1656
1657 break;
1658 }
1659
1660 i++;
1661 }
1662
1663 if (g_ftdm_sngss7_data.cfg.nsap[i].id == 0) {
1664 g_ftdm_sngss7_data.cfg.nsap[i].id = i;
1665 mtp3_route->nwId = i;
1666 SS7_DEBUG("found new mtp3_isup interface, id is = %d\n", g_ftdm_sngss7_data.cfg.nsap[i].id);
1667 } else {
1668 g_ftdm_sngss7_data.cfg.nsap[i].id = i;
1669 mtp3_route->nwId = i;
1670 SS7_DEBUG("found existing mtp3_isup interface, id is = %d\n", g_ftdm_sngss7_data.cfg.nsap[i].id);
1671 }
1672
1673 g_ftdm_sngss7_data.cfg.nsap[i].spId = g_ftdm_sngss7_data.cfg.nsap[i].id;
1674 g_ftdm_sngss7_data.cfg.nsap[i].suId = g_ftdm_sngss7_data.cfg.nsap[i].id;
1675 g_ftdm_sngss7_data.cfg.nsap[i].nwId = mtp3_route->nwId;
1676 g_ftdm_sngss7_data.cfg.nsap[i].linkType = mtp3_route->linkType;
1677 g_ftdm_sngss7_data.cfg.nsap[i].switchType = mtp3_route->switchType;
1678 g_ftdm_sngss7_data.cfg.nsap[i].ssf = mtp3_route->ssf;
1679
1680 return 0;
1681 }
1682
1683
1684 static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup)
1685 {
1686 int i;
1687
1688
1689 i = 1;
1690 while (g_ftdm_sngss7_data.cfg.isupIntf[i].id != 0) {
1691 if (!strcasecmp(g_ftdm_sngss7_data.cfg.isupIntf[i].name, sng_isup->name)) {
1692
1693
1694 break;
1695 }
1696
1697 i++;
1698 }
1699
1700 if (g_ftdm_sngss7_data.cfg.isupIntf[i].id == 0) {
1701 sng_isup->id = i;
1702 SS7_DEBUG("found new isup interface, id is = %d\n", sng_isup->id);
1703 } else {
1704 sng_isup->id = i;
1705 SS7_DEBUG("found existing isup interface, id is = %d\n", sng_isup->id);
1706 }
1707
1708 strncpy((char *)g_ftdm_sngss7_data.cfg.isupIntf[i].name, (char *)sng_isup->name, MAX_NAME_LEN-1);
1709
1710 g_ftdm_sngss7_data.cfg.isupIntf[i].id = sng_isup->id;
1711 g_ftdm_sngss7_data.cfg.isupIntf[i].mtpRouteId = sng_isup->mtpRouteId;
1712 g_ftdm_sngss7_data.cfg.isupIntf[i].nwId = sng_isup->nwId;
1713 g_ftdm_sngss7_data.cfg.isupIntf[i].dpc = sng_isup->dpc;
1714 g_ftdm_sngss7_data.cfg.isupIntf[i].spc = sng_isup->spc;
1715 g_ftdm_sngss7_data.cfg.isupIntf[i].switchType = sng_isup->switchType;
1716 g_ftdm_sngss7_data.cfg.isupIntf[i].ssf = sng_isup->ssf;
1717 g_ftdm_sngss7_data.cfg.isupIntf[i].isap = sng_isup->isap;
1718 g_ftdm_sngss7_data.cfg.isupIntf[i].cld_nadi = sng_isup->cld_nadi;
1719 g_ftdm_sngss7_data.cfg.isupIntf[i].clg_nadi = sng_isup->clg_nadi;
1720 g_ftdm_sngss7_data.cfg.isupIntf[i].min_digits = sng_isup->min_digits;
1721 g_ftdm_sngss7_data.cfg.isupIntf[i].options = sng_isup->options;
1722 if (sng_isup->t4 != 0) {
1723 g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = sng_isup->t4;
1724 } else {
1725 g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = 3000;
1726 }
1727 if (sng_isup->t10 != 0) {
1728 g_ftdm_sngss7_data.cfg.isupIntf[i].t10 = sng_isup->t10;
1729 } else {
1730 g_ftdm_sngss7_data.cfg.isupIntf[i].t10 = 50;
1731 }
1732 if (sng_isup->t11 != 0) {
1733 g_ftdm_sngss7_data.cfg.isupIntf[i].t11 = sng_isup->t11;
1734 } else {
1735 g_ftdm_sngss7_data.cfg.isupIntf[i].t11 = 170;
1736 }
1737 if (sng_isup->t18 != 0) {
1738 g_ftdm_sngss7_data.cfg.isupIntf[i].t18 = sng_isup->t18;
1739 } else {
1740 g_ftdm_sngss7_data.cfg.isupIntf[i].t18 = 300;
1741 }
1742 if (sng_isup->t19 != 0) {
1743 g_ftdm_sngss7_data.cfg.isupIntf[i].t19 = sng_isup->t19;
1744 } else {
1745 g_ftdm_sngss7_data.cfg.isupIntf[i].t19 = 3000;
1746 }
1747 if (sng_isup->t20 != 0) {
1748 g_ftdm_sngss7_data.cfg.isupIntf[i].t20 = sng_isup->t20;
1749 } else {
1750 g_ftdm_sngss7_data.cfg.isupIntf[i].t20 = 300;
1751 }
1752 if (sng_isup->t21 != 0) {
1753 g_ftdm_sngss7_data.cfg.isupIntf[i].t21 = sng_isup->t21;
1754 } else {
1755 g_ftdm_sngss7_data.cfg.isupIntf[i].t21 = 3000;
1756 }
1757 if (sng_isup->t22 != 0) {
1758 g_ftdm_sngss7_data.cfg.isupIntf[i].t22 = sng_isup->t22;
1759 } else {
1760 g_ftdm_sngss7_data.cfg.isupIntf[i].t22 = 300;
1761 }
1762 if (sng_isup->t23 != 0) {
1763 g_ftdm_sngss7_data.cfg.isupIntf[i].t23 = sng_isup->t23;
1764 } else {
1765 g_ftdm_sngss7_data.cfg.isupIntf[i].t23 = 3000;
1766 }
1767 if (sng_isup->t24 != 0) {
1768 g_ftdm_sngss7_data.cfg.isupIntf[i].t24 = sng_isup->t24;
1769 } else {
1770 g_ftdm_sngss7_data.cfg.isupIntf[i].t24 = 10;
1771 }
1772 if (sng_isup->t25 != 0) {
1773 g_ftdm_sngss7_data.cfg.isupIntf[i].t25 = sng_isup->t25;
1774 } else {
1775 g_ftdm_sngss7_data.cfg.isupIntf[i].t25 = 20;
1776 }
1777 if (sng_isup->t26 != 0) {
1778 g_ftdm_sngss7_data.cfg.isupIntf[i].t26 = sng_isup->t26;
1779 } else {
1780 g_ftdm_sngss7_data.cfg.isupIntf[i].t26 = 600;
1781 }
1782 if (sng_isup->t28 != 0) {
1783 g_ftdm_sngss7_data.cfg.isupIntf[i].t28 = sng_isup->t28;
1784 } else {
1785 g_ftdm_sngss7_data.cfg.isupIntf[i].t28 = 100;
1786 }
1787 if (sng_isup->t29 != 0) {
1788 g_ftdm_sngss7_data.cfg.isupIntf[i].t29 = sng_isup->t29;
1789 } else {
1790 g_ftdm_sngss7_data.cfg.isupIntf[i].t29 = 6;
1791 }
1792 if (sng_isup->t30 != 0) {
1793 g_ftdm_sngss7_data.cfg.isupIntf[i].t30 = sng_isup->t30;
1794 } else {
1795 g_ftdm_sngss7_data.cfg.isupIntf[i].t30 = 50;
1796 }
1797 if (sng_isup->t32 != 0) {
1798 g_ftdm_sngss7_data.cfg.isupIntf[i].t32 = sng_isup->t32;
1799 } else {
1800 g_ftdm_sngss7_data.cfg.isupIntf[i].t32 = 30;
1801 }
1802 if (sng_isup->t35 != 0) {
1803 g_ftdm_sngss7_data.cfg.isupIntf[i].t35 = sng_isup->t35;
1804 } else {
1805 g_ftdm_sngss7_data.cfg.isupIntf[i].t35 = 170;
1806 }
1807 if (sng_isup->t37 != 0) {
1808 g_ftdm_sngss7_data.cfg.isupIntf[i].t37 = sng_isup->t37;
1809 } else {
1810 g_ftdm_sngss7_data.cfg.isupIntf[i].t37 = 20;
1811 }
1812 if (sng_isup->t38 != 0) {
1813 g_ftdm_sngss7_data.cfg.isupIntf[i].t38 = sng_isup->t38;
1814 } else {
1815 g_ftdm_sngss7_data.cfg.isupIntf[i].t38 = 1200;
1816 }
1817 if (sng_isup->t39 != 0) {
1818 g_ftdm_sngss7_data.cfg.isupIntf[i].t39 = sng_isup->t39;
1819 } else {
1820 g_ftdm_sngss7_data.cfg.isupIntf[i].t39 = 300;
1821 }
1822 if (sng_isup->tfgr != 0) {
1823 g_ftdm_sngss7_data.cfg.isupIntf[i].tfgr = sng_isup->tfgr;
1824 } else {
1825 g_ftdm_sngss7_data.cfg.isupIntf[i].tfgr = 50;
1826 }
1827 if (sng_isup->tpause != 0) {
1828 g_ftdm_sngss7_data.cfg.isupIntf[i].tpause = sng_isup->tpause;
1829 } else {
1830 g_ftdm_sngss7_data.cfg.isupIntf[i].tpause = 150;
1831 }
1832 if (sng_isup->tstaenq != 0) {
1833 g_ftdm_sngss7_data.cfg.isupIntf[i].tstaenq = sng_isup->tstaenq;
1834 } else {
1835 g_ftdm_sngss7_data.cfg.isupIntf[i].tstaenq = 5000;
1836 }
1837
1838 return 0;
1839 }
1840
1841
1842 static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap)
1843 {
1844 int i;
1845
1846
1847 i = 1;
1848 while (g_ftdm_sngss7_data.cfg.isap[i].id != 0) {
1849 if (g_ftdm_sngss7_data.cfg.isap[i].switchType == sng_isap->switchType) {
1850
1851
1852 break;
1853 }
1854
1855 i++;
1856 }
1857
1858 if (g_ftdm_sngss7_data.cfg.isap[i].id == 0) {
1859 sng_isap->id = i;
1860 SS7_DEBUG("found new isup to cc interface, id is = %d\n", g_ftdm_sngss7_data.cfg.isap[i].id);
1861 } else {
1862 sng_isap->id = i;
1863 SS7_DEBUG("found existing isup to cc interface, id is = %d\n", g_ftdm_sngss7_data.cfg.isap[i].id);
1864 }
1865
1866 g_ftdm_sngss7_data.cfg.isap[i].id = sng_isap->id;
1867 g_ftdm_sngss7_data.cfg.isap[i].suId = sng_isap->id;
1868 g_ftdm_sngss7_data.cfg.isap[i].spId = sng_isap->id;
1869 g_ftdm_sngss7_data.cfg.isap[i].switchType = sng_isap->switchType;
1870 g_ftdm_sngss7_data.cfg.isap[i].ssf = sng_isap->ssf;
1871
1872 if (sng_isap->t1 != 0) {
1873 g_ftdm_sngss7_data.cfg.isap[i].t1 = sng_isap->t1;
1874 } else {
1875 g_ftdm_sngss7_data.cfg.isap[i].t1 = 200;
1876 }
1877 if (sng_isap->t2 != 0) {
1878 g_ftdm_sngss7_data.cfg.isap[i].t2 = sng_isap->t2;
1879 } else {
1880 g_ftdm_sngss7_data.cfg.isap[i].t2 = 1800;
1881 }
1882 if (sng_isap->t5 != 0) {
1883 g_ftdm_sngss7_data.cfg.isap[i].t5 = sng_isap->t5;
1884 } else {
1885 g_ftdm_sngss7_data.cfg.isap[i].t5 = 3000;
1886 }
1887 if (sng_isap->t6 != 0) {
1888 g_ftdm_sngss7_data.cfg.isap[i].t6 = sng_isap->t6;
1889 } else {
1890 g_ftdm_sngss7_data.cfg.isap[i].t6 = 200;
1891 }
1892 if (sng_isap->t7 != 0) {
1893 g_ftdm_sngss7_data.cfg.isap[i].t7 = sng_isap->t7;
1894 } else {
1895 g_ftdm_sngss7_data.cfg.isap[i].t7 = 250;
1896 }
1897 if (sng_isap->t8 != 0) {
1898 g_ftdm_sngss7_data.cfg.isap[i].t8 = sng_isap->t8;
1899 } else {
1900 g_ftdm_sngss7_data.cfg.isap[i].t8 = 120;
1901 }
1902 if (sng_isap->t9 != 0) {
1903 g_ftdm_sngss7_data.cfg.isap[i].t9 = sng_isap->t9;
1904 } else {
1905 g_ftdm_sngss7_data.cfg.isap[i].t9 = 1800;
1906 }
1907 if (sng_isap->t27 != 0) {
1908 g_ftdm_sngss7_data.cfg.isap[i].t27 = sng_isap->t27;
1909 } else {
1910 g_ftdm_sngss7_data.cfg.isap[i].t27 = 2400;
1911 }
1912 if (sng_isap->t31 != 0) {
1913 g_ftdm_sngss7_data.cfg.isap[i].t31 = sng_isap->t31;
1914 } else {
1915 g_ftdm_sngss7_data.cfg.isap[i].t31 = 3650;
1916 }
1917 if (sng_isap->t33 != 0) {
1918 g_ftdm_sngss7_data.cfg.isap[i].t33 = sng_isap->t33;
1919 } else {
1920 g_ftdm_sngss7_data.cfg.isap[i].t33 = 120;
1921 }
1922 if (sng_isap->t34 != 0) {
1923 g_ftdm_sngss7_data.cfg.isap[i].t34 = sng_isap->t34;
1924 } else {
1925 g_ftdm_sngss7_data.cfg.isap[i].t34 = 40;
1926 }
1927 if (sng_isap->t36 != 0) {
1928 g_ftdm_sngss7_data.cfg.isap[i].t36 = sng_isap->t36;
1929 } else {
1930 g_ftdm_sngss7_data.cfg.isap[i].t36 = 120;
1931 }
1932 if (sng_isap->tccr != 0) {
1933 g_ftdm_sngss7_data.cfg.isap[i].tccr = sng_isap->tccr;
1934 } else {
1935 g_ftdm_sngss7_data.cfg.isap[i].tccr = 200;
1936 }
1937 if (sng_isap->tccrt != 0) {
1938 g_ftdm_sngss7_data.cfg.isap[i].tccrt = sng_isap->tccrt;
1939 } else {
1940 g_ftdm_sngss7_data.cfg.isap[i].tccrt = 20;
1941 }
1942 if (sng_isap->tex != 0) {
1943 g_ftdm_sngss7_data.cfg.isap[i].tex = sng_isap->tex;
1944 } else {
1945 g_ftdm_sngss7_data.cfg.isap[i].tex = 1000;
1946 }
1947 if (sng_isap->tcrm != 0) {
1948 g_ftdm_sngss7_data.cfg.isap[i].tcrm = sng_isap->tcrm;
1949 } else {
1950 g_ftdm_sngss7_data.cfg.isap[i].tcrm = 30;
1951 }
1952 if (sng_isap->tcra != 0) {
1953 g_ftdm_sngss7_data.cfg.isap[i].tcra = sng_isap->tcra;
1954 } else {
1955 g_ftdm_sngss7_data.cfg.isap[i].tcra = 100;
1956 }
1957 if (sng_isap->tect != 0) {
1958 g_ftdm_sngss7_data.cfg.isap[i].tect = sng_isap->tect;
1959 } else {
1960 g_ftdm_sngss7_data.cfg.isap[i].tect = 10;
1961 }
1962 if (sng_isap->trelrsp != 0) {
1963 g_ftdm_sngss7_data.cfg.isap[i].trelrsp = sng_isap->trelrsp;
1964 } else {
1965 g_ftdm_sngss7_data.cfg.isap[i].trelrsp = 10;
1966 }
1967 if (sng_isap->tfnlrelrsp != 0) {
1968 g_ftdm_sngss7_data.cfg.isap[i].tfnlrelrsp = sng_isap->tfnlrelrsp;
1969 } else {
1970 g_ftdm_sngss7_data.cfg.isap[i].tfnlrelrsp = 10;
1971 }
1972
1973 return 0;
1974 }
1975
1976
1977 static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
1978 {
1979
1980 if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == 0){
1981 SS7_DEBUG("found new mtp3 self route\n");
1982 } else if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == spc) {
1983 SS7_DEBUG("found existing mtp3 self route\n");
1984 return FTDM_SUCCESS;
1985 } else {
1986 SS7_ERROR("found new mtp3 self route but it does not match the route already configured (dpc=%d:spc=%d)\n",
1987 g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc,
1988 spc);
1989 return FTDM_FAIL;
1990 }
1991
1992 strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-route", MAX_NAME_LEN-1);
1993
1994 g_ftdm_sngss7_data.cfg.mtpRoute[0].id = 0;
1995 g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc = spc;
1996 g_ftdm_sngss7_data.cfg.mtpRoute[0].linkType = linkType;
1997 g_ftdm_sngss7_data.cfg.mtpRoute[0].switchType = switchType;
1998 g_ftdm_sngss7_data.cfg.mtpRoute[0].cmbLinkSetId = 0;
1999 g_ftdm_sngss7_data.cfg.mtpRoute[0].isSTP = 0;
2000 g_ftdm_sngss7_data.cfg.mtpRoute[0].ssf = ssf;
2001 g_ftdm_sngss7_data.cfg.mtpRoute[0].t6 = 8;
2002 g_ftdm_sngss7_data.cfg.mtpRoute[0].t8 = 12;
2003 g_ftdm_sngss7_data.cfg.mtpRoute[0].t10 = 300;
2004 g_ftdm_sngss7_data.cfg.mtpRoute[0].t11 = 300;
2005 g_ftdm_sngss7_data.cfg.mtpRoute[0].t15 = 30;
2006 g_ftdm_sngss7_data.cfg.mtpRoute[0].t16 = 20;
2007 g_ftdm_sngss7_data.cfg.mtpRoute[0].t18 = 200;
2008 g_ftdm_sngss7_data.cfg.mtpRoute[0].t19 = 690;
2009 g_ftdm_sngss7_data.cfg.mtpRoute[0].t21 = 650;
2010 g_ftdm_sngss7_data.cfg.mtpRoute[0].t25 = 100;
2011
2012 return 0;
2013 }
2014
2015
2016 static int ftmod_ss7_fill_in_circuits(sng_isupCkt_t *isupCkt)
2017 {
2018 sngss7_chan_data_t *ss7_info = NULL;
2019 ftdm_channel_t *ftdmchan = NULL;
2020 sng_timeslot_t timeslot;
2021 int count;
2022 int i;
2023 int x;
2024
2025 count = 1;
2026
2027 while (isupCkt->ch_map[0] != '\0') {
2028
2029
2030 if (ftmod_ss7_next_timeslot(isupCkt->ch_map, ×lot)) {
2031 SS7_ERROR("Failed to parse the channel map!\n");
2032 return FTDM_FAIL;
2033 }
2034
2035 if ((timeslot.siglink) || (timeslot.gap)) {
2036
2037 x = 1;
2038 while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
2039 if ((g_ftdm_sngss7_data.cfg.isupCkt[x].chan == count) &&
2040 (g_ftdm_sngss7_data.cfg.isupCkt[x].span == isupCkt->span->channels[1]->physical_span_id)) {
2041
2042 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is already exists...id=%d\n",
2043 isupCkt->span->channels[1]->physical_span_id,
2044 count,
2045 x);
2046
2047
2048 break;
2049 }
2050
2051 x++;
2052 }
2053
2054
2055 if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) {
2056 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2057 isupCkt->span->channels[1]->physical_span_id,
2058 count,
2059 x);
2060
2061
2062 ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
2063 ss7_info->ftdmchan = NULL;
2064 ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x];
2065
2066
2067 g_ftdm_sngss7_data.cfg.isupCkt[x].id = x;
2068 g_ftdm_sngss7_data.cfg.isupCkt[x].span = isupCkt->span->channels[1]->physical_span_id;
2069 g_ftdm_sngss7_data.cfg.isupCkt[x].chan = count;
2070 if (timeslot.siglink) {
2071 g_ftdm_sngss7_data.cfg.isupCkt[x].type = SIG;
2072 } else {
2073 g_ftdm_sngss7_data.cfg.isupCkt[x].type = HOLE;
2074 }
2075
2076 if (timeslot.channel) {
2077 g_ftdm_sngss7_data.cfg.isupCkt[x].cic = isupCkt->cicbase;
2078 isupCkt->cicbase++;
2079 } else {
2080 g_ftdm_sngss7_data.cfg.isupCkt[x].cic = 0;
2081 }
2082 g_ftdm_sngss7_data.cfg.isupCkt[x].infId = isupCkt->isupInf;
2083 g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = isupCkt->typeCntrl;
2084 g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].ssf;
2085 g_ftdm_sngss7_data.cfg.isupCkt[x].obj = ss7_info;
2086
2087 }
2088
2089
2090 count++;
2091
2092 } else {
2093
2094 i = 1;
2095 while (isupCkt->span->channels[i] != NULL) {
2096 if (isupCkt->span->channels[i]->physical_chan_id == timeslot.channel) {
2097 break;
2098 }
2099 i++;
2100 }
2101
2102 if (isupCkt->span->channels[i] == NULL) {
2103
2104 SS7_ERROR("Unable to find the requested channel %d in the FreeTDM channels!\n", timeslot.channel);
2105 return FTDM_FAIL;
2106 } else {
2107 ftdmchan = isupCkt->span->channels[i];
2108 }
2109
2110
2111 x = 1;
2112 while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
2113 if ((g_ftdm_sngss7_data.cfg.isupCkt[x].chan == ftdmchan->physical_chan_id) &&
2114 (g_ftdm_sngss7_data.cfg.isupCkt[x].span == ftdmchan->physical_span_id)) {
2115
2116
2117 break;
2118 }
2119
2120 x++;
2121 }
2122
2123
2124 if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) {
2125 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2126 ftdmchan->physical_span_id,
2127 ftdmchan->physical_chan_id,
2128 x);
2129
2130
2131 ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
2132 ss7_info->ftdmchan = ftdmchan;
2133 ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x];
2134 ftdmchan->call_data = ss7_info;
2135
2136
2137 ss7_info->t35.sched = ((sngss7_span_data_t *)isupCkt->span->signal_data)->sched;
2138 ss7_info->t35.counter = 1;
2139 ss7_info->t35.beat = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].t35*100;
2140 ss7_info->t35.callback = handle_isup_t35;
2141 ss7_info->t35.sngss7_info = ss7_info;
2142
2143
2144 g_ftdm_sngss7_data.cfg.isupCkt[x].id = x;
2145 g_ftdm_sngss7_data.cfg.isupCkt[x].span = ftdmchan->physical_span_id;
2146 g_ftdm_sngss7_data.cfg.isupCkt[x].chan = ftdmchan->physical_chan_id;
2147 g_ftdm_sngss7_data.cfg.isupCkt[x].type = VOICE;
2148 g_ftdm_sngss7_data.cfg.isupCkt[x].cic = isupCkt->cicbase;
2149 g_ftdm_sngss7_data.cfg.isupCkt[x].infId = isupCkt->isupInf;
2150 g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = isupCkt->typeCntrl;
2151 if (isupCkt->t3 == 0) {
2152 g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200;
2153 } else {
2154 g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = isupCkt->t3;
2155 }
2156 if (isupCkt->t12 == 0) {
2157 g_ftdm_sngss7_data.cfg.isupCkt[x].t12 = 300;
2158 } else {
2159 g_ftdm_sngss7_data.cfg.isupCkt[x].t12 = isupCkt->t12;
2160 }
2161 if (isupCkt->t13 == 0) {
2162 g_ftdm_sngss7_data.cfg.isupCkt[x].t13 = 3000;
2163 } else {
2164 g_ftdm_sngss7_data.cfg.isupCkt[x].t13 = isupCkt->t13;
2165 }
2166 if (isupCkt->t14 == 0) {
2167 g_ftdm_sngss7_data.cfg.isupCkt[x].t14 = 300;
2168 } else {
2169 g_ftdm_sngss7_data.cfg.isupCkt[x].t14 = isupCkt->t14;
2170 }
2171 if (isupCkt->t15 == 0) {
2172 g_ftdm_sngss7_data.cfg.isupCkt[x].t15 = 3000;
2173 } else {
2174 g_ftdm_sngss7_data.cfg.isupCkt[x].t15 = isupCkt->t15;
2175 }
2176 if (isupCkt->t16 == 0) {
2177 g_ftdm_sngss7_data.cfg.isupCkt[x].t16 = 300;
2178 } else {
2179 g_ftdm_sngss7_data.cfg.isupCkt[x].t16 = isupCkt->t16;
2180 }
2181 if (isupCkt->t17 == 0) {
2182 g_ftdm_sngss7_data.cfg.isupCkt[x].t17 = 3000;
2183 } else {
2184 g_ftdm_sngss7_data.cfg.isupCkt[x].t17 = isupCkt->t17;
2185 }
2186 if (isupCkt->tval == 0) {
2187 g_ftdm_sngss7_data.cfg.isupCkt[x].tval = 10;
2188 } else {
2189 g_ftdm_sngss7_data.cfg.isupCkt[x].tval = isupCkt->tval;
2190 }
2191 g_ftdm_sngss7_data.cfg.isupCkt[x].obj = ss7_info;
2192 g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].ssf;
2193
2194
2195 isupCkt->cicbase++;
2196 } else {
2197 SS7_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2198 ftdmchan->physical_span_id,
2199 ftdmchan->physical_chan_id,
2200 x);
2201
2202
2203 ss7_info = NULL;
2204
2205
2206 }
2207
2208
2209 count++;
2210 }
2211
2212 if (ss7_info == NULL) {
2213 SS7_ERROR("KONRAD -> circuit was not configured !\n");
2214 return FTDM_FAIL;
2215 }
2216
2217 if (ss7_info->ftdmchan == NULL) {
2218 SS7_INFO("Added span = %d, chan = %d, cic = %d, FTDM chan = %d, ISUP cirId = %d\n",
2219 g_ftdm_sngss7_data.cfg.isupCkt[x].span,
2220 g_ftdm_sngss7_data.cfg.isupCkt[x].chan,
2221 g_ftdm_sngss7_data.cfg.isupCkt[x].cic,
2222 0,
2223 g_ftdm_sngss7_data.cfg.isupCkt[x].id);
2224 } else {
2225 SS7_INFO("Added span = %d, chan = %d, cic = %d, FTDM chan = %d, ISUP cirId = %d\n",
2226 g_ftdm_sngss7_data.cfg.isupCkt[x].span,
2227 g_ftdm_sngss7_data.cfg.isupCkt[x].chan,
2228 g_ftdm_sngss7_data.cfg.isupCkt[x].cic,
2229 ss7_info->ftdmchan->chan_id,
2230 g_ftdm_sngss7_data.cfg.isupCkt[x].id);
2231 }
2232
2233 }
2234
2235 return 0;
2236 }
2237
2238
2239 static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot)
2240 {
2241 int i;
2242 int x;
2243 int lower;
2244 int upper;
2245 char tmp[5];
2246 char new_ch_map[MAX_CIC_MAP_LENGTH];
2247
2248 memset(&tmp[0], '\0', sizeof(tmp));
2249 memset(&new_ch_map[0], '\0', sizeof(new_ch_map));
2250 memset(timeslot, 0x0, sizeof(sng_timeslot_t));
2251
2252 SS7_DEVEL_DEBUG("Old channel map = \"%s\"\n", ch_map);
2253
2254
2255 x = 0;
2256
2257 switch (ch_map[x]) {
2258
2259 case 'S':
2260 case 's':
2261 timeslot->siglink = 1;
2262
2263
2264 x++;
2265 if (ch_map[x] == ',') {
2266 timeslot->hole = 1;
2267 SS7_DEVEL_DEBUG(" Found a siglink in the channel map with a hole in the cic map\n");
2268 } else if (isdigit(ch_map[x])) {
2269
2270 SS7_DEVEL_DEBUG(" Found a siglink in the channel map with out a hole in the cic map\n");
2271 } else {
2272 SS7_ERROR("Found an illegal channel map character after signal link flag = \"%c\"!\n", ch_map[x]);
2273 return FTDM_FAIL;
2274 }
2275 break;
2276
2277 case 'G':
2278 case 'g':
2279 timeslot->gap = 1;
2280
2281
2282 x++;
2283 if (ch_map[x] == ',') {
2284 timeslot->hole = 1;
2285 SS7_DEVEL_DEBUG(" Found a gap in the channel map with a hole in the cic map\n");
2286 } else if (isdigit(ch_map[x])) {
2287 SS7_DEVEL_DEBUG(" Found a gap in the channel map with out a hole in the cic map\n");
2288
2289 } else {
2290 SS7_ERROR("Found an illegal channel map character after signal link flag = \"%c\"!\n", ch_map[x]);
2291 return FTDM_FAIL;
2292 }
2293 break;
2294
2295 case '1':
2296 case '2':
2297 case '3':
2298 case '4':
2299 case '5':
2300 case '6':
2301 case '7':
2302 case '8':
2303 case '9':
2304
2305 SS7_DEVEL_DEBUG("Found a starting channel in the channel map\n");
2306 break;
2307
2308 default:
2309 SS7_ERROR("Found an illegal channel map character = \"%c\"!\n", ch_map[x]);
2310 return FTDM_FAIL;
2311
2312 }
2313
2314
2315 i = 0;
2316 while ((ch_map[x] != '\0') && (ch_map[x] != '-') && (ch_map[x] != ',')) {
2317 tmp[i] = ch_map[x];
2318 i++;
2319 x++;
2320 }
2321 tmp[i] = '\0';
2322 timeslot->channel = atoi(tmp);
2323 lower = timeslot->channel + 1;
2324
2325
2326 if (ch_map[x] == '-') {
2327
2328 x++;
2329 i = 0;
2330 while ((ch_map[x] != '\0') && (ch_map[x] != '-') && (ch_map[x] != ',')) {
2331 tmp[i] = ch_map[x];
2332 i++;
2333 x++;
2334 }
2335 tmp[i] = '\0';
2336 upper = atoi(tmp);
2337
2338
2339 if (upper == lower) {
2340
2341 sprintf(new_ch_map, "%d", lower);
2342 } else if ( upper > lower) {
2343
2344 sprintf(new_ch_map, "%d-%d", lower, upper);
2345 } else {
2346 SS7_ERROR("The upper is less then the lower end of the range...should not happen!\n");
2347 return FTDM_FAIL;
2348 }
2349
2350
2351 strncat(new_ch_map, &ch_map[x], strlen(&ch_map[x]));
2352
2353
2354
2355 memset(ch_map, '\0', sizeof(ch_map));
2356 strcpy(ch_map, new_ch_map);
2357
2358 } else if (ch_map[x] == ',') {
2359
2360 x++;
2361
2362
2363 memset(new_ch_map, '\0', sizeof(new_ch_map));
2364 strcpy(new_ch_map, &ch_map[x]);
2365
2366
2367 memset(ch_map, '\0', sizeof(ch_map));
2368 strcpy(ch_map, new_ch_map);
2369
2370 } else if (ch_map[x] == '\0') {
2371
2372
2373 memset(new_ch_map, '\0', sizeof(new_ch_map));
2374 strcpy(new_ch_map, &ch_map[x]);
2375
2376
2377 memset(ch_map, '\0', sizeof(ch_map));
2378 strcpy(ch_map, new_ch_map);
2379 } else {
2380
2381 }
2382
2383 SS7_DEVEL_DEBUG("New channel map = \"%s\"\n", ch_map);
2384
2385 return FTDM_SUCCESS;
2386 }
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401