From 7a598e8f33961fffab369aec7a0241aa77162223 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 30 Sep 2011 16:45:46 -0400 Subject: [PATCH 1/6] Added option for Dynamic TEI on BRI PTP --- .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h | 1 + .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c | 5 ++++- .../ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c | 8 +++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h index 8d36511b91..e1de27a889 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h @@ -262,6 +262,7 @@ typedef struct sngisdn_span_data { uint8_t raw_trace_q921; /* TODO: combine with trace_flags */ uint8_t timer_t3; uint8_t restart_opt; + uint8_t dynamic_tei; uint8_t restart_timeout; uint8_t force_sending_complete; char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS]; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c index b53c37fbe9..363ecd2769 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c @@ -284,6 +284,7 @@ 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->dynamic_tei = SNGISDN_OPT_DEFAULT; signal_data->link_id = span->span_id; signal_data->transfer_timeout = 20000; signal_data->att_remove_dtmf = SNGISDN_OPT_DEFAULT; @@ -361,7 +362,9 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_ parse_yesno(var, val, &signal_data->restart_opt); } else if (!strcasecmp(var, "channel-restart-timeout")) { signal_data->restart_timeout = atoi(val); - } else if (!strcasecmp(var, "local-number")) { + } else if (!strcasecmp(var, "dynamic-tei")) { + parse_yesno(var, val, &signal_data->dynamic_tei); + } else if (!strcasecmp(var, "local-number")) { if (add_local_number(val, span) != FTDM_SUCCESS) { return FTDM_FAIL; } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c index 9402cd34a8..a92831d425 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c @@ -846,7 +846,7 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span) cfg.t.cfg.s.inDLSAP.dChannelNum = 0; /* Unused for BRI */ cfg.t.cfg.s.inDLSAP.nmbBearChan = NUM_BRI_CHANNELS_PER_SPAN; cfg.t.cfg.s.inDLSAP.firstBChanNum = 1; - cfg.t.cfg.s.inDLSAP.callRefLen = 1; + cfg.t.cfg.s.inDLSAP.callRefLen = 1; cfg.t.cfg.s.inDLSAP.teiAlloc = IN_STATIC; cfg.t.cfg.s.inDLSAP.intCfg = IN_INTCFG_PTPT; break; @@ -863,6 +863,12 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span) return FTDM_FAIL; } + /* Override TEI teiAlloc Option if user specified it */ + if (signal_data->dynamic_tei != SNGISDN_OPT_DEFAULT ) { + ftdm_log(FTDM_LOG_DEBUG, "%s: TEI allocation set to %s\n", (signal_data->dynamic_tei == SNGISDN_OPT_TRUE)? "dynamic": "static"); + cfg.t.cfg.s.inDLSAP.teiAlloc = (signal_data->dynamic_tei==SNGISDN_OPT_TRUE)?IN_DYNAMIC:IN_STATIC; + } + if (sng_isdn_q931_config(&pst, &cfg)) { return FTDM_FAIL; } From 36619284e915aba8ee007e80a240fee73b0e3e34 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Fri, 30 Sep 2011 17:15:36 -0400 Subject: [PATCH 2/6] freetdm: typo in print --- .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c index a92831d425..8033fad305 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c @@ -865,7 +865,7 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span) /* Override TEI teiAlloc Option if user specified it */ if (signal_data->dynamic_tei != SNGISDN_OPT_DEFAULT ) { - ftdm_log(FTDM_LOG_DEBUG, "%s: TEI allocation set to %s\n", (signal_data->dynamic_tei == SNGISDN_OPT_TRUE)? "dynamic": "static"); + ftdm_log(FTDM_LOG_DEBUG, "%s: TEI allocation set to %s\n", span->name, (signal_data->dynamic_tei == SNGISDN_OPT_TRUE)? "dynamic": "static"); cfg.t.cfg.s.inDLSAP.teiAlloc = (signal_data->dynamic_tei==SNGISDN_OPT_TRUE)?IN_DYNAMIC:IN_STATIC; } From 621337ff1535e679ef0383e5e0950f5b07aee0f3 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Tue, 4 Oct 2011 13:20:58 -0400 Subject: [PATCH 3/6] freetdm: Increased T310 to 120 sec on network side, added check for ces when handling Restarts --- .../ftmod_sangoma_isdn_stack_cfg.c | 21 +++++-- .../ftmod_sangoma_isdn_stack_hndl.c | 62 ++++++++++++------- .../ftmod_sangoma_isdn_stack_rcv.c | 14 ++--- 3 files changed, 63 insertions(+), 34 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c index 8033fad305..2b9bceea25 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c @@ -681,7 +681,11 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span) cfg.t.cfg.s.inDLSAP.clrGlr = FALSE; /* in case of glare, do not clear local call */ cfg.t.cfg.s.inDLSAP.statEnqOpt = TRUE; - cfg.t.cfg.s.inDLSAP.rstOpt = TRUE; + if (signal_data->ftdm_span->trunk_type == FTDM_TRUNK_BRI_PTMP) { + 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; @@ -772,15 +776,13 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span) cfg.t.cfg.s.inDLSAP.tmr.t307.val = 35; cfg.t.cfg.s.inDLSAP.tmr.t308.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t308.val = 4; + cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE; + cfg.t.cfg.s.inDLSAP.tmr.t310.val = 120; if (signal_data->signalling == SNGISDN_SIGNALING_NET) { - cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE; - cfg.t.cfg.s.inDLSAP.tmr.t310.val = 10; cfg.t.cfg.s.inDLSAP.tmr.t312.enb = TRUE; cfg.t.cfg.s.inDLSAP.tmr.t312.val = cfg.t.cfg.s.inDLSAP.tmr.t303.val+2; } else { - cfg.t.cfg.s.inDLSAP.tmr.t310.enb = TRUE; - cfg.t.cfg.s.inDLSAP.tmr.t310.val = 120; cfg.t.cfg.s.inDLSAP.tmr.t312.enb = FALSE; } @@ -908,7 +910,14 @@ ftdm_status_t sngisdn_stack_cfg_q931_lce(ftdm_span_t *span) cfg.t.cfg.s.inLCe.sapId = signal_data->dchan_id; - cfg.t.cfg.s.inLCe.lnkUpDwnInd = TRUE; + if (span->trunk_type == FTDM_TRUNK_BRI_PTMP) { + /* Stack will send Restart CFM's each time link is established (TEI negotiated), + and we do not want thi s event */ + cfg.t.cfg.s.inLCe.lnkUpDwnInd = FALSE; + } else { + cfg.t.cfg.s.inLCe.lnkUpDwnInd = TRUE; + } + cfg.t.cfg.s.inLCe.tCon.enb = TRUE; cfg.t.cfg.s.inLCe.tCon.val = 35; cfg.t.cfg.s.inLCe.tDisc.enb = TRUE; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c index e95a582a45..19a9b62b0a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c @@ -1178,7 +1178,16 @@ void sngisdn_process_rst_cfm (sngisdn_event_data_t *sngisdn_event) ftdm_log(FTDM_LOG_CRIT, "Received RESTART CFM on unconfigured span (suId:%d)\n", suId); return; } - + + ftdm_log(FTDM_LOG_DEBUG, "%s: Processing RESTART CFM (suId:%u dChan:%d ces:%d %s(%d))\n", + signal_data->ftdm_span->name, + suId, dChan, ces, + (evntType == IN_LNK_DWN)?"LNK_DOWN": + (evntType == IN_LNK_UP)?"LNK_UP": + (evntType == IN_INDCHAN)?"b-channel": + (evntType == IN_LNK_DWN_DM_RLS)?"NFAS service procedures": + (evntType == IN_SWCHD_BU_DCHAN)?"NFAS switchover to backup":"Unknown", evntType); + if (rstEvnt->rstInd.eh.pres == PRSNT_NODEF && rstEvnt->rstInd.rstClass.pres == PRSNT_NODEF) { switch(rstEvnt->rstInd.rstClass.val) { case IN_CL_INDCHAN: /* Indicated b-channel */ @@ -1212,19 +1221,29 @@ void sngisdn_process_rst_cfm (sngisdn_event_data_t *sngisdn_event) } if (chan_no) { /* For a single channel */ - if (chan_no > ftdm_span_get_chan_count(signal_data->ftdm_span)) { - ftdm_log(FTDM_LOG_CRIT, "Received RESTART on invalid channel:%d\n", chan_no); - } else { - ftdm_channel_t *ftdmchan = ftdm_span_get_channel(signal_data->ftdm_span, chan_no); - sngisdn_bring_down(ftdmchan); + ftdm_iterator_t *chaniter = NULL; + ftdm_iterator_t *curr = NULL; + + chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL); + for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) { + ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr); + sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data; + if (sngisdn_info->ces == ces && ftdmchan->physical_chan_id == chan_no) { + sngisdn_bring_down(ftdmchan); + } } + ftdm_iterator_free(chaniter); } else { /* for all channels */ ftdm_iterator_t *chaniter = NULL; ftdm_iterator_t *curr = NULL; chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL); for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) { - sngisdn_bring_down((ftdm_channel_t*)ftdm_iterator_current(curr)); + ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr); + sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data; + if (sngisdn_info->ces == ces) { + sngisdn_bring_down(ftdmchan); + } } ftdm_iterator_free(chaniter); } @@ -1305,28 +1324,29 @@ void sngisdn_process_rst_ind (sngisdn_event_data_t *sngisdn_event) } if (chan_no) { /* For a single channel */ - if (chan_no > ftdm_span_get_chan_count(signal_data->ftdm_span)) { - ftdm_log(FTDM_LOG_CRIT, "Received RESTART IND on invalid channel:%d\n", chan_no); - } else { - ftdm_iterator_t *chaniter = NULL; - ftdm_iterator_t *curr = NULL; - - chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL); - for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) { - ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr); - if (ftdmchan->physical_chan_id == chan_no) { - sngisdn_bring_down(ftdmchan); - } + ftdm_iterator_t *chaniter = NULL; + ftdm_iterator_t *curr = NULL; + + chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL); + for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) { + ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr); + sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data; + if (sngisdn_info->ces == ces && ftdmchan->physical_chan_id == chan_no) { + sngisdn_bring_down(ftdmchan); } - ftdm_iterator_free(chaniter); } + ftdm_iterator_free(chaniter); } else { /* for all channels */ ftdm_iterator_t *chaniter = NULL; ftdm_iterator_t *curr = NULL; chaniter = ftdm_span_get_chan_iterator(signal_data->ftdm_span, NULL); for (curr = chaniter; curr; curr = ftdm_iterator_next(curr)) { - sngisdn_bring_down((ftdm_channel_t*)ftdm_iterator_current(curr)); + ftdm_channel_t *ftdmchan = (ftdm_channel_t*)ftdm_iterator_current(curr); + sngisdn_chan_data_t *sngisdn_info = (sngisdn_chan_data_t*) ftdmchan->call_data; + if (sngisdn_info->ces == ces) { + sngisdn_bring_down(ftdmchan); + } } ftdm_iterator_free(chaniter); } diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c index 3788a9c25b..8ae33cee0a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c @@ -990,27 +990,27 @@ void sngisdn_rcv_sng_log(uint8_t level, char *fmt,...) switch (level) { case SNG_LOGLEVEL_DEBUG: - ftdm_log(FTDM_LOG_DEBUG, "sng_isdn->%s", data); + ftdm_log(FTDM_LOG_DEBUG, "sng_isdn->%s\n", data); break; case SNG_LOGLEVEL_WARN: - ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data); + ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data); break; case SNG_LOGLEVEL_INFO: - ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data); + ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data); break; case SNG_LOGLEVEL_STATS: - ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data); + ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data); break; case SNG_LOGLEVEL_ERROR: - ftdm_log(FTDM_LOG_ERROR, "sng_isdn->%s", data); + ftdm_log(FTDM_LOG_ERROR, "sng_isdn->%s\n", data); /*ftdm_assert(0, "Got an error from stack");*/ break; case SNG_LOGLEVEL_CRIT: - ftdm_log(FTDM_LOG_CRIT, "sng_isdn->%s", data); + ftdm_log(FTDM_LOG_CRIT, "sng_isdn->%s\n", data); /* ftdm_assert(0, "Got an error from stack"); */ break; default: - ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s", data); + ftdm_log(FTDM_LOG_INFO, "sng_isdn->%s\n", data); break; } ftdm_safe_free(data); From ba2b3fcabbedb548daa06005f451130e626cc6eb Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 5 Oct 2011 11:50:40 -0400 Subject: [PATCH 4/6] Added cid-name-in-display-ie option --- .../freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h | 1 + .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h index e1de27a889..fee68ec41a 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h @@ -265,6 +265,7 @@ typedef struct sngisdn_span_data { uint8_t dynamic_tei; uint8_t restart_timeout; uint8_t force_sending_complete; + uint8_t cid_name_in_display_ie; /* In BRI, send the CID-name inside Display IE instead of Usr-usr */ char* local_numbers[SNGISDN_NUM_LOCAL_NUMBERS]; ftdm_timer_id_t timers[SNGISDN_NUM_SPAN_TIMERS]; ftdm_sched_t *sched; diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c index d744ad2942..af2c2e95d1 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c @@ -705,8 +705,8 @@ ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt) return FTDM_SUCCESS; } - if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI || - ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) { + if (FTDM_SPAN_IS_BRI(ftdmchan->span) && + signal_data->cid_name_in_display_ie != SNGISDN_OPT_TRUE) { conEvnt->usrUsr.eh.pres = PRSNT_NODEF; conEvnt->usrUsr.protocolDisc.pres = PRSNT_NODEF; From 2cf9b21e067033322ec643a6b05c88a35b21a519 Mon Sep 17 00:00:00 2001 From: David Yat Sin Date: Wed, 5 Oct 2011 11:51:10 -0400 Subject: [PATCH 5/6] Added cid-name-in-display-ie option --- .../src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c index 363ecd2769..e5928720a0 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c @@ -404,6 +404,8 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_ #else ftdm_log(FTDM_LOG_WARNING, "chan-id-invert-extend-bit is not supported in your version of libsng_isdn\n"); #endif + } else if (!strcasecmp(var, "cid-name-in-display-ie")) { + parse_yesno(var, val, &signal_data->cid_name_in_display_ie); } else { ftdm_log(FTDM_LOG_WARNING, "Ignoring unknown parameter %s\n", ftdm_parameters[paramindex].var); } From 3d456185e4860bd64fce74299ecdfb4c719707b6 Mon Sep 17 00:00:00 2001 From: Moises Silva Date: Thu, 6 Oct 2011 12:45:00 -0400 Subject: [PATCH 6/6] freetdm: Added SS7 variables for location number (pending SIP-X header integration) --- .../ftmod_sangoma_ss7_handle.c | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c index 213c4c8d4d..cacb854372 100644 --- a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c @@ -93,7 +93,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sngss7_chan_data_t *sngss7_info = NULL; ftdm_channel_t *ftdmchan = NULL; - char var[10]; + char var[FTDM_DIGITS_LIMIT]; memset(var, '\0', sizeof(var)); @@ -216,6 +216,34 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ sprintf(var, "%d", siConEvnt->cdPtyNum.natAddrInd.val); sngss7_add_var(sngss7_info, "ss7_cld_nadi", var); + /* Retrieve the Location Number if present (see ITU Q.763, 3.30) */ + if (siConEvnt->cgPtyNum1.eh.pres) { + if (siConEvnt->cgPtyNum1.addrSig.pres) { + /* fill in the ss7 location address number */ + copy_tknStr_from_sngss7(siConEvnt->cgPtyNum1.addrSig, var, siConEvnt->cgPtyNum1.oddEven); + sngss7_add_var(sngss7_info, "ss7_loc_digits", var); + } + + if (siConEvnt->cgPtyNum1.scrnInd.pres) { + /* fill in the screening indication value */ + sprintf(var, "%d", siConEvnt->cgPtyNum1.scrnInd.val); + sngss7_add_var(sngss7_info, "ss7_loc_screen_ind", var); + } + + if (siConEvnt->cgPtyNum1.presRest.pres) { + /* fill in the presentation value */ + sprintf(var, "%d", siConEvnt->cgPtyNum1.presRest.val); + sngss7_add_var(sngss7_info, "ss7_loc_pres_ind", var); + } + + if (siConEvnt->cgPtyNum1.natAddrInd.pres) { + sprintf(var, "%d", siConEvnt->cgPtyNum1.natAddrInd.val); + sngss7_add_var(sngss7_info, "ss7_loc_nadi", var); + } + } else { + SS7_DEBUG_CHAN(ftdmchan, "No Location Number information in IAM%s\n", " "); + } + sprintf(var, "%d", sngss7_info->circuit->cic); sngss7_add_var(sngss7_info, "ss7_cic", var);