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

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