提交 10277be8 authored 作者: James Zhang's avatar James Zhang

freetdm: synchronizing fixes in releases.3.5 version

         - glare
         - cgb/cgu range bug
         - inhibit/uninhibit
上级 19f01bf5
...@@ -784,16 +784,24 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) ...@@ -784,16 +784,24 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream)
stream->write_function(stream, "ftdm ss7 set ftrace 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, "ftdm ss7 set mtrace X Y\n");
stream->write_function(stream, "\n"); stream->write_function(stream, "\n");
stream->write_function(stream, "ftmod_sangoma_ss7 information:\n");
stream->write_function(stream, "ftdm ss7 show status mtp3 X\n"); stream->write_function(stream, "ftmod_sangoma_ss7 signaling information:\n");
stream->write_function(stream, "ftdm ss7 show \n");
stream->write_function(stream, "ftdm ss7 show status mtp2 X\n"); stream->write_function(stream, "ftdm ss7 show status mtp2 X\n");
stream->write_function(stream, "ftdm ss7 show status mtp3 X\n");
stream->write_function(stream, "ftdm ss7 show status linkset X\n");
stream->write_function(stream, "\n");
stream->write_function(stream, "ftmod_sangoma_ss7 circuit information:\n");
stream->write_function(stream, "ftdm ss7 show span all\n");
stream->write_function(stream, "ftdm ss7 show span X\n");
stream->write_function(stream, "ftdm ss7 show status span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show status span X chan Y\n");
stream->write_function(stream, "ftdm ss7 show free span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show free span X chan Y\n");
stream->write_function(stream, "ftdm ss7 show blocks span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show blocks span X chan Y\n");
stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show inuse span X chan Y\n");
stream->write_function(stream, "ftdm ss7 show inreset span X chan Y\n"); stream->write_function(stream, "ftdm ss7 show inreset span X chan Y\n");
stream->write_function(stream, "\n"); stream->write_function(stream, "\n");
stream->write_function(stream, "ftmod_sangoma_ss7 circuit control:\n"); stream->write_function(stream, "ftmod_sangoma_ss7 circuit control:\n");
stream->write_function(stream, "ftdm ss7 blo span X chan Y\n"); stream->write_function(stream, "ftdm ss7 blo span X chan Y\n");
stream->write_function(stream, "ftdm ss7 ubl span X chan Y\n"); stream->write_function(stream, "ftdm ss7 ubl span X chan Y\n");
...@@ -802,9 +810,12 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream) ...@@ -802,9 +810,12 @@ static ftdm_status_t handle_print_usage(ftdm_stream_handle_t *stream)
stream->write_function(stream, "ftdm ss7 cgb 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, "ftdm ss7 cgu span X chan Y range Z\n");
stream->write_function(stream, "\n"); stream->write_function(stream, "\n");
stream->write_function(stream, "ftmod_sangoma_ss7 link control:\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 inhibit link X\n");
stream->write_function(stream, "ftdm ss7 uninhibit 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 activate link X\n");
stream->write_function(stream, "ftdm ss7 deactivate 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 activate linkset X\n");
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
* *
* Moises Silva <moy@sangoma.com> * Moises Silva <moy@sangoma.com>
* David Yat Sin <dyatsin@sangoma.com> * David Yat Sin <dyatsin@sangoma.com>
* James Zhang <jzhang@sangoma.com>
* *
*/ */
...@@ -1474,14 +1475,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) ...@@ -1474,14 +1475,14 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan)
SS7_DEBUG_CHAN(ftdmchan,"All reset flags cleared %s\n", ""); SS7_DEBUG_CHAN(ftdmchan,"All reset flags cleared %s\n", "");
/* all flags are down so we can bring up the sig status */ /* all flags are down so we can bring up the sig status */
sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP); sngss7_set_sig_status(sngss7_info, FTDM_SIG_STATE_UP);
} /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */ }
} else { } else {
state_flag = 0; state_flag = 0;
SS7_DEBUG_CHAN(ftdmchan,"Down detected blocked flags go to SUSPEND %s\n", " "); SS7_DEBUG_CHAN(ftdmchan,"Down detected blocked flags go to SUSPEND %s\n", " ");
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
break; break;
} /* if !blocked */ }
} else { } else {
SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags); SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags);
...@@ -1489,7 +1490,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) ...@@ -1489,7 +1490,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan)
state_flag = 0; state_flag = 0;
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART); ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
} }
} /* if ((ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART) */ }
/* check if t35 is active */ /* check if t35 is active */
if (sngss7_info->t35.hb_timer_id) { if (sngss7_info->t35.hb_timer_id) {
...@@ -1532,20 +1533,47 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan) ...@@ -1532,20 +1533,47 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t *ftdmchan)
/* check if there is a glared call that needs to be processed */ /* check if there is a glared call that needs to be processed */
if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) { if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) {
/* clear the glare flag */
sngss7_clear_ckt_flag (sngss7_info, FLAG_GLARE); sngss7_clear_ckt_flag (sngss7_info, FLAG_GLARE);
/* check if we have an IAM stored...if we don't have one just exit */
if (sngss7_info->glare.circuit != 0) { if (sngss7_info->glare.circuit != 0) {
/* send the saved call back in to us */ int bHandle=0;
handle_con_ind (0, switch (g_ftdm_sngss7_data.cfg.glareResolution) {
sngss7_info->glare.spInstId, case SNGSS7_GLARE_DOWN:
sngss7_info->glare.circuit, SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Giving control to the other side, handling copied IAM from glare. \n", sngss7_info->circuit->cic);
&sngss7_info->glare.iam); bHandle = 1;
break;
case SNGSS7_GLARE_PC:
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Trying to handle IAM copied from glare. \n", sngss7_info->circuit->cic);
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]My PC = %d, incoming PC = %d. \n", sngss7_info->circuit->cic,
g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc,
g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc );
if( g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].spc > g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].dpc )
{
if ((sngss7_info->circuit->cic % 2) == 1 ) {
bHandle = 1;
}
} else {
if( (sngss7_info->circuit->cic % 2) == 0 ) {
bHandle = 1;
}
}
break;
default: /* if configured as SNGSS7_GLARE_CONTROL, always abandon incoming glared IAM. */
bHandle = 0;
break;
}
if (!bHandle) {
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Handling glare IAM. \n", sngss7_info->circuit->cic);
handle_con_ind (0, sngss7_info->glare.spInstId, sngss7_info->glare.circuit, &sngss7_info->glare.iam);
}
/* clear the glare info */ /* clear the glare info */
memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t)); memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t));
state_flag = 0;
} }
} }
......
...@@ -29,6 +29,12 @@ ...@@ -29,6 +29,12 @@
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* Contributors:
*
* James Zhang <jzhang@sangoma.com>
*
*/ */
/******************************************************************************/ /******************************************************************************/
#ifndef __FTMOD_SNG_SS7_H__ #ifndef __FTMOD_SNG_SS7_H__
...@@ -195,6 +201,21 @@ typedef struct sng_mtp2_link { ...@@ -195,6 +201,21 @@ typedef struct sng_mtp2_link {
uint32_t t7; uint32_t t7;
} sng_mtp2_link_t; } sng_mtp2_link_t;
/* defining glare handling methods:
SNGSS7_GLARE_PC:
higher PointCode controls even number CIC
lower PointCode controls odd number CIC
SNGSS7_GLARE_DOWN:
always give control to the other side
SNGSS7_GLARE_CONTROL:
always trying to control
*/
typedef enum {
SNGSS7_GLARE_PC = 0,
SNGSS7_GLARE_DOWN,
SNGSS7_GLARE_CONTROL
} sng_glare_resolution;
typedef struct sng_mtp3_link { typedef struct sng_mtp3_link {
char name[MAX_NAME_LEN]; char name[MAX_NAME_LEN];
uint32_t flags; uint32_t flags;
...@@ -444,6 +465,7 @@ typedef struct sng_ss7_cfg { ...@@ -444,6 +465,7 @@ typedef struct sng_ss7_cfg {
sng_isup_ckt_t isupCkt[10000]; /* KONRAD - only need 2000 ( and 0-1000 aren't used) since other servers are registerd else where */ sng_isup_ckt_t isupCkt[10000]; /* KONRAD - only need 2000 ( and 0-1000 aren't used) since other servers are registerd else where */
sng_nsap_t nsap[MAX_NSAPS+1]; sng_nsap_t nsap[MAX_NSAPS+1];
sng_isap_t isap[MAX_ISAPS+1]; sng_isap_t isap[MAX_ISAPS+1];
sng_glare_resolution glareResolution;
} sng_ss7_cfg_t; } sng_ss7_cfg_t;
typedef struct ftdm_sngss7_data { typedef struct ftdm_sngss7_data {
...@@ -871,7 +893,6 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r ...@@ -871,7 +893,6 @@ ftdm_status_t copy_redirgInfo_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirInfo *r
ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); ftdm_status_t copy_ocn_to_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum);
ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum); ftdm_status_t copy_ocn_from_sngss7(ftdm_channel_t *ftdmchan, SiOrigCdNum *origCdNum);
ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_locPtyNum_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum);
ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum); ftdm_status_t copy_locPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *locPtyNum);
ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb); ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb);
......
...@@ -29,6 +29,12 @@ ...@@ -29,6 +29,12 @@
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
* Contributors:
*
* James Zhang <jzhang@sangoma.com>
*
*/ */
/* INCLUDE ********************************************************************/ /* INCLUDE ********************************************************************/
...@@ -191,6 +197,7 @@ static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, i ...@@ -191,6 +197,7 @@ static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, i
static int ftmod_ss7_fill_in_circuits(sng_span_t *sngSpan); static int ftmod_ss7_fill_in_circuits(sng_span_t *sngSpan);
static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot); static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot);
static void ftmod_ss7_set_glare_resolution (const char *method);
/******************************************************************************/ /******************************************************************************/
...@@ -239,11 +246,11 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa ...@@ -239,11 +246,11 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa
if (!strcasecmp(var, "dialplan")) { if (!strcasecmp(var, "dialplan")) {
/**********************************************************************/ /**********************************************************************/
/* do i give a shit about this??? */ /* don't care for now */
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(var, "context")) { } else if (!strcasecmp(var, "context")) {
/**********************************************************************/ /**********************************************************************/
/* do i give a shit about this??? */ /* don't care for now */
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(var, "ccSpanId")) { } else if (!strcasecmp(var, "ccSpanId")) {
/**********************************************************************/ /**********************************************************************/
...@@ -451,6 +458,26 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup) ...@@ -451,6 +458,26 @@ static int ftmod_ss7_parse_sng_isup(ftdm_conf_node_t *sng_isup)
return FTDM_SUCCESS; return FTDM_SUCCESS;
} }
static void ftmod_ss7_set_glare_resolution (const char *method)
{
sng_glare_resolution iMethod=SNGSS7_GLARE_PC;
if (!method || (strlen (method) <=0) ) {
SS7_ERROR( "Wrong glare resolution parameter, using default. \n" );
} else {
if (!strcasecmp( method, "PointCode")) {
iMethod = SNGSS7_GLARE_PC;
} else if (!strcasecmp( method, "Down")) {
iMethod = SNGSS7_GLARE_DOWN;
} else if (!strcasecmp( method, "Control")) {
iMethod = SNGSS7_GLARE_CONTROL;
} else {
SS7_ERROR( "Wrong glare resolution parameter, using default. \n" );
iMethod = SNGSS7_GLARE_DOWN;
}
}
g_ftdm_sngss7_data.cfg.glareResolution = iMethod;
}
/******************************************************************************/ /******************************************************************************/
static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen)
{ {
...@@ -463,28 +490,27 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen) ...@@ -463,28 +490,27 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen)
/* extract all the information from the parameters */ /* extract all the information from the parameters */
for (i = 0; i < num_parms; i++) { for (i = 0; i < num_parms; i++) {
/**************************************************************************/
if (!strcasecmp(parm->var, "procId")) { if (!strcasecmp(parm->var, "procId")) {
/**********************************************************************/
g_ftdm_sngss7_data.cfg.procId = atoi(parm->val); g_ftdm_sngss7_data.cfg.procId = atoi(parm->val);
SS7_DEBUG("Found a procId = %d\n", g_ftdm_sngss7_data.cfg.procId); SS7_DEBUG("Found a procId = %d\n", g_ftdm_sngss7_data.cfg.procId);
/**********************************************************************/ }
} else if (!strcasecmp(parm->var, "license")) { else if (!strcasecmp(parm->var, "license")) {
/**********************************************************************/
ftdm_set_string(g_ftdm_sngss7_data.cfg.license, parm->val); ftdm_set_string(g_ftdm_sngss7_data.cfg.license, parm->val);
snprintf(g_ftdm_sngss7_data.cfg.signature, sizeof(g_ftdm_sngss7_data.cfg.signature), "%s.sig", parm->val); snprintf(g_ftdm_sngss7_data.cfg.signature, sizeof(g_ftdm_sngss7_data.cfg.signature), "%s.sig", parm->val);
SS7_DEBUG("Found license file = %s\n", g_ftdm_sngss7_data.cfg.license); SS7_DEBUG("Found license file = %s\n", g_ftdm_sngss7_data.cfg.license);
SS7_DEBUG("Found signature file = %s\n", g_ftdm_sngss7_data.cfg.signature); SS7_DEBUG("Found signature file = %s\n", g_ftdm_sngss7_data.cfg.signature);
/**********************************************************************/ }
} else if (!strcasecmp(parm->var, "transparent_iam_max_size")) { else if (!strcasecmp(parm->var, "transparent_iam_max_size")) {
g_ftdm_sngss7_data.cfg.transparent_iam_max_size = atoi(parm->val); g_ftdm_sngss7_data.cfg.transparent_iam_max_size = atoi(parm->val);
SS7_DEBUG("Found a transparent_iam max size = %d\n", g_ftdm_sngss7_data.cfg.transparent_iam_max_size); SS7_DEBUG("Found a transparent_iam max size = %d\n", g_ftdm_sngss7_data.cfg.transparent_iam_max_size);
} else { }
/**********************************************************************/ else if (!strcasecmp(parm->var, "glare-reso")) {
ftmod_ss7_set_glare_resolution (parm->val);
SS7_DEBUG("Found glare resolution configuration = %d %s\n", g_ftdm_sngss7_data.cfg.glareResolution, parm->val );
}
else {
SS7_ERROR("Found an invalid parameter \"%s\"!\n", parm->val); SS7_ERROR("Found an invalid parameter \"%s\"!\n", parm->val);
return FTDM_FAIL; return FTDM_FAIL;
/**********************************************************************/
} }
/* move to the next parmeter */ /* move to the next parmeter */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论