]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: adding susp/resm/rels but not finished.
authorJames Zhang <jzhang@sangoma.com>
Mon, 30 Jan 2012 15:28:08 +0000 (10:28 -0500)
committerJames Zhang <jzhang@sangoma.com>
Mon, 30 Jan 2012 15:28:08 +0000 (10:28 -0500)
           disable t6 finished.

libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c

index 2c8f5172b9795c18dd153ad16d8c8b270b49b1c8..d738edb95977f8145694ad06fbd533b27e5e7e61 100644 (file)
@@ -71,6 +71,10 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
 static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
 static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose);
 
+static ftdm_status_t handle_tx_susp(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
+static ftdm_status_t handle_tx_resm(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
+static ftdm_status_t handle_tx_rels(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
+
 static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
 static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int chan, int verbose);
 
@@ -458,9 +462,49 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
                        goto handle_cli_error;
                /**********************************************************************/
                } 
+
        /**************************************************************************/
-       } else if (!strcasecmp(argv[c], "blo")) {
+       /* sending resume for a ckt's call */
+       } else if (!strcasecmp(argv[c], "resm") == FTDM_FAIL) {
+               if (check_arg_count(argc, 5) == FTDM_FAIL)  {
+                       goto handle_cli_error_argc;
+               }
+               
+               if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) {
+                       handle_tx_resm(stream, span, chan, verbose);
+               } else {
+                       stream->write_function(stream, "Bad command format. \n");
+                       goto handle_cli_error_argc;
+               }
        /**************************************************************************/
+       /* sending resume for a ckt's call */
+       } else if (!strcasecmp(argv[c], "rels")) {
+               if (check_arg_count(argc, 5) == FTDM_FAIL)  {
+                       goto handle_cli_error_argc;
+               }
+               
+               if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) {
+                       handle_tx_rels(stream, span, chan, verbose);
+               } else {
+                       stream->write_function(stream, "Bad command format.\n");
+                       goto handle_cli_error_argc;
+               }
+
+       /**************************************************************************/
+       /* sending suspend for a ckt's call */
+       } else if (!strcasecmp(argv[c], "susp")) {
+               if (check_arg_count(argc, 5) == FTDM_FAIL)  {
+                       goto handle_cli_error_argc;
+               }
+               
+               if (extract_span_chan(argv, 2, &span, &chan) == FTDM_SUCCESS) {
+                       handle_tx_susp(stream, span, chan, verbose);
+               } else {
+                       stream->write_function(stream, "Bad command format. \n");
+                       goto handle_cli_error_argc;
+               }
+       /**************************************************************************/
+       } else if (!strcasecmp(argv[c], "blo")) {
                if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
                c++;
 
@@ -1330,6 +1374,85 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
        return FTDM_SUCCESS;
 }
 
+static ftdm_status_t handle_tx_resm(ftdm_stream_handle_t *stream, int span, int chan, int verbose)
+{
+       SS7_ERROR("JZ error alert.  handle_tx_resm \n");
+       return FTDM_FAIL;
+}
+static ftdm_status_t handle_tx_rels(ftdm_stream_handle_t *stream, int span, int chan, int verbose)
+{      
+       SS7_ERROR("JZ error alert. handle_tx_rels \n");
+       return FTDM_FAIL;
+}
+
+/******************************************************************************/
+static ftdm_status_t handle_tx_susp(ftdm_stream_handle_t *stream, int span, int chan, int verbose)
+{
+       int                              x;
+       sngss7_chan_data_t  *ss7_info;
+       ftdm_channel_t    *ftdmchan;
+       int                              lspan;
+       int                              lchan;
+
+       SS7_ERROR("JZ error alert. handle_tx_susp \n");
+       return FTDM_FAIL;
+
+       x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
+       while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
+               if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == SNG_CKT_VOICE) {
+                       ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
+                       ftdmchan = ss7_info->ftdmchan;
+
+                       /* if span == 0 then all spans should be printed */
+                       if (span == 0) {
+                               lspan = ftdmchan->physical_span_id;
+                       } else {
+                               lspan = span;
+                       }
+
+                       /* if chan == 0 then all chans should be printed */
+                       if (chan == 0) {
+                               lchan = ftdmchan->physical_chan_id;
+                       } else {
+                               lchan = chan;
+                       }
+
+                       if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) {
+                               /* now that we have the right channel...put a lock on it so no-one else can use it */
+                               ftdm_mutex_lock(ftdmchan->mutex);
+
+                               /* check if there is a pending state change|give it a bit to clear */
+                               if (check_for_state_change(ftdmchan)) {
+                                       SS7_ERROR("Failed to wait for pending state change on CIC = %d\n", ss7_info->circuit->cic);
+                                       /* check if we need to die */
+                                       ftdm_assert(0, "State change not completed\n");
+                                       /* unlock the channel again before we exit */
+                                       ftdm_mutex_unlock(ftdmchan->mutex);
+                                       /* move to the next channel */
+                                       continue;
+                               } else {
+                                       /* throw the ckt block flag */
+                                       sngss7_set_ckt_blk_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX);
+
+                                       /* set the channel to suspended state */
+                                       ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
+                               }
+
+                               /* unlock the channel again before we exit */
+                               ftdm_mutex_unlock(ftdmchan->mutex);
+
+                       } /* if ( span and chan) */
+
+               } /* if ( cic != 0) */
+
+               /* go the next circuit */
+               x++;
+       } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
+
+       handle_show_blocks(stream, span, chan, verbose);
+
+       return FTDM_SUCCESS;
+}
 /******************************************************************************/
 static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int chan, int verbose)
 {
index 4c47ee05781ef85824ff5755c232d2243b384cbb..3f87ccf71374d0cadf5b2798aa09068035e08b9a 100644 (file)
 
 /* INCLUDE ********************************************************************/
 #include "ftmod_sangoma_ss7_main.h"
-#include <sng_ss7/ci_db.h>
-#include <sng_ss7/cm_hash.h>
-#include <sng_ss7/cm_hash.x>
-#include <sng_ss7/si.h>
-#include <sng_ss7/si_mf.h>
-#include <sng_ss7/si_mf.x>
-#include <sng_ss7/si.x>
 /******************************************************************************/
 
 /* DEFINES ********************************************************************/
@@ -583,6 +576,14 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
 
                if (sngss7_test_ckt_flag(sngss7_info, FLAG_SUS_RECVD) && 
                   !sngss7_test_ckt_flag(sngss7_info, FLAG_T6_CANCELED)) {
+                       if (sng_cancel_isup_tmr(sngss7_info->suInstId, ISUP_T6i) == RFAILED ) {
+                               SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not stop timer T6 \n", sngss7_info->circuit->cic);
+                       } else {
+                               sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED);
+                               SS7_ERROR_CHAN(ftdmchan,"[CIC:%d] isup timer T6 has been cancelled. \n", sngss7_info->circuit->cic);
+                       }
+
+#if 0
                        /* SPIROU cert, disable ISUP T6 when bridged natively */
                        int trc = 0;
                        SiCon *siCon = NULL;
@@ -597,6 +598,7 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
                        } else {
                                SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic);
                        }
+#endif
                }
 
        }
@@ -995,6 +997,14 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan,
 
        if (sngss7_test_ckt_flag(sngss7_info, FLAG_SUS_RECVD) && 
           !sngss7_test_ckt_flag(sngss7_info, FLAG_T6_CANCELED)) {
+               if (sng_cancel_isup_tmr(sngss7_info->suInstId, ISUP_T6i) == RFAILED ) {
+                       SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not stop timer T6 \n", sngss7_info->circuit->cic);
+               } else {
+                       sngss7_set_ckt_flag(sngss7_info, FLAG_T6_CANCELED);
+                       SS7_ERROR_CHAN(ftdmchan,"[CIC:%d] isup timer T6 has been cancelled. \n", sngss7_info->circuit->cic);
+               }
+
+#if 0
                /* SPIROU cert, disable ISUP T6 when bridged natively */
                int trc = 0;
                SiCon *siCon = NULL;
@@ -1009,9 +1019,8 @@ static void ftdm_sangoma_ss7_process_peer_stack_event (ftdm_channel_t *ftdmchan,
                } else {
                        SS7_ERROR_CHAN(ftdmchan,"[CIC:%d]could not find siCon\n", sngss7_info->circuit->cic);
                }
+#endif
        }
-
-
 }
 
 static ftdm_status_t ftdm_sangoma_ss7_native_bridge_state_change(ftdm_channel_t *ftdmchan);