]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ss7 - updated libSng-SS7 api, fixed spelling mistake in cli, added support...
authorKonrad Hammel <konrad@sangoma.com>
Mon, 18 Oct 2010 15:07:47 +0000 (11:07 -0400)
committerKonrad Hammel <konrad@sangoma.com>
Mon, 18 Oct 2010 18:51:25 +0000 (14:51 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.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_xml.c

index 92284edba3598b1b95c21c430a9d3eab645f33cc..38d37230614cc9bfababa7421b97dcdfdb3b1145 100644 (file)
@@ -616,8 +616,8 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
        stream->write_function(stream, "Sangoma SS7 CLI usuage:\n\n");
 
        stream->write_function(stream, "Ftmod_sangoma_ss7 general control:\n");
-       stream->write_function(stream, "ftdm ss7 set ftace X Y\n");
-       stream->write_function(stream, "ftdm ss7 set mtace X Y\n");
+       stream->write_function(stream, "ftdm ss7 set ftrace X Y\n");
+       stream->write_function(stream, "ftdm ss7 set mtrace X Y\n");
        stream->write_function(stream, "\n");
        stream->write_function(stream, "Ftmod_sangoma_ss7 information:\n");
        stream->write_function(stream, "ftdm ss7 show status link X\n");
@@ -1064,7 +1064,7 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
                                        /* 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|",
+                                       stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|sig_status=%4s|state=%s|",
                                                                                                        ckt->span,
                                                                                                        ckt->chan,
                                                                                                        ckt->cic,
@@ -1281,13 +1281,17 @@ static ftdm_status_t handle_status_link(ftdm_stream_handle_t *stream, char *name
                                                (sta.t.ssta.s.snDLSAP.remBlkd) ? "Y":"N",
                                                (sta.t.ssta.s.snDLSAP.locInhbt) ? "Y":"N",
                                                (sta.t.ssta.s.snDLSAP.rmtInhbt) ? "Y":"N");
-                       break;
+
+                       goto success;
                }
                
                /* move to the next link */
                x++;
        } /* while (id != 0) */
 
+       stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
+
+success:
        return FTDM_SUCCESS;
 }
 
@@ -1313,13 +1317,17 @@ static ftdm_status_t handle_status_linkset(ftdm_stream_handle_t *stream, char *n
                                                name,
                                                DECODE_LSN_LINKSET_STATUS(sta.t.ssta.s.snLnkSet.state),
                                                sta.t.ssta.s.snLnkSet.nmbActLnks);
-                       break;
+                       
+                       goto success;
                }
  
                /* move to the next linkset */
                x++;
        } /* while (id != 0) */
 
+       stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
+
+success:
        return FTDM_SUCCESS;
 }
 
@@ -1342,13 +1350,16 @@ static ftdm_status_t handle_set_inhibit(ftdm_stream_handle_t *stream, char *name
                        /* print the new status of the link */
                        handle_status_link(stream, &name[0]);
 
-                       break;
+                       goto success;
                }
  
                /* move to the next linkset */
                x++;
        } /* while (id != 0) */
 
+       stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
+
+success:
        return FTDM_SUCCESS;
 }
 
@@ -1371,13 +1382,16 @@ static ftdm_status_t handle_set_uninhibit(ftdm_stream_handle_t *stream, char *na
                        /* print the new status of the link */
                        handle_status_link(stream, &name[0]);
 
-                       break;
+                       goto success;
                }
  
                /* move to the next linkset */
                x++;
        } /* while (id != 0) */
 
+       stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
+
+success:
        return FTDM_SUCCESS;
 }
 
@@ -1440,6 +1454,10 @@ static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int c
                /* go the next circuit */
                x++;
        } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
+
+       /* print the status of channels */
+       handle_show_status(stream, span, chan, verbose);
+       
        
 
        return FTDM_SUCCESS;
@@ -1505,6 +1523,24 @@ static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int c
                x++;
        } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
        
+       x=1;
+       while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
+               if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
+
+                       sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
+                       ftdmchan = sngss7_info->ftdmchan;
+                       sngss7_span = ftdmchan->span->mod_data;
+
+                       if ((ftdmchan->physical_span_id == span) && 
+                               ((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
+
+                               handle_show_status(stream, span, chan, verbose);
+                       }
+               } /* if ( cic == voice) */
+
+               /* go the next circuit */
+               x++;
+       } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
 
        return FTDM_SUCCESS;
 }
@@ -1585,6 +1621,25 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
 
        /* send the circuit group block */
        ft_to_sngss7_cgb(main_chan);
+
+       x=1;
+       while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
+               if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
+
+                       sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
+                       ftdmchan = sngss7_info->ftdmchan;
+                       sngss7_span = ftdmchan->span->mod_data;
+
+                       if ((ftdmchan->physical_span_id == span) && 
+                               ((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
+
+                               handle_show_status(stream, span, chan, verbose);
+                       }
+               } /* if ( cic == voice) */
+
+               /* go the next circuit */
+               x++;
+       } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
        
 
        return FTDM_SUCCESS;
@@ -1666,6 +1721,25 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
 
        /* send the circuit group block */
        ft_to_sngss7_cgu(main_chan);
+
+       x=1;
+       while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
+               if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
+
+                       sngss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
+                       ftdmchan = sngss7_info->ftdmchan;
+                       sngss7_span = ftdmchan->span->mod_data;
+
+                       if ((ftdmchan->physical_span_id == span) && 
+                               ((ftdmchan->physical_chan_id >= chan) && (ftdmchan->physical_chan_id < (chan+range)))) {
+
+                               handle_show_status(stream, span, chan, verbose);
+                       }
+               } /* if ( cic == voice) */
+
+               /* go the next circuit */
+               x++;
+       } /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
        
 
        return FTDM_SUCCESS;
index cff97118145b1a8441ff0ba46251f8c624731200..2b267e716cb480492e5f73bddaa992f52dffbf13 100644 (file)
@@ -1480,7 +1480,7 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init)
 
        sngss7_id = 0;
 
-       cmbLinkSetId = 1;
+       cmbLinkSetId = 0;
 
        /* initalize the global gen_config flag */
        g_ftdm_sngss7_data.gen_config = 0;
index 5de237dcbfa49a20b52f907ea5126bee0e96e584..f41664a5b6756e39a97f4a20ecd04a15798dc9f2 100644 (file)
@@ -85,6 +85,10 @@ typedef enum {
        SNGSS7_PAUSED   = (1 << 7)
 } sng_flag_t;
 
+typedef enum {
+       SNGSS7_ACM_OBCI_BITA    = (1 << 0)      /* in-band indication */
+} sng_intf_options_t;
+
 typedef enum {
        SNG_CALLED                      = 1,
        SNG_CALLING                     = 2
@@ -205,6 +209,7 @@ typedef struct sng_route {
 typedef struct sng_isup_intf {
        uint32_t                id;
        char                    name[MAX_NAME_LEN];
+       uint32_t                options;
        uint32_t                flags;
        uint32_t                spc;
        uint32_t                dpc;
@@ -721,6 +726,11 @@ void handle_isup_t35(void *userdata);
 #define sngss7_clear_flag(obj, flag) ((obj)->flags &= ~(flag))
 #define sngss7_set_flag(obj, flag)   ((obj)->flags |= (flag))
 
+#define sngss7_test_options(obj, option) ((obj)->options & option)
+#define sngss7_clear_options(obj, option) ((obj)->options &= ~(option))
+#define sngss7_set_options(obj, option)   ((obj)->options |= (option))
+
+
 #ifdef SS7_PRODUCTION
 # define SS7_ASSERT \
        SS7_INFO_CHAN(ftdmchan,"Production Mode, continuing%s\n", "");
index 3571a9ef0a8235715240e45b9390b0bc637692e8..8cbe6d94988f54aa6a689463ce14a974afa92767 100644 (file)
@@ -308,7 +308,8 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
 {
        SS7_FUNC_TRACE_ENTER (__FUNCTION__);
        
-       sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
+       sngss7_chan_data_t      *sngss7_info = ftdmchan->call_data;
+       sng_isup_inf_t          *isup_intf =  &g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId];
        SiCnStEvnt acm;
        
        memset (&acm, 0x0, sizeof (acm));
@@ -337,7 +338,18 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
        acm.bckCallInd.echoCtrlDevInd.val       = 0x1;  /* ec device present */
        acm.bckCallInd.sccpMethInd.pres         = PRSNT_NODEF;
        acm.bckCallInd.sccpMethInd.val          = SCCPMTH_NOIND;
-       
+
+       /* fill in any optional parameters */
+       if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) {
+               acm.optBckCalInd.eh.pres                                = PRSNT_NODEF;
+               acm.optBckCalInd.inbndInfoInd.pres              = PRSNT_NODEF;
+               acm.optBckCalInd.inbndInfoInd.val               = sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA);
+               acm.optBckCalInd.caFwdMayOcc.pres               = PRSNT_DEF;
+               acm.optBckCalInd.simpleSegmInd.pres             = PRSNT_DEF;
+               acm.optBckCalInd.mlppUserInd.pres               = PRSNT_DEF;
+               acm.optBckCalInd.usrNetIneractInd.pres  = PRSNT_DEF;
+       } /* if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) */
+
        /* send the ACM request to LibSngSS7 */
        sng_cc_con_status  (1,
                                                sngss7_info->suInstId,
index d23846204611fa92d11af55a96686597468e5efe..12352384523e00a6b7e14574f28fd8ab1631df8d 100644 (file)
@@ -50,27 +50,41 @@ int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm);
 int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm)
 {
        SnMngmt sta;
+       Pst             pst;
 
        memset(&sta, 0x0, sizeof(sta));
 
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
        sta.hdr.elmId.elmnt             = STDLSAP;
        sta.hdr.elmId.elmntInst1        = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
 
-       return(sng_sta_mtp3(&sta, cfm));
+       return(sng_sta_mtp3(&pst, &sta, cfm));
 }
 
 /******************************************************************************/
 int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm)
 {
        SnMngmt sta;
+       Pst             pst;
 
        memset(&sta, 0x0, sizeof(sta));
 
+       /* initalize the post structure */
+       smPstInit(&pst);
+
+       /* insert the destination Entity */
+       pst.dstEnt = ENTSN;
+
        sta.hdr.elmId.elmnt             = STLNKSET;
        sta.hdr.elmId.elmntInst1        = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].id;
        sta.hdr.elmId.elmntInst2        = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].links[0];
 
-       return(sng_sta_mtp3(&sta, cfm));
+       return(sng_sta_mtp3(&pst, &sta, cfm));
 }
 /******************************************************************************/
 
index 359055fe2ad4679300f1e932550966d620208c9b..52295426c06de27e9360aabee9f2b77e81f96161 100644 (file)
@@ -1249,6 +1249,18 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
                        sng_isup.cld_nadi = atoi(parm->val);
                        SS7_DEBUG("\tFound default CLD_NADI value = %d\n", sng_isup.cld_nadi);
                /**********************************************************************/
+               } else if (!strcasecmp(parm->var, "obci_bita")) {
+               /**********************************************************************/
+                       if (*parm->val == '1') {
+                               sngss7_set_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
+                               SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) enable option\n");
+                       } else if (*parm->val == '0') {
+                               sngss7_clear_options(&sng_isup, SNGSS7_ACM_OBCI_BITA);
+                               SS7_DEBUG("\tFound Optional Backwards Indicator: Bit A (early media) disable option\n");
+                       } else {
+                               SS7_DEBUG("\tInvalid value for \"obci_bita\" option\n");
+                       }
+               /**********************************************************************/
                } else {
                        SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
                        return FTDM_FAIL;
@@ -1671,7 +1683,7 @@ static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup)
        g_ftdm_sngss7_data.cfg.isupIntf[i].isap                 = sng_isup->isap;
        g_ftdm_sngss7_data.cfg.isupIntf[i].cld_nadi             = sng_isup->cld_nadi;
        g_ftdm_sngss7_data.cfg.isupIntf[i].clg_nadi             = sng_isup->clg_nadi;
-
+       g_ftdm_sngss7_data.cfg.isupIntf[i].options              = sng_isup->options;
        if (sng_isup->t4 != 0) {
                g_ftdm_sngss7_data.cfg.isupIntf[i].t4           = sng_isup->t4;
        } else {