root/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c

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

DEFINITIONS

This source file includes following definitions.
  1. sngisdn_stack_cfg
  2. sngisdn_stack_cfg_phy_gen
  3. sngisdn_stack_cfg_phy_psap
  4. sngisdn_stack_cfg_q921_gen
  5. sngisdn_stack_cfg_q921_msap
  6. sngisdn_stack_cfg_q921_dlsap
  7. sngisdn_stack_cfg_q931_gen
  8. sngisdn_stack_cfg_q931_tsap
  9. sngisdn_stack_cfg_q931_dlsap
  10. sngisdn_stack_cfg_q931_lce
  11. sngisdn_stack_cfg_cc_gen
  12. sngisdn_stack_cfg_cc_sap
  13. stack_pst_init
  14. stack_hdr_init
  15. sng_isdn_stack_switchtype

   1 /*
   2  * Copyright (c) 2010, Sangoma Technologies 
   3  * David Yat Sin <davidy@sangoma.com>
   4  * All rights reserved.
   5  *
   6  * Redistribution and use in source and binary forms, with or without
   7  * modification, are permitted provided that the following conditions
   8  * are met:
   9  *
  10  * * Redistributions of source code must retain the above copyright
  11  * notice, this list of conditions and the following disclaimer.
  12  *
  13  * * Redistributions in binary form must reproduce the above copyright
  14  * notice, this list of conditions and the following disclaimer in the
  15  * documentation and/or other materials provided with the distribution.
  16  *
  17  * * Neither the name of the original author; nor the names of any contributors
  18  * may be used to endorse or promote products derived from this software
  19  * without specific prior written permission.
  20  *
  21  *
  22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  25  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
  26  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  27  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  28  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  29  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  31  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33  */
  34 
  35 #include "ftmod_sangoma_isdn.h"
  36 
  37 extern ftdm_sngisdn_data_t      g_sngisdn_data;
  38 
  39 uint8_t sng_isdn_stack_switchtype(sngisdn_switchtype_t switchtype);
  40 
  41 ftdm_status_t sngisdn_cfg_phy(ftdm_span_t *span);
  42 ftdm_status_t sngisdn_cfg_q921(ftdm_span_t *span);
  43 ftdm_status_t sngisdn_cfg_q931(ftdm_span_t *span);
  44 ftdm_status_t sngisdn_cfg_cc(ftdm_span_t *span);
  45 
  46 ftdm_status_t sngisdn_stack_cfg_phy_gen(void);
  47 ftdm_status_t sngisdn_stack_cfg_q921_gen(void);
  48 ftdm_status_t sngisdn_stack_cfg_q931_gen(void);
  49 ftdm_status_t sngisdn_stack_cfg_cc_gen(void);
  50 
  51 
  52 ftdm_status_t sngisdn_stack_cfg_phy_psap(ftdm_span_t *span);
  53 ftdm_status_t sngisdn_stack_cfg_q921_msap(ftdm_span_t *span);
  54 ftdm_status_t sngisdn_stack_cfg_q921_dlsap(ftdm_span_t *span, uint8_t management);
  55 ftdm_status_t sngisdn_stack_cfg_q931_tsap(ftdm_span_t *span);
  56 ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span);
  57 ftdm_status_t sngisdn_stack_cfg_q931_lce(ftdm_span_t *span);
  58 
  59 ftdm_status_t sngisdn_stack_cfg_cc_sap(ftdm_span_t *span);
  60 
  61 ftdm_status_t sngisdn_stack_cfg(ftdm_span_t *span)
  62 {
  63         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
  64 
  65         if (!g_sngisdn_data.gen_config_done) {
  66                 g_sngisdn_data.gen_config_done = 1;
  67                 ftdm_log(FTDM_LOG_DEBUG, "Starting general stack configuration\n");
  68                 if(sngisdn_stack_cfg_phy_gen()!= FTDM_SUCCESS) {
  69                         ftdm_log(FTDM_LOG_CRIT, "Failed general physical configuration\n");
  70                         return FTDM_FAIL;
  71                 }
  72                 ftdm_log(FTDM_LOG_DEBUG, "General stack physical done\n");
  73         
  74                 if(sngisdn_stack_cfg_q921_gen()!= FTDM_SUCCESS) {
  75                         ftdm_log(FTDM_LOG_CRIT, "Failed general q921 configuration\n");
  76                         return FTDM_FAIL;
  77                 }
  78                 ftdm_log(FTDM_LOG_DEBUG, "General stack q921 done\n");
  79 
  80                 if(sngisdn_stack_cfg_q931_gen()!= FTDM_SUCCESS) {
  81                         ftdm_log(FTDM_LOG_CRIT, "Failed general q921 configuration\n");
  82                         return FTDM_FAIL;
  83                 }
  84                 ftdm_log(FTDM_LOG_DEBUG, "General stack q931 done\n");
  85 
  86                 if(sngisdn_stack_cfg_cc_gen()!= FTDM_SUCCESS) {
  87                         ftdm_log(FTDM_LOG_CRIT, "Failed general CC configuration\n");
  88                         return FTDM_FAIL;
  89                 }
  90                 ftdm_log(FTDM_LOG_DEBUG, "General stack CC done\n");
  91                 ftdm_log(FTDM_LOG_INFO, "General stack configuration done\n");
  92         }
  93 
  94         /* TODO: for NFAS, should only call these function for spans with d-chans */
  95         if (sngisdn_stack_cfg_phy_psap(span) != FTDM_SUCCESS) {
  96                 ftdm_log(FTDM_LOG_ERROR, "%s:phy_psap configuration failed\n", span->name);
  97                 return FTDM_FAIL;
  98         }
  99         ftdm_log(FTDM_LOG_DEBUG, "%s:phy_psap configuration done\n", span->name);
 100 
 101         if (sngisdn_stack_cfg_q921_msap(span) != FTDM_SUCCESS) {
 102                 ftdm_log(FTDM_LOG_ERROR, "%s:q921_msap configuration failed\n", span->name);
 103                 return FTDM_FAIL;
 104         }
 105         ftdm_log(FTDM_LOG_DEBUG, "%s:q921_msap configuration done\n", span->name);
 106 
 107         if (sngisdn_stack_cfg_q921_dlsap(span, 0) != FTDM_SUCCESS) {
 108                 ftdm_log(FTDM_LOG_ERROR, "%s:q921_dlsap configuration failed\n", span->name);
 109                 return FTDM_FAIL;
 110         }
 111         ftdm_log(FTDM_LOG_DEBUG, "%s:q921_dlsap configuration done\n", span->name);
 112 
 113         if (span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
 114                 if (sngisdn_stack_cfg_q921_dlsap(span, 1) != FTDM_SUCCESS) {
 115                         ftdm_log(FTDM_LOG_ERROR, "%s:q921_dlsap management configuration failed\n", span->name);
 116                         return FTDM_FAIL;
 117                 }
 118                 ftdm_log(FTDM_LOG_DEBUG, "%s:q921_dlsap management configuration done\n", span->name);
 119         }
 120         
 121 
 122         if (sngisdn_stack_cfg_q931_dlsap(span) != FTDM_SUCCESS) {
 123                 ftdm_log(FTDM_LOG_ERROR, "%s:q931_dlsap configuration failed\n", span->name);
 124                 return FTDM_FAIL;
 125         }
 126         ftdm_log(FTDM_LOG_DEBUG, "%s:q931_dlsap configuration done\n", span->name);
 127 
 128         if (sngisdn_stack_cfg_q931_lce(span) != FTDM_SUCCESS) {
 129                 ftdm_log(FTDM_LOG_ERROR, "%s:q931_lce configuration failed\n", span->name);
 130                 return FTDM_FAIL;
 131         }
 132         ftdm_log(FTDM_LOG_DEBUG, "%s:q931_lce configuration done\n", span->name);
 133 
 134         if (!g_sngisdn_data.ccs[signal_data->cc_id].config_done) {
 135                 g_sngisdn_data.ccs[signal_data->cc_id].config_done = 1;
 136                 /* if BRI, need to configure dlsap_mgmt */
 137                 if (sngisdn_stack_cfg_q931_tsap(span) != FTDM_SUCCESS) {
 138                         ftdm_log(FTDM_LOG_ERROR, "%s:q931_tsap configuration failed\n", span->name);
 139                         return FTDM_FAIL;
 140                 }
 141                 ftdm_log(FTDM_LOG_DEBUG, "%s:q931_tsap configuration done\n", span->name);
 142 
 143                 if (sngisdn_stack_cfg_cc_sap(span) != FTDM_SUCCESS) {
 144                         ftdm_log(FTDM_LOG_ERROR, "%s:cc_sap configuration failed\n", span->name);
 145                         return FTDM_FAIL;
 146                 }
 147                 ftdm_log(FTDM_LOG_DEBUG, "%s:cc_sap configuration done\n", span->name);
 148         }
 149 
 150         ftdm_log(FTDM_LOG_INFO, "%s:stack configuration done\n", span->name);
 151         return FTDM_SUCCESS;
 152 }
 153 
 154 
 155 
 156 ftdm_status_t sngisdn_stack_cfg_phy_gen(void)
 157 {
 158         /*local variables*/
 159         L1Mngmt     cfg;    /*configuration structure*/
 160         Pst         pst;    /*post structure*/
 161 
 162         /* initalize the post structure */
 163         stack_pst_init(&pst);
 164 
 165         /* insert the destination Entity */
 166         pst.dstEnt = ENTL1;
 167 
 168         /*clear the configuration structure*/
 169         memset(&cfg, 0, sizeof(cfg));
 170 
 171         /*fill in some general sections of the header*/
 172         stack_hdr_init(&cfg.hdr);
 173 
 174         /*fill in the specific fields of the header*/
 175         cfg.hdr.msgType     = TCFG;
 176         cfg.hdr.entId.ent   = ENTL1;
 177         cfg.hdr.entId.inst  = S_INST;
 178         cfg.hdr.elmId.elmnt = STGEN;
 179 
 180         stack_pst_init(&cfg.t.cfg.s.l1Gen.sm );
 181         cfg.t.cfg.s.l1Gen.sm.srcEnt     = ENTL1;
 182         cfg.t.cfg.s.l1Gen.sm.dstEnt     = ENTSM;
 183 
 184         cfg.t.cfg.s.l1Gen.nmbLnks       = MAX_L1_LINKS;
 185         cfg.t.cfg.s.l1Gen.poolTrUpper   = POOL_UP_TR;        /* upper pool threshold */
 186         cfg.t.cfg.s.l1Gen.poolTrLower   = POOL_LW_TR;        /* lower pool threshold */
 187 
 188         if (sng_isdn_phy_config(&pst, &cfg)) {
 189                 return FTDM_FAIL;
 190         }
 191         return FTDM_SUCCESS;
 192 }
 193 
 194 ftdm_status_t sngisdn_stack_cfg_phy_psap(ftdm_span_t *span)
 195 {       
 196         L1Mngmt                         cfg;
 197         Pst                                     pst;
 198 
 199         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
 200 
 201         /* initalize the post structure */
 202         stack_pst_init(&pst);
 203 
 204         /* insert the destination Entity */
 205         pst.dstEnt = ENTL1;
 206 
 207         /*clear the configuration structure*/
 208         memset(&cfg, 0, sizeof(cfg));
 209 
 210         /*fill in some general sections of the header*/
 211         stack_hdr_init(&cfg.hdr);
 212 
 213         /*fill in the specific fields of the header*/
 214         cfg.hdr.msgType     = TCFG;
 215         cfg.hdr.entId.ent   = ENTL1;
 216         cfg.hdr.entId.inst  = S_INST;
 217         cfg.hdr.elmId.elmnt = STPSAP;
 218 
 219         cfg.hdr.elmId.elmntInst1    = signal_data->dchan_id;
 220 
 221         if (!signal_data->dchan) {
 222                 ftdm_log(FTDM_LOG_ERROR, "%s:No d-channels specified\n", span->name);
 223                 return FTDM_FAIL;
 224         }
 225 
 226         cfg.t.cfg.s.l1PSAP.sockfd = (int32_t)signal_data->dchan->sockfd;
 227 
 228         switch(span->trunk_type) {
 229                 case FTDM_TRUNK_E1:
 230                         cfg.t.cfg.s.l1PSAP.type = SNG_L1_TYPE_PRI;
 231                         break;
 232                 case FTDM_TRUNK_T1:
 233                 case FTDM_TRUNK_J1:
 234                         cfg.t.cfg.s.l1PSAP.type = SNG_L1_TYPE_PRI;
 235                         break;
 236                 case FTDM_TRUNK_BRI:
 237                 case FTDM_TRUNK_BRI_PTMP:
 238                         cfg.t.cfg.s.l1PSAP.type = SNG_L1_TYPE_BRI;
 239                         break;
 240                 default:
 241                         ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported trunk type %d\n", span->name, span->trunk_type);
 242                         return FTDM_FAIL;
 243         }
 244 
 245         cfg.t.cfg.s.l1PSAP.spId         = signal_data->dchan_id;
 246 
 247         if (sng_isdn_phy_config(&pst, &cfg)) {
 248                 return FTDM_FAIL;
 249         }
 250         return FTDM_SUCCESS;
 251 }
 252 
 253 
 254 ftdm_status_t sngisdn_stack_cfg_q921_gen(void)
 255 {
 256         BdMngmt cfg;
 257         Pst     pst;
 258 
 259         /* initalize the post structure */
 260         stack_pst_init(&pst);
 261         /* insert the destination Entity */
 262         pst.dstEnt = ENTLD;
 263 
 264         /*clear the configuration structure*/
 265         memset(&cfg, 0, sizeof(cfg));
 266         /*fill in some general sections of the header*/
 267         stack_hdr_init(&cfg.hdr);
 268 
 269         cfg.hdr.msgType     = TCFG;
 270         cfg.hdr.entId.ent   = ENTLD;
 271         cfg.hdr.entId.inst  = S_INST;
 272         cfg.hdr.elmId.elmnt = STGEN;
 273         /* fill in the Gen Conf structures internal pst struct */
 274 
 275         stack_pst_init(&cfg.t.cfg.s.bdGen.sm);
 276 
 277         cfg.t.cfg.s.bdGen.sm.dstEnt    = ENTSM;         /* entity */
 278         
 279         cfg.t.cfg.s.bdGen.nmbPLnks =    MAX_L1_LINKS+1;
 280         cfg.t.cfg.s.bdGen.nmbLDLnks =   MAX_L1_LINKS+1; /* Not used in LAPD */
 281         cfg.t.cfg.s.bdGen.nmbDLCs = MAX_L1_LINKS+1;
 282         cfg.t.cfg.s.bdGen.nmbDLCs = MAX_TEIS_PER_LINK*(MAX_L1_LINKS+1);
 283         cfg.t.cfg.s.bdGen.nmbASPLnks = MAX_L1_LINKS+1;
 284 
 285 #ifdef LAPD_3_4
 286         cfg.t.cfg.s.bdGen.timeRes     = 100;      /* timer resolution = 1 sec */
 287 #endif
 288         cfg.t.cfg.s.bdGen.poolTrUpper   = 2;        /* upper pool threshold */
 289         cfg.t.cfg.s.bdGen.poolTrLower   = 1;        /* lower pool threshold */
 290 
 291         if (sng_isdn_q921_config(&pst, &cfg)) {
 292                 return FTDM_FAIL;
 293         }
 294         return FTDM_SUCCESS;
 295 }
 296 
 297 ftdm_status_t sngisdn_stack_cfg_q921_msap(ftdm_span_t *span)
 298 {
 299         BdMngmt cfg;
 300         Pst     pst;
 301 
 302         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
 303 
 304         /* initalize the post structure */
 305         stack_pst_init(&pst);
 306         /* insert the destination Entity */
 307         pst.dstEnt = ENTLD;
 308 
 309         /*clear the configuration structure*/
 310         memset(&cfg, 0, sizeof(cfg));
 311         /*fill in some general sections of the header*/
 312         stack_hdr_init(&cfg.hdr);
 313 
 314         cfg.hdr.msgType     = TCFG;
 315         cfg.hdr.entId.ent   = ENTLD;
 316         cfg.hdr.entId.inst  = S_INST;
 317         cfg.hdr.elmId.elmnt = STMSAP;
 318 
 319         cfg.t.cfg.s.bdMSAP.lnkNmb      = signal_data->dchan_id;
 320 
 321         cfg.t.cfg.s.bdMSAP.maxOutsFrms = 24;            /* MAC window */
 322         cfg.t.cfg.s.bdMSAP.tQUpperTrs  = 32;           /* Tx Queue Upper Threshold */
 323         cfg.t.cfg.s.bdMSAP.tQLowerTrs  = 24;            /* Tx Queue Lower Threshold */
 324         cfg.t.cfg.s.bdMSAP.selector    = 0;       /* Selector 0 */
 325         /* TODO: check if bdMSAP parameters can be initialized by calling stack_pst_init */
 326         cfg.t.cfg.s.bdMSAP.mem.region  = S_REG;       /* Memory region */
 327         cfg.t.cfg.s.bdMSAP.mem.pool    = S_POOL;      /* Memory pool */
 328         cfg.t.cfg.s.bdMSAP.prior       = PRIOR0;            /* Priority */
 329         cfg.t.cfg.s.bdMSAP.route       = RTESPEC;            /* Route */
 330         cfg.t.cfg.s.bdMSAP.dstProcId   = SFndProcId(); /* destination proc id */
 331         cfg.t.cfg.s.bdMSAP.dstEnt      = ENTL1;        /* entity */
 332         cfg.t.cfg.s.bdMSAP.dstInst     = S_INST;      /* instance */
 333         cfg.t.cfg.s.bdMSAP.t201Tmr     = 1;            /* T201 - should be equal to t200Tmr */
 334         cfg.t.cfg.s.bdMSAP.t202Tmr     = 2;          /* T202 */
 335         cfg.t.cfg.s.bdMSAP.bndRetryCnt = 2;            /* bind retry counter */
 336         cfg.t.cfg.s.bdMSAP.tIntTmr     = 200;          /* bind retry timer */
 337         cfg.t.cfg.s.bdMSAP.n202        = 3;            /* N202 */
 338         cfg.t.cfg.s.bdMSAP.lowTei      = 64;         /* Lowest dynamic TEI */
 339 
 340         if (span->trunk_type == FTDM_TRUNK_BRI_PTMP &&
 341                 signal_data->signalling == SNGISDN_SIGNALING_NET) {
 342                 cfg.t.cfg.s.bdMSAP.kpL1Up      = FALSE;        /* flag to keep l1 up or not */
 343         } else {
 344                 cfg.t.cfg.s.bdMSAP.kpL1Up      = TRUE;        /* flag to keep l1 up or not */
 345         }
 346 
 347         switch(signal_data->switchtype) {
 348                 case SNGISDN_SWITCH_NI2:
 349                 case SNGISDN_SWITCH_5ESS:
 350                 case SNGISDN_SWITCH_4ESS:
 351                 case SNGISDN_SWITCH_DMS100:
 352                         cfg.t.cfg.s.bdMSAP.type = SW_NI2;
 353                         break;
 354                 case SNGISDN_SWITCH_INSNET:
 355                         cfg.t.cfg.s.bdMSAP.type = SW_CCITT;
 356                         break;
 357                 case SNGISDN_SWITCH_EUROISDN:
 358                 case SNGISDN_SWITCH_QSIG:
 359                         cfg.t.cfg.s.bdMSAP.type = SW_ETSI;
 360                         break;
 361         }
 362 
 363         if (span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
 364                 cfg.t.cfg.s.bdMSAP.teiChkTmr   = 20;         /* Tei check timer */
 365         } else {
 366                 cfg.t.cfg.s.bdMSAP.teiChkTmr   = 0;         /* Tei check timer */
 367         }
 368 
 369         if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
 370                 cfg.t.cfg.s.bdMSAP.logInt      = 1;         /* logical interface = 0 = user, 1= network */
 371                 cfg.t.cfg.s.bdMSAP.setUpArb    = PASSIVE;       /* set up arbitration */
 372         } else {
 373                 cfg.t.cfg.s.bdMSAP.logInt      = 0;         /* logical interface = 0 = user, 1= network */
 374                 cfg.t.cfg.s.bdMSAP.setUpArb    = ACTIVE;       /* set up arbitration */
 375         }
 376 
 377         /* Overwrite setUpArb value if user forced it */
 378         if (signal_data->setup_arb == SNGISDN_OPT_TRUE) {
 379                 cfg.t.cfg.s.bdMSAP.setUpArb    = ACTIVE;
 380         } else if (signal_data->setup_arb == SNGISDN_OPT_FALSE) {
 381                 cfg.t.cfg.s.bdMSAP.setUpArb    = PASSIVE;
 382         }
 383 
 384         if (sng_isdn_q921_config(&pst, &cfg)) {
 385                 return FTDM_FAIL;
 386         }
 387         return FTDM_SUCCESS;
 388 }
 389 
 390 ftdm_status_t sngisdn_stack_cfg_q921_dlsap(ftdm_span_t *span, uint8_t management)
 391 {
 392         BdMngmt cfg;
 393         Pst     pst;
 394 
 395         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
 396         /* initalize the post structure */
 397         stack_pst_init(&pst);
 398         /* insert the destination Entity */
 399         pst.dstEnt = ENTLD;
 400 
 401         /*clear the configuration structure*/
 402         memset(&cfg, 0, sizeof(cfg));
 403         /*fill in some general sections of the header*/
 404         stack_hdr_init(&cfg.hdr);
 405 
 406         /*fill in the specific fields of the header*/
 407         cfg.hdr.msgType     = TCFG;
 408         cfg.hdr.entId.ent   = ENTLD;
 409         cfg.hdr.entId.inst  = S_INST;
 410         cfg.hdr.elmId.elmnt = STDLSAP;
 411 
 412         cfg.t.cfg.s.bdDLSAP.lnkNmb              = signal_data->dchan_id;
 413 
 414         cfg.t.cfg.s.bdDLSAP.n201                = 1028;                 /* n201 */
 415         if (span->trunk_type == FTDM_TRUNK_BRI_PTMP ||
 416                 span->trunk_type == FTDM_TRUNK_BRI) {
 417 
 418                 cfg.t.cfg.s.bdDLSAP.k                   = 1;                            /* Based on q.921 recommendations */
 419         } else {
 420                 cfg.t.cfg.s.bdDLSAP.k                   = 7;                    /* k */
 421         }
 422 
 423         cfg.t.cfg.s.bdDLSAP.n200                = 3;                    /* n200 */
 424         cfg.t.cfg.s.bdDLSAP.congTmr             = 300;                  /* congestion timer */
 425         cfg.t.cfg.s.bdDLSAP.t200Tmr             = 1;                            /* t1 changed from 25 */
 426         cfg.t.cfg.s.bdDLSAP.t203Tmr             = 10;                           /* t3 changed from 50 */
 427         cfg.t.cfg.s.bdDLSAP.mod                 = 128;                  /* modulo */
 428         cfg.t.cfg.s.bdDLSAP.selector    = 0;                            /* Selector 0 */
 429         cfg.t.cfg.s.bdDLSAP.mem.region  = S_REG;                        /* Memory region */
 430         cfg.t.cfg.s.bdDLSAP.mem.pool    = S_POOL;                       /* Memory pool */
 431         cfg.t.cfg.s.bdDLSAP.prior               = PRIOR0;                       /* Priority */
 432         cfg.t.cfg.s.bdDLSAP.route               = RTESPEC;                      /* Route */
 433 
 434         if (management) {
 435                 cfg.t.cfg.s.bdDLSAP.sapi     = MNGMT_SAPI;
 436                 cfg.t.cfg.s.bdDLSAP.teiAss     = NON_AUTOMATIC; /* static tei assignment */
 437                 cfg.t.cfg.s.bdDLSAP.noOfDlc = 1;
 438                 cfg.t.cfg.s.bdDLSAP.tei[0]  = 0x7f;
 439         } else {
 440                 cfg.t.cfg.s.bdDLSAP.sapi  = Q930_SAPI;
 441                 if (span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
 442                         if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
 443                                 cfg.t.cfg.s.bdDLSAP.teiAss  = AUTOMATIC;
 444                                 cfg.t.cfg.s.bdDLSAP.noOfDlc = 8;
 445 
 446                                 cfg.t.cfg.s.bdDLSAP.tei[0]  = 64;
 447                                 cfg.t.cfg.s.bdDLSAP.tei[1]  = 65;
 448                                 cfg.t.cfg.s.bdDLSAP.tei[2]  = 66;
 449                                 cfg.t.cfg.s.bdDLSAP.tei[3]  = 67;
 450                                 cfg.t.cfg.s.bdDLSAP.tei[4]  = 68;
 451                                 cfg.t.cfg.s.bdDLSAP.tei[5]  = 69;
 452                                 cfg.t.cfg.s.bdDLSAP.tei[6]  = 70;
 453                                 cfg.t.cfg.s.bdDLSAP.tei[7]  = 71;
 454                         } else {
 455                                 cfg.t.cfg.s.bdDLSAP.teiAss  = AUTOMATIC;
 456                                 cfg.t.cfg.s.bdDLSAP.noOfDlc = 1;
 457                         }
 458                 } else {
 459                         /* Point to point configs */
 460                         cfg.t.cfg.s.bdDLSAP.teiAss    = NON_AUTOMATIC;
 461                         cfg.t.cfg.s.bdDLSAP.noOfDlc   = 1;
 462                         cfg.t.cfg.s.bdDLSAP.tei[0]    = signal_data->tei;
 463                 }
 464         }
 465 
 466         if (sng_isdn_q921_config(&pst, &cfg)) {
 467                 return FTDM_FAIL;
 468         }
 469         return FTDM_SUCCESS;
 470 }
 471 
 472 ftdm_status_t sngisdn_stack_cfg_q931_gen(void)
 473 {
 474         InMngmt cfg;
 475         Pst     pst;
 476 
 477         /* initalize the post structure */
 478         stack_pst_init(&pst);
 479 
 480         /* insert the destination Entity */
 481         pst.dstEnt = ENTIN;
 482 
 483         /*clear the configuration structure*/
 484         memset(&cfg, 0, sizeof(cfg));
 485 
 486         /*fill in some general sections of the header*/
 487         stack_hdr_init(&cfg.hdr);
 488 
 489         /*fill in the specific fields of the header*/
 490         cfg.hdr.msgType     = TCFG;
 491         cfg.hdr.entId.ent   = ENTIN;
 492         cfg.hdr.entId.inst  = S_INST;
 493         cfg.hdr.elmId.elmnt = STGEN;
 494 
 495         /* fill in the Gen Conf structures internal pst struct */
 496         stack_pst_init(&cfg.t.cfg.s.inGen.sm);
 497 
 498         cfg.t.cfg.s.inGen.nmbSaps = MAX_VARIANTS+1;                     /* Total number of variants supported */
 499 
 500         cfg.t.cfg.s.inGen.nmbLnks = MAX_L1_LINKS+1;                     /* number of Data Link SAPs */
 501         cfg.t.cfg.s.inGen.nmbSigLnks = MAX_L1_LINKS+1;
 502 
 503         /* number of CESs */
 504         cfg.t.cfg.s.inGen.nmbCes = (MAX_L1_LINKS+1)*MAX_NUM_CES_PER_LINK;
 505         /* number of global Call References can have 2 per channel when using HOLD/RESUME */
 506         cfg.t.cfg.s.inGen.nmbCalRef = MAX_NUM_CALLS;
 507         /* number of bearer channels */
 508         cfg.t.cfg.s.inGen.nmbBearer = NUM_E1_CHANNELS_PER_SPAN*(MAX_L1_LINKS+1);
 509         /* maximum number of routing entries */
 510         cfg.t.cfg.s.inGen.nmbRouts = 0;
 511         /* number of profiles */
 512         cfg.t.cfg.s.inGen.nmbProfiles = 0;
 513         /* upper pool threshold */
 514         cfg.t.cfg.s.inGen.poolTrUpper = INGEN_POOL_UP_TR;
 515         /* time resolution */
 516         cfg.t.cfg.s.inGen.timeRes = 100; /* timer resolution = 1 sec */
 517 
 518         cfg.t.cfg.s.inGen.sm.dstEnt = ENTSM;
 519 
 520         if (sng_isdn_q931_config(&pst, &cfg)) {
 521                 return FTDM_FAIL;
 522         }
 523         return FTDM_SUCCESS;
 524 }
 525 
 526 /* Link between CC and q931 */
 527 ftdm_status_t sngisdn_stack_cfg_q931_tsap(ftdm_span_t *span)
 528 {
 529         InMngmt cfg;
 530         Pst     pst;
 531         unsigned i;
 532         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
 533         /* initalize the post structure */
 534         stack_pst_init(&pst);
 535 
 536         /* insert the destination Entity */
 537         pst.dstEnt = ENTIN;
 538 
 539         /*clear the configuration structure*/
 540         memset(&cfg, 0, sizeof(cfg));
 541 
 542         /*fill in some general sections of the header*/
 543         stack_hdr_init(&cfg.hdr);
 544 
 545         /*fill in the specific fields of the header*/
 546         cfg.hdr.msgType     = TCFG;
 547         cfg.hdr.entId.ent   = ENTIN;
 548         cfg.hdr.entId.inst  = S_INST;
 549         cfg.hdr.elmId.elmnt = STTSAP;
 550 
 551         cfg.t.cfg.s.inTSAP.sapId = signal_data->cc_id;
 552 
 553         cfg.t.cfg.s.inTSAP.prior = PRIOR0;
 554         cfg.t.cfg.s.inTSAP.route = RTESPEC;
 555 
 556         cfg.t.cfg.s.inTSAP.swtch = sng_isdn_stack_switchtype(signal_data->switchtype);
 557         cfg.t.cfg.s.inTSAP.useSubAdr = 0;                                               /* call routing on subaddress */
 558         cfg.t.cfg.s.inTSAP.adrPref = 0;                                                 /* use of prefix for int'l calls */
 559         cfg.t.cfg.s.inTSAP.nmbPrefDig = 0;                                              /* number of digits used for prefix */
 560 
 561         for (i = 0; i < IN_MAXPREFDIG; i++)
 562                 cfg.t.cfg.s.inTSAP.prefix[i] = 0;                                       /* address prefix */
 563 
 564         cfg.t.cfg.s.inTSAP.keyPad = 0;
 565         cfg.t.cfg.s.inTSAP.wcRout = 0;
 566 
 567         for (i = 0; i < ADRLEN; i++)
 568                 cfg.t.cfg.s.inTSAP.wcMask[i] = 0;       /* address prefix */
 569 
 570         cfg.t.cfg.s.inTSAP.sidIns = FALSE;              /* SID insertion Flag */
 571         cfg.t.cfg.s.inTSAP.sid.length = 0;              /* SID */
 572         cfg.t.cfg.s.inTSAP.sidTon = 0;                  /* SID Type of Number */
 573         cfg.t.cfg.s.inTSAP.sidNPlan = 0;                /* SID Numbering Plan */
 574         cfg.t.cfg.s.inTSAP.callId.len = 0;              /* Default Call Identity */
 575         cfg.t.cfg.s.inTSAP.minAdrDig = 0;               /* Minimum number of address digits */
 576         cfg.t.cfg.s.inTSAP.comptChck = FALSE;   /* Validate compatibility */
 577         cfg.t.cfg.s.inTSAP.nmbApplProf = 0;             /* Number of application profiles */
 578         cfg.t.cfg.s.inTSAP.profNmb[0] = 0;              /* Application profiles */
 579         cfg.t.cfg.s.inTSAP.mem.region = S_REG;
 580         cfg.t.cfg.s.inTSAP.mem.pool = S_POOL;
 581         cfg.t.cfg.s.inTSAP.selector = 0;
 582 
 583 
 584         if (sng_isdn_q931_config(&pst, &cfg)) {
 585                 return FTDM_FAIL;
 586         }
 587         return FTDM_SUCCESS;
 588 }
 589 
 590 ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
 591 {
 592         InMngmt cfg;
 593         Pst     pst;
 594 
 595         unsigned i;
 596         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
 597         /* initalize the post structure */
 598         stack_pst_init(&pst);
 599 
 600         /* insert the destination Entity */
 601         pst.dstEnt = ENTIN;
 602 
 603         /*clear the configuration structure*/
 604         memset(&cfg, 0, sizeof(cfg));
 605 
 606         /*fill in some general sections of the header*/
 607         stack_hdr_init(&cfg.hdr);
 608 
 609         /*fill in the specific fields of the header*/
 610         cfg.hdr.msgType     = TCFG;
 611         cfg.hdr.entId.ent   = ENTIN;
 612         cfg.hdr.entId.inst  = S_INST;
 613         cfg.hdr.elmId.elmnt = STDLSAP;
 614 
 615         cfg.hdr.response.selector=0;
 616 
 617         cfg.t.cfg.s.inDLSAP.sapId = signal_data->dchan_id;
 618         cfg.t.cfg.s.inDLSAP.spId = signal_data->dchan_id;
 619 
 620         cfg.t.cfg.s.inDLSAP.swtch = sng_isdn_stack_switchtype(signal_data->switchtype);
 621 
 622         cfg.t.cfg.s.inDLSAP.n201 = 1024;
 623         cfg.t.cfg.s.inDLSAP.nmbRst = 2;
 624         cfg.t.cfg.s.inDLSAP.tCbCfg = TRUE;
 625 
 626         cfg.t.cfg.s.inDLSAP.tCbId = signal_data->cc_id;
 627 
 628         if (signal_data->facility == SNGISDN_OPT_TRUE) {
 629                 cfg.t.cfg.s.inDLSAP.facilityHandling = IN_FACILITY_STANDRD;
 630         } else {
 631                 cfg.t.cfg.s.inDLSAP.facilityHandling = 0;
 632         }
 633 
 634         /* TODO : NFAS configuration */
 635         cfg.t.cfg.s.inDLSAP.nfasInt = FALSE; /* pass this later */
 636 
 637         if (!cfg.t.cfg.s.inDLSAP.nfasInt) {
 638                 cfg.t.cfg.s.inDLSAP.intId = 0;
 639                 cfg.t.cfg.s.inDLSAP.sigInt = 0;
 640                 cfg.t.cfg.s.inDLSAP.bupInt = 0;
 641                 cfg.t.cfg.s.inDLSAP.nmbNfasInt = 0;
 642                 cfg.t.cfg.s.inDLSAP.buIntPr = FALSE;
 643 
 644                 for (i = 0; i < IN_MAX_NMB_INTRFS; i++)
 645                         cfg.t.cfg.s.inDLSAP.ctldInt[i] = IN_INT_NOT_CFGD;
 646 
 647         } else {
 648                 /* Need to get these parameters from NFAS */
 649                 cfg.t.cfg.s.inDLSAP.intId = 0;
 650                 cfg.t.cfg.s.inDLSAP.sigInt = 0;
 651                 cfg.t.cfg.s.inDLSAP.bupInt = 1;
 652                 cfg.t.cfg.s.inDLSAP.nmbNfasInt = 2;
 653                 cfg.t.cfg.s.inDLSAP.buIntPr = 1;
 654 
 655                 for (i = 0; i < IN_MAX_NMB_INTRFS; i++)
 656                         cfg.t.cfg.s.inDLSAP.ctldInt[i] = IN_INT_NOT_CFGD;
 657 
 658                 /* For primary and backup interfaces, need to initialize this array */
 659                 cfg.t.cfg.s.inDLSAP.ctldInt[0] = 0; /* This is primary if for NFAS */
 660                 cfg.t.cfg.s.inDLSAP.ctldInt[1] = 1;
 661         }
 662 
 663         cfg.t.cfg.s.inDLSAP.numRstInd = 255;
 664         cfg.t.cfg.s.inDLSAP.relOpt = TRUE;
 665 #ifdef ISDN_SRV
 666         cfg.t.cfg.s.inDLSAP.bcas = FALSE;
 667         cfg.t.cfg.s.inDLSAP.maxBSrvCnt = 2;
 668         cfg.t.cfg.s.inDLSAP.maxDSrvCnt = 2;
 669 #endif /* ISDN_SRV */
 670         
 671         if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
 672                 cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
 673                 cfg.t.cfg.s.inDLSAP.intType = NETWORK;
 674                 cfg.t.cfg.s.inDLSAP.clrGlr = FALSE;                     /* in case of glare, do not clear local call */
 675                 cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
 676 
 677                 if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
 678                         signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
 679                         cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
 680                 } else {
 681                         cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
 682                 }
 683         } else {
 684                 cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
 685                 cfg.t.cfg.s.inDLSAP.intType = USER;
 686                 cfg.t.cfg.s.inDLSAP.clrGlr = TRUE;                      /* in case of glare, clear local call */
 687                 cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
 688                 cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
 689         }
 690 
 691         /* Override the restart options if user selected that option */
 692         if (signal_data->restart_opt != SNGISDN_OPT_DEFAULT) {
 693                 if (signal_data->restart_opt == SNGISDN_OPT_TRUE) {
 694                         cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
 695                 } else {
 696                         cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
 697                 }
 698         }
 699         
 700         for (i = 0; i < IN_MAXBCHNL; i++)
 701         {
 702                 cfg.t.cfg.s.inDLSAP.bProf[i].profNmb = 0;
 703                 cfg.t.cfg.s.inDLSAP.bProf[i].valid = FALSE;
 704                 cfg.t.cfg.s.inDLSAP.bProf[i].state = IN_PROV_AVAIL;
 705         }
 706 
 707         if (span->trunk_type == FTDM_TRUNK_BRI_PTMP &&
 708                 signal_data->signalling == SNGISDN_SIGNALING_NET) {
 709                 cfg.t.cfg.s.inDLSAP.nmbCes = MAX_NUM_CES_PER_LINK;
 710         } else {
 711                 cfg.t.cfg.s.inDLSAP.nmbCes=1;
 712         }
 713         
 714         cfg.t.cfg.s.inDLSAP.useSubAdr = 0;       /* call routing on subaddress */
 715         cfg.t.cfg.s.inDLSAP.adrPref = 0;         /* use of prefix for international calls */
 716         cfg.t.cfg.s.inDLSAP.nmbPrefDig = 0;      /* number of digits used for prefix */
 717         for (i = 0; i < IN_MAXPREFDIG; i++)
 718                 cfg.t.cfg.s.inDLSAP.prefix[i] = 0;       /* address prefix */
 719         cfg.t.cfg.s.inDLSAP.keyPad = 0;
 720         cfg.t.cfg.s.inDLSAP.wcRout = 0;
 721         for (i = 0; i < ADRLEN; i++)
 722                 cfg.t.cfg.s.inDLSAP.wcMask[i] = 0;       /* address prefix */
 723 
 724         cfg.t.cfg.s.inDLSAP.sidIns = FALSE;         /* SID insertion flag */
 725         cfg.t.cfg.s.inDLSAP.sid.length = 0;                             /* SID */
 726         cfg.t.cfg.s.inDLSAP.sidTon = 0;             /* SID Type of Number */
 727         cfg.t.cfg.s.inDLSAP.sidNPlan = 0;           /* SID Numbering Plan */
 728         cfg.t.cfg.s.inDLSAP.sidPresInd = FALSE;         /* SID Presentation Indicator */
 729         cfg.t.cfg.s.inDLSAP.minAdrDig = 0;          /* minimum number of address digits */
 730         cfg.t.cfg.s.inDLSAP.srvOpt = FALSE;
 731         cfg.t.cfg.s.inDLSAP.callId.len = 0;         /* default call id */
 732         cfg.t.cfg.s.inDLSAP.redirSubsc = FALSE;      /* subscription to call redirection */
 733         cfg.t.cfg.s.inDLSAP.redirAdr.eh.pres = NOTPRSNT; /* redirAdr Numbering Plan */
 734         cfg.t.cfg.s.inDLSAP.forwSubsc = FALSE;        /* programmed forwarding subscription */
 735         cfg.t.cfg.s.inDLSAP.cndSubsc = TRUE;         /* calling adddress delivery service subscription */
 736 
 737         /* TODO: Fill in these timers with proper values - eventually pass them */
 738         cfg.t.cfg.s.inDLSAP.tmr.t301.enb = TRUE;
 739         cfg.t.cfg.s.inDLSAP.tmr.t301.val = 180;
 740         cfg.t.cfg.s.inDLSAP.tmr.t302.enb = TRUE;
 741         cfg.t.cfg.s.inDLSAP.tmr.t302.val = 15;
 742         cfg.t.cfg.s.inDLSAP.tmr.t303.enb = TRUE;
 743         cfg.t.cfg.s.inDLSAP.tmr.t303.val = 4;
 744         cfg.t.cfg.s.inDLSAP.tmr.t304.enb = TRUE;
 745         cfg.t.cfg.s.inDLSAP.tmr.t304.val = 30;
 746         cfg.t.cfg.s.inDLSAP.tmr.t305.enb = TRUE;
 747         cfg.t.cfg.s.inDLSAP.tmr.t305.val = 30;
 748         cfg.t.cfg.s.inDLSAP.tmr.t306.enb = FALSE;
 749         cfg.t.cfg.s.inDLSAP.tmr.t306.val = 35;
 750         cfg.t.cfg.s.inDLSAP.tmr.t307.enb = FALSE;
 751         cfg.t.cfg.s.inDLSAP.tmr.t307.val = 35;
 752         cfg.t.cfg.s.inDLSAP.tmr.t308.enb = TRUE;
 753         cfg.t.cfg.s.inDLSAP.tmr.t308.val = 4;
 754 
 755         if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
 756                 cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE;
 757                 cfg.t.cfg.s.inDLSAP.tmr.t310.val = 10;
 758                 cfg.t.cfg.s.inDLSAP.tmr.t312.enb = TRUE;
 759                 cfg.t.cfg.s.inDLSAP.tmr.t312.val = cfg.t.cfg.s.inDLSAP.tmr.t303.val+2;
 760         } else {
 761                 cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE;
 762                 cfg.t.cfg.s.inDLSAP.tmr.t310.val = 120;
 763                 cfg.t.cfg.s.inDLSAP.tmr.t312.enb = FALSE;
 764         }
 765 
 766         cfg.t.cfg.s.inDLSAP.tmr.t313.enb = TRUE;
 767         cfg.t.cfg.s.inDLSAP.tmr.t313.val = 4;
 768         cfg.t.cfg.s.inDLSAP.tmr.t316.enb = TRUE;
 769         cfg.t.cfg.s.inDLSAP.tmr.t316.val = 120;
 770         cfg.t.cfg.s.inDLSAP.tmr.t316c.enb = FALSE;
 771         cfg.t.cfg.s.inDLSAP.tmr.t316c.val = 35;
 772         cfg.t.cfg.s.inDLSAP.tmr.t318.enb = TRUE;
 773         cfg.t.cfg.s.inDLSAP.tmr.t318.val = 4;
 774         cfg.t.cfg.s.inDLSAP.tmr.t319.enb = TRUE;
 775         cfg.t.cfg.s.inDLSAP.tmr.t319.val = 4;
 776         cfg.t.cfg.s.inDLSAP.tmr.t322.enb = TRUE;
 777         cfg.t.cfg.s.inDLSAP.tmr.t322.val = 4;
 778         cfg.t.cfg.s.inDLSAP.tmr.t332.enb = FALSE;
 779         cfg.t.cfg.s.inDLSAP.tmr.t332.val = 35;
 780         cfg.t.cfg.s.inDLSAP.tmr.tRst.enb = TRUE;
 781         cfg.t.cfg.s.inDLSAP.tmr.tRst.val = 8;
 782         cfg.t.cfg.s.inDLSAP.tmr.tAns.enb = FALSE;  /* non-standard timer */
 783         cfg.t.cfg.s.inDLSAP.tmr.t396.enb = FALSE;  /* non-standard timer */
 784         cfg.t.cfg.s.inDLSAP.tmr.t397.enb = TRUE;  /* non-standard timer */
 785         cfg.t.cfg.s.inDLSAP.tmr.tProg.enb= TRUE;
 786         cfg.t.cfg.s.inDLSAP.tmr.tProg.val= 35;
 787 #ifdef NI2
 788 #ifdef NI2_TREST
 789         cfg.t.cfg.s.inDLSAP.tmr.tRest.enb= FALSE;
 790         cfg.t.cfg.s.inDLSAP.tmr.tRest.val= 35;    /* tRest timer for NI2 */
 791 #endif /* NI2_TREST */
 792 #endif /* NI2 */
 793 
 794         cfg.t.cfg.s.inDLSAP.dstEnt = ENTLD;
 795         cfg.t.cfg.s.inDLSAP.dstInst = S_INST;
 796         cfg.t.cfg.s.inDLSAP.dstProcId = SFndProcId();
 797         cfg.t.cfg.s.inDLSAP.prior = PRIOR0;
 798         cfg.t.cfg.s.inDLSAP.route = RTESPEC;
 799         cfg.t.cfg.s.inDLSAP.selector = 0;
 800         cfg.t.cfg.s.inDLSAP.mem.region = S_REG;
 801         cfg.t.cfg.s.inDLSAP.mem.pool = S_POOL;
 802 
 803         switch (span->trunk_type) {
 804                 case FTDM_TRUNK_E1:
 805                         cfg.t.cfg.s.inDLSAP.dChannelNum = 16;
 806                         cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_E1_CHANNELS_PER_SPAN;
 807                         cfg.t.cfg.s.inDLSAP.firstBChanNum = 0;
 808                         cfg.t.cfg.s.inDLSAP.callRefLen = 2;
 809                         cfg.t.cfg.s.inDLSAP.teiAlloc = IN_STATIC;
 810                         cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_PTPT;
 811                         break;
 812                 case FTDM_TRUNK_T1:
 813                 case FTDM_TRUNK_J1:
 814                                 /* if NFAS, could be 0 if no signalling */
 815                         cfg.t.cfg.s.inDLSAP.dChannelNum = 24;
 816                         cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_T1_CHANNELS_PER_SPAN;
 817                         cfg.t.cfg.s.inDLSAP.firstBChanNum = 1;
 818                         cfg.t.cfg.s.inDLSAP.callRefLen = 2;
 819                         cfg.t.cfg.s.inDLSAP.teiAlloc = IN_STATIC;
 820                         cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_PTPT;
 821                         break;
 822                 case FTDM_TRUNK_BRI:
 823                         cfg.t.cfg.s.inDLSAP.dChannelNum = 0; /* Unused for BRI */
 824                         cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_BRI_CHANNELS_PER_SPAN;
 825                         cfg.t.cfg.s.inDLSAP.firstBChanNum = 1;
 826                         cfg.t.cfg.s.inDLSAP.callRefLen = 1;
 827                         cfg.t.cfg.s.inDLSAP.teiAlloc = IN_STATIC;
 828                         cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_PTPT;
 829                         break;
 830                 case FTDM_TRUNK_BRI_PTMP:
 831                         cfg.t.cfg.s.inDLSAP.dChannelNum = 0; /* Unused for BRI */
 832                         cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_BRI_CHANNELS_PER_SPAN;
 833                         cfg.t.cfg.s.inDLSAP.firstBChanNum = 1;
 834                         cfg.t.cfg.s.inDLSAP.callRefLen = 1;
 835                         cfg.t.cfg.s.inDLSAP.teiAlloc = IN_DYNAMIC;
 836                         cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_MULTI;
 837                         break;
 838                 default:
 839                         ftdm_log(FTDM_LOG_ERROR, "%s: Unsupported trunk_type\n", span->name);
 840                         return FTDM_FAIL;
 841         }
 842 
 843         if (sng_isdn_q931_config(&pst, &cfg)) {
 844                 return FTDM_FAIL;
 845         }
 846         return FTDM_SUCCESS;
 847 }
 848 
 849 ftdm_status_t sngisdn_stack_cfg_q931_lce(ftdm_span_t *span)
 850 {
 851         InMngmt cfg;
 852         Pst     pst;
 853         uint8_t i;
 854         uint8_t numCes=1;
 855 
 856         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
 857         if (span->trunk_type == FTDM_TRUNK_BRI_PTMP && signal_data->signalling == SNGISDN_SIGNALING_NET) {
 858                 numCes = 8;
 859         }
 860         /* initalize the post structure */
 861         stack_pst_init(&pst);
 862 
 863         /* insert the destination Entity */
 864         pst.dstEnt = ENTIN;
 865 
 866         /*clear the configuration structure*/
 867         memset(&cfg, 0, sizeof(cfg));
 868 
 869         /*fill in some general sections of the header*/
 870         stack_hdr_init(&cfg.hdr);
 871 
 872         /*fill in the specific fields of the header*/
 873         cfg.hdr.msgType     = TCFG;
 874         cfg.hdr.entId.ent   = ENTIN;
 875         cfg.hdr.entId.inst  = S_INST;
 876         cfg.hdr.elmId.elmnt = STDLC;
 877 
 878         cfg.hdr.response.selector=0;
 879 
 880         cfg.t.cfg.s.inLCe.sapId = signal_data->dchan_id;
 881 
 882         cfg.t.cfg.s.inLCe.lnkUpDwnInd = TRUE;
 883         cfg.t.cfg.s.inLCe.tCon.enb = TRUE;
 884         cfg.t.cfg.s.inLCe.tCon.val = 35;
 885         cfg.t.cfg.s.inLCe.tDisc.enb = TRUE;
 886         cfg.t.cfg.s.inLCe.tDisc.val = 35;
 887         cfg.t.cfg.s.inLCe.t314.enb = FALSE; /* if segmentation enabled, set to TRUE */
 888         cfg.t.cfg.s.inLCe.t314.val = 35;
 889 
 890         cfg.t.cfg.s.inLCe.t332i.enb = FALSE; /* set to TRUE for NFAS */
 891 
 892 #ifdef NFAS
 893         cfg.t.cfg.s.inLCe.t332i.val = 35;
 894 #else
 895         cfg.t.cfg.s.inLCe.t332i.val = 0;
 896 #endif
 897 
 898 #if (ISDN_NI1 || ISDN_NT || ISDN_ATT)
 899         cfg.t.cfg.s.inLCe.tSpid.enb = TRUE;
 900         cfg.t.cfg.s.inLCe.tSpid.val = 5;
 901 
 902         /* In case we want to support BRI - NORTH America, we will need to configure 8 spid's per CES */
 903         cfg.t.cfg.s.inLCe.spid.pres = NOTPRSNT;
 904         cfg.t.cfg.s.inLCe.spid.len = 0;
 905 #endif
 906         cfg.t.cfg.s.inLCe.tRstAck.enb = TRUE;
 907         cfg.t.cfg.s.inLCe.tRstAck.val = 10;
 908 
 909         cfg.t.cfg.s.inLCe.usid = 0;
 910         cfg.t.cfg.s.inLCe.tid = 0;
 911 
 912         for(i=0;i<numCes;i++) {
 913                 cfg.t.cfg.s.inLCe.ces = i;
 914                 if (sng_isdn_q931_config(&pst, &cfg)) {
 915                         return FTDM_FAIL;
 916                 }
 917         }
 918 
 919         return FTDM_SUCCESS;
 920 }
 921 
 922 
 923 ftdm_status_t sngisdn_stack_cfg_cc_gen(void)
 924 {
 925         CcMngmt cfg;
 926         Pst     pst;
 927 
 928         /* initalize the post structure */
 929         stack_pst_init(&pst);
 930 
 931         /* insert the destination Entity */
 932         pst.dstEnt = ENTCC;
 933 
 934         /*clear the configuration structure*/
 935         memset(&cfg, 0, sizeof(cfg));
 936 
 937         /*fill in some general sections of the header*/
 938         stack_hdr_init(&cfg.hdr);
 939 
 940         /*fill in the specific fields of the header*/
 941         cfg.hdr.msgType     = TCFG;
 942         cfg.hdr.entId.ent   = ENTCC;
 943         cfg.hdr.entId.inst  = S_INST;
 944         cfg.hdr.elmId.elmnt = STGEN;
 945 
 946         /* fill in the Gen Conf structures internal pst struct */
 947         stack_pst_init(&cfg.t.cfg.s.ccGenCfg.smPst);
 948         cfg.t.cfg.s.ccGenCfg.smPst.dstEnt = ENTSM;
 949 
 950         cfg.t.cfg.s.ccGenCfg.poolTrUpper = 2;
 951         cfg.t.cfg.s.ccGenCfg.poolTrLower = 1;
 952 
 953         cfg.t.cfg.s.ccGenCfg.nmbSaps     = MAX_VARIANTS+1; /* Set to number of variants + 1 */
 954 
 955         if (sng_isdn_cc_config(&pst, &cfg)) {
 956                 return FTDM_FAIL;
 957         }
 958         return FTDM_SUCCESS;
 959 }
 960 
 961 
 962 ftdm_status_t sngisdn_stack_cfg_cc_sap(ftdm_span_t *span)
 963 {
 964         CcMngmt cfg;
 965         Pst     pst;
 966 
 967         sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
 968 
 969         /* initalize the post structure */
 970         stack_pst_init(&pst);
 971 
 972         /* insert the destination Entity */
 973         pst.dstEnt = ENTCC;
 974 
 975         /*clear the configuration structure*/
 976         memset(&cfg, 0, sizeof(cfg));
 977 
 978         /*fill in some general sections of the header*/
 979         stack_hdr_init(&cfg.hdr);
 980 
 981         /*fill in the specific fields of the header*/
 982         cfg.hdr.msgType     = TCFG;
 983         cfg.hdr.entId.ent   = ENTCC;
 984         cfg.hdr.entId.inst  = S_INST;
 985         cfg.hdr.elmId.elmnt = STTSAP;
 986 
 987         cfg.t.cfg.s.ccISAP.pst.srcProcId        = SFndProcId();
 988     cfg.t.cfg.s.ccISAP.pst.srcEnt               = ENTCC;
 989     cfg.t.cfg.s.ccISAP.pst.srcInst              = S_INST;
 990         cfg.t.cfg.s.ccISAP.pst.dstEnt           = ENTIN;
 991         cfg.t.cfg.s.ccISAP.pst.dstInst          = S_INST;
 992         cfg.t.cfg.s.ccISAP.pst.dstProcId        = SFndProcId();
 993 
 994         cfg.t.cfg.s.ccISAP.pst.prior            = PRIOR0;
 995         cfg.t.cfg.s.ccISAP.pst.route            = RTESPEC;
 996         cfg.t.cfg.s.ccISAP.pst.region           = S_REG;
 997         cfg.t.cfg.s.ccISAP.pst.pool                     = S_POOL;
 998         cfg.t.cfg.s.ccISAP.pst.selector         = 0;
 999 
1000         cfg.t.cfg.s.ccISAP.suId                         = signal_data->cc_id;
1001         cfg.t.cfg.s.ccISAP.spId                         = signal_data->cc_id;
1002 
1003         cfg.t.cfg.s.ccISAP.swtch                        = sng_isdn_stack_switchtype(signal_data->switchtype);
1004         cfg.t.cfg.s.ccISAP.sapType                      = SNG_SAP_TYPE_ISDN;
1005 
1006         if (sng_isdn_cc_config(&pst, &cfg)) {
1007                 return FTDM_FAIL;
1008         }
1009         return FTDM_SUCCESS;
1010 }
1011 
1012 /* TODO: see if we can move this to inside the library */
1013 void stack_pst_init(Pst *pst)
1014 {
1015         memset(pst, 0, sizeof(Pst));
1016                 /*fill in the post structure*/
1017         pst->dstProcId   = SFndProcId();
1018         pst->dstInst     = S_INST;
1019 
1020         pst->srcProcId   = SFndProcId();
1021         pst->srcEnt      = ENTSM;
1022         pst->srcInst     = S_INST;
1023 
1024         pst->prior       = PRIOR0;
1025         pst->route       = RTESPEC;
1026         pst->region      = S_REG;
1027         pst->pool        = S_POOL;
1028         pst->selector    = 0;
1029         return;
1030 }
1031 
1032 
1033 
1034 void stack_hdr_init(Header *hdr)
1035 {
1036         hdr->msgType                = 0;
1037         hdr->msgLen                 = 0;
1038         hdr->entId.ent              = 0;
1039         hdr->entId.inst             = 0;
1040         hdr->elmId.elmnt            = 0;
1041         hdr->elmId.elmntInst1       = 0;
1042         hdr->elmId.elmntInst2       = 0;
1043         hdr->elmId.elmntInst3       = 0;
1044         hdr->seqNmb                 = 0;
1045         hdr->version                = 0;
1046         hdr->response.prior         = PRIOR0;
1047         hdr->response.route         = RTESPEC;
1048         hdr->response.mem.region    = S_REG;
1049         hdr->response.mem.pool      = S_POOL;
1050         hdr->transId                = 0;
1051         hdr->response.selector      = 0;
1052         return;
1053 }
1054 
1055 uint8_t sng_isdn_stack_switchtype(sngisdn_switchtype_t switchtype)
1056 {
1057         switch (switchtype) {
1058                 case SNGISDN_SWITCH_NI2:
1059                         return SW_NI2;
1060                 case SNGISDN_SWITCH_5ESS:
1061                         return SW_ATT5EP;
1062                 case SNGISDN_SWITCH_4ESS:
1063                         return SW_ATT4E;
1064                 case SNGISDN_SWITCH_DMS100:
1065                         return SW_NTDMS100P;
1066                 case SNGISDN_SWITCH_EUROISDN:
1067                         return SW_ETSI;
1068                 case SNGISDN_SWITCH_QSIG:
1069                         return SW_QSIG;
1070                 case SNGISDN_SWITCH_INSNET:
1071                         return SW_INSNET;
1072                 case SNGISDN_SWITCH_INVALID:
1073                         ftdm_log(FTDM_LOG_ERROR, "%s:Invalid switchtype:%d\n", switchtype);
1074                         break;
1075         }
1076         return 0;
1077 }
1078 
1079 /* For Emacs:
1080  * Local Variables:
1081  * mode:c
1082  * indent-tabs-mode:t
1083  * tab-width:4
1084  * c-basic-offset:4
1085  * End:
1086  * For VIM:
1087  * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
1088  */
1089 
1090 /******************************************************************************/

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