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, "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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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", "");
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
/******************************************************************************/
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue