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

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