]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: INR/INF implementation
authorJames Zhang <jzhang@sangoma.com>
Wed, 11 Apr 2012 19:14:29 +0000 (15:14 -0400)
committerJames Zhang <jzhang@sangoma.com>
Wed, 11 Apr 2012 19:14:29 +0000 (15:14 -0400)
         - fill in IEs in INF according to INR request
         - print debug information if IE requested but not supported

libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c

index ac309ddc3e44398db5942e441fd9fd8bd27286d8..04dff6ee5e9456f1a5e21aed72484581078e8346 100644 (file)
@@ -474,7 +474,7 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ
        case (INFORMATREQ):
                SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx INR\n", sngss7_info->circuit->cic);
 
-               ft_to_sngss7_inf(ftdmchan);
+               ft_to_sngss7_inf(ftdmchan, siCnStEvnt);
 
                sngss7_set_ckt_flag(sngss7_info, FLAG_INR_RX);
                
index 66732bf10eb141952062d145451dbf6da75244b7..4ccf4efe0e7ce94b35790bc33025e797947643c1 100644 (file)
@@ -841,7 +841,7 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan);
 void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan);
 void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan);
 void ft_to_sngss7_inr(ftdm_channel_t * ftdmchan);
-void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan);
+void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan, SiCnStEvnt *inr);
 
 
 
index b5431d8fe84fa5f456ac887e08b446d3b4a9d263..9ba11ada58f5423cc4b25085041efd774ecb7ee9 100644 (file)
@@ -237,41 +237,55 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
        return;
 }
 
-void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan)
+void ft_to_sngss7_inf(ftdm_channel_t *ftdmchan, SiCnStEvnt *inr)
 {
        SiCnStEvnt evnt;
        sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
-       /*
-       const char *CallerId = NULL;
-       const char *CallerCat = NULL;
-       const char *sipvar;
-       */
-
+       
        memset (&evnt, 0x0, sizeof (evnt));
        
        evnt.infoInd.eh.pres       = PRSNT_NODEF;
-       
        evnt.infoInd.cgPtyAddrRespInd.pres = PRSNT_NODEF;
-       evnt.infoInd.cgPtyAddrRespInd.val=CGPRTYADDRESP_INCL;
-       copy_cgPtyNum_to_sngss7 (ftdmchan, &evnt.cgPtyNum);
-
-
        evnt.infoInd.cgPtyCatRespInd.pres = PRSNT_NODEF;
-       evnt.infoInd.cgPtyCatRespInd.val = CGPRTYCATRESP_INCL;
-       copy_cgPtyCat_to_sngss7 (ftdmchan, &evnt.cgPtyCat);
 
        evnt.infoInd.chrgInfoRespInd.pres =  PRSNT_NODEF;
        evnt.infoInd.chrgInfoRespInd.val = 0;
-
        evnt.infoInd.solInfoInd.pres = PRSNT_NODEF;
        evnt.infoInd.solInfoInd.val = 0;
-
        evnt.infoInd.holdProvInd.pres =  PRSNT_NODEF;
-       evnt.infoInd.holdProvInd.val = 0;
-       
+       evnt.infoInd.holdProvInd.val = 0;       
        evnt.infoInd.spare.pres =  PRSNT_NODEF;
        evnt.infoInd.spare.val = 0;
-       
+
+       if (inr->infoReqInd.eh.pres == PRSNT_NODEF) {
+               if ((inr->infoReqInd.holdingInd.pres ==  PRSNT_NODEF) && (inr->infoReqInd.holdingInd.val == HOLD_REQ)) {
+                       SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR requesting holding information. Holding is not supported in INF.\n", sngss7_info->circuit->cic);
+               }
+               if ((inr->infoReqInd.chrgInfoReqInd.pres ==  PRSNT_NODEF) && (inr->infoReqInd.chrgInfoReqInd.val == CHRGINFO_REQ)) {
+                       SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR requesting charging information. Charging is not supported in INF.\n", sngss7_info->circuit->cic);
+               }
+               if ((inr->infoReqInd.malCaIdReqInd.pres ==  PRSNT_NODEF) && (inr->infoReqInd.malCaIdReqInd.val == CHRGINFO_REQ)) {
+                       SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR requesting malicious call id. Malicious call id is not supported in INF.\n", sngss7_info->circuit->cic);
+               }
+               
+               if ((inr->infoReqInd.cgPtyAdReqInd.pres ==  PRSNT_NODEF) && (inr->infoReqInd.cgPtyAdReqInd.val == CGPRTYADDREQ_REQ)) {
+                       evnt.infoInd.cgPtyAddrRespInd.val=CGPRTYADDRESP_INCL;
+                       copy_cgPtyNum_to_sngss7 (ftdmchan, &evnt.cgPtyNum);
+               } else {
+                       evnt.infoInd.cgPtyAddrRespInd.val=CGPRTYADDRESP_NOTINCL;
+               }
+               
+               if ((inr->infoReqInd.cgPtyCatReqInd.pres ==  PRSNT_NODEF) && (inr->infoReqInd.cgPtyCatReqInd.val == CGPRTYCATREQ_REQ)) {
+                       evnt.infoInd.cgPtyCatRespInd.val = CGPRTYCATRESP_INCL;
+                       copy_cgPtyCat_to_sngss7 (ftdmchan, &evnt.cgPtyCat);
+               } else {
+                       evnt.infoInd.cgPtyCatRespInd.val = CGPRTYCATRESP_NOTINCL;
+               }
+       }
+       else {
+               SS7_DEBUG_CHAN(ftdmchan,"[CIC:%d]Received INR with no information request. Sending back default INF.\n", sngss7_info->circuit->cic);
+       }
+               
        sng_cc_inf(1, 
                          sngss7_info->suInstId,
                          sngss7_info->spInstId,
@@ -295,16 +309,16 @@ void ft_to_sngss7_inr(ftdm_channel_t *ftdmchan)
        evnt.infoReqInd.cgPtyAdReqInd.val=CGPRTYADDREQ_REQ;
 
        evnt.infoReqInd.holdingInd.pres =  PRSNT_NODEF;
-       evnt.infoReqInd.holdingInd.val = HOLD_NOTREQ;
+       evnt.infoReqInd.holdingInd.val = HOLD_REQ;
 
        evnt.infoReqInd.cgPtyCatReqInd.pres = PRSNT_NODEF;
        evnt.infoReqInd.cgPtyCatReqInd.val = CGPRTYCATREQ_REQ;
 
        evnt.infoReqInd.chrgInfoReqInd.pres =  PRSNT_NODEF;
-       evnt.infoReqInd.chrgInfoReqInd.val = CHRGINFO_NOTREQ;
+       evnt.infoReqInd.chrgInfoReqInd.val = CHRGINFO_REQ;
 
        evnt.infoReqInd.malCaIdReqInd.pres =  PRSNT_NODEF;
-       evnt.infoReqInd.malCaIdReqInd.val = MLBG_INFONOTREQ;
+       evnt.infoReqInd.malCaIdReqInd.val = MLBG_INFOREQ;
 
        sng_cc_inr(1, 
                          sngss7_info->suInstId,