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