freetdm: ss7 - updated libSng-SS7 api, fixed spelling mistake in cli, added support for obci_bita
This commit is contained in:
parent
89351e0252
commit
d2691a7ff5
|
@ -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, "Sangoma SS7 CLI usuage:\n\n");
|
||||||
|
|
||||||
stream->write_function(stream, "Ftmod_sangoma_ss7 general control:\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 ftrace X Y\n");
|
||||||
stream->write_function(stream, "ftdm ss7 set mtace 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, "Ftmod_sangoma_ss7 information:\n");
|
||||||
stream->write_function(stream, "ftdm ss7 show status link X\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 */
|
/* grab the signaling_status */
|
||||||
ftdm_channel_get_sig_status(ftdmchan, &sigstatus);
|
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->span,
|
||||||
ckt->chan,
|
ckt->chan,
|
||||||
ckt->cic,
|
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.remBlkd) ? "Y":"N",
|
||||||
(sta.t.ssta.s.snDLSAP.locInhbt) ? "Y":"N",
|
(sta.t.ssta.s.snDLSAP.locInhbt) ? "Y":"N",
|
||||||
(sta.t.ssta.s.snDLSAP.rmtInhbt) ? "Y":"N");
|
(sta.t.ssta.s.snDLSAP.rmtInhbt) ? "Y":"N");
|
||||||
break;
|
|
||||||
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* move to the next link */
|
/* move to the next link */
|
||||||
x++;
|
x++;
|
||||||
} /* while (id != 0) */
|
} /* while (id != 0) */
|
||||||
|
|
||||||
|
stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
|
||||||
|
|
||||||
|
success:
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1313,13 +1317,17 @@ static ftdm_status_t handle_status_linkset(ftdm_stream_handle_t *stream, char *n
|
||||||
name,
|
name,
|
||||||
DECODE_LSN_LINKSET_STATUS(sta.t.ssta.s.snLnkSet.state),
|
DECODE_LSN_LINKSET_STATUS(sta.t.ssta.s.snLnkSet.state),
|
||||||
sta.t.ssta.s.snLnkSet.nmbActLnks);
|
sta.t.ssta.s.snLnkSet.nmbActLnks);
|
||||||
break;
|
|
||||||
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* move to the next linkset */
|
/* move to the next linkset */
|
||||||
x++;
|
x++;
|
||||||
} /* while (id != 0) */
|
} /* while (id != 0) */
|
||||||
|
|
||||||
|
stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
|
||||||
|
|
||||||
|
success:
|
||||||
return FTDM_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 */
|
/* print the new status of the link */
|
||||||
handle_status_link(stream, &name[0]);
|
handle_status_link(stream, &name[0]);
|
||||||
|
|
||||||
break;
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* move to the next linkset */
|
/* move to the next linkset */
|
||||||
x++;
|
x++;
|
||||||
} /* while (id != 0) */
|
} /* while (id != 0) */
|
||||||
|
|
||||||
|
stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
|
||||||
|
|
||||||
|
success:
|
||||||
return FTDM_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 */
|
/* print the new status of the link */
|
||||||
handle_status_link(stream, &name[0]);
|
handle_status_link(stream, &name[0]);
|
||||||
|
|
||||||
break;
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* move to the next linkset */
|
/* move to the next linkset */
|
||||||
x++;
|
x++;
|
||||||
} /* while (id != 0) */
|
} /* while (id != 0) */
|
||||||
|
|
||||||
|
stream->write_function(stream, "Failed to find link=\"%s\"\n", name);
|
||||||
|
|
||||||
|
success:
|
||||||
return FTDM_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 */
|
/* go the next circuit */
|
||||||
x++;
|
x++;
|
||||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
|
} /* 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;
|
return FTDM_SUCCESS;
|
||||||
|
@ -1505,6 +1523,24 @@ static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int c
|
||||||
x++;
|
x++;
|
||||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x]id != 0) */
|
} /* 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;
|
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 */
|
/* send the circuit group block */
|
||||||
ft_to_sngss7_cgb(main_chan);
|
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;
|
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 */
|
/* send the circuit group block */
|
||||||
ft_to_sngss7_cgu(main_chan);
|
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;
|
return FTDM_SUCCESS;
|
||||||
|
|
|
@ -1480,7 +1480,7 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init)
|
||||||
|
|
||||||
sngss7_id = 0;
|
sngss7_id = 0;
|
||||||
|
|
||||||
cmbLinkSetId = 1;
|
cmbLinkSetId = 0;
|
||||||
|
|
||||||
/* initalize the global gen_config flag */
|
/* initalize the global gen_config flag */
|
||||||
g_ftdm_sngss7_data.gen_config = 0;
|
g_ftdm_sngss7_data.gen_config = 0;
|
||||||
|
|
|
@ -85,6 +85,10 @@ typedef enum {
|
||||||
SNGSS7_PAUSED = (1 << 7)
|
SNGSS7_PAUSED = (1 << 7)
|
||||||
} sng_flag_t;
|
} sng_flag_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SNGSS7_ACM_OBCI_BITA = (1 << 0) /* in-band indication */
|
||||||
|
} sng_intf_options_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SNG_CALLED = 1,
|
SNG_CALLED = 1,
|
||||||
SNG_CALLING = 2
|
SNG_CALLING = 2
|
||||||
|
@ -205,6 +209,7 @@ typedef struct sng_route {
|
||||||
typedef struct sng_isup_intf {
|
typedef struct sng_isup_intf {
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
char name[MAX_NAME_LEN];
|
char name[MAX_NAME_LEN];
|
||||||
|
uint32_t options;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
uint32_t spc;
|
uint32_t spc;
|
||||||
uint32_t dpc;
|
uint32_t dpc;
|
||||||
|
@ -721,6 +726,11 @@ void handle_isup_t35(void *userdata);
|
||||||
#define sngss7_clear_flag(obj, flag) ((obj)->flags &= ~(flag))
|
#define sngss7_clear_flag(obj, flag) ((obj)->flags &= ~(flag))
|
||||||
#define sngss7_set_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
|
#ifdef SS7_PRODUCTION
|
||||||
# define SS7_ASSERT \
|
# define SS7_ASSERT \
|
||||||
SS7_INFO_CHAN(ftdmchan,"Production Mode, continuing%s\n", "");
|
SS7_INFO_CHAN(ftdmchan,"Production Mode, continuing%s\n", "");
|
||||||
|
|
|
@ -308,7 +308,8 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
|
||||||
{
|
{
|
||||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
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;
|
SiCnStEvnt acm;
|
||||||
|
|
||||||
memset (&acm, 0x0, sizeof (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.echoCtrlDevInd.val = 0x1; /* ec device present */
|
||||||
acm.bckCallInd.sccpMethInd.pres = PRSNT_NODEF;
|
acm.bckCallInd.sccpMethInd.pres = PRSNT_NODEF;
|
||||||
acm.bckCallInd.sccpMethInd.val = SCCPMTH_NOIND;
|
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 */
|
/* send the ACM request to LibSngSS7 */
|
||||||
sng_cc_con_status (1,
|
sng_cc_con_status (1,
|
||||||
sngss7_info->suInstId,
|
sngss7_info->suInstId,
|
||||||
|
|
|
@ -50,27 +50,41 @@ int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm);
|
||||||
int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm)
|
int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm)
|
||||||
{
|
{
|
||||||
SnMngmt sta;
|
SnMngmt sta;
|
||||||
|
Pst pst;
|
||||||
|
|
||||||
memset(&sta, 0x0, sizeof(sta));
|
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.elmnt = STDLSAP;
|
||||||
sta.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
|
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)
|
int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm)
|
||||||
{
|
{
|
||||||
SnMngmt sta;
|
SnMngmt sta;
|
||||||
|
Pst pst;
|
||||||
|
|
||||||
memset(&sta, 0x0, sizeof(sta));
|
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.elmnt = STLNKSET;
|
||||||
sta.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtpLinkSet[id].id;
|
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];
|
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));
|
||||||
}
|
}
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
|
|
@ -1249,6 +1249,18 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
|
||||||
sng_isup.cld_nadi = atoi(parm->val);
|
sng_isup.cld_nadi = atoi(parm->val);
|
||||||
SS7_DEBUG("\tFound default CLD_NADI value = %d\n", sng_isup.cld_nadi);
|
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 {
|
} else {
|
||||||
SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
|
SS7_ERROR("\tFound an invalid parameter \"%s\"!\n", parm->val);
|
||||||
return FTDM_FAIL;
|
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].isap = sng_isup->isap;
|
||||||
g_ftdm_sngss7_data.cfg.isupIntf[i].cld_nadi = sng_isup->cld_nadi;
|
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].clg_nadi = sng_isup->clg_nadi;
|
||||||
|
g_ftdm_sngss7_data.cfg.isupIntf[i].options = sng_isup->options;
|
||||||
if (sng_isup->t4 != 0) {
|
if (sng_isup->t4 != 0) {
|
||||||
g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = sng_isup->t4;
|
g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = sng_isup->t4;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue