]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: adding variables for ansi outgoing IAMs
authorJames Zhang <jzhang@sangoma.com>
Fri, 27 Jul 2012 15:53:00 +0000 (11:53 -0400)
committerJames Zhang <jzhang@sangoma.com>
Fri, 27 Jul 2012 15:53:00 +0000 (11:53 -0400)
         . added called party number INN variable
           ie. <action application="export" data="freetdm_ss7_cld_inn=0"/>
         . added multiple variables to set User Service Information IE
           variables are :
              ss7_iam_usi_trans_cap
              ss7_iam_usi_code_standard
              ss7_iam_usi_trans_mode
              ss7_iam_usi_trans_rate_0
              ss7_iam_usi_trans_rate_1
              ss7_iam_usi_layer1_ident
              ss7_iam_usi_layer1_prot
              ss7_iam_usi_layer2_ident
              ss7_iam_usi_layer2_prot
              ss7_iam_usi_layer3_ident
              ss7_iam_usi_layer3_prot
              ss7_iam_usi_chan_struct
              ss7_iam_usi_config
              ss7_iam_usi_establish
              ss7_iam_usi_symmetry
              ss7_iam_usi_rate_multiplier

         . ss7_iam_usi_trans_cap is a string variable, the others are all integers
         . ss7_iam_usi_trans_cap has options of :
              - SPEECH
              - UNRESTRICTED
              - RESTRICTED
              - 31KHZ
              - 7KHZ
              - 15KHZ
              - VIDEO
           default value is SPEECH, if the parameter is wrong, set to SPEECH. If not
           set, this field is not present

libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c

index 032ea8efd798e9e40a6fad259f4416c0a131f6a2..2e51ba86747e592663b0b364195afbd7e7454d7d 100644 (file)
@@ -213,17 +213,17 @@ ftdm_status_t copy_cdPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cd
 
 ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPtyNum)
 {
-       const char      *cld_nadi = NULL;
+       char    *val = NULL;
        ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
        sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
 
        cdPtyNum->eh.pres                  = PRSNT_NODEF;
 
        cdPtyNum->natAddrInd.pres   = PRSNT_NODEF;
-       cld_nadi = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi");
-       if (!ftdm_strlen_zero(cld_nadi)) {
-               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called NADI value \"%s\"\n", cld_nadi);
-               cdPtyNum->natAddrInd.val        = atoi(cld_nadi);
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_nadi");
+       if (!ftdm_strlen_zero(val)) {
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called NADI value \"%s\"\n", val);
+               cdPtyNum->natAddrInd.val        = atoi(val);
        } else {
                cdPtyNum->natAddrInd.val        = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cld_nadi;
                ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied NADI value found for CLD, using \"%d\"\n", cdPtyNum->natAddrInd.val);
@@ -233,7 +233,14 @@ ftdm_status_t copy_cdPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCdPtyNum *cdPt
        cdPtyNum->numPlan.val      = 0x01;
 
        cdPtyNum->innInd.pres      = PRSNT_NODEF;
-       cdPtyNum->innInd.val            = 0x01;
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_inn");
+       if (!ftdm_strlen_zero(val)) {
+               cdPtyNum->innInd.val            = atoi(val);
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called INN value \"%s\"\n", val);
+       } else {
+               cdPtyNum->innInd.val            = 0x01;
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Called INN value, set to default value 0x01\n");
+       }
        
        return copy_tknStr_to_sngss7(caller_data->dnis.digits, &cdPtyNum->addrSig, &cdPtyNum->oddEven);
 }
@@ -1240,32 +1247,194 @@ ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMe
 
 ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA)
 {
-       usrServInfoA->eh.pres                   = PRSNT_NODEF;
-
-       usrServInfoA->infoTranCap.pres  = PRSNT_NODEF;
-
-       usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, ITC_SPEECH);
-
-       usrServInfoA->cdeStand.pres                     = PRSNT_NODEF;
-       usrServInfoA->cdeStand.val                      = 0x0;                          /* ITU-T standardized coding */
-       usrServInfoA->tranMode.pres                     = PRSNT_NODEF;
-       usrServInfoA->tranMode.val                      = 0x0;                          /* circuit mode */
-       usrServInfoA->infoTranRate0.pres                = PRSNT_NODEF;
-       usrServInfoA->infoTranRate0.val         = 0x10;                         /* 64kbps origination to destination */
-       usrServInfoA->infoTranRate1.pres                = PRSNT_NODEF;
-       usrServInfoA->infoTranRate1.val         = 0x10;                         /* 64kbps destination to origination */
-       usrServInfoA->chanStruct.pres           = PRSNT_NODEF;
-       usrServInfoA->chanStruct.val                    = 0x1;                          /* 8kHz integrity */
-       usrServInfoA->config.pres                       = PRSNT_NODEF;
-       usrServInfoA->config.val                                = 0x0;                          /* point to point configuration */
-       usrServInfoA->establish.pres                    = PRSNT_NODEF;
-       usrServInfoA->establish.val                     = 0x0;                          /* on demand */
-       usrServInfoA->symmetry.pres                     = PRSNT_NODEF;
-       usrServInfoA->symmetry.val                      = 0x0;                          /* bi-directional symmetric */
-       usrServInfoA->usrInfLyr1Prot.pres       = PRSNT_NODEF;
-       usrServInfoA->usrInfLyr1Prot.val                = 0x2;                          /* G.711 ulaw */
-       usrServInfoA->rateMultiplier.pres       = PRSNT_NODEF;
-       usrServInfoA->rateMultiplier.val                = 0x1;                          /* 1x rate multipler */
+       int bProceed = 0;
+       const char *val = NULL;
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_cap");
+       if (!ftdm_strlen_zero(val)) {
+               int itc_type = 0;
+               if (!strcasecmp(val, "SPEECH")) {
+                       itc_type = ITC_SPEECH;
+               } else if (!strcasecmp(val, "UNRESTRICTED")) {
+                       itc_type = ITC_UNRDIG;
+               } else if (!strcasecmp(val, "RESTRICTED")) {
+                       itc_type = ITC_RESDIG;
+               } else if (!strcasecmp(val, "31KHZ")) {
+                       itc_type = ITC_A31KHZ;
+               } else if (!strcasecmp(val, "7KHZ")) {
+                       itc_type = ITC_A7KHZ;
+               } else if (!strcasecmp(val, "15KHZ")) {
+                       itc_type = ITC_A15KHZ;
+               } else if (!strcasecmp(val, "VIDEO")) {
+                       itc_type = ITC_VIDEO;
+               } else {
+                       itc_type = ITC_SPEECH;
+                       ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI transmission capability parameter is wrong : %s. Setting to default SPEECH. \n", val );
+               }
+               
+               usrServInfoA->infoTranCap.pres  = PRSNT_NODEF;
+               usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, itc_type);
+               bProceed = 1;           
+       } else {
+               usrServInfoA->infoTranCap.pres  = NOTPRSNT;
+       }
+
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_code_standard");
+       if (!ftdm_strlen_zero(val)) {           
+               usrServInfoA->cdeStand.pres                     = PRSNT_NODEF;
+               usrServInfoA->cdeStand.val                      = (int)atoi(val);       /* default is 0x0 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI coding standard = %d\n", usrServInfoA->cdeStand.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->cdeStand.pres                     = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_mode");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->tranMode.pres                     = PRSNT_NODEF;
+               usrServInfoA->tranMode.val                      = (int)atoi(val);                               /* transfer mode, default is 0x0*/
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI transfer mode = %d\n", usrServInfoA->tranMode.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->tranMode.pres                     = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_rate_0");        
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->infoTranRate0.pres                = PRSNT_NODEF;
+               usrServInfoA->infoTranRate0.val         = (int)atoi(val);                       /* default is 0x10, 64kbps origination to destination*/
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI trans rate 0 = %d\n", usrServInfoA->infoTranRate0.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->infoTranRate0.pres                = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_trans_rate_1");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->infoTranRate1.pres                = PRSNT_NODEF;
+               usrServInfoA->infoTranRate1.val         = (int)atoi(val);                       /* 64kbps destination to origination, default is 0x10 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI trans rate 1 = %d\n", usrServInfoA->infoTranRate1.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->infoTranRate1.pres                = NOTPRSNT;
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer1_ident");
+       if (!ftdm_strlen_zero(val)) {           
+               usrServInfoA->lyr1Ident.pres                    = PRSNT_NODEF;
+               usrServInfoA->lyr1Ident.val                     = (int)atoi(val);               /*default value is 0x01 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 1 indentification = %d\n", usrServInfoA->lyr1Ident.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->lyr1Ident.pres                    = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer1_prot");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->usrInfLyr1Prot.pres               = PRSNT_NODEF;
+               usrServInfoA->usrInfLyr1Prot.val                = (int)atoi(val);               /*default value is 0x02 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 1 protocol = %d\n", usrServInfoA->usrInfLyr1Prot.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->usrInfLyr1Prot.pres               = NOTPRSNT;
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer2_ident");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->lyr2Ident.pres                    = PRSNT_NODEF;
+               usrServInfoA->lyr2Ident.val                     = (int)atoi(val);               /*default value is 0x01 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 2 indentification = %d\n", usrServInfoA->lyr2Ident.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->lyr2Ident.pres                    = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer2_prot");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->usrInfLyr2Prot.pres               = PRSNT_NODEF;
+               usrServInfoA->usrInfLyr2Prot.val                = (int)atoi(val);               /*default value is 0x02 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 2 protocol = %d\n", usrServInfoA->usrInfLyr2Prot.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->usrInfLyr2Prot.pres               = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer3_ident");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->lyr3Ident.pres                    = PRSNT_NODEF;
+               usrServInfoA->lyr3Ident.val                     = (int)atoi(val);               /*default value is 0x01 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 3 indentification = %d\n", usrServInfoA->lyr3Ident.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->lyr3Ident.pres                    = NOTPRSNT;
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_layer3_prot");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->usrInfLyr3Prot.pres               = PRSNT_NODEF;
+               usrServInfoA->usrInfLyr3Prot.val                = (int)atoi(val);               /*default value is 0x02 */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI layer 3 protocol = %d\n", usrServInfoA->usrInfLyr3Prot.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->usrInfLyr3Prot.pres               = NOTPRSNT;
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_chan_struct");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->chanStruct.pres                   = PRSNT_NODEF;
+               usrServInfoA->chanStruct.val                    = (int)atoi(val);                          /* default value is 0x1, 8kHz integrity */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI channel structure = %d\n", usrServInfoA->chanStruct.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->chanStruct.pres                   = NOTPRSNT;
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_config");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->config.pres                               = PRSNT_NODEF;
+               usrServInfoA->config.val                                = (int)atoi(val);                          /* default value is 0x0, point to point configuration */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI configuration = %d\n", usrServInfoA->config.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->config.pres                               = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_establish");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->establish.pres                    = PRSNT_NODEF;
+               usrServInfoA->establish.val                     = (int)atoi(val);                           /* default value is 0x0, on demand */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI establishment = %d\n", usrServInfoA->establish.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->establish.pres                    = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_symmetry");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->symmetry.pres                     = PRSNT_NODEF;
+               usrServInfoA->symmetry.val                      = (int)atoi(val);                           /* default value is 0x0, bi-directional symmetric */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI symmetry = %d\n", usrServInfoA->symmetry.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->symmetry.pres                     = NOTPRSNT;     
+       }
+       
+       val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam_usi_rate_multiplier");
+       if (!ftdm_strlen_zero(val)) {
+               usrServInfoA->rateMultiplier.pres               = PRSNT_NODEF;
+               usrServInfoA->rateMultiplier.val                = (int)atoi(val);                           /* default value is 0x1, 1x rate multipler */
+               ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "USI rate multipier = %d\n", usrServInfoA->rateMultiplier.val );
+               bProceed = 1;
+       } else {
+               usrServInfoA->rateMultiplier.pres               = NOTPRSNT;
+       }
+       
+       if (bProceed) {
+               usrServInfoA->eh.pres                           = PRSNT_NODEF;
+       } else {
+               usrServInfoA->eh.pres                           = NOTPRSNT;
+       }
+
        return FTDM_SUCCESS;
 }