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

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