mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-11-15 13:58:32 +00:00
Merge branch 'master' of git.sangoma.com:smg_freeswitch
This commit is contained in:
commit
f06298f163
28 files changed
+955
-364
No files matched your search
@@ -120,7 +120,7 @@ ftdm_state_map_t sangoma_isdn_state_map = {
|
||||
ZSD_INBOUND,
|
||||
ZSM_UNACCEPTABLE,
|
||||
{FTDM_CHANNEL_STATE_RING, FTDM_END},
|
||||
{FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_PROCEED, FTDM_CHANNEL_STATE_RINGING, FTDM_CHANNEL_STATE_PROGRESS, FTDM_END}
|
||||
{FTDM_CHANNEL_STATE_TERMINATING, FTDM_CHANNEL_STATE_HANGUP, FTDM_CHANNEL_STATE_PROCEED, FTDM_CHANNEL_STATE_RINGING, FTDM_CHANNEL_STATE_PROGRESS, FTDM_CHANNEL_STATE_PROGRESS_MEDIA, FTDM_END}
|
||||
},
|
||||
{
|
||||
ZSD_INBOUND,
|
||||
|
||||
@@ -38,6 +38,7 @@ static ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span
|
||||
static ftdm_status_t parse_signalling(const char* signalling, ftdm_span_t *span);
|
||||
static ftdm_status_t add_local_number(const char* val, ftdm_span_t *span);
|
||||
static ftdm_status_t parse_yesno(const char* var, const char* val, uint8_t *target);
|
||||
static ftdm_status_t set_switchtype_defaults(ftdm_span_t *span);
|
||||
|
||||
extern ftdm_sngisdn_data_t g_sngisdn_data;
|
||||
|
||||
@@ -149,7 +150,7 @@ static ftdm_status_t parse_switchtype(const char* switch_name, ftdm_span_t *span
|
||||
|
||||
g_sngisdn_data.spans[signal_data->link_id] = signal_data;
|
||||
|
||||
ftdm_log(FTDM_LOG_DEBUG, "%s: cc_id:%d dchan_id:%d span_id:%d\n", span->name, signal_data->cc_id, signal_data->dchan_id, signal_data->span_id);
|
||||
ftdm_log(FTDM_LOG_DEBUG, "%s: cc_id:%d dchan_id:%d span_id:%d link_id:%d\n", span->name, signal_data->cc_id, signal_data->dchan_id, signal_data->span_id, signal_data->link_id);
|
||||
|
||||
|
||||
chaniter = ftdm_span_get_chan_iterator(span, NULL);
|
||||
@@ -191,6 +192,63 @@ static ftdm_status_t parse_signalling(const char* signalling, ftdm_span_t *span)
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
static ftdm_status_t set_switchtype_defaults(ftdm_span_t *span)
|
||||
{
|
||||
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) span->signal_data;
|
||||
switch(signal_data->switchtype) {
|
||||
case SNGISDN_SWITCH_NI2:
|
||||
case SNGISDN_SWITCH_5ESS:
|
||||
case SNGISDN_SWITCH_4ESS:
|
||||
case SNGISDN_SWITCH_DMS100:
|
||||
if (span->default_caller_data.dnis.plan >= FTDM_NPI_INVALID) {
|
||||
ftdm_set_npi("isdn", &span->default_caller_data.dnis.plan);
|
||||
}
|
||||
if (span->default_caller_data.dnis.type >= FTDM_TON_INVALID) {
|
||||
ftdm_set_ton("national", &span->default_caller_data.dnis.type);
|
||||
}
|
||||
if (span->default_caller_data.cid_num.plan >= FTDM_NPI_INVALID) {
|
||||
ftdm_set_npi("isdn", &span->default_caller_data.cid_num.plan);
|
||||
}
|
||||
if (span->default_caller_data.cid_num.type >= FTDM_TON_INVALID) {
|
||||
ftdm_set_ton("national", &span->default_caller_data.cid_num.type);
|
||||
}
|
||||
if (span->default_caller_data.rdnis.plan >= FTDM_NPI_INVALID) {
|
||||
ftdm_set_npi("isdn", &span->default_caller_data.rdnis.plan);
|
||||
}
|
||||
if (span->default_caller_data.rdnis.type >= FTDM_TON_INVALID) {
|
||||
ftdm_set_ton("national", &span->default_caller_data.rdnis.type);
|
||||
}
|
||||
break;
|
||||
case SNGISDN_SWITCH_EUROISDN:
|
||||
case SNGISDN_SWITCH_QSIG:
|
||||
case SNGISDN_SWITCH_INSNET:
|
||||
if (span->default_caller_data.dnis.plan >= FTDM_NPI_INVALID) {
|
||||
ftdm_set_npi("unknown", &span->default_caller_data.dnis.plan);
|
||||
}
|
||||
if (span->default_caller_data.dnis.type >= FTDM_TON_INVALID) {
|
||||
ftdm_set_ton("unknown", &span->default_caller_data.dnis.type);
|
||||
}
|
||||
if (span->default_caller_data.cid_num.plan >= FTDM_NPI_INVALID) {
|
||||
ftdm_set_npi("unknown", &span->default_caller_data.cid_num.plan);
|
||||
}
|
||||
if (span->default_caller_data.cid_num.type >= FTDM_TON_INVALID) {
|
||||
ftdm_set_ton("unknown", &span->default_caller_data.cid_num.type);
|
||||
}
|
||||
if (span->default_caller_data.rdnis.plan >= FTDM_NPI_INVALID) {
|
||||
ftdm_set_npi("unknown", &span->default_caller_data.rdnis.plan);
|
||||
}
|
||||
if (span->default_caller_data.rdnis.type >= FTDM_TON_INVALID) {
|
||||
ftdm_set_ton("unknown", &span->default_caller_data.rdnis.type);
|
||||
}
|
||||
break;
|
||||
case SNGISDN_SWITCH_INVALID:
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_ERROR, "Unsupported switchtype[%d]\n", signal_data->switchtype);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *span)
|
||||
{
|
||||
unsigned paramindex;
|
||||
@@ -205,31 +263,19 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
|
||||
signal_data->ignore_cause_value = SNGISDN_OPT_DEFAULT;
|
||||
signal_data->timer_t3 = 8;
|
||||
signal_data->restart_opt = SNGISDN_OPT_DEFAULT;
|
||||
|
||||
signal_data->link_id = span->span_id;
|
||||
span->default_caller_data.bearer_capability = IN_ITC_SPEECH;
|
||||
|
||||
span->default_caller_data.dnis.plan = FTDM_NPI_INVALID;
|
||||
span->default_caller_data.dnis.type = FTDM_TON_INVALID;
|
||||
span->default_caller_data.cid_num.plan = FTDM_NPI_INVALID;
|
||||
span->default_caller_data.cid_num.type = FTDM_TON_INVALID;
|
||||
span->default_caller_data.rdnis.plan = FTDM_NPI_INVALID;
|
||||
span->default_caller_data.rdnis.type = FTDM_TON_INVALID;
|
||||
|
||||
span->default_caller_data.bearer_capability = IN_ITC_SPEECH;
|
||||
/* Cannot set default bearer_layer1 yet, as we do not know the switchtype */
|
||||
span->default_caller_data.bearer_layer1 = FTDM_INVALID_INT_PARM;
|
||||
|
||||
if (span->trunk_type == FTDM_TRUNK_BRI ||
|
||||
span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
|
||||
|
||||
ftdm_set_npi("unknown", &span->default_caller_data.dnis.plan);
|
||||
ftdm_set_ton("unknown", &span->default_caller_data.dnis.type);
|
||||
ftdm_set_npi("unknown", &span->default_caller_data.cid_num.plan);
|
||||
ftdm_set_ton("unknown", &span->default_caller_data.cid_num.type);
|
||||
ftdm_set_npi("unknown", &span->default_caller_data.rdnis.plan);
|
||||
ftdm_set_ton("unknown", &span->default_caller_data.rdnis.type);
|
||||
} else {
|
||||
ftdm_set_npi("isdn", &span->default_caller_data.dnis.plan);
|
||||
ftdm_set_ton("national", &span->default_caller_data.dnis.type);
|
||||
ftdm_set_npi("isdn", &span->default_caller_data.cid_num.plan);
|
||||
ftdm_set_ton("national", &span->default_caller_data.cid_num.type);
|
||||
ftdm_set_npi("isdn", &span->default_caller_data.rdnis.plan);
|
||||
ftdm_set_ton("national", &span->default_caller_data.rdnis.type);
|
||||
}
|
||||
|
||||
for (paramindex = 0; ftdm_parameters[paramindex].var; paramindex++) {
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Sangoma ISDN key=value, %s=%s\n", ftdm_parameters[paramindex].var, ftdm_parameters[paramindex].val);
|
||||
var = ftdm_parameters[paramindex].var;
|
||||
@@ -239,6 +285,9 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
|
||||
if (parse_switchtype(val, span) != FTDM_SUCCESS) {
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
if (set_switchtype_defaults(span) != FTDM_SUCCESS) {
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
} else if (!strcasecmp(var, "signalling") ||
|
||||
!strcasecmp(var, "interface")) {
|
||||
if (parse_signalling(val, span) != FTDM_SUCCESS) {
|
||||
|
||||
@@ -216,7 +216,7 @@ ftdm_status_t sngisdn_stack_cfg_phy_psap(ftdm_span_t *span)
|
||||
cfg.hdr.entId.inst = S_INST;
|
||||
cfg.hdr.elmId.elmnt = STPSAP;
|
||||
|
||||
cfg.hdr.elmId.elmntInst1 = signal_data->link_id;
|
||||
cfg.hdr.elmId.elmntInst1 = signal_data->dchan_id;
|
||||
|
||||
if (!signal_data->dchan) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "%s:No d-channels specified\n", span->name);
|
||||
@@ -241,7 +241,8 @@ ftdm_status_t sngisdn_stack_cfg_phy_psap(ftdm_span_t *span)
|
||||
ftdm_log(FTDM_LOG_ERROR, "%s:Unsupported trunk type %d\n", span->name, span->trunk_type);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
cfg.t.cfg.s.l1PSAP.spId = signal_data->link_id;
|
||||
|
||||
cfg.t.cfg.s.l1PSAP.spId = signal_data->dchan_id;
|
||||
|
||||
if (sng_isdn_phy_config(&pst, &cfg)) {
|
||||
return FTDM_FAIL;
|
||||
@@ -315,7 +316,7 @@ ftdm_status_t sngisdn_stack_cfg_q921_msap(ftdm_span_t *span)
|
||||
cfg.hdr.entId.inst = S_INST;
|
||||
cfg.hdr.elmId.elmnt = STMSAP;
|
||||
|
||||
cfg.t.cfg.s.bdMSAP.lnkNmb = signal_data->link_id;
|
||||
cfg.t.cfg.s.bdMSAP.lnkNmb = signal_data->dchan_id;
|
||||
|
||||
cfg.t.cfg.s.bdMSAP.maxOutsFrms = 24; /* MAC window */
|
||||
cfg.t.cfg.s.bdMSAP.tQUpperTrs = 32; /* Tx Queue Upper Threshold */
|
||||
@@ -408,7 +409,7 @@ ftdm_status_t sngisdn_stack_cfg_q921_dlsap(ftdm_span_t *span, uint8_t management
|
||||
cfg.hdr.entId.inst = S_INST;
|
||||
cfg.hdr.elmId.elmnt = STDLSAP;
|
||||
|
||||
cfg.t.cfg.s.bdDLSAP.lnkNmb = signal_data->link_id;
|
||||
cfg.t.cfg.s.bdDLSAP.lnkNmb = signal_data->dchan_id;
|
||||
|
||||
cfg.t.cfg.s.bdDLSAP.n201 = 1028; /* n201 */
|
||||
if (span->trunk_type == FTDM_TRUNK_BRI_PTMP ||
|
||||
@@ -613,9 +614,9 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
|
||||
|
||||
cfg.hdr.response.selector=0;
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.sapId = signal_data->dchan_id;
|
||||
cfg.t.cfg.s.inDLSAP.spId = signal_data->dchan_id;
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.sapId = signal_data->link_id;
|
||||
cfg.t.cfg.s.inDLSAP.spId = signal_data->link_id;
|
||||
cfg.t.cfg.s.inDLSAP.swtch = sng_isdn_stack_switchtype(signal_data->switchtype);
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.n201 = 1024;
|
||||
@@ -876,8 +877,7 @@ ftdm_status_t sngisdn_stack_cfg_q931_lce(ftdm_span_t *span)
|
||||
|
||||
cfg.hdr.response.selector=0;
|
||||
|
||||
cfg.t.cfg.s.inLCe.sapId = signal_data->link_id;
|
||||
|
||||
cfg.t.cfg.s.inLCe.sapId = signal_data->dchan_id;
|
||||
|
||||
cfg.t.cfg.s.inLCe.lnkUpDwnInd = TRUE;
|
||||
cfg.t.cfg.s.inLCe.tCon.enb = TRUE;
|
||||
|
||||
@@ -146,7 +146,8 @@ ftdm_status_t sngisdn_deactivate_phy(ftdm_span_t *span)
|
||||
|
||||
cntrl.t.cntrl.action = AUBND_DIS;
|
||||
cntrl.t.cntrl.subAction = SAELMNT;
|
||||
cntrl.t.cntrl.sapId = signal_data->link_id;
|
||||
|
||||
cntrl.t.cntrl.sapId = signal_data->dchan_id;
|
||||
|
||||
if (sng_isdn_phy_cntrl(&pst, &cntrl)) {
|
||||
return FTDM_FAIL;
|
||||
@@ -180,7 +181,8 @@ ftdm_status_t sngisdn_wake_up_phy(ftdm_span_t *span)
|
||||
|
||||
cntrl.t.cntrl.action = AENA;
|
||||
cntrl.t.cntrl.subAction = SAELMNT;
|
||||
cntrl.t.cntrl.sapId = signal_data->link_id;
|
||||
|
||||
cntrl.t.cntrl.sapId = signal_data->dchan_id;
|
||||
|
||||
if (sng_isdn_phy_cntrl(&pst, &cntrl)) {
|
||||
return FTDM_FAIL;
|
||||
@@ -298,7 +300,8 @@ ftdm_status_t sngisdn_cntrl_q931(ftdm_span_t *span, uint8_t action, uint8_t suba
|
||||
if (action == AENA && subaction == SATRC) {
|
||||
cntrl.t.cntrl.trcLen = -1; /* Trace the entire message buffer */
|
||||
}
|
||||
cntrl.t.cntrl.sapId = signal_data->link_id;
|
||||
|
||||
cntrl.t.cntrl.sapId = signal_data->dchan_id;
|
||||
cntrl.t.cntrl.ces = 0;
|
||||
|
||||
if(sng_isdn_q931_cntrl(&pst, &cntrl)) {
|
||||
@@ -339,11 +342,11 @@ ftdm_status_t sngisdn_cntrl_q921(ftdm_span_t *span, uint8_t action, uint8_t suba
|
||||
cntrl.t.cntrl.subAction = subaction;
|
||||
|
||||
#if (SMBD_LMINT3 || BD_LMINT3)
|
||||
cntrl.t.cntrl.lnkNmb = signal_data->link_id;
|
||||
cntrl.t.cntrl.lnkNmb = signal_data->dchan_id;
|
||||
cntrl.t.cntrl.sapi = NOTUSED;
|
||||
cntrl.t.cntrl.tei = NOTUSED;
|
||||
#else /* _LMINT3 */
|
||||
cntrl.hdr.elmId.elmntInst1 = signal_data->link_id;
|
||||
cntrl.hdr.elmId.elmntInst1 = signal_data->dchan_id;
|
||||
cntrl.hdr.elmId.elmntInst2 = NOTUSED;
|
||||
cntrl.hdr.elmId.elmntInst3 = NOTUSED;
|
||||
#endif /* _LMINT3 */
|
||||
|
||||
@@ -491,8 +491,8 @@ void sngisdn_snd_data(ftdm_channel_t *dchan, uint8_t *data, ftdm_size_t len)
|
||||
/* Should we trigger congestion here? */
|
||||
l1_frame.flags |= SNG_L1FRAME_QUEUE_FULL;
|
||||
}
|
||||
|
||||
sng_isdn_data_ind(signal_data->link_id, &l1_frame);
|
||||
|
||||
sng_isdn_data_ind(signal_data->dchan_id, &l1_frame);
|
||||
}
|
||||
|
||||
void sngisdn_snd_event(ftdm_channel_t *dchan, ftdm_oob_event_t event)
|
||||
@@ -506,11 +506,11 @@ void sngisdn_snd_event(ftdm_channel_t *dchan, ftdm_oob_event_t event)
|
||||
switch(event) {
|
||||
case FTDM_OOB_ALARM_CLEAR:
|
||||
l1_event.type = SNG_L1EVENT_ALARM_OFF;
|
||||
sng_isdn_event_ind(signal_data->link_id, &l1_event);
|
||||
sng_isdn_event_ind(signal_data->dchan_id, &l1_event);
|
||||
break;
|
||||
case FTDM_OOB_ALARM_TRAP:
|
||||
l1_event.type = SNG_L1EVENT_ALARM_ON;
|
||||
sng_isdn_event_ind(signal_data->link_id, &l1_event);
|
||||
sng_isdn_event_ind(signal_data->dchan_id, &l1_event);
|
||||
break;
|
||||
default:
|
||||
/* We do not care about the other OOB events for now */
|
||||
|
||||
@@ -662,7 +662,9 @@ void sngisdn_rcv_phy_ind(SuId suId, Reason reason)
|
||||
void sngisdn_rcv_q921_ind(BdMngmt *status)
|
||||
{
|
||||
ftdm_span_t *ftdmspan;
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.spans[status->t.usta.lnkNmb];
|
||||
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.dchans[status->t.usta.lnkNmb].spans[1];
|
||||
|
||||
if (!signal_data) {
|
||||
ftdm_log(FTDM_LOG_INFO, "Received q921 status on unconfigured span (lnkNmb:%d)\n", status->t.usta.lnkNmb);
|
||||
return;
|
||||
@@ -715,7 +717,7 @@ void sngisdn_rcv_q931_ind(InMngmt *status)
|
||||
case LCM_EVENT_DOWN:
|
||||
{
|
||||
ftdm_span_t *ftdmspan;
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.spans[status->t.usta.suId];
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.dchans[status->t.usta.suId].spans[1];
|
||||
if (!signal_data) {
|
||||
ftdm_log(FTDM_LOG_INFO, "Received q931 status on unconfigured span (lnkNmb:%d)\n", status->t.usta.suId);
|
||||
return;
|
||||
@@ -784,7 +786,8 @@ void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf)
|
||||
uint8_t data;
|
||||
ftdm_trace_dir_t dir;
|
||||
uint8_t tdata[1000];
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.spans[trc->t.trc.suId];
|
||||
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.dchans[trc->t.trc.suId].spans[1];
|
||||
|
||||
ftdm_assert(mBuf != NULLP, "Received a Q931 trace with no buffer");
|
||||
mlen = ((SsMsgInfo*)(mBuf->b_rptr))->len;
|
||||
@@ -830,7 +833,8 @@ void sngisdn_rcv_q921_trace(BdMngmt *trc, Buffer *mBuf)
|
||||
uint8_t data;
|
||||
ftdm_trace_dir_t dir;
|
||||
uint8_t tdata[1000];
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.spans[trc->t.trc.lnkNmb];
|
||||
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.dchans[trc->t.trc.lnkNmb].spans[1];
|
||||
|
||||
if (trc->t.trc.evnt == TL2TMR) {
|
||||
return;
|
||||
@@ -879,7 +883,7 @@ int16_t sngisdn_rcv_l1_data_req(uint16_t spId, sng_l1_frame_t *l1_frame)
|
||||
{
|
||||
ftdm_status_t status;
|
||||
ftdm_wait_flag_t flags = FTDM_WRITE;
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.spans[spId];
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.dchans[spId].spans[1];
|
||||
ftdm_size_t length = l1_frame->len;
|
||||
|
||||
ftdm_assert(signal_data, "Received Data request on unconfigured span\n");
|
||||
@@ -912,8 +916,8 @@ int16_t sngisdn_rcv_l1_data_req(uint16_t spId, sng_l1_frame_t *l1_frame)
|
||||
}
|
||||
|
||||
int16_t sngisdn_rcv_l1_cmd_req(uint16_t spId, sng_l1_cmd_t *l1_cmd)
|
||||
{
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.spans[spId];
|
||||
{
|
||||
sngisdn_span_data_t *signal_data = g_sngisdn_data.dchans[spId].spans[1];
|
||||
ftdm_assert(signal_data, "Received Data request on unconfigured span\n");
|
||||
|
||||
switch(l1_cmd->type) {
|
||||
|
||||
Reference in new issue
Block a user