mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-10-29 14:44:17 +00:00
Merge branch 'master' into netborder
This commit is contained in:
commit
86884e5256
16 files changed
+223
-140
No files matched your search
@@ -84,6 +84,8 @@ static ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span
|
||||
signal_data->switchtype = SNGISDN_SWITCH_4ESS;
|
||||
} else if (!strcasecmp(switch_name, "dms100")) {
|
||||
signal_data->switchtype = SNGISDN_SWITCH_DMS100;
|
||||
} else if (!strcasecmp(switch_name, "qsig")) {
|
||||
signal_data->switchtype = SNGISDN_SWITCH_QSIG;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported switchtype %s for trunktype:%s\n", span->name, switch_name, ftdm_trunk_type2str(span->trunk_type));
|
||||
return FTDM_FAIL;
|
||||
|
||||
@@ -667,25 +667,33 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
|
||||
cfg.t.cfg.s.inDLSAP.maxBSrvCnt = 2;
|
||||
cfg.t.cfg.s.inDLSAP.maxDSrvCnt = 2;
|
||||
#endif /* ISDN_SRV */
|
||||
|
||||
if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = NETWORK;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = FALSE; /* in case of glare, do not clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
|
||||
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
|
||||
signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
|
||||
}
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = USER;
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_QSIG) {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = SYM_USER;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = TRUE; /* in case of glare, clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
} else {
|
||||
if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = NETWORK;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = FALSE; /* in case of glare, do not clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE;
|
||||
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN ||
|
||||
signal_data->switchtype == SNGISDN_SWITCH_INSNET) {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = TRUE;
|
||||
}
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.ackOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.intType = USER;
|
||||
cfg.t.cfg.s.inDLSAP.clrGlr = TRUE; /* in case of glare, clear local call */
|
||||
cfg.t.cfg.s.inDLSAP.statEnqOpt = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.rstOpt = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Override the restart options if user selected that option */
|
||||
|
||||
@@ -352,22 +352,6 @@ int ft_to_sngss7_cfg_all(void)
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) */
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[1].id != 0) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpRoute[0].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_mtp3_route_config(0)) {
|
||||
SS7_CRITICAL("MTP3 ROUTE 0 configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP3 ROUTE 0 configuration DONE!\n");
|
||||
}
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
}
|
||||
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isap[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
@@ -1161,10 +1145,10 @@ int ftmod_ss7_mtp3_route_config(int id)
|
||||
cfg.t.cfg.s.snRout.swtchType = k->linkType; /* switch type */
|
||||
cfg.t.cfg.s.snRout.upSwtch = k->switchType; /* user part switch type */
|
||||
cfg.t.cfg.s.snRout.cmbLnkSetId = k->cmbLinkSetId; /* combined link set ID */
|
||||
if (k->id == 0) {
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_UP; /* direction */
|
||||
if (k->dir == SNG_RTE_UP) {
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_UP; /* direction */
|
||||
} else {
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_DN; /* direction */
|
||||
cfg.t.cfg.s.snRout.dir = LSN_RTE_DN; /* direction */
|
||||
}
|
||||
cfg.t.cfg.s.snRout.rteToAdjSp = 0; /* flag indicating this route to adjacent SP */
|
||||
cfg.t.cfg.s.snRout.ssf = k->ssf; /* sub service field */
|
||||
|
||||
@@ -680,8 +680,8 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
|
||||
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");
|
||||
stream->write_function(stream, "ftdm ss7 show status linkset X\n");
|
||||
stream->write_function(stream, "ftdm ss7 show status mtp3 X\n");
|
||||
stream->write_function(stream, "ftdm ss7 show status mtp2 X\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 inuse span X chan Y\n");
|
||||
|
||||
@@ -273,6 +273,7 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
ftdm_interrupt_t *ftdm_sangoma_ss7_int[2];
|
||||
ftdm_span_t *ftdmspan = (ftdm_span_t *) obj;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
ftdm_event_t *event = NULL;
|
||||
sngss7_event_data_t *sngss7_event = NULL;
|
||||
sngss7_span_data_t *sngss7_span = (sngss7_span_data_t *)ftdmspan->signal_data;
|
||||
|
||||
@@ -363,6 +364,22 @@ static void *ftdm_sangoma_ss7_run(ftdm_thread_t * me, void *obj)
|
||||
|
||||
/* check each channel on the span to see if there is an un-procressed SUS/RES flag */
|
||||
check_for_res_sus_flag(ftdmspan);
|
||||
|
||||
/* Poll for events, e.g HW DTMF */
|
||||
switch (ftdm_span_poll_event(ftdmspan, 0, NULL)) {
|
||||
/**********************************************************************/
|
||||
case FTDM_SUCCESS:
|
||||
while (ftdm_span_next_event(ftdmspan, &event) == FTDM_SUCCESS);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case FTDM_TIMEOUT:
|
||||
/* No events pending */
|
||||
break;
|
||||
/**********************************************************************/
|
||||
default:
|
||||
SS7_ERROR("%s:Failed to poll span event\n", ftdmspan->name);
|
||||
/**********************************************************************/
|
||||
} /* switch (ftdm_span_poll_event(span, 0)) */
|
||||
} /* master while loop */
|
||||
|
||||
/* clear the IN_THREAD flag so that we know the thread is done */
|
||||
|
||||
@@ -82,6 +82,11 @@ typedef enum {
|
||||
HOLE
|
||||
} sng_ckt_type_t;
|
||||
|
||||
typedef enum {
|
||||
SNG_RTE_UP = 0,
|
||||
SNG_RTE_DN
|
||||
} sng_route_direction_t;
|
||||
|
||||
typedef enum {
|
||||
SNGSS7_LPA_FOR_COT = (1 << 0), /* send LPA when COT arrives */
|
||||
SNGSS7_ACM_OBCI_BITA = (1 << 10) /* in-band indication */
|
||||
@@ -236,6 +241,7 @@ typedef struct sng_route {
|
||||
uint32_t ssf;
|
||||
uint32_t nwId;
|
||||
uint32_t isSTP;
|
||||
uint32_t dir;
|
||||
uint32_t t6;
|
||||
uint32_t t8;
|
||||
uint32_t t10;
|
||||
|
||||
@@ -1749,33 +1749,46 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
|
||||
/* default the interface to paused state */
|
||||
sngss7_set_flag(&sng_isup, SNGSS7_PAUSED);
|
||||
|
||||
|
||||
|
||||
/* trickle down the SPC to all sub entities */
|
||||
lnkSet = &g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].lnkSets;
|
||||
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[lnkSet->lsId].spc = sng_isup.spc;
|
||||
lnkSet = lnkSet->next;
|
||||
|
||||
while (lnkSet->next != NULL) {
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[lnkSet->lsId].spc = sng_isup.spc;
|
||||
/**************************************************************************/
|
||||
/* go through all the links and check if they belong to this linkset*/
|
||||
i = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtp3Link[i].id != 0) {
|
||||
/* check if this link is in the linkset */
|
||||
if (g_ftdm_sngss7_data.cfg.mtp3Link[i].linkSetId == lnkSet->lsId) {
|
||||
/* fill in the spc */
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[i].spc = sng_isup.spc;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
/* move to the next lnkSet */
|
||||
lnkSet = lnkSet->next;
|
||||
}
|
||||
/**************************************************************************/
|
||||
} /* while (lnkSet->next != NULL) */
|
||||
|
||||
/* pull values from the lower levels */
|
||||
sng_isup.dpc = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].dpc;
|
||||
sng_isup.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
|
||||
sng_isup.nwId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].nwId;
|
||||
|
||||
sng_isap.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
|
||||
|
||||
/* fill in the isap */
|
||||
ftmod_ss7_fill_in_isap(&sng_isap);
|
||||
|
||||
sng_isup.isap = sng_isap.id;
|
||||
/* pull values from the lower levels */
|
||||
sng_isup.isap = sng_isap.id;
|
||||
sng_isup.dpc = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].dpc;
|
||||
sng_isup.switchType = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].switchType;
|
||||
sng_isup.nwId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].nwId;
|
||||
|
||||
/* fill in the isup interface */
|
||||
ftmod_ss7_fill_in_isup_interface(&sng_isup);
|
||||
|
||||
/* setup the self mtp3 route */
|
||||
i = sng_isup.mtpRouteId;
|
||||
|
||||
if(ftmod_ss7_fill_in_self_route(sng_isup.spc,
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType,
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType,
|
||||
@@ -2383,6 +2396,7 @@ static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].nwId = mtp3_route->nwId;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].lnkSets = mtp3_route->lnkSets;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf = mtp3_route->ssf;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].dir = SNG_RTE_DN;
|
||||
if (mtp3_route->t6 != 0) {
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = mtp3_route->t6;
|
||||
} else {
|
||||
@@ -2442,6 +2456,52 @@ static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
|
||||
{
|
||||
int i = 1;
|
||||
|
||||
while (g_ftdm_sngss7_data.cfg.mtpRoute[i].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc == spc) {
|
||||
/* we have a match so break out of this loop */
|
||||
break;
|
||||
}
|
||||
/* move on to the next one */
|
||||
i++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[i].id == 0) {
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
|
||||
SS7_DEBUG("found new mtp3 self route\n");
|
||||
} else {
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
|
||||
SS7_DEBUG("found existing mtp3 self route\n");
|
||||
}
|
||||
|
||||
strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, "self-route", MAX_NAME_LEN-1);
|
||||
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].id = i;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc = spc;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].linkType = linkType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].switchType = switchType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].cmbLinkSetId = i;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].isSTP = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].ssf = ssf;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].dir = SNG_RTE_UP;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t6 = 8;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t8 = 12;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t10 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t11 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t15 = 30;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t16 = 20;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t18 = 200;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t19 = 690;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t21 = 650;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[i].t25 = 100;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_nsap(sng_route_t *mtp3_route)
|
||||
{
|
||||
@@ -2754,45 +2814,6 @@ static int ftmod_ss7_fill_in_isap(sng_isap_t *sng_isap)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, int ssf)
|
||||
{
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == 0){
|
||||
SS7_DEBUG("found new mtp3 self route\n");
|
||||
} else if (g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc == spc) {
|
||||
SS7_DEBUG("found existing mtp3 self route\n");
|
||||
return FTDM_SUCCESS;
|
||||
} else {
|
||||
SS7_ERROR("found new mtp3 self route but it does not match the route already configured (dpc=%d:spc=%d)\n",
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc,
|
||||
spc);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-route", MAX_NAME_LEN-1);
|
||||
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].id = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc = spc;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].linkType = linkType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].switchType = switchType;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].cmbLinkSetId = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].isSTP = 0;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].ssf = ssf;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t6 = 8;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t8 = 12;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t10 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t11 = 300;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t15 = 30;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t16 = 20;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t18 = 200;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t19 = 690;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t21 = 650;
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].t25 = 100;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
|
||||
{
|
||||
@@ -2812,7 +2833,7 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
|
||||
}
|
||||
|
||||
/* find a spot for this circuit in the global structure */
|
||||
x = (ccSpan->procId * 1000);
|
||||
x = (ccSpan->procId * 1000) + 1;
|
||||
flag = 0;
|
||||
while (flag == 0) {
|
||||
/**********************************************************************/
|
||||
|
||||
Reference in new issue
Block a user