root/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ftmod_ss7_parse_xml
  2. ftmod_ss7_parse_sng_isup
  3. ftmod_ss7_parse_mtp_linksets
  4. ftmod_ss7_parse_mtp_linkset
  5. ftmod_ss7_parse_mtp_link
  6. ftmod_ss7_parse_mtp_routes
  7. ftmod_ss7_parse_mtp_route
  8. ftmod_ss7_parse_isup_interfaces
  9. ftmod_ss7_parse_isup_interface
  10. ftmod_ss7_fill_in_mtpLink
  11. ftmod_ss7_fill_in_mtpLinkSet
  12. ftmod_ss7_fill_in_mtp3_route
  13. ftmod_ss7_fill_in_nsap
  14. ftmod_ss7_fill_in_isup_interface
  15. ftmod_ss7_fill_in_isap
  16. ftmod_ss7_fill_in_self_route
  17. ftmod_ss7_fill_in_circuits
  18. ftmod_ss7_next_timeslot

   1 /*
   2  * Copyright (c) 2009, Konrad Hammel <konrad@sangoma.com>
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  *
   9  * * Redistributions of source code must retain the above copyright
  10  * notice, this list of conditions and the following disclaimer.
  11  *
  12  * * Redistributions in binary form must reproduce the above copyright
  13  * notice, this list of conditions and the following disclaimer in the
  14  * documentation and/or other materials provided with the distribution.
  15  *
  16  * * Neither the name of the original author; nor the names of any contributors
  17  * may be used to endorse or promote products derived from this software
  18  * without specific prior written permission.
  19  *
  20  *
  21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  24  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
  25  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  26  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  27  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  28  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  29  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  30  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  31  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32  */
  33 
  34 /* INCLUDE ********************************************************************/
  35 #include "ftmod_sangoma_ss7_main.h"
  36 /******************************************************************************/
  37 
  38 /* DEFINES ********************************************************************/
  39 /******************************************************************************/
  40 
  41 /* GLOBALS ********************************************************************/
  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 /* PROTOTYPES *****************************************************************/
  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 /* FUNCTIONS ******************************************************************/
 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         /* clean out the isup ckt */
 114         memset(&isupCkt, 0x0, sizeof(sng_isupCkt_t));
 115 
 116         /* clean out the self route */
 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         /* confirm that the first parameter is the "confnode" */
 124         if (!strcasecmp(var, "confnode")) {
 125                 /* parse the confnode and fill in the global libsng_ss7 config structure */
 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                 /* ERROR...exit */
 132                 SS7_ERROR("The \"confnode\" configuration was not the first parameter!\n");
 133                 SS7_ERROR("\tFound \"%s\" in the first slot\n", var);
 134                 goto ftmod_ss7_parse_xml_error;
 135         }
 136 
 137         i++;
 138         while (ftdm_parameters[i].var != NULL) {
 139 
 140                 var = ftdm_parameters[i].var;
 141                 val = ftdm_parameters[i].val;
 142 
 143                 if (!strcasecmp(var, "ch_map")) {
 144                 /**********************************************************************/
 145                         strcpy(isupCkt.ch_map, val);
 146                         SS7_DEBUG("\tFound channel map \"%s\"\n", isupCkt.ch_map);
 147                 /**********************************************************************/
 148                 } else if (!strcasecmp(var, "typeCntrl")) {
 149                         if (!strcasecmp(val, "bothway")) {
 150                                 isupCkt.typeCntrl = BOTHWAY;
 151                                 SS7_DEBUG("\tFound control type \"bothway\"\n");
 152                         } else if (!strcasecmp(val, "incoming")) {
 153                                 isupCkt.typeCntrl = INCOMING;
 154                                 SS7_DEBUG("\tFound control type \"incoming\"\n");
 155                         } else if (!strcasecmp(val, "outgoing")) {
 156                                 isupCkt.typeCntrl = OUTGOING;
 157                                 SS7_DEBUG("\tFound control type \"outgoing\"\n");
 158                         } else if (!strcasecmp(val, "controlled")) {
 159                                 isupCkt.typeCntrl = CONTROLLED;
 160                                 SS7_DEBUG("\tFound control type \"controlled\"\n");
 161                         } else if (!strcasecmp(val, "controlling")) {
 162                                 isupCkt.typeCntrl = CONTROLLING;
 163                                 SS7_DEBUG("\tFound control type \"controlling\"\n");
 164                         } else {
 165                                 SS7_ERROR("Found invalid circuit control type \"%s\"!", val);
 166                                 goto ftmod_ss7_parse_xml_error;
 167                         }
 168                 /**********************************************************************/
 169                 } else if (!strcasecmp(var, "cicbase")) {
 170                         isupCkt.cicbase = atoi(val);
 171                         SS7_DEBUG("\tFound cicbase = %d\n", isupCkt.cicbase);
 172                 /**********************************************************************/
 173                 } else if (!strcasecmp(var, "dialplan")) {
 174                         /* do i give a shit about this??? */
 175                 /**********************************************************************/
 176                 } else if (!strcasecmp(var, "context")) {
 177                         /* do i give a shit about this??? */
 178                 /**********************************************************************/
 179                 } else if (!strcasecmp(var, "isup_interface")) {
 180                         /* go through all the existing interfaces and see if we find a match */
 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                                         /* we have a match so break out of this loop */
 185                                         break;
 186                                 }
 187                                 /* move on to the next one */
 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         } /* while (ftdm_parameters[i].var != NULL) */
 233 
 234         /* setup the self mtp3 route */
 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         /* fill the pointer to span into isupCkt */
 248         isupCkt.span = span;
 249 
 250         /* setup the circuits structure */
 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         /* confirm that we are looking at sng_isup */
 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         /* extract the 3 main sections of the sng_isup block */
 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                 /* go to the next sibling */
 312                 tmp_node = tmp_node->next;
 313 
 314         } /* while (tmp_node != NULL) */
 315 
 316         /* now try to parse the sections */
 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         /* confirm that we are looking at mtp_linksets */
 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         /* extract the mtp_links */
 349         mtp_linkset = mtp_linksets->child;
 350 
 351         /* run through all of the mtp_linksets found  */
 352         while (mtp_linkset != NULL) {
 353                 /* try to the parse mtp_linkset */
 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                 /* move on to the next linkset */
 360                 mtp_linkset = mtp_linkset->next;
 361 
 362         } /* while (mtp_linkset != NULL) */
 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         /* initialize the mtp_link structures */
 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         /* confirm that we are looking at mtp_linkset */
 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         /* extract all the information from the parameters */
 393         for (i = 0; i < num_parms; i++) {
 394                 /**********************************************************************/
 395                 if (!strcasecmp(parm->var, "name")) {
 396                         strcpy((char *)mtpLinkSet.name, parm->val);
 397                         SS7_DEBUG("\tFound an \"mtp_linkset\" named = %s\n", mtpLinkSet.name);
 398                 /**********************************************************************/
 399                 } else if (!strcasecmp(parm->var, "apc")) {
 400                         mtpLinkSet.apc = atoi(parm->val);
 401                         SS7_DEBUG("\tFound mtpLinkSet->apc = %d\n", mtpLinkSet.apc);
 402                 /**********************************************************************/
 403                 } else if (!strcasecmp(parm->var, "minActive")) {
 404                         mtpLinkSet.minActive = atoi(parm->val);
 405                         SS7_DEBUG("\tFound mtpLinkSet->minActive = %d\n", mtpLinkSet.minActive);
 406                 /**********************************************************************/
 407                 } else {
 408                         SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
 409                         return FTDM_FAIL;
 410                 }
 411 
 412                 /* move to the next parmeter */
 413                 parm = parm + 1;
 414 
 415         } /* for (i = 0; i < num_parms; i++) */
 416 
 417         /* grab the first mtp-link (which sits below the mtp_links section) */
 418         mtp_link = mtp_linkset->child->child;
 419 
 420         /* initalize the link counter */
 421         count = 0;
 422 
 423         /* run through all of the mtp_links found  */
 424         while (mtp_link != NULL) {
 425                 /* try to the parse mtp_linkset */
 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                 /* incremenet the link counter */
 432                 count++;
 433 
 434                 /* move on to the next link */
 435                 mtp_link = mtp_link->next;
 436 
 437         } /* while (mtp_link != NULL) */
 438 
 439         /* confirm we have the right number of links */
 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         /* now we need to see if this linkset exists already or not and grab an Id */
 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                         /* we've found the linkset...so it has already been configured */
 450                         break;
 451                 }
 452                 i++;
 453                 /* add in error check to make sure we don't go out-of-bounds */
 454         }
 455 
 456         /* if the id value is 0 that means we didn't find the linkset */
 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         /* we now have all the information to fill in the Libsng_ss7 structures */
 466         i = 0;
 467         count = 0;
 468         while (mtpLink[i].mtp1.span != 0 ){
 469 
 470                 /* have to grab a couple of values from the linkset */
 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                 /* increment the links counter */
 477                 count++;
 478 
 479                 /* increment the index value */
 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         /* confirm that we are looking at an mtp_link */
 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                 /* try to match the parameter to what we expect */
 509                 /**********************************************************************/
 510                 if (!strcasecmp(parm->var, "name")) {
 511                         strcpy((char *)mtpLink->name, parm->val);
 512                         SS7_DEBUG("\tFound an \"mtp_link\" named = %s\n", mtpLink->name);
 513                 /**********************************************************************/
 514                 } else if (!strcasecmp(parm->var, "span")) {
 515                         mtpLink->mtp1.span = atoi(parm->val);
 516                         SS7_DEBUG("\tFound mtpLink->span = %d\n", mtpLink->mtp1.span);
 517                 /**********************************************************************/
 518                 } else if (!strcasecmp(parm->var, "chan")) {
 519                         mtpLink->mtp1.chan = atoi(parm->val);
 520                         SS7_DEBUG("\tFound mtpLink->chan = %d\n", mtpLink->mtp1.chan);
 521                 /**********************************************************************/
 522                 } else if (!strcasecmp(parm->var, "errorType")) {
 523                         if (!strcasecmp(parm->val, "basic")) {
 524                                 mtpLink->mtp2.errorType = SD_ERR_NRM;
 525                         } else if (!strcasecmp(parm->val, "pcr")) {
 526                                 mtpLink->mtp2.errorType = SD_ERR_CYC;
 527                         } else {
 528                                 SS7_ERROR("\tFound an invalid \"errorType\" = %s\n", parm->var);
 529                                 return FTDM_FAIL;
 530                         }
 531                         SS7_DEBUG("\tFound mtpLink->errorType=%s\n", parm->val);
 532                 /**********************************************************************/
 533                 } else if (!strcasecmp(parm->var, "lssuLength")) {
 534                         mtpLink->mtp2.lssuLength = atoi(parm->val);
 535                         if ((mtpLink->mtp2.lssuLength != 1) && (mtpLink->mtp2.lssuLength != 2)) {
 536                                 SS7_ERROR("\tFound an invalid \"lssuLength\" = %d\n", mtpLink->mtp2.lssuLength);
 537                                 return FTDM_FAIL;
 538                         } else {
 539                                 SS7_DEBUG("\tFound mtpLink->lssuLength=%d\n", mtpLink->mtp2.lssuLength);
 540                         }
 541                 /**********************************************************************/
 542                 } else if (!strcasecmp(parm->var, "priority")) {
 543                         mtpLink->mtp3.priority = atoi(parm->val);
 544                         if ((mtpLink->mtp3.priority == 0) || (mtpLink->mtp3.priority == 1) || 
 545                                 (mtpLink->mtp3.priority == 2) || (mtpLink->mtp3.priority == 3)) {
 546                                 SS7_DEBUG("\tFound mtpLink->priority = %d\n",mtpLink->mtp3.priority);
 547                         } else {
 548                                 SS7_ERROR("\tFound an invalid \"priority\"=%d\n",mtpLink->mtp3.priority);
 549                                 return FTDM_FAIL;
 550                         } 
 551                 /**********************************************************************/
 552                 } else if (!strcasecmp(parm->var, "linkType")) {
 553                         if (!strcasecmp(parm->val, "itu92")) {
 554                                 mtpLink->mtp2.linkType = LSD_SW_ITU92;
 555                                 mtpLink->mtp3.linkType = LSN_SW_ITU;
 556                                 SS7_DEBUG("\tFound mtpLink->linkType = \"ITU92\"\n");
 557                         } else if (!strcasecmp(parm->val, "itu88")) {
 558                                 mtpLink->mtp2.linkType = LSD_SW_ITU88;
 559                                 mtpLink->mtp3.linkType = LSN_SW_ITU;
 560                                 SS7_DEBUG("\tFound mtpLink->linkType = \"ITU88\"\n");
 561                         } else if (!strcasecmp(parm->val, "ansi96")) {
 562                                 mtpLink->mtp2.linkType = LSD_SW_ANSI92;
 563                                 mtpLink->mtp3.linkType = LSN_SW_ANS96;
 564                                 SS7_DEBUG("\tFound mtpLink->linkType = \"ANSI96\"\n");
 565                         } else if (!strcasecmp(parm->val, "ansi92")) {
 566                                 mtpLink->mtp2.linkType = LSD_SW_ANSI92;
 567                                 mtpLink->mtp3.linkType = LSN_SW_ANS;
 568                                 SS7_DEBUG("\tFound mtpLink->linkType = \"ANSI92\"\n");
 569                         } else if (!strcasecmp(parm->val, "ansi88")) {
 570                                 mtpLink->mtp2.linkType = LSD_SW_ANSI88;
 571                                 mtpLink->mtp3.linkType = LSN_SW_ANS;
 572                                 SS7_DEBUG("\tFound mtpLink->linkType = \"ANSI88\"\n");
 573                         } else if (!strcasecmp(parm->val, "etsi")) {
 574                                 mtpLink->mtp2.linkType = LSD_SW_ITU92;
 575                                 mtpLink->mtp3.linkType = LSN_SW_ITU;
 576                                 SS7_DEBUG("\tFound mtpLink->linkType = \"ETSI\"\n");
 577                         } else {
 578                                 SS7_ERROR("\tFound an invalid linktype of \"%s\"!\n", parm->val);
 579                                 return FTDM_FAIL;
 580                         }
 581                 /**********************************************************************/
 582                 } else if (!strcasecmp(parm->var, "switchType")) {
 583                         if (!strcasecmp(parm->val, "itu97")) {
 584                                 mtpLink->mtp3.switchType = LSI_SW_ITU97;
 585                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU97\"\n");
 586                         } else if (!strcasecmp(parm->val, "itu88")) {
 587                                 mtpLink->mtp3.switchType = LSI_SW_ITU;
 588                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU88\"\n");
 589                         } else if (!strcasecmp(parm->val, "itu92")) {
 590                                 mtpLink->mtp3.switchType = LSI_SW_ITU;
 591                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU92\"\n");
 592                         } else if (!strcasecmp(parm->val, "itu00")) {
 593                                 mtpLink->mtp3.switchType = LSI_SW_ITU2000;
 594                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ITU00\"\n");
 595                         } else if (!strcasecmp(parm->val, "ETSIV2")) {
 596                                 mtpLink->mtp3.switchType = LSI_SW_ETSI;
 597                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ETSIV2\"\n");
 598                         } else if (!strcasecmp(parm->val, "ETSIV3")) {
 599                                 mtpLink->mtp3.switchType = LSI_SW_ETSIV3;
 600                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ETSIV3\"\n");
 601                         } else if (!strcasecmp(parm->val, "UK")) {
 602                                 mtpLink->mtp3.switchType = LSI_SW_UK;
 603                                 SS7_DEBUG("\tFound mtpLink->switchType = \"UK\"\n");
 604                         } else if (!strcasecmp(parm->val, "RUSSIA")) {
 605                                 mtpLink->mtp3.switchType = LSI_SW_RUSSIA;
 606                                 SS7_DEBUG("\tFound mtpLink->switchType = \"RUSSIA\"\n");
 607                         } else if (!strcasecmp(parm->val, "INDIA")) {
 608                                 mtpLink->mtp3.switchType = LSI_SW_INDIA;
 609                                 SS7_DEBUG("\tFound mtpLink->switchType = \"INDIA\"\n");
 610                         } else if (!strcasecmp(parm->val, "ansi88")) {
 611                                 mtpLink->mtp3.switchType = LSI_SW_ANS88;
 612                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ANSI88\"\n");
 613                         } else if (!strcasecmp(parm->val, "ansi92")) {
 614                                 mtpLink->mtp3.switchType = LSI_SW_ANS92;
 615                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ANSI92\"\n");
 616                         } else if (!strcasecmp(parm->val, "ansi95")) {
 617                                 mtpLink->mtp3.switchType = LSI_SW_ANS95;
 618                                 SS7_DEBUG("\tFound mtpLink->switchType = \"ANSI95\"\n");
 619                         } else {
 620                                 SS7_ERROR("\tFound an invalid linktype of \"%s\"!\n", parm->val);
 621                                 return FTDM_FAIL;
 622                         }
 623                 /**********************************************************************/
 624                 } else if (!strcasecmp(parm->var, "ssf")) {
 625                         if (!strcasecmp(parm->val, "nat")) {
 626                                 mtpLink->mtp3.ssf = SSF_NAT;
 627                         } else if (!strcasecmp(parm->val, "int")) {
 628                                 mtpLink->mtp3.ssf = SSF_INTL;
 629                         } else {
 630                                 SS7_ERROR("\tFound an invalid ssf of \"%s\"!\n", parm->val);
 631                                 return FTDM_FAIL;
 632                         }
 633                 /**********************************************************************/
 634                 } else if (!strcasecmp(parm->var, "slc")) {
 635                         mtpLink->mtp3.slc = atoi(parm->val);
 636                         SS7_DEBUG("\tFound mtpLink->slc = \"%d\"\n",mtpLink->mtp3.slc);
 637                 /**********************************************************************/
 638                 } else if (!strcasecmp(parm->var, "mtp2.t1")) {
 639                         mtpLink->mtp2.t1 = atoi(parm->val);
 640                         SS7_DEBUG("\tFound mtp2 t1 = \"%d\"\n",mtpLink->mtp2.t1);
 641                 /**********************************************************************/
 642                 } else if (!strcasecmp(parm->var, "mtp2.t2")) {
 643                         mtpLink->mtp2.t2 = atoi(parm->val);
 644                         SS7_DEBUG("\tFound mtp2 t2 = \"%d\"\n",mtpLink->mtp2.t2);
 645                 /**********************************************************************/
 646                 } else if (!strcasecmp(parm->var, "mtp2.t3")) {
 647                         mtpLink->mtp2.t3 = atoi(parm->val);
 648                         SS7_DEBUG("\tFound mtp2 t3 = \"%d\"\n",mtpLink->mtp2.t3);
 649                 /**********************************************************************/
 650                 } else if (!strcasecmp(parm->var, "mtp2.t4n")) {
 651                         mtpLink->mtp2.t4n = atoi(parm->val);
 652                         SS7_DEBUG("\tFound mtp2 t4n = \"%d\"\n",mtpLink->mtp2.t4n);
 653                 /**********************************************************************/
 654                 } else if (!strcasecmp(parm->var, "mtp2.t4e")) {
 655                         mtpLink->mtp2.t4e = atoi(parm->val);
 656                         SS7_DEBUG("\tFound mtp2 t4e = \"%d\"\n",mtpLink->mtp2.t4e);
 657                 /**********************************************************************/
 658                 } else if (!strcasecmp(parm->var, "mtp2.t5")) {
 659                         mtpLink->mtp2.t5 = atoi(parm->val);
 660                         SS7_DEBUG("\tFound mtp2 t5 = \"%d\"\n",mtpLink->mtp2.t5);
 661                 /**********************************************************************/
 662                 } else if (!strcasecmp(parm->var, "mtp2.t6")) {
 663                         mtpLink->mtp2.t6 = atoi(parm->val);
 664                         SS7_DEBUG("\tFound mtp2 t6 = \"%d\"\n",mtpLink->mtp2.t6);
 665                 /**********************************************************************/
 666                 } else if (!strcasecmp(parm->var, "mtp2.t7")) {
 667                         mtpLink->mtp2.t7 = atoi(parm->val);
 668                         SS7_DEBUG("\tFound mtp2 t7 = \"%d\"\n",mtpLink->mtp2.t7);
 669                 /**********************************************************************/
 670                 } else if (!strcasecmp(parm->var, "mtp3.t1")) {
 671                         mtpLink->mtp3.t1 = atoi(parm->val);
 672                         SS7_DEBUG("\tFound mtp3 t1 = \"%d\"\n",mtpLink->mtp3.t1);
 673                 /**********************************************************************/
 674                 } else if (!strcasecmp(parm->var, "mtp3.t2")) {
 675                         mtpLink->mtp3.t2 = atoi(parm->val);
 676                         SS7_DEBUG("\tFound mtp3 t2 = \"%d\"\n",mtpLink->mtp3.t2);
 677                 /**********************************************************************/
 678                 } else if (!strcasecmp(parm->var, "mtp3.t3")) {
 679                         mtpLink->mtp3.t3 = atoi(parm->val);
 680                         SS7_DEBUG("\tFound mtp3 t3 = \"%d\"\n",mtpLink->mtp3.t3);
 681                 /**********************************************************************/
 682                 } else if (!strcasecmp(parm->var, "mtp3.t4")) {
 683                         mtpLink->mtp3.t4 = atoi(parm->val);
 684                         SS7_DEBUG("\tFound mtp3 t4 = \"%d\"\n",mtpLink->mtp3.t4);
 685                 /**********************************************************************/
 686                 } else if (!strcasecmp(parm->var, "mtp3.t5")) {
 687                         mtpLink->mtp3.t5 = atoi(parm->val);
 688                         SS7_DEBUG("\tFound mtp3 t5 = \"%d\"\n",mtpLink->mtp3.t5);
 689                 /**********************************************************************/
 690                 } else if (!strcasecmp(parm->var, "mtp3.t7")) {
 691                         mtpLink->mtp3.t7 = atoi(parm->val);
 692                         SS7_DEBUG("\tFound mtp3 t7 = \"%d\"\n",mtpLink->mtp3.t7);
 693                 /**********************************************************************/
 694                 } else if (!strcasecmp(parm->var, "mtp3.t12")) {
 695                         mtpLink->mtp3.t12 = atoi(parm->val);
 696                         SS7_DEBUG("\tFound mtp3 t12 = \"%d\"\n",mtpLink->mtp3.t12);
 697                 /**********************************************************************/
 698                 } else if (!strcasecmp(parm->var, "mtp3.t13")) {
 699                         mtpLink->mtp3.t13 = atoi(parm->val);
 700                         SS7_DEBUG("\tFound mtp3 t13 = \"%d\"\n",mtpLink->mtp3.t13);
 701                 /**********************************************************************/
 702                 } else if (!strcasecmp(parm->var, "mtp3.t14")) {
 703                         mtpLink->mtp3.t14 = atoi(parm->val);
 704                         SS7_DEBUG("\tFound mtp3 t14 = \"%d\"\n",mtpLink->mtp3.t14);
 705                 /**********************************************************************/
 706                 } else if (!strcasecmp(parm->var, "mtp3.t17")) {
 707                         mtpLink->mtp3.t17 = atoi(parm->val);
 708                         SS7_DEBUG("\tFound mtp3 t17 = \"%d\"\n",mtpLink->mtp3.t17);
 709                 /**********************************************************************/
 710                 } else if (!strcasecmp(parm->var, "mtp3.t22")) {
 711                         mtpLink->mtp3.t22 = atoi(parm->val);
 712                         SS7_DEBUG("\tFound mtp3 t22 = \"%d\"\n",mtpLink->mtp3.t22);
 713                 /**********************************************************************/
 714                 } else if (!strcasecmp(parm->var, "mtp3.t23")) {
 715                         mtpLink->mtp3.t23 = atoi(parm->val);
 716                         SS7_DEBUG("\tFound mtp3 t23 = \"%d\"\n",mtpLink->mtp3.t23);
 717                 /**********************************************************************/
 718                 } else if (!strcasecmp(parm->var, "mtp3.t24")) {
 719                         mtpLink->mtp3.t24 = atoi(parm->val);
 720                         SS7_DEBUG("\tFound mtp3 t24 = \"%d\"\n",mtpLink->mtp3.t24);
 721                 /**********************************************************************/
 722                 } else if (!strcasecmp(parm->var, "mtp3.t31")) {
 723                         mtpLink->mtp3.t31 = atoi(parm->val);
 724                         SS7_DEBUG("\tFound mtp3 t31 = \"%d\"\n",mtpLink->mtp3.t31);
 725                 /**********************************************************************/
 726                 } else if (!strcasecmp(parm->var, "mtp3.t32")) {
 727                         mtpLink->mtp3.t32 = atoi(parm->val);
 728                         SS7_DEBUG("\tFound mtp3 t32 = \"%d\"\n",mtpLink->mtp3.t32);
 729                 /**********************************************************************/
 730                 } else if (!strcasecmp(parm->var, "mtp3.t33")) {
 731                         mtpLink->mtp3.t33 = atoi(parm->val);
 732                         SS7_DEBUG("\tFound mtp3 t33 = \"%d\"\n",mtpLink->mtp3.t33);
 733                 /**********************************************************************/
 734                 } else if (!strcasecmp(parm->var, "mtp3.t34")) {
 735                         mtpLink->mtp3.t34 = atoi(parm->val);
 736                         SS7_DEBUG("\tFound mtp3 t34 = \"%d\"\n",mtpLink->mtp3.t34);
 737                 /**********************************************************************/
 738                 } else if (!strcasecmp(parm->var, "mtp3.t35")) {
 739                         mtpLink->mtp3.t35 = atoi(parm->val);
 740                         SS7_DEBUG("\tFound mtp3 t35 = \"%d\"\n",mtpLink->mtp3.t35);
 741                 /**********************************************************************/
 742                 } else if (!strcasecmp(parm->var, "mtp3.t36")) {
 743                         mtpLink->mtp3.t36 = atoi(parm->val);
 744                         SS7_DEBUG("\tFound mtp3 t36 = \"%d\"\n",mtpLink->mtp3.t36);
 745                 /**********************************************************************/
 746                 } else if (!strcasecmp(parm->var, "mtp3.t37")) {
 747                         mtpLink->mtp3.t37 = atoi(parm->val);
 748                         SS7_DEBUG("\tFound mtp3 t37 = \"%d\"\n",mtpLink->mtp3.t37);
 749                 /**********************************************************************/
 750                 } else if (!strcasecmp(parm->var, "mtp3.tcraft")) {
 751                         mtpLink->mtp3.tcraft = atoi(parm->val);
 752                         SS7_DEBUG("\tFound mtp3 tcraft = \"%d\"\n",mtpLink->mtp3.tcraft);
 753                 /**********************************************************************/
 754                 } else if (!strcasecmp(parm->var, "mtp3.tflc")) {
 755                         mtpLink->mtp3.tflc = atoi(parm->val);
 756                         SS7_DEBUG("\tFound mtp3 tflc = \"%d\"\n",mtpLink->mtp3.tflc);
 757                 /**********************************************************************/
 758                 } else if (!strcasecmp(parm->var, "mtp3.tbnd")) {
 759                         mtpLink->mtp3.tbnd = atoi(parm->val);
 760                         SS7_DEBUG("\tFound mtp3 tbnd = \"%d\"\n",mtpLink->mtp3.tbnd);
 761                 /**********************************************************************/
 762                 } else {
 763                         SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
 764                         return FTDM_FAIL;
 765                 }
 766         
 767                 /* move to the next parameter */
 768                 parm = parm + 1;
 769         }
 770         
 771         return FTDM_SUCCESS;
 772 }
 773 
 774 /******************************************************************************/
 775 static int ftmod_ss7_parse_mtp_routes(ftdm_conf_node_t *mtp_routes)
 776 {
 777         ftdm_conf_node_t        *mtp_route = NULL;
 778 
 779         /* confirm that we are looking at an mtp_routes */
 780         if (strcasecmp(mtp_routes->name, "mtp_routes")) {
 781                 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_routes\"!\n",mtp_routes->name);
 782                 return FTDM_FAIL;
 783         } else {
 784                 SS7_DEBUG("Parsing \"mtp_routes\"...\n");
 785         }
 786 
 787         /* extract the mtp_routes */
 788         mtp_route = mtp_routes->child;
 789 
 790         while (mtp_route != NULL) {
 791                 /* parse the found mtp_route */
 792                 if (ftmod_ss7_parse_mtp_route(mtp_route)) {
 793                         SS7_ERROR("Failed to parse \"mtp_route\"\n");
 794                         return FTDM_FAIL;
 795                 }
 796 
 797                 /* go to the next mtp_route */
 798                 mtp_route = mtp_route->next;
 799         }
 800 
 801         return FTDM_SUCCESS;
 802 }
 803 
 804 /******************************************************************************/
 805 static int ftmod_ss7_parse_mtp_route(ftdm_conf_node_t *mtp_route)
 806 {
 807         sng_route_t                             mtpRoute;
 808         ftdm_conf_parameter_t   *parm = mtp_route->parameters;
 809         int                                             num_parms = mtp_route->n_parameters;
 810         int                                             i;
 811 
 812         memset(&mtpRoute, 0x0, sizeof(mtpRoute));
 813 
 814         /* confirm that we are looking at an mtp_link */
 815         if (strcasecmp(mtp_route->name, "mtp_route")) {
 816                 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"mtp_route\"!\n",mtp_route->name);
 817                 return FTDM_FAIL;
 818         } else {
 819                 SS7_DEBUG("Parsing \"mtp_route\"...\n");
 820         }
 821 
 822         for (i = 0; i < num_parms; i++) {
 823                 /* try to match the parameter to what we expect */
 824                 /**********************************************************************/
 825                 if (!strcasecmp(parm->var, "name")) {
 826                         strcpy((char *)mtpRoute.name, parm->val);
 827                         SS7_DEBUG("\tFound an \"mtp_route\" named = %s\n", mtpRoute.name);
 828                 /**********************************************************************/
 829                 } else if (!strcasecmp(parm->var, "dpc")) {
 830                         mtpRoute.dpc = atoi(parm->val);
 831                         SS7_DEBUG("\tFound mtpRoute->dpc = %d\n", mtpRoute.dpc);
 832                 /**********************************************************************/
 833                 } else if (!strcasecmp(parm->var, "mtp_linkset")) {
 834 
 835                         /* find the linkset by it's name */
 836                         int x = 1;
 837                         while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
 838                                 /* check if the name matches */
 839                                 if (!strcasecmp((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name, parm->val)) {
 840 
 841                                         /* now, harvest the required infomormation from the global structure */
 842                                         mtpRoute.linkType               = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].linkType;
 843                                         mtpRoute.switchType             = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].switchType;
 844                                         mtpRoute.ssf                    = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].ssf;
 845                                         mtpRoute.linkSetId              = g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id;
 846                                         cmbLinkSetId++;
 847                                         mtpRoute.cmbLinkSetId   = cmbLinkSetId;
 848 
 849                                         /* update the linkset with the new cmbLinkSet value */
 850                                         g_ftdm_sngss7_data.cfg.mtpLinkSet[x].numLinks++;
 851                                         g_ftdm_sngss7_data.cfg.mtpLinkSet[x].links[g_ftdm_sngss7_data.cfg.mtpLinkSet[x].numLinks-1] = mtpRoute.cmbLinkSetId;
 852                                         break;
 853                                 }
 854                                 x++;
 855                         }
 856 
 857                         /* check why we exited the wile loop ... and react accordingly */
 858                         if (mtpRoute.cmbLinkSetId == 0) {
 859                                 SS7_ERROR("\tFailed to find the linkset = \"%s\"!\n", parm->val);
 860                                 return FTDM_FAIL;
 861                         } else {
 862                                 SS7_DEBUG("\tFound mtp3_route->linkset = %s\n", parm->val);
 863                         }
 864                 /**********************************************************************/
 865                 } else if (!strcasecmp(parm->var, "isSTP")) {
 866                         if (!strcasecmp(parm->val, "no")) {
 867                                 mtpRoute.isSTP = 0;
 868                                 SS7_DEBUG("\tFound mtpRoute->isSTP = no\n");
 869                         } else if (!strcasecmp(parm->val, "yes")) {
 870                                 mtpRoute.isSTP = 1;
 871                                 SS7_DEBUG("\tFound mtpRoute->isSTP = yes\n");
 872                         } else {
 873                                 SS7_ERROR("\tFound an invalid parameter for isSTP \"%s\"!\n", parm->val);
 874                            return FTDM_FAIL;
 875                         }
 876                 /**********************************************************************/
 877                 } else if (!strcasecmp(parm->var, "mtp3.t6")) {
 878                         mtpRoute.t6 = atoi(parm->val);
 879                         SS7_DEBUG("\tFound mtp3 t6 = \"%d\"\n",mtpRoute.t6);
 880                 /**********************************************************************/
 881                 } else if (!strcasecmp(parm->var, "mtp3.t8")) {
 882                         mtpRoute.t8 = atoi(parm->val);
 883                         SS7_DEBUG("\tFound mtp3 t8 = \"%d\"\n",mtpRoute.t8);
 884                 /**********************************************************************/
 885                 } else if (!strcasecmp(parm->var, "mtp3.t10")) {
 886                         mtpRoute.t10 = atoi(parm->val);
 887                         SS7_DEBUG("\tFound mtp3 t10 = \"%d\"\n",mtpRoute.t10);
 888                 /**********************************************************************/
 889                 } else if (!strcasecmp(parm->var, "mtp3.t11")) {
 890                         mtpRoute.t11 = atoi(parm->val);
 891                         SS7_DEBUG("\tFound mtp3 t11 = \"%d\"\n",mtpRoute.t11);
 892                 /**********************************************************************/
 893                 } else if (!strcasecmp(parm->var, "mtp3.t15")) {
 894                         mtpRoute.t15 = atoi(parm->val);
 895                         SS7_DEBUG("\tFound mtp3 t15 = \"%d\"\n",mtpRoute.t15);
 896                 /**********************************************************************/
 897                 } else if (!strcasecmp(parm->var, "mtp3.t16")) {
 898                         mtpRoute.t16 = atoi(parm->val);
 899                         SS7_DEBUG("\tFound mtp3 t16 = \"%d\"\n",mtpRoute.t16);
 900                 /**********************************************************************/
 901                 } else if (!strcasecmp(parm->var, "mtp3.t18")) {
 902                         mtpRoute.t18 = atoi(parm->val);
 903                         SS7_DEBUG("\tFound mtp3 t18 = \"%d\"\n",mtpRoute.t18);
 904                 /**********************************************************************/
 905                 } else if (!strcasecmp(parm->var, "mtp3.t19")) {
 906                         mtpRoute.t19 = atoi(parm->val);
 907                         SS7_DEBUG("\tFound mtp3 t19 = \"%d\"\n",mtpRoute.t19);
 908                 /**********************************************************************/
 909                 } else if (!strcasecmp(parm->var, "mtp3.t21")) {
 910                         mtpRoute.t21 = atoi(parm->val);
 911                         SS7_DEBUG("\tFound mtp3 t21 = \"%d\"\n",mtpRoute.t21);
 912                 /**********************************************************************/
 913                 } else if (!strcasecmp(parm->var, "mtp3.t25")) {
 914                         mtpRoute.t25 = atoi(parm->val);
 915                         SS7_DEBUG("\tFound mtp3 t25 = \"%d\"\n",mtpRoute.t25);
 916                 /**********************************************************************/
 917                 } else if (!strcasecmp(parm->var, "mtp3.t26")) {
 918                         mtpRoute.t26 = atoi(parm->val);
 919                         SS7_DEBUG("\tFound mtp3 t26 = \"%d\"\n",mtpRoute.t26);
 920                 /**********************************************************************/
 921                 } else {
 922                         SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
 923                         return FTDM_FAIL;
 924 
 925                 }
 926 
 927                 /* move to the next parameter */
 928                 parm = parm + 1;
 929         }
 930 
 931         ftmod_ss7_fill_in_nsap(&mtpRoute);
 932 
 933         ftmod_ss7_fill_in_mtp3_route(&mtpRoute);
 934 
 935 
 936 
 937         return FTDM_SUCCESS;
 938 }
 939 
 940 /******************************************************************************/
 941 static int ftmod_ss7_parse_isup_interfaces(ftdm_conf_node_t *isup_interfaces)
 942 {
 943         ftdm_conf_node_t        *isup_interface = NULL;
 944 
 945         /* confirm that we are looking at isup_interfaces */
 946         if (strcasecmp(isup_interfaces->name, "isup_interfaces")) {
 947                 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"isup_interfaces\"!\n",isup_interfaces->name);
 948                 return FTDM_FAIL;
 949         } else {
 950                 SS7_DEBUG("Parsing \"isup_interfaces\"...\n");
 951         }
 952 
 953         /* extract the isup_interfaces */
 954         isup_interface = isup_interfaces->child;
 955 
 956         while (isup_interface != NULL) {
 957                 /* parse the found mtp_route */
 958                 if (ftmod_ss7_parse_isup_interface(isup_interface)) {
 959                         SS7_ERROR("Failed to parse \"isup_interface\"\n");
 960                         return FTDM_FAIL;
 961                 }
 962 
 963                 /* go to the next mtp_route */
 964                 isup_interface = isup_interface->next;
 965         }
 966 
 967         return FTDM_SUCCESS;
 968 }
 969 
 970 /******************************************************************************/
 971 static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
 972 {
 973         sng_isup_inf_t                  sng_isup;
 974         sng_isap_t                              sng_isap;
 975         ftdm_conf_parameter_t   *parm = isup_interface->parameters;
 976         int                                             num_parms = isup_interface->n_parameters;
 977         int                                             i;
 978         int                                             linkSetId;
 979         int                                             flag_cld_nadi = 0;
 980         int                                             flag_clg_nadi = 0;
 981 
 982         memset(&sng_isup, 0x0, sizeof(sng_isup));
 983         memset(&sng_isap, 0x0, sizeof(sng_isap));
 984 
 985         /* confirm that we are looking at an mtp_link */
 986         if (strcasecmp(isup_interface->name, "isup_interface")) {
 987                 SS7_ERROR("We're looking at \"%s\"...but we're supposed to be looking at \"isup_interface\"!\n",isup_interface->name);
 988                 return FTDM_FAIL;
 989         } else {
 990                 SS7_DEBUG("Parsing \"isup_interface\"...\n");
 991         }
 992 
 993 
 994         for (i = 0; i < num_parms; i++) {
 995                 /* try to match the parameter to what we expect */
 996                 /**********************************************************************/
 997                 if (!strcasecmp(parm->var, "name")) {
 998                         strcpy((char *)sng_isup.name, parm->val);
 999                         SS7_DEBUG("\tFound an \"isup_interface\" named = %s\n", sng_isup.name);
1000                 /**********************************************************************/
1001                 } else if (!strcasecmp(parm->var, "spc")) {
1002                         sng_isup.spc = atoi(parm->val);
1003                         g_ftdm_sngss7_data.cfg.spc = sng_isup.spc;
1004                         SS7_DEBUG("\tFound SPC = %d\n", sng_isup.spc);
1005                 /**********************************************************************/
1006                 } else if (!strcasecmp(parm->var, "mtp_route")) {
1007                         /* find the route by it's name */
1008                         int x = 1;
1009 
1010                         while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) {
1011 
1012                                 /* check if the name matches */
1013                                 if (!strcasecmp((char *)g_ftdm_sngss7_data.cfg.mtpRoute[x].name, parm->val)) {
1014                                         /* now, harvest the required information from the global structure */
1015                                         sng_isup.mtpRouteId             = g_ftdm_sngss7_data.cfg.mtpRoute[x].id;
1016                                         sng_isup.dpc                    = g_ftdm_sngss7_data.cfg.mtpRoute[x].dpc;
1017                                         sng_isup.switchType             = g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType;
1018                                         sng_isap.switchType             = g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType;
1019 
1020                                         /* find the NSAP corresponding to this switchType and SSF */
1021                                         int z = 1;
1022                                         while (g_ftdm_sngss7_data.cfg.nsap[z].id != 0) {
1023                                                 if ((g_ftdm_sngss7_data.cfg.nsap[z].linkType == g_ftdm_sngss7_data.cfg.mtpRoute[x].linkType) &&
1024                                                         (g_ftdm_sngss7_data.cfg.nsap[z].switchType == g_ftdm_sngss7_data.cfg.mtpRoute[x].switchType) &&
1025                                                         (g_ftdm_sngss7_data.cfg.nsap[z].ssf == g_ftdm_sngss7_data.cfg.mtpRoute[x].ssf)) {
1026                                                                 sng_isup.nwId   = g_ftdm_sngss7_data.cfg.nsap[z].nwId;
1027                                                         /* we have a match so break out of this loop */
1028                                                         break;
1029                                                 }
1030                                                 /* move on to the next one */
1031                                                 z++;
1032                                         }
1033                                         break;
1034                                 }
1035                                 x++;
1036                         } /* while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) */
1037 
1038                         /* check why we exited the while loop ... and react accordingly */
1039                         if (sng_isup.mtpRouteId == 0) {
1040                                 SS7_ERROR("\tFailed to find the MTP3 Route = \"%s\"!\n", parm->val);
1041                                 return FTDM_FAIL;
1042                         } else {
1043                                 SS7_DEBUG("\tFound MTP3 Route = %s\n", parm->val);
1044                         }
1045                 /**********************************************************************/
1046                 } else if (!strcasecmp(parm->var, "ssf")) {
1047                         if (!strcasecmp(parm->val, "nat")) {
1048                                 sng_isup.ssf = SSF_NAT;
1049                                 sng_isap.ssf = SSF_NAT;
1050                         } else if (!strcasecmp(parm->val, "int")) {
1051                                 sng_isup.ssf = SSF_INTL;
1052                                 sng_isap.ssf = SSF_INTL;
1053                         } else {
1054                                 SS7_ERROR("\tFound an invalid ssf of \"%s\"!\n", parm->val);
1055                                 return FTDM_FAIL;
1056                         }
1057                 /**********************************************************************/
1058                 } else if (!strcasecmp(parm->var, "license")) {
1059                 /**********************************************************************/
1060                         strcpy(g_ftdm_sngss7_data.cfg.license, parm->val);
1061                         strcpy(g_ftdm_sngss7_data.cfg.signature, parm->val);
1062                         strcat(g_ftdm_sngss7_data.cfg.signature, ".sig");
1063                         SS7_DEBUG("\tFound license file = %s\n", g_ftdm_sngss7_data.cfg.license);
1064                         SS7_DEBUG("\tFound signature file = %s\n", g_ftdm_sngss7_data.cfg.signature);   
1065                 /**********************************************************************/
1066                 } else if (!strcasecmp(parm->var, "isup.t1")) {
1067                         sng_isap.t1 = atoi(parm->val);
1068                         SS7_DEBUG("\tFound isup t1 = \"%d\"\n",sng_isap.t1);
1069                 /**********************************************************************/
1070                 } else if (!strcasecmp(parm->var, "isup.t2")) {
1071                         sng_isap.t2 = atoi(parm->val);
1072                         SS7_DEBUG("\tFound isup t2 = \"%d\"\n",sng_isap.t2);
1073                 /**********************************************************************/
1074                 } else if (!strcasecmp(parm->var, "isup.t4")) {
1075                         sng_isup.t4 = atoi(parm->val);
1076                         SS7_DEBUG("\tFound isup t4 = \"%d\"\n",sng_isup.t4);
1077                 /**********************************************************************/
1078                 } else if (!strcasecmp(parm->var, "isup.t5")) {
1079                         sng_isap.t5 = atoi(parm->val);
1080                         SS7_DEBUG("\tFound isup t5 = \"%d\"\n",sng_isap.t5);
1081                 /**********************************************************************/
1082                 } else if (!strcasecmp(parm->var, "isup.t6")) {
1083                         sng_isap.t6 = atoi(parm->val);
1084                         SS7_DEBUG("\tFound isup t6 = \"%d\"\n",sng_isap.t6);
1085                 /**********************************************************************/
1086                 } else if (!strcasecmp(parm->var, "isup.t7")) {
1087                         sng_isap.t7 = atoi(parm->val);
1088                         SS7_DEBUG("\tFound isup t7 = \"%d\"\n",sng_isap.t7);
1089                 /**********************************************************************/
1090                 } else if (!strcasecmp(parm->var, "isup.t8")) {
1091                         sng_isap.t8 = atoi(parm->val);
1092                         SS7_DEBUG("\tFound isup t8 = \"%d\"\n",sng_isap.t8);
1093                 /**********************************************************************/
1094                 } else if (!strcasecmp(parm->var, "isup.t9")) {
1095                         sng_isap.t9 = atoi(parm->val);
1096                         SS7_DEBUG("\tFound isup t9 = \"%d\"\n",sng_isap.t9);
1097                 /**********************************************************************/
1098                 } else if (!strcasecmp(parm->var, "isup.t10")) {
1099                         sng_isup.t10 = atoi(parm->val);
1100                         SS7_DEBUG("\tFound isup t10 = \"%d\"\n",sng_isup.t10);
1101                 /**********************************************************************/
1102                 } else if (!strcasecmp(parm->var, "isup.t11")) {
1103                         sng_isup.t11 = atoi(parm->val);
1104                         SS7_DEBUG("\tFound isup t11 = \"%d\"\n",sng_isup.t11);
1105                 /**********************************************************************/
1106                 } else if (!strcasecmp(parm->var, "isup.t18")) {
1107                         sng_isup.t18 = atoi(parm->val);
1108                         SS7_DEBUG("\tFound isup t18 = \"%d\"\n",sng_isup.t18);
1109                 /**********************************************************************/
1110                 } else if (!strcasecmp(parm->var, "isup.t19")) {
1111                         sng_isup.t19 = atoi(parm->val);
1112                         SS7_DEBUG("\tFound isup t19 = \"%d\"\n",sng_isup.t19);
1113                 /**********************************************************************/
1114                 } else if (!strcasecmp(parm->var, "isup.t20")) {
1115                         sng_isup.t20 = atoi(parm->val);
1116                         SS7_DEBUG("\tFound isup t20 = \"%d\"\n",sng_isup.t20);
1117                 /**********************************************************************/
1118                 } else if (!strcasecmp(parm->var, "isup.t21")) {
1119                         sng_isup.t21 = atoi(parm->val);
1120                         SS7_DEBUG("\tFound isup t21 = \"%d\"\n",sng_isup.t21);
1121                 /**********************************************************************/
1122                 } else if (!strcasecmp(parm->var, "isup.t22")) {
1123                         sng_isup.t22 = atoi(parm->val);
1124                         SS7_DEBUG("\tFound isup t22 = \"%d\"\n",sng_isup.t22);
1125                 /**********************************************************************/
1126                 } else if (!strcasecmp(parm->var, "isup.t23")) {
1127                         sng_isup.t23 = atoi(parm->val);
1128                         SS7_DEBUG("\tFound isup t23 = \"%d\"\n",sng_isup.t23);
1129                 /**********************************************************************/
1130                 } else if (!strcasecmp(parm->var, "isup.t24")) {
1131                         sng_isup.t24 = atoi(parm->val);
1132                         SS7_DEBUG("\tFound isup t24 = \"%d\"\n",sng_isup.t24);
1133                 /**********************************************************************/
1134                 } else if (!strcasecmp(parm->var, "isup.t25")) {
1135                         sng_isup.t25 = atoi(parm->val);
1136                         SS7_DEBUG("\tFound isup t25 = \"%d\"\n",sng_isup.t25);
1137                 /**********************************************************************/
1138                 } else if (!strcasecmp(parm->var, "isup.t26")) {
1139                         sng_isup.t26 = atoi(parm->val);
1140                         SS7_DEBUG("\tFound isup t26 = \"%d\"\n",sng_isup.t26);
1141                 /**********************************************************************/
1142                 } else if (!strcasecmp(parm->var, "isup.t28")) {
1143                         sng_isup.t28 = atoi(parm->val);
1144                         SS7_DEBUG("\tFound isup t28 = \"%d\"\n",sng_isup.t28);
1145                 /**********************************************************************/
1146                 } else if (!strcasecmp(parm->var, "isup.t29")) {
1147                         sng_isup.t29 = atoi(parm->val);
1148                         SS7_DEBUG("\tFound isup t29 = \"%d\"\n",sng_isup.t29);
1149                 /**********************************************************************/
1150                 } else if (!strcasecmp(parm->var, "isup.t30")) {
1151                         sng_isup.t30 = atoi(parm->val);
1152                         SS7_DEBUG("\tFound isup t30 = \"%d\"\n",sng_isup.t30);
1153                 /**********************************************************************/
1154                 } else if (!strcasecmp(parm->var, "isup.t31")) {
1155                         sng_isap.t31 = atoi(parm->val);
1156                         SS7_DEBUG("\tFound isup t31 = \"%d\"\n",sng_isap.t31);
1157                 /**********************************************************************/
1158                 } else if (!strcasecmp(parm->var, "isup.t32")) {
1159                         sng_isup.t32 = atoi(parm->val);
1160                         SS7_DEBUG("\tFound isup t32 = \"%d\"\n",sng_isup.t32);
1161                 /**********************************************************************/
1162                 } else if (!strcasecmp(parm->var, "isup.t33")) {
1163                         sng_isap.t33 = atoi(parm->val);
1164                         SS7_DEBUG("\tFound isup t33 = \"%d\"\n",sng_isap.t33);
1165                 /**********************************************************************/
1166                 } else if (!strcasecmp(parm->var, "isup.t34")) {
1167                         sng_isap.t34 = atoi(parm->val);
1168                         SS7_DEBUG("\tFound isup t34 = \"%d\"\n",sng_isap.t34);
1169                 /**********************************************************************/
1170                 } else if (!strcasecmp(parm->var, "isup.t35")) {
1171                         sng_isup.t35 = atoi(parm->val);
1172                         SS7_DEBUG("\tFound isup t35 = \"%d\"\n",sng_isup.t35);
1173                 /**********************************************************************/
1174                 } else if (!strcasecmp(parm->var, "isup.t36")) {
1175                         sng_isap.t36 = atoi(parm->val);
1176                         SS7_DEBUG("\tFound isup t36 = \"%d\"\n",sng_isap.t36);
1177                 /**********************************************************************/
1178                 } else if (!strcasecmp(parm->var, "isup.t37")) {
1179                         sng_isup.t37 = atoi(parm->val);
1180                         SS7_DEBUG("\tFound isup t37 = \"%d\"\n",sng_isup.t37);
1181                 /**********************************************************************/
1182                 } else if (!strcasecmp(parm->var, "isup.t38")) {
1183                         sng_isup.t38 = atoi(parm->val);
1184                         SS7_DEBUG("\tFound isup t38 = \"%d\"\n",sng_isup.t38);
1185                 /**********************************************************************/
1186                 } else if (!strcasecmp(parm->var, "isup.t39")) {
1187                         sng_isup.t39 = atoi(parm->val);
1188                         SS7_DEBUG("\tFound isup t39 = \"%d\"\n",sng_isup.t39);
1189                 /**********************************************************************/
1190                 } else if (!strcasecmp(parm->var, "isup.tccr")) {
1191                         sng_isap.tccr = atoi(parm->val);
1192                         SS7_DEBUG("\tFound isup tccr = \"%d\"\n",sng_isap.tccr);
1193                 /**********************************************************************/
1194                 } else if (!strcasecmp(parm->var, "isup.tccrt")) {
1195                         sng_isap.tccrt = atoi(parm->val);
1196                         SS7_DEBUG("\tFound isup tccrt = \"%d\"\n",sng_isap.tccrt);
1197                 /**********************************************************************/
1198                 } else if (!strcasecmp(parm->var, "isup.tex")) {
1199                         sng_isap.tex = atoi(parm->val);
1200                         SS7_DEBUG("\tFound isup tex = \"%d\"\n",sng_isap.tex);
1201                 /**********************************************************************/
1202                 } else if (!strcasecmp(parm->var, "isup.tect")) {
1203                         sng_isap.tect = atoi(parm->val);
1204                         SS7_DEBUG("\tFound isup tect = \"%d\"\n",sng_isap.tect);
1205                 /**********************************************************************/
1206                 } else if (!strcasecmp(parm->var, "isup.tcrm")) {
1207                         sng_isap.tcrm = atoi(parm->val);
1208                         SS7_DEBUG("\tFound isup tcrm = \"%d\"\n",sng_isap.tcrm);
1209                 /**********************************************************************/
1210                 } else if (!strcasecmp(parm->var, "isup.tcra")) {
1211                         sng_isap.tcra = atoi(parm->val);
1212                         SS7_DEBUG("\tFound isup tcra = \"%d\"\n",sng_isap.tcra);
1213                 /**********************************************************************/
1214                 } else if (!strcasecmp(parm->var, "isup.tfgr")) {
1215                         sng_isup.tfgr = atoi(parm->val);
1216                         SS7_DEBUG("\tFound isup tfgr = \"%d\"\n",sng_isup.tfgr);
1217                 /**********************************************************************/
1218                 } else if (!strcasecmp(parm->var, "isup.trelrsp")) {
1219                         sng_isap.trelrsp = atoi(parm->val);
1220                         SS7_DEBUG("\tFound isup trelrsp = \"%d\"\n",sng_isap.trelrsp);
1221                 /**********************************************************************/
1222                 } else if (!strcasecmp(parm->var, "isup.tfnlrelrsp")) {
1223                         sng_isap.tfnlrelrsp = atoi(parm->val);
1224                         SS7_DEBUG("\tFound isup tfnlrelrsp = \"%d\"\n",sng_isap.tfnlrelrsp);
1225                 /**********************************************************************/
1226                 } else if (!strcasecmp(parm->var, "isup.tfnlrelrsp")) {
1227                         sng_isap.tfnlrelrsp = atoi(parm->val);
1228                         SS7_DEBUG("\tFound isup tfnlrelrsp = \"%d\"\n",sng_isap.tfnlrelrsp);
1229                 /**********************************************************************/
1230                 } else if (!strcasecmp(parm->var, "isup.tpause")) {
1231                         sng_isup.tpause = atoi(parm->val);
1232                         SS7_DEBUG("\tFound isup tpause = \"%d\"\n",sng_isup.tpause);
1233                 /**********************************************************************/
1234                 } else if (!strcasecmp(parm->var, "isup.tstaenq")) {
1235                         sng_isup.tstaenq = atoi(parm->val);
1236                         SS7_DEBUG("\tFound isup tstaenq = \"%d\"\n",sng_isup.tstaenq);
1237                 /**********************************************************************/
1238                 } else if (!strcasecmp(parm->var, "clg_nadi")) {
1239                 /**********************************************************************/
1240                         /* throw the flag so that we know we got this optional parameter */
1241                         flag_clg_nadi = 1;
1242                         sng_isup.clg_nadi = atoi(parm->val);
1243                         SS7_DEBUG("\tFound default CLG_NADI value = %d\n", sng_isup.clg_nadi);
1244                 /**********************************************************************/
1245                 } else if (!strcasecmp(parm->var, "cld_nadi")) {
1246                 /**********************************************************************/
1247                         /* throw the flag so that we know we got this optional parameter */
1248                         flag_cld_nadi = 1;
1249                         sng_isup.cld_nadi = atoi(parm->val);
1250                         SS7_DEBUG("\tFound default CLD_NADI value = %d\n", sng_isup.cld_nadi);
1251                 /**********************************************************************/
1252                 } else if (!strcasecmp(parm->var, "obci_bita")) {
1253                 /**********************************************************************/
1254                         if (*parm->val == '1') {
1255                                 sngss7_set_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
1256                                 SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) enable option\n");
1257                         } else if (*parm->val == '0') {
1258                                 sngss7_clear_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
1259                                 SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) disable option\n");
1260                         } else {
1261                                 SS7_DEBUG("\tInvalid value for \"obci_bita\" option\n");
1262                         }
1263                 /**********************************************************************/
1264                 } else if (!strcasecmp(parm->var, "lpa_on_cot")) {
1265                 /**********************************************************************/
1266                         if (*parm->val == '1') {
1267                                 sngss7_set_options(&sng_isup, SNGSS7_LPA_FOR_COT);
1268                                 SS7_DEBUG("\tFound Tx LPA on COT enable option\n");
1269                         } else if (*parm->val == '0') {
1270                                 sngss7_clear_options(&sng_isup, SNGSS7_LPA_FOR_COT);
1271                                 SS7_DEBUG("\tFound Tx LPA on COT disable option\n");
1272                         } else {
1273                                 SS7_DEBUG("\tInvalid value for \"lpa_on_cot\" option\n");
1274                         }
1275                 /**********************************************************************/
1276                 } else {
1277                         SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
1278                         return FTDM_FAIL;
1279 
1280                 }
1281 
1282                 /* move to the next parameter */
1283                 parm = parm + 1;
1284         }
1285 
1286         /* check if the user filled in a nadi value by looking at flag */
1287         if (!flag_cld_nadi) {
1288                 /* default the nadi value to national */
1289                 sng_isup.cld_nadi = 0x03;
1290         }
1291 
1292         if (!flag_clg_nadi) {
1293                 /* default the nadi value to national */
1294                 sng_isup.clg_nadi = 0x03;
1295         }
1296 
1297         /* trickle down the SPC to all sub entities */
1298         linkSetId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].linkSetId;
1299 
1300         i = 1;
1301         while (g_ftdm_sngss7_data.cfg.mtpLink[i].id != 0) {
1302                 if (g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkSetId == linkSetId) {
1303                         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.spc = g_ftdm_sngss7_data.cfg.spc;
1304                 }
1305 
1306                 i++;
1307         }
1308 
1309         ftmod_ss7_fill_in_isap(&sng_isap);
1310 
1311         sng_isup.isap = sng_isap.id;
1312 
1313         ftmod_ss7_fill_in_isup_interface(&sng_isup);
1314 
1315         return FTDM_SUCCESS;
1316 }
1317 
1318 /******************************************************************************/
1319 static int ftmod_ss7_fill_in_mtpLink(sng_mtp_link_t *mtpLink)
1320 {
1321         int i;
1322 
1323         /* go through all the existing links and see if we find a match */
1324         i = 1;
1325         while (g_ftdm_sngss7_data.cfg.mtpLink[i].id != 0) {
1326                 if ((g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.span == mtpLink->mtp1.span) &&
1327                         (g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.chan == mtpLink->mtp1.chan)) {
1328 
1329                         /* we have a match so break out of this loop */
1330                         break;
1331                 }
1332                 /* move on to the next one */
1333                 i++;
1334         }
1335 
1336         /* if the id value is 0 that means we didn't find the link */
1337         if (g_ftdm_sngss7_data.cfg.mtpLink[i].id  == 0) {
1338                 mtpLink->id = i;
1339                 SS7_DEBUG("found new mtpLink on span=%d, chan=%d, id = %d\n", 
1340                                         mtpLink->mtp1.span, 
1341                                         mtpLink->mtp1.chan, 
1342                                         mtpLink->id);
1343         } else {
1344                 mtpLink->id = i;
1345                 SS7_DEBUG("found existing mtpLink on span=%d, chan=%d, id = %d\n", 
1346                                         mtpLink->mtp1.span, 
1347                                         mtpLink->mtp1.chan, 
1348                                         mtpLink->id);
1349         }
1350 
1351         /* fill in the information */
1352         strcpy((char *)g_ftdm_sngss7_data.cfg.mtpLink[i].name, (char *)mtpLink->name);
1353 
1354         g_ftdm_sngss7_data.cfg.mtpLink[i].id                            = mtpLink->id;
1355 
1356         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.span             = mtpLink->mtp1.span;
1357         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp1.chan             = mtpLink->mtp1.chan;
1358 
1359         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.linkType         = mtpLink->mtp2.linkType;
1360         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.errorType        = mtpLink->mtp2.errorType;
1361         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.lssuLength       = mtpLink->mtp2.lssuLength;
1362         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.mtp1Id           = mtpLink->id;
1363 
1364         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.priority         = mtpLink->mtp3.priority;
1365         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkType         = mtpLink->mtp3.linkType;
1366         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.switchType       = mtpLink->mtp3.switchType;
1367         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.apc                      = mtpLink->mtp3.apc;
1368         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.spc                      = g_ftdm_sngss7_data.cfg.spc;
1369         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.ssf                      = mtpLink->mtp3.ssf;
1370         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.slc                      = mtpLink->mtp3.slc;
1371         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.linkSetId        = mtpLink->mtp3.linkSetId;
1372         g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.mtp2Id           = mtpLink->id;
1373 
1374         if ( mtpLink->mtp2.t1 != 0 ) {
1375                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t1               = mtpLink->mtp2.t1;
1376         }else {
1377                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t1               = 500;
1378         }
1379         if ( mtpLink->mtp2.t2 != 0 ) {
1380                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t2               = mtpLink->mtp2.t2;
1381         }else {
1382                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t2               = 250;
1383         }
1384         if ( mtpLink->mtp2.t3 != 0 ) {
1385                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t3               = mtpLink->mtp2.t3;
1386         }else {
1387                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t3               = 20;
1388         }
1389         if ( mtpLink->mtp2.t4n != 0 ) {
1390                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4n              = mtpLink->mtp2.t4n;
1391         }else {
1392                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4n              = 80;
1393         }
1394         if ( mtpLink->mtp2.t4e != 0 ) {
1395                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4e              = mtpLink->mtp2.t4e;
1396         }else {
1397                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t4e              = 5;
1398         }
1399         if ( mtpLink->mtp2.t5 != 0 ) {
1400                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t5               = mtpLink->mtp2.t5;
1401         }else {
1402                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t5               = 1;
1403         }
1404         if ( mtpLink->mtp2.t6 != 0 ) {
1405                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t6               = mtpLink->mtp2.t6;
1406         }else {
1407                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t6               = 60;
1408         }
1409         if ( mtpLink->mtp2.t7 != 0 ) {
1410                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t7               = mtpLink->mtp2.t7;
1411         }else {
1412                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp2.t7               = 40;
1413         }
1414 
1415         if (mtpLink->mtp3.t1 != 0) {
1416                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t1               = mtpLink->mtp3.t1;
1417         } else { 
1418                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t1               = 8;
1419         }
1420         if (mtpLink->mtp3.t2 != 0) {
1421                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t2               = mtpLink->mtp3.t2;
1422         } else {
1423                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t2               = 14;
1424         }
1425         if (mtpLink->mtp3.t3 != 0) {
1426                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t3               = mtpLink->mtp3.t3;
1427         } else {
1428                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t3               = 8;
1429         }
1430         if (mtpLink->mtp3.t4 != 0) {
1431                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t4               = mtpLink->mtp3.t4;
1432         } else {
1433                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t4               = 8;
1434         }
1435         if (mtpLink->mtp3.t5 != 0) {
1436                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t5               = mtpLink->mtp3.t5;
1437         } else {
1438                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t5               = 8;
1439         }
1440         if (mtpLink->mtp3.t7 != 0) {
1441                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t7               = mtpLink->mtp3.t7;
1442         } else {
1443                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t7               = 15;
1444         }
1445         if (mtpLink->mtp3.t12 != 0) {
1446                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t12              = mtpLink->mtp3.t12;
1447         } else {
1448                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t12              = 15;
1449         }
1450         if (mtpLink->mtp3.t13 != 0) {
1451                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t13              = mtpLink->mtp3.t13;
1452         } else {
1453                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t13              = 15;
1454         }
1455         if (mtpLink->mtp3.t14 != 0) {
1456                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t14              = mtpLink->mtp3.t14;
1457         } else {
1458                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t14              = 30;
1459         }
1460         if (mtpLink->mtp3.t17 != 0) {
1461                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t17              = mtpLink->mtp3.t17;
1462         } else {
1463                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t17              = 15;
1464         }
1465         if (mtpLink->mtp3.t22 != 0) {
1466                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t22              = mtpLink->mtp3.t22;
1467         } else {
1468                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t22              = 1800;
1469         }
1470         if (mtpLink->mtp3.t23 != 0) {
1471                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t23              = mtpLink->mtp3.t23;
1472         } else {
1473                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t23              = 1800;
1474         }
1475         if (mtpLink->mtp3.t24 != 0) {
1476                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t24              = mtpLink->mtp3.t24;
1477         } else {
1478                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t24              = 5;
1479         }
1480         if (mtpLink->mtp3.t31 != 0) {
1481                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t31              = mtpLink->mtp3.t31;
1482         } else {
1483                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t31              = 50;
1484         }
1485         if (mtpLink->mtp3.t32 != 0) {
1486                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t32              = mtpLink->mtp3.t32;
1487         } else {
1488                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t32              = 120;
1489         }
1490         if (mtpLink->mtp3.t33 != 0) {
1491                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t33              = mtpLink->mtp3.t33;
1492         } else {
1493                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t33              = 3000;
1494         }
1495         if (mtpLink->mtp3.t34 != 0) {
1496                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t34              = mtpLink->mtp3.t34;
1497         } else {
1498                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.t34              = 600;
1499         }
1500         if (mtpLink->mtp3.tflc != 0) {
1501                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.tflc             = mtpLink->mtp3.tflc;
1502         } else {
1503                 g_ftdm_sngss7_data.cfg.mtpLink[i].mtp3.tflc             = 300;
1504         }
1505         return (mtpLink->id);
1506 }
1507 
1508 
1509 /******************************************************************************/
1510 static int ftmod_ss7_fill_in_mtpLinkSet(sng_link_set_t *mtpLinkSet)
1511 {
1512         int     i = mtpLinkSet->id;
1513 
1514         strcpy((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[i].name, (char *)mtpLinkSet->name);
1515 
1516         g_ftdm_sngss7_data.cfg.mtpLinkSet[i].id                 = mtpLinkSet->id;
1517         g_ftdm_sngss7_data.cfg.mtpLinkSet[i].apc                = mtpLinkSet->apc;
1518         g_ftdm_sngss7_data.cfg.mtpLinkSet[i].linkType   = mtpLinkSet->linkType;
1519         g_ftdm_sngss7_data.cfg.mtpLinkSet[i].switchType = mtpLinkSet->switchType;
1520         g_ftdm_sngss7_data.cfg.mtpLinkSet[i].ssf                = mtpLinkSet->ssf;
1521 
1522         /* these values are filled in as we find routes and start allocating cmbLinkSetIds */
1523         g_ftdm_sngss7_data.cfg.mtpLinkSet[i].minActive  = mtpLinkSet->minActive;
1524         g_ftdm_sngss7_data.cfg.mtpLinkSet[i].numLinks   = 0;
1525         return 0;
1526 }
1527 
1528 /******************************************************************************/
1529 static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
1530 {
1531         int i;
1532 
1533         /* go through all the existing routes and see if we find a match */
1534         i = 1;
1535         while (g_ftdm_sngss7_data.cfg.mtpRoute[i].id != 0) {
1536                 if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpRoute[i].name, mtp3_route->name)) {
1537                         /* we have a match so break out of this loop */
1538                         break;
1539                 }
1540                 /* move on to the next one */
1541                 i++;
1542         }
1543 
1544         if (g_ftdm_sngss7_data.cfg.mtpRoute[i].id == 0) {
1545                 mtp3_route->id = i;
1546                 SS7_DEBUG("found new mtp3_route, id is = %d\n", mtp3_route->id);
1547         } else {
1548                 mtp3_route->id = i;
1549                 SS7_DEBUG("found existing mtp3_route, id is = %d\n", mtp3_route->id);
1550         }
1551 
1552         strcpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, (char *)mtp3_route->name);
1553 
1554         g_ftdm_sngss7_data.cfg.mtpRoute[i].id                   = mtp3_route->id;
1555         g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc                  = mtp3_route->dpc;
1556         g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType             = mtp3_route->linkType;
1557         g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType   = mtp3_route->switchType;
1558         g_ftdm_sngss7_data.cfg.mtpRoute[i].cmbLinkSetId = mtp3_route->cmbLinkSetId;
1559         g_ftdm_sngss7_data.cfg.mtpRoute[i].isSTP                = mtp3_route->isSTP;
1560         g_ftdm_sngss7_data.cfg.mtpRoute[i].nwId                 = mtp3_route->nwId;
1561         g_ftdm_sngss7_data.cfg.mtpRoute[i].linkSetId    = mtp3_route->linkSetId;
1562         g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf                  = mtp3_route->ssf;
1563         if (mtp3_route->t6 != 0) {
1564                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t6           = mtp3_route->t6;
1565         } else {
1566                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t6           = 8;
1567         }
1568         if (mtp3_route->t8 != 0) {
1569                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t8           = mtp3_route->t8;
1570         } else {
1571                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t8           = 12;
1572         }
1573         if (mtp3_route->t10 != 0) {
1574                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t10          = mtp3_route->t10;
1575         } else {
1576                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t10     = 300;
1577         }
1578         if (mtp3_route->t11 != 0) {
1579                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t11          = mtp3_route->t11;
1580         } else {
1581                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t11     = 300;
1582         }
1583         if (mtp3_route->t15 != 0) {
1584                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t15          = mtp3_route->t15;
1585         } else {
1586                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t15     = 30;
1587         }
1588         if (mtp3_route->t16 != 0) {
1589                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t16          = mtp3_route->t16;
1590         } else {
1591                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t16     = 20;
1592         }
1593         if (mtp3_route->t18 != 0) {
1594                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t18          = mtp3_route->t18;
1595         } else {
1596                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t18     = 200;
1597         }
1598         if (mtp3_route->t19 != 0) {
1599                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t19          = mtp3_route->t19;
1600         } else {
1601                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t19     = 690;
1602         }
1603         if (mtp3_route->t21 != 0) {
1604                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t21          = mtp3_route->t21;
1605         } else {
1606                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t21     = 650; 
1607         }
1608         if (mtp3_route->t25 != 0) {
1609                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t25          = mtp3_route->t25;
1610         } else {
1611                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t25     = 100;
1612         }
1613         if (mtp3_route->t26 != 0) {
1614                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t26          = mtp3_route->t26;
1615         } else {
1616                 g_ftdm_sngss7_data.cfg.mtpRoute[i].t26     = 100;
1617         }
1618 
1619         return 0;
1620 }
1621 
1622 /******************************************************************************/
1623 static int ftmod_ss7_fill_in_nsap(sng_route_t *mtp3_route)
1624 {
1625         int i;
1626 
1627         /* go through all the existing interfaces and see if we find a match */
1628         i = 1;
1629         while (g_ftdm_sngss7_data.cfg.nsap[i].id != 0) {
1630                 if ((g_ftdm_sngss7_data.cfg.nsap[i].linkType == mtp3_route->linkType) &&
1631                         (g_ftdm_sngss7_data.cfg.nsap[i].switchType == mtp3_route->switchType) &&
1632                         (g_ftdm_sngss7_data.cfg.nsap[i].ssf == mtp3_route->ssf)) {
1633 
1634                         /* we have a match so break out of this loop */
1635                         break;
1636                 }
1637                 /* move on to the next one */
1638                 i++;
1639         }
1640 
1641         if (g_ftdm_sngss7_data.cfg.nsap[i].id == 0) {
1642                 g_ftdm_sngss7_data.cfg.nsap[i].id = i;
1643                  mtp3_route->nwId = i;
1644                 SS7_DEBUG("found new mtp3_isup interface, id is = %d\n", g_ftdm_sngss7_data.cfg.nsap[i].id);
1645         } else {
1646                 g_ftdm_sngss7_data.cfg.nsap[i].id = i;
1647                  mtp3_route->nwId = i;
1648                 SS7_DEBUG("found existing mtp3_isup interface, id is = %d\n", g_ftdm_sngss7_data.cfg.nsap[i].id);
1649         }
1650         
1651         g_ftdm_sngss7_data.cfg.nsap[i].spId                     = g_ftdm_sngss7_data.cfg.nsap[i].id;
1652         g_ftdm_sngss7_data.cfg.nsap[i].suId                     = g_ftdm_sngss7_data.cfg.nsap[i].id;
1653         g_ftdm_sngss7_data.cfg.nsap[i].nwId                     = mtp3_route->nwId;
1654         g_ftdm_sngss7_data.cfg.nsap[i].linkType         = mtp3_route->linkType;
1655         g_ftdm_sngss7_data.cfg.nsap[i].switchType       = mtp3_route->switchType;
1656         g_ftdm_sngss7_data.cfg.nsap[i].ssf                      = mtp3_route->ssf;
1657 
1658         return 0;
1659 }
1660 
1661 /******************************************************************************/
1662 static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup)
1663 {
1664         int i;
1665 
1666         /* go through all the existing interfaces and see if we find a match */
1667         i = 1;
1668         while (g_ftdm_sngss7_data.cfg.isupIntf[i].id != 0) {
1669                 if (!strcasecmp(g_ftdm_sngss7_data.cfg.isupIntf[i].name, sng_isup->name)) {
1670 
1671                         /* we have a match so break out of this loop */
1672                         break;
1673                 }
1674                 /* move on to the next one */
1675                 i++;
1676         }
1677 
1678         if (g_ftdm_sngss7_data.cfg.isupIntf[i].id == 0) {
1679                 sng_isup->id = i;
1680                 SS7_DEBUG("found new isup interface, id is = %d\n", sng_isup->id);
1681         } else {
1682                 sng_isup->id = i;
1683                 SS7_DEBUG("found existing isup interface, id is = %d\n", sng_isup->id);
1684         }
1685 
1686         strcpy((char *)g_ftdm_sngss7_data.cfg.isupIntf[i].name, (char *)sng_isup->name);
1687 
1688         g_ftdm_sngss7_data.cfg.isupIntf[i].id                   = sng_isup->id;
1689         g_ftdm_sngss7_data.cfg.isupIntf[i].mtpRouteId   = sng_isup->mtpRouteId;
1690         g_ftdm_sngss7_data.cfg.isupIntf[i].nwId                 = sng_isup->nwId;
1691         g_ftdm_sngss7_data.cfg.isupIntf[i].dpc                  = sng_isup->dpc;
1692         g_ftdm_sngss7_data.cfg.isupIntf[i].spc                  = sng_isup->spc;
1693         g_ftdm_sngss7_data.cfg.isupIntf[i].switchType   = sng_isup->switchType;
1694         g_ftdm_sngss7_data.cfg.isupIntf[i].ssf                  = sng_isup->ssf;
1695         g_ftdm_sngss7_data.cfg.isupIntf[i].isap                 = sng_isup->isap;
1696         g_ftdm_sngss7_data.cfg.isupIntf[i].cld_nadi             = sng_isup->cld_nadi;
1697         g_ftdm_sngss7_data.cfg.isupIntf[i].clg_nadi             = sng_isup->clg_nadi;
1698         g_ftdm_sngss7_data.cfg.isupIntf[i].options              = sng_isup->options;
1699         if (sng_isup->t4 != 0) {
1700                 g_ftdm_sngss7_data.cfg.isupIntf[i].t4           = sng_isup->t4;
1701         } else {
1702                 g_ftdm_sngss7_data.cfg.isupIntf[i].t4           = 3000;
1703         }
1704         if (sng_isup->t10 != 0) {
1705                 g_ftdm_sngss7_data.cfg.isupIntf[i].t10          = sng_isup->t10;
1706         } else {
1707                 g_ftdm_sngss7_data.cfg.isupIntf[i].t10          = 50;
1708         }
1709         if (sng_isup->t11 != 0) {
1710                 g_ftdm_sngss7_data.cfg.isupIntf[i].t11          = sng_isup->t11;
1711         } else {
1712                 g_ftdm_sngss7_data.cfg.isupIntf[i].t11          = 170;
1713         }
1714         if (sng_isup->t18 != 0) {
1715                 g_ftdm_sngss7_data.cfg.isupIntf[i].t18          = sng_isup->t18;
1716         } else {
1717                 g_ftdm_sngss7_data.cfg.isupIntf[i].t18          = 300;
1718         }
1719         if (sng_isup->t19 != 0) {
1720                 g_ftdm_sngss7_data.cfg.isupIntf[i].t19          = sng_isup->t19;
1721         } else {
1722                 g_ftdm_sngss7_data.cfg.isupIntf[i].t19          = 3000;
1723         }
1724         if (sng_isup->t20 != 0) {
1725                 g_ftdm_sngss7_data.cfg.isupIntf[i].t20          = sng_isup->t20;
1726         } else {
1727                 g_ftdm_sngss7_data.cfg.isupIntf[i].t20          = 300;
1728         }
1729         if (sng_isup->t21 != 0) {
1730                 g_ftdm_sngss7_data.cfg.isupIntf[i].t21          = sng_isup->t21;
1731         } else {
1732                 g_ftdm_sngss7_data.cfg.isupIntf[i].t21          = 3000;
1733         }
1734         if (sng_isup->t22 != 0) {
1735                 g_ftdm_sngss7_data.cfg.isupIntf[i].t22          = sng_isup->t22;
1736         } else {
1737                 g_ftdm_sngss7_data.cfg.isupIntf[i].t22          = 300;
1738         }
1739         if (sng_isup->t23 != 0) {
1740                 g_ftdm_sngss7_data.cfg.isupIntf[i].t23          = sng_isup->t23;
1741         } else {
1742                 g_ftdm_sngss7_data.cfg.isupIntf[i].t23          = 3000;
1743         }
1744         if (sng_isup->t24 != 0) {
1745                 g_ftdm_sngss7_data.cfg.isupIntf[i].t24          = sng_isup->t24;
1746         } else {
1747                 g_ftdm_sngss7_data.cfg.isupIntf[i].t24          = 10;
1748         }
1749         if (sng_isup->t25 != 0) {
1750                 g_ftdm_sngss7_data.cfg.isupIntf[i].t25          = sng_isup->t25;
1751         } else {
1752                 g_ftdm_sngss7_data.cfg.isupIntf[i].t25          = 20;
1753         }
1754         if (sng_isup->t26 != 0) {
1755                 g_ftdm_sngss7_data.cfg.isupIntf[i].t26          = sng_isup->t26;
1756         } else {
1757                 g_ftdm_sngss7_data.cfg.isupIntf[i].t26          = 600;
1758         }
1759         if (sng_isup->t28 != 0) {
1760                 g_ftdm_sngss7_data.cfg.isupIntf[i].t28          = sng_isup->t28;
1761         } else {
1762                 g_ftdm_sngss7_data.cfg.isupIntf[i].t28          = 100;
1763         }
1764         if (sng_isup->t29 != 0) {
1765                 g_ftdm_sngss7_data.cfg.isupIntf[i].t29          = sng_isup->t29;
1766         } else {
1767                 g_ftdm_sngss7_data.cfg.isupIntf[i].t29          = 6;
1768         }
1769         if (sng_isup->t30 != 0) {
1770                 g_ftdm_sngss7_data.cfg.isupIntf[i].t30          = sng_isup->t30;
1771         } else {
1772                 g_ftdm_sngss7_data.cfg.isupIntf[i].t30          = 50;
1773         }
1774         if (sng_isup->t32 != 0) {
1775                 g_ftdm_sngss7_data.cfg.isupIntf[i].t32          = sng_isup->t32;
1776         } else {
1777                 g_ftdm_sngss7_data.cfg.isupIntf[i].t32          = 30;
1778         }
1779         if (sng_isup->t35 != 0) {
1780                 g_ftdm_sngss7_data.cfg.isupIntf[i].t35          = sng_isup->t35;
1781         } else {
1782                 g_ftdm_sngss7_data.cfg.isupIntf[i].t35          = 170;
1783         }
1784         if (sng_isup->t37 != 0) {
1785                 g_ftdm_sngss7_data.cfg.isupIntf[i].t37          = sng_isup->t37;
1786         } else {
1787                 g_ftdm_sngss7_data.cfg.isupIntf[i].t37          = 20;
1788         }
1789         if (sng_isup->t38 != 0) {
1790                 g_ftdm_sngss7_data.cfg.isupIntf[i].t38          = sng_isup->t38;
1791         } else {
1792                 g_ftdm_sngss7_data.cfg.isupIntf[i].t38          = 1200;
1793         }
1794         if (sng_isup->t39 != 0) {
1795                 g_ftdm_sngss7_data.cfg.isupIntf[i].t39          = sng_isup->t39;
1796         } else {
1797                 g_ftdm_sngss7_data.cfg.isupIntf[i].t39          = 300;
1798         }
1799         if (sng_isup->tfgr != 0) {
1800                 g_ftdm_sngss7_data.cfg.isupIntf[i].tfgr         = sng_isup->tfgr;
1801         } else {
1802                 g_ftdm_sngss7_data.cfg.isupIntf[i].tfgr         = 50;
1803         }
1804         if (sng_isup->tpause != 0) {
1805                 g_ftdm_sngss7_data.cfg.isupIntf[i].tpause       = sng_isup->tpause;
1806         } else {
1807                 g_ftdm_sngss7_data.cfg.isupIntf[i].tpause       = 150;
1808         }
1809         if (sng_isup->tstaenq != 0) {
1810                 g_ftdm_sngss7_data.cfg.isupIntf[i].tstaenq      = sng_isup->tstaenq;
1811         } else {
1812                 g_ftdm_sngss7_data.cfg.isupIntf[i].tstaenq      = 5000;
1813         }
1814 
1815         return 0;
1816 }
1817 
1818 /******************************************************************************/
1819 static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap)
1820 {
1821         int i;
1822 
1823         /* go through all the existing interfaces and see if we find a match */
1824         i = 1;
1825         while (g_ftdm_sngss7_data.cfg.isap[i].id != 0) {
1826                 if (g_ftdm_sngss7_data.cfg.isap[i].switchType == sng_isap->switchType) {
1827 
1828                         /* we have a match so break out of this loop */
1829                         break;
1830                 }
1831                 /* move on to the next one */
1832                 i++;
1833         }
1834 
1835         if (g_ftdm_sngss7_data.cfg.isap[i].id == 0) {
1836                 sng_isap->id = i;
1837                 SS7_DEBUG("found new isup to cc interface, id is = %d\n", g_ftdm_sngss7_data.cfg.isap[i].id);
1838         } else {
1839                 sng_isap->id = i;
1840                 SS7_DEBUG("found existing isup to cc interface, id is = %d\n", g_ftdm_sngss7_data.cfg.isap[i].id);
1841         }
1842 
1843         g_ftdm_sngss7_data.cfg.isap[i].id                       = sng_isap->id;
1844         g_ftdm_sngss7_data.cfg.isap[i].suId                     = sng_isap->id;
1845         g_ftdm_sngss7_data.cfg.isap[i].spId                     = sng_isap->id;
1846         g_ftdm_sngss7_data.cfg.isap[i].switchType       = sng_isap->switchType;
1847         g_ftdm_sngss7_data.cfg.isap[i].ssf                      = sng_isap->ssf;
1848 
1849         if (sng_isap->t1 != 0) {
1850                 g_ftdm_sngss7_data.cfg.isap[i].t1               = sng_isap->t1;
1851         } else {
1852                 g_ftdm_sngss7_data.cfg.isap[i].t1               = 200;
1853         }
1854         if (sng_isap->t2 != 0) {
1855                 g_ftdm_sngss7_data.cfg.isap[i].t2               = sng_isap->t2;
1856         } else {
1857                 g_ftdm_sngss7_data.cfg.isap[i].t2               = 1800;
1858         }
1859         if (sng_isap->t5 != 0) {
1860                 g_ftdm_sngss7_data.cfg.isap[i].t5               = sng_isap->t5;
1861         } else {
1862                 g_ftdm_sngss7_data.cfg.isap[i].t5               = 3000;
1863         }
1864         if (sng_isap->t6 != 0) {
1865                 g_ftdm_sngss7_data.cfg.isap[i].t6               = sng_isap->t6;
1866         } else {
1867                 g_ftdm_sngss7_data.cfg.isap[i].t6               = 200;
1868         }
1869         if (sng_isap->t7 != 0) {
1870                 g_ftdm_sngss7_data.cfg.isap[i].t7               = sng_isap->t7;
1871         } else {
1872                 g_ftdm_sngss7_data.cfg.isap[i].t7               = 250;
1873         }
1874         if (sng_isap->t8 != 0) {
1875                 g_ftdm_sngss7_data.cfg.isap[i].t8               = sng_isap->t8;
1876         } else {
1877                 g_ftdm_sngss7_data.cfg.isap[i].t8               = 120;
1878         }
1879         if (sng_isap->t9 != 0) {
1880                 g_ftdm_sngss7_data.cfg.isap[i].t9               = sng_isap->t9;
1881         } else {
1882                 g_ftdm_sngss7_data.cfg.isap[i].t9               = 1800;
1883         }
1884         if (sng_isap->t27 != 0) {
1885                 g_ftdm_sngss7_data.cfg.isap[i].t27              = sng_isap->t27;
1886         } else {
1887                 g_ftdm_sngss7_data.cfg.isap[i].t27              = 2400;
1888         }
1889         if (sng_isap->t31 != 0) {
1890                 g_ftdm_sngss7_data.cfg.isap[i].t31              = sng_isap->t31;
1891         } else {
1892                 g_ftdm_sngss7_data.cfg.isap[i].t31              = 3650;
1893         }
1894         if (sng_isap->t33 != 0) {
1895                 g_ftdm_sngss7_data.cfg.isap[i].t33              = sng_isap->t33;
1896         } else {
1897                 g_ftdm_sngss7_data.cfg.isap[i].t33              = 120;
1898         }
1899         if (sng_isap->t34 != 0) {
1900                 g_ftdm_sngss7_data.cfg.isap[i].t34              = sng_isap->t34;
1901         } else {
1902                 g_ftdm_sngss7_data.cfg.isap[i].t34              = 40;
1903         }
1904         if (sng_isap->t36 != 0) {
1905                 g_ftdm_sngss7_data.cfg.isap[i].t36              = sng_isap->t36;
1906         } else {
1907                 g_ftdm_sngss7_data.cfg.isap[i].t36              = 120;
1908         }
1909         if (sng_isap->tccr != 0) {
1910                 g_ftdm_sngss7_data.cfg.isap[i].tccr             = sng_isap->tccr;
1911         } else {
1912                 g_ftdm_sngss7_data.cfg.isap[i].tccr             = 200;
1913         }
1914         if (sng_isap->tccrt != 0) {
1915                 g_ftdm_sngss7_data.cfg.isap[i].tccrt    = sng_isap->tccrt;
1916         } else {
1917                 g_ftdm_sngss7_data.cfg.isap[i].tccrt    = 20;
1918         }
1919         if (sng_isap->tex != 0) {
1920                 g_ftdm_sngss7_data.cfg.isap[i].tex              = sng_isap->tex;
1921         } else {
1922                 g_ftdm_sngss7_data.cfg.isap[i].tex              = 1000;
1923         }
1924         if (sng_isap->tcrm != 0) {
1925                 g_ftdm_sngss7_data.cfg.isap[i].tcrm             = sng_isap->tcrm;
1926         } else {
1927                 g_ftdm_sngss7_data.cfg.isap[i].tcrm             = 30;
1928         }
1929         if (sng_isap->tcra != 0) {
1930                 g_ftdm_sngss7_data.cfg.isap[i].tcra             = sng_isap->tcra;
1931         } else {
1932                 g_ftdm_sngss7_data.cfg.isap[i].tcra             = 100;
1933         }
1934         if (sng_isap->tect != 0) {
1935                 g_ftdm_sngss7_data.cfg.isap[i].tect             = sng_isap->tect;
1936         } else {
1937                 g_ftdm_sngss7_data.cfg.isap[i].tect             = 10;
1938         }
1939         if (sng_isap->trelrsp != 0) {
1940                 g_ftdm_sngss7_data.cfg.isap[i].trelrsp  = sng_isap->trelrsp;
1941         } else {
1942                 g_ftdm_sngss7_data.cfg.isap[i].trelrsp  = 10;
1943         }
1944         if (sng_isap->tfnlrelrsp != 0) {
1945                 g_ftdm_sngss7_data.cfg.isap[i].tfnlrelrsp       = sng_isap->tfnlrelrsp;
1946         } else {
1947                 g_ftdm_sngss7_data.cfg.isap[i].tfnlrelrsp       = 10;
1948         }
1949 
1950         return 0;
1951 }
1952 
1953 /******************************************************************************/
1954 static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
1955 {
1956 
1957         if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == 0){
1958                 SS7_DEBUG("found new mtp3 self route\n");
1959         } else if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == spc) {
1960                 SS7_DEBUG("found existing mtp3 self route\n");
1961                 return FTDM_SUCCESS;
1962         } else {
1963                 SS7_ERROR("found new mtp3 self route but it does not match the route already configured (dpc=%d:spc=%d)\n",
1964                                         g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc,
1965                                         spc);
1966                 return FTDM_FAIL;
1967         }
1968 
1969         strcpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-route");
1970 
1971         g_ftdm_sngss7_data.cfg.mtpRoute[0].id                   = 0;
1972         g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc                  = spc;
1973         g_ftdm_sngss7_data.cfg.mtpRoute[0].linkType             = linkType;
1974         g_ftdm_sngss7_data.cfg.mtpRoute[0].switchType   = switchType;
1975         g_ftdm_sngss7_data.cfg.mtpRoute[0].cmbLinkSetId = 0;
1976         g_ftdm_sngss7_data.cfg.mtpRoute[0].isSTP                = 0;
1977         g_ftdm_sngss7_data.cfg.mtpRoute[0].ssf                  = ssf;
1978         g_ftdm_sngss7_data.cfg.mtpRoute[0].t6                   = 8;
1979         g_ftdm_sngss7_data.cfg.mtpRoute[0].t8                   = 12;
1980         g_ftdm_sngss7_data.cfg.mtpRoute[0].t10                  = 300;
1981         g_ftdm_sngss7_data.cfg.mtpRoute[0].t11                  = 300;
1982         g_ftdm_sngss7_data.cfg.mtpRoute[0].t15                  = 30;
1983         g_ftdm_sngss7_data.cfg.mtpRoute[0].t16                  = 20;
1984         g_ftdm_sngss7_data.cfg.mtpRoute[0].t18                  = 200;
1985         g_ftdm_sngss7_data.cfg.mtpRoute[0].t19                  = 690;
1986         g_ftdm_sngss7_data.cfg.mtpRoute[0].t21                  = 650; 
1987         g_ftdm_sngss7_data.cfg.mtpRoute[0].t25                  = 100;
1988 
1989         return 0;
1990 }
1991 
1992 /******************************************************************************/
1993 static int ftmod_ss7_fill_in_circuits(sng_isupCkt_t *isupCkt)
1994 {
1995         sngss7_chan_data_t      *ss7_info = NULL;
1996         ftdm_channel_t          *ftdmchan = NULL;
1997         sng_timeslot_t          timeslot;
1998         int                                     count;
1999         int                                     i;
2000         int                                     x;
2001 
2002         count = 1;
2003 
2004         while (isupCkt->ch_map[0] != '\0') {
2005 
2006                  /* pull out the next timeslot */
2007                 if (ftmod_ss7_next_timeslot(isupCkt->ch_map, &timeslot)) {
2008                         SS7_ERROR("Failed to parse the channel map!\n");
2009                         return FTDM_FAIL;
2010                 }
2011 
2012                 if ((timeslot.siglink) || (timeslot.gap)) {
2013                         /* try to find the channel in the circuits structure*/
2014                         x = 1;
2015                         while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
2016                                 if ((g_ftdm_sngss7_data.cfg.isupCkt[x].chan == count) &&
2017                                         (g_ftdm_sngss7_data.cfg.isupCkt[x].span == isupCkt->span->channels[1]->physical_span_id)) {
2018 
2019                                         SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is already exists...id=%d\n",
2020                                                                 isupCkt->span->channels[1]->physical_span_id,
2021                                                                 count,
2022                                                                 x);
2023 
2024                                         /* we have a match so this circuit already exists in the structure */
2025                                         break;
2026                                 }
2027                                 /* move to the next circuit */
2028                                 x++;
2029                         } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
2030 
2031                         /* check why we exited the while loop */
2032                         if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) {
2033                                 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2034                                 isupCkt->span->channels[1]->physical_span_id,
2035                                 count,
2036                                 x);
2037 
2038                                 /* prepare the global info sturcture */
2039                                 ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
2040                                 ss7_info->ftdmchan = NULL;
2041                                 ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x];
2042 
2043                                 /* circuit is new so fill in the needed information */
2044                                 g_ftdm_sngss7_data.cfg.isupCkt[x].id                    = x;
2045                                 g_ftdm_sngss7_data.cfg.isupCkt[x].span                  = isupCkt->span->channels[1]->physical_span_id;
2046                                 g_ftdm_sngss7_data.cfg.isupCkt[x].chan                  = count;
2047                                 if (timeslot.siglink) {
2048                                         g_ftdm_sngss7_data.cfg.isupCkt[x].type          = SIG;
2049                                 } else {
2050                                         g_ftdm_sngss7_data.cfg.isupCkt[x].type          = HOLE;
2051                                 }
2052 
2053                                 if (timeslot.channel) {
2054                                         g_ftdm_sngss7_data.cfg.isupCkt[x].cic           = isupCkt->cicbase;
2055                                         isupCkt->cicbase++;
2056                                 } else {
2057                                         g_ftdm_sngss7_data.cfg.isupCkt[x].cic           = 0;
2058                                 }
2059                                 g_ftdm_sngss7_data.cfg.isupCkt[x].infId                 = isupCkt->isupInf;
2060                                 g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl     = isupCkt->typeCntrl;
2061                                 g_ftdm_sngss7_data.cfg.isupCkt[x].ssf                   = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].ssf;
2062                                 g_ftdm_sngss7_data.cfg.isupCkt[x].obj                   = ss7_info;
2063 
2064                         } /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) */
2065 
2066                         /* increment the span channel count */
2067                         count++;
2068 
2069                 } else { /* if ((timeslot.siglink) || (timeslot.gap)) */
2070                         /* find the ftdm the channel structure for this channel*/
2071                         i = 1;
2072                         while (isupCkt->span->channels[i] != NULL) {
2073                                 if (isupCkt->span->channels[i]->physical_chan_id == timeslot.channel) {
2074                                         break;
2075                                 }
2076                                 i++;
2077                         } /* while (span->channels[i] != NULL) */
2078 
2079                         if (isupCkt->span->channels[i] == NULL) {
2080                                 /* we weren't able to find the channel in the ftdm channels */
2081                                 SS7_ERROR("Unable to find the requested channel %d in the FreeTDM channels!\n", timeslot.channel);
2082                                 return FTDM_FAIL;
2083                         } else {
2084                                 ftdmchan = isupCkt->span->channels[i];
2085                         }
2086 
2087                         /* try to find a match for the physical span and chan */
2088                         x = 1;
2089                         while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
2090                                 if ((g_ftdm_sngss7_data.cfg.isupCkt[x].chan == ftdmchan->physical_chan_id) && 
2091                                         (g_ftdm_sngss7_data.cfg.isupCkt[x].span == ftdmchan->physical_span_id)) {
2092 
2093                                         /* we have a match so this circuit already exists in the structure */
2094                                         break;
2095                                 }
2096                                 /* move to the next circuit */
2097                                 x++;
2098                         } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
2099 
2100                         /* check why we exited the while loop */
2101                         if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) {
2102                                 SS7_DEVEL_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2103                                 ftdmchan->physical_span_id,
2104                                 ftdmchan->physical_chan_id,
2105                                 x);
2106 
2107                                 /* prepare the global info sturcture */
2108                                 ss7_info = ftdm_calloc(1, sizeof(sngss7_chan_data_t));
2109                                 ss7_info->ftdmchan = ftdmchan;
2110                                 ss7_info->circuit = &g_ftdm_sngss7_data.cfg.isupCkt[x];
2111                                 ftdmchan->call_data = ss7_info;
2112 
2113                                 /* prepare the timer structures */
2114                                 ss7_info->t35.sched                     = ((sngss7_span_data_t *)isupCkt->span->mod_data)->sched;
2115                                 ss7_info->t35.counter           = 1;
2116                                 ss7_info->t35.beat                      = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].t35*100; /* beat is in ms, t35 is in 100ms */
2117                                 ss7_info->t35.callback          = handle_isup_t35;
2118                                 ss7_info->t35.sngss7_info       = ss7_info;
2119 
2120                                 /* circuit is new so fill in the needed information */
2121                                 g_ftdm_sngss7_data.cfg.isupCkt[x].id            = x;
2122                                 g_ftdm_sngss7_data.cfg.isupCkt[x].span          = ftdmchan->physical_span_id;
2123                                 g_ftdm_sngss7_data.cfg.isupCkt[x].chan          = ftdmchan->physical_chan_id;
2124                                 g_ftdm_sngss7_data.cfg.isupCkt[x].type          = VOICE;
2125                                 g_ftdm_sngss7_data.cfg.isupCkt[x].cic           = isupCkt->cicbase;
2126                                 g_ftdm_sngss7_data.cfg.isupCkt[x].infId         = isupCkt->isupInf;
2127                                 g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl     = isupCkt->typeCntrl;
2128                                 if (isupCkt->t3 == 0) {
2129                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t3    = 1200;
2130                                 } else {
2131                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t3    = isupCkt->t3;
2132                                 }
2133                                 if (isupCkt->t12 == 0) {
2134                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t12   = 300;
2135                                 } else {
2136                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t12   = isupCkt->t12;
2137                                 }
2138                                 if (isupCkt->t13 == 0) {
2139                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t13   = 3000;
2140                                 } else {
2141                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t13   = isupCkt->t13;
2142                                 }
2143                                 if (isupCkt->t14 == 0) {
2144                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t14   = 300;
2145                                 } else {
2146                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t14   = isupCkt->t14;
2147                                 }
2148                                 if (isupCkt->t15 == 0) {
2149                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t15   = 3000;
2150                                 } else {
2151                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t15   = isupCkt->t15;
2152                                 }
2153                                 if (isupCkt->t16 == 0) {
2154                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t16   = 300;
2155                                 } else {
2156                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t16   = isupCkt->t16;
2157                                 }
2158                                 if (isupCkt->t17 == 0) {
2159                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t17   = 3000;
2160                                 } else {
2161                                         g_ftdm_sngss7_data.cfg.isupCkt[x].t17   = isupCkt->t17;
2162                                 }
2163                                 if (isupCkt->tval == 0) {
2164                                         g_ftdm_sngss7_data.cfg.isupCkt[x].tval  = 10;
2165                                 } else {
2166                                         g_ftdm_sngss7_data.cfg.isupCkt[x].tval  = isupCkt->tval;
2167                                 }
2168                                 g_ftdm_sngss7_data.cfg.isupCkt[x].obj           = ss7_info;
2169                                 g_ftdm_sngss7_data.cfg.isupCkt[x].ssf           = g_ftdm_sngss7_data.cfg.isupIntf[isupCkt->isupInf].ssf;
2170 
2171                                 /* increment the cicbase */
2172                                 isupCkt->cicbase++;
2173                         } else { /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) */
2174                                 SS7_DEBUG("Circuit for span=%d, chan=%d is new...id=%d\n",
2175                                                                         ftdmchan->physical_span_id,
2176                                                                         ftdmchan->physical_chan_id,
2177                                                                         x);
2178 
2179                                 /* for now make sure ss7_info is set to null */
2180                                 ss7_info = NULL;
2181 
2182                                 /* KONRAD FIX ME -> confirm that it is the same circuit */
2183                         }  /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) */
2184 
2185                         /* increment the span channel count */
2186                         count++;
2187                 } /* if ((timeslot.siglink) || (timeslot.gap)) */
2188 
2189                 if (ss7_info == NULL) {
2190                         SS7_ERROR("KONRAD -> circuit was not configured !\n");
2191                         return FTDM_FAIL;
2192                 }
2193 
2194                 if (ss7_info->ftdmchan == NULL) {
2195                         SS7_INFO("Added span = %d, chan = %d, cic = %d, FTDM chan = %d, ISUP cirId = %d\n",
2196                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].span,
2197                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].chan,
2198                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].cic,
2199                                                 0,
2200                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].id);
2201                 } else {
2202                         SS7_INFO("Added span = %d, chan = %d, cic = %d, FTDM chan = %d, ISUP cirId = %d\n",
2203                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].span,
2204                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].chan,
2205                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].cic,
2206                                                 ss7_info->ftdmchan->chan_id,
2207                                                 g_ftdm_sngss7_data.cfg.isupCkt[x].id);
2208                 }
2209 
2210         } /* while (ch_map[0] != '\0') */
2211 
2212         return 0;
2213 }
2214 
2215 /******************************************************************************/
2216 static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot)
2217 {
2218         int                     i;
2219         int                     x;
2220         int                     lower;
2221         int                     upper;
2222         char            tmp[5]; /*KONRAD FIX ME*/
2223         char            new_ch_map[MAX_CIC_LENGTH];
2224 
2225         memset(&tmp[0], '\0', sizeof(tmp));
2226         memset(&new_ch_map[0], '\0', sizeof(new_ch_map));
2227         memset(timeslot, 0x0, sizeof(sng_timeslot_t));
2228 
2229         SS7_DEVEL_DEBUG("Old channel map = \"%s\"\n", ch_map);
2230 
2231         /* start at the beginning of the ch_map */
2232         x = 0;
2233 
2234         switch (ch_map[x]) {
2235         /**************************************************************************/
2236         case 'S':
2237         case 's':   /* we have a sig link */
2238                 timeslot->siglink = 1;
2239 
2240                 /* check what comes next either a comma or a number */
2241                 x++;
2242                 if (ch_map[x] == ',') {
2243                         timeslot->hole = 1;
2244                         SS7_DEVEL_DEBUG(" Found a siglink in the channel map with a hole in the cic map\n");
2245                 } else if (isdigit(ch_map[x])) {
2246                         /* consume all digits until a comma as this is the channel */
2247                         SS7_DEVEL_DEBUG(" Found a siglink in the channel map with out a hole in the cic map\n");
2248                 } else {
2249                         SS7_ERROR("Found an illegal channel map character after signal link flag = \"%c\"!\n", ch_map[x]);
2250                         return FTDM_FAIL;
2251                 }
2252                 break;
2253         /**************************************************************************/
2254         case 'G':
2255         case 'g':   /* we have a channel gap */
2256                 timeslot->gap = 1;
2257 
2258                 /* check what comes next either a comma or a number */
2259                 x++;
2260                 if (ch_map[x] == ',') {
2261                         timeslot->hole = 1;
2262                         SS7_DEVEL_DEBUG(" Found a gap in the channel map with a hole in the cic map\n");
2263                 } else if (isdigit(ch_map[x])) {
2264                         SS7_DEVEL_DEBUG(" Found a gap in the channel map with out a hole in the cic map\n");
2265                         /* consume all digits until a comma as this is the channel */
2266                 } else {
2267                         SS7_ERROR("Found an illegal channel map character after signal link flag = \"%c\"!\n", ch_map[x]);
2268                         return FTDM_FAIL;
2269                 }
2270                 break;
2271         /**************************************************************************/
2272         case '1':
2273         case '2':
2274         case '3':
2275         case '4':
2276         case '5':
2277         case '6':
2278         case '7':
2279         case '8':
2280         case '9':   /* we have a channel */
2281                 /* consume all digits until a comma or a dash */
2282                 SS7_DEVEL_DEBUG("Found a starting channel in the channel map\n");
2283                 break;
2284         /**************************************************************************/
2285         default:
2286                 SS7_ERROR("Found an illegal channel map character = \"%c\"!\n", ch_map[x]);
2287                 return FTDM_FAIL;
2288         /**************************************************************************/
2289         } /* switch (ch_map[x]) */
2290 
2291         /* grab the first number in the string */
2292         i = 0;
2293         while ((ch_map[x] != '\0') && (ch_map[x] != '-') && (ch_map[x] != ',')) {
2294                 tmp[i] = ch_map[x];
2295                 i++;
2296                 x++;
2297         }
2298         tmp[i] = '\0';
2299         timeslot->channel = atoi(tmp);
2300         lower = timeslot->channel + 1;
2301 
2302         /* check the next value in the list */
2303         if (ch_map[x] == '-') {
2304                 /* consume the number after the dash */
2305                 x++;
2306                 i = 0;
2307                 while ((ch_map[x] != '\0') && (ch_map[x] != '-') && (ch_map[x] != ',')) {
2308                         tmp[i] = ch_map[x];
2309                         i++;
2310                         x++;
2311                 }
2312                 tmp[i] = '\0';
2313                 upper = atoi(tmp);
2314 
2315                 /* check if the upper end of the range is the same as the lower end of the range */
2316                 if (upper == lower) {
2317                         /* the range is completed, eat the next comma or \0  and write it */
2318                         sprintf(new_ch_map, "%d", lower);
2319                 } else if ( upper > lower) {
2320                         /* the list continues, add 1 from the channel map value and re-insert it to the list */
2321                         sprintf(new_ch_map, "%d-%d", lower, upper);
2322                 } else {
2323                         SS7_ERROR("The upper is less then the lower end of the range...should not happen!\n");
2324                         return FTDM_FAIL;
2325                 }
2326 
2327                 /* the the rest of ch_map to new_ch_map */
2328                 strncat(new_ch_map, &ch_map[x], strlen(&ch_map[x]));
2329 
2330                 /* set the new cic map to ch_map*/
2331                 strcpy(ch_map, new_ch_map);
2332 
2333         } else if (ch_map[x] == ',') {
2334                 /* move past the comma */
2335                 x++;
2336 
2337                 /* copy the rest of the list to new_ch_map */
2338                 strcpy(new_ch_map, &ch_map[x]);
2339 
2340                 /* copy the new_ch_map over the old one */
2341                 strcpy(ch_map, new_ch_map);
2342 
2343         } else if (ch_map[x] == '\0') {
2344                 /* we're at the end of the string...copy the rest of the list to new_ch_map */
2345                 strcpy(new_ch_map, &ch_map[x]);
2346 
2347                 /* set the new cic map to ch_map*/
2348                 strcpy(ch_map, new_ch_map);
2349         } else { 
2350                 /* nothing to do */
2351         }
2352 
2353         SS7_DEVEL_DEBUG("New channel map = \"%s\"\n", ch_map);
2354 
2355         return FTDM_SUCCESS;
2356 }
2357 
2358 /******************************************************************************/
2359 
2360 /******************************************************************************/
2361 /* For Emacs:
2362  * Local Variables:
2363  * mode:c
2364  * indent-tabs-mode:t
2365  * tab-width:4
2366  * c-basic-offset:4
2367  * End:
2368  * For VIM:
2369  * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
2370  */
2371 /******************************************************************************/

/* [<][>][^][v][top][bottom][index][help] */