root/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c

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

DEFINITIONS

This source file includes following definitions.
  1. ft_to_sngss7_iam
  2. ft_to_sngss7_acm
  3. ft_to_sngss7_anm
  4. ft_to_sngss7_rel
  5. ft_to_sngss7_rlc
  6. ft_to_sngss7_rsc
  7. ft_to_sngss7_rsca
  8. ft_to_sngss7_blo
  9. ft_to_sngss7_bla
  10. ft_to_sngss7_ubl
  11. ft_to_sngss7_uba
  12. ft_to_sngss7_lpa
  13. ft_to_sngss7_gra
  14. ft_to_sngss7_grs
  15. ft_to_sngss7_cgba
  16. ft_to_sngss7_cgua
  17. ft_to_sngss7_cgb
  18. ft_to_sngss7_cgu

   1 /*
   2  * Copyright (c) 2009, Konrad Hammel <konrad@sangoma.com>
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  *
   9  * * Redistributions of source code must retain the above copyright
  10  * notice, this list of conditions and the following disclaimer.
  11  *
  12  * * Redistributions in binary form must reproduce the above copyright
  13  * notice, this list of conditions and the following disclaimer in the
  14  * documentation and/or other materials provided with the distribution.
  15  *
  16  * * Neither the name of the original author; nor the names of any contributors
  17  * may be used to endorse or promote products derived from this software
  18  * without specific prior written permission.
  19  *
  20  *
  21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  24  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
  25  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  26  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  27  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  28  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  29  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  30  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  31  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32  */
  33 
  34 /* INCLUDE ********************************************************************/
  35 #include "ftmod_sangoma_ss7_main.h"
  36 /******************************************************************************/
  37 
  38 /* DEFINES ********************************************************************/
  39 /******************************************************************************/
  40 
  41 /* GLOBALS ********************************************************************/
  42 /******************************************************************************/
  43 
  44 /* PROTOTYPES *****************************************************************/
  45 void ft_to_sngss7_iam(ftdm_channel_t * ftdmchan);
  46 void ft_to_sngss7_acm(ftdm_channel_t * ftdmchan);
  47 void ft_to_sngss7_anm(ftdm_channel_t * ftdmchan);
  48 void ft_to_sngss7_rel(ftdm_channel_t * ftdmchan);
  49 void ft_to_sngss7_rlc(ftdm_channel_t * ftdmchan);
  50 
  51 void ft_to_sngss7_rsc(ftdm_channel_t * ftdmchan);
  52 void ft_to_sngss7_rsca(ftdm_channel_t * ftdmchan);
  53 
  54 void ft_to_sngss7_blo(ftdm_channel_t * ftdmchan);
  55 void ft_to_sngss7_bla(ftdm_channel_t * ftdmchan);
  56 void ft_to_sngss7_ubl(ftdm_channel_t * ftdmchan);
  57 void ft_to_sngss7_uba(ftdm_channel_t * ftdmchan);
  58 
  59 void ft_to_sngss7_lpa(ftdm_channel_t * ftdmchan);
  60 
  61 void ft_to_sngss7_gra(ftdm_channel_t * ftdmchan);
  62 void ft_to_sngss7_grs(ftdm_channel_t * ftdmchan);
  63 
  64 void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan);
  65 void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan);
  66 
  67 void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan);
  68 void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan);
  69 /******************************************************************************/
  70 
  71 /* FUNCTIONS ******************************************************************/
  72 void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
  73 {
  74         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
  75         
  76         sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;;
  77         const char                      *clg_nadi = NULL;
  78         const char                      *cld_nadi = NULL;
  79         const char                      *clg_subAddr = NULL;
  80         const char                      *cld_subAddr = NULL;
  81         char                            subAddrIE[MAX_SIZEOF_SUBADDR_IE];
  82         SiConEvnt                       iam;
  83         
  84         sngss7_info->suInstId   = get_unique_id ();
  85         sngss7_info->spInstId   = 0;
  86         sngss7_info->spId               = 1;
  87         
  88         memset (&iam, 0x0, sizeof (iam));
  89         
  90         /* copy down the nature of connection indicators */
  91         iam.natConInd.eh.pres                           = PRSNT_NODEF;
  92         iam.natConInd.satInd.pres                       = PRSNT_NODEF;
  93         iam.natConInd.satInd.val                        = 0; /* no satellite circuit */
  94         iam.natConInd.contChkInd.pres           = PRSNT_NODEF;
  95         iam.natConInd.contChkInd.val            = CONTCHK_NOTREQ;
  96         iam.natConInd.echoCntrlDevInd.pres      = PRSNT_NODEF;
  97         iam.natConInd.echoCntrlDevInd.val       = ECHOCDEV_INCL;
  98         
  99         /* copy down the forward call indicators */
 100         iam.fwdCallInd.eh.pres                          = PRSNT_NODEF;
 101         iam.fwdCallInd.natIntCallInd.pres       = PRSNT_NODEF;
 102         iam.fwdCallInd.natIntCallInd.val        = 0x00;
 103         iam.fwdCallInd.end2EndMethInd.pres      = PRSNT_NODEF;
 104         iam.fwdCallInd.end2EndMethInd.val       = E2EMTH_NOMETH;
 105         iam.fwdCallInd.intInd.pres                      = PRSNT_NODEF;
 106         iam.fwdCallInd.intInd.val                       = INTIND_NOINTW;
 107         iam.fwdCallInd.end2EndInfoInd.pres      = PRSNT_NODEF;
 108         iam.fwdCallInd.end2EndInfoInd.val       = E2EINF_NOINFO;
 109         iam.fwdCallInd.isdnUsrPrtInd.pres       = PRSNT_NODEF;
 110         iam.fwdCallInd.isdnUsrPrtInd.val        = ISUP_USED;
 111         iam.fwdCallInd.isdnUsrPrtPrfInd.pres = PRSNT_NODEF;
 112         iam.fwdCallInd.isdnUsrPrtPrfInd.val = PREF_PREFAW;
 113         iam.fwdCallInd.isdnAccInd.pres          = PRSNT_NODEF;
 114         iam.fwdCallInd.isdnAccInd.val           = ISDNACC_ISDN;
 115         iam.fwdCallInd.sccpMethInd.pres         = PRSNT_NODEF;
 116         iam.fwdCallInd.sccpMethInd.val          = SCCPMTH_NOIND;
 117         
 118         /* copy down the calling number information */
 119         iam.cgPtyCat.eh.pres                            = PRSNT_NODEF;
 120         iam.cgPtyCat.cgPtyCat.pres                      = PRSNT_NODEF;
 121         iam.cgPtyCat.cgPtyCat.val                       = CAT_ORD;      /* ordinary suscriber */
 122         
 123         /* copy down the transmission medium requirements */
 124         iam.txMedReq.eh.pres                            = PRSNT_NODEF;
 125         iam.txMedReq.trMedReq.pres                      = PRSNT_NODEF;
 126         iam.txMedReq.trMedReq.val                       = ftdmchan->caller_data.bearer_capability;
 127 
 128         if ((g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].switchType == LSI_SW_ANS88) ||
 129                 (g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].switchType == LSI_SW_ANS92) ||
 130                 (g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].switchType == LSI_SW_ANS95)) {
 131 
 132                 /* include only if we're running ANSI */
 133                 iam.fwdCallInd.transCallNInd.pres   = PRSNT_NODEF;
 134                 iam.fwdCallInd.transCallNInd.val    = 0x0;
 135 
 136                 iam.usrServInfoA.eh.pres                                = PRSNT_NODEF;
 137 
 138                 iam.usrServInfoA.infoTranCap.pres               = PRSNT_NODEF;
 139                 switch (ftdmchan->caller_data.bearer_capability) {
 140                 /**********************************************************************/
 141                 case (FTDM_BEARER_CAP_SPEECH):
 142                         iam.usrServInfoA.infoTranCap.val        = 0x0;                  /* speech as per ATIS-1000113.3.2005 */
 143                         break;
 144                 /**********************************************************************/
 145                 case (FTDM_BEARER_CAP_64K_UNRESTRICTED):
 146                         iam.usrServInfoA.infoTranCap.val        = 0x8;                  /* unrestricted digital as per ATIS-1000113.3.2005 */
 147                         break;
 148                 /**********************************************************************/
 149                 case (FTDM_BEARER_CAP_3_1KHZ_AUDIO):
 150                         iam.usrServInfoA.infoTranCap.val        = 0x10;                 /* 3.1kHz audio as per ATIS-1000113.3.2005 */
 151                         break;
 152                 /**********************************************************************/
 153                 default:
 154                         SS7_ERROR_CHAN(ftdmchan, "Unknown Bearer capability falling back to speech%s\n", " ");
 155                         iam.usrServInfoA.infoTranCap.val        = 0x0;                  /* speech as per ATIS-1000113.3.2005 */
 156                         break;
 157                 /**********************************************************************/
 158                 } /* switch (ftdmchan->caller_data.bearer_capability) */
 159 
 160                 iam.usrServInfoA.cdeStand.pres                  = PRSNT_NODEF;
 161                 iam.usrServInfoA.cdeStand.val                   = 0x0;                          /* ITU-T standardized coding */
 162                 iam.usrServInfoA.tranMode.pres                  = PRSNT_NODEF;
 163                 iam.usrServInfoA.tranMode.val                   = 0x0;                          /* circuit mode */
 164                 iam.usrServInfoA.infoTranRate0.pres             = PRSNT_NODEF;
 165                 iam.usrServInfoA.infoTranRate0.val              = 0x10;                         /* 64kbps origination to destination */
 166                 iam.usrServInfoA.infoTranRate1.pres             = PRSNT_NODEF;
 167                 iam.usrServInfoA.infoTranRate1.val              = 0x10;                         /* 64kbps destination to origination */
 168                 iam.usrServInfoA.chanStruct.pres                = PRSNT_NODEF;
 169                 iam.usrServInfoA.chanStruct.val                 = 0x1;                          /* 8kHz integrity */
 170                 iam.usrServInfoA.config.pres                    = PRSNT_NODEF;
 171                 iam.usrServInfoA.config.val                             = 0x0;                          /* point to point configuration */
 172                 iam.usrServInfoA.establish.pres                 = PRSNT_NODEF;
 173                 iam.usrServInfoA.establish.val                  = 0x0;                          /* on demand */
 174                 iam.usrServInfoA.symmetry.pres                  = PRSNT_NODEF;
 175                 iam.usrServInfoA.symmetry.val                   = 0x0;                          /* bi-directional symmetric */
 176                 iam.usrServInfoA.usrInfLyr1Prot.pres    = PRSNT_NODEF;
 177                 iam.usrServInfoA.usrInfLyr1Prot.val             = 0x2;                          /* G.711 ulaw */
 178                 iam.usrServInfoA.rateMultiplier.pres    = PRSNT_NODEF;
 179                 iam.usrServInfoA.rateMultiplier.val             = 0x1;                          /* 1x rate multipler */
 180         } /* if ANSI */
 181         
 182         /* copy down the called number information */
 183         copy_cdPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cdPtyNum);
 184         
 185         /* copy down the calling number information */
 186         
 187         copy_cgPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cgPtyNum);
 188 
 189         /* check if the user would like a custom NADI value for the calling Pty Num */
 190         clg_nadi = ftdm_channel_get_var(ftdmchan, "ss7_clg_nadi");
 191         if ((clg_nadi != NULL) && (*clg_nadi)) {
 192                 SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Calling NADI value \"%s\"\n", clg_nadi);
 193                 iam.cgPtyNum.natAddrInd.val     = atoi(clg_nadi);
 194         } else {
 195                 iam.cgPtyNum.natAddrInd.val     = g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].clg_nadi;
 196                 SS7_DEBUG_CHAN(ftdmchan,"No user supplied NADI value found for CLG, using \"%d\"\n", iam.cgPtyNum.natAddrInd.val);
 197         }
 198 
 199         cld_nadi = ftdm_channel_get_var(ftdmchan, "ss7_cld_nadi");
 200         if ((cld_nadi != NULL) && (*cld_nadi)) {
 201                 SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Called NADI value \"%s\"\n", cld_nadi);
 202                 iam.cdPtyNum.natAddrInd.val     = atoi(cld_nadi);
 203         } else {
 204                 iam.cdPtyNum.natAddrInd.val     = g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].cld_nadi;
 205                 SS7_DEBUG_CHAN(ftdmchan,"No user supplied NADI value found for CLD, using \"%d\"\n", iam.cdPtyNum.natAddrInd.val);
 206         }
 207 
 208         /* check if the user would like us to send a clg_sub-address */
 209         clg_subAddr = ftdm_channel_get_var(ftdmchan, "ss7_clg_subaddr");
 210         if ((clg_subAddr != NULL) && (*clg_subAddr)) {
 211                 SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Calling Sub-Address value \"%s\"\n", clg_subAddr);
 212                 
 213                 /* clean out the subAddrIE */
 214                 memset(subAddrIE, 0x0, sizeof(subAddrIE));
 215 
 216                 /* check the first character in the sub-address to see what type of encoding to use */
 217                 switch (clg_subAddr[0]) {
 218                 case '0':                                               /* NSAP */
 219                         encode_subAddrIE_nsap(&clg_subAddr[1], subAddrIE, SNG_CALLING);
 220                         break;
 221                 case '1':                                               /* national variant */
 222                         encode_subAddrIE_nat(&clg_subAddr[1], subAddrIE, SNG_CALLING);
 223                         break;
 224                 default:
 225                         SS7_ERROR_CHAN(ftdmchan,"Invalid Calling Sub-Address encoding requested: %c\n", clg_subAddr[0]);
 226                         break;
 227                 } /* switch (cld_subAddr[0]) */
 228 
 229 
 230                 /* if subaddIE is still empty don't copy it in */
 231                 if (subAddrIE[0] != '0') {
 232                         /* check if the clg_subAddr has already been added */
 233                         if (iam.accTrnspt.eh.pres == PRSNT_NODEF) {
 234                                 /* append the subAddrIE */
 235                                 memcpy(&iam.accTrnspt.infoElmts.val[iam.accTrnspt.infoElmts.len], subAddrIE, (subAddrIE[1] + 2));
 236                                 iam.accTrnspt.infoElmts.len             = iam.accTrnspt.infoElmts.len +subAddrIE[1] + 2;
 237                         } else {
 238                                 /* fill in from the beginning */
 239                                 iam.accTrnspt.eh.pres                   = PRSNT_NODEF;
 240                                 iam.accTrnspt.infoElmts.pres    = PRSNT_NODEF;
 241                                 memcpy(iam.accTrnspt.infoElmts.val, subAddrIE, (subAddrIE[1] + 2));
 242                                 iam.accTrnspt.infoElmts.len             = subAddrIE[1] + 2;
 243                         } /* if (iam.accTrnspt.eh.pres */
 244                 } /* if (subAddrIE[0] != '0') */
 245         }
 246 
 247         /* check if the user would like us to send a cld_sub-address */
 248         cld_subAddr = ftdm_channel_get_var(ftdmchan, "ss7_cld_subaddr");
 249         if ((cld_subAddr != NULL) && (*cld_subAddr)) {
 250                 SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Called Sub-Address value \"%s\"\n", cld_subAddr);
 251                 
 252                 /* clean out the subAddrIE */
 253                 memset(subAddrIE, 0x0, sizeof(subAddrIE));
 254 
 255                 /* check the first character in the sub-address to see what type of encoding to use */
 256                 switch (cld_subAddr[0]) {
 257                 case '0':                                               /* NSAP */
 258                         encode_subAddrIE_nsap(&cld_subAddr[1], subAddrIE, SNG_CALLED);
 259                         break;
 260                 case '1':                                               /* national variant */
 261                         encode_subAddrIE_nat(&cld_subAddr[1], subAddrIE, SNG_CALLED);
 262                         break;
 263                 default:
 264                         SS7_ERROR_CHAN(ftdmchan,"Invalid Called Sub-Address encoding requested: %c\n", cld_subAddr[0]);
 265                         break;
 266                 } /* switch (cld_subAddr[0]) */
 267 
 268                 /* if subaddIE is still empty don't copy it in */
 269                 if (subAddrIE[0] != '0') {
 270                         /* check if the cld_subAddr has already been added */
 271                         if (iam.accTrnspt.eh.pres == PRSNT_NODEF) {
 272                                 /* append the subAddrIE */
 273                                 memcpy(&iam.accTrnspt.infoElmts.val[iam.accTrnspt.infoElmts.len], subAddrIE, (subAddrIE[1] + 2));
 274                                 iam.accTrnspt.infoElmts.len             = iam.accTrnspt.infoElmts.len +subAddrIE[1] + 2;
 275                         } else {
 276                                 /* fill in from the beginning */
 277                                 iam.accTrnspt.eh.pres                   = PRSNT_NODEF;
 278                                 iam.accTrnspt.infoElmts.pres    = PRSNT_NODEF;
 279                                 memcpy(iam.accTrnspt.infoElmts.val, subAddrIE, (subAddrIE[1] + 2));
 280                                 iam.accTrnspt.infoElmts.len             = subAddrIE[1] + 2;
 281                         } /* if (iam.accTrnspt.eh.pres */
 282                 } /* if (subAddrIE[0] != '0') */
 283         } /* if ((cld_subAddr != NULL) && (*cld_subAddr)) */
 284 
 285 
 286 
 287 
 288         sng_cc_con_request (sngss7_info->spId,
 289                                                 sngss7_info->suInstId,
 290                                                 sngss7_info->spInstId,
 291                                                 sngss7_info->circuit->id, 
 292                                                 &iam, 
 293                                                 0);
 294 
 295         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d)\n",
 296                                                         sngss7_info->circuit->cic,
 297                                                         ftdmchan->caller_data.cid_num.digits,
 298                                                         iam.cgPtyNum.natAddrInd.val,
 299                                                         ftdmchan->caller_data.dnis.digits,
 300                                                         iam.cdPtyNum.natAddrInd.val);
 301         
 302         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 303         return;
 304 }
 305 
 306 /******************************************************************************/
 307 void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
 308 {
 309         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 310         
 311         sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
 312         sng_isup_inf_t          *isup_intf =  &g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId];
 313         SiCnStEvnt acm;
 314         
 315         memset (&acm, 0x0, sizeof (acm));
 316         
 317         /* fill in the needed information for the ACM */
 318         acm.bckCallInd.eh.pres                          = PRSNT_NODEF;
 319         acm.bckCallInd.chrgInd.pres                     = PRSNT_NODEF;
 320         acm.bckCallInd.chrgInd.val                      = CHRG_CHRG;
 321         acm.bckCallInd.cadPtyStatInd.pres       = PRSNT_NODEF;
 322         acm.bckCallInd.cadPtyStatInd.val        = 0x01;
 323         acm.bckCallInd.cadPtyCatInd.pres        = PRSNT_NODEF;
 324         acm.bckCallInd.cadPtyCatInd.val         = CADCAT_ORDSUBS;
 325         acm.bckCallInd.end2EndMethInd.pres      = PRSNT_NODEF;
 326         acm.bckCallInd.end2EndMethInd.val       = E2EMTH_NOMETH;
 327         acm.bckCallInd.intInd.pres                      = PRSNT_NODEF;
 328         acm.bckCallInd.intInd.val                       = INTIND_NOINTW;
 329         acm.bckCallInd.end2EndInfoInd.pres      = PRSNT_NODEF;
 330         acm.bckCallInd.end2EndInfoInd.val       = E2EINF_NOINFO;
 331         acm.bckCallInd.isdnUsrPrtInd.pres       = PRSNT_NODEF;
 332         acm.bckCallInd.isdnUsrPrtInd.val        = ISUP_USED;
 333         acm.bckCallInd.holdInd.pres                     = PRSNT_NODEF;
 334         acm.bckCallInd.holdInd.val                      = HOLD_NOTREQD;
 335         acm.bckCallInd.isdnAccInd.pres          = PRSNT_NODEF;
 336         acm.bckCallInd.isdnAccInd.val           = ISDNACC_NONISDN;
 337         acm.bckCallInd.echoCtrlDevInd.pres      = PRSNT_NODEF;
 338         acm.bckCallInd.echoCtrlDevInd.val       = 0x1;  /* ec device present */
 339         acm.bckCallInd.sccpMethInd.pres         = PRSNT_NODEF;
 340         acm.bckCallInd.sccpMethInd.val          = SCCPMTH_NOIND;
 341 
 342         /* fill in any optional parameters */
 343         if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) {
 344                 acm.optBckCalInd.eh.pres                                = PRSNT_NODEF;
 345                 acm.optBckCalInd.inbndInfoInd.pres              = PRSNT_NODEF;
 346                 acm.optBckCalInd.inbndInfoInd.val               = sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA);
 347                 acm.optBckCalInd.caFwdMayOcc.pres               = PRSNT_DEF;
 348                 acm.optBckCalInd.simpleSegmInd.pres             = PRSNT_DEF;
 349                 acm.optBckCalInd.mlppUserInd.pres               = PRSNT_DEF;
 350                 acm.optBckCalInd.usrNetIneractInd.pres  = PRSNT_DEF;
 351         } /* if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) */
 352 
 353         /* send the ACM request to LibSngSS7 */
 354         sng_cc_con_status  (1,
 355                                                 sngss7_info->suInstId,
 356                                                 sngss7_info->spInstId,
 357                                                 sngss7_info->circuit->id, 
 358                                                 &acm, 
 359                                                 ADDRCMPLT);
 360         
 361         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ACM\n", sngss7_info->circuit->cic);
 362         
 363         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 364         return;
 365 }
 366 
 367 /******************************************************************************/
 368 void ft_to_sngss7_anm (ftdm_channel_t * ftdmchan)
 369 {
 370         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 371         
 372         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 373         SiConEvnt anm;
 374         
 375         memset (&anm, 0x0, sizeof (anm));
 376         
 377         /* send the ANM request to LibSngSS7 */
 378         sng_cc_con_response(1,
 379                                                 sngss7_info->suInstId,
 380                                                 sngss7_info->spInstId,
 381                                                 sngss7_info->circuit->id, 
 382                                                 &anm, 
 383                                                 5);
 384 
 385   SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ANM\n", sngss7_info->circuit->cic);
 386 
 387   SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 388   return;
 389 }
 390 
 391 /******************************************************************************/
 392 void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan)
 393 {
 394         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 395         
 396         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 397         SiRelEvnt rel;
 398         
 399         memset (&rel, 0x0, sizeof (rel));
 400         
 401         rel.causeDgn.eh.pres = PRSNT_NODEF;
 402         rel.causeDgn.location.pres = PRSNT_NODEF;
 403         rel.causeDgn.location.val = 0x01;
 404         rel.causeDgn.cdeStand.pres = PRSNT_NODEF;
 405         rel.causeDgn.cdeStand.val = 0x00;
 406         rel.causeDgn.recommend.pres = NOTPRSNT;
 407         rel.causeDgn.causeVal.pres = PRSNT_NODEF;
 408         rel.causeDgn.causeVal.val = (uint8_t) ftdmchan->caller_data.hangup_cause;
 409         rel.causeDgn.dgnVal.pres = NOTPRSNT;
 410         
 411         /* send the REL request to LibSngSS7 */
 412         sng_cc_rel_request (1,
 413                                                 sngss7_info->suInstId,
 414                                                 sngss7_info->spInstId, 
 415                                                 sngss7_info->circuit->id, 
 416                                                 &rel);
 417         
 418         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx REL cause=%d \n",
 419                                                         sngss7_info->circuit->cic,
 420                                                         ftdmchan->caller_data.hangup_cause );
 421         
 422         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 423         return;
 424 }
 425 
 426 /******************************************************************************/
 427 void ft_to_sngss7_rlc (ftdm_channel_t * ftdmchan)
 428 {
 429         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 430         
 431         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 432         SiRelEvnt rlc;
 433         
 434         memset (&rlc, 0x0, sizeof (rlc));
 435         
 436         /* send the RLC request to LibSngSS7 */
 437         sng_cc_rel_response (1,
 438                                                 sngss7_info->suInstId,
 439                                                 sngss7_info->spInstId, 
 440                                                 sngss7_info->circuit->id, 
 441                                                 &rlc);
 442         
 443         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RLC\n", sngss7_info->circuit->cic);
 444         
 445         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 446         return;
 447 }
 448 
 449 /******************************************************************************/
 450 void ft_to_sngss7_rsc (ftdm_channel_t * ftdmchan)
 451 {
 452         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 453         
 454         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 455         
 456         sng_cc_sta_request (1,
 457                                                 sngss7_info->suInstId,
 458                                                 sngss7_info->spInstId,
 459                                                 sngss7_info->circuit->id,
 460                                                 sngss7_info->globalFlg, 
 461                                                 SIT_STA_CIRRESREQ, 
 462                                                 NULL);
 463         
 464         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC\n", sngss7_info->circuit->cic);
 465         
 466         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 467         return;
 468 }
 469 
 470 /******************************************************************************/
 471 void ft_to_sngss7_rsca (ftdm_channel_t * ftdmchan)
 472 {
 473         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 474         
 475         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 476         
 477         sng_cc_sta_request (1,
 478                                                 sngss7_info->suInstId,
 479                                                 sngss7_info->spInstId,
 480                                                 sngss7_info->circuit->id,
 481                                                 sngss7_info->globalFlg, 
 482                                                 SIT_STA_CIRRESRSP, 
 483                                                 NULL);
 484         
 485         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx RSC-RLC\n", sngss7_info->circuit->cic);
 486         
 487         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 488   return;
 489 }
 490 
 491 /******************************************************************************/
 492 void ft_to_sngss7_blo (ftdm_channel_t * ftdmchan)
 493 {
 494         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 495         
 496         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 497         
 498         sng_cc_sta_request (1,
 499                                                 0,
 500                                                 0,
 501                                                 sngss7_info->circuit->id,
 502                                                 sngss7_info->globalFlg, 
 503                                                 SIT_STA_CIRBLOREQ, 
 504                                                 NULL);
 505         
 506         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLO\n", sngss7_info->circuit->cic);
 507         
 508         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 509         return;
 510 }
 511 
 512 /******************************************************************************/
 513 void ft_to_sngss7_bla (ftdm_channel_t * ftdmchan)
 514 {
 515         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 516         
 517         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 518         
 519         sng_cc_sta_request (1,
 520                                                 0,
 521                                                 0,
 522                                                 sngss7_info->circuit->id,
 523                                                 sngss7_info->globalFlg, 
 524                                                 SIT_STA_CIRBLORSP, 
 525                                                 NULL);
 526         
 527         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx BLA\n", sngss7_info->circuit->cic);
 528         
 529         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 530         return;
 531 }
 532 
 533 /******************************************************************************/
 534 void
 535 ft_to_sngss7_ubl (ftdm_channel_t * ftdmchan)
 536 {
 537         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 538         
 539         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 540         
 541         sng_cc_sta_request (1,
 542                                                 0,
 543                                                 0,
 544                                                 sngss7_info->circuit->id,
 545                                                 sngss7_info->globalFlg, 
 546                                                 SIT_STA_CIRUBLREQ, 
 547                                                 NULL);
 548         
 549         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBL\n", sngss7_info->circuit->cic);
 550         
 551         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 552         return;
 553 }
 554 
 555 /******************************************************************************/
 556 void ft_to_sngss7_uba (ftdm_channel_t * ftdmchan)
 557 {
 558         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 559         
 560         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 561         
 562         sng_cc_sta_request (1,
 563                                                 0,
 564                                                 0,
 565                                                 sngss7_info->circuit->id,
 566                                                 sngss7_info->globalFlg, 
 567                                                 SIT_STA_CIRUBLRSP, 
 568                                                 NULL);
 569         
 570         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx UBA\n", sngss7_info->circuit->cic);
 571         
 572         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 573         return;
 574 }
 575 
 576 /******************************************************************************/
 577 void ft_to_sngss7_lpa (ftdm_channel_t * ftdmchan)
 578 {
 579         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 580         
 581         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 582         
 583         sng_cc_sta_request (1,
 584                                                 sngss7_info->suInstId,
 585                                                 sngss7_info->spInstId,
 586                                                 sngss7_info->circuit->id,
 587                                                 sngss7_info->globalFlg, 
 588                                                 SIT_STA_LOOPBACKACK, 
 589                                                 NULL);
 590         
 591         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx LPA\n", sngss7_info->circuit->cic);
 592         
 593         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 594 return;
 595 }
 596 
 597 /******************************************************************************/
 598 void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
 599 {
 600         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 601         
 602         sngss7_span_data_t *sngss7_span = ftdmchan->span->mod_data;
 603         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 604         SiStaEvnt       gra;
 605         
 606         /* clean out the gra struct */
 607         memset (&gra, 0x0, sizeof (gra));
 608 
 609         gra.rangStat.eh.pres = PRSNT_NODEF;
 610 
 611         /* fill in the range */ 
 612         gra.rangStat.range.pres = PRSNT_NODEF;
 613         gra.rangStat.range.val = sngss7_span->rx_grs.range;
 614 
 615         /* fill in the status */
 616         gra.rangStat.status.pres = PRSNT_NODEF;
 617         gra.rangStat.status.len = ((sngss7_span->rx_grs.range + 1) >> 3) + (((sngss7_span->rx_grs.range + 1) & 0x07) ? 1 : 0); 
 618         
 619         /* the status field should be 1 if blocked for maintenace reasons 
 620         * and 0 is not blocked....since we memset the struct nothing to do
 621         */
 622         
 623         /* send the GRA to LibSng-SS7 */
 624         sng_cc_sta_request (1,
 625                                                 0,
 626                                                 0,
 627                                                 sngss7_span->rx_grs.circuit,
 628                                                 0,
 629                                                 SIT_STA_GRSRSP,
 630                                                 &gra);
 631         
 632         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx GRA (%d:%d)\n",
 633                                                         sngss7_info->circuit->cic,
 634                                                         sngss7_info->circuit->cic,
 635                                                         (sngss7_info->circuit->cic + sngss7_span->rx_grs.range));
 636         
 637         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 638         return;
 639 }
 640 
 641 /******************************************************************************/
 642 void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan)
 643 {
 644         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 645         
 646         sngss7_span_data_t      *sngss7_span = ftdmchan->span->mod_data;
 647         sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
 648         
 649         SiStaEvnt grs;
 650         
 651         memset (&grs, 0x0, sizeof(grs));
 652         
 653         grs.rangStat.eh.pres    = PRSNT_NODEF;
 654         grs.rangStat.range.pres = PRSNT_NODEF;
 655         grs.rangStat.range.val  = sngss7_span->tx_grs.range;
 656         
 657         sng_cc_sta_request (1,
 658                                                 0,
 659                                                 0,
 660                                                 sngss7_span->tx_grs.circuit,
 661                                                 0,
 662                                                 SIT_STA_GRSREQ,
 663                                                 &grs);
 664         
 665         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx GRS (%d:%d)\n",
 666                                                         sngss7_info->circuit->cic,
 667                                                         sngss7_info->circuit->cic,
 668                                                         (sngss7_info->circuit->cic + sngss7_span->tx_grs.range));
 669         
 670         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 671 return;
 672 }
 673 
 674 /******************************************************************************/
 675 void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan)
 676 {       
 677         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 678         
 679         sngss7_span_data_t      *sngss7_span = ftdmchan->span->mod_data;
 680         sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
 681         int                                     x = 0;
 682         
 683         SiStaEvnt cgba;
 684 
 685         memset (&cgba, 0x0, sizeof(cgba));
 686 
 687         /* fill in the circuit group supervisory message */
 688         cgba.cgsmti.eh.pres = PRSNT_NODEF;
 689         cgba.cgsmti.typeInd.pres = PRSNT_NODEF;
 690         cgba.cgsmti.typeInd.val = sngss7_span->rx_cgb.type;
 691 
 692         cgba.rangStat.eh.pres = PRSNT_NODEF;
 693         /* fill in the range */ 
 694         cgba.rangStat.range.pres = PRSNT_NODEF;
 695         cgba.rangStat.range.val = sngss7_span->rx_cgb.range;
 696         /* fill in the status */
 697         cgba.rangStat.status.pres = PRSNT_NODEF;
 698         cgba.rangStat.status.len = ((sngss7_span->rx_cgb.range + 1) >> 3) + (((sngss7_span->rx_cgb.range + 1) & 0x07) ? 1 : 0);
 699         for(x = 0; x < cgba.rangStat.status.len; x++){
 700                 cgba.rangStat.status.val[x] = sngss7_span->rx_cgb.status[x];
 701         }
 702 
 703         sng_cc_sta_request (1,
 704                                                 0,
 705                                                 0,
 706                                                 sngss7_span->rx_cgb.circuit,
 707                                                 0,
 708                                                 SIT_STA_CGBRSP,
 709                                                 &cgba);
 710         
 711         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx CGBA (%d:%d)\n",
 712                                                         sngss7_info->circuit->cic,
 713                                                         sngss7_info->circuit->cic,
 714                                                         (sngss7_info->circuit->cic + sngss7_span->rx_cgb.range));
 715 
 716         /* clean out the saved data */
 717         memset(&sngss7_span->rx_cgb, 0x0, sizeof(sngss7_group_data_t));
 718 
 719         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 720         return;
 721 }
 722 
 723 /******************************************************************************/
 724 void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan)
 725 {       
 726         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 727         
 728         sngss7_span_data_t      *sngss7_span = ftdmchan->span->mod_data;
 729         sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
 730         int                                     x = 0;
 731         
 732         SiStaEvnt cgua;
 733 
 734         memset (&cgua, 0x0, sizeof(cgua));
 735 
 736         /* fill in the circuit group supervisory message */
 737         cgua.cgsmti.eh.pres = PRSNT_NODEF;
 738         cgua.cgsmti.typeInd.pres = PRSNT_NODEF;
 739         cgua.cgsmti.typeInd.val = sngss7_span->rx_cgu.type;
 740 
 741         cgua.rangStat.eh.pres = PRSNT_NODEF;
 742         /* fill in the range */ 
 743         cgua.rangStat.range.pres = PRSNT_NODEF;
 744         cgua.rangStat.range.val = sngss7_span->rx_cgu.range;
 745         /* fill in the status */
 746         cgua.rangStat.status.pres = PRSNT_NODEF;
 747         cgua.rangStat.status.len = ((sngss7_span->rx_cgu.range + 1) >> 3) + (((sngss7_span->rx_cgu.range + 1) & 0x07) ? 1 : 0);
 748         for(x = 0; x < cgua.rangStat.status.len; x++){
 749                 cgua.rangStat.status.val[x] = sngss7_span->rx_cgu.status[x];
 750         }
 751 
 752         sng_cc_sta_request (1,
 753                                                 0,
 754                                                 0,
 755                                                 sngss7_span->rx_cgu.circuit,
 756                                                 0,
 757                                                 SIT_STA_CGURSP,
 758                                                 &cgua);
 759         
 760         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx CGUA (%d:%d)\n",
 761                                                         sngss7_info->circuit->cic,
 762                                                         sngss7_info->circuit->cic,
 763                                                         (sngss7_info->circuit->cic + sngss7_span->rx_cgu.range));
 764 
 765         /* clean out the saved data */
 766         memset(&sngss7_span->rx_cgu, 0x0, sizeof(sngss7_group_data_t));
 767 
 768         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 769         return;
 770 }
 771 
 772 /******************************************************************************/
 773 void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan)
 774 {
 775         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 776 
 777         sngss7_span_data_t      *sngss7_span = ftdmchan->span->mod_data;
 778         sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
 779         SiStaEvnt                       cgb;
 780         int                                     x = 0;
 781 
 782 
 783         memset (&cgb, 0x0, sizeof(cgb));
 784 
 785         /* fill in the circuit group supervisory message */
 786         cgb.cgsmti.eh.pres                      = PRSNT_NODEF;
 787         cgb.cgsmti.typeInd.pres         = PRSNT_NODEF;
 788         cgb.cgsmti.typeInd.val          = sngss7_span->tx_cgb.type;
 789 
 790         /* fill in the range */ 
 791         cgb.rangStat.eh.pres            = PRSNT_NODEF;
 792         cgb.rangStat.range.pres         = PRSNT_NODEF;
 793         cgb.rangStat.range.val          = sngss7_span->tx_cgb.range;
 794 
 795         /* fill in the status */
 796         cgb.rangStat.status.pres        = PRSNT_NODEF;
 797         cgb.rangStat.status.len         = ((sngss7_span->tx_cgb.range + 1) >> 3) + (((sngss7_span->tx_cgb.range + 1) & 0x07) ? 1 : 0);
 798         for(x = 0; x < cgb.rangStat.status.len; x++){
 799                 cgb.rangStat.status.val[x] = sngss7_span->tx_cgb.status[x];
 800         }
 801 
 802         sng_cc_sta_request (1,
 803                                                 0,
 804                                                 0,
 805                                                 sngss7_span->tx_cgb.circuit,
 806                                                 0,
 807                                                 SIT_STA_CGBREQ,
 808                                                 &cgb);
 809         
 810         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx CGB (%d:%d)\n",
 811                                                         sngss7_info->circuit->cic,
 812                                                         sngss7_info->circuit->cic,
 813                                                         (sngss7_info->circuit->cic + sngss7_span->tx_cgb.range));
 814 
 815         /* clean out the saved data */
 816         memset(&sngss7_span->tx_cgb, 0x0, sizeof(sngss7_group_data_t));
 817 
 818         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 819         return;
 820 }
 821 
 822 /******************************************************************************/
 823 void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan)
 824 {
 825         SS7_FUNC_TRACE_ENTER (__FUNCTION__);
 826 
 827         sngss7_span_data_t      *sngss7_span = ftdmchan->span->mod_data;
 828         sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
 829         SiStaEvnt                       cgu;
 830         int                                     x = 0;
 831 
 832 
 833         memset (&cgu, 0x0, sizeof(cgu));
 834 
 835         /* fill in the circuit group supervisory message */
 836         cgu.cgsmti.eh.pres                      = PRSNT_NODEF;
 837         cgu.cgsmti.typeInd.pres         = PRSNT_NODEF;
 838         cgu.cgsmti.typeInd.val          = sngss7_span->tx_cgu.type;
 839 
 840         /* fill in the range */ 
 841         cgu.rangStat.eh.pres            = PRSNT_NODEF;
 842         cgu.rangStat.range.pres         = PRSNT_NODEF;
 843         cgu.rangStat.range.val          = sngss7_span->tx_cgu.range;
 844 
 845         /* fill in the status */
 846         cgu.rangStat.status.pres        = PRSNT_NODEF;
 847         cgu.rangStat.status.len         = ((sngss7_span->tx_cgu.range + 1) >> 3) + (((sngss7_span->tx_cgu.range + 1) & 0x07) ? 1 : 0);
 848         for(x = 0; x < cgu.rangStat.status.len; x++){
 849                 cgu.rangStat.status.val[x] = sngss7_span->tx_cgu.status[x];
 850         }
 851 
 852         sng_cc_sta_request (1,
 853                                                 0,
 854                                                 0,
 855                                                 sngss7_span->tx_cgu.circuit,
 856                                                 0,
 857                                                 SIT_STA_CGUREQ,
 858                                                 &cgu);
 859         
 860         SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx CGU (%d:%d)\n",
 861                                                         sngss7_info->circuit->cic,
 862                                                         sngss7_info->circuit->cic,
 863                                                         (sngss7_info->circuit->cic + sngss7_span->tx_cgu.range));
 864 
 865         /* clean out the saved data */
 866         memset(&sngss7_span->tx_cgu, 0x0, sizeof(sngss7_group_data_t));
 867 
 868         SS7_FUNC_TRACE_EXIT (__FUNCTION__);
 869         return;
 870 }
 871 
 872 
 873 /******************************************************************************/
 874 /* For Emacs:
 875  * Local Variables:
 876  * mode:c
 877  * indent-tabs-mode:t
 878  * tab-width:4
 879  * c-basic-offset:4
 880  * End:
 881  * For VIM:
 882  * vim:set softtabstop=4 shiftwidth=4 tabstop=4:
 883  */
 884 /******************************************************************************/

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