ftdm_status_t sng_isdn_activate_cc(ftdm_span_t *span) { CcMngmt cntrl;; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTCC; /* initalize the control structure */ memset(&cntrl, 0, sizeof(cntrl)); /* initalize the control header */ stack_hdr_init(&cntrl.hdr); cntrl.hdr.msgType = TCNTRL; /* configuration */ cntrl.hdr.entId.ent = ENTCC; /* entity */ cntrl.hdr.entId.inst = S_INST; /* instance */ cntrl.hdr.elmId.elmnt = STTSAP; /* physical sap */ cntrl.t.cntrl.action = ABND_ENA; cntrl.t.cntrl.subAction = SAELMNT; cntrl.t.cntrl.sapId = signal_data->cc_id; if (sng_isdn_cc_cntrl(&pst, &cntrl)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_wake_up_phy(ftdm_span_t *span) { L1Mngmt cntrl; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTL1; /* initalize the control structure */ memset(&cntrl, 0, sizeof(cntrl)); /* initalize the control header */ stack_hdr_init(&cntrl.hdr); cntrl.hdr.msgType = TCNTRL; /* configuration */ cntrl.hdr.entId.ent = ENTL1; /* entity */ cntrl.hdr.entId.inst = S_INST; /* instance */ cntrl.hdr.elmId.elmnt = STTSAP; /* SAP Specific cntrl */ cntrl.t.cntrl.action = AENA; cntrl.t.cntrl.subAction = SAELMNT; cntrl.t.cntrl.sapId = signal_data->link_id; if (sng_isdn_phy_cntrl(&pst, &cntrl)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_phy_psap(ftdm_span_t *span) { L1Mngmt cfg; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTL1; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTL1; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STPSAP; cfg.hdr.elmId.elmntInst1 = signal_data->dchan_id; if (!signal_data->dchan) { ftdm_log(FTDM_LOG_ERROR, "%s:No d-channels specified\n", span->name); return FTDM_FAIL; } cfg.t.cfg.s.l1PSAP.sockfd = (int32_t)signal_data->dchan->sockfd; switch(span->trunk_type) { case FTDM_TRUNK_E1: cfg.t.cfg.s.l1PSAP.type = SNG_L1_TYPE_PRI; break; case FTDM_TRUNK_T1: case FTDM_TRUNK_J1: cfg.t.cfg.s.l1PSAP.type = SNG_L1_TYPE_PRI; break; case FTDM_TRUNK_BRI: case FTDM_TRUNK_BRI_PTMP: cfg.t.cfg.s.l1PSAP.type = SNG_L1_TYPE_BRI; break; default: ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported trunk type %d\n", span->name, span->trunk_type); return FTDM_FAIL; } cfg.t.cfg.s.l1PSAP.spId = signal_data->dchan_id; if (sng_isdn_phy_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_q931_gen(void) { InMngmt cfg; Pst pst; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTIN; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTIN; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STGEN; /* fill in the Gen Conf structures internal pst struct */ stack_pst_init(&cfg.t.cfg.s.inGen.sm); cfg.t.cfg.s.inGen.nmbSaps = MAX_VARIANTS+1; /* Total number of variants supported */ cfg.t.cfg.s.inGen.nmbLnks = MAX_L1_LINKS+1; /* number of Data Link SAPs */ cfg.t.cfg.s.inGen.nmbSigLnks = MAX_L1_LINKS+1; /* number of CESs */ cfg.t.cfg.s.inGen.nmbCes = (MAX_L1_LINKS+1)*MAX_NUM_CES_PER_LINK; /* number of global Call References can have 2 per channel when using HOLD/RESUME */ cfg.t.cfg.s.inGen.nmbCalRef = MAX_NUM_CALLS; /* number of bearer channels */ cfg.t.cfg.s.inGen.nmbBearer = NUM_E1_CHANNELS_PER_SPAN*(MAX_L1_LINKS+1); /* maximum number of routing entries */ cfg.t.cfg.s.inGen.nmbRouts = 0; /* number of profiles */ cfg.t.cfg.s.inGen.nmbProfiles = 0; /* upper pool threshold */ cfg.t.cfg.s.inGen.poolTrUpper = INGEN_POOL_UP_TR; /* time resolution */ cfg.t.cfg.s.inGen.timeRes = 100; /* timer resolution = 1 sec */ cfg.t.cfg.s.inGen.sm.dstEnt = ENTSM; if (sng_isdn_q931_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sng_isdn_cntrl_q921(ftdm_span_t *span, uint8_t action, uint8_t subaction) { BdMngmt cntrl; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTLD; /* initalize the control structure */ memset(&cntrl, 0, sizeof(cntrl)); /* initalize the control header */ stack_hdr_init(&cntrl.hdr); /* build control request */ cntrl.hdr.msgType = TCNTRL; cntrl.hdr.entId.ent = ENTLD; cntrl.hdr.entId.inst = S_INST; #if (SMBD_LMINT3 || BD_LMINT3) stack_resp_hdr_init(&cntrl.hdr); #endif /* _LMINT3 */ cntrl.hdr.elmId.elmnt = STMSAP; cntrl.t.cntrl.action = action; cntrl.t.cntrl.subAction = subaction; #if (SMBD_LMINT3 || BD_LMINT3) cntrl.t.cntrl.lnkNmb = signal_data->link_id; cntrl.t.cntrl.sapi = NOTUSED; cntrl.t.cntrl.tei = NOTUSED; #else /* _LMINT3 */ cntrl.hdr.elmId.elmntInst1 = signal_data->link_id; cntrl.hdr.elmId.elmntInst2 = NOTUSED; cntrl.hdr.elmId.elmntInst3 = NOTUSED; #endif /* _LMINT3 */ cntrl.t.cntrl.logInt = NOTUSED; cntrl.t.cntrl.trcLen = NOTUSED; if (action == AENA && subaction == SATRC) { cntrl.t.cntrl.trcLen = -1; /* Trace the entire message buffer */ } SGetDateTime(&(cntrl.t.cntrl.dt)); if(sng_isdn_q921_cntrl(&pst, &cntrl)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_cc_sap(ftdm_span_t *span) { CcMngmt cfg; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTCC; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTCC; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STTSAP; cfg.t.cfg.s.ccISAP.pst.srcProcId = SFndProcId(); cfg.t.cfg.s.ccISAP.pst.srcEnt = ENTCC; cfg.t.cfg.s.ccISAP.pst.srcInst = S_INST; cfg.t.cfg.s.ccISAP.pst.dstEnt = ENTIN; cfg.t.cfg.s.ccISAP.pst.dstInst = S_INST; cfg.t.cfg.s.ccISAP.pst.dstProcId = SFndProcId(); cfg.t.cfg.s.ccISAP.pst.prior = PRIOR0; cfg.t.cfg.s.ccISAP.pst.route = RTESPEC; cfg.t.cfg.s.ccISAP.pst.region = S_REG; cfg.t.cfg.s.ccISAP.pst.pool = S_POOL; cfg.t.cfg.s.ccISAP.pst.selector = 0; cfg.t.cfg.s.ccISAP.suId = signal_data->cc_id; cfg.t.cfg.s.ccISAP.spId = signal_data->cc_id; cfg.t.cfg.s.ccISAP.swtch = sng_isdn_stack_switchtype(signal_data->switchtype); cfg.t.cfg.s.ccISAP.sapType = SNG_SAP_TYPE_ISDN; if (sng_isdn_cc_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_q921_gen(void) { BdMngmt cfg; Pst pst; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTLD; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTLD; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STGEN; /* fill in the Gen Conf structures internal pst struct */ stack_pst_init(&cfg.t.cfg.s.bdGen.sm); cfg.t.cfg.s.bdGen.sm.dstEnt = ENTSM; /* entity */ cfg.t.cfg.s.bdGen.nmbPLnks = MAX_L1_LINKS+1; cfg.t.cfg.s.bdGen.nmbLDLnks = MAX_L1_LINKS+1; /* Not used in LAPD */ cfg.t.cfg.s.bdGen.nmbDLCs = MAX_L1_LINKS+1; cfg.t.cfg.s.bdGen.nmbDLCs = MAX_TEIS_PER_LINK*(MAX_L1_LINKS+1); cfg.t.cfg.s.bdGen.nmbASPLnks = MAX_L1_LINKS+1; #ifdef LAPD_3_4 cfg.t.cfg.s.bdGen.timeRes = 100; /* timer resolution = 1 sec */ #endif cfg.t.cfg.s.bdGen.poolTrUpper = 2; /* upper pool threshold */ cfg.t.cfg.s.bdGen.poolTrLower = 1; /* lower pool threshold */ if (sng_isdn_q921_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_cntrl_q931(ftdm_span_t *span, uint8_t action, uint8_t subaction) { InMngmt cntrl; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTIN; /* initalize the control structure */ memset(&cntrl, 0, sizeof(cntrl)); /* initalize the control header */ stack_hdr_init(&cntrl.hdr); cntrl.hdr.msgType = TCNTRL; /* configuration */ cntrl.hdr.entId.ent = ENTIN; /* entity */ cntrl.hdr.entId.inst = S_INST; /* instance */ cntrl.hdr.elmId.elmnt = STDLSAP; /* physical sap */ cntrl.t.cntrl.action = action; cntrl.t.cntrl.subAction = subaction; if (action == AENA && subaction == SATRC) { cntrl.t.cntrl.trcLen = -1; /* Trace the entire message buffer */ } cntrl.t.cntrl.sapId = signal_data->link_id; cntrl.t.cntrl.ces = 0; if(sng_isdn_q931_cntrl(&pst, &cntrl)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_phy_gen(void) { /*local variables*/ L1Mngmt cfg; /*configuration structure*/ Pst pst; /*post structure*/ /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTL1; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTL1; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STGEN; stack_pst_init(&cfg.t.cfg.s.l1Gen.sm ); cfg.t.cfg.s.l1Gen.sm.srcEnt = ENTL1; cfg.t.cfg.s.l1Gen.sm.dstEnt = ENTSM; cfg.t.cfg.s.l1Gen.nmbLnks = MAX_L1_LINKS; cfg.t.cfg.s.l1Gen.poolTrUpper = POOL_UP_TR; /* upper pool threshold */ cfg.t.cfg.s.l1Gen.poolTrLower = POOL_LW_TR; /* lower pool threshold */ if (sng_isdn_phy_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_cc_gen(void) { CcMngmt cfg; Pst pst; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTCC; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTCC; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STGEN; /* fill in the Gen Conf structures internal pst struct */ stack_pst_init(&cfg.t.cfg.s.ccGenCfg.smPst); cfg.t.cfg.s.ccGenCfg.smPst.dstEnt = ENTSM; cfg.t.cfg.s.ccGenCfg.poolTrUpper = 2; cfg.t.cfg.s.ccGenCfg.poolTrLower = 1; cfg.t.cfg.s.ccGenCfg.nmbSaps = MAX_VARIANTS+1; /* Set to number of variants + 1 */ if (sng_isdn_cc_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_q931_lce(ftdm_span_t *span) { InMngmt cfg; Pst pst; uint8_t i; uint8_t numCes=1; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; if (span->trunk_type == FTDM_TRUNK_BRI_PTMP && signal_data->signalling == SNGISDN_SIGNALING_NET) { numCes = 8; } /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTIN; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTIN; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STDLC; cfg.hdr.response.selector=0; cfg.t.cfg.s.inLCe.sapId = signal_data->dchan_id; cfg.t.cfg.s.inLCe.lnkUpDwnInd = TRUE; cfg.t.cfg.s.inLCe.tCon.enb = TRUE; cfg.t.cfg.s.inLCe.tCon.val = 35; cfg.t.cfg.s.inLCe.tDisc.enb = TRUE; cfg.t.cfg.s.inLCe.tDisc.val = 35; cfg.t.cfg.s.inLCe.t314.enb = FALSE; /* if segmentation enabled, set to TRUE */ cfg.t.cfg.s.inLCe.t314.val = 35; cfg.t.cfg.s.inLCe.t332i.enb = FALSE; /* set to TRUE for NFAS */ #ifdef NFAS cfg.t.cfg.s.inLCe.t332i.val = 35; #else cfg.t.cfg.s.inLCe.t332i.val = 0; #endif #if (ISDN_NI1 || ISDN_NT || ISDN_ATT) cfg.t.cfg.s.inLCe.tSpid.enb = TRUE; cfg.t.cfg.s.inLCe.tSpid.val = 5; /* In case we want to support BRI - NORTH America, we will need to configure 8 spid's per CES */ cfg.t.cfg.s.inLCe.spid.pres = NOTPRSNT; cfg.t.cfg.s.inLCe.spid.len = 0; #endif cfg.t.cfg.s.inLCe.tRstAck.enb = TRUE; cfg.t.cfg.s.inLCe.tRstAck.val = 10; cfg.t.cfg.s.inLCe.usid = 0; cfg.t.cfg.s.inLCe.tid = 0; for(i=0;i<numCes;i++) { cfg.t.cfg.s.inLCe.ces = i; if (sng_isdn_q931_config(&pst, &cfg)) { return FTDM_FAIL; } } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span) { InMngmt cfg; Pst pst; unsigned i; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTIN; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTIN; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STDLSAP; cfg.hdr.response.selector=0; cfg.t.cfg.s.inDLSAP.sapId = signal_data->dchan_id; cfg.t.cfg.s.inDLSAP.spId = signal_data->dchan_id; cfg.t.cfg.s.inDLSAP.swtch = sng_isdn_stack_switchtype(signal_data->switchtype); cfg.t.cfg.s.inDLSAP.n201 = 1024; cfg.t.cfg.s.inDLSAP.nmbRst = 2; cfg.t.cfg.s.inDLSAP.tCbCfg = TRUE; cfg.t.cfg.s.inDLSAP.tCbId = signal_data->cc_id; if (signal_data->facility == SNGISDN_OPT_TRUE) { cfg.t.cfg.s.inDLSAP.facilityHandling = IN_FACILITY_STANDRD; } else { cfg.t.cfg.s.inDLSAP.facilityHandling = 0; } /* TODO : NFAS configuration */ cfg.t.cfg.s.inDLSAP.nfasInt = FALSE; /* pass this later */ if (!cfg.t.cfg.s.inDLSAP.nfasInt) { cfg.t.cfg.s.inDLSAP.intId = 0; cfg.t.cfg.s.inDLSAP.sigInt = 0; cfg.t.cfg.s.inDLSAP.bupInt = 0; cfg.t.cfg.s.inDLSAP.nmbNfasInt = 0; cfg.t.cfg.s.inDLSAP.buIntPr = FALSE; for (i = 0; i < IN_MAX_NMB_INTRFS; i++) cfg.t.cfg.s.inDLSAP.ctldInt[i] = IN_INT_NOT_CFGD; } else { /* Need to get these parameters from NFAS */ cfg.t.cfg.s.inDLSAP.intId = 0; cfg.t.cfg.s.inDLSAP.sigInt = 0; cfg.t.cfg.s.inDLSAP.bupInt = 1; cfg.t.cfg.s.inDLSAP.nmbNfasInt = 2; cfg.t.cfg.s.inDLSAP.buIntPr = 1; for (i = 0; i < IN_MAX_NMB_INTRFS; i++) cfg.t.cfg.s.inDLSAP.ctldInt[i] = IN_INT_NOT_CFGD; /* For primary and backup interfaces, need to initialize this array */ cfg.t.cfg.s.inDLSAP.ctldInt[0] = 0; /* This is primary if for NFAS */ cfg.t.cfg.s.inDLSAP.ctldInt[1] = 1; } cfg.t.cfg.s.inDLSAP.numRstInd = 255; cfg.t.cfg.s.inDLSAP.relOpt = TRUE; #ifdef ISDN_SRV cfg.t.cfg.s.inDLSAP.bcas = FALSE; cfg.t.cfg.s.inDLSAP.maxBSrvCnt = 2; cfg.t.cfg.s.inDLSAP.maxDSrvCnt = 2; #endif /* ISDN_SRV */ if (signal_data->switchtype == SNGISDN_SWITCH_QSIG) { cfg.t.cfg.s.inDLSAP.ackOpt = TRUE; cfg.t.cfg.s.inDLSAP.intType = SYM_USER; cfg.t.cfg.s.inDLSAP.clrGlr = TRUE; /* in case of glare, clear local call */ cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE; cfg.t.cfg.s.inDLSAP.rstOpt = FALSE; } else { if (signal_data->signalling == SNGISDN_SIGNALING_NET) { cfg.t.cfg.s.inDLSAP.ackOpt = TRUE; cfg.t.cfg.s.inDLSAP.intType = NETWORK; cfg.t.cfg.s.inDLSAP.clrGlr = FALSE; /* in case of glare, do not clear local call */ cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE; cfg.t.cfg.s.inDLSAP.rstOpt = TRUE; } else { cfg.t.cfg.s.inDLSAP.ackOpt = FALSE; cfg.t.cfg.s.inDLSAP.intType = USER; cfg.t.cfg.s.inDLSAP.clrGlr = TRUE; /* in case of glare, clear local call */ cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE; cfg.t.cfg.s.inDLSAP.rstOpt = FALSE; } } /* Override the restart options if user selected that option */ if (signal_data->restart_opt != SNGISDN_OPT_DEFAULT) { if (signal_data->restart_opt == SNGISDN_OPT_TRUE) { cfg.t.cfg.s.inDLSAP.rstOpt = TRUE; } else { cfg.t.cfg.s.inDLSAP.rstOpt = FALSE; } } for (i = 0; i < IN_MAXBCHNL; i++) { cfg.t.cfg.s.inDLSAP.bProf[i].profNmb = 0; cfg.t.cfg.s.inDLSAP.bProf[i].valid = FALSE; cfg.t.cfg.s.inDLSAP.bProf[i].state = IN_PROV_AVAIL; } if (span->trunk_type == FTDM_TRUNK_BRI_PTMP && signal_data->signalling == SNGISDN_SIGNALING_NET) { cfg.t.cfg.s.inDLSAP.nmbCes = MAX_NUM_CES_PER_LINK; } else { cfg.t.cfg.s.inDLSAP.nmbCes=1; } cfg.t.cfg.s.inDLSAP.useSubAdr = 0; /* call routing on subaddress */ #ifdef SANGOMA_ISDN_CHAN_ID_INVERT_BIT if (signal_data->switchtype == SNGISDN_SWITCH_DMS100 && g_sngisdn_data.chan_id_invert_extend_bit == SNGISDN_OPT_TRUE) { /* Since this feature is not standard, we modified Trillium to check the useSubAdr field and remove the extended bit if this is set, this is a global configuration and once set, applies to all spans configured as DMS 100 */ cfg.t.cfg.s.inDLSAP.useSubAdr = PRSNT_NODEF; } #endif cfg.t.cfg.s.inDLSAP.adrPref = 0; /* use of prefix for international calls */ cfg.t.cfg.s.inDLSAP.nmbPrefDig = 0; /* number of digits used for prefix */ for (i = 0; i < IN_MAXPREFDIG; i++) cfg.t.cfg.s.inDLSAP.prefix[i] = 0; /* address prefix */ cfg.t.cfg.s.inDLSAP.keyPad = 0; cfg.t.cfg.s.inDLSAP.wcRout = 0; for (i = 0; i < ADRLEN; i++) cfg.t.cfg.s.inDLSAP.wcMask[i] = 0; /* address prefix */ cfg.t.cfg.s.inDLSAP.sidIns = FALSE; /* SID insertion flag */ cfg.t.cfg.s.inDLSAP.sid.length = 0; /* SID */ cfg.t.cfg.s.inDLSAP.sidTon = 0; /* SID Type of Number */ cfg.t.cfg.s.inDLSAP.sidNPlan = 0; /* SID Numbering Plan */ cfg.t.cfg.s.inDLSAP.sidPresInd = FALSE; /* SID Presentation Indicator */ cfg.t.cfg.s.inDLSAP.minAdrDig = 0; /* minimum number of address digits */ cfg.t.cfg.s.inDLSAP.srvOpt = FALSE; cfg.t.cfg.s.inDLSAP.callId.len = 0; /* default call id */ cfg.t.cfg.s.inDLSAP.redirSubsc = FALSE; /* subscription to call redirection */ cfg.t.cfg.s.inDLSAP.redirAdr.eh.pres = NOTPRSNT; /* redirAdr Numbering Plan */ cfg.t.cfg.s.inDLSAP.forwSubsc = FALSE; /* programmed forwarding subscription */ cfg.t.cfg.s.inDLSAP.cndSubsc = TRUE; /* calling adddress delivery service subscription */ cfg.t.cfg.s.inDLSAP.tmr.t301.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t301.val = 180; if (signal_data->timer_t301 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t301.val = signal_data->timer_t301; } /* It looks like ETSI is the only variant that supports Overlap */ if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN) { cfg.t.cfg.s.inDLSAP.tmr.t302.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t302.val = 15; } else { cfg.t.cfg.s.inDLSAP.tmr.t302.enb = FALSE; cfg.t.cfg.s.inDLSAP.tmr.t302.val = 0; } if (signal_data->timer_t302 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t302.val = signal_data->timer_t302; } cfg.t.cfg.s.inDLSAP.tmr.t303.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t303.val = 4; if (signal_data->timer_t303 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t303.val = signal_data->timer_t303; } cfg.t.cfg.s.inDLSAP.tmr.t304.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t304.val = 30; if (signal_data->timer_t304 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t304.val = signal_data->timer_t304; } cfg.t.cfg.s.inDLSAP.tmr.t305.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t305.val = 30; if (signal_data->timer_t305 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t305.val = signal_data->timer_t305; } cfg.t.cfg.s.inDLSAP.tmr.t306.enb = FALSE; cfg.t.cfg.s.inDLSAP.tmr.t306.val = 35; if (signal_data->timer_t306 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t306.val = signal_data->timer_t306; } cfg.t.cfg.s.inDLSAP.tmr.t307.enb = FALSE; cfg.t.cfg.s.inDLSAP.tmr.t307.val = 35; if (signal_data->timer_t307 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t307.val = signal_data->timer_t307; } cfg.t.cfg.s.inDLSAP.tmr.t308.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t308.val = 4; if (signal_data->timer_t308 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t308.val = signal_data->timer_t308; } if (signal_data->signalling == SNGISDN_SIGNALING_NET) { cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t310.val = 10; cfg.t.cfg.s.inDLSAP.tmr.t312.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t312.val = cfg.t.cfg.s.inDLSAP.tmr.t303.val+2; } else { cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t310.val = 120; cfg.t.cfg.s.inDLSAP.tmr.t312.enb = FALSE; } if (signal_data->timer_t310 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t310.val = signal_data->timer_t310; } if (signal_data->timer_t312 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t312.val = signal_data->timer_t312; } cfg.t.cfg.s.inDLSAP.tmr.t313.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t313.val = 4; if (signal_data->timer_t313 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t313.val = signal_data->timer_t313; } cfg.t.cfg.s.inDLSAP.tmr.t316.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t316.val = 120; if (signal_data->timer_t316 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t316.val = signal_data->timer_t316; } cfg.t.cfg.s.inDLSAP.tmr.t316c.enb = FALSE; cfg.t.cfg.s.inDLSAP.tmr.t316c.val = 35; cfg.t.cfg.s.inDLSAP.tmr.t318.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t318.val = 4; if (signal_data->timer_t318 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t318.val = signal_data->timer_t318; } cfg.t.cfg.s.inDLSAP.tmr.t319.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t319.val = 4; if (signal_data->timer_t319 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t319.val = signal_data->timer_t319; } cfg.t.cfg.s.inDLSAP.tmr.t322.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t322.val = 4; if (signal_data->timer_t322 > 0) { cfg.t.cfg.s.inDLSAP.tmr.t322.val = signal_data->timer_t322; } cfg.t.cfg.s.inDLSAP.tmr.t332.enb = FALSE; cfg.t.cfg.s.inDLSAP.tmr.t332.val = 35; cfg.t.cfg.s.inDLSAP.tmr.tRst.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.tRst.val = 8; cfg.t.cfg.s.inDLSAP.tmr.tAns.enb = FALSE; /* non-standard timer */ cfg.t.cfg.s.inDLSAP.tmr.t396.enb = FALSE; /* non-standard timer */ cfg.t.cfg.s.inDLSAP.tmr.t397.enb = TRUE; /* non-standard timer */ cfg.t.cfg.s.inDLSAP.tmr.tProg.enb= TRUE; cfg.t.cfg.s.inDLSAP.tmr.tProg.val= 35; #ifdef NI2 #ifdef NI2_TREST cfg.t.cfg.s.inDLSAP.tmr.tRest.enb= FALSE; cfg.t.cfg.s.inDLSAP.tmr.tRest.val= 35; /* tRest timer for NI2 */ #endif /* NI2_TREST */ #endif /* NI2 */ cfg.t.cfg.s.inDLSAP.dstEnt = ENTLD; cfg.t.cfg.s.inDLSAP.dstInst = S_INST; cfg.t.cfg.s.inDLSAP.dstProcId = SFndProcId(); cfg.t.cfg.s.inDLSAP.prior = PRIOR0; cfg.t.cfg.s.inDLSAP.route = RTESPEC; cfg.t.cfg.s.inDLSAP.selector = 0; cfg.t.cfg.s.inDLSAP.mem.region = S_REG; cfg.t.cfg.s.inDLSAP.mem.pool = S_POOL; switch (span->trunk_type) { case FTDM_TRUNK_E1: cfg.t.cfg.s.inDLSAP.dChannelNum = 16; cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_E1_CHANNELS_PER_SPAN; cfg.t.cfg.s.inDLSAP.firstBChanNum = 0; cfg.t.cfg.s.inDLSAP.callRefLen = 2; cfg.t.cfg.s.inDLSAP.teiAlloc = IN_STATIC; cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_PTPT; break; case FTDM_TRUNK_T1: case FTDM_TRUNK_J1: /* if NFAS, could be 0 if no signalling */ cfg.t.cfg.s.inDLSAP.dChannelNum = 24; cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_T1_CHANNELS_PER_SPAN; cfg.t.cfg.s.inDLSAP.firstBChanNum = 1; cfg.t.cfg.s.inDLSAP.callRefLen = 2; cfg.t.cfg.s.inDLSAP.teiAlloc = IN_STATIC; cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_PTPT; break; case FTDM_TRUNK_BRI: cfg.t.cfg.s.inDLSAP.dChannelNum = 0; /* Unused for BRI */ cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_BRI_CHANNELS_PER_SPAN; cfg.t.cfg.s.inDLSAP.firstBChanNum = 1; cfg.t.cfg.s.inDLSAP.callRefLen = 1; cfg.t.cfg.s.inDLSAP.teiAlloc = IN_STATIC; cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_PTPT; break; case FTDM_TRUNK_BRI_PTMP: cfg.t.cfg.s.inDLSAP.dChannelNum = 0; /* Unused for BRI */ cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_BRI_CHANNELS_PER_SPAN; cfg.t.cfg.s.inDLSAP.firstBChanNum = 1; cfg.t.cfg.s.inDLSAP.callRefLen = 1; cfg.t.cfg.s.inDLSAP.teiAlloc = IN_DYNAMIC; cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_MULTI; break; default: ftdm_log(FTDM_LOG_ERROR, "%s: Unsupported trunk_type\n", span->name); return FTDM_FAIL; } if (sng_isdn_q931_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
/* Link between CC and q931 */ ftdm_status_t sngisdn_stack_cfg_q931_tsap(ftdm_span_t *span) { InMngmt cfg; Pst pst; unsigned i; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTIN; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTIN; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STTSAP; cfg.t.cfg.s.inTSAP.sapId = signal_data->cc_id; cfg.t.cfg.s.inTSAP.prior = PRIOR0; cfg.t.cfg.s.inTSAP.route = RTESPEC; cfg.t.cfg.s.inTSAP.swtch = sng_isdn_stack_switchtype(signal_data->switchtype); cfg.t.cfg.s.inTSAP.useSubAdr = 0; /* call routing on subaddress */ cfg.t.cfg.s.inTSAP.adrPref = 0; /* use of prefix for int'l calls */ cfg.t.cfg.s.inTSAP.nmbPrefDig = 0; /* number of digits used for prefix */ for (i = 0; i < IN_MAXPREFDIG; i++) cfg.t.cfg.s.inTSAP.prefix[i] = 0; /* address prefix */ cfg.t.cfg.s.inTSAP.keyPad = 0; cfg.t.cfg.s.inTSAP.wcRout = 0; for (i = 0; i < ADRLEN; i++) cfg.t.cfg.s.inTSAP.wcMask[i] = 0; /* address prefix */ cfg.t.cfg.s.inTSAP.sidIns = FALSE; /* SID insertion Flag */ cfg.t.cfg.s.inTSAP.sid.length = 0; /* SID */ cfg.t.cfg.s.inTSAP.sidTon = 0; /* SID Type of Number */ cfg.t.cfg.s.inTSAP.sidNPlan = 0; /* SID Numbering Plan */ cfg.t.cfg.s.inTSAP.callId.len = 0; /* Default Call Identity */ cfg.t.cfg.s.inTSAP.minAdrDig = 0; /* Minimum number of address digits */ cfg.t.cfg.s.inTSAP.comptChck = FALSE; /* Validate compatibility */ cfg.t.cfg.s.inTSAP.nmbApplProf = 0; /* Number of application profiles */ cfg.t.cfg.s.inTSAP.profNmb[0] = 0; /* Application profiles */ cfg.t.cfg.s.inTSAP.mem.region = S_REG; cfg.t.cfg.s.inTSAP.mem.pool = S_POOL; cfg.t.cfg.s.inTSAP.selector = 0; if (sng_isdn_q931_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_q921_dlsap(ftdm_span_t *span, uint8_t management) { BdMngmt cfg; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTLD; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); /*fill in the specific fields of the header*/ cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTLD; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STDLSAP; cfg.t.cfg.s.bdDLSAP.lnkNmb = signal_data->dchan_id; cfg.t.cfg.s.bdDLSAP.n201 = 1028; /* n201 */ if (span->trunk_type == FTDM_TRUNK_BRI_PTMP || span->trunk_type == FTDM_TRUNK_BRI) { cfg.t.cfg.s.bdDLSAP.k = 1; /* Based on q.921 recommendations */ } else { cfg.t.cfg.s.bdDLSAP.k = 7; /* k */ } cfg.t.cfg.s.bdDLSAP.n200 = 3; /* n200 */ cfg.t.cfg.s.bdDLSAP.congTmr = 300; /* congestion timer */ cfg.t.cfg.s.bdDLSAP.t200Tmr = 3; /* t1 changed from 25 */ cfg.t.cfg.s.bdDLSAP.t203Tmr = 10; /* t3 changed from 50 */ cfg.t.cfg.s.bdDLSAP.mod = 128; /* modulo */ cfg.t.cfg.s.bdDLSAP.selector = 0; /* Selector 0 */ cfg.t.cfg.s.bdDLSAP.mem.region = S_REG; /* Memory region */ cfg.t.cfg.s.bdDLSAP.mem.pool = S_POOL; /* Memory pool */ cfg.t.cfg.s.bdDLSAP.prior = PRIOR0; /* Priority */ cfg.t.cfg.s.bdDLSAP.route = RTESPEC; /* Route */ if (management) { cfg.t.cfg.s.bdDLSAP.sapi = MNGMT_SAPI; cfg.t.cfg.s.bdDLSAP.teiAss = NON_AUTOMATIC; /* static tei assignment */ cfg.t.cfg.s.bdDLSAP.noOfDlc = 1; cfg.t.cfg.s.bdDLSAP.tei[0] = 0x7f; } else { cfg.t.cfg.s.bdDLSAP.sapi = Q930_SAPI; if (span->trunk_type == FTDM_TRUNK_BRI_PTMP) { if (signal_data->signalling == SNGISDN_SIGNALING_NET) { cfg.t.cfg.s.bdDLSAP.teiAss = AUTOMATIC; cfg.t.cfg.s.bdDLSAP.noOfDlc = 8; cfg.t.cfg.s.bdDLSAP.tei[0] = 64; cfg.t.cfg.s.bdDLSAP.tei[1] = 65; cfg.t.cfg.s.bdDLSAP.tei[2] = 66; cfg.t.cfg.s.bdDLSAP.tei[3] = 67; cfg.t.cfg.s.bdDLSAP.tei[4] = 68; cfg.t.cfg.s.bdDLSAP.tei[5] = 69; cfg.t.cfg.s.bdDLSAP.tei[6] = 70; cfg.t.cfg.s.bdDLSAP.tei[7] = 71; } else { cfg.t.cfg.s.bdDLSAP.teiAss = AUTOMATIC; cfg.t.cfg.s.bdDLSAP.noOfDlc = 1; } } else { /* Point to point configs */ cfg.t.cfg.s.bdDLSAP.teiAss = NON_AUTOMATIC; cfg.t.cfg.s.bdDLSAP.noOfDlc = 1; cfg.t.cfg.s.bdDLSAP.tei[0] = signal_data->tei; } } if (sng_isdn_q921_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }
ftdm_status_t sngisdn_stack_cfg_q921_msap(ftdm_span_t *span) { BdMngmt cfg; Pst pst; sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data; /* initalize the post structure */ stack_pst_init(&pst); /* insert the destination Entity */ pst.dstEnt = ENTLD; /*clear the configuration structure*/ memset(&cfg, 0, sizeof(cfg)); /*fill in some general sections of the header*/ stack_hdr_init(&cfg.hdr); cfg.hdr.msgType = TCFG; cfg.hdr.entId.ent = ENTLD; cfg.hdr.entId.inst = S_INST; cfg.hdr.elmId.elmnt = STMSAP; cfg.t.cfg.s.bdMSAP.lnkNmb = signal_data->dchan_id; cfg.t.cfg.s.bdMSAP.maxOutsFrms = 24; /* MAC window */ cfg.t.cfg.s.bdMSAP.tQUpperTrs = 32; /* Tx Queue Upper Threshold */ cfg.t.cfg.s.bdMSAP.tQLowerTrs = 24; /* Tx Queue Lower Threshold */ cfg.t.cfg.s.bdMSAP.selector = 0; /* Selector 0 */ /* TODO: check if bdMSAP parameters can be initialized by calling stack_pst_init */ cfg.t.cfg.s.bdMSAP.mem.region = S_REG; /* Memory region */ cfg.t.cfg.s.bdMSAP.mem.pool = S_POOL; /* Memory pool */ cfg.t.cfg.s.bdMSAP.prior = PRIOR0; /* Priority */ cfg.t.cfg.s.bdMSAP.route = RTESPEC; /* Route */ cfg.t.cfg.s.bdMSAP.dstProcId = SFndProcId(); /* destination proc id */ cfg.t.cfg.s.bdMSAP.dstEnt = ENTL1; /* entity */ cfg.t.cfg.s.bdMSAP.dstInst = S_INST; /* instance */ cfg.t.cfg.s.bdMSAP.t201Tmr = 1; /* T201 - should be equal to t200Tmr */ cfg.t.cfg.s.bdMSAP.t202Tmr = 2; /* T202 */ cfg.t.cfg.s.bdMSAP.bndRetryCnt = 2; /* bind retry counter */ cfg.t.cfg.s.bdMSAP.tIntTmr = 200; /* bind retry timer */ cfg.t.cfg.s.bdMSAP.n202 = 3; /* N202 */ cfg.t.cfg.s.bdMSAP.lowTei = 64; /* Lowest dynamic TEI */ if (span->trunk_type == FTDM_TRUNK_BRI_PTMP && signal_data->signalling == SNGISDN_SIGNALING_NET) { cfg.t.cfg.s.bdMSAP.kpL1Up = FALSE; /* flag to keep l1 up or not */ } else { cfg.t.cfg.s.bdMSAP.kpL1Up = TRUE; /* flag to keep l1 up or not */ } switch(signal_data->switchtype) { case SNGISDN_SWITCH_NI2: case SNGISDN_SWITCH_5ESS: case SNGISDN_SWITCH_4ESS: case SNGISDN_SWITCH_DMS100: cfg.t.cfg.s.bdMSAP.type = SW_NI2; break; case SNGISDN_SWITCH_INSNET: cfg.t.cfg.s.bdMSAP.type = SW_CCITT; break; case SNGISDN_SWITCH_EUROISDN: case SNGISDN_SWITCH_QSIG: cfg.t.cfg.s.bdMSAP.type = SW_ETSI; break; } if (span->trunk_type == FTDM_TRUNK_BRI_PTMP) { cfg.t.cfg.s.bdMSAP.teiChkTmr = 20; /* Tei check timer */ } else { cfg.t.cfg.s.bdMSAP.teiChkTmr = 0; /* Tei check timer */ } if (signal_data->signalling == SNGISDN_SIGNALING_NET) { cfg.t.cfg.s.bdMSAP.logInt = 1; /* logical interface = 0 = user, 1= network */ cfg.t.cfg.s.bdMSAP.setUpArb = PASSIVE; /* set up arbitration */ } else { cfg.t.cfg.s.bdMSAP.logInt = 0; /* logical interface = 0 = user, 1= network */ cfg.t.cfg.s.bdMSAP.setUpArb = ACTIVE; /* set up arbitration */ } /* Overwrite setUpArb value if user forced it */ if (signal_data->setup_arb == SNGISDN_OPT_TRUE) { cfg.t.cfg.s.bdMSAP.setUpArb = ACTIVE; } else if (signal_data->setup_arb == SNGISDN_OPT_FALSE) { cfg.t.cfg.s.bdMSAP.setUpArb = PASSIVE; } if (sng_isdn_q921_config(&pst, &cfg)) { return FTDM_FAIL; } return FTDM_SUCCESS; }