]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ss7 - fixed bug in cic status, added activate/deactivate functions for mtp2/3
authorKonrad Hammel <konrad@sangoma.com>
Tue, 14 Sep 2010 00:38:00 +0000 (20:38 -0400)
committerKonrad Hammel <konrad@sangoma.com>
Tue, 14 Sep 2010 00:38:00 +0000 (20:38 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cntrl.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.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
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sta.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_xml.c

index c0ce84b2ed07cce44710c8f6846601638a471b97..20e1f27c9be44e6a9d6802dc4aa47a5e67c2a923 100644 (file)
@@ -67,6 +67,14 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c
 static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose);
 static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose);
 
+static ftdm_status_t handle_activate_link(ftdm_stream_handle_t *stream, char *name);
+static ftdm_status_t handle_deactivate_link(ftdm_stream_handle_t *stream, char *name);
+
+static ftdm_status_t handle_activate_linkset(ftdm_stream_handle_t *stream, char *name);
+static ftdm_status_t handle_deactivate_linkset(ftdm_stream_handle_t *stream, char *name);
+
+static ftdm_status_t handle_tx_lpo(ftdm_stream_handle_t *stream, char *name);
+static ftdm_status_t handle_tx_lpr(ftdm_stream_handle_t *stream, char *name);
 
 static ftdm_status_t handle_status_link(ftdm_stream_handle_t *stream, char *name);
 static ftdm_status_t handle_status_linkset(ftdm_stream_handle_t *stream, char *name);
@@ -488,7 +496,97 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
                        stream->write_function(stream, "Unknown \"grs\" command\n");
                        goto handle_cli_error;
                /**********************************************************************/
-               } 
+               }
+       /**************************************************************************/
+       } else if (!strcasecmp(argv[c], "lpo")) {
+       /**************************************************************************/
+               if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
+               c++;
+
+               if (!strcasecmp(argv[c], "link")) {
+               /**********************************************************************/
+                       if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
+                       c++;
+                       
+                       handle_tx_lpo(stream, argv[c]);
+               /**********************************************************************/
+               } else {
+               /**********************************************************************/
+                       stream->write_function(stream, "Unknown \"lpo\" command\n");
+                       goto handle_cli_error;
+               /**********************************************************************/
+               }
+       /**************************************************************************/
+       } else if (!strcasecmp(argv[c], "lpr")) {
+       /**************************************************************************/
+               if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
+               c++;
+
+               if (!strcasecmp(argv[c], "link")) {
+               /**********************************************************************/
+                       if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
+                       c++;
+                       
+                       handle_tx_lpr(stream, argv[c]);
+               /**********************************************************************/
+               } else {
+               /**********************************************************************/
+                       stream->write_function(stream, "Unknown \"lpr\" command\n");
+                       goto handle_cli_error;
+               /**********************************************************************/
+               }
+       /**************************************************************************/
+       } else if (!strcasecmp(argv[c], "activate")) {
+       /**************************************************************************/
+               if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
+               c++;
+
+               if (!strcasecmp(argv[c], "link")) {
+               /**********************************************************************/
+                       if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
+                       c++;
+                       
+                       handle_activate_link(stream, argv[c]);
+               /**********************************************************************/
+               }else if (!strcasecmp(argv[c], "linkset")) {
+               /**********************************************************************/
+                       if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
+                       c++;
+                       
+                       handle_activate_linkset(stream, argv[c]);
+               /**********************************************************************/
+               } else {
+               /**********************************************************************/
+                       stream->write_function(stream, "Unknown \"activate\" command\n");
+                       goto handle_cli_error;
+               /**********************************************************************/
+               }
+       /**************************************************************************/
+       } else if (!strcasecmp(argv[c], "deactivate")) {
+       /**************************************************************************/
+               if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
+               c++;
+
+               if (!strcasecmp(argv[c], "link")) {
+               /**********************************************************************/
+                       if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
+                       c++;
+                       
+                       handle_deactivate_link(stream, argv[c]);
+               /**********************************************************************/
+               }else if (!strcasecmp(argv[c], "linkset")) {
+               /**********************************************************************/
+                       if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
+                       c++;
+                       
+                       handle_deactivate_linkset(stream, argv[c]);
+               /**********************************************************************/
+               } else {
+               /**********************************************************************/
+                       stream->write_function(stream, "Unknown \"deactivate\" command\n");
+                       goto handle_cli_error;
+               /**********************************************************************/
+               }
        /**************************************************************************/    
        } else {
        /**************************************************************************/
@@ -536,11 +634,18 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
        stream->write_function(stream, "ftdm ss7 ubl span X chan Y\n");
        stream->write_function(stream, "ftdm ss7 rsc span X chan Y\n");
        stream->write_function(stream, "ftdm ss7 grs span X chan Y range Z\n");
+       stream->write_function(stream, "ftdm ss7 cgb span X chan Y range Z\n");
+       stream->write_function(stream, "ftdm ss7 cgu span X chan Y range Z\n");
        stream->write_function(stream, "\n");
        stream->write_function(stream, "Ftmod_sangoma_ss7 link control:\n");
        stream->write_function(stream, "ftdm ss7 inhibit link X\n");
        stream->write_function(stream, "ftdm ss7 uninhibit link X\n");
-
+       stream->write_function(stream, "ftdm ss7 activate link X\n");
+       stream->write_function(stream, "ftdm ss7 deactivate link X\n");
+       stream->write_function(stream, "ftdm ss7 activate linkset X\n");
+       stream->write_function(stream, "ftdm ss7 deactivate linkset X\n");
+       stream->write_function(stream, "ftdm ss7 lpo link X\n");
+       stream->write_function(stream, "ftdm ss7 lpr link X\n");
        stream->write_function(stream, "\n");
 
        return FTDM_SUCCESS;
@@ -915,87 +1020,100 @@ static ftdm_status_t handle_show_blocks(ftdm_stream_handle_t *stream, int span,
 /******************************************************************************/
 static ftdm_status_t handle_show_status(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;
-       ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
+       int                                                     x;
+       sngss7_chan_data_t              *ss7_info;
+       ftdm_channel_t                          *ftdmchan;
+       int                                                     lspan;
+       int                                                     lchan;
+       ftdm_signaling_status_t         sigstatus = FTDM_SIG_STATE_DOWN;
+       sng_isup_ckt_t                          *ckt;
 
        x=1;
        while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
-               if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
-                       ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
-                       ftdmchan = ss7_info->ftdmchan;
+                       /* extract the circuit to make it easier to work with */
+                       ckt = &g_ftdm_sngss7_data.cfg.isupCkt[x];
 
                        /* if span == 0 then all spans should be printed */
                        if (span == 0) {
-                               lspan = ftdmchan->physical_span_id;
+                               lspan = ckt->span;
                        } else {
                                lspan = span;
                        }
 
                        /* if chan == 0 then all chans should be printed */
                        if (chan == 0) {
-                               lchan = ftdmchan->physical_chan_id;
+                               lchan = ckt->chan;
                        } else {
                                lchan = chan;
                        }
 
-                       if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) {
-                               /* grab the signaling_status */
-                               ftdm_channel_get_sig_status(ftdmchan, &sigstatus);
-
-                               stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|sig_status=%s|state=%s|",
-                                                       ftdmchan->physical_span_id,
-                                                       ftdmchan->physical_chan_id,
-                                                       ss7_info->circuit->cic,
-                                                       ftdm_signaling_status2str(sigstatus),
-                                                       ftdm_channel_state2str(ftdmchan->state));
-
-                               if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX))) {
-                                       stream->write_function(stream, "l_mn=Y|");
-                               }else {
-                                       stream->write_function(stream, "l_mn=N|");
-                               }
-
-                               if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_RX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_RX))) {
-                                       stream->write_function(stream, "r_mn=Y|");
-                               }else {
-                                       stream->write_function(stream, "r_mn=N|");
-                               }
-
-                               if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) {
-                                       stream->write_function(stream, "l_hw=Y|");
-                               }else {
-                                       stream->write_function(stream, "l_hw=N|");
-                               }
-
-                               if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_RX)) {
-                                       stream->write_function(stream, "r_hw=Y|");
-                               }else {
-                                       stream->write_function(stream, "r_hw=N|");
-                               }
-
-                               if(sngss7_test_flag(ss7_info, FLAG_CKT_LC_BLOCK_RX)) {
-                                       stream->write_function(stream, "l_mngmt=Y|");
-                               }else {
-                                       stream->write_function(stream, "l_mngmt=N|");
-                               }
-
-                               if(sngss7_test_flag(ss7_info, FLAG_CKT_UCIC_BLOCK)) {
-                                       stream->write_function(stream, "l_ucic=Y|");
-                               }else {
-                                       stream->write_function(stream, "l_ucic=N|");
-                               }                               
-
-                               stream->write_function(stream, "flags=0x%X",ss7_info->flags);
+                       /* check if this circuit is one of the circuits we're interested in */
+                       if ((ckt->span == lspan) && (ckt->chan == lchan)) {
+                               if (ckt->type == HOLE) {
+                                       stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|NOT USED\n",
+                                                       ckt->span,
+                                                       ckt->chan,
+                                                       ckt->cic);
+                               } else if (ckt->type == SIG) {
+                                       stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|SIGNALING LINK\n",
+                                                       ckt->span,
+                                                       ckt->chan,
+                                                       ckt->cic);
+                               } else {
+                                       ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
+                                       ftdmchan = ss7_info->ftdmchan;
 
-                               stream->write_function(stream, "\n");   
+                                       /* grab the signaling_status */
+                                       ftdm_channel_get_sig_status(ftdmchan, &sigstatus);
+       
+                                       stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|sig_status=%s|state=%s|",
+                                                                                                       ckt->span,
+                                                                                                       ckt->chan,
+                                                                                                       ckt->cic,
+                                                                                                       ftdm_signaling_status2str(sigstatus),
+                                                                                                       ftdm_channel_state2str(ftdmchan->state));
+       
+                                       if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX))) {
+                                               stream->write_function(stream, "l_mn=Y|");
+                                       }else {
+                                               stream->write_function(stream, "l_mn=N|");
+                                       }
+       
+                                       if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_RX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_RX))) {
+                                               stream->write_function(stream, "r_mn=Y|");
+                                       }else {
+                                               stream->write_function(stream, "r_mn=N|");
+                                       }
+       
+                                       if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) {
+                                               stream->write_function(stream, "l_hw=Y|");
+                                       }else {
+                                               stream->write_function(stream, "l_hw=N|");
+                                       }
+       
+                                       if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_RX)) {
+                                               stream->write_function(stream, "r_hw=Y|");
+                                       }else {
+                                               stream->write_function(stream, "r_hw=N|");
+                                       }
+       
+                                       if(sngss7_test_flag(ss7_info, FLAG_CKT_LC_BLOCK_RX)) {
+                                               stream->write_function(stream, "l_mngmt=Y|");
+                                       }else {
+                                               stream->write_function(stream, "l_mngmt=N|");
+                                       }
+       
+                                       if(sngss7_test_flag(ss7_info, FLAG_CKT_UCIC_BLOCK)) {
+                                               stream->write_function(stream, "l_ucic=Y|");
+                                       }else {
+                                               stream->write_function(stream, "l_ucic=N|");
+                                       }                               
+       
+                                       stream->write_function(stream, "flags=0x%X",ss7_info->flags);
+       
+                                       stream->write_function(stream, "\n");
+                               } /* if ( hole, sig, voice) */
                        } /* if ( span and chan) */
-
-               } /* if ( cic != 0) */
-
                /* go the next circuit */
                x++;
        } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
@@ -1516,6 +1634,193 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
        return FTDM_SUCCESS;
 }
 
+/******************************************************************************/
+static ftdm_status_t handle_activate_link(ftdm_stream_handle_t *stream, char *name)
+{
+       int             x = 0;
+
+       /* find the link request by it's name */
+       x = 1;
+       while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
+               if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
+
+                       /* send the uninhibit request */
+                       if (ftmod_ss7_activate_mtplink(x)) {
+                               stream->write_function(stream, "Failed to activate link=%s\n", name);
+                               return FTDM_FAIL;
+                       }
+
+                       /* print the new status of the link */
+                       handle_status_link(stream, &name[0]);
+                       goto success;
+               }
+               /* move to the next link */
+               x++;
+       } /* while (id != 0) */
+
+       stream->write_function(stream, "Could not find link=%s\n", name);
+
+success:
+       return FTDM_SUCCESS;
+}
+
+/******************************************************************************/
+static ftdm_status_t handle_deactivate_link(ftdm_stream_handle_t *stream, char *name)
+{
+       int             x = 0;
+
+       /* find the link request by it's name */
+       x = 1;
+       while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
+               if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
+
+                       /* send the deactivate request */
+                       if (ftmod_ss7_deactivate2_mtplink(x)) {
+                               stream->write_function(stream, "Failed to deactivate link=%s\n", name);
+                               return FTDM_FAIL;
+                       }
+
+                       /* print the new status of the link */
+                       handle_status_link(stream, &name[0]);
+                       goto success;
+               }
+               /* move to the next link */
+               x++;
+       } /* while (id != 0) */
+
+       stream->write_function(stream, "Could not find link=%s\n", name);
+
+success:
+       return FTDM_SUCCESS;
+}
+
+/******************************************************************************/
+static ftdm_status_t handle_activate_linkset(ftdm_stream_handle_t *stream, char *name)
+{
+       int             x = 0;
+
+       /* find the linkset request by it's name */
+       x = 1;
+       while(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
+               if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name, name)) {
+
+                       /* send the activate request */
+                       if (ftmod_ss7_activate_mtplinkSet(x)) {
+                               stream->write_function(stream, "Failed to activate linkset=%s\n", name);
+                               return FTDM_FAIL;
+                       }
+
+                       /* print the new status of the linkset */
+                       handle_status_linkset(stream, &name[0]);
+                       goto success;
+               }
+               /* move to the next linkset */
+               x++;
+       } /* while (id != 0) */
+
+       stream->write_function(stream, "Could not find linkset=%s\n", name);
+
+success:
+       return FTDM_SUCCESS;
+}
+
+/******************************************************************************/
+static ftdm_status_t handle_deactivate_linkset(ftdm_stream_handle_t *stream, char *name)
+{
+       int             x = 0;
+
+       /* find the linkset request by it's name */
+       x = 1;
+       while(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
+               if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name, name)) {
+
+                       /* send the deactivate request */
+                       if (ftmod_ss7_deactivate2_mtplinkSet(x)) {
+                               stream->write_function(stream, "Failed to deactivate linkset=%s\n", name);
+                               return FTDM_FAIL;
+                       }
+
+                       /* print the new status of the linkset */
+                       handle_status_linkset(stream, &name[0]);
+                       goto success;
+               }
+               /* move to the next linkset */
+               x++;
+       } /* while (id != 0) */
+
+       stream->write_function(stream, "Could not find linkset=%s\n", name);
+
+success:
+       return FTDM_SUCCESS;
+}
+
+/******************************************************************************/
+
+static ftdm_status_t handle_tx_lpo(ftdm_stream_handle_t *stream, char *name)
+{
+       int             x = 0;
+
+       /* find the link request by it's name */
+       x = 1;
+       while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
+               if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
+
+                       /* send the uninhibit request */
+                       if (ftmod_ss7_lpo_mtplink(x)) {
+                               stream->write_function(stream, "Failed set LPO link=%s\n", name);
+                               return FTDM_FAIL;
+                       }
+
+                       /* print the new status of the link */
+                       handle_status_link(stream, &name[0]);
+                       goto success;
+               }
+               /* move to the next link */
+               x++;
+       } /* while (id != 0) */
+
+       stream->write_function(stream, "Could not find link=%s\n", name);
+
+success:
+       return FTDM_SUCCESS;
+}
+
+/******************************************************************************/
+static ftdm_status_t handle_tx_lpr(ftdm_stream_handle_t *stream, char *name)
+{
+       int             x = 0;
+
+       /* find the link request by it's name */
+       x = 1;
+       while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
+               if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
+
+                       /* send the uninhibit request */
+                       if (ftmod_ss7_lpr_mtplink(x)) {
+                               stream->write_function(stream, "Failed set LPR link=%s\n", name);
+                               return FTDM_FAIL;
+                       }
+
+                       /* print the new status of the link */
+                       handle_status_link(stream, &name[0]);
+                       goto success;
+               }
+               /* move to the next link */
+               x++;
+       } /* while (id != 0) */
+
+       stream->write_function(stream, "Could not find link=%s\n", name);
+
+success:
+       return FTDM_SUCCESS;
+}
+
 /******************************************************************************/
 static ftdm_status_t extract_span_chan(char *argv[10], int pos, int *span, int *chan)
 {
index 52b3860375ad54a7429a44feed231972bc34658a..0d76329d25fa349df68887fe83cd25d81434da7f 100644 (file)
@@ -50,6 +50,17 @@ static int ftmod_ss7_enable_mtpLinkSet(int lnkSetId);
 
 int ftmod_ss7_inhibit_mtplink(uint32_t id);
 int ftmod_ss7_uninhibit_mtplink(uint32_t id);
+
+int ftmod_ss7_activate_mtplink(uint32_t id);
+int ftmod_ss7_deactivate_mtplink(uint32_t id);
+int ftmod_ss7_deactivate2_mtplink(uint32_t id);
+
+int ftmod_ss7_activate_mtplinkSet(uint32_t id);
+int ftmod_ss7_deactivate_mtplinkSet(uint32_t id);
+int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id);
+
+int ftmod_ss7_lpo_mtplink(uint32_t id);
+int ftmod_ss7_lpr_mtplink(uint32_t id);
 /******************************************************************************/
 
 /* FUNCTIONS ******************************************************************/
@@ -271,6 +282,248 @@ int ftmod_ss7_uninhibit_mtplink(uint32_t id)
        return (sng_cntrl_mtp3(&pst, &cntrl));
 }
 
+/******************************************************************************/
+int ftmod_ss7_activate_mtplink(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STDLSAP;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
+
+       cntrl.t.cntrl.action            = AENA;         /* Activate */
+       cntrl.t.cntrl.subAction         = SAELMNT;      /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+int ftmod_ss7_deactivate_mtplink(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STDLSAP;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
+
+       cntrl.t.cntrl.action            = ADISIMM;      /* Deactivate */
+       cntrl.t.cntrl.subAction         = SAELMNT;      /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+int ftmod_ss7_deactivate2_mtplink(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STDLSAP;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
+
+       cntrl.t.cntrl.action            = ADISIMM_L2;   /* Deactivate...layer 2 only */
+       cntrl.t.cntrl.subAction         = SAELMNT;              /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+int ftmod_ss7_activate_mtplinkSet(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STLNKSET;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].id;
+
+       cntrl.t.cntrl.action            = AACTLNKSET;   /* Activate */
+       cntrl.t.cntrl.subAction         = SAELMNT;              /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+int ftmod_ss7_deactivate_mtplinkSet(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STLNKSET;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].id;
+
+       cntrl.t.cntrl.action            = ADEACTLNKSET; /* Activate */
+       cntrl.t.cntrl.subAction         = SAELMNT;              /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STLNKSET;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].id;
+
+       cntrl.t.cntrl.action            = ADEACTLNKSET_L2;      /* Activate */
+       cntrl.t.cntrl.subAction         = SAELMNT;                      /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+int ftmod_ss7_lpo_mtplink(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STDLSAP;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
+
+       cntrl.t.cntrl.action            = ACTION_LPO;   /* Activate */
+       cntrl.t.cntrl.subAction         = SAELMNT;                      /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+int ftmod_ss7_lpr_mtplink(uint32_t id)
+{
+       SnMngmt cntrl;
+       Pst pst;
+
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
+       /* initalize the control structure */
+       memset(&cntrl, 0x0, sizeof(SnMngmt));
+
+       /* initalize the control header */
+       smHdrInit(&cntrl.hdr);
+
+       cntrl.hdr.msgType                       = TCNTRL;       /* this is a control request */
+       cntrl.hdr.entId.ent                     = ENTSN;
+       cntrl.hdr.entId.inst            = S_INST;
+       cntrl.hdr.elmId.elmnt           = STDLSAP;
+       cntrl.hdr.elmId.elmntInst1      = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
+
+       cntrl.t.cntrl.action            = ACTION_LPR;   /* Activate */
+       cntrl.t.cntrl.subAction         = SAELMNT;                      /* specificed element */
+
+       return (sng_cntrl_mtp3(&pst, &cntrl));
+}
+
+/******************************************************************************/
+
 /******************************************************************************/
 /* For Emacs:
  * Local Variables:
index a76b82a99c4656c5de7631bb2eaa7ddb7139b81c..5064d48f17ea79152305960b8bcb5d1500b208d2 100644 (file)
@@ -1123,21 +1123,10 @@ ftdm_status_t handle_pause(uint32_t suInstId, uint32_t spInstId, uint32_t circui
                        /* lock the channel */
                        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", sngss7_info->circuit->cic);
-                               ftdm_mutex_unlock(ftdmchan->mutex);
-                               i++;
-                               SS7_ASSERT;
-                       };
-       
                        /* check if the circuit is fully started */
                        if (ftdm_test_flag(ftdmchan->span, FTDM_SPAN_IN_THREAD)) {
                                /* set the pause flag on the channel */
                                sngss7_set_flag(sngss7_info, FLAG_INFID_PAUSED);
-       
-                               /* set the statet o SUSPENDED to bring the sig status down */ 
-                               ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
                        }
        
                        /* unlock the channel again before we exit */
@@ -1185,14 +1174,6 @@ ftdm_status_t handle_resume(uint32_t suInstId, uint32_t spInstId, uint32_t circu
                        /* lock the channel */
                        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", sngss7_info->circuit->cic);
-                               ftdm_mutex_unlock(ftdmchan->mutex);
-                               i++;
-                               SS7_ASSERT;
-                       };
-
                        /* only resume if we are paused */
                        if (sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED)) {
                                /* set the resume flag on the channel */
@@ -1200,9 +1181,6 @@ ftdm_status_t handle_resume(uint32_t suInstId, uint32_t spInstId, uint32_t circu
 
                                /* clear the paused flag */
                                sngss7_clear_flag(sngss7_info, FLAG_INFID_PAUSED);
-
-                               /* set the statet to SUSPENDED to bring the sig status up */ 
-                               ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
                        }
                        
                        /* unlock the channel again before we exit */
index 70a1a054409778cd648331523e5c9c99ce103c87..6fba4e9e0a649c34cfd4099e632e8f1bea134fa3 100644 (file)
@@ -347,6 +347,9 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
                        /* check if the rx_grs has cleared */
                        check_if_rx_grs_processed(ftdmspan);
                } /* if (sngss7_span->rx_grs.range > 0) */
+
+               /* check each channel on the span to see if there is an un-procressed SUS/RES flag */
+               check_for_res_sus_flag(ftdmspan);
        } /* master while loop */
 
        /* clear the IN_THREAD flag so that we know the thread is done */
@@ -947,31 +950,6 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                  SS7_DEBUG_CHAN(ftdmchan,"Current flags: 0x%X\n", sngss7_info->flags);
 
-               /**********************************************************************/
-               if (sngss7_test_flag (sngss7_info, FLAG_INFID_PAUSED))  {
-                       SS7_DEBUG_CHAN(ftdmchan, "Processing PAUSE flag %s\n", "");
-                       
-                       /* bring the channel signaling status to down */
-                       sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_DOWN;
-                       ftdm_span_send_signal (ftdmchan->span, &sigev);
-
-                       /* check the last state and return to it to allow the call to finish */
-                       goto suspend_goto_last;
-               }
-
-               if (sngss7_test_flag (sngss7_info, FLAG_INFID_RESUME)) {
-                       SS7_DEBUG_CHAN(ftdmchan, "Processing RESUME flag %s\n", "");
-
-                       /* the reset flag is set for the first channel in the span at handle_resume */
-
-                       /* clear the resume flag */
-                       sngss7_clear_flag(sngss7_info, FLAG_INFID_RESUME);
-
-                       /* go to restart state */
-                       goto suspend_goto_last;
-               }
-
                /**********************************************************************/
                if (sngss7_test_flag (sngss7_info, FLAG_CKT_MN_BLOCK_RX)) {
                        SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_MN_BLOCK_RX flag %s\n", "");
index 555c0d97a01aaa0671b8861227c447526dfc2164..415a897181d3fa44dc552c329d6dd89979472bd1 100644 (file)
@@ -454,6 +454,14 @@ int ftmod_ss7_cc_isap_config(int id);
 
 int ftmod_ss7_inhibit_mtplink(uint32_t id);
 int ftmod_ss7_uninhibit_mtplink(uint32_t id);
+int ftmod_ss7_activate_mtplink(uint32_t id);
+int ftmod_ss7_deactivate_mtplink(uint32_t id);
+int ftmod_ss7_deactivate2_mtplink(uint32_t id);
+int ftmod_ss7_activate_mtplinkSet(uint32_t id);
+int ftmod_ss7_deactivate_mtplinkSet(uint32_t id);
+int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id);
+int ftmod_ss7_lpo_mtplink(uint32_t id);
+int ftmod_ss7_lpr_mtplink(uint32_t id);
 
 int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm);
 int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm);
@@ -539,6 +547,7 @@ void handle_isup_t35(void *userdata);
 ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const char *data);
 
 ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan);
+ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan);
 /******************************************************************************/
 
 /* MACROS *********************************************************************/
index 46bd39f7fbda00e0e7a4569b28b2589d80140b84..879fcd239f924412d007415b28a2218fb33a028c 100644 (file)
@@ -204,29 +204,29 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
        memset (&acm, 0x0, sizeof (acm));
        
        /* fill in the needed information for the ACM */
-       acm.bckCallInd.eh.pres = PRSNT_NODEF;
-       acm.bckCallInd.chrgInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.chrgInd.val = 0x00;
-       acm.bckCallInd.cadPtyStatInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.cadPtyStatInd.val = 0x01;
-       acm.bckCallInd.cadPtyCatInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.cadPtyCatInd.val = 0x00;
-       acm.bckCallInd.end2EndMethInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.end2EndMethInd.val = 0x00;
-       acm.bckCallInd.intInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.intInd.val = 0x00;
-       acm.bckCallInd.end2EndInfoInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.end2EndInfoInd.val = 0x00;
-       acm.bckCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.isdnUsrPrtInd.val = 0x0;
-       acm.bckCallInd.holdInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.holdInd.val = 0x00;
-       acm.bckCallInd.isdnAccInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.isdnAccInd.val = 0x0;
-       acm.bckCallInd.echoCtrlDevInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.echoCtrlDevInd.val = 0x0;
-       acm.bckCallInd.sccpMethInd.pres = PRSNT_NODEF;
-       acm.bckCallInd.sccpMethInd.val = 0x00;
+       acm.bckCallInd.eh.pres                          = PRSNT_NODEF;
+       acm.bckCallInd.chrgInd.pres                     = PRSNT_NODEF;
+       acm.bckCallInd.chrgInd.val                      = 0x00;
+       acm.bckCallInd.cadPtyStatInd.pres       = PRSNT_NODEF;
+       acm.bckCallInd.cadPtyStatInd.val        = 0x01;
+       acm.bckCallInd.cadPtyCatInd.pres        = PRSNT_NODEF;
+       acm.bckCallInd.cadPtyCatInd.val         = 0x00;
+       acm.bckCallInd.end2EndMethInd.pres      = PRSNT_NODEF;
+       acm.bckCallInd.end2EndMethInd.val       = 0x00;
+       acm.bckCallInd.intInd.pres                      = PRSNT_NODEF;
+       acm.bckCallInd.intInd.val                       = 0x00;
+       acm.bckCallInd.end2EndInfoInd.pres      = PRSNT_NODEF;
+       acm.bckCallInd.end2EndInfoInd.val       = 0x00;
+       acm.bckCallInd.isdnUsrPrtInd.pres       = PRSNT_NODEF;
+       acm.bckCallInd.isdnUsrPrtInd.val        = 0x0;
+       acm.bckCallInd.holdInd.pres                     = PRSNT_NODEF;
+       acm.bckCallInd.holdInd.val                      = 0x00;
+       acm.bckCallInd.isdnAccInd.pres          = PRSNT_NODEF;
+       acm.bckCallInd.isdnAccInd.val           = 0x0;
+       acm.bckCallInd.echoCtrlDevInd.pres      = PRSNT_NODEF;
+       acm.bckCallInd.echoCtrlDevInd.val       = 0x1;  /* ec device present */
+       acm.bckCallInd.sccpMethInd.pres         = PRSNT_NODEF;
+       acm.bckCallInd.sccpMethInd.val          = 0x00;
        
        /* send the ACM request to LibSngSS7 */
        sng_cc_con_status  (1,
index 305e1a50f5d5372d26bd9850231249908cb635db..d23846204611fa92d11af55a96686597468e5efe 100644 (file)
@@ -68,7 +68,7 @@ int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm)
 
        sta.hdr.elmId.elmnt             = STLNKSET;
        sta.hdr.elmId.elmntInst1        = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].id;
-       sta.hdr.elmId.elmntInst2        = 1;
+       sta.hdr.elmId.elmntInst2        = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].links[0];
 
        return(sng_sta_mtp3(&sta, cfm));
 }
index 161a70d3ed827bff29e3ee0ff0ec5683f2d93159..181b76970eda307a386af2db700f5594ef1d925f 100644 (file)
@@ -58,6 +58,7 @@ unsigned long get_unique_id(void);
 ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan);
 
 ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan);
+ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan);
 /******************************************************************************/
 
 /* FUNCTIONS ******************************************************************/
@@ -540,6 +541,64 @@ GRS_UNLOCK_ALL:
        return FTDM_SUCCESS;
 }
 
+/******************************************************************************/
+ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan)
+{
+       ftdm_channel_t          *ftdmchan = NULL;
+       sngss7_chan_data_t      *sngss7_info = NULL;
+       ftdm_sigmsg_t           sigev;
+       int                             x;
+
+       for (x = 1; x < (ftdmspan->chan_count + 1); x++) {
+
+               /* extract the channel structure and sngss7 channel data */
+               ftdmchan = ftdmspan->channels[x];
+               
+               /* if the call data is NULL move on */
+               if (ftdmchan->call_data == NULL) continue;
+
+               sngss7_info = ftdmchan->call_data;
+
+               /* lock the channel */
+               ftdm_mutex_lock(ftdmchan->mutex);
+
+               memset (&sigev, 0, sizeof (sigev));
+
+               sigev.chan_id = ftdmchan->chan_id;
+               sigev.span_id = ftdmchan->span_id;
+               sigev.channel = ftdmchan;
+
+               if ((sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED)) &&
+                       (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP))) {
+                       
+                       /* bring the sig status down */
+                       sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
+                       sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+                       ftdm_span_send_signal(ftdmchan->span, &sigev);  
+               }
+
+               if ((sngss7_test_flag(sngss7_info, FLAG_INFID_RESUME)) &&
+                       !(ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP))) {
+                       
+                       /* bring the sig status back up */
+                       sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
+                       sigev.sigstatus = FTDM_SIG_STATE_UP;
+                       ftdm_span_send_signal(ftdmchan->span, &sigev);
+
+                       sngss7_clear_flag(sngss7_info, FLAG_INFID_RESUME);
+               }
+
+               /* unlock the channel */
+               ftdm_mutex_unlock(ftdmchan->mutex);
+
+       } /* for (x = 1; x < (span->chan_count + 1); x++) */
+
+       /* signal the core that sig events are queued for processing */
+       ftdm_span_trigger_signals(ftdmspan);
+
+       return FTDM_SUCCESS;
+}
+
 /******************************************************************************/
 
 
index cf0bf7caae99bcf583ade59df1e200827ce6efa6..bd1be4b6a4ec24ea173d6a2c017670ab96116bbe 100644 (file)
@@ -1600,11 +1600,10 @@ static int ftmod_ss7_fill_in_circuits(char *ch_map, int cicbase, int typeCntrl,
                                g_ftdm_sngss7_data.cfg.isupCkt[x].chan                  = count;
                                if (timeslot.siglink) {
                                        g_ftdm_sngss7_data.cfg.isupCkt[x].type          = SIG;
-                               } else if (timeslot.hole) {
-                                       g_ftdm_sngss7_data.cfg.isupCkt[x].type          = HOLE;
                                } else {
-                                       g_ftdm_sngss7_data.cfg.isupCkt[x].type          = VOICE;
+                                       g_ftdm_sngss7_data.cfg.isupCkt[x].type          = HOLE;
                                }
+
                                if (timeslot.channel) {
                                        g_ftdm_sngss7_data.cfg.isupCkt[x].cic           = cicbase;
                                        cicbase++;
@@ -1625,6 +1624,10 @@ static int ftmod_ss7_fill_in_circuits(char *ch_map, int cicbase, int typeCntrl,
                                g_ftdm_sngss7_data.cfg.isupCkt[x].obj                   = ss7_info;
 
                        } /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].id == 0) */
+
+                       /* increment the span channel count */
+                       count++;
+
                } else { /* if ((timeslot.siglink) || (timeslot.gap)) */
                        /* find the ftdm the channel structure for this channel*/
                        i = 1;