mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-23 20:51:58 +00:00
Merge branch 'netborder' of git.sangoma.com:smg_freeswitch into netborder
This commit is contained in:
+12
-12
@@ -1569,18 +1569,18 @@ Global
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64 Setup.ActiveCfg = Release DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x64 Setup.Build.0 = Release DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.All|x86 Setup.ActiveCfg = Release DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64 Setup.ActiveCfg = Debug|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x86 Setup.ActiveCfg = Debug|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64 Setup.ActiveCfg = Release|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x86 Setup.ActiveCfg = Release|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug DirectSound|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug DirectSound|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64 Setup.ActiveCfg = Debug DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x86 Setup.ActiveCfg = Debug DirectSound|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release DirectSound|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release DirectSound|Win32
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64 Setup.ActiveCfg = Release DirectSound|x64
|
||||
{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x86 Setup.ActiveCfg = Release DirectSound|Win32
|
||||
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|Win32.ActiveCfg = Release|x64
|
||||
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.ActiveCfg = Release|x64
|
||||
{08DAD348-9E0A-4A2E-97F1-F1E7E24A7836}.All|x64.Build.0 = Release|x64
|
||||
|
||||
@@ -48,6 +48,7 @@ codecs/mod_ilbc
|
||||
codecs/mod_speex
|
||||
codecs/mod_siren
|
||||
#codecs/mod_celt
|
||||
#codecs/mod_opus
|
||||
#codecs/mod_sangoma_codec
|
||||
#codecs/mod_dahdi_codec
|
||||
#dialplans/mod_dialplan_directory
|
||||
|
||||
@@ -1,21 +1,40 @@
|
||||
<configuration name="cdr_pg_csv.conf" description="CDR PG CSV Format">
|
||||
<settings>
|
||||
<!-- Log a-leg (a), b-leg (b) or both (ab) -->
|
||||
<param name="legs" value="a"/>
|
||||
<!-- See parameters for PQconnectdb() at http://www.postgresql.org/docs/8.4/static/libpq-connect.html -->
|
||||
<param name="db-info" value="host=localhost dbname=cdr connect_timeout=10" />
|
||||
<!-- CDR table name -->
|
||||
<!--<param name="db-table" value="cdr"/>-->
|
||||
<param name="default-template" value="example"/>
|
||||
<!-- 'cdr-pg-csv' will always be appended to log-base -->
|
||||
<!--<param name="log-base" value="/var/log"/>-->
|
||||
|
||||
<!-- Log a-leg (a), b-leg (b) or both (ab) -->
|
||||
<param name="legs" value="a"/>
|
||||
|
||||
<!-- Directory in which to spool failed SQL inserts -->
|
||||
<!-- <param name="spool-dir" value="$${base_dir}/log/cdr-pg-csv"/> -->
|
||||
<!-- Disk spool format if DB connection/insert fails - csv (default) or sql -->
|
||||
<param name="spool-format" value="csv"/>
|
||||
<param name="rotate-on-hup" value="true"/>
|
||||
|
||||
<!-- This is like the info app but after the call is hung up -->
|
||||
<!--<param name="debug" value="true"/>-->
|
||||
</settings>
|
||||
<templates>
|
||||
<template name="example">"${local_ip_v4}","${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}","${sip_hangup_disposition}","${ani}"</template>
|
||||
</templates>
|
||||
<schema>
|
||||
<field var="local_ip_v4"/>
|
||||
<field var="caller_id_name"/>
|
||||
<field var="caller_id_number"/>
|
||||
<field var="destination_number"/>
|
||||
<field var="context"/>
|
||||
<field var="start_stamp"/>
|
||||
<field var="answer_stamp"/>
|
||||
<field var="end_stamp"/>
|
||||
<field var="duration" quote="false"/>
|
||||
<field var="billsec" quote="false"/>
|
||||
<field var="hangup_cause"/>
|
||||
<field var="uuid"/>
|
||||
<field var="bleg_uuid"/>
|
||||
<field var="accountcode"/>
|
||||
<field var="read_codec"/>
|
||||
<field var="write_codec"/>
|
||||
<!-- <field var="sip_hangup_disposition"/> -->
|
||||
<!-- <field var="ani"/> -->
|
||||
</schema>
|
||||
</configuration>
|
||||
|
||||
@@ -78,6 +78,7 @@
|
||||
<load module="mod_h26x"/>
|
||||
<load module="mod_siren"/>
|
||||
<!--<load module="mod_celt"/>-->
|
||||
<!--<load module="mod_opus"/>-->
|
||||
|
||||
<!-- File Format Interfaces -->
|
||||
<load module="mod_sndfile"/>
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
<settings>
|
||||
<!--Colorize the Console -->
|
||||
<param name="colorize-console" value="true"/>
|
||||
|
||||
<!-- minimum idle CPU before refusing calls -->
|
||||
<!--<param name="min-idle-cpu" value="25"/>-->
|
||||
|
||||
<!--
|
||||
Max number of sessions to allow at any given time.
|
||||
|
||||
|
||||
@@ -61,7 +61,4 @@
|
||||
<X-PRE-PROCESS cmd="include" data="lang/ru/*.xml"/>
|
||||
</macros>
|
||||
</section>
|
||||
|
||||
</document>
|
||||
|
||||
|
||||
|
||||
@@ -131,6 +131,8 @@ void CodecWidget::setCodecString(QString codecList)
|
||||
QStringList parsed = codecList.split("{");
|
||||
QString var = parsed.at(1);
|
||||
var = var.split("}").at(0);
|
||||
// warning switch_core_get_Variable may return an unsafe pointer in some cases.
|
||||
// revise to use switch_core_get_variable_dup, and then free it after you are done.
|
||||
var = switch_core_get_variable(var.toAscii().data());
|
||||
if ( ! var.isEmpty() ) {
|
||||
codecList = var;
|
||||
|
||||
+40
-4
@@ -8,6 +8,7 @@
|
||||
#include <signal.h>
|
||||
|
||||
#define CMD_BUFLEN 1024
|
||||
static int WARN_STOP = 0;
|
||||
|
||||
#ifdef WIN32
|
||||
#define strdup(src) _strdup(src)
|
||||
@@ -535,6 +536,13 @@ static BOOL console_readConsole(HANDLE conIn, char* buf, int len, int* pRed, int
|
||||
static void handle_SIGINT(int sig)
|
||||
{
|
||||
if (sig);
|
||||
|
||||
WARN_STOP = 1;
|
||||
|
||||
signal(SIGINT, handle_SIGINT);
|
||||
#ifdef SIGTSTP
|
||||
signal(SIGTSTP, handle_SIGINT);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -581,16 +589,36 @@ static void *msg_thread_run(esl_thread_t *me, void *obj)
|
||||
|
||||
while(thread_running && handle->connected) {
|
||||
esl_status_t status = esl_recv_event_timed(handle, 10, 1, NULL);
|
||||
int aok = 1;
|
||||
|
||||
if (status == ESL_FAIL) {
|
||||
esl_log(ESL_LOG_WARNING, "Disconnected.\n");
|
||||
if (aok) esl_log(ESL_LOG_WARNING, "Disconnected.\n");
|
||||
running = -1; thread_running = 0;
|
||||
} else if (status == ESL_SUCCESS) {
|
||||
#ifndef WIN32
|
||||
fd_set can_write;
|
||||
int fd;
|
||||
struct timeval to;
|
||||
|
||||
fd = fileno(stdout);
|
||||
memset(&to, 0, sizeof(to));
|
||||
FD_ZERO(&can_write);
|
||||
FD_SET(fd, &can_write);
|
||||
to.tv_sec = 0;
|
||||
to.tv_usec = 100000;
|
||||
if (select(fd + 1, NULL, &can_write, NULL, &to) > 0) {
|
||||
aok = FD_ISSET(fd, &can_write);
|
||||
} else {
|
||||
aok = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (handle->last_event) {
|
||||
const char *type = esl_event_get_header(handle->last_event, "content-type");
|
||||
int known = 0;
|
||||
|
||||
if (!esl_strlen_zero(type)) {
|
||||
if (!strcasecmp(type, "log/data")) {
|
||||
if (aok && !strcasecmp(type, "log/data")) {
|
||||
const char *userdata = esl_event_get_header(handle->last_event, "user-data");
|
||||
|
||||
if (esl_strlen_zero(userdata) || esl_strlen_zero(filter_uuid) || !strcasecmp(filter_uuid, userdata)) {
|
||||
@@ -617,7 +645,7 @@ static void *msg_thread_run(esl_thread_t *me, void *obj)
|
||||
} else if (!strcasecmp(type, "text/disconnect-notice")) {
|
||||
running = -1; thread_running = 0;
|
||||
known++;
|
||||
} else if (!strcasecmp(type, "text/event-plain")) {
|
||||
} else if (aok && !strcasecmp(type, "text/event-plain")) {
|
||||
char *foo;
|
||||
esl_event_serialize(handle->last_ievent, &foo, ESL_FALSE);
|
||||
printf("RECV EVENT\n%s\n", foo);
|
||||
@@ -627,7 +655,7 @@ static void *msg_thread_run(esl_thread_t *me, void *obj)
|
||||
}
|
||||
}
|
||||
|
||||
if (!known) {
|
||||
if (aok && !known) {
|
||||
char *foo;
|
||||
printf("INCOMING DATA [%s]\n%s\n", type, handle->last_event->body ? handle->last_event->body : "");
|
||||
esl_event_serialize(handle->last_event, &foo, ESL_FALSE);
|
||||
@@ -637,6 +665,11 @@ static void *msg_thread_run(esl_thread_t *me, void *obj)
|
||||
}
|
||||
}
|
||||
|
||||
if (WARN_STOP) {
|
||||
if (aok) printf("Type control-D or /exit or /quit or /bye to exit.\n\n");
|
||||
WARN_STOP = 0;
|
||||
}
|
||||
|
||||
usleep(1000);
|
||||
}
|
||||
|
||||
@@ -1023,6 +1056,9 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
signal(SIGINT, handle_SIGINT);
|
||||
#ifdef SIGTSTP
|
||||
signal(SIGTSTP, handle_SIGINT);
|
||||
#endif
|
||||
#ifdef SIGQUIT
|
||||
signal(SIGQUIT, handle_SIGQUIT);
|
||||
#endif
|
||||
|
||||
@@ -39,7 +39,6 @@ libdir = @libdir@
|
||||
library_includedir = $(prefix)/include
|
||||
|
||||
INCS = -I$(FT_SRCDIR)/$(SRC)/include -I$(FT_SRCDIR)/$(SRC)/include/private
|
||||
INCS += -I$(FT_SRCDIR)/$(SRC)/ftmod/ftmod_sangoma_boost
|
||||
|
||||
if HAVE_SNG_SS7
|
||||
INCS += -I/usr/include/sng_ss7
|
||||
@@ -109,7 +108,6 @@ core-install: install-libLTLIBRARIES
|
||||
# tools & test programs
|
||||
#
|
||||
noinst_PROGRAMS = testtones detect_tones detect_dtmf testpri testr2 testanalog testapp testcid
|
||||
noinst_PROGRAMS += testsangomaboost
|
||||
|
||||
testapp_SOURCES = $(SRC)/testapp.c
|
||||
testapp_LDADD = libfreetdm.la
|
||||
@@ -143,17 +141,6 @@ testr2_SOURCES = $(SRC)/testr2.c
|
||||
testr2_LDADD = libfreetdm.la
|
||||
testr2_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
|
||||
|
||||
if HAVE_SCTP
|
||||
noinst_PROGRAMS += testboost
|
||||
testboost_SOURCES = $(SRC)/testboost.c
|
||||
testboost_LDADD = libfreetdm.la
|
||||
testboost_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
|
||||
endif
|
||||
|
||||
testsangomaboost_SOURCES = $(SRC)/testsangomaboost.c
|
||||
testsangomaboost_LDADD = libfreetdm.la
|
||||
testsangomaboost_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
|
||||
|
||||
testanalog_SOURCES = $(SRC)/testanalog.c
|
||||
testanalog_LDADD = libfreetdm.la
|
||||
testanalog_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
|
||||
@@ -201,14 +188,6 @@ ftmod_isdn_la_LDFLAGS = -shared -module -avoid-version $(LIBISDN_LDFLAGS) $(PCA
|
||||
ftmod_isdn_la_LIBADD = libfreetdm.la $(LIBISDN_LIBS) $(PCAP_LIBS)
|
||||
endif
|
||||
|
||||
if HAVE_SCTP
|
||||
mod_LTLIBRARIES += ftmod_sangoma_boost.la
|
||||
ftmod_sangoma_boost_la_SOURCES = $(SRC)/ftmod/ftmod_sangoma_boost/sangoma_boost_client.c $(SRC)/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c
|
||||
ftmod_sangoma_boost_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
|
||||
ftmod_sangoma_boost_la_LDFLAGS = -shared -module -avoid-version
|
||||
ftmod_sangoma_boost_la_LIBADD = libfreetdm.la
|
||||
endif
|
||||
|
||||
if HAVE_LIBPRI
|
||||
mod_LTLIBRARIES += ftmod_libpri.la
|
||||
ftmod_libpri_la_SOURCES = $(SRC)/ftmod/ftmod_libpri/ftmod_libpri.c $(SRC)/ftmod/ftmod_libpri/lpwrap_pri.c
|
||||
@@ -240,7 +219,8 @@ ftmod_sangoma_ss7_la_SOURCES = \
|
||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cfg.c \
|
||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sta.c \
|
||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_sts.c \
|
||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c
|
||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c \
|
||||
$(SRC)/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_relay.c
|
||||
|
||||
ftmod_sangoma_ss7_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS) -D_GNU_SOURCE
|
||||
ftmod_sangoma_ss7_la_LDFLAGS = -shared -module -avoid-version -lsng_ss7
|
||||
@@ -268,7 +248,7 @@ endif
|
||||
|
||||
if HAVE_OPENR2
|
||||
mod_LTLIBRARIES += ftmod_r2.la
|
||||
ftmod_r2_la_SOURCES = $(SRC)/ftmod/ftmod_r2/ftmod_r2.c
|
||||
ftmod_r2_la_SOURCES = $(SRC)/ftmod/ftmod_r2/ftmod_r2.c $(SRC)/ftmod/ftmod_r2/ftmod_r2_io_mf_lib.c
|
||||
ftmod_r2_la_CFLAGS = $(AM_CFLAGS) $(FTDM_CFLAGS)
|
||||
ftmod_r2_la_LDFLAGS = -shared -module -avoid-version -lopenr2
|
||||
ftmod_r2_la_LIBADD = libfreetdm.la
|
||||
|
||||
@@ -121,8 +121,7 @@ AC_CHECK_LIB([dl], [dlopen])
|
||||
AC_CHECK_LIB([pthread], [pthread_create])
|
||||
AC_CHECK_LIB([m], [cos])
|
||||
|
||||
AC_CHECK_HEADERS([netinet/sctp.h netdb.h sys/select.h])
|
||||
AM_CONDITIONAL([HAVE_SCTP],[test "${ac_cv_header_netinet_sctp_h}" = "yes"])
|
||||
AC_CHECK_HEADERS([netdb.h sys/select.h])
|
||||
|
||||
AC_CHECK_FUNC([gethostbyname_r],
|
||||
[], [AC_CHECK_LIB([nsl], [gethostbyname_r])]
|
||||
@@ -267,7 +266,7 @@ fi
|
||||
#
|
||||
HAVE_SNG_SS7="no"
|
||||
AC_MSG_RESULT([${as_nl}<<>> Sangoma SS7 stack])
|
||||
AC_CHECK_LIB([sng_ss7], [sng_isup_init], [HAVE_SNG_SS7="yes"])
|
||||
AC_CHECK_LIB([sng_ss7], [sng_isup_init_gen], [HAVE_SNG_SS7="yes"])
|
||||
AC_MSG_RESULT([checking whether to build ftmod_sangoma_ss7... ${HAVE_SNG_SS7}])
|
||||
AM_CONDITIONAL([HAVE_SNG_SS7], [test "${HAVE_SNG_SS7}" = "yes"])
|
||||
|
||||
|
||||
@@ -43,21 +43,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_wanpipe", "src\ftmod\
|
||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_boost", "src\ftmod\ftmod_sangoma_boost\ftmod_sangoma_boost.2008.vcproj", "{D021EF2A-460D-4827-A0F7-41FDECF46F1B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testboost", "msvc\testboost\testboost.2008.vcproj", "{2B1BAF36-0241-43E7-B865-A8338AD48E2E}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsangomaboost", "msvc\testboost\testsangomaboost.2008.vcproj", "{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_isdn", "src\ftmod\ftmod_sangoma_isdn\ftmod_sangoma_isdn.2008.vcproj", "{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{93B8812C-3EC4-4F78-8970-FFBFC99E167D} = {93B8812C-3EC4-4F78-8970-FFBFC99E167D}
|
||||
|
||||
@@ -19,12 +19,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_pika", "src\ftmod\ftm
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_wanpipe", "src\ftmod\ftmod_wanpipe\ftmod_wanpipe.2010.vcxproj", "{1A145EE9-BBD8-45E5-98CD-EB4BE99E1DCD}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_boost", "src\ftmod\ftmod_sangoma_boost\ftmod_sangoma_boost.2010.vcxproj", "{D021EF2A-460D-4827-A0F7-41FDECF46F1B}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testboost", "msvc\testboost\testboost.2010.vcxproj", "{2B1BAF36-0241-43E7-B865-A8338AD48E2E}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testsangomaboost", "msvc\testboost\testsangomaboost.2010.vcxproj", "{0DA69C18-4FA1-4E8C-89CE-12498637C5BE}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_sangoma_isdn", "src\ftmod\ftmod_sangoma_isdn\ftmod_sangoma_isdn.2010.vcxproj", "{B2AF4EA6-0CD7-4529-9EB5-5AF43DB90395}"
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ftmod_r2", "src\ftmod\ftmod_r2\ftmod_r2.2010.vcxproj", "{08C3EA27-A51D-47F8-B47D-B189C649CF30}"
|
||||
|
||||
@@ -1055,21 +1055,18 @@ switch_io_routines_t freetdm_io_routines = {
|
||||
static const char* channel_get_variable(switch_core_session_t *session, switch_event_t *var_event, const char *variable_name)
|
||||
{
|
||||
const char *variable = NULL;
|
||||
|
||||
if (var_event) {
|
||||
if ((variable = switch_event_get_header(var_event, variable_name))) {
|
||||
return variable;
|
||||
}
|
||||
}
|
||||
|
||||
if (session) {
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
if ((variable = switch_channel_get_variable(channel, variable_name))) {
|
||||
return variable;
|
||||
}
|
||||
}
|
||||
if ((variable = switch_core_get_variable(variable_name))) {
|
||||
return variable;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1570,8 +1567,8 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-ANI2", "%s", channel_caller_data->aniII);
|
||||
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-DNIS", "%s", channel_caller_data->dnis.digits);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-DNIS-TON", "%s", channel_caller_data->dnis.type);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-DNIS-Plan", "%s", channel_caller_data->dnis.plan);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-DNIS-TON", "%d", channel_caller_data->dnis.type);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-DNIS-Plan", "%d", channel_caller_data->dnis.plan);
|
||||
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS", "%s", channel_caller_data->rdnis.digits);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-TON", "%d", channel_caller_data->rdnis.type);
|
||||
@@ -2360,8 +2357,9 @@ static int add_config_list_nodes(switch_xml_t swnode, ftdm_conf_node_t *rootnode
|
||||
|
||||
static ftdm_conf_node_t *get_ss7_config_node(switch_xml_t cfg, const char *confname)
|
||||
{
|
||||
switch_xml_t signode, ss7configs, isup;
|
||||
ftdm_conf_node_t *rootnode;
|
||||
switch_xml_t signode, ss7configs, isup, gen, param;
|
||||
ftdm_conf_node_t *rootnode, *list;
|
||||
char *var, *val;
|
||||
|
||||
/* try to find the conf in the hash first */
|
||||
rootnode = switch_core_hash_find(globals.ss7_configs, confname);
|
||||
@@ -2405,15 +2403,63 @@ static ftdm_conf_node_t *get_ss7_config_node(switch_xml_t cfg, const char *confn
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* add sng_gen */
|
||||
gen = switch_xml_child(isup, "sng_gen");
|
||||
if (gen == NULL) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_gen for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((FTDM_SUCCESS != ftdm_conf_node_create("sng_gen", &list, rootnode))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to create %s node for %s\n", "sng_gen", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (param = switch_xml_child(gen, "param"); param; param = param->next) {
|
||||
var = (char *) switch_xml_attr_soft(param, "name");
|
||||
val = (char *) switch_xml_attr_soft(param, "value");
|
||||
ftdm_conf_node_add_param(list, var, val);
|
||||
}
|
||||
|
||||
/* add relay channels */
|
||||
if (add_config_list_nodes(isup, rootnode, "sng_relay", "relay_channel", NULL, NULL)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process sng_relay for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* add mtp1 links */
|
||||
if (add_config_list_nodes(isup, rootnode, "mtp1_links", "mtp1_link", NULL, NULL)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp1_links for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* add mtp2 links */
|
||||
if (add_config_list_nodes(isup, rootnode, "mtp2_links", "mtp2_link", NULL, NULL)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp2_links for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* add mtp3 links */
|
||||
if (add_config_list_nodes(isup, rootnode, "mtp3_links", "mtp3_link", NULL, NULL)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp3_links for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* add mtp linksets */
|
||||
if (add_config_list_nodes(isup, rootnode, "mtp_linksets", "mtp_linkset", "mtp_links", "mtp_link")) {
|
||||
if (add_config_list_nodes(isup, rootnode, "mtp_linksets", "mtp_linkset", NULL, NULL)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp_linksets for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* add mtp routes */
|
||||
if (add_config_list_nodes(isup, rootnode, "mtp_routes", "mtp_route", NULL, NULL)) {
|
||||
if (add_config_list_nodes(isup, rootnode, "mtp_routes", "mtp_route", "linksets", "linkset")) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process mtp_routes for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
@@ -2426,6 +2472,13 @@ static ftdm_conf_node_t *get_ss7_config_node(switch_xml_t cfg, const char *confn
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* add cc spans */
|
||||
if (add_config_list_nodes(isup, rootnode, "cc_spans", "cc_span", NULL, NULL)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed to process cc_spans for sng_isup config %s\n", confname);
|
||||
ftdm_conf_node_destroy(rootnode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch_core_hash_insert(globals.ss7_configs, confname, rootnode);
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Added SS7 node configuration %s\n", confname);
|
||||
@@ -4206,7 +4259,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load)
|
||||
switch_console_set_complete("add ftdm gains");
|
||||
switch_console_set_complete("add ftdm dtmf on");
|
||||
switch_console_set_complete("add ftdm dtmf off");
|
||||
|
||||
switch_console_set_complete("add ftdm core state");
|
||||
switch_console_set_complete("add ftdm core flag");
|
||||
switch_console_set_complete("add ftdm core calls");
|
||||
|
||||
SWITCH_ADD_APP(app_interface, "disable_ec", "Disable Echo Canceller", "Disable Echo Canceller", disable_ec_function, "", SAF_NONE);
|
||||
SWITCH_ADD_APP(app_interface, "disable_dtmf", "Disable DTMF Detection", "Disable DTMF Detection", disable_dtmf_function, "", SAF_NONE);
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
@@ -122,7 +122,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
@@ -198,7 +198,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
||||
RuntimeLibrary="2"
|
||||
DisableLanguageExtensions="false"
|
||||
RuntimeTypeInfo="false"
|
||||
@@ -271,7 +271,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="../src/include;../src/include/private;../src/isdn/include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0501"
|
||||
RuntimeLibrary="2"
|
||||
DisableLanguageExtensions="false"
|
||||
RuntimeTypeInfo="false"
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>../src/include;../src/include/private;../src/isdn/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
@@ -112,7 +112,7 @@
|
||||
</BuildLog>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>../src/include;../src/include/private;../src/isdn/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<DisableLanguageExtensions>false</DisableLanguageExtensions>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
@@ -134,7 +134,7 @@
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>../src/include;../src/include/private;../src/isdn/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
@@ -161,7 +161,7 @@
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>../src/include;../src/include/private;../src/isdn/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FREETDM_EXPORTS;TELETONE_EXPORTS;_WIN32_WINNT=0x0502;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<DisableLanguageExtensions>false</DisableLanguageExtensions>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
@@ -222,4 +222,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\..\debug\freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
@@ -162,7 +162,7 @@
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
@@ -199,7 +199,7 @@
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
<AdditionalDependencies>freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>../../$(PlatformName)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>..\..\debug\freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
@@ -162,7 +162,7 @@
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
@@ -199,7 +199,7 @@
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
<AdditionalDependencies>freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>../../$(PlatformName)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
@@ -4,5 +4,4 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
||||
PROJECT(sample)
|
||||
|
||||
ADD_SUBDIRECTORY(boost)
|
||||
#ADD_SUBDIRECTORY(sched) FIXME: this code doesnt compile
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#
|
||||
# Arnaldo M Pereira <arnaldo@sangoma.com>
|
||||
#
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
|
||||
PROJECT(boost)
|
||||
|
||||
IF(NOT DEFINED WIN32)
|
||||
INCLUDE_DIRECTORIES(/usr/local/freeswitch/include)
|
||||
ADD_DEFINITIONS(-Wall)
|
||||
ADD_EXECUTABLE(ftdmstart ftdmstart.c)
|
||||
TARGET_LINK_LIBRARIES(ftdmstart freetdm)
|
||||
ENDIF(NOT DEFINED WIN32)
|
||||
@@ -1,10 +0,0 @@
|
||||
CC=gcc
|
||||
CFLAGS=-Wall -I/usr/local/freeswitch/include
|
||||
LDFLAGS=-L/usr/local/freeswitch/lib -lfreetdm
|
||||
|
||||
ftdmstart: ftdmstart.o
|
||||
|
||||
clean:
|
||||
rm -rf ftdmstart.o
|
||||
|
||||
|
||||
@@ -1,469 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Sangoma Technologies
|
||||
* Moises Silva <moy@sangoma.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sample program for the boost signaling absraction.
|
||||
* Usage: testboostalone <spanno-1> <spanno-2> ... -d [number-to-dial-if-any]
|
||||
* compile this program linking to the freetdm library (ie -lfreetdm)
|
||||
**/
|
||||
|
||||
#ifndef __linux__
|
||||
#define _CRT_SECURE_NO_WARNINGS 1
|
||||
#endif
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#include "freetdm.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
/* arbitrary limit for max calls in this sample program */
|
||||
#define MAX_CALLS 255
|
||||
|
||||
/* some timers (in seconds) to fake responses in incoming calls */
|
||||
#define PROGRESS_TIMER 1
|
||||
#define ANSWER_TIMER 5
|
||||
#define HANGUP_TIMER 15
|
||||
|
||||
/* simple variable used to stop the application */
|
||||
static int app_running = 0;
|
||||
|
||||
typedef void (*expired_function_t)(ftdm_channel_t *channel);
|
||||
typedef struct dummy_timer_s {
|
||||
int time;
|
||||
ftdm_channel_t *channel;
|
||||
expired_function_t expired;
|
||||
} dummy_timer_t;
|
||||
|
||||
/* dummy second resolution timers */
|
||||
static dummy_timer_t g_timers[MAX_CALLS];
|
||||
|
||||
/* mutex to protect the timers (both, the test thread and the signaling thread may modify them) */
|
||||
static ftdm_mutex_t *g_schedule_mutex;
|
||||
|
||||
/* unique outgoing channel */
|
||||
static ftdm_channel_t *g_outgoing_channel = NULL;
|
||||
|
||||
static void interrupt_requested(int signal)
|
||||
{
|
||||
app_running = 0;
|
||||
}
|
||||
|
||||
static void schedule_timer(ftdm_channel_t *channel, int sec, expired_function_t expired)
|
||||
{
|
||||
int i;
|
||||
ftdm_mutex_lock(g_schedule_mutex);
|
||||
for (i = 0; i < sizeof(g_timers)/sizeof(g_timers[0]); i++) {
|
||||
/* check the timer slot is free to use */
|
||||
if (!g_timers[i].time) {
|
||||
g_timers[i].time = sec;
|
||||
g_timers[i].channel = channel;
|
||||
g_timers[i].expired = expired;
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to schedule timer\n");
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
}
|
||||
|
||||
static void run_timers(void)
|
||||
{
|
||||
int i;
|
||||
void *channel;
|
||||
expired_function_t expired_func = NULL;
|
||||
ftdm_mutex_lock(g_schedule_mutex);
|
||||
for (i = 0; i < sizeof(g_timers)/sizeof(g_timers[0]); i++) {
|
||||
/* if there's time left, decrement */
|
||||
if (g_timers[i].time) {
|
||||
g_timers[i].time--;
|
||||
}
|
||||
|
||||
/* if time expired and we have an expired function, call it */
|
||||
if (!g_timers[i].time && g_timers[i].expired) {
|
||||
expired_func = g_timers[i].expired;
|
||||
channel = g_timers[i].channel;
|
||||
memset(&g_timers[i], 0, sizeof(g_timers[i]));
|
||||
expired_func(channel);
|
||||
}
|
||||
}
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
}
|
||||
|
||||
static void release_timers(ftdm_channel_t *channel)
|
||||
{
|
||||
int i;
|
||||
ftdm_mutex_lock(g_schedule_mutex);
|
||||
for (i = 0; i < sizeof(g_timers)/sizeof(g_timers[0]); i++) {
|
||||
/* clear any timer belonging to the given channel */
|
||||
if (g_timers[i].channel == channel) {
|
||||
memset(&g_timers[i], 0, sizeof(g_timers[i]));
|
||||
}
|
||||
}
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
}
|
||||
|
||||
/* hangup the call */
|
||||
static void send_hangup(ftdm_channel_t *channel)
|
||||
{
|
||||
int spanid = ftdm_channel_get_span_id(channel);
|
||||
int chanid = ftdm_channel_get_id(channel);
|
||||
ftdm_log(FTDM_LOG_NOTICE, "-- Requesting hangup in channel %d:%d\n", spanid, chanid);
|
||||
ftdm_channel_call_hangup(channel);
|
||||
}
|
||||
|
||||
/* send answer for an incoming call */
|
||||
static void send_answer(ftdm_channel_t *channel)
|
||||
{
|
||||
/* we move the channel signaling state machine to UP (answered) */
|
||||
int spanid = ftdm_channel_get_span_id(channel);
|
||||
int chanid = ftdm_channel_get_id(channel);
|
||||
ftdm_log(FTDM_LOG_NOTICE, "-- Requesting answer in channel %d:%d\n", spanid, chanid);
|
||||
ftdm_channel_call_answer(channel);
|
||||
schedule_timer(channel, HANGUP_TIMER, send_hangup);
|
||||
}
|
||||
|
||||
/* send progress for an incoming */
|
||||
static void send_progress(ftdm_channel_t *channel)
|
||||
{
|
||||
/* we move the channel signaling state machine to UP (answered) */
|
||||
int spanid = ftdm_channel_get_span_id(channel);
|
||||
int chanid = ftdm_channel_get_id(channel);
|
||||
ftdm_log(FTDM_LOG_NOTICE, "-- Requesting progress\n", spanid, chanid);
|
||||
ftdm_channel_call_indicate(channel, FTDM_CHANNEL_INDICATE_PROGRESS);
|
||||
schedule_timer(channel, ANSWER_TIMER, send_answer);
|
||||
}
|
||||
|
||||
/* This function will be called in an undetermined signaling thread, you must not do
|
||||
* any blocking operations here or the signaling stack may delay other call event processing
|
||||
* The arguments for this function are defined in FIO_SIGNAL_CB_FUNCTION prototype, I just
|
||||
* name them here for your convenience:
|
||||
* ftdm_sigmsg_t *sigmsg
|
||||
* - The sigmsg structure contains the ftdm_channel structure that represents the channel where
|
||||
* the event occurred and the event_id of the signaling event that just occurred.
|
||||
* */
|
||||
static FIO_SIGNAL_CB_FUNCTION(on_signaling_event)
|
||||
{
|
||||
switch (sigmsg->event_id) {
|
||||
/* This event signals the start of an incoming call */
|
||||
case FTDM_SIGEVENT_START:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Incoming call received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
schedule_timer(sigmsg->channel, PROGRESS_TIMER, send_progress);
|
||||
break;
|
||||
/* This event signals progress on an outgoing call */
|
||||
case FTDM_SIGEVENT_PROGRESS_MEDIA:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Progress message received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
break;
|
||||
/* This event signals answer in an outgoing call */
|
||||
case FTDM_SIGEVENT_UP:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Answer received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
/* now the channel is answered and we can use
|
||||
* ftdm_channel_wait() to wait for input/output in a channel (equivalent to poll() or select())
|
||||
* ftdm_channel_read() to read available data in a channel
|
||||
* ftdm_channel_write() to write to the channel */
|
||||
break;
|
||||
/* This event signals hangup from the other end */
|
||||
case FTDM_SIGEVENT_STOP:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Hangup received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
if (g_outgoing_channel == sigmsg->channel) {
|
||||
g_outgoing_channel = NULL;
|
||||
}
|
||||
/* release any timer for this channel */
|
||||
release_timers(sigmsg->channel);
|
||||
/* acknowledge the hangup */
|
||||
ftdm_channel_call_hangup(sigmsg->channel);
|
||||
break;
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_WARNING, "Unhandled event %s in channel %d:%d\n", ftdm_signal_event2str(sigmsg->event_id),
|
||||
sigmsg->span_id, sigmsg->chan_id);
|
||||
break;
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
static void place_call(const ftdm_span_t *span, const char *number)
|
||||
{
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
ftdm_caller_data_t caller_data = {{ 0 }};
|
||||
ftdm_status_t status = FTDM_FAIL;
|
||||
|
||||
/* set destiny number */
|
||||
ftdm_set_string(caller_data.dnis.digits, number);
|
||||
|
||||
/* set callerid */
|
||||
ftdm_set_string(caller_data.cid_name, "testsangomaboost");
|
||||
ftdm_set_string(caller_data.cid_num.digits, "1234");
|
||||
|
||||
/* request to search for an outgoing channel top down with the given caller data.
|
||||
* it is also an option to use ftdm_channel_open_by_group to let freetdm hunt
|
||||
* an available channel in a given group instead of per span
|
||||
* */
|
||||
status = ftdm_channel_open_by_span(ftdm_span_get_id(span), FTDM_TOP_DOWN, &caller_data, &ftdmchan);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to originate call\n");
|
||||
return;
|
||||
}
|
||||
|
||||
g_outgoing_channel = ftdmchan;
|
||||
|
||||
/* set the caller data for the outgoing channel */
|
||||
ftdm_channel_set_caller_data(ftdmchan, &caller_data);
|
||||
|
||||
status = ftdm_channel_call_place(ftdmchan);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to originate call\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* this is required to initialize the outgoing channel */
|
||||
ftdm_channel_init(ftdmchan);
|
||||
}
|
||||
|
||||
#define ARRLEN(arr) (sizeof(arr)/sizeof(arr[0]))
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
/* span names can be any null-terminated string, does not need to be a wanpipe port */
|
||||
int span_numbers[32];
|
||||
char span_names[ARRLEN(span_numbers)][ARRLEN(span_numbers)];
|
||||
const char *spanname = NULL;
|
||||
char wpchans[25];
|
||||
unsigned configured = 0;
|
||||
int i, spanno;
|
||||
int numspans = 0;
|
||||
ftdm_status_t status;
|
||||
ftdm_span_t *span_list[ARRLEN(span_numbers)];
|
||||
ftdm_span_t *span;
|
||||
ftdm_channel_config_t chan_config;
|
||||
ftdm_conf_parameter_t parameters[20];
|
||||
char *todial = NULL;
|
||||
int32_t ticks = 0;
|
||||
|
||||
/* register a handler to shutdown things properly */
|
||||
#ifdef _WIN64
|
||||
// still trying to figure this one out otherwise triggers error
|
||||
if (signal(SIGINT, interrupt_requested) < 0) {
|
||||
#else
|
||||
if (signal(SIGINT, interrupt_requested) == SIG_ERR) {
|
||||
#endif
|
||||
fprintf(stderr, "Could not set the SIGINT signal handler: %s\n", strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (argv[i][0] == '-' && argv[i][1] == 'd') {
|
||||
i++;
|
||||
if (i >= argc) {
|
||||
fprintf(stderr, "Error, -d specified but no number to dial!\n");
|
||||
exit(1);
|
||||
}
|
||||
todial = argv[i];
|
||||
if (!strlen(todial)) {
|
||||
todial = NULL;
|
||||
}
|
||||
printf("Number to dial: %s\n", todial);
|
||||
continue;
|
||||
}
|
||||
spanno = atoi(argv[i]);
|
||||
span_numbers[numspans] = spanno;
|
||||
snprintf(span_names[numspans], sizeof(span_names[numspans]), "wanpipe%d", spanno);
|
||||
numspans++;
|
||||
}
|
||||
|
||||
if (!numspans) {
|
||||
fprintf(stderr, "please specify a at least 1 wanpipe port number\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* clear any outstanding timers */
|
||||
memset(&g_timers, 0, sizeof(g_timers));
|
||||
|
||||
/* set the logging level to use */
|
||||
ftdm_global_set_default_logger(FTDM_LOG_LEVEL_DEBUG);
|
||||
|
||||
/* Initialize the FTDM library */
|
||||
if (ftdm_global_init() != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error loading FreeTDM\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* create the schedule mutex */
|
||||
ftdm_mutex_create(&g_schedule_mutex);
|
||||
|
||||
/* now we can start creating spans */
|
||||
memset(&chan_config, 0, sizeof(chan_config));
|
||||
strncpy(chan_config.group_name, "mygroup", sizeof(chan_config.group_name)-1);
|
||||
chan_config.group_name[sizeof(chan_config.group_name)-1] = 0;
|
||||
for (i = 0; i < numspans; i++) {
|
||||
spanname = span_names[i];
|
||||
/* "wanpipe" is the special I/O identifier for Sangoma devices */
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Creating span %s\n", spanname);
|
||||
status = ftdm_span_create("wanpipe", spanname, &span_list[i]);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Failed to create span %s\n", spanname);
|
||||
goto done;
|
||||
}
|
||||
span = span_list[i];
|
||||
spanno = span_numbers[i];
|
||||
|
||||
/* set the trunk type for the span */
|
||||
ftdm_span_set_trunk_type(span_list[i], FTDM_TRUNK_T1);
|
||||
|
||||
/* configure B channels (syntax for wanpipe channels is span:low_chan-high_chan) */
|
||||
chan_config.type = FTDM_CHAN_TYPE_B;
|
||||
snprintf(wpchans, sizeof(wpchans), "%d:1-23", spanno);
|
||||
ftdm_configure_span_channels(span, wpchans, &chan_config, &configured);
|
||||
ftdm_log(FTDM_LOG_NOTICE, "registered %d b channels\n", configured);
|
||||
}
|
||||
|
||||
/* At this point FreeTDM is ready to be used, the spans defined in freetdm.conf have the basic I/O board configuration
|
||||
* but no telephony signaling configuration at all. */
|
||||
ftdm_log(FTDM_LOG_NOTICE, "FreeTDM loaded ...\n");
|
||||
|
||||
/* now we can start configuring signaling for the previously created spans */
|
||||
for (i = 0; i < numspans; i++) {
|
||||
spanname = span_names[i];
|
||||
|
||||
/* Retrieve a span by name (as specified in ftdm_span_create()) */
|
||||
if (ftdm_span_find_by_name(spanname, &span) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span %s\n", ftdm_span_get_name(span));
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* prepare the configuration parameters that will be sent down to the signaling stack, the array of paramters must be terminated by an
|
||||
* array element with a null .var member */
|
||||
|
||||
/* for sangoma_boost signaling (abstraction signaling used by Sangoma for PRI, BRI and SS7) the first parameter you must send
|
||||
* is sigmod, which must be either sangoma_prid, if you have the PRI stack available, or sangoma_brid for the BRI stack */
|
||||
parameters[0].var = "sigmod";
|
||||
parameters[0].val = "sangoma_prid";
|
||||
|
||||
/* following parameters are signaling stack specific, this ones are for PRI */
|
||||
parameters[1].var = "switchtype";
|
||||
parameters[1].val = "national";
|
||||
|
||||
parameters[2].var = "signalling";
|
||||
parameters[2].val = "pri_cpe";
|
||||
|
||||
/*
|
||||
* parameters[3].var = "nfas_primary";
|
||||
* parameters[3].val = "4"; //span number
|
||||
*
|
||||
* parameters[4].var = "nfas_secondary";
|
||||
* parameters[4].val = "2"; //span number
|
||||
*
|
||||
* parameters[5].var = "nfas_group";
|
||||
* parameters[5].val = "1";
|
||||
* */
|
||||
|
||||
|
||||
/* the last parameter .var member must be NULL! */
|
||||
parameters[3].var = NULL;
|
||||
|
||||
/* send the configuration values down to the stack */
|
||||
if (ftdm_configure_span_signaling(span, "sangoma_boost", on_signaling_event, parameters) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Error configuring sangoma_boost signaling abstraction in span %s\n", ftdm_span_get_name(span));
|
||||
goto done;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* configuration succeeded, we can proceed now to start each span
|
||||
* This step will launch at least 1 background (may be more, depending on the signaling stack used)
|
||||
* to handle *ALL* signaling events for this span, your on_signaling_event callback will be called always
|
||||
* in one of those infraestructure threads and you MUST NOT block in that handler to avoid delays and errors
|
||||
* in the signaling processing for any call.
|
||||
* */
|
||||
for (i = 0; i < numspans; i++) {
|
||||
spanname = span_names[i];
|
||||
/* Retrieve a span by name (as specified in ftdm_span_create()) */
|
||||
if (ftdm_span_find_by_name(spanname, &span) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span %s\n", ftdm_span_get_name(span));
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ftdm_span_start(span) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failing starting signaling on span %s\n", ftdm_span_get_name(span));
|
||||
goto done;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
app_running = 1;
|
||||
|
||||
/* Retrieve the first created span to place the call (if dialing was specified) */
|
||||
if (ftdm_span_find(1, &span) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Error finding FreeTDM span 1\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* The application thread can go on and do anything else, like waiting for a shutdown signal */
|
||||
while(ftdm_running() && app_running) {
|
||||
ftdm_sleep(1000);
|
||||
run_timers();
|
||||
ticks++;
|
||||
if (!(ticks % 10) && todial && !g_outgoing_channel) {
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Originating call to number %s\n", todial);
|
||||
place_call(span, todial);
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Shutting down FreeTDM ...\n");
|
||||
|
||||
ftdm_mutex_destroy(&g_schedule_mutex);
|
||||
|
||||
/* whenever you're done, this function will shutdown the signaling threads in any span that was started */
|
||||
ftdm_global_destroy();
|
||||
|
||||
printf("Terminated!\n");
|
||||
|
||||
sleep(2);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
@@ -37,8 +37,10 @@
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
#define _WIN32_WINNT 0x0501 // To make GetSystemTimes visible in windows.h
|
||||
#include <windows.h>
|
||||
# if (_WIN32_WINNT < 0x0501)
|
||||
# error "Need to target at least Windows XP/Server 2003 because GetSystemTimes is needed"
|
||||
# endif
|
||||
# include <windows.h>
|
||||
#else /* LINUX */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
Regular → Executable
+1
-1
@@ -122,5 +122,5 @@ FT_DECLARE(void *) ftdm_dso_func_sym(ftdm_dso_lib_t lib, const char *sym, char *
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
|
||||
+45
-18
@@ -2506,10 +2506,12 @@ FT_DECLARE(ftdm_status_t) _ftdm_call_place(const char *file, const char *func, i
|
||||
}
|
||||
|
||||
/* we have a locked channel and are not afraid of using it! */
|
||||
status = hunting->result_cb(fchan, caller_data);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
status = FTDM_ECANCELED;
|
||||
goto done;
|
||||
if (hunting->result_cb) {
|
||||
status = hunting->result_cb(fchan, caller_data);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
status = FTDM_ECANCELED;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
ftdm_channel_set_caller_data(fchan, caller_data);
|
||||
@@ -2741,10 +2743,9 @@ static ftdm_status_t ftdmchan_activate_dtmf_buffer(ftdm_channel_t *ftdmchan)
|
||||
if (!ftdmchan->dtmf_buffer) {
|
||||
if (ftdm_buffer_create(&ftdmchan->dtmf_buffer, 1024, 3192, 0) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to allocate DTMF Buffer!\n");
|
||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "buffer error");
|
||||
return FTDM_FAIL;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Created DTMF Buffer!\n");
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Created DTMF buffer\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3586,8 +3587,17 @@ static FIO_READ_FUNCTION(ftdm_raw_read)
|
||||
return status;
|
||||
}
|
||||
|
||||
static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
/* This function takes care of automatically generating DTMF or FSK tones when needed */
|
||||
static ftdm_status_t handle_tone_generation(ftdm_channel_t *ftdmchan)
|
||||
{
|
||||
/*
|
||||
* datalen: size in bytes of the chunk of data the user requested to read (this function
|
||||
* is called from the ftdm_channel_read function)
|
||||
* dblen: size currently in use in any of the tone generation buffers (data available in the buffer)
|
||||
* gen_dtmf_buffer: buffer holding the raw ASCII digits that the user requested to generate
|
||||
* dtmf_buffer: raw linear tone data generated by teletone to be written to the devices
|
||||
* fsk_buffer: raw linear FSK modulated data for caller id
|
||||
*/
|
||||
ftdm_buffer_t *buffer = NULL;
|
||||
ftdm_size_t dblen = 0;
|
||||
int wrote = 0;
|
||||
@@ -3602,7 +3612,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
}
|
||||
|
||||
if (ftdm_buffer_read(ftdmchan->gen_dtmf_buffer, digits, dblen) && !ftdm_strlen_zero_buf(digits)) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Generating DTMF [%s]\n", digits);
|
||||
|
||||
cur = digits;
|
||||
|
||||
@@ -3616,7 +3626,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
ftdm_buffer_write(ftdmchan->dtmf_buffer, ftdmchan->tone_session.buffer, wrote * 2);
|
||||
x++;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_ERROR, "%d:%d Problem Adding DTMF SEQ [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, digits);
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Problem adding DTMF sequence [%s]\n", digits);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
}
|
||||
@@ -3629,6 +3639,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
|
||||
|
||||
if (!ftdmchan->buffer_delay || --ftdmchan->buffer_delay == 0) {
|
||||
/* time to pick a buffer, either the dtmf or fsk buffer */
|
||||
if (ftdmchan->dtmf_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->dtmf_buffer))) {
|
||||
buffer = ftdmchan->dtmf_buffer;
|
||||
} else if (ftdmchan->fsk_buffer && (dblen = ftdm_buffer_inuse(ftdmchan->fsk_buffer))) {
|
||||
@@ -3636,22 +3647,39 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
}
|
||||
}
|
||||
|
||||
/* if we picked a buffer, time to read from it and write the linear data to the device */
|
||||
if (buffer) {
|
||||
ftdm_size_t dlen = datalen;
|
||||
uint8_t auxbuf[1024];
|
||||
ftdm_size_t dlen = ftdmchan->packet_len;
|
||||
ftdm_size_t len, br, max = sizeof(auxbuf);
|
||||
|
||||
/* if the codec is not linear, then data is really twice as much cuz
|
||||
tone generation is done in linear (we assume anything different than linear is G.711) */
|
||||
if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
|
||||
dlen *= 2;
|
||||
}
|
||||
|
||||
|
||||
/* we do not expect the user chunks to be bigger than auxbuf */
|
||||
ftdm_assert((dlen <= sizeof(auxbuf)), "Unexpected size for user data chunk size\n");
|
||||
|
||||
/* dblen is the size in use for dtmf_buffer or fsk_buffer, and dlen is the size
|
||||
* of the io chunks to write, we pick the smaller one */
|
||||
len = dblen > dlen ? dlen : dblen;
|
||||
|
||||
/* we can't read more than the size of our auxiliary buffer */
|
||||
ftdm_assert((len <= sizeof(auxbuf)), "Unexpected size to read into auxbuf\n");
|
||||
|
||||
br = ftdm_buffer_read(buffer, auxbuf, len);
|
||||
|
||||
/* the amount read can't possibly be bigger than what we requested */
|
||||
ftdm_assert((br <= len), "Unexpected size read from tone generation buffer\n");
|
||||
|
||||
/* if we read less than the chunk size, we must fill in with silence the rest */
|
||||
if (br < dlen) {
|
||||
memset(auxbuf + br, 0, dlen - br);
|
||||
}
|
||||
|
||||
/* finally we convert to the native format for the channel if necessary */
|
||||
if (ftdmchan->native_codec != FTDM_CODEC_SLIN) {
|
||||
if (ftdmchan->native_codec == FTDM_CODEC_ULAW) {
|
||||
fio_slin2ulaw(auxbuf, max, &dlen);
|
||||
@@ -3660,6 +3688,7 @@ static ftdm_status_t handle_dtmf(ftdm_channel_t *ftdmchan, ftdm_size_t datalen)
|
||||
}
|
||||
}
|
||||
|
||||
/* write the tone to the channel */
|
||||
return ftdm_raw_write(ftdmchan, auxbuf, &dlen);
|
||||
}
|
||||
|
||||
@@ -3739,7 +3768,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
||||
rdata[i] = ftdmchan->rxgain_table[rdata[i]];
|
||||
}
|
||||
}
|
||||
handle_dtmf(ftdmchan, *datalen);
|
||||
handle_tone_generation(ftdmchan);
|
||||
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_TRANSCODE) && ftdmchan->effective_codec != ftdmchan->native_codec) {
|
||||
if (ftdmchan->native_codec == FTDM_CODEC_ULAW && ftdmchan->effective_codec == FTDM_CODEC_SLIN) {
|
||||
@@ -3936,7 +3965,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
|
||||
if (!ftdmchan->buffer_delay &&
|
||||
((ftdmchan->dtmf_buffer && ftdm_buffer_inuse(ftdmchan->dtmf_buffer)) ||
|
||||
(ftdmchan->fsk_buffer && ftdm_buffer_inuse(ftdmchan->fsk_buffer)))) {
|
||||
/* read size writing DTMF ATM */
|
||||
/* generating some kind of tone at the moment (see handle_tone_generation),
|
||||
* we ignore user data ... */
|
||||
goto done;
|
||||
}
|
||||
|
||||
@@ -4949,7 +4979,7 @@ FT_DECLARE(int) ftdm_load_module(const char *name)
|
||||
{
|
||||
ftdm_dso_lib_t lib;
|
||||
int count = 0, x = 0;
|
||||
char path[128] = "";
|
||||
char path[512] = "";
|
||||
char *err;
|
||||
ftdm_module_t *mod;
|
||||
|
||||
@@ -5502,6 +5532,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
|
||||
sigmsg->chan_id = sigmsg->channel->chan_id;
|
||||
sigmsg->span_id = sigmsg->channel->span_id;
|
||||
sigmsg->call_id = sigmsg->channel->caller_data.call_id;
|
||||
sigmsg->call_priv = sigmsg->channel->caller_data.priv;
|
||||
}
|
||||
|
||||
/* some core things to do on special events */
|
||||
@@ -5533,10 +5564,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
|
||||
}
|
||||
ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_CALL_STARTED);
|
||||
ftdm_call_set_call_id(sigmsg->channel, &sigmsg->channel->caller_data);
|
||||
if (sigmsg->channel->dtmfdbg.requested) {
|
||||
ftdm_channel_command(sigmsg->channel, FTDM_COMMAND_ENABLE_DEBUG_DTMF, NULL);
|
||||
}
|
||||
|
||||
/* when cleaning up the public API I added this because mod_freetdm.c on_fxs_signal was
|
||||
* doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
|
||||
* is needed at all?
|
||||
|
||||
@@ -22,8 +22,10 @@
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
/* required for TryEnterCriticalSection definition. Must be defined before windows.h include */
|
||||
#define _WIN32_WINNT 0x0400
|
||||
# if (_WIN32_WINNT < 0x0400)
|
||||
# error "Need to target at least Windows 95/WINNT 4.0 because TryEnterCriticalSection is needed"
|
||||
# endif
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "private/ftdm_core.h"
|
||||
|
||||
@@ -185,6 +185,10 @@
|
||||
RelativePath=".\ftmod_r2.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ftmod_r2_io_mf_lib.c"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
|
||||
Regular → Executable
+58
-30
@@ -47,8 +47,10 @@
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <openr2.h>
|
||||
#include "freetdm.h"
|
||||
#include "private/ftdm_core.h"
|
||||
#include <freetdm.h>
|
||||
#include <private/ftdm_core.h>
|
||||
|
||||
#include "ftmod_r2_io_mf_lib.h" // ftdm_r2_get_native_channel_mf_generation_iface
|
||||
|
||||
/* when the user stops a span, we clear FTDM_R2_SPAN_STARTED, so that the signaling thread
|
||||
* knows it must stop, and we wait for FTDM_R2_RUNNING to be clear, which tells us the
|
||||
@@ -105,6 +107,7 @@ typedef struct ft_r2_conf_s {
|
||||
int charge_calls;
|
||||
int forced_release;
|
||||
int allow_collect_calls;
|
||||
int use_channel_native_mf_generation;
|
||||
} ft_r2_conf_t;
|
||||
|
||||
/* r2 configuration stored in span->signal_data */
|
||||
@@ -286,9 +289,6 @@ static ftdm_call_cause_t ftdm_r2_cause_to_ftdm_cause(ftdm_channel_t *fchan, open
|
||||
case OR2_CAUSE_UNSPECIFIED:
|
||||
return FTDM_CAUSE_NORMAL_UNSPECIFIED;
|
||||
|
||||
case OR2_CAUSE_COLLECT_CALL_REJECTED:
|
||||
return FTDM_CAUSE_CALL_REJECTED;
|
||||
|
||||
case OR2_CAUSE_FORCED_RELEASE:
|
||||
return FTDM_CAUSE_NORMAL_CLEARING;
|
||||
|
||||
@@ -673,19 +673,13 @@ static void ftdm_r2_on_call_offered(openr2_chan_t *r2chan, const char *ani, cons
|
||||
ftdm_channel_t *ftdmchan = openr2_chan_get_client_data(r2chan);
|
||||
ftdm_r2_data_t *r2data = ftdmchan->span->signal_data;
|
||||
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Call offered with ANI = %s, DNIS = %s, Category = %d, ANI restricted = %s\n",
|
||||
ani, dnis, category, ani_restricted ? "Yes" : "No");
|
||||
|
||||
/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
|
||||
if (r2data->mf_dump_size) {
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
|
||||
}
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_NOTICE, "Call offered with ANI = %s, DNIS = %s, Category = %s, ANI restricted = %s\n",
|
||||
ani, dnis, openr2_proto_get_category_string(category), ani_restricted ? "Yes" : "No");
|
||||
|
||||
/* check if this is a collect call and if we should accept it */
|
||||
if (!r2data->allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_NOTICE, "Rejecting collect call\n");
|
||||
openr2_chan_disconnect_call(r2chan, OR2_CAUSE_COLLECT_CALL_REJECTED);
|
||||
openr2_chan_disconnect_call(r2chan, OR2_CAUSE_UNALLOCATED_NUMBER);
|
||||
} else {
|
||||
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_RING);
|
||||
}
|
||||
@@ -720,30 +714,38 @@ static void dump_mf(openr2_chan_t *r2chan)
|
||||
{
|
||||
char dfile[512];
|
||||
FILE *f = NULL;
|
||||
int rc = 0;
|
||||
ftdm_channel_t *ftdmchan = openr2_chan_get_client_data(r2chan);
|
||||
ftdm_r2_data_t *r2data = ftdmchan->span->signal_data;
|
||||
if (r2data->mf_dump_size) {
|
||||
char *logname = R2CALL(ftdmchan)->logname;
|
||||
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in prefix %s\n", logname);
|
||||
snprintf(dfile, sizeof(dfile), logname ? "%s.s%dc%d.input.alaw" : "%s/s%dc%d.input.alaw",
|
||||
logname ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in prefix %s\n", !ftdm_strlen_zero(logname)
|
||||
? logname : r2data->logdir);
|
||||
snprintf(dfile, sizeof(dfile), !ftdm_strlen_zero(logname) ? "%s.s%dc%d.input.alaw" : "%s/s%dc%d.input.alaw",
|
||||
!ftdm_strlen_zero(logname) ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
||||
f = fopen(dfile, "wb");
|
||||
if (f) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO input in file %s\n", dfile);
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DUMP_INPUT, f);
|
||||
fclose(f);
|
||||
rc = fclose(f);
|
||||
if (rc) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failure closing IO input file %s: %s\n", dfile, strerror(errno));
|
||||
}
|
||||
} else {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Could not dump IO input in file %s, error: %s", dfile, strerror(errno));
|
||||
}
|
||||
|
||||
snprintf(dfile, sizeof(dfile), logname ? "%s.s%dc%d.output.alaw" : "%s/s%dc%d.output.alaw",
|
||||
logname ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
||||
snprintf(dfile, sizeof(dfile), !ftdm_strlen_zero(logname) ? "%s.s%dc%d.output.alaw" : "%s/s%dc%d.output.alaw",
|
||||
!ftdm_strlen_zero(logname) ? logname : r2data->logdir, ftdmchan->span_id, ftdmchan->chan_id);
|
||||
f = fopen(dfile, "wb");
|
||||
if (f) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Dumping IO output in file %s\n", dfile);
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DUMP_OUTPUT, f);
|
||||
fclose(f);
|
||||
rc = fclose(f);
|
||||
if (rc) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failure closing IO output file %s: %s\n", dfile, strerror(errno));
|
||||
}
|
||||
} else {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Could not dump IO output in file %s, error: %s", dfile, strerror(errno));
|
||||
}
|
||||
@@ -769,6 +771,12 @@ static void ftdm_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t m
|
||||
|
||||
R2CALL(ftdmchan)->accepted = 1;
|
||||
|
||||
/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
|
||||
if (r2data->mf_dump_size) {
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
|
||||
}
|
||||
|
||||
if (OR2_DIR_BACKWARD == openr2_chan_get_direction(r2chan)) {
|
||||
if (R2CALL(ftdmchan)->answer_pending) {
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Answer was pending, answering now.\n");
|
||||
@@ -777,11 +785,6 @@ static void ftdm_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t m
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
/* nothing went wrong during call setup, MF has ended, we can and must disable the MF dump */
|
||||
if (r2data->mf_dump_size) {
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_INPUT_DUMP, NULL);
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_OUTPUT_DUMP, NULL);
|
||||
}
|
||||
ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
|
||||
}
|
||||
}
|
||||
@@ -1444,7 +1447,8 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_r2_configure_span_signaling)
|
||||
/* .double_answer */ -1,
|
||||
/* .charge_calls */ -1,
|
||||
/* .forced_release */ -1,
|
||||
/* .allow_collect_calls */ -1
|
||||
/* .allow_collect_calls */ -1,
|
||||
/* .use_channel_native_mf_generation */ 0
|
||||
};
|
||||
|
||||
ftdm_assert_return(sig_cb != NULL, FTDM_FAIL, "No signaling cb provided\n");
|
||||
@@ -1563,6 +1567,9 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_r2_configure_span_signaling)
|
||||
} else if (!strcasecmp(var, "max_dnis")) {
|
||||
r2conf.max_dnis = atoi(val);
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Configuring R2 span %s with max dnis = %d\n", span->name, r2conf.max_dnis);
|
||||
} else if (!strcasecmp(var, "use_channel_native_mf_generation")) {
|
||||
r2conf.use_channel_native_mf_generation = ftdm_true(val);
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Configuring R2 span %s with \"use native channel MF generation\" = %d\n", span->name, r2conf.use_channel_native_mf_generation);
|
||||
} else {
|
||||
snprintf(span->last_error, sizeof(span->last_error), "Unknown R2 parameter [%s]", var);
|
||||
return FTDM_FAIL;
|
||||
@@ -1614,6 +1621,10 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_r2_configure_span_signaling)
|
||||
openr2_context_configure_from_advanced_file(r2data->r2context, r2conf.advanced_protocol_file);
|
||||
}
|
||||
|
||||
if(r2conf.use_channel_native_mf_generation) {
|
||||
openr2_context_set_mflib_interface(r2data->r2context, ftdm_r2_get_native_channel_mf_generation_iface());
|
||||
}
|
||||
|
||||
spanpvt->r2calls = create_hashtable(FTDM_MAX_CHANNELS_SPAN, ftdm_hash_hashfromstring, ftdm_hash_equalkeys);
|
||||
if (!spanpvt->r2calls) {
|
||||
snprintf(span->last_error, sizeof(span->last_error), "Cannot create channel calls hash for span.");
|
||||
@@ -1631,13 +1642,29 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_r2_configure_span_signaling)
|
||||
openr2_chan_enable_call_files(r2chan);
|
||||
}
|
||||
|
||||
r2call = ftdm_malloc(sizeof(*r2call));
|
||||
if (r2conf.use_channel_native_mf_generation) {
|
||||
/* Allocate a new write handle per r2chan */
|
||||
ftdm_r2_mf_write_handle_t *mf_write_handle = ftdm_calloc(1, sizeof(*mf_write_handle));
|
||||
/* Associate to the FreeTDM channel */
|
||||
mf_write_handle->ftdmchan = span->channels[i];
|
||||
/* Make sure the FreeTDM channel supports MF the generation feature */
|
||||
if (!ftdm_channel_test_feature(mf_write_handle->ftdmchan, FTDM_CHANNEL_FEATURE_MF_GENERATE)) {
|
||||
ftdm_log_chan_msg(mf_write_handle->ftdmchan, FTDM_LOG_ERROR,
|
||||
"FreeTDM channel does not support native MF generation: "
|
||||
"\"use_channel_native_mf_generation\" configuration parameter cannot"
|
||||
" be used\n");
|
||||
goto fail;
|
||||
}
|
||||
/* Associate the mf_write_handle to the openR2 channel */
|
||||
openr2_chan_set_mflib_handles(r2chan, mf_write_handle, NULL);
|
||||
}
|
||||
|
||||
r2call = ftdm_calloc(1, sizeof(*r2call));
|
||||
if (!r2call) {
|
||||
snprintf(span->last_error, sizeof(span->last_error), "Cannot create all R2 call data structures for the span.");
|
||||
ftdm_safe_free(r2chan);
|
||||
goto fail;
|
||||
}
|
||||
memset(r2call, 0, sizeof(*r2call));
|
||||
openr2_chan_set_logging_func(r2chan, ftdm_r2_on_chan_log);
|
||||
openr2_chan_set_client_data(r2chan, span->channels[i]);
|
||||
r2call->r2chan = r2chan;
|
||||
@@ -1648,6 +1675,7 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_r2_configure_span_signaling)
|
||||
}
|
||||
r2data->mf_dump_size = r2conf.mf_dump_size;
|
||||
r2data->category = r2conf.category;
|
||||
r2data->allow_collect_calls = r2conf.allow_collect_calls;
|
||||
r2data->flags = 0;
|
||||
spanpvt->r2context = r2data->r2context;
|
||||
|
||||
@@ -2367,5 +2395,5 @@ EX_DECLARE_DATA ftdm_module_t ftdm_module = {
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
|
||||
+163
@@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright (c) 2011 Sebastien Trottier
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <freetdm.h>
|
||||
#include <private/ftdm_core.h>
|
||||
|
||||
#include <openr2.h>
|
||||
|
||||
#include "ftmod_r2_io_mf_lib.h"
|
||||
|
||||
/* Convert openr2 MF tone enum value to FreeTDM MF tone value
|
||||
1-15 bitwise OR FTDM_MF_DIRECTION_FORWARD/BACKWARD
|
||||
0 (stop playing)
|
||||
openr2_mf_tone_t defined in r2proto.h
|
||||
*/
|
||||
static int ftdm_r2_openr2_mf_tone_to_ftdm_mf_tone(openr2_mf_tone_t
|
||||
openr2_tone_value, int forward_signals)
|
||||
{
|
||||
int tone;
|
||||
|
||||
switch (openr2_tone_value) {
|
||||
case 0: return 0;
|
||||
#define TONE_FROM_NAME(name) case OR2_MF_TONE_##name: tone = name; break;
|
||||
TONE_FROM_NAME(1)
|
||||
TONE_FROM_NAME(2)
|
||||
TONE_FROM_NAME(3)
|
||||
TONE_FROM_NAME(4)
|
||||
TONE_FROM_NAME(5)
|
||||
TONE_FROM_NAME(6)
|
||||
TONE_FROM_NAME(7)
|
||||
TONE_FROM_NAME(8)
|
||||
TONE_FROM_NAME(9)
|
||||
TONE_FROM_NAME(10)
|
||||
TONE_FROM_NAME(11)
|
||||
TONE_FROM_NAME(12)
|
||||
TONE_FROM_NAME(13)
|
||||
TONE_FROM_NAME(14)
|
||||
TONE_FROM_NAME(15)
|
||||
#undef TONE_FROM_NAME
|
||||
default:
|
||||
ftdm_assert(0, "Invalid openr2_tone_value\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Add flag corresponding to direction */
|
||||
if (forward_signals) {
|
||||
tone |= FTDM_MF_DIRECTION_FORWARD;
|
||||
} else {
|
||||
tone |= FTDM_MF_DIRECTION_BACKWARD;
|
||||
}
|
||||
|
||||
return tone;
|
||||
}
|
||||
|
||||
/* MF generation routines (using IO command of a FreeTDM channel)
|
||||
write_init stores the direction of the MF to generate */
|
||||
static void *ftdm_r2_io_mf_write_init(ftdm_r2_mf_write_handle_t *handle, int forward_signals)
|
||||
{
|
||||
ftdm_log_chan(handle->ftdmchan, FTDM_LOG_DEBUG, "ftdm_r2_io_mf_write_init, "
|
||||
"forward = %d\n", forward_signals);
|
||||
|
||||
handle->fwd = forward_signals;
|
||||
return handle;
|
||||
}
|
||||
|
||||
static int ftdm_r2_io_mf_generate_tone(ftdm_r2_mf_write_handle_t *handle, int16_t buffer[], int samples)
|
||||
{
|
||||
/* Our mf_want_generate implementation always return 0, so mf_generate_tone should never be called */
|
||||
ftdm_assert(0, "ftdm_r2_io_mf_generate_tone not implemented\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* \brief mf_select_tone starts tone generation or stops current tone
|
||||
* \return 0 on success, -1 on error
|
||||
*/
|
||||
static int ftdm_r2_io_mf_select_tone(ftdm_r2_mf_write_handle_t *handle, char signal)
|
||||
{
|
||||
int tone; /* (0, 1-15) (0 meaning to stop playing) */
|
||||
|
||||
ftdm_log_chan(handle->ftdmchan, FTDM_LOG_DEBUG, "ftdm_r2_io_mf_select_tone, "
|
||||
"signal = %c\n", signal);
|
||||
|
||||
if (-1 == (tone = ftdm_r2_openr2_mf_tone_to_ftdm_mf_tone(signal, handle->fwd))) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Start/stop playback directly here, as select tone is called each time a tone
|
||||
is started or stopped (called if tone changes, but silence is tone 0,
|
||||
triggering a tone change) */
|
||||
if (tone > 0) {
|
||||
ftdm_channel_command(handle->ftdmchan, FTDM_COMMAND_START_MF_PLAYBACK, &tone);
|
||||
} else {
|
||||
/* tone 0 means to stop current tone */
|
||||
ftdm_channel_command(handle->ftdmchan, FTDM_COMMAND_STOP_MF_PLAYBACK, NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ftdm_r2_io_mf_want_generate(ftdm_r2_mf_write_handle_t *handle, int signal)
|
||||
{
|
||||
/* Return 0, meaning mf_generate_tone doesn't need to be called */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* MF lib interface that generate MF tones via FreeTDM channel IO commands
|
||||
MF detection using the default openr2 provider (r2engine) */
|
||||
static openr2_mflib_interface_t g_mf_ftdm_io_iface = {
|
||||
/* .mf_read_init */ (openr2_mf_read_init_func)openr2_mf_rx_init,
|
||||
/* .mf_write_init */ (openr2_mf_write_init_func)ftdm_r2_io_mf_write_init,
|
||||
/* .mf_detect_tone */ (openr2_mf_detect_tone_func)openr2_mf_rx,
|
||||
/* .mf_generate_tone */ (openr2_mf_generate_tone_func)ftdm_r2_io_mf_generate_tone,
|
||||
/* .mf_select_tone */ (openr2_mf_select_tone_func)ftdm_r2_io_mf_select_tone,
|
||||
/* .mf_want_generate */ (openr2_mf_want_generate_func)ftdm_r2_io_mf_want_generate,
|
||||
/* .mf_read_dispose */ NULL,
|
||||
/* .mf_write_dispose */ NULL
|
||||
};
|
||||
|
||||
openr2_mflib_interface_t *ftdm_r2_get_native_channel_mf_generation_iface()
|
||||
{
|
||||
return &g_mf_ftdm_io_iface;
|
||||
}
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4
|
||||
*/
|
||||
Regular → Executable
+26
-28
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, Anthony Minessale II
|
||||
* Copyright (c) 2011 Sebastien Trottier
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -29,39 +29,38 @@
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef FTDM_SANGOMA_BOOST_H
|
||||
#define FTDM_SANGOMA_BOOST_H
|
||||
#include "sangoma_boost_client.h"
|
||||
#include "freetdm.h"
|
||||
#ifndef _FTMOD_R2_IO_MFLIB_H_
|
||||
#define _FTMOD_R2_IO_MFLIB_H_
|
||||
|
||||
#define MAX_CHANS_PER_TRUNKGROUP 1024
|
||||
#include <ftdm_declare.h>
|
||||
|
||||
typedef enum {
|
||||
FTDM_SANGOMA_BOOST_RUNNING = (1 << 0),
|
||||
FTDM_SANGOMA_BOOST_RESTARTING = (1 << 1),
|
||||
FTDM_SANGOMA_BOOST_EVENTS_RUNNING = (1 << 2),
|
||||
} ftdm_sangoma_boost_flag_t;
|
||||
#include <openr2.h>
|
||||
|
||||
typedef struct ftdm_sangoma_boost_data {
|
||||
sangomabc_connection_t mcon;
|
||||
sangomabc_connection_t pcon;
|
||||
int iteration;
|
||||
uint32_t flags;
|
||||
boost_sigmod_interface_t *sigmod;
|
||||
ftdm_queue_t *boost_queue;
|
||||
} ftdm_sangoma_boost_data_t;
|
||||
|
||||
typedef struct ftdm_sangoma_boost_trunkgroup {
|
||||
ftdm_mutex_t *mutex;
|
||||
ftdm_size_t size; /* Number of b-channels in group */
|
||||
unsigned int last_used_index; /* index of last b-channel used */
|
||||
ftdm_channel_t* ftdmchans[MAX_CHANS_PER_TRUNKGROUP];
|
||||
//TODO need to merge congestion timeouts to this struct
|
||||
} ftdm_sangoma_boost_trunkgroup_t;
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* MFC/R2 tone generator handle (mf_write_handle) */
|
||||
typedef struct {
|
||||
/*! FTDM channel performing the MF generation */
|
||||
ftdm_channel_t *ftdmchan;
|
||||
/*! 1 if generating forward tones, otherwise generating reverse tones. */
|
||||
int fwd;
|
||||
} ftdm_r2_mf_write_handle_t;
|
||||
|
||||
/* MF lib interface that generate MF tones via FreeTDM channel IO commands
|
||||
MF detection using the default openr2 provider (r2engine) */
|
||||
openr2_mflib_interface_t *ftdm_r2_get_native_channel_mf_generation_iface(void);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
} /* endif extern "C" */
|
||||
#endif
|
||||
|
||||
#endif /* endif defined _FTMOD_R2_IO_MFLIB_H_ */
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
@@ -72,4 +71,3 @@ typedef struct ftdm_sangoma_boost_trunkgroup {
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
== Boost sigmod current limitations ==
|
||||
- we don't support having openzap spans with physical channels
|
||||
belonging to other physical spans. this is due to netborder sangoma abstraction, therefore
|
||||
any openzap span using sigboost must have only channels belonging to the corresponding
|
||||
physical span.
|
||||
|
||||
This is the reason we added group functionality in openzap core, furthermore, previous groups in openzap
|
||||
were only possible through adding of b-channels to a single span, but this forces the user to create groups
|
||||
of channels only whithin the same type of trunk among other things.
|
||||
|
||||
- all spans must be configured and then started, cannot configure, start, configure start etc
|
||||
this is due to netborder telesoft abstraction. that requires configuring everything and
|
||||
then starting everything at once.
|
||||
|
||||
- sangoma_prid and sangoma_brid on Windows had to be compiled hacking make/Makefile.platform to comment all VC runtime checks,
|
||||
otherwise when running in debug mode exceptions are thrown due to loss of data ie short to char conversions.
|
||||
|
||||
== TODO ==
|
||||
- proper upper layer management of HW alarms (this must be done in mod_openzap.c)
|
||||
|
||||
@@ -1,146 +0,0 @@
|
||||
== General Design ==
|
||||
|
||||
NBE will do its current loading of spans and configuration process through Sangoma Board Manager (SBM).
|
||||
After doing SangomaBoardManager::getInstance().configure -> start. It will proceed to initalize
|
||||
the openzap stack (just as the TelesoftStack is loaded after starting SMB. The procedure will be:
|
||||
|
||||
- create a static or malloced zap_io_interface_t
|
||||
- call zap_global_set_logger with the logging hooks.
|
||||
- call zap_global_set_memhandler() with the memory hooks.
|
||||
- call zap_global_init() to initialize the stack
|
||||
- call zap_add_io_iface() to add the I/O iface.
|
||||
- iterate over all SBM spans configured for BRI or any boost-managed signaling and:
|
||||
* call zap_span_create(NBE I/O mod, in_ptrSpan, SMB span name)
|
||||
* Fill in some members like:
|
||||
span->trunk_type = E1/T1/J1/FXO/FXS etc ...
|
||||
* iterate over all channels in SMB span and:
|
||||
* zap_span_add_channel(zap_span, sock, type:CAS|BCHAN|DCHAN|ETC)
|
||||
* call zap_configure_span("sangoma_boost", span, sigmsg_callback, "param1", value1, "param2", value1 ...)
|
||||
* zap_span_start(span);
|
||||
|
||||
|
||||
At this point, NBE would receive signaling msgs via sigmsg_callback registered when configuring
|
||||
and NBE would request hangup or making calls throug openzap API, like zap_set_state_* and zap_channel_outgoing_call() to place calls.
|
||||
|
||||
When NBE wants to check for link status.
|
||||
|
||||
zap_get_siglink_state() which would return
|
||||
ZAP_SIG_STATE_UP (D-chan UP, R2 bits in IDLE, ss7?)
|
||||
ZAP_SIG_STATE_SUSPENDED (D-chan in power saving mode?)
|
||||
ZAP_SIG_STATE_DOWN (D-chan down, R2 bits in blocked, ss7?)
|
||||
|
||||
Whenever a state in sig link changes, the sigmsg_callback will be used to notify NBE or any other user.
|
||||
|
||||
NOTE: right now hardware alarms notification in openzap is seriously broken,
|
||||
see ozmod_libpri.c process_event ... reads an event from hardware (zap_event_t *),
|
||||
then checks the event type, if its ZAP_OOB_ALARM_TRAP prepares a zap_sigmsg_t
|
||||
(signaling event) setting its event_id to ZAP_OOB_ALARM_TRAP, which is *WRONG*
|
||||
because event_id is of type zap_signal_event_t and not zap_oob_event_t!
|
||||
this means on alarm the user will get ZAP_SIGEVENT_PROGRESS_MEDIA!! which is
|
||||
value 7 that is in conflict with ZAP_OOB_ALARM_TRAP, I think a separate
|
||||
callback should be used if the outside user wants to be notified about
|
||||
hardware events like HW DTMF or so. Currently there is alreadya generic DTMF
|
||||
listener.
|
||||
|
||||
== Tasks Stage 1 / OpenZAP and Boost changes (To be tested with FreeSWITCH) ==
|
||||
|
||||
- Change malloc and other mem functions in openzap
|
||||
to use internal hooks provided via zap_global_set_memhandler()
|
||||
which would be called before zap_global_init(), this is
|
||||
already done for the logger via zap_global_set_logger()
|
||||
|
||||
question: should the mem routines allow for memory pool ptr?
|
||||
this could be useful to provide a memory pool to
|
||||
the whole module.
|
||||
|
||||
question: should we allow hooks for threads and locking?
|
||||
I think we can skip this one unless needed. They already
|
||||
use their own threading abstraction which is working for
|
||||
Linux and Windows. If we ever need to profile threading
|
||||
we can add profiling hooks.
|
||||
|
||||
question: I had to add openzap calls to the hash table and libteletone implementations, is that acceptable?
|
||||
|
||||
- Modify zap_global_init() API
|
||||
|
||||
This API must just initialize vars, mutexes etc.
|
||||
and NOT DO ANY CONFIGURATION LOADING, PARSING, SPAN CREATION and I/O
|
||||
configuration, which is what is currently doing.
|
||||
We don't want zap_global_init() to create the spans based on that configuration
|
||||
since NBE will have its own configuration and will take care of creating
|
||||
the needed data structures on its own.
|
||||
|
||||
- Add new zap_std_io_config() API
|
||||
|
||||
This API will parse the standard openzap.conf module and create the spans.
|
||||
This will be used by FS but not by NBE, which will create the openzap spans by itself.
|
||||
The NBE flow to initialize openzap will be:
|
||||
|
||||
- Add new API zap_global_add_io_iface(),
|
||||
|
||||
This API will add a new I/O interface structure to the internal openzap hash of I/O structs.
|
||||
This is needed because NBE I/O structure will NOT be loaded from an openzap module (.so/.dll)
|
||||
but rather just registered on runtime (probably from a static structure in NBE code).
|
||||
This openzap hash is used by zap_api_execute() for example, to find the module that can
|
||||
handle a given API, ie (oz libpri status). This is an example of how an openzap I/O interface
|
||||
can decide to implement just the ->api() member to handle commands and NOTHING else,
|
||||
so I/O interfaces not necessary are hardware-related.
|
||||
|
||||
- Add new zap_channel_get_siglink_state(zap_channel, zap_siglink_status_t &status)
|
||||
|
||||
- Modify mod_openzap.c to read proto= setting in boost spans, this will determine wich boost sig
|
||||
module will handle the configuration and those channels.
|
||||
|
||||
<boost_spans> <span sigmod="bri|ss7|blah"> <param="proto-specific-setting" value="setting"> </span> </boost_spans>
|
||||
|
||||
Then as first config arg to zap_config_span() the boost proto module name would be included as "sigmod" which will be used
|
||||
by ozmod_sangoma_boost to decide which sig module must handle that span configuration
|
||||
|
||||
- Create minimal boost mod interface.
|
||||
|
||||
ozmod_boost_ss7 should load sig boost mods and get interface via dlsym(boost_get_interface) boost_get_interface(boost_iface);
|
||||
The boost interface will have
|
||||
* const char *name // boost sigmod name (brid,ss7d)
|
||||
* set_write_boost_msg_cb(callback) // tell the stack how to send us boost messages
|
||||
* set_sig_status_cb(callback); // tell the stack how to notify us about link status changes
|
||||
* write_boost_msg(struct boost_msg) // send a boost msg to the stack
|
||||
* configure_span(zap_span_t span, "configuration", value, "configuration", value) // configure a given span
|
||||
* get_sig_status(openzap_sigstatus_t status)
|
||||
* start(span) // to start a given openzap span
|
||||
* stop(span) // to stop the stack on a given openzap span
|
||||
|
||||
- Migrate current sangoma_brid sig module to openzap
|
||||
* Make sangoma_brid a library
|
||||
* Move from using malloc, threading, locking, logging and I/O to openzap functions. Export the boost sigmod interface and its supporting code.
|
||||
|
||||
== State 2 Tasks ==
|
||||
|
||||
- Create the I/O NBE interface and supporting functions. It must be possible to poll over the span
|
||||
given that ozmod_sangoma_boost BRI module and others may need to *wait* for data. The poll()
|
||||
function in I/O NBE interface would wait on a pthread condition or Windows event, which would
|
||||
be triggered by some external NBE component registered with Sangoma Board Manager (SMB) for d-chan
|
||||
data, whenever d-chan data arrives, saves the data in a buffer and triggers the condition to wakeup
|
||||
any waiter, then the waiter (sangoma_brid or any other boost client) calls zap_channel_read which calls
|
||||
our own I/O NBE interface read method and retrieves the data from the buffer.
|
||||
|
||||
Dropped alternative design:
|
||||
Another option is to add a new API zap_span_push_incoming_data(span/chan, data); However this changes
|
||||
the model openzap has followed and I don't think fits that well, since now we have 2 different models
|
||||
to support in openzap.
|
||||
|
||||
== TODO ==
|
||||
|
||||
- how about logging specific modules, like, just ozmod_boost, or just the BRI stack?
|
||||
more work to be done so the BRI module uses zap_log instead of current syslog
|
||||
then work to be done to be able to filter logs from specific openzap code? is it worth it?
|
||||
|
||||
- remove FORCE_SEGFAULT from sprid
|
||||
|
||||
|
||||
=== Shortcomings ==
|
||||
|
||||
- we had to drop smg support in the branch where we work on sangoma prid.
|
||||
After all, most people using sangoma_prid is using freeswitch/openzap and not Sangoma Media Gateway
|
||||
The problem is in freeswitch/openzap mode, sangoma_boost ozmod takes care of span events (POLLPRI)
|
||||
where in SMG and Netborder POLLPRI is done typically by sangoma board manager.
|
||||
|
||||
@@ -1,373 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9.00"
|
||||
Name="ftmod_sangoma_boost"
|
||||
ProjectGUID="{D021EF2A-460D-4827-A0F7-41FDECF46F1B}"
|
||||
RootNamespace="ftmod_sangoma_boost"
|
||||
Keyword="Win32Proj"
|
||||
TargetFrameworkVersion="196613"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
<Platform
|
||||
Name="x64"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="4"
|
||||
WarnAsError="true"
|
||||
DebugInformationFormat="4"
|
||||
DisableSpecificWarnings="4100"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="freetdm.lib"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories=""$(OutDir)""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Debug|x64"
|
||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\include;..\..\isdn\include"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="4"
|
||||
WarnAsError="true"
|
||||
DebugInformationFormat="3"
|
||||
DisableSpecificWarnings="4100"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="freetdm.lib"
|
||||
LinkIncremental="2"
|
||||
AdditionalLibraryDirectories=""$(OutDir)""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="4"
|
||||
WarnAsError="true"
|
||||
DebugInformationFormat="3"
|
||||
DisableSpecificWarnings="4100"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|x64"
|
||||
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
ConfigurationType="2"
|
||||
CharacterSet="1"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
TargetEnvironment="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="4"
|
||||
WarnAsError="false"
|
||||
DebugInformationFormat="3"
|
||||
DisableSpecificWarnings="4100"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath="ftmod_sangoma_boost.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="sangoma_boost_client.c"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath="ftdm_sangoma_boost.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="sangoma_boost_client.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="sangoma_boost_interface.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="sigboost.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -1,206 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectName>ftmod_sangoma_boost</ProjectName>
|
||||
<ProjectGuid>{D021EF2A-460D-4827-A0F7-41FDECF46F1B}</ProjectGuid>
|
||||
<RootNamespace>ftmod_sangoma_boost</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;..\..\isdn\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<TreatWarningAsError>true</TreatWarningAsError>
|
||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<TreatWarningAsError>true</TreatWarningAsError>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\include;..\..\isdn\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<TreatWarningAsError>true</TreatWarningAsError>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>freetdm.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Midl>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<AdditionalIncludeDirectories>..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;FTMOD_SANGOMA_BOOST_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
<TreatWarningAsError>false</TreatWarningAsError>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<DisableSpecificWarnings>4100;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ftmod_sangoma_boost.c" />
|
||||
<ClCompile Include="sangoma_boost_client.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ftdm_sangoma_boost.h" />
|
||||
<ClInclude Include="sangoma_boost_client.h" />
|
||||
<ClInclude Include="sangoma_boost_interface.h" />
|
||||
<ClInclude Include="sigboost.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\msvc\freetdm.2010.vcxproj">
|
||||
<Project>{93b8812c-3ec4-4f78-8970-ffbfc99e167d}</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -1,35 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ftmod_sangoma_boost.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sangoma_boost_client.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ftdm_sangoma_boost.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sangoma_boost_client.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sangoma_boost_interface.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sigboost.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,589 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007, Anthony Minessale II, Nenad Corbic
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#if HAVE_NETDB_H
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include "freetdm.h"
|
||||
#include "sangoma_boost_client.h"
|
||||
|
||||
#ifndef HAVE_GETHOSTBYNAME_R
|
||||
extern int gethostbyname_r (const char *__name,
|
||||
struct hostent *__result_buf,
|
||||
char *__buf, size_t __buflen,
|
||||
struct hostent **__result,
|
||||
int *__h_errnop);
|
||||
#endif
|
||||
|
||||
struct sangomabc_map {
|
||||
uint32_t event_id;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
static struct sangomabc_map sangomabc_table[] = {
|
||||
{SIGBOOST_EVENT_CALL_START, "CALL_START"},
|
||||
{SIGBOOST_EVENT_CALL_START_ACK, "CALL_START_ACK"},
|
||||
{SIGBOOST_EVENT_CALL_START_NACK, "CALL_START_NACK"},
|
||||
{SIGBOOST_EVENT_CALL_PROGRESS, "CALL PROGRESS"},
|
||||
{SIGBOOST_EVENT_CALL_START_NACK_ACK, "CALL_START_NACK_ACK"},
|
||||
{SIGBOOST_EVENT_CALL_ANSWERED, "CALL_ANSWERED"},
|
||||
{SIGBOOST_EVENT_CALL_STOPPED, "CALL_STOPPED"},
|
||||
{SIGBOOST_EVENT_CALL_STOPPED_ACK, "CALL_STOPPED_ACK"},
|
||||
{SIGBOOST_EVENT_CALL_RELEASED, "CALL_RELEASED"},
|
||||
{SIGBOOST_EVENT_SYSTEM_RESTART, "SYSTEM_RESTART"},
|
||||
{SIGBOOST_EVENT_SYSTEM_RESTART_ACK, "SYSTEM_RESTART_ACK"},
|
||||
{SIGBOOST_EVENT_HEARTBEAT, "HEARTBEAT"},
|
||||
{SIGBOOST_EVENT_INSERT_CHECK_LOOP, "LOOP START"},
|
||||
{SIGBOOST_EVENT_REMOVE_CHECK_LOOP, "LOOP STOP"},
|
||||
{SIGBOOST_EVENT_AUTO_CALL_GAP_ABATE, "AUTO_CALL_GAP_ABATE"},
|
||||
{SIGBOOST_EVENT_DIGIT_IN, "DIGIT_IN"}
|
||||
};
|
||||
|
||||
|
||||
|
||||
static void sangomabc_print_event_call(sangomabc_connection_t *mcon, sangomabc_event_t *event, int priority, int dir, const char *file, const char *func, int line)
|
||||
{
|
||||
if (event->event_id == SIGBOOST_EVENT_HEARTBEAT)
|
||||
return;
|
||||
|
||||
ftdm_log(file, func, line, mcon->debuglevel, "%s EVENT (%s): %s:(%X) [w%dg%d] CSid=%i Seq=%i Cn=[%s] Cd=[%s] Ci=[%s] Rdnis=[%s]\n",
|
||||
dir ? "TX":"RX",
|
||||
priority ? "P":"N",
|
||||
sangomabc_event_id_name(event->event_id),
|
||||
event->event_id,
|
||||
BOOST_EVENT_SPAN(mcon->sigmod, event),
|
||||
BOOST_EVENT_CHAN(mcon->sigmod, event),
|
||||
event->call_setup_id,
|
||||
event->fseqno,
|
||||
strlen(event->calling_name)?event->calling_name:"N/A",
|
||||
(event->called_number_digits_count ? (char *) event->called_number_digits : "N/A"),
|
||||
(event->calling_number_digits_count ? (char *) event->calling_number_digits : "N/A"),
|
||||
event->isup_in_rdnis);
|
||||
|
||||
}
|
||||
static void sangomabc_print_event_short(sangomabc_connection_t *mcon, sangomabc_short_event_t *event, int priority, int dir, const char *file, const char *func, int line)
|
||||
{
|
||||
if (event->event_id == SIGBOOST_EVENT_HEARTBEAT)
|
||||
return;
|
||||
ftdm_log(file, func, line, mcon->debuglevel, "%s EVENT (%s): %s:(%X) [s%dc%d] Rc=%i CSid=%i Seq=%i \n",
|
||||
dir ? "TX":"RX",
|
||||
priority ? "P":"N",
|
||||
sangomabc_event_id_name(event->event_id),
|
||||
event->event_id,
|
||||
BOOST_EVENT_SPAN(mcon->sigmod, event),
|
||||
BOOST_EVENT_CHAN(mcon->sigmod, event),
|
||||
event->release_cause,
|
||||
event->call_setup_id,
|
||||
event->fseqno);
|
||||
}
|
||||
|
||||
|
||||
static int create_conn_socket(sangomabc_connection_t *mcon, char *local_ip, int local_port, char *ip, int port)
|
||||
{
|
||||
#ifndef WIN32
|
||||
int rc;
|
||||
struct hostent *result, *local_result;
|
||||
char buf[512], local_buf[512];
|
||||
int err = 0, local_err = 0;
|
||||
|
||||
if (mcon->sigmod) {
|
||||
ftdm_log(FTDM_LOG_WARNING, "I should not be called on a sigmod-managed connection!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
memset(&mcon->remote_hp, 0, sizeof(mcon->remote_hp));
|
||||
memset(&mcon->local_hp, 0, sizeof(mcon->local_hp));
|
||||
#ifdef HAVE_NETINET_SCTP_H
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Creating SCTP socket L=%s:%d R=%s:%d\n",
|
||||
local_ip, local_port, ip, port);
|
||||
mcon->socket = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
|
||||
#else
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Creating UDP socket L=%s:%d R=%s:%d\n",
|
||||
local_ip, local_port, ip, port);
|
||||
mcon->socket = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
#endif
|
||||
|
||||
if (mcon->socket >= 0) {
|
||||
int flag;
|
||||
|
||||
flag = 1;
|
||||
#ifdef HAVE_GETHOSTBYNAME_R_FIVE
|
||||
gethostbyname_r(ip, &mcon->remote_hp, buf, sizeof(buf), &err);
|
||||
gethostbyname_r(local_ip, &mcon->local_hp, local_buf, sizeof(local_buf), &local_err);
|
||||
if (!err && !local_err) {
|
||||
#else
|
||||
gethostbyname_r(ip, &mcon->remote_hp, buf, sizeof(buf), &result, &err);
|
||||
gethostbyname_r(local_ip, &mcon->local_hp, local_buf, sizeof(local_buf), &local_result, &local_err);
|
||||
if (result && local_result) {
|
||||
#endif
|
||||
mcon->remote_addr.sin_family = mcon->remote_hp.h_addrtype;
|
||||
memcpy((char *) &mcon->remote_addr.sin_addr.s_addr, mcon->remote_hp.h_addr_list[0], mcon->remote_hp.h_length);
|
||||
mcon->remote_addr.sin_port = htons(port);
|
||||
|
||||
mcon->local_addr.sin_family = mcon->local_hp.h_addrtype;
|
||||
memcpy((char *) &mcon->local_addr.sin_addr.s_addr, mcon->local_hp.h_addr_list[0], mcon->local_hp.h_length);
|
||||
mcon->local_addr.sin_port = htons(local_port);
|
||||
|
||||
#ifdef HAVE_NETINET_SCTP_H
|
||||
setsockopt(mcon->socket, IPPROTO_SCTP, SCTP_NODELAY,
|
||||
(char *)&flag, sizeof(int));
|
||||
#endif
|
||||
|
||||
if ((rc = bind(mcon->socket,
|
||||
(struct sockaddr *) &mcon->local_addr,
|
||||
sizeof(mcon->local_addr))) < 0) {
|
||||
close(mcon->socket);
|
||||
mcon->socket = -1;
|
||||
} else {
|
||||
#ifdef HAVE_NETINET_SCTP_H
|
||||
rc=listen(mcon->socket, 100);
|
||||
if (rc) {
|
||||
close(mcon->socket);
|
||||
mcon->socket = -1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mcon->socket;
|
||||
#else
|
||||
return 0;
|
||||
#endif // ifndef WIN32
|
||||
}
|
||||
|
||||
int sangomabc_connection_close(sangomabc_connection_t *mcon)
|
||||
{
|
||||
#ifndef WIN32
|
||||
if (mcon->sigmod) {
|
||||
ftdm_log(FTDM_LOG_WARNING, "I should not be called on a sigmod-managed connection!\n");
|
||||
return 0;
|
||||
}
|
||||
if (mcon->socket > -1) {
|
||||
close(mcon->socket);
|
||||
}
|
||||
|
||||
if (mcon->mutex) {
|
||||
ftdm_mutex_lock(mcon->mutex);
|
||||
ftdm_mutex_unlock(mcon->mutex);
|
||||
ftdm_mutex_destroy(&mcon->mutex);
|
||||
}
|
||||
memset(mcon, 0, sizeof(*mcon));
|
||||
mcon->socket = -1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sangomabc_connection_open(sangomabc_connection_t *mcon, char *local_ip, int local_port, char *ip, int port)
|
||||
{
|
||||
ftdm_mutex_create(&mcon->mutex);
|
||||
if (mcon->sigmod) {
|
||||
/*value of mcon->socket will be ignored in sigmod mode */
|
||||
return 0;
|
||||
}
|
||||
#ifndef WIN32
|
||||
create_conn_socket(mcon, local_ip, local_port, ip, port);
|
||||
return mcon->socket;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int sangomabc_exec_command(sangomabc_connection_t *mcon, int span, int chan, int id, int cmd, int cause, int flags)
|
||||
{
|
||||
sangomabc_event_t *oevent;
|
||||
sangomabc_short_event_t sevent;
|
||||
sangomabc_event_t fevent;
|
||||
int retry = 5;
|
||||
|
||||
if (boost_full_event(cmd)) {
|
||||
sangomabc_event_init((void *)&fevent, cmd, chan, span);
|
||||
oevent = &fevent;
|
||||
} else {
|
||||
sangomabc_event_init(&sevent, cmd, chan, span);
|
||||
sevent.release_cause = (uint8_t)cause;
|
||||
oevent = (sangomabc_event_t *)&sevent;
|
||||
}
|
||||
oevent->flags = flags;
|
||||
|
||||
if (cmd == SIGBOOST_EVENT_SYSTEM_RESTART || cmd == SIGBOOST_EVENT_SYSTEM_RESTART_ACK) {
|
||||
mcon->rxseq_reset = 1;
|
||||
mcon->txseq = 0;
|
||||
mcon->rxseq = 0;
|
||||
mcon->txwindow = 0;
|
||||
}
|
||||
|
||||
if (id >= 0) {
|
||||
oevent->call_setup_id = (uint16_t)id;
|
||||
}
|
||||
|
||||
while (sangomabc_connection_write(mcon, (sangomabc_event_t*)oevent) <= 0) {
|
||||
if (--retry <= 0) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Failed to tx on boost socket: %s\n", strerror(errno));
|
||||
return -1;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_WARNING, "Failed to tx on boost socket: %s :retry %i\n", strerror(errno), retry);
|
||||
ftdm_sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int sangomabc_exec_commandp(sangomabc_connection_t *pcon, int span, int chan, int id, int cmd, int cause)
|
||||
{
|
||||
sangomabc_short_event_t oevent;
|
||||
int retry = 5;
|
||||
|
||||
sangomabc_event_init(&oevent, cmd, chan, span);
|
||||
oevent.release_cause = (uint8_t)cause;
|
||||
|
||||
if (id >= 0) {
|
||||
oevent.call_setup_id = (uint16_t)id;
|
||||
}
|
||||
|
||||
while (sangomabc_connection_writep(pcon, (sangomabc_event_t*)&oevent) <= 0) {
|
||||
if (--retry <= 0) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Failed to tx on boost socket: %s\n", strerror(errno));
|
||||
return -1;
|
||||
} else {
|
||||
ftdm_log(FTDM_LOG_WARNING, "Failed to tx on boost socket: %s :retry %i\n", strerror(errno), retry);
|
||||
ftdm_sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
sangomabc_event_t *__sangomabc_connection_read(sangomabc_connection_t *mcon, int iteration, const char *file, const char *func, int line)
|
||||
{
|
||||
#ifndef WIN32
|
||||
unsigned int fromlen = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
int bytes = 0;
|
||||
int msg_ok = 0;
|
||||
sangomabc_queue_element_t *e = NULL;
|
||||
|
||||
if (mcon->sigmod) {
|
||||
e = ftdm_queue_dequeue(mcon->boost_queue);
|
||||
if (e) {
|
||||
bytes = (int)e->size;
|
||||
memcpy(&mcon->event, e->boostmsg, bytes);
|
||||
ftdm_safe_free(e);
|
||||
}
|
||||
}
|
||||
#ifndef WIN32
|
||||
else {
|
||||
bytes = recvfrom(mcon->socket, &mcon->event, sizeof(mcon->event), MSG_DONTWAIT,
|
||||
(struct sockaddr *) &mcon->local_addr, &fromlen);
|
||||
}
|
||||
#endif
|
||||
if (bytes <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (mcon->event.version != SIGBOOST_VERSION) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Invalid Boost Version %i Expecting %i\n",mcon->event.version, SIGBOOST_VERSION);
|
||||
}
|
||||
|
||||
if ((bytes >= MIN_SIZE_CALLSTART_MSG) && boost_full_event(mcon->event.event_id)) {
|
||||
msg_ok=1;
|
||||
|
||||
} else if (bytes == sizeof(sangomabc_short_event_t)) {
|
||||
msg_ok=1;
|
||||
|
||||
} else {
|
||||
msg_ok=0;
|
||||
}
|
||||
|
||||
if (msg_ok) {
|
||||
if (sangomabc_test_flag(mcon, MSU_FLAG_DOWN)) {
|
||||
if (mcon->event.event_id != SIGBOOST_EVENT_SYSTEM_RESTART &&
|
||||
mcon->event.event_id != SIGBOOST_EVENT_SYSTEM_RESTART_ACK &&
|
||||
mcon->event.event_id != SIGBOOST_EVENT_HEARTBEAT) {
|
||||
ftdm_log(file, func, line, FTDM_LOG_LEVEL_WARNING, "Not reading packets when connection is down. [%s]\n",
|
||||
sangomabc_event_id_name(mcon->event.event_id));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (boost_full_event(mcon->event.event_id)) {
|
||||
sangomabc_print_event_call(mcon, &mcon->event, 0, 0, file, func, line);
|
||||
} else {
|
||||
sangomabc_print_event_short(mcon, (sangomabc_short_event_t*)&mcon->event, 0, 0, file, func, line);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* NC: NOT USED ANY MORE */
|
||||
if (mcon->rxseq_reset) {
|
||||
//if (mcon->event.event_id == SIGBOOST_EVENT_SYSTEM_RESTART_ACK) {
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Rx sync ok\n");
|
||||
mcon->rxseq = mcon->event.fseqno;
|
||||
return &mcon->event;
|
||||
//}
|
||||
errno=EAGAIN;
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Waiting for rx sync...\n");
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
mcon->txwindow = mcon->txseq - mcon->event.bseqno;
|
||||
mcon->rxseq++;
|
||||
|
||||
#if 0
|
||||
if (mcon->rxseq != mcon->event.fseqno) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Invalid Sequence Number Expect=%i Rx=%i\n", mcon->rxseq, mcon->event.fseqno);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return &mcon->event;
|
||||
} else {
|
||||
if (iteration == 0) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "NC - Invalid Event length from boost rxlen=%i evsz=%i\n", bytes, sizeof(mcon->event));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sangomabc_event_t *__sangomabc_connection_readp(sangomabc_connection_t *mcon, int iteration, const char *file, const char *func, int line)
|
||||
{
|
||||
#ifndef WIN32
|
||||
unsigned int fromlen = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
int bytes = 0;
|
||||
|
||||
if (mcon->sigmod) {
|
||||
/* priority stuff is handled just the same when there is a sigmod */
|
||||
return sangomabc_connection_read(mcon, iteration);
|
||||
}
|
||||
#ifndef WIN32
|
||||
else {
|
||||
bytes = recvfrom(mcon->socket, &mcon->event, sizeof(mcon->event), MSG_DONTWAIT, (struct sockaddr *) &mcon->local_addr, &fromlen);
|
||||
}
|
||||
#endif
|
||||
if (bytes <= 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (mcon->event.version != SIGBOOST_VERSION) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Invalid Boost Version %i Expecting %i\n",mcon->event.version, SIGBOOST_VERSION);
|
||||
}
|
||||
|
||||
if (bytes == sizeof(sangomabc_short_event_t)) {
|
||||
|
||||
if (boost_full_event(mcon->event.event_id)) {
|
||||
sangomabc_print_event_call(mcon, &mcon->event, 1, 0, file, func, line);
|
||||
} else {
|
||||
sangomabc_print_event_short(mcon, (sangomabc_short_event_t*)&mcon->event, 1, 0, file, func, line);
|
||||
}
|
||||
|
||||
return &mcon->event;
|
||||
} else {
|
||||
if (iteration == 0) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Critical Error: PQ Invalid Event lenght from boost rxlen=%i evsz=%i\n", bytes, sizeof(mcon->event));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int __sangomabc_connection_write(sangomabc_connection_t *mcon, sangomabc_event_t *event, const char *file, const char *func, int line)
|
||||
{
|
||||
int err = 0;
|
||||
int event_size=MIN_SIZE_CALLSTART_MSG+event->isup_in_rdnis_size;
|
||||
|
||||
ftdm_assert_return(event != NULL, -1, "No event!");
|
||||
ftdm_assert_return(mcon->socket >= 0, -1, "No mcon->socket!");
|
||||
ftdm_assert_return(mcon->mutex != NULL, -1, "No mcon->mutex!");
|
||||
|
||||
ftdm_assert_return(event->span <= FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN, -1, "Invalid span when writing boost event\n");
|
||||
ftdm_assert_return(event->chan <= FTDM_MAX_CHANNELS_PHYSICAL_SPAN, -1, "Invalid chan when writing boost event\n");
|
||||
|
||||
if (!boost_full_event(event->event_id)) {
|
||||
event_size=sizeof(sangomabc_short_event_t);
|
||||
}
|
||||
|
||||
if (sangomabc_test_flag(mcon, MSU_FLAG_DOWN)) {
|
||||
if (event->event_id != SIGBOOST_EVENT_SYSTEM_RESTART &&
|
||||
event->event_id != SIGBOOST_EVENT_SYSTEM_RESTART_ACK &&
|
||||
event->event_id != SIGBOOST_EVENT_HEARTBEAT) {
|
||||
ftdm_log(file, func, line, FTDM_LOG_LEVEL_WARNING, "Not writing packets when connection is down. [%s]\n",
|
||||
sangomabc_event_id_name(event->event_id));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ftdm_mutex_lock(mcon->mutex);
|
||||
if (event->event_id == SIGBOOST_EVENT_SYSTEM_RESTART_ACK) {
|
||||
mcon->txseq=0;
|
||||
mcon->rxseq=0;
|
||||
event->fseqno=0;
|
||||
} else {
|
||||
event->fseqno = mcon->txseq++;
|
||||
}
|
||||
event->bseqno = mcon->rxseq;
|
||||
event->version = SIGBOOST_VERSION;
|
||||
|
||||
if (boost_full_event(event->event_id)) {
|
||||
sangomabc_print_event_call(mcon, event, 0, 1, file, func, line);
|
||||
} else {
|
||||
sangomabc_print_event_short(mcon, (sangomabc_short_event_t*)event, 0, 1, file, func, line);
|
||||
}
|
||||
|
||||
if (mcon->sigmod) {
|
||||
mcon->sigmod->write_msg(mcon->span, event, event_size);
|
||||
err = event_size;
|
||||
}
|
||||
#ifndef WIN32
|
||||
else {
|
||||
err = sendto(mcon->socket, event, event_size, 0, (struct sockaddr *) &mcon->remote_addr, sizeof(mcon->remote_addr));
|
||||
}
|
||||
#endif
|
||||
|
||||
ftdm_mutex_unlock(mcon->mutex);
|
||||
|
||||
ftdm_assert_return(err == event_size, -1, "Failed to send the boost message completely!");
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
int __sangomabc_connection_writep(sangomabc_connection_t *mcon, sangomabc_event_t *event, const char *file, const char *func, int line)
|
||||
{
|
||||
int err = 0;
|
||||
int event_size=sizeof(sangomabc_event_t);
|
||||
|
||||
if (!mcon->sigmod) {
|
||||
ftdm_assert_return(event != NULL, -1, "No event!");
|
||||
ftdm_assert_return(mcon->socket >= 0, -1, "No mcon->socket!");
|
||||
ftdm_assert_return(mcon->mutex != NULL, -1, "No mcon->mutex!");
|
||||
}
|
||||
|
||||
if (!boost_full_event(event->event_id)) {
|
||||
event_size=sizeof(sangomabc_short_event_t);
|
||||
}
|
||||
|
||||
ftdm_mutex_lock(mcon->mutex);
|
||||
event->version = SIGBOOST_VERSION;
|
||||
if (mcon->sigmod) {
|
||||
mcon->sigmod->write_msg(mcon->span, event, event_size);
|
||||
err = event_size;
|
||||
|
||||
}
|
||||
#ifndef WIN32
|
||||
else {
|
||||
err = sendto(mcon->socket, event, event_size, 0, (struct sockaddr *) &mcon->remote_addr, sizeof(mcon->remote_addr));
|
||||
}
|
||||
#endif
|
||||
ftdm_mutex_unlock(mcon->mutex);
|
||||
|
||||
ftdm_assert_return(err == event_size, -1, "Failed to send boost message completely!");
|
||||
|
||||
if (boost_full_event(event->event_id)) {
|
||||
sangomabc_print_event_call(mcon, event, 1, 1, file, func, line);
|
||||
} else {
|
||||
sangomabc_print_event_short(mcon, (sangomabc_short_event_t*)event, 1, 1, file, func, line);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
void sangomabc_call_init(sangomabc_event_t *event, const char *calling, const char *called, int setup_id)
|
||||
{
|
||||
memset(event, 0, sizeof(sangomabc_event_t));
|
||||
event->event_id = SIGBOOST_EVENT_CALL_START;
|
||||
|
||||
if (calling) {
|
||||
strncpy((char*)event->calling_number_digits, calling, sizeof(event->calling_number_digits)-1);
|
||||
event->calling_number_digits_count = (uint8_t)strlen(calling);
|
||||
}
|
||||
|
||||
if (called) {
|
||||
strncpy((char*)event->called_number_digits, called, sizeof(event->called_number_digits)-1);
|
||||
event->called_number_digits_count = (uint8_t)strlen(called);
|
||||
}
|
||||
|
||||
event->call_setup_id = (uint16_t)setup_id;
|
||||
|
||||
}
|
||||
|
||||
void sangomabc_event_init(sangomabc_short_event_t *event, sangomabc_event_id_t event_id, int chan, int span)
|
||||
{
|
||||
if (boost_full_event(event_id)) {
|
||||
memset(event, 0, sizeof(sangomabc_event_t));
|
||||
} else {
|
||||
memset(event, 0, sizeof(sangomabc_short_event_t));
|
||||
}
|
||||
event->event_id = event_id;
|
||||
event->chan = (uint8_t)chan;
|
||||
event->span = (uint8_t)span;
|
||||
}
|
||||
|
||||
const char *sangomabc_event_id_name(uint32_t event_id)
|
||||
{
|
||||
unsigned int x;
|
||||
const char *ret = NULL;
|
||||
|
||||
for (x = 0 ; x < sizeof(sangomabc_table)/sizeof(struct sangomabc_map); x++) {
|
||||
if (sangomabc_table[x].event_id == event_id) {
|
||||
ret = sangomabc_table[x].name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
|
||||
@@ -1,164 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2007, Anthony Minessale II, Nenad Corbic
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _SANGOMABC_H
|
||||
#define _SANGOMABC_H
|
||||
|
||||
#include "sangoma_boost_interface.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#ifdef HAVE_NETINET_SCTP_H
|
||||
#include <netinet/sctp.h>
|
||||
#endif
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdarg.h>
|
||||
#include "sigboost.h"
|
||||
|
||||
#define sangomabc_test_flag(p,flag) ((p)->flags & (flag))
|
||||
|
||||
#define sangomabc_set_flag(p,flag) do { \
|
||||
((p)->flags |= (flag)); \
|
||||
} while (0)
|
||||
|
||||
#define sangomabc_clear_flag(p,flag) do { \
|
||||
((p)->flags &= ~(flag)); \
|
||||
} while (0)
|
||||
|
||||
#define sangomabc_copy_flags(dest,src,flagz) do { \
|
||||
(dest)->flags &= ~(flagz); \
|
||||
(dest)->flags |= ((src)->flags & (flagz)); \
|
||||
} while (0)
|
||||
|
||||
typedef t_sigboost_callstart sangomabc_event_t;
|
||||
typedef t_sigboost_short sangomabc_short_event_t;
|
||||
typedef uint32_t sangomabc_event_id_t;
|
||||
|
||||
typedef struct sangomabc_ip_cfg
|
||||
{
|
||||
char local_ip[25];
|
||||
int local_port;
|
||||
char remote_ip[25];
|
||||
int remote_port;
|
||||
}sangomabc_ip_cfg_t;
|
||||
|
||||
typedef enum {
|
||||
MSU_FLAG_EVENT = (1 << 0),
|
||||
MSU_FLAG_DOWN = (1 << 1)
|
||||
} sangomabc_flag_t;
|
||||
|
||||
|
||||
struct sangomabc_connection {
|
||||
ftdm_socket_t socket;
|
||||
struct sockaddr_in local_addr;
|
||||
struct sockaddr_in remote_addr;
|
||||
sangomabc_event_t event;
|
||||
struct hostent remote_hp;
|
||||
struct hostent local_hp;
|
||||
unsigned int flags;
|
||||
ftdm_mutex_t *mutex;
|
||||
FILE *log;
|
||||
unsigned int txseq;
|
||||
unsigned int rxseq;
|
||||
unsigned int txwindow;
|
||||
unsigned int rxseq_reset;
|
||||
sangomabc_ip_cfg_t cfg;
|
||||
/* boost signaling mod interface pointer (if not working in TCP mode) */
|
||||
boost_sigmod_interface_t *sigmod;
|
||||
ftdm_queue_t *boost_queue;
|
||||
ftdm_interrupt_t *sock_interrupt;
|
||||
ftdm_span_t *span;
|
||||
int debuglevel;
|
||||
};
|
||||
|
||||
typedef struct sangomabc_connection sangomabc_connection_t;
|
||||
|
||||
typedef struct sangomabc_queue_element {
|
||||
unsigned char boostmsg[sizeof(sangomabc_event_t)];
|
||||
ftdm_size_t size;
|
||||
} sangomabc_queue_element_t;
|
||||
|
||||
/* disable nagle's algorythm */
|
||||
static __inline__ void sctp_no_nagle(int socket)
|
||||
{
|
||||
#ifdef HAVE_NETINET_SCTP_H
|
||||
int flag = 1;
|
||||
setsockopt(socket, IPPROTO_SCTP, SCTP_NODELAY, (char *) &flag, sizeof(int));
|
||||
#endif
|
||||
}
|
||||
|
||||
int sangomabc_connection_close(sangomabc_connection_t *mcon);
|
||||
int sangomabc_connection_open(sangomabc_connection_t *mcon, char *local_ip, int local_port, char *ip, int port);
|
||||
sangomabc_event_t *__sangomabc_connection_read(sangomabc_connection_t *mcon, int iteration, const char *file, const char *func, int line);
|
||||
sangomabc_event_t *__sangomabc_connection_readp(sangomabc_connection_t *mcon, int iteration, const char *file, const char *func, int line);
|
||||
int __sangomabc_connection_write(sangomabc_connection_t *mcon, sangomabc_event_t *event, const char *file, const char *func, int line);
|
||||
int __sangomabc_connection_writep(sangomabc_connection_t *mcon, sangomabc_event_t *event, const char *file, const char *func, int line);
|
||||
#define sangomabc_connection_write(_m,_e) __sangomabc_connection_write(_m, _e, __FILE__, __FUNCTION__, __LINE__)
|
||||
#define sangomabc_connection_writep(_m,_e) __sangomabc_connection_writep(_m, _e, __FILE__, __FUNCTION__, __LINE__)
|
||||
#define sangomabc_connection_read(_m,_e) __sangomabc_connection_read(_m, _e, __FILE__, __FUNCTION__, __LINE__)
|
||||
#define sangomabc_connection_readp(_m,_e) __sangomabc_connection_readp(_m, _e, __FILE__, __FUNCTION__, __LINE__)
|
||||
void sangomabc_event_init(sangomabc_short_event_t *event, sangomabc_event_id_t event_id, int chan, int span);
|
||||
void sangomabc_call_init(sangomabc_event_t *event, const char *calling, const char *called, int setup_id);
|
||||
const char *sangomabc_event_id_name(uint32_t event_id);
|
||||
int sangomabc_exec_command(sangomabc_connection_t *mcon, int span, int chan, int id, int cmd, int cause, int flags);
|
||||
int sangomabc_exec_commandp(sangomabc_connection_t *pcon, int span, int chan, int id, int cmd, int cause);
|
||||
|
||||
#define BOOST_EVENT_SPAN(sigmod, event) ((sigmod) ? event->span : event->span + 1)
|
||||
#define BOOST_EVENT_CHAN(sigmod, event) ((sigmod) ? event->chan : event->chan + 1)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
@@ -1,254 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2009, Sangoma Technologies
|
||||
* Moises Silva <moy@sangoma.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef SANGOMA_BOOST_INTERFACE_H
|
||||
#define SANGOMA_BOOST_INTERFACE_H
|
||||
|
||||
#include "private/ftdm_core.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*!
|
||||
\brief Callback used to notify signaling status changes on a channel
|
||||
\param ftdmchan The freetdm channel where the signaling status just changed
|
||||
\param status The new signaling status
|
||||
*/
|
||||
#define BOOST_SIG_STATUS_CB_ARGS (ftdm_channel_t *ftdmchan, ftdm_signaling_status_t status)
|
||||
typedef void (*boost_sig_status_cb_func_t) BOOST_SIG_STATUS_CB_ARGS;
|
||||
#define BOOST_SIG_STATUS_CB_FUNCTION(name) void name BOOST_SIG_STATUS_CB_ARGS
|
||||
|
||||
/*!
|
||||
\brief Write a boost msg to a boost endpoint
|
||||
\param span The freetdm span where this msg was generated
|
||||
\param msg The generic message pointer, owned by the caller
|
||||
\param msglen The length of the provided structure pointed by msg
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
|
||||
The msg buffer is owned by the caller and it should
|
||||
be either t_sigboost_callstart or t_sigboost_short
|
||||
the endpoint receiving the msg will first cast to
|
||||
t_sigboost_short, check the event type, and if needed.
|
||||
*/
|
||||
#define BOOST_WRITE_MSG_ARGS (ftdm_span_t *span, void *msg, ftdm_size_t msglen)
|
||||
typedef ftdm_status_t (*boost_write_msg_func_t) BOOST_WRITE_MSG_ARGS;
|
||||
#define BOOST_WRITE_MSG_FUNCTION(name) ftdm_status_t name BOOST_WRITE_MSG_ARGS
|
||||
|
||||
/*!
|
||||
\brief Set the callback to be used by a signaling module to write boost messages
|
||||
\param callback The callback to be used by the signaling module
|
||||
|
||||
The provided callback will be used for the signaling boost module to notify the
|
||||
user with boost messages.
|
||||
*/
|
||||
#define BOOST_SET_WRITE_MSG_CB_ARGS (boost_write_msg_func_t callback)
|
||||
typedef void (*boost_set_write_msg_cb_func_t) BOOST_SET_WRITE_MSG_CB_ARGS;
|
||||
#define BOOST_SET_WRITE_MSG_CB_FUNCTION(name) void name BOOST_SET_WRITE_MSG_CB_ARGS
|
||||
|
||||
/*!
|
||||
\brief Notify hardware status change
|
||||
\param ftdmchan The freetdm channel
|
||||
\param status The hw status
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_ON_HW_LINK_STATUS_CHANGE_ARGS (ftdm_channel_t *ftdmchan, ftdm_channel_hw_link_status_t status)
|
||||
typedef void (*boost_on_hw_link_status_change_func_t) BOOST_ON_HW_LINK_STATUS_CHANGE_ARGS;
|
||||
#define BOOST_ON_HW_LINK_STATUS_CHANGE_FUNCTION(name) void name BOOST_ON_HW_LINK_STATUS_CHANGE_ARGS
|
||||
|
||||
/*!
|
||||
\brief Set signaling status callback used by the signaling module to report signaling status changes
|
||||
\param callback The callback to be used by the signaling module
|
||||
|
||||
The provided callback will be used for the signaling boost module to notify the
|
||||
user with signaling link status changes.
|
||||
*/
|
||||
#define BOOST_SET_SIG_STATUS_CB_ARGS (boost_sig_status_cb_func_t callback)
|
||||
typedef void (*boost_set_sig_status_cb_func_t) BOOST_SET_SIG_STATUS_CB_ARGS;
|
||||
#define BOOST_SET_SIG_STATUS_CB_FUNCTION(name) void name BOOST_SET_SIG_STATUS_CB_ARGS
|
||||
|
||||
/*!
|
||||
\brief Get the signaling status on the given channel.
|
||||
\param ftdmchan The freetdm channel
|
||||
\param status The status pointer where the current signaling status will be set
|
||||
*/
|
||||
#define BOOST_GET_CHANNEL_SIG_STATUS_ARGS (ftdm_channel_t *ftdmchan, ftdm_signaling_status_t *status)
|
||||
typedef ftdm_status_t (*boost_get_channel_sig_status_func_t) BOOST_GET_CHANNEL_SIG_STATUS_ARGS;
|
||||
#define BOOST_GET_CHANNEL_SIG_STATUS_FUNCTION(name) ftdm_status_t name BOOST_GET_CHANNEL_SIG_STATUS_ARGS
|
||||
|
||||
/*!
|
||||
\brief Set the signaling status on the given channel.
|
||||
\param ftdmchan The freetdm channel
|
||||
\param status The new status for the channel
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_SET_CHANNEL_SIG_STATUS_ARGS (ftdm_channel_t *ftdmchan, ftdm_signaling_status_t status)
|
||||
typedef ftdm_status_t (*boost_set_channel_sig_status_func_t) BOOST_SET_CHANNEL_SIG_STATUS_ARGS;
|
||||
#define BOOST_SET_CHANNEL_SIG_STATUS_FUNCTION(name) ftdm_status_t name BOOST_SET_CHANNEL_SIG_STATUS_ARGS
|
||||
|
||||
/*!
|
||||
\brief Get the signaling status on the given span.
|
||||
\param span The freetdm span
|
||||
\param status The status pointer where the current signaling status will be set
|
||||
*/
|
||||
#define BOOST_GET_SPAN_SIG_STATUS_ARGS (ftdm_span_t *span, ftdm_signaling_status_t *status)
|
||||
typedef ftdm_status_t (*boost_get_span_sig_status_func_t) BOOST_GET_SPAN_SIG_STATUS_ARGS;
|
||||
#define BOOST_GET_SPAN_SIG_STATUS_FUNCTION(name) ftdm_status_t name BOOST_GET_SPAN_SIG_STATUS_ARGS
|
||||
|
||||
/*!
|
||||
\brief Set the signaling status on the given span.
|
||||
\param ftdmchan The freetdm span
|
||||
\param status The new status for the span
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_SET_SPAN_SIG_STATUS_ARGS (ftdm_span_t *span, ftdm_signaling_status_t status)
|
||||
typedef ftdm_status_t (*boost_set_span_sig_status_func_t) BOOST_SET_SPAN_SIG_STATUS_ARGS;
|
||||
#define BOOST_SET_SPAN_SIG_STATUS_FUNCTION(name) ftdm_status_t name BOOST_SET_SPAN_SIG_STATUS_ARGS
|
||||
|
||||
/*!
|
||||
\brief Configure the given span signaling
|
||||
\param span The freetdm span
|
||||
\param parameters The array of configuration key,value pairs (must be null terminated)
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_CONFIGURE_SPAN_ARGS (ftdm_span_t *span, ftdm_conf_parameter_t *parameters)
|
||||
typedef ftdm_status_t (*boost_configure_span_func_t) BOOST_CONFIGURE_SPAN_ARGS;
|
||||
#define BOOST_CONFIGURE_SPAN_FUNCTION(name) ftdm_status_t name BOOST_CONFIGURE_SPAN_ARGS
|
||||
|
||||
/*!
|
||||
\brief Start the given span
|
||||
\param span The freetdm span
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_START_SPAN_ARGS (ftdm_span_t *span)
|
||||
typedef ftdm_status_t (*boost_start_span_func_t) BOOST_START_SPAN_ARGS;
|
||||
#define BOOST_START_SPAN_FUNCTION(name) ftdm_status_t name BOOST_START_SPAN_ARGS
|
||||
|
||||
/*!
|
||||
\brief Stop the given span
|
||||
\param span The freetdm span
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_STOP_SPAN_ARGS (ftdm_span_t *span)
|
||||
typedef ftdm_status_t (*boost_stop_span_func_t) BOOST_START_SPAN_ARGS;
|
||||
#define BOOST_STOP_SPAN_FUNCTION(name) ftdm_status_t name BOOST_STOP_SPAN_ARGS
|
||||
|
||||
/*!
|
||||
\brief Called when the module is being loaded BEFORE calling anything else
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_ON_LOAD_ARGS (void)
|
||||
typedef ftdm_status_t (*boost_on_load_func_t) BOOST_ON_LOAD_ARGS;
|
||||
#define BOOST_ON_LOAD_FUNCTION(name) ftdm_status_t name BOOST_ON_LOAD_ARGS
|
||||
|
||||
/*!
|
||||
\brief Called when the module is being unloaded, last chance to stop everything!
|
||||
*/
|
||||
#define BOOST_ON_UNLOAD_ARGS (void)
|
||||
typedef ftdm_status_t (*boost_on_unload_func_t) BOOST_ON_UNLOAD_ARGS;
|
||||
#define BOOST_ON_UNLOAD_FUNCTION(name) ftdm_status_t name BOOST_ON_UNLOAD_ARGS
|
||||
|
||||
/*!
|
||||
\brief Called when user wants to execute sigmod api function
|
||||
\return FTDM_SUCCESS or FTDM_FAIL
|
||||
*/
|
||||
#define BOOST_API_ARGS (ftdm_stream_handle_t *stream, char *cmd)
|
||||
typedef ftdm_status_t (*boost_api_func_t) BOOST_API_ARGS;
|
||||
#define BOOST_API_FUNCTION(name) ftdm_status_t name BOOST_API_ARGS
|
||||
|
||||
|
||||
/*!
|
||||
\brief The boost signaling module interface
|
||||
*/
|
||||
typedef struct boost_sigmod_interface_s {
|
||||
/*! \brief Module name */
|
||||
const char *name;
|
||||
/*! \brief write boost message function */
|
||||
boost_write_msg_func_t write_msg;
|
||||
/*! \brief set the user write boost message function */
|
||||
boost_set_write_msg_cb_func_t set_write_msg_cb;
|
||||
/*! \brief set the user signaling status function */
|
||||
boost_set_sig_status_cb_func_t set_sig_status_cb;
|
||||
/*! \brief get channel signaling status */
|
||||
boost_get_channel_sig_status_func_t get_channel_sig_status;
|
||||
/*! \brief set channel signaling status */
|
||||
boost_set_channel_sig_status_func_t set_channel_sig_status;
|
||||
/*! \brief get span signaling status */
|
||||
boost_get_span_sig_status_func_t get_span_sig_status;
|
||||
/*! \brief set span signaling status */
|
||||
boost_set_span_sig_status_func_t set_span_sig_status;
|
||||
/*! \brief set notify hardware link status change */
|
||||
boost_on_hw_link_status_change_func_t on_hw_link_status_change;
|
||||
/*! \brief configure span signaling */
|
||||
boost_configure_span_func_t configure_span;
|
||||
/*! \brief start freetdm span */
|
||||
boost_start_span_func_t start_span;
|
||||
/*! \brief stop freetdm span */
|
||||
boost_stop_span_func_t stop_span;
|
||||
/*! \brief the module was just loaded */
|
||||
boost_on_load_func_t on_load;
|
||||
/*! \brief the module is about to be unloaded */
|
||||
boost_on_unload_func_t on_unload;
|
||||
/*! \brief module api function */
|
||||
boost_api_func_t exec_api;
|
||||
/*! \brief private pointer for the interface user */
|
||||
void *pvt;
|
||||
} boost_sigmod_interface_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern C
|
||||
#endif
|
||||
|
||||
#define BOOST_INTERFACE_NAME boost_sigmod_interface
|
||||
#define BOOST_INTERFACE_NAME_STR "boost_sigmod_interface"
|
||||
/* use this in your sig boost module to declare your interface */
|
||||
#ifndef WIN32
|
||||
#define BOOST_INTERFACE boost_sigmod_interface_t BOOST_INTERFACE_NAME
|
||||
#else
|
||||
#define BOOST_INTERFACE __declspec(dllexport) boost_sigmod_interface_t BOOST_INTERFACE_NAME
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
|
||||
@@ -1,221 +0,0 @@
|
||||
/****************************************************************************
|
||||
* sigboost.h $Revision: 1.13 $
|
||||
*
|
||||
* Definitions for the sigboost interface.
|
||||
*
|
||||
* WARNING WARNING WARNING
|
||||
*
|
||||
* This file is used by sangoma_mgd and perhaps other programs. Any changes
|
||||
* to this file must be coordinated with other user programs,
|
||||
*
|
||||
* Copyright (C) 2005 Xygnada Technology, Inc.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef _SIGBOOST_H_
|
||||
#define _SIGBOOST_H_
|
||||
|
||||
#define SIGBOOST_VERSION 103
|
||||
|
||||
// handy to define integer types that actually work on both Lin and Win
|
||||
#include <freetdm.h>
|
||||
|
||||
enum e_sigboost_event_id_values
|
||||
{
|
||||
SIGBOOST_EVENT_CALL_START = 0x80, /*128*/
|
||||
SIGBOOST_EVENT_CALL_START_ACK = 0x81, /*129*/
|
||||
SIGBOOST_EVENT_CALL_START_NACK = 0x82, /*130*/
|
||||
SIGBOOST_EVENT_CALL_START_NACK_ACK = 0x83, /*131*/
|
||||
SIGBOOST_EVENT_CALL_ANSWERED = 0x84, /*132*/
|
||||
SIGBOOST_EVENT_CALL_STOPPED = 0x85, /*133*/
|
||||
SIGBOOST_EVENT_CALL_STOPPED_ACK = 0x86, /*134*/
|
||||
SIGBOOST_EVENT_SYSTEM_RESTART = 0x87, /*135*/
|
||||
SIGBOOST_EVENT_SYSTEM_RESTART_ACK = 0x88, /*136*/
|
||||
/* CALL_RELEASED is aimed to fix a race condition that became obvious
|
||||
* when the boost socket was replaced by direct function calls
|
||||
* and the channel hunting was moved to freetdm, the problem is
|
||||
* we can get CALL_STOPPED msg and reply with CALL_STOPPED_ACK
|
||||
* but the signaling module will still (in PRI) send RELEASE and
|
||||
* wait for RELEASE_COMPLETE from the isdn network before
|
||||
* marking the channel as available, therefore freetdm should
|
||||
* also not mark the channel as available until CALL_RELEASED
|
||||
* is received, for socket mode we can continue working as usual
|
||||
* with CALL_STOPPED being the last step because the hunting is
|
||||
* done in the signaling module.
|
||||
* */
|
||||
SIGBOOST_EVENT_CALL_RELEASED = 0x51, /* 81 */
|
||||
SIGBOOST_EVENT_CALL_PROGRESS = 0x50, /*decimal 80*/
|
||||
/* Following IDs are ss7boost to sangoma_mgd only. */
|
||||
SIGBOOST_EVENT_HEARTBEAT = 0x89, /*137*/
|
||||
SIGBOOST_EVENT_INSERT_CHECK_LOOP = 0x8a, /*138*/
|
||||
SIGBOOST_EVENT_REMOVE_CHECK_LOOP = 0x8b, /*139*/
|
||||
SIGBOOST_EVENT_AUTO_CALL_GAP_ABATE = 0x8c, /*140*/
|
||||
SIGBOOST_EVENT_DIGIT_IN = 0x8d, /*141*/
|
||||
};
|
||||
|
||||
#define BOOST_DECODE_EVENT_ID(id) \
|
||||
(id==SIGBOOST_EVENT_CALL_START)?"SIGBOOST_EVENT_CALL_START": \
|
||||
(id==SIGBOOST_EVENT_CALL_START_ACK)?"SIGBOOST_EVENT_CALL_START_ACK": \
|
||||
(id==SIGBOOST_EVENT_CALL_START_NACK)?"SIGBOOST_EVENT_CALL_START_NACK": \
|
||||
(id==SIGBOOST_EVENT_CALL_ANSWERED)?"SIGBOOST_EVENT_CALL_ANSWERED": \
|
||||
(id==SIGBOOST_EVENT_CALL_STOPPED)?"SIGBOOST_EVENT_CALL_STOPPED": \
|
||||
(id==SIGBOOST_EVENT_CALL_STOPPED_ACK)?"SIGBOOST_EVENT_CALL_STOPPED_ACK": \
|
||||
(id==SIGBOOST_EVENT_SYSTEM_RESTART)?"SIGBOOST_EVENT_SYSTEM_RESTART": \
|
||||
(id==SIGBOOST_EVENT_SYSTEM_RESTART_ACK)?"SIGBOOST_EVENT_SYSTEM_RESTART_ACK": \
|
||||
(id==SIGBOOST_EVENT_CALL_RELEASED)?"SIGBOOST_EVENT_CALL_RELEASED": \
|
||||
(id==SIGBOOST_EVENT_CALL_PROGRESS)?"SIGBOOST_EVENT_CALL_PROGRESS": \
|
||||
(id==SIGBOOST_EVENT_HEARTBEAT)?"SIGBOOST_EVENT_HEARTBEAT": \
|
||||
(id==SIGBOOST_EVENT_INSERT_CHECK_LOOP)?"SIGBOOST_EVENT_INSERT_CHECK_LOOP": \
|
||||
(id==SIGBOOST_EVENT_REMOVE_CHECK_LOOP)?"SIGBOOST_EVENT_REMOVE_CHECK_LOOP": \
|
||||
(id==SIGBOOST_EVENT_AUTO_CALL_GAP_ABATE)?"SIGBOOST_EVENT_AUTO_CALL_GAP_ABATE": \
|
||||
(id==SIGBOOST_EVENT_DIGIT_IN)?"SIGBOOST_EVENT_DIGIT_IN": "Unknown"
|
||||
|
||||
enum e_sigboost_release_cause_values
|
||||
{
|
||||
SIGBOOST_RELEASE_CAUSE_UNDEFINED = 0,
|
||||
SIGBOOST_RELEASE_CAUSE_NORMAL = 16,
|
||||
/* probable elimination */
|
||||
//SIGBOOST_RELEASE_CAUSE_BUSY = 0x91, /* 145 */
|
||||
//SIGBOOST_RELEASE_CAUSE_CALLED_NOT_EXIST = 0x92, /* 146 */
|
||||
//SIGBOOST_RELEASE_CAUSE_CIRCUIT_RESET = 0x93, /* 147 */
|
||||
//SIGBOOST_RELEASE_CAUSE_NOANSWER = 0x94, /* 148 */
|
||||
};
|
||||
|
||||
enum e_sigboost_call_setup_ack_nack_cause_values
|
||||
{
|
||||
//SIGBOOST_CALL_SETUP_NACK_ALL_CKTS_BUSY = 34, /* Q.850 value - don't use */
|
||||
SIGBOOST_CALL_SETUP_NACK_ALL_CKTS_BUSY = 117, /* non Q.850 value indicates local all ckt busy
|
||||
causing sangoma_mgd to perform automatic call
|
||||
gapping*/
|
||||
SIGBOOST_CALL_SETUP_NACK_TEST_CKT_BUSY = 17, /* Q.850 value */
|
||||
SIGBOOST_CALL_SETUP_NACK_INVALID_NUMBER = 28, /* Q.850 value */
|
||||
SIGBOOST_CALL_SETUP_CSUPID_DBL_USE = 200, /* unused Q.850 value */
|
||||
};
|
||||
|
||||
|
||||
enum e_sigboost_huntgroup_values
|
||||
{
|
||||
SIGBOOST_HUNTGRP_SEQ_ASC = 0x00, /* sequential with lowest available first */
|
||||
SIGBOOST_HUNTGRP_SEQ_DESC = 0x01, /* sequential with highest available first */
|
||||
SIGBOOST_HUNTGRP_RR_ASC = 0x02, /* round-robin with lowest available first */
|
||||
SIGBOOST_HUNTGRP_RR_DESC = 0x03, /* round-robin with highest available first */
|
||||
};
|
||||
|
||||
enum e_sigboost_event_info_par_values
|
||||
{
|
||||
SIGBOOST_EVI_SPARE = 0x00,
|
||||
SIGBOOST_EVI_ALERTING = 0x01,
|
||||
SIGBOOST_EVI_PROGRESS = 0x02,
|
||||
};
|
||||
|
||||
enum e_sigboost_progress_flags
|
||||
{
|
||||
SIGBOOST_PROGRESS_RING = (1 << 0),
|
||||
SIGBOOST_PROGRESS_MEDIA = (1 << 1)
|
||||
};
|
||||
|
||||
#define MAX_DIALED_DIGITS 31
|
||||
|
||||
/* Next two defines are used to create the range of values for call_setup_id
|
||||
* in the t_sigboost structure.
|
||||
* 0..((CORE_MAX_SPANS * CORE_MAX_CHAN_PER_SPAN) - 1) */
|
||||
#define CORE_MAX_SPANS 200
|
||||
#define CORE_MAX_CHAN_PER_SPAN 32
|
||||
#define MAX_PENDING_CALLS CORE_MAX_SPANS * CORE_MAX_CHAN_PER_SPAN
|
||||
/* 0..(MAX_PENDING_CALLS-1) is range of call_setup_id below */
|
||||
|
||||
/* Should only be used by server */
|
||||
#define MAX_CALL_SETUP_ID 0xFFFF
|
||||
|
||||
#define SIZE_CUSTOM 900
|
||||
#define SIZE_RDNIS SIZE_CUSTOM
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t capability;
|
||||
uint8_t uil1p;
|
||||
} t_sigboost_bearer;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t digits_count;
|
||||
char digits [MAX_DIALED_DIGITS + 1]; /* it's a null terminated string */
|
||||
uint8_t npi;
|
||||
uint8_t ton;
|
||||
uint8_t screening_ind;
|
||||
uint8_t presentation_ind;
|
||||
}t_sigboost_digits;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t version;
|
||||
uint32_t event_id;
|
||||
/* delete sequence numbers - SCTP does not need them */
|
||||
uint32_t fseqno;
|
||||
uint32_t bseqno;
|
||||
uint16_t call_setup_id;
|
||||
uint32_t trunk_group;
|
||||
uint8_t span;
|
||||
uint8_t chan;
|
||||
uint32_t flags;
|
||||
/* struct timeval tv; */
|
||||
t_sigboost_digits called;
|
||||
t_sigboost_digits calling;
|
||||
t_sigboost_digits rdnis;
|
||||
/* ref. Q.931 Table 4-11 and Q.951 Section 3 */
|
||||
char calling_name[MAX_DIALED_DIGITS + 1];
|
||||
t_sigboost_bearer bearer;
|
||||
uint8_t hunt_group;
|
||||
uint16_t custom_data_size;
|
||||
char custom_data[SIZE_CUSTOM]; /* it's a null terminated string */
|
||||
|
||||
} t_sigboost_callstart;
|
||||
|
||||
#define called_number_digits_count called.digits_count
|
||||
#define called_number_digits called.digits
|
||||
#define calling_number_digits_count calling.digits_count
|
||||
#define calling_number_digits calling.digits
|
||||
#define calling_number_screening_ind calling.screening_ind
|
||||
#define calling_number_presentation calling.presentation_ind
|
||||
|
||||
#define isup_in_rdnis_size custom_data_size
|
||||
#define isup_in_rdnis custom_data
|
||||
|
||||
|
||||
#define MIN_SIZE_CALLSTART_MSG sizeof(t_sigboost_callstart) - SIZE_CUSTOM
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t version;
|
||||
uint32_t event_id;
|
||||
/* delete sequence numbers - SCTP does not need them */
|
||||
uint32_t fseqno;
|
||||
uint32_t bseqno;
|
||||
uint16_t call_setup_id;
|
||||
uint32_t trunk_group;
|
||||
uint8_t span;
|
||||
uint8_t chan;
|
||||
uint32_t flags;
|
||||
/* struct timeval tv; */
|
||||
uint8_t release_cause;
|
||||
} t_sigboost_short;
|
||||
#pragma pack()
|
||||
|
||||
|
||||
static __inline__ int boost_full_event(int event_id)
|
||||
{
|
||||
switch (event_id) {
|
||||
case SIGBOOST_EVENT_CALL_START:
|
||||
case SIGBOOST_EVENT_DIGIT_IN:
|
||||
case SIGBOOST_EVENT_CALL_PROGRESS:
|
||||
return 1;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -683,8 +683,8 @@ static ftdm_status_t ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdm
|
||||
if (!sngisdn_test_flag(sngisdn_info, FLAG_SENT_PROCEED)) {
|
||||
/* By default, we do not send a progress indicator in the proceed */
|
||||
ftdm_sngisdn_progind_t prog_ind = {SNGISDN_PROGIND_LOC_USER, SNGISDN_PROGIND_DESCR_INVALID};
|
||||
|
||||
sngisdn_set_flag(sngisdn_info, FLAG_SENT_PROCEED);
|
||||
|
||||
sngisdn_snd_proceed(ftdmchan, prog_ind);
|
||||
}
|
||||
}
|
||||
@@ -800,6 +800,17 @@ static ftdm_status_t ftdm_sangoma_isdn_process_state_change(ftdm_channel_t *ftdm
|
||||
/* If we never received a PROCEED/ALERT/PROGRESS/CONNECT on an outgoing call, we need to send release instead of disconnect */
|
||||
sngisdn_snd_release(ftdmchan, 0);
|
||||
break;
|
||||
case FTDM_CHANNEL_STATE_PROCEED:
|
||||
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND)) {
|
||||
if (((sngisdn_span_data_t*)(ftdmchan->span->signal_data))->switchtype == SNGISDN_SWITCH_4ESS ||
|
||||
((sngisdn_span_data_t*)(ftdmchan->span->signal_data))->switchtype == SNGISDN_SWITCH_5ESS) {
|
||||
|
||||
/* When using 5ESS, if the user wants to clear an inbound call, the correct procedure is to send a PROGRESS with in-band info available, and play tones. Then send a DISCONNECT. If we reached this point, it means user did not try to play-tones, so send a RELEASE because remote side does not expect DISCONNECT in state 3 */
|
||||
sngisdn_snd_release(ftdmchan, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* fall-through */
|
||||
default:
|
||||
sngisdn_snd_disconnect(ftdmchan);
|
||||
break;
|
||||
@@ -901,9 +912,6 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_isdn_outgoing_call)
|
||||
sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data;
|
||||
ftdm_status_t status = FTDM_FAIL;
|
||||
|
||||
/* lock the channel while we check whether it is availble */
|
||||
ftdm_channel_lock(ftdmchan);
|
||||
|
||||
switch (ftdmchan->state) {
|
||||
|
||||
case FTDM_CHANNEL_STATE_DOWN:
|
||||
@@ -928,10 +936,9 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_isdn_outgoing_call)
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Outgoing call requested channel in already in use\n");
|
||||
status = FTDM_BREAK;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
ftdm_channel_unlock(ftdmchan);
|
||||
return status;
|
||||
}
|
||||
static FIO_CHANNEL_GET_SIG_STATUS_FUNCTION(ftdm_sangoma_isdn_get_chan_sig_status)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -385,8 +385,12 @@ void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event)
|
||||
case FTDM_CHANNEL_STATE_DIALING:
|
||||
case FTDM_CHANNEL_STATE_PROCEED:
|
||||
case FTDM_CHANNEL_STATE_PROGRESS:
|
||||
case FTDM_CHANNEL_STATE_RINGING:
|
||||
if (cnStEvnt->progInd.eh.pres && cnStEvnt->progInd.progDesc.val == IN_PD_IBAVAIL) {
|
||||
case FTDM_CHANNEL_STATE_RINGING:
|
||||
if ((cnStEvnt->progInd.eh.pres && cnStEvnt->progInd.progDesc.val == IN_PD_IBAVAIL) ||
|
||||
(cnStEvnt->progInd1.eh.pres && cnStEvnt->progInd1.progDesc.val == IN_PD_IBAVAIL) ||
|
||||
(cnStEvnt->progInd2.eh.pres && cnStEvnt->progInd2.progDesc.val == IN_PD_IBAVAIL) ||
|
||||
(cnStEvnt->progInd3.eh.pres && cnStEvnt->progInd3.progDesc.val == IN_PD_IBAVAIL)) {
|
||||
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Early media available\n");
|
||||
sngisdn_set_flag(sngisdn_info, FLAG_MEDIA_READY);
|
||||
} else {
|
||||
|
||||
@@ -241,6 +241,11 @@ void sngisdn_trace_raw_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t d
|
||||
sigev.span_id = ftdmchan->physical_span_id;
|
||||
sigev.chan_id = ftdmchan->physical_chan_id;
|
||||
sigev.channel = ftdmchan;
|
||||
} else {
|
||||
/* We could not map the channel, but at least set the span */
|
||||
if (signal_data->ftdm_span->channels[1]) {
|
||||
sigev.span_id = signal_data->ftdm_span->channels[1]->physical_span_id;
|
||||
}
|
||||
}
|
||||
sigev.event_id = FTDM_SIGEVENT_TRACE_RAW;
|
||||
|
||||
@@ -833,9 +838,10 @@ static ftdm_status_t sngisdn_get_frame_info(uint8_t *data, uint32_t data_len, ft
|
||||
//ftdm_log(FTDM_LOG_DEBUG, "Decoded IE:%s\n", get_code_2_str(ie_id, dcodQ931IEIDTable));
|
||||
}
|
||||
if (!bchan_no) {
|
||||
uint32_t tmp_len = 0;
|
||||
char tmp[1000];
|
||||
print_hex_dump(tmp, 0, data, 0, data_len);
|
||||
ftdm_log(FTDM_LOG_WARNING, "Failed to determine b-channel on SETUP message\n%s\n", tmp);
|
||||
print_hex_dump(tmp, &tmp_len, data, 0, data_len);
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Failed to determine b-channel on SETUP message\n%s\n", tmp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
int ft_to_sngss7_cfg_all(void);
|
||||
|
||||
int ftmod_ss7_relay_gen_config(void);
|
||||
int ftmod_ss7_mtp1_gen_config(void);
|
||||
int ftmod_ss7_mtp2_gen_config(void);
|
||||
int ftmod_ss7_mtp3_gen_config(void);
|
||||
@@ -65,68 +66,170 @@ int ftmod_ss7_isup_ckt_config(int id);
|
||||
int ftmod_ss7_isup_isap_config(int id);
|
||||
|
||||
int ftmod_ss7_cc_isap_config(int id);
|
||||
|
||||
int ftmod_ss7_relay_chan_config(int id);
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
int ft_to_sngss7_cfg_all(void)
|
||||
{
|
||||
int x = 0;
|
||||
int ret = 0;
|
||||
|
||||
/* check if we have done gen_config already */
|
||||
if (!(g_ftdm_sngss7_data.gen_config)) {
|
||||
|
||||
/* start of by checking if the license and sig file are valid */
|
||||
if (sng_validate_license(g_ftdm_sngss7_data.cfg.license,
|
||||
g_ftdm_sngss7_data.cfg.signature,
|
||||
g_ftdm_sngss7_data.cfg.spc)) {
|
||||
g_ftdm_sngss7_data.cfg.signature)) {
|
||||
|
||||
SS7_CRITICAL("License verification failed..ending!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ftmod_ss7_mtp1_gen_config()) {
|
||||
SS7_CRITICAL("MTP1 General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP1 General configuration DONE\n");
|
||||
/* if the procId is not 0 then we are using relay mode */
|
||||
if (g_ftdm_sngss7_data.cfg.procId != 0) {
|
||||
/* set the desired procID value */
|
||||
sng_set_procId((uint16_t)g_ftdm_sngss7_data.cfg.procId);
|
||||
}
|
||||
|
||||
if (ftmod_ss7_mtp2_gen_config()) {
|
||||
SS7_CRITICAL("MTP2 General configuration FAILED!\n");
|
||||
/* start up the stack manager */
|
||||
if (sng_isup_init_sm()) {
|
||||
SS7_CRITICAL("Failed to start Stack Manager\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP2 General configuration DONE\n");
|
||||
SS7_INFO("Started Stack Manager!\n");
|
||||
sngss7_set_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM);
|
||||
}
|
||||
|
||||
if (ftmod_ss7_mtp3_gen_config()) {
|
||||
SS7_CRITICAL("MTP3 General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP3 General configuration DONE\n");
|
||||
}
|
||||
/* check if the configuration had a Relay Channel */
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) {
|
||||
/* start up the relay task */
|
||||
if (sng_isup_init_relay()) {
|
||||
SS7_CRITICAL("Failed to start Relay\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Started Relay!\n");
|
||||
}
|
||||
|
||||
if (ftmod_ss7_isup_gen_config()) {
|
||||
SS7_CRITICAL("ISUP General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("ISUP General configuration DONE\n");
|
||||
}
|
||||
/* run general configuration on the relay task */
|
||||
if (ftmod_ss7_relay_gen_config()) {
|
||||
SS7_CRITICAL("Relay General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Relay General configuration DONE\n");
|
||||
}
|
||||
|
||||
if (ftmod_ss7_cc_gen_config()) {
|
||||
SS7_CRITICAL("CC General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("CC General configuration DONE\n");
|
||||
}
|
||||
} /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) */
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) {
|
||||
if (sng_isup_init_cc()) {
|
||||
SS7_CRITICAL("Failed to start Call-Control\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Started Call-Control!\n");
|
||||
}
|
||||
if (ftmod_ss7_cc_gen_config()) {
|
||||
SS7_CRITICAL("CC General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("CC General configuration DONE\n");
|
||||
}
|
||||
if (ftmod_ss7_cc_isap_config(1)) {
|
||||
SS7_CRITICAL("CC ISAP configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("CC ISAP configuration DONE!\n");
|
||||
}
|
||||
} /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) */
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) {
|
||||
if (sng_isup_init_isup()) {
|
||||
SS7_CRITICAL("Failed to start ISUP\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Started ISUP!\n");
|
||||
}
|
||||
if (ftmod_ss7_isup_gen_config()) {
|
||||
SS7_CRITICAL("ISUP General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("ISUP General configuration DONE\n");
|
||||
}
|
||||
} /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) */
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) {
|
||||
if (sng_isup_init_mtp3()) {
|
||||
SS7_CRITICAL("Failed to start MTP3\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Started MTP3!\n");
|
||||
}
|
||||
|
||||
if (ftmod_ss7_mtp3_gen_config()) {
|
||||
SS7_CRITICAL("MTP3 General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP3 General configuration DONE\n");
|
||||
}
|
||||
} /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) */
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) {
|
||||
if (sng_isup_init_mtp2()) {
|
||||
SS7_CRITICAL("Failed to start MTP2\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Started MTP2!\n");
|
||||
}
|
||||
if (sng_isup_init_mtp1()) {
|
||||
SS7_CRITICAL("Failed to start MTP2\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Started MTP1!\n");
|
||||
}
|
||||
if (ftmod_ss7_mtp1_gen_config()) {
|
||||
SS7_CRITICAL("MTP1 General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP1 General configuration DONE\n");
|
||||
}
|
||||
if (ftmod_ss7_mtp2_gen_config()) {
|
||||
SS7_CRITICAL("MTP2 General configuration FAILED!\n");
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP2 General configuration DONE\n");
|
||||
}
|
||||
} /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) */
|
||||
|
||||
/* update the global gen_config so we don't do it again */
|
||||
g_ftdm_sngss7_data.gen_config = 1;
|
||||
}
|
||||
} /* if (!(g_ftdm_sngss7_data.gen_config)) */
|
||||
|
||||
/* go through all the relays channels and configure it */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.relay[x].id != 0) {
|
||||
/* check if this relay channel has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.relay[x].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
/* send the specific configuration */
|
||||
if (ftmod_ss7_relay_chan_config(x)) {
|
||||
SS7_CRITICAL("Relay Channel %d configuration FAILED!\n", x);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("Relay Channel %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.relay[x].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.relay[x].id != 0) */
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
while (x < (MAX_MTP_LINKS + 1)) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpLink[x].flags & CONFIGURED)) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtp1Link[x].flags & SNGSS7_CONFIGURED) &&
|
||||
(g_ftdm_sngss7_data.cfg.mtp1Link[x].id != 0)) {
|
||||
|
||||
/* configure mtp1 */
|
||||
if (ftmod_ss7_mtp1_psap_config(x)) {
|
||||
@@ -136,6 +239,18 @@ int ft_to_sngss7_cfg_all(void)
|
||||
SS7_INFO("MTP1 PSAP %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtp1Link[x].flags |= SNGSS7_CONFIGURED;
|
||||
}
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtp1Link[x].id != 0) */
|
||||
|
||||
x = 1;
|
||||
while (x < (MAX_MTP_LINKS + 1)) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtp2Link[x].flags & SNGSS7_CONFIGURED) &&
|
||||
(g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0)) {
|
||||
|
||||
/* configure mtp2 */
|
||||
if (ftmod_ss7_mtp2_dlsap_config(x)) {
|
||||
SS7_CRITICAL("MTP2 DLSAP %d configuration FAILED!\n",x);
|
||||
@@ -144,6 +259,18 @@ int ft_to_sngss7_cfg_all(void)
|
||||
SS7_INFO("MTP2 DLSAP %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtp2Link[x].flags |= SNGSS7_CONFIGURED;
|
||||
}
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) */
|
||||
|
||||
x = 1;
|
||||
while (x < (MAX_MTP_LINKS + 1)) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtp3Link[x].flags & SNGSS7_CONFIGURED) &&
|
||||
(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0)) {
|
||||
|
||||
/* configure mtp3 */
|
||||
if (ftmod_ss7_mtp3_dlsap_config(x)) {
|
||||
SS7_CRITICAL("MTP3 DLSAP %d configuration FAILED!\n", x);
|
||||
@@ -152,35 +279,37 @@ int ft_to_sngss7_cfg_all(void)
|
||||
SS7_INFO("MTP3 DLSAP %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpLink[x].flags |= CONFIGURED;
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[x].flags |= SNGSS7_CONFIGURED;
|
||||
}
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) */
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) */
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.nsap[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & CONFIGURED)) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_mtp3_nsap_config(x)) {
|
||||
SS7_CRITICAL("MTP3 NSAP %d configuration FAILED!\n", x);
|
||||
ret = ftmod_ss7_mtp3_nsap_config(x);
|
||||
if (ret) {
|
||||
SS7_CRITICAL("MTP3 NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret));
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("MTP3 NSAP %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
if (ftmod_ss7_isup_nsap_config(x)) {
|
||||
SS7_CRITICAL("ISUP NSAP %d configuration FAILED!\n", x);
|
||||
ret = ftmod_ss7_isup_nsap_config(x);
|
||||
if (ret) {
|
||||
SS7_CRITICAL("ISUP NSAP %d configuration FAILED!(%s)\n", x, DECODE_LCM_REASON(ret));
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("ISUP NSAP %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.nsap[x].flags |= CONFIGURED;
|
||||
} /* if !CONFIGURED */
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.nsap[x].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.nsap[x].id != 0) */
|
||||
@@ -188,7 +317,7 @@ int ft_to_sngss7_cfg_all(void)
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & CONFIGURED)) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_mtp3_linkset_config(x)) {
|
||||
SS7_CRITICAL("MTP3 LINKSET %d configuration FAILED!\n", x);
|
||||
@@ -197,9 +326,9 @@ int ft_to_sngss7_cfg_all(void)
|
||||
SS7_INFO("MTP3 LINKSET %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= CONFIGURED;
|
||||
} /* if !CONFIGURED */
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) */
|
||||
@@ -207,7 +336,7 @@ int ft_to_sngss7_cfg_all(void)
|
||||
x = 1;
|
||||
while ((g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0)) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpRoute[x].flags & CONFIGURED)) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpRoute[x].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_mtp3_route_config(x)) {
|
||||
SS7_CRITICAL("MTP3 ROUTE %d configuration FAILED!\n", x);
|
||||
@@ -216,31 +345,17 @@ int ft_to_sngss7_cfg_all(void)
|
||||
SS7_INFO("MTP3 ROUTE %d configuration DONE!\n",x);
|
||||
}
|
||||
|
||||
/* set the CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[x].flags |= CONFIGURED;
|
||||
} /* if !CONFIGURED */
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[x].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtpRoute[x].id != 0) */
|
||||
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpRoute[0].flags & 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 CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpRoute[0].flags |= CONFIGURED;
|
||||
} /* if !CONFIGURED */
|
||||
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isap[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.isap[x].flags & CONFIGURED)) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.isap[x].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_isup_isap_config(x)) {
|
||||
SS7_CRITICAL("ISUP ISAP %d configuration FAILED!\n", x);
|
||||
@@ -249,57 +364,51 @@ int ft_to_sngss7_cfg_all(void)
|
||||
SS7_INFO("ISUP ISAP %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
if (ftmod_ss7_cc_isap_config(x)) {
|
||||
SS7_CRITICAL("CC ISAP %d configuration FAILED!\n", x);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("CC ISAP %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.isap[x].flags |= CONFIGURED;
|
||||
} /* if !CONFIGURED */
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.isap[x].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isap[x].id != 0) */
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupIntf[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.isupIntf[x].flags & CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_isup_intf_config(x)) {
|
||||
SS7_CRITICAL("ISUP INTF %d configuration FAILED!\n", x);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("ISUP INTF %d configuration DONE!\n", x);
|
||||
/* set the interface to paused */
|
||||
sngss7_set_flag(&g_ftdm_sngss7_data.cfg.isupIntf[x], SNGSS7_PAUSED);
|
||||
}
|
||||
|
||||
/* set the CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.isupIntf[x].flags |= CONFIGURED;
|
||||
} /* if !CONFIGURED */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupIntf[x].id != 0) */
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.isupCkt[x].flags & CONFIGURED)) {
|
||||
if ( g_ftdm_sngss7_data.cfg.isupCkt[x].type == 0) {
|
||||
if (ftmod_ss7_isup_ckt_config(x)) {
|
||||
SS7_CRITICAL("ISUP CKT %d configuration FAILED!\n", x);
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) {
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupIntf[x].id != 0) {
|
||||
/* check if this link has been configured already */
|
||||
if (!(g_ftdm_sngss7_data.cfg.isupIntf[x].flags & SNGSS7_CONFIGURED)) {
|
||||
|
||||
if (ftmod_ss7_isup_intf_config(x)) {
|
||||
SS7_CRITICAL("ISUP INTF %d configuration FAILED!\n", x);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("ISUP CKT %d configuration DONE!\n", x);
|
||||
SS7_INFO("ISUP INTF %d configuration DONE!\n", x);
|
||||
/* set the interface to paused */
|
||||
sngss7_set_flag(&g_ftdm_sngss7_data.cfg.isupIntf[x], SNGSS7_PAUSED);
|
||||
}
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.isupIntf[x].flags |= SNGSS7_CONFIGURED;
|
||||
} /* if !SNGSS7_CONFIGURED */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupIntf[x].id != 0) */
|
||||
} /* if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) */
|
||||
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if ( g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
if (ftmod_ss7_isup_ckt_config(x)) {
|
||||
SS7_CRITICAL("ISUP CKT %d configuration FAILED!\n", x);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("ISUP CKT %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
/* set the CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].flags |= CONFIGURED;
|
||||
} /* if !CONFIGURED */
|
||||
} /* if ( g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) */
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].flags |= SNGSS7_CONFIGURED;
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
|
||||
@@ -307,6 +416,44 @@ int ft_to_sngss7_cfg_all(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_relay_gen_config(void)
|
||||
{
|
||||
RyMngmt cfg; /*configuration structure*/
|
||||
Pst pst; /*post structure*/
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTRY;
|
||||
|
||||
/* clear the configuration structure */
|
||||
memset(&cfg, 0x0, sizeof(RyMngmt));
|
||||
|
||||
/* fill in some general sections of the header */
|
||||
smHdrInit(&cfg.hdr);
|
||||
|
||||
/* fill in the post structure */
|
||||
smPstInit( &cfg.t.cfg.s.ryGenCfg.lmPst );
|
||||
|
||||
/*fill in the specific fields of the header */
|
||||
cfg.hdr.msgType = TCFG;
|
||||
cfg.hdr.entId.ent = ENTRY;
|
||||
cfg.hdr.entId.inst = S_INST;
|
||||
cfg.hdr.elmId.elmnt = STGEN;
|
||||
|
||||
cfg.t.cfg.s.ryGenCfg.lmPst.srcEnt = ENTRY;
|
||||
cfg.t.cfg.s.ryGenCfg.lmPst.dstEnt = ENTSM;
|
||||
|
||||
cfg.t.cfg.s.ryGenCfg.nmbChan = 10;
|
||||
cfg.t.cfg.s.ryGenCfg.tmrRes = RY_PERIOD;
|
||||
cfg.t.cfg.s.ryGenCfg.usta = 1;
|
||||
|
||||
|
||||
return(sng_cfg_relay(&pst, &cfg));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_mtp1_gen_config(void)
|
||||
{
|
||||
@@ -413,15 +560,13 @@ int ftmod_ss7_mtp3_gen_config(void)
|
||||
|
||||
|
||||
cfg.t.cfg.s.snGen.typeSP = LSN_TYPE_SP; /* type of signalling postatic int */
|
||||
cfg.t.cfg.s.snGen.spCode1 = g_ftdm_sngss7_data.cfg.spc; /* our DPC for CCITT version */
|
||||
|
||||
cfg.t.cfg.s.snGen.spCode1 = 0; /* our DPC for CCITT version */
|
||||
#if (SS7_ANS92 || SS7_ANS88 || SS7_ANS96 || SS7_CHINA || defined(TDS_ROLL_UPGRADE_SUPPORT))
|
||||
cfg.t.cfg.s.snGen.spCode2 = g_ftdm_sngss7_data.cfg.spc; /* our DPC for ANSI or CHINA version */
|
||||
cfg.t.cfg.s.snGen.spCode2 = 0; /* our DPC for ANSI or CHINA version */
|
||||
#endif
|
||||
|
||||
cfg.t.cfg.s.snGen.ssfValid = TRUE; /* ssf validation required */
|
||||
cfg.t.cfg.s.snGen.nmbDLSap = MAX_SN_LINKS; /* number of MTP Data Link SAPs */
|
||||
cfg.t.cfg.s.snGen.nmbNSap = MAX_SN_VARIANTS; /* number of Upper Layer Saps */
|
||||
cfg.t.cfg.s.snGen.nmbNSap = MAX_SN_ROUTES; /* number of Upper Layer Saps */
|
||||
cfg.t.cfg.s.snGen.nmbRouts = MAX_SN_ROUTES; /* maximum number of routing entries */
|
||||
cfg.t.cfg.s.snGen.nmbLnkSets = MAX_SN_LINKSETS; /* number of link sets */
|
||||
cfg.t.cfg.s.snGen.nmbRteInst = MAX_SN_ROUTES*16; /* number of simultaneous Rte instances */
|
||||
@@ -575,7 +720,7 @@ int ftmod_ss7_mtp1_psap_config(int id)
|
||||
{
|
||||
L1Mngmt cfg;
|
||||
Pst pst;
|
||||
sng_mtp_link_t *k = &g_ftdm_sngss7_data.cfg.mtpLink[id];
|
||||
sng_mtp1_link_t *k = &g_ftdm_sngss7_data.cfg.mtp1Link[id];
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
@@ -597,8 +742,8 @@ int ftmod_ss7_mtp1_psap_config(int id)
|
||||
|
||||
cfg.hdr.elmId.elmntInst1 = k->id;
|
||||
|
||||
cfg.t.cfg.s.l1PSAP.span = k->mtp1.span;
|
||||
cfg.t.cfg.s.l1PSAP.chan = k->mtp1.chan;
|
||||
cfg.t.cfg.s.l1PSAP.span = k->span;
|
||||
cfg.t.cfg.s.l1PSAP.chan = k->chan;
|
||||
cfg.t.cfg.s.l1PSAP.spId = k->id;
|
||||
|
||||
return(sng_cfg_mtp1(&pst, &cfg));
|
||||
@@ -609,7 +754,7 @@ int ftmod_ss7_mtp2_dlsap_config(int id)
|
||||
{
|
||||
SdMngmt cfg;
|
||||
Pst pst;
|
||||
sng_mtp_link_t *k = &g_ftdm_sngss7_data.cfg.mtpLink[id];
|
||||
sng_mtp2_link_t *k = &g_ftdm_sngss7_data.cfg.mtp2Link[id];
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit( &pst);
|
||||
@@ -633,10 +778,15 @@ int ftmod_ss7_mtp2_dlsap_config(int id)
|
||||
|
||||
cfg.t.cfg.s.sdDLSAP.mem.region = S_REG; /* memory region */
|
||||
cfg.t.cfg.s.sdDLSAP.mem.pool = S_POOL; /* memory pool */
|
||||
cfg.t.cfg.s.sdDLSAP.swtch = k->mtp2.linkType; /* protocol type */
|
||||
cfg.t.cfg.s.sdDLSAP.swtch = k->linkType; /* protocol type */
|
||||
cfg.t.cfg.s.sdDLSAP.priorDl = PRIOR0; /* priority for data link layer */
|
||||
cfg.t.cfg.s.sdDLSAP.routeDl = RTESPEC; /* route for data link layer */
|
||||
cfg.t.cfg.s.sdDLSAP.selectorDl = 0; /* upper interface selector */
|
||||
if (k->mtp1ProcId > 0) {
|
||||
cfg.t.cfg.s.sdDLSAP.dstProcId = k->mtp1ProcId; /* the procid of MAC/L1/MTP1 */
|
||||
} else {
|
||||
cfg.t.cfg.s.sdDLSAP.dstProcId = SFndProcId(); /* the procid of MAC/L1/MTP1 */
|
||||
}
|
||||
cfg.t.cfg.s.sdDLSAP.dstProcId = SFndProcId(); /* the procid of MAC/L1/MTP1 */
|
||||
cfg.t.cfg.s.sdDLSAP.entMac = ENTL1; /* entity for MAC */
|
||||
cfg.t.cfg.s.sdDLSAP.instMac = S_INST; /* instance for MAC */
|
||||
@@ -646,22 +796,22 @@ int ftmod_ss7_mtp2_dlsap_config(int id)
|
||||
cfg.t.cfg.s.sdDLSAP.memMac.region = S_REG; /* memory region and pool id for MAC */
|
||||
cfg.t.cfg.s.sdDLSAP.memMac.pool = S_POOL;
|
||||
cfg.t.cfg.s.sdDLSAP.maxOutsFrms = MAX_SD_OUTSTANDING; /* maximum outstanding frames */
|
||||
cfg.t.cfg.s.sdDLSAP.errType = k->mtp2.errorType;
|
||||
cfg.t.cfg.s.sdDLSAP.errType = k->errorType;
|
||||
cfg.t.cfg.s.sdDLSAP.t1.enb = TRUE; /* timer 1 - Alignment Ready Timer */
|
||||
cfg.t.cfg.s.sdDLSAP.t1.val = k->mtp2.t1;
|
||||
cfg.t.cfg.s.sdDLSAP.t1.val = k->t1;
|
||||
cfg.t.cfg.s.sdDLSAP.t2.enb = TRUE; /* timer 2 - Not Aligned Timer */
|
||||
cfg.t.cfg.s.sdDLSAP.t2.val = k->mtp2.t2;
|
||||
cfg.t.cfg.s.sdDLSAP.t2.val = k->t2;
|
||||
cfg.t.cfg.s.sdDLSAP.t3.enb = TRUE; /* timer 3 - Aligned Timer */
|
||||
cfg.t.cfg.s.sdDLSAP.t3.val = k->mtp2.t3;
|
||||
cfg.t.cfg.s.sdDLSAP.t3.val = k->t3;
|
||||
cfg.t.cfg.s.sdDLSAP.t5.enb = TRUE; /* timer 5 - Sending SIB timer */
|
||||
cfg.t.cfg.s.sdDLSAP.t5.val = k->mtp2.t5;
|
||||
cfg.t.cfg.s.sdDLSAP.t5.val = k->t5;
|
||||
cfg.t.cfg.s.sdDLSAP.t6.enb = TRUE; /* timer 6 - Remote Congestion Timer */
|
||||
cfg.t.cfg.s.sdDLSAP.t6.val = k->mtp2.t6;
|
||||
cfg.t.cfg.s.sdDLSAP.t6.val = k->t6;
|
||||
cfg.t.cfg.s.sdDLSAP.t7.enb = TRUE; /* timer 7 - Excessive delay of acknowledgement timer */
|
||||
cfg.t.cfg.s.sdDLSAP.t7.val = k->mtp2.t7;
|
||||
cfg.t.cfg.s.sdDLSAP.provEmrgcy = k->mtp2.t4e; /* emergency proving period */
|
||||
cfg.t.cfg.s.sdDLSAP.provNormal = k->mtp2.t4n; /* normal proving period */
|
||||
cfg.t.cfg.s.sdDLSAP.lssuLen = k->mtp2.lssuLength; /* one or two byte LSSU length */
|
||||
cfg.t.cfg.s.sdDLSAP.t7.val = k->t7;
|
||||
cfg.t.cfg.s.sdDLSAP.provEmrgcy = k->t4e; /* emergency proving period */
|
||||
cfg.t.cfg.s.sdDLSAP.provNormal = k->t4n; /* normal proving period */
|
||||
cfg.t.cfg.s.sdDLSAP.lssuLen = k->lssuLength; /* one or two byte LSSU length */
|
||||
cfg.t.cfg.s.sdDLSAP.maxFrmLen = MAX_SD_FRAME_LEN; /* max frame length for MSU */
|
||||
cfg.t.cfg.s.sdDLSAP.congDisc = FALSE; /* congestion discard TRUE or FALSE */
|
||||
cfg.t.cfg.s.sdDLSAP.sdT = MAX_SD_SUERM; /* SUERM error rate threshold */
|
||||
@@ -670,7 +820,7 @@ int ftmod_ss7_mtp2_dlsap_config(int id)
|
||||
cfg.t.cfg.s.sdDLSAP.sdN1 = MAX_SD_MSU_RETRANS; /* maximum number of MSUs for retransmission */
|
||||
cfg.t.cfg.s.sdDLSAP.sdN2 = MAX_SD_OCTETS_RETRANS; /* maximum number of MSU octets for retrans */
|
||||
cfg.t.cfg.s.sdDLSAP.sdCp = MAX_SD_ALIGN_ATTEMPTS; /* maximum number of alignment attempts */
|
||||
cfg.t.cfg.s.sdDLSAP.spIdSE = k->mtp2.mtp1Id; /* service provider id */
|
||||
cfg.t.cfg.s.sdDLSAP.spIdSE = k->mtp1Id; /* service provider id */
|
||||
cfg.t.cfg.s.sdDLSAP.sdtFlcStartTr = 256; /* SDT interface flow control start thresh */
|
||||
cfg.t.cfg.s.sdDLSAP.sdtFlcEndTr = 512; /* SDT interface flow control end thresh */
|
||||
|
||||
@@ -707,7 +857,6 @@ int ftmod_ss7_mtp2_dlsap_config(int id)
|
||||
#endif /*RUG*/
|
||||
|
||||
return(sng_cfg_mtp2(&pst, &cfg));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -715,7 +864,7 @@ int ftmod_ss7_mtp3_dlsap_config(int id)
|
||||
{
|
||||
Pst pst;
|
||||
SnMngmt cfg;
|
||||
sng_mtp_link_t *k = &g_ftdm_sngss7_data.cfg.mtpLink[id];
|
||||
sng_mtp3_link_t *k = &g_ftdm_sngss7_data.cfg.mtp3Link[id];
|
||||
|
||||
|
||||
/* initalize the post structure */
|
||||
@@ -738,14 +887,14 @@ int ftmod_ss7_mtp3_dlsap_config(int id)
|
||||
|
||||
cfg.hdr.elmId.elmntInst1 = k->id;
|
||||
|
||||
cfg.t.cfg.s.snDLSAP.lnkSetId = k->mtp3.linkSetId; /* link set ID */
|
||||
cfg.t.cfg.s.snDLSAP.opc = k->mtp3.spc; /* Originating Postatic int Code */
|
||||
cfg.t.cfg.s.snDLSAP.adjDpc = k->mtp3.apc; /* Adlacent Destination Postatic int Code */
|
||||
cfg.t.cfg.s.snDLSAP.lnkSetId = k->linkSetId; /* link set ID */
|
||||
cfg.t.cfg.s.snDLSAP.opc = k->spc; /* Originating Postatic int Code */
|
||||
cfg.t.cfg.s.snDLSAP.adjDpc = k->apc; /* Adlacent Destination Postatic int Code */
|
||||
cfg.t.cfg.s.snDLSAP.lnkPrior = 0; /* link priority within the link set */
|
||||
cfg.t.cfg.s.snDLSAP.msgSize = MAX_SN_MSG_SIZE; /* message length */
|
||||
cfg.t.cfg.s.snDLSAP.msgPrior = 0; /* management message priority */
|
||||
cfg.t.cfg.s.snDLSAP.lnkType = k->mtp3.linkType; /* link type ANSI, ITU, BICI or CHINA */
|
||||
cfg.t.cfg.s.snDLSAP.upSwtch = k->mtp3.switchType; /* user part switch type */
|
||||
cfg.t.cfg.s.snDLSAP.lnkType = k->linkType; /* link type ANSI, ITU, BICI or CHINA */
|
||||
cfg.t.cfg.s.snDLSAP.upSwtch = k->switchType; /* user part switch type */
|
||||
cfg.t.cfg.s.snDLSAP.maxSLTtry = MAX_SLTM_RETRIES; /* maximun times to retry SLTM */
|
||||
cfg.t.cfg.s.snDLSAP.p0QLen = 32; /* size of the priority 0 Q */
|
||||
cfg.t.cfg.s.snDLSAP.p1QLen = 32; /* size of the priority 1 Q */
|
||||
@@ -756,7 +905,7 @@ int ftmod_ss7_mtp3_dlsap_config(int id)
|
||||
cfg.t.cfg.s.snDLSAP.maxCredit = MAX_SN_CREDIT; /* max credit */
|
||||
#endif /* SDT2 */
|
||||
cfg.t.cfg.s.snDLSAP.lnkId = 0; /* signalling link allocation procedure identity */
|
||||
cfg.t.cfg.s.snDLSAP.lnkTstSLC = k->mtp3.slc; /* link selection code for link test */
|
||||
cfg.t.cfg.s.snDLSAP.lnkTstSLC = k->slc; /* link selection code for link test */
|
||||
cfg.t.cfg.s.snDLSAP.tstLen = 6; /* link test pattern length */
|
||||
cfg.t.cfg.s.snDLSAP.tst[0] = 'K'; /* link test pattern */
|
||||
cfg.t.cfg.s.snDLSAP.tst[1] = 'O'; /* link test pattern */
|
||||
@@ -764,8 +913,8 @@ int ftmod_ss7_mtp3_dlsap_config(int id)
|
||||
cfg.t.cfg.s.snDLSAP.tst[3] = 'R'; /* link test pattern */
|
||||
cfg.t.cfg.s.snDLSAP.tst[4] = 'A'; /* link test pattern */
|
||||
cfg.t.cfg.s.snDLSAP.tst[5] = 'D'; /* link test pattern */
|
||||
cfg.t.cfg.s.snDLSAP.ssf = k->mtp3.ssf; /* sub service field */
|
||||
cfg.t.cfg.s.snDLSAP.dstProcId = SFndProcId(); /* destination processor id */
|
||||
cfg.t.cfg.s.snDLSAP.ssf = k->ssf; /* sub service field */
|
||||
cfg.t.cfg.s.snDLSAP.dstProcId = k->mtp2ProcId; /* destination processor id */
|
||||
cfg.t.cfg.s.snDLSAP.dstEnt = ENTSD; /* entity */
|
||||
cfg.t.cfg.s.snDLSAP.dstInst = S_INST; /* instance */
|
||||
cfg.t.cfg.s.snDLSAP.prior = PRIOR0; /* priority */
|
||||
@@ -773,9 +922,9 @@ int ftmod_ss7_mtp3_dlsap_config(int id)
|
||||
cfg.t.cfg.s.snDLSAP.selector = 0; /* lower layer selector */
|
||||
cfg.t.cfg.s.snDLSAP.mem.region = S_REG; /* memory region id */
|
||||
cfg.t.cfg.s.snDLSAP.mem.pool = S_POOL; /* memory pool id */
|
||||
cfg.t.cfg.s.snDLSAP.spId = k->mtp3.mtp2Id ;/* service provider id */
|
||||
cfg.t.cfg.s.snDLSAP.spId = k->mtp2Id; /* service provider id */
|
||||
|
||||
switch (k->mtp3.linkType) {
|
||||
switch (k->linkType) {
|
||||
/**************************************************************************/
|
||||
case (LSN_SW_ANS):
|
||||
case (LSN_SW_ANS96):
|
||||
@@ -793,9 +942,9 @@ int ftmod_ss7_mtp3_dlsap_config(int id)
|
||||
cfg.t.cfg.s.snDLSAP.dpcLen = DPC14; /* dpc length 14 bits */
|
||||
break;
|
||||
/**************************************************************************/
|
||||
} /* switch (k->mtp3.linkType) */
|
||||
} /* switch (k->linkType) */
|
||||
|
||||
switch (k->mtp3.linkType) {
|
||||
switch (k->linkType) {
|
||||
/**************************************************************************/
|
||||
case (LSN_SW_ANS):
|
||||
case (LSN_SW_ANS96):
|
||||
@@ -811,51 +960,51 @@ int ftmod_ss7_mtp3_dlsap_config(int id)
|
||||
cfg.t.cfg.s.snDLSAP.flushContFlag = FALSE; /* flush continue handling */
|
||||
break;
|
||||
/**************************************************************************/
|
||||
} /* switch (k->mtp3.linkType) */
|
||||
} /* switch (k->linkType) */
|
||||
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t1.enb = TRUE; /* t1 - delay to avoid missequencing on changeover */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t1.val = k->mtp3.t1;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t1.val = k->t1;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t2.enb = TRUE; /* t2 - waiting for changeover ack */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t2.val = k->mtp3.t2;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t2.val = k->t2;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t3.enb = TRUE; /* t3 - delay to avoid missequencing on changeback */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t3.val = k->mtp3.t3;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t3.val = k->t3;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t4.enb = TRUE; /* t4 - waiting for first changeback ack */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t4.val = k->mtp3.t4;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t4.val = k->t4;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t5.enb = TRUE; /* t5 - waiting for second changeback ack */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t5.val = k->mtp3.t5;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t5.val = k->t5;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t7.enb = TRUE; /* t7 - waiting for link connection ack */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t7.val = k->mtp3.t7;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t7.val = k->t7;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t12.enb = TRUE; /* t12 - waiting for uninhibit ack */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t12.val = k->mtp3.t12;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t12.val = k->t12;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t13.enb = TRUE; /* t13 - waiting for forced uninhibit */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t13.val = k->mtp3.t13;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t13.val = k->t13;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t14.enb = TRUE; /* t14 - waiting for inhibition ack */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t14.val = k->mtp3.t14;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t14.val = k->t14;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t17.enb = TRUE; /* t17 - delay to avoid oscillation of initial alignment failure */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t17.val = k->mtp3.t17;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t17.val = k->t17;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t22.enb = TRUE; /* t22 - local inhibit test timer */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t22.val = k->mtp3.t22;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t22.val = k->t22;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t23.enb = TRUE; /* t23 - remote inhibit test timer */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t23.val = k->mtp3.t23;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t23.val = k->t23;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t24.enb = TRUE; /* t24 - stabilizing timer */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t24.val = k->mtp3.t24;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t24.val = k->t24;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t31.enb = TRUE; /* t31 - BSN requested timer */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t31.val = k->mtp3.t31;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t31.val = k->t31;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t32.enb = TRUE; /* t32 - SLT timer */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t32.val = k->mtp3.t32;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t32.val = k->t32;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t33.enb = TRUE; /* t33 - connecting timer */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t33.val = k->mtp3.t33;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t33.val = k->t33;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t34.enb = TRUE; /* t34 - periodic signalling link test timer */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t34.val = k->mtp3.t34;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t34.val = k->t34;
|
||||
#if (SS7_ANS92 || SS7_ANS88 || SS7_ANS96 || defined(TDS_ROLL_UPGRADE_SUPPORT))
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t35.enb = TRUE; /* t35 - false link congestion timer, same as t31 of ANSI'96*/
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t35.val = k->mtp3.t35;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t35.val = k->t35;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t36.enb = TRUE; /* t36 - false link congestion timer, same as t33 of ANSI'96*/
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t36.val = k->mtp3.t36;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t36.val = k->t36;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t37.enb = TRUE; /* t37 - false link congestion timer, same as t34 of ANSI'96*/
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t37.val = k->mtp3.t37;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.t37.val = k->t37;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.tCraft.enb = TRUE; /* link referral craft timer - T19 in ANSI */
|
||||
cfg.t.cfg.s.snDLSAP.tmr.tCraft.val = k->mtp3.tcraft;
|
||||
cfg.t.cfg.s.snDLSAP.tmr.tCraft.val = k->tcraft;
|
||||
#endif
|
||||
#ifdef SDT2
|
||||
cfg.t.cfg.s.snDLSAP.tmr.tFlc.enb = TRUE; /* flow control timer */
|
||||
@@ -996,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 */
|
||||
@@ -1217,6 +1366,11 @@ int ftmod_ss7_isup_ckt_config(int id)
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSI;
|
||||
|
||||
/* check the for the correct ProcId and make sure it goes to the right system */
|
||||
if (g_ftdm_sngss7_data.cfg.procId != 1) {
|
||||
pst.dstProcId = 1;
|
||||
}
|
||||
|
||||
/*clear the configuration structure*/
|
||||
memset(&cfg, 0x0, sizeof(SiMngmt));
|
||||
|
||||
@@ -1417,11 +1571,11 @@ int ftmod_ss7_isup_isap_config(int id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_cc_isap_config(int id)
|
||||
int ftmod_ss7_cc_isap_config(int dstProcId)
|
||||
{
|
||||
CcMngmt cfg;
|
||||
Pst pst;
|
||||
sng_isap_t *k = &g_ftdm_sngss7_data.cfg.isap[id];
|
||||
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
@@ -1441,11 +1595,11 @@ int ftmod_ss7_cc_isap_config(int id)
|
||||
cfg.hdr.entId.inst = S_INST;
|
||||
cfg.hdr.elmId.elmnt = STISAP;
|
||||
|
||||
cfg.hdr.elmId.elmntInst1 = k->id;
|
||||
cfg.hdr.elmId.elmntInst1 = 1;
|
||||
|
||||
cfg.t.cfg.s.ccISAP.suId = k->suId;
|
||||
cfg.t.cfg.s.ccISAP.spId = k->spId;
|
||||
cfg.t.cfg.s.ccISAP.pst.dstProcId = SFndProcId();
|
||||
cfg.t.cfg.s.ccISAP.suId = 1;
|
||||
cfg.t.cfg.s.ccISAP.spId = 1;
|
||||
cfg.t.cfg.s.ccISAP.pst.dstProcId = dstProcId;
|
||||
cfg.t.cfg.s.ccISAP.pst.dstEnt = ENTSI;
|
||||
cfg.t.cfg.s.ccISAP.pst.dstInst = S_INST;
|
||||
cfg.t.cfg.s.ccISAP.pst.srcProcId = SFndProcId();
|
||||
@@ -1461,6 +1615,70 @@ int ftmod_ss7_cc_isap_config(int id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_relay_chan_config(int id)
|
||||
{
|
||||
RyMngmt cfg; /*configuration structure*/
|
||||
Pst pst; /*post structure*/
|
||||
sng_relay_t *k = &g_ftdm_sngss7_data.cfg.relay[id];
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTRY;
|
||||
|
||||
/* clear the configuration structure */
|
||||
memset(&cfg, 0x0, sizeof(RyMngmt));
|
||||
|
||||
/* fill in some general sections of the header */
|
||||
smHdrInit(&cfg.hdr);
|
||||
|
||||
/*fill in the specific fields of the header */
|
||||
cfg.hdr.msgType = TCFG;
|
||||
cfg.hdr.entId.ent = ENTRY;
|
||||
cfg.hdr.entId.inst = S_INST;
|
||||
cfg.hdr.elmId.elmnt = STCHCFG;
|
||||
|
||||
cfg.hdr.elmId.elmntInst1 = k->id;
|
||||
|
||||
cfg.t.cfg.s.ryChanCfg.id = k->id; /* channel id */
|
||||
cfg.t.cfg.s.ryChanCfg.type = k->type; /* channel type */
|
||||
/* cfg.t.cfg.s.ryChanCfg.msInd =;*/ /* master/slave indicator */
|
||||
if (k->type == LRY_CT_TCP_LISTEN) {
|
||||
cfg.t.cfg.s.ryChanCfg.low = 0; /* low proc id for channel */
|
||||
cfg.t.cfg.s.ryChanCfg.high = 0; /* high proc id for channel */
|
||||
} else {
|
||||
cfg.t.cfg.s.ryChanCfg.low = k->procId; /* low proc id for channel */
|
||||
cfg.t.cfg.s.ryChanCfg.high = k->procId; /* high proc id for channel */
|
||||
}
|
||||
cfg.t.cfg.s.ryChanCfg.nmbScanQ = MAX_RELAY_NMBSCAN; /* number of times to scan the queue */
|
||||
cfg.t.cfg.s.ryChanCfg.flags = LRY_FLG_INTR; /* flags */
|
||||
cfg.t.cfg.s.ryChanCfg.congThrsh = MAX_RELAY_CONGTHRSH; /* congestion threshold */
|
||||
cfg.t.cfg.s.ryChanCfg.dropThrsh = 0; /* drop threshold */
|
||||
cfg.t.cfg.s.ryChanCfg.contThrsh = MAX_RELAY_CONGTHRSH + 1; /* continue threshold */
|
||||
cfg.t.cfg.s.ryChanCfg.kaTxTmr.enb = 1; /* keep alive transmit timer config */
|
||||
cfg.t.cfg.s.ryChanCfg.kaTxTmr.val = RY_TX_KP_ALIVE_TMR;
|
||||
cfg.t.cfg.s.ryChanCfg.kaRxTmr.enb = 1; /* keep alive receive timer config */
|
||||
cfg.t.cfg.s.ryChanCfg.kaRxTmr.val = RY_RX_KP_ALIVE_TMR;
|
||||
cfg.t.cfg.s.ryChanCfg.btTmr.enb = 1; /* boot timer */
|
||||
cfg.t.cfg.s.ryChanCfg.btTmr.val = RY_BT_TMR;
|
||||
cfg.t.cfg.s.ryChanCfg.region = S_REG; /* Relay region */
|
||||
cfg.t.cfg.s.ryChanCfg.pool = S_POOL; /* Relay pool */
|
||||
#if (RY_ENBUDPSOCK || RY_ENBTCPSOCK)
|
||||
cfg.t.cfg.s.ryChanCfg.listenPortNo = k->port; /* Listen Port of Rx Relay Channel*/
|
||||
strncpy(cfg.t.cfg.s.ryChanCfg.transmittoHostName, k->hostname, (size_t)RY_REMHOSTNAME_SIZE);
|
||||
cfg.t.cfg.s.ryChanCfg.transmittoPortNo = k->port; /* TransmitTo PortId for Tx Relay Channel */
|
||||
cfg.t.cfg.s.ryChanCfg.targetProcId = k->procId; /* procId of the node present in the other end of this channel */
|
||||
# ifdef LRY1
|
||||
cfg.t.cfg.s.ryChanCfg.sockParam =; /* Socket Parameters */
|
||||
# endif /* LRY1 */
|
||||
# ifdef LRYV2
|
||||
cfg.t.cfg.s.ryChanCfg.selfHostName[RY_REMHOSTNAME_SIZE];
|
||||
# endif /* LRY2 */
|
||||
#endif /* RY_ENBUDPSOCK || RY_ENBTCPSOCK */
|
||||
|
||||
return(sng_cfg_relay(&pst, &cfg));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
|
||||
@@ -46,6 +46,8 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
|
||||
|
||||
static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream);
|
||||
|
||||
static ftdm_status_t handle_show_procId(ftdm_stream_handle_t *stream);
|
||||
|
||||
static ftdm_status_t handle_set_function_trace(ftdm_stream_handle_t *stream, int on, int level);
|
||||
static ftdm_status_t handle_set_message_trace(ftdm_stream_handle_t *stream, int on, int level);
|
||||
static ftdm_status_t handle_set_inhibit(ftdm_stream_handle_t *stream, char *name);
|
||||
@@ -67,6 +69,8 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c
|
||||
static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose);
|
||||
static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int chan, int range, int verbose);
|
||||
|
||||
static ftdm_status_t handle_bind_link(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_unbind_link(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_activate_link(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_deactivate_link(ftdm_stream_handle_t *stream, char *name);
|
||||
|
||||
@@ -76,9 +80,12 @@ static ftdm_status_t handle_deactivate_linkset(ftdm_stream_handle_t *stream, cha
|
||||
static ftdm_status_t handle_tx_lpo(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_tx_lpr(ftdm_stream_handle_t *stream, char *name);
|
||||
|
||||
static ftdm_status_t handle_status_link(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_status_mtp3link(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_status_mtp2link(ftdm_stream_handle_t *stream, char *name);
|
||||
static ftdm_status_t handle_status_linkset(ftdm_stream_handle_t *stream, char *name);
|
||||
|
||||
static ftdm_status_t handle_status_relay(ftdm_stream_handle_t *stream, char *name);
|
||||
|
||||
static ftdm_status_t extract_span_chan(char *argv[10], int pos, int *span, int *chan);
|
||||
static ftdm_status_t check_arg_count(int args, int min);
|
||||
/******************************************************************************/
|
||||
@@ -111,18 +118,29 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
|
||||
|
||||
if (!strcasecmp(argv[c], "status")) {
|
||||
/**********************************************************************/
|
||||
if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
|
||||
c++;
|
||||
|
||||
if (!strcasecmp(argv[c], "link")) {
|
||||
if (!strcasecmp(argv[c], "mtp3")) {
|
||||
/******************************************************************/
|
||||
c++;
|
||||
handle_status_link(stream, argv[c]);
|
||||
handle_status_mtp3link(stream, argv[c]);
|
||||
/******************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "mtp2")) {
|
||||
/******************************************************************/
|
||||
c++;
|
||||
handle_status_mtp2link(stream, argv[c]);
|
||||
/******************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "linkset")) {
|
||||
/******************************************************************/
|
||||
c++;
|
||||
handle_status_linkset(stream, argv[c]);
|
||||
/******************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "relay")) {
|
||||
/******************************************************************/
|
||||
c++;
|
||||
handle_status_relay(stream, argv[c]);
|
||||
/******************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "span")) {
|
||||
/******************************************************************/
|
||||
if (check_arg_count(argc, 6)) goto handle_cli_error_argc;
|
||||
@@ -256,6 +274,10 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
|
||||
sts.rx_frm, sts.rx_err, sts.rx_fisu, sts.rx_lssu, sts.rx_msu);
|
||||
*/
|
||||
/**********************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "procid")) {
|
||||
/**********************************************************************/
|
||||
handle_show_procId(stream);
|
||||
/**********************************************************************/
|
||||
} else {
|
||||
/**********************************************************************/
|
||||
stream->write_function(stream, "Unknown \"show\" command\n");
|
||||
@@ -534,6 +556,44 @@ ftdm_status_t ftdm_sngss7_handle_cli_cmd(ftdm_stream_handle_t *stream, const cha
|
||||
/**********************************************************************/
|
||||
}
|
||||
/**************************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "bind")) {
|
||||
/**************************************************************************/
|
||||
if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
|
||||
c++;
|
||||
|
||||
if (!strcasecmp(argv[c], "link")) {
|
||||
/**********************************************************************/
|
||||
if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
|
||||
c++;
|
||||
|
||||
handle_bind_link(stream, argv[c]);
|
||||
/**********************************************************************/
|
||||
} else {
|
||||
/**********************************************************************/
|
||||
stream->write_function(stream, "Unknown \"bind\" command\n");
|
||||
goto handle_cli_error;
|
||||
/**********************************************************************/
|
||||
}
|
||||
/**************************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "unbind")) {
|
||||
/**************************************************************************/
|
||||
if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
|
||||
c++;
|
||||
|
||||
if (!strcasecmp(argv[c], "link")) {
|
||||
/**********************************************************************/
|
||||
if (check_arg_count(argc, 3)) goto handle_cli_error_argc;
|
||||
c++;
|
||||
|
||||
handle_unbind_link(stream, argv[c]);
|
||||
/**********************************************************************/
|
||||
} else {
|
||||
/**********************************************************************/
|
||||
stream->write_function(stream, "Unknown \"bind\" command\n");
|
||||
goto handle_cli_error;
|
||||
/**********************************************************************/
|
||||
}
|
||||
/**************************************************************************/
|
||||
} else if (!strcasecmp(argv[c], "activate")) {
|
||||
/**************************************************************************/
|
||||
if (check_arg_count(argc, 2)) goto handle_cli_error_argc;
|
||||
@@ -620,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");
|
||||
@@ -649,6 +709,16 @@ static ftdm_status_t handle_print_usuage(ftdm_stream_handle_t *stream)
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_show_procId(ftdm_stream_handle_t *stream)
|
||||
{
|
||||
int procId = sng_get_procId();
|
||||
|
||||
stream->write_function(stream, "Local ProcId = %d\n", procId);
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_set_function_trace(ftdm_stream_handle_t *stream, int on, int level)
|
||||
{
|
||||
@@ -693,7 +763,7 @@ static ftdm_status_t handle_show_free(ftdm_stream_handle_t *stream, int span, in
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
free = 0;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
@@ -756,7 +826,7 @@ static ftdm_status_t handle_show_inuse(ftdm_stream_handle_t *stream, int span, i
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
in_use = 0;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
@@ -826,7 +896,7 @@ static ftdm_status_t handle_show_inreset(ftdm_stream_handle_t *stream, int span,
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
in_reset = 0;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
@@ -848,10 +918,10 @@ static ftdm_status_t handle_show_inreset(ftdm_stream_handle_t *stream, int span,
|
||||
}
|
||||
|
||||
if ((ftdmchan->physical_span_id == lspan) && (ftdmchan->physical_chan_id == lchan)) {
|
||||
if ((sngss7_test_flag(ss7_info, FLAG_RESET_RX)) ||
|
||||
(sngss7_test_flag(ss7_info, FLAG_RESET_TX)) ||
|
||||
(sngss7_test_flag(ss7_info, FLAG_GRP_RESET_RX)) ||
|
||||
(sngss7_test_flag(ss7_info, FLAG_GRP_RESET_TX))) {
|
||||
if ((sngss7_test_ckt_flag(ss7_info, FLAG_RESET_RX)) ||
|
||||
(sngss7_test_ckt_flag(ss7_info, FLAG_RESET_TX)) ||
|
||||
(sngss7_test_ckt_flag(ss7_info, FLAG_GRP_RESET_RX)) ||
|
||||
(sngss7_test_ckt_flag(ss7_info, FLAG_GRP_RESET_TX))) {
|
||||
|
||||
if (verbose) {
|
||||
stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|in_reset=Y\n",
|
||||
@@ -862,7 +932,7 @@ static ftdm_status_t handle_show_inreset(ftdm_stream_handle_t *stream, int span,
|
||||
|
||||
/*increment the count of circuits in reset */
|
||||
in_reset++;
|
||||
} /* if ((sngss7_test_flag(ss7_info, FLAG_RESET_RX) ... */
|
||||
} /* if ((sngss7_test_ckt_flag(ss7_info, FLAG_RESET_RX) ... */
|
||||
} /* if ( span and chan) */
|
||||
} /* if ( cic != 0) */
|
||||
|
||||
@@ -885,7 +955,7 @@ static ftdm_status_t handle_show_flags(ftdm_stream_handle_t *stream, int span, i
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
|
||||
@@ -913,7 +983,7 @@ static ftdm_status_t handle_show_flags(ftdm_stream_handle_t *stream, int span, i
|
||||
|
||||
for (bit = 0; bit < 33; bit++) {
|
||||
stream->write_function(stream, "|");
|
||||
if (ss7_info->flags & ( 0x1 << bit)) {
|
||||
if (ss7_info->ckt_flags & ( 0x1 << bit)) {
|
||||
stream->write_function(stream, "%2d=1", bit);
|
||||
} else {
|
||||
stream->write_function(stream, "%2d=0", bit);
|
||||
@@ -941,7 +1011,7 @@ static ftdm_status_t handle_show_blocks(ftdm_stream_handle_t *stream, int span,
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
|
||||
@@ -967,37 +1037,37 @@ static ftdm_status_t handle_show_blocks(ftdm_stream_handle_t *stream, int span,
|
||||
ftdmchan->physical_chan_id,
|
||||
ss7_info->circuit->cic);
|
||||
|
||||
if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
if((sngss7_test_ckt_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX)) || (sngss7_test_ckt_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
stream->write_function(stream, "l_mn=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_mn=N|");
|
||||
}
|
||||
|
||||
if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_RX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
if((sngss7_test_ckt_flag(ss7_info, FLAG_CKT_MN_BLOCK_RX)) || (sngss7_test_ckt_flag(ss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
stream->write_function(stream, "r_mn=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "r_mn=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) {
|
||||
if(sngss7_test_ckt_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) {
|
||||
stream->write_function(stream, "l_hw=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_hw=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_RX)) {
|
||||
if(sngss7_test_ckt_flag(ss7_info, FLAG_GRP_HW_BLOCK_RX)) {
|
||||
stream->write_function(stream, "r_hw=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "r_hw=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_CKT_LC_BLOCK_RX)) {
|
||||
if(sngss7_test_ckt_flag(ss7_info, FLAG_CKT_LC_BLOCK_RX)) {
|
||||
stream->write_function(stream, "l_mngmt=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_mngmt=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_CKT_UCIC_BLOCK)) {
|
||||
if(sngss7_test_ckt_flag(ss7_info, FLAG_CKT_UCIC_BLOCK)) {
|
||||
stream->write_function(stream, "l_ucic=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_ucic=N|");
|
||||
@@ -1026,7 +1096,7 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
|
||||
ftdm_signaling_status_t sigstatus = FTDM_SIG_STATE_DOWN;
|
||||
sng_isup_ckt_t *ckt;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
/* extract the circuit to make it easier to work with */
|
||||
ckt = &g_ftdm_sngss7_data.cfg.isupCkt[x];
|
||||
@@ -1061,53 +1131,58 @@ static ftdm_status_t handle_show_status(ftdm_stream_handle_t *stream, int span,
|
||||
ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
|
||||
ftdmchan = ss7_info->ftdmchan;
|
||||
|
||||
/* grab the signaling_status */
|
||||
ftdm_channel_get_sig_status(ftdmchan, &sigstatus);
|
||||
if (ftdmchan == NULL) {
|
||||
/* this should never happen!!! */
|
||||
stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|FTDMCHAN DOES NOT EXISTS",
|
||||
ckt->span,
|
||||
ckt->chan,
|
||||
ckt->cic);
|
||||
|
||||
} else {
|
||||
/* grab the signaling_status */
|
||||
ftdm_channel_get_sig_status(ftdmchan, &sigstatus);
|
||||
|
||||
stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|sig_status=%4s|state=%s|",
|
||||
ckt->span,
|
||||
ckt->chan,
|
||||
ckt->cic,
|
||||
ftdm_signaling_status2str(sigstatus),
|
||||
ftdm_channel_state2str(ftdmchan->state));
|
||||
|
||||
if ((sngss7_test_ckt_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX)) ||
|
||||
(sngss7_test_ckt_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
stream->write_function(stream, "l_mn=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_mn=N|");
|
||||
}
|
||||
|
||||
if ((sngss7_test_ckt_flag(ss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_ckt_flag(ss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
stream->write_function(stream, "r_mn=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "r_mn=N|");
|
||||
}
|
||||
|
||||
if (sngss7_test_ckt_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) {
|
||||
stream->write_function(stream, "l_hw=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_hw=N|");
|
||||
}
|
||||
|
||||
if (sngss7_test_ckt_flag(ss7_info, FLAG_GRP_HW_BLOCK_RX)) {
|
||||
stream->write_function(stream, "r_hw=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "r_hw=N|");
|
||||
}
|
||||
|
||||
stream->write_function(stream, "span=%2d|chan=%2d|cic=%4d|sig_status=%4s|state=%s|",
|
||||
ckt->span,
|
||||
ckt->chan,
|
||||
ckt->cic,
|
||||
ftdm_signaling_status2str(sigstatus),
|
||||
ftdm_channel_state2str(ftdmchan->state));
|
||||
|
||||
if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
stream->write_function(stream, "l_mn=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_mn=N|");
|
||||
if (sngss7_test_ckt_flag(ss7_info, FLAG_RELAY_DOWN)) {
|
||||
stream->write_function(stream, "relay=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "relay=N|");
|
||||
}
|
||||
}
|
||||
|
||||
if((sngss7_test_flag(ss7_info, FLAG_CKT_MN_BLOCK_RX)) || (sngss7_test_flag(ss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
stream->write_function(stream, "r_mn=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "r_mn=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_TX)) {
|
||||
stream->write_function(stream, "l_hw=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_hw=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_GRP_HW_BLOCK_RX)) {
|
||||
stream->write_function(stream, "r_hw=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "r_hw=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_CKT_LC_BLOCK_RX)) {
|
||||
stream->write_function(stream, "l_mngmt=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_mngmt=N|");
|
||||
}
|
||||
|
||||
if(sngss7_test_flag(ss7_info, FLAG_CKT_UCIC_BLOCK)) {
|
||||
stream->write_function(stream, "l_ucic=Y|");
|
||||
}else {
|
||||
stream->write_function(stream, "l_ucic=N|");
|
||||
}
|
||||
|
||||
stream->write_function(stream, "flags=0x%X",ss7_info->flags);
|
||||
stream->write_function(stream, "flags=0x%X",ss7_info->ckt_flags);
|
||||
|
||||
stream->write_function(stream, "\n");
|
||||
} /* if ( hole, sig, voice) */
|
||||
@@ -1127,7 +1202,7 @@ static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int c
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
|
||||
@@ -1162,7 +1237,7 @@ static ftdm_status_t handle_tx_blo(ftdm_stream_handle_t *stream, int span, int c
|
||||
continue;
|
||||
} else {
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX);
|
||||
sngss7_set_ckt_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -1193,7 +1268,7 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
ss7_info = (sngss7_chan_data_t *)g_ftdm_sngss7_data.cfg.isupCkt[x].obj;
|
||||
@@ -1228,10 +1303,10 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c
|
||||
continue;
|
||||
} else {
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(ss7_info, FLAG_CKT_MN_UNBLK_TX);
|
||||
sngss7_set_ckt_flag(ss7_info, FLAG_CKT_MN_UNBLK_TX);
|
||||
|
||||
/* clear the block flag */
|
||||
sngss7_clear_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX);
|
||||
sngss7_clear_ckt_flag(ss7_info, FLAG_CKT_MN_BLOCK_TX);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -1254,18 +1329,18 @@ static ftdm_status_t handle_tx_ubl(ftdm_stream_handle_t *stream, int span, int c
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_status_link(ftdm_stream_handle_t *stream, char *name)
|
||||
static ftdm_status_t handle_status_mtp3link(ftdm_stream_handle_t *stream, char *name)
|
||||
{
|
||||
int x = 0;
|
||||
SnMngmt sta;
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the status request */
|
||||
if (ftmod_ss7_mtplink_sta(x, &sta)) {
|
||||
if (ftmod_ss7_mtp3link_sta(x, &sta)) {
|
||||
stream->write_function(stream, "Failed to read link=%s status\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
@@ -1273,9 +1348,9 @@ static ftdm_status_t handle_status_link(ftdm_stream_handle_t *stream, char *name
|
||||
/* print the results */
|
||||
stream->write_function(stream, "%s|span=%d|chan=%d|sap=%d|state=%s|l_blk=%s|r_blk=%s|l_inhbt=%s|r_inhbt=%s\n",
|
||||
name,
|
||||
g_ftdm_sngss7_data.cfg.mtpLink[x].mtp1.span,
|
||||
g_ftdm_sngss7_data.cfg.mtpLink[x].mtp1.chan,
|
||||
g_ftdm_sngss7_data.cfg.mtpLink[x].id,
|
||||
g_ftdm_sngss7_data.cfg.mtp1Link[x].span,
|
||||
g_ftdm_sngss7_data.cfg.mtp1Link[x].chan,
|
||||
g_ftdm_sngss7_data.cfg.mtp3Link[x].id,
|
||||
DECODE_LSN_LINK_STATUS(sta.t.ssta.s.snDLSAP.state),
|
||||
(sta.t.ssta.s.snDLSAP.locBlkd) ? "Y":"N",
|
||||
(sta.t.ssta.s.snDLSAP.remBlkd) ? "Y":"N",
|
||||
@@ -1295,6 +1370,50 @@ success:
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_status_mtp2link(ftdm_stream_handle_t *stream, char *name)
|
||||
{
|
||||
int x = 0;
|
||||
SdMngmt sta;
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp2Link[x].name, name)) {
|
||||
|
||||
/* send the status request */
|
||||
if (ftmod_ss7_mtp2link_sta(x, &sta)) {
|
||||
stream->write_function(stream, "Failed to read link=%s status\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the results */
|
||||
stream->write_function(stream, "%s|span=%d|chan=%d|sap=%d|state=%s|outsFrm=%d|drpdFrm=%d|lclStatus=%s|rmtStatus=%s|fsn=%d|bsn=%d\n",
|
||||
name,
|
||||
g_ftdm_sngss7_data.cfg.mtp1Link[x].span,
|
||||
g_ftdm_sngss7_data.cfg.mtp1Link[x].chan,
|
||||
g_ftdm_sngss7_data.cfg.mtp2Link[x].id,
|
||||
DECODE_LSD_LINK_STATUS(sta.t.ssta.s.sdDLSAP.hlSt),
|
||||
sta.t.ssta.s.sdDLSAP.psOutsFrm,
|
||||
sta.t.ssta.s.sdDLSAP.cntMaDrop,
|
||||
(sta.t.ssta.s.sdDLSAP.lclBsy) ? "Y":"N",
|
||||
(sta.t.ssta.s.sdDLSAP.remBsy) ? "Y":"N",
|
||||
sta.t.ssta.s.sdDLSAP.fsn,
|
||||
sta.t.ssta.s.sdDLSAP.bsn);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_status_linkset(ftdm_stream_handle_t *stream, char *name)
|
||||
{
|
||||
@@ -1338,17 +1457,17 @@ static ftdm_status_t handle_set_inhibit(ftdm_stream_handle_t *stream, char *name
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the inhibit request */
|
||||
if (ftmod_ss7_inhibit_mtplink(x)) {
|
||||
if (ftmod_ss7_inhibit_mtp3link(x)) {
|
||||
stream->write_function(stream, "Failed to inhibit link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_link(stream, &name[0]);
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
|
||||
goto success;
|
||||
}
|
||||
@@ -1370,17 +1489,17 @@ static ftdm_status_t handle_set_uninhibit(ftdm_stream_handle_t *stream, char *na
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the uninhibit request */
|
||||
if (ftmod_ss7_uninhibit_mtplink(x)) {
|
||||
if (ftmod_ss7_uninhibit_mtp3link(x)) {
|
||||
stream->write_function(stream, "Failed to uninhibit link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_link(stream, &name[0]);
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
|
||||
goto success;
|
||||
}
|
||||
@@ -1404,7 +1523,7 @@ static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int c
|
||||
int lspan;
|
||||
int lchan;
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 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;
|
||||
@@ -1429,7 +1548,7 @@ static ftdm_status_t handle_tx_rsc(ftdm_stream_handle_t *stream, int span, int c
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* throw the reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_TX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
|
||||
|
||||
switch (ftdmchan->state) {
|
||||
/**************************************************************************/
|
||||
@@ -1476,7 +1595,7 @@ static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int c
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
@@ -1500,9 +1619,9 @@ static ftdm_status_t handle_tx_grs(ftdm_stream_handle_t *stream, int span, int c
|
||||
continue;
|
||||
} else {
|
||||
/* throw the grp reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
if (ftdmchan->physical_chan_id == chan) {
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_span->tx_grs.circuit = sngss7_info->circuit->id;
|
||||
sngss7_span->tx_grs.range = range-1;
|
||||
}
|
||||
@@ -1523,7 +1642,7 @@ 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;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
@@ -1565,7 +1684,7 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
@@ -1582,7 +1701,7 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* throw the grp maint. block flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX);
|
||||
|
||||
/* bring the sig status down */
|
||||
sigev.chan_id = ftdmchan->chan_id;
|
||||
@@ -1622,7 +1741,7 @@ 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;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
@@ -1665,7 +1784,7 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
x=1;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
@@ -1682,7 +1801,7 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* throw the grp maint. block flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX);
|
||||
|
||||
/* bring the sig status up */
|
||||
sigev.chan_id = ftdmchan->chan_id;
|
||||
@@ -1722,7 +1841,7 @@ 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;
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
@@ -1745,6 +1864,68 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_bind_link(ftdm_stream_handle_t *stream, char *name)
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the uninhibit request */
|
||||
if (ftmod_ss7_bind_mtp3link(g_ftdm_sngss7_data.cfg.mtp3Link[x].mtp2Id)) {
|
||||
stream->write_function(stream, "Failed to bind link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
goto success;
|
||||
}
|
||||
|
||||
/* move to the next link */
|
||||
x++;
|
||||
} /* while (id != 0) */
|
||||
|
||||
stream->write_function(stream, "Could not find link=%s\n", name);
|
||||
|
||||
success:
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_unbind_link(ftdm_stream_handle_t *stream, char *name)
|
||||
{
|
||||
int x = 0;
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the uninhibit request */
|
||||
if (ftmod_ss7_unbind_mtp3link(g_ftdm_sngss7_data.cfg.mtp3Link[x].mtp2Id)) {
|
||||
stream->write_function(stream, "Failed to bind link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
goto success;
|
||||
}
|
||||
|
||||
/* move to the next link */
|
||||
x++;
|
||||
} /* while (id != 0) */
|
||||
|
||||
stream->write_function(stream, "Could not find link=%s\n", name);
|
||||
|
||||
success:
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_activate_link(ftdm_stream_handle_t *stream, char *name)
|
||||
{
|
||||
@@ -1752,17 +1933,17 @@ static ftdm_status_t handle_activate_link(ftdm_stream_handle_t *stream, char *na
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the uninhibit request */
|
||||
if (ftmod_ss7_activate_mtplink(x)) {
|
||||
if (ftmod_ss7_activate_mtp3link(x)) {
|
||||
stream->write_function(stream, "Failed to activate link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_link(stream, &name[0]);
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
goto success;
|
||||
}
|
||||
|
||||
@@ -1783,17 +1964,17 @@ static ftdm_status_t handle_deactivate_link(ftdm_stream_handle_t *stream, char *
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the deactivate request */
|
||||
if (ftmod_ss7_deactivate2_mtplink(x)) {
|
||||
if (ftmod_ss7_deactivate2_mtp3link(x)) {
|
||||
stream->write_function(stream, "Failed to deactivate link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_link(stream, &name[0]);
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
goto success;
|
||||
}
|
||||
|
||||
@@ -1877,17 +2058,17 @@ static ftdm_status_t handle_tx_lpo(ftdm_stream_handle_t *stream, char *name)
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the uninhibit request */
|
||||
if (ftmod_ss7_lpo_mtplink(x)) {
|
||||
if (ftmod_ss7_lpo_mtp3link(x)) {
|
||||
stream->write_function(stream, "Failed set LPO link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_link(stream, &name[0]);
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
goto success;
|
||||
}
|
||||
|
||||
@@ -1908,17 +2089,17 @@ static ftdm_status_t handle_tx_lpr(ftdm_stream_handle_t *stream, char *name)
|
||||
|
||||
/* find the link request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtpLink[x].name, name)) {
|
||||
while(g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.mtp3Link[x].name, name)) {
|
||||
|
||||
/* send the uninhibit request */
|
||||
if (ftmod_ss7_lpr_mtplink(x)) {
|
||||
if (ftmod_ss7_lpr_mtp3link(x)) {
|
||||
stream->write_function(stream, "Failed set LPR link=%s\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the new status of the link */
|
||||
handle_status_link(stream, &name[0]);
|
||||
handle_status_mtp3link(stream, &name[0]);
|
||||
goto success;
|
||||
}
|
||||
|
||||
@@ -1932,6 +2113,47 @@ success:
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t handle_status_relay(ftdm_stream_handle_t *stream, char *name)
|
||||
{
|
||||
RyMngmt sta;
|
||||
int x = 0;
|
||||
|
||||
memset(&sta, 0x0, sizeof(sta));
|
||||
|
||||
|
||||
/* find the channel request by it's name */
|
||||
x = 1;
|
||||
while(g_ftdm_sngss7_data.cfg.relay[x].id != 0) {
|
||||
if (!strcasecmp(g_ftdm_sngss7_data.cfg.relay[x].name, name)) {
|
||||
|
||||
if (ftmod_ss7_relay_status(g_ftdm_sngss7_data.cfg.relay[x].id, &sta)) {
|
||||
stream->write_function(stream, "Failed to read relay =%s status\n", name);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* print the results */
|
||||
stream->write_function(stream, "%s|sap=%d|type=%d|port=%d|hostname=%s|procId=%d|status=%s\n",
|
||||
name,
|
||||
g_ftdm_sngss7_data.cfg.relay[x].id,
|
||||
g_ftdm_sngss7_data.cfg.relay[x].type,
|
||||
g_ftdm_sngss7_data.cfg.relay[x].port,
|
||||
g_ftdm_sngss7_data.cfg.relay[x].hostname,
|
||||
g_ftdm_sngss7_data.cfg.relay[x].procId,
|
||||
DECODE_LRY_CHAN_STATUS(sta.t.ssta.rySta.cStatus));
|
||||
|
||||
goto success;
|
||||
}
|
||||
|
||||
/* move to the next link */
|
||||
x++;
|
||||
|
||||
} /* g_ftdm_sngss7_data.cfg.relay[x].id */
|
||||
|
||||
success:
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
static ftdm_status_t extract_span_chan(char *argv[10], int pos, int *span, int *chan)
|
||||
{
|
||||
|
||||
@@ -48,19 +48,31 @@ static int ftmod_ss7_enable_isap(int suId);
|
||||
static int ftmod_ss7_enable_nsap(int suId);
|
||||
static int ftmod_ss7_enable_mtpLinkSet(int lnkSetId);
|
||||
|
||||
int ftmod_ss7_inhibit_mtplink(uint32_t id);
|
||||
int ftmod_ss7_uninhibit_mtplink(uint32_t id);
|
||||
int ftmod_ss7_inhibit_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_uninhibit_mtp3link(uint32_t id);
|
||||
|
||||
int ftmod_ss7_activate_mtplink(uint32_t id);
|
||||
int ftmod_ss7_deactivate_mtplink(uint32_t id);
|
||||
int ftmod_ss7_deactivate2_mtplink(uint32_t id);
|
||||
int ftmod_ss7_bind_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_unbind_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_activate_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_deactivate_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_deactivate2_mtp3link(uint32_t id);
|
||||
|
||||
int ftmod_ss7_activate_mtplinkSet(uint32_t id);
|
||||
int ftmod_ss7_deactivate_mtplinkSet(uint32_t id);
|
||||
int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id);
|
||||
|
||||
int ftmod_ss7_lpo_mtplink(uint32_t id);
|
||||
int ftmod_ss7_lpr_mtplink(uint32_t id);
|
||||
int ftmod_ss7_lpo_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_lpr_mtp3link(uint32_t id);
|
||||
|
||||
int ftmod_ss7_shutdown_isup(void);
|
||||
int ftmod_ss7_shutdown_mtp3(void);
|
||||
int ftmod_ss7_shutdown_mtp2(void);
|
||||
int ftmod_ss7_shutdown_relay(void);
|
||||
|
||||
int ftmod_ss7_disable_grp_mtp3Link(uint32_t procId);
|
||||
int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId);
|
||||
|
||||
int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId);
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
@@ -71,7 +83,7 @@ int ft_to_sngss7_activate_all(void)
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isap[x].id != 0) {
|
||||
/* check if this link has already been actived */
|
||||
if (!(g_ftdm_sngss7_data.cfg.isap[x].flags & ACTIVE)) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.isap[x].flags & SNGSS7_ACTIVE)) {
|
||||
|
||||
if (ftmod_ss7_enable_isap(x)) {
|
||||
SS7_CRITICAL("ISAP %d Enable: NOT OK\n", x);
|
||||
@@ -80,9 +92,9 @@ int ft_to_sngss7_activate_all(void)
|
||||
SS7_INFO("ISAP %d Enable: OK\n", x);
|
||||
}
|
||||
|
||||
/* set the ACTIVE flag */
|
||||
g_ftdm_sngss7_data.cfg.isap[x].flags |= ACTIVE;
|
||||
} /* if !ACTIVE */
|
||||
/* set the SNGSS7_ACTIVE flag */
|
||||
g_ftdm_sngss7_data.cfg.isap[x].flags |= SNGSS7_ACTIVE;
|
||||
} /* if !SNGSS7_ACTIVE */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isap[x].id != 0) */
|
||||
@@ -90,7 +102,7 @@ int ft_to_sngss7_activate_all(void)
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.nsap[x].id != 0) {
|
||||
/* check if this link has already been actived */
|
||||
if (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & ACTIVE)) {
|
||||
if (!(g_ftdm_sngss7_data.cfg.nsap[x].flags & SNGSS7_ACTIVE)) {
|
||||
|
||||
if (ftmod_ss7_enable_nsap(x)) {
|
||||
SS7_CRITICAL("NSAP %d Enable: NOT OK\n", x);
|
||||
@@ -99,31 +111,33 @@ int ft_to_sngss7_activate_all(void)
|
||||
SS7_INFO("NSAP %d Enable: OK\n", x);
|
||||
}
|
||||
|
||||
/* set the ACTIVE flag */
|
||||
g_ftdm_sngss7_data.cfg.nsap[x].flags |= ACTIVE;
|
||||
} /* if !ACTIVE */
|
||||
/* set the SNGSS7_ACTIVE flag */
|
||||
g_ftdm_sngss7_data.cfg.nsap[x].flags |= SNGSS7_ACTIVE;
|
||||
} /* if !SNGSS7_ACTIVE */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.nsap[x].id != 0) */
|
||||
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
|
||||
/* check if this link has already been actived */
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & ACTIVE)) {
|
||||
|
||||
if (ftmod_ss7_enable_mtpLinkSet(x)) {
|
||||
SS7_CRITICAL("LinkSet \"%s\" Enable: NOT OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("LinkSet \"%s\" Enable: OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name);
|
||||
}
|
||||
|
||||
/* set the ACTIVE flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= ACTIVE;
|
||||
} /* if !ACTIVE */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) */
|
||||
if (g_ftdm_sngss7_data.cfg.mtpRoute[1].id != 0) {
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) {
|
||||
/* check if this link has already been actived */
|
||||
if (!(g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags & SNGSS7_ACTIVE)) {
|
||||
|
||||
if (ftmod_ss7_enable_mtpLinkSet(x)) {
|
||||
SS7_CRITICAL("LinkSet \"%s\" Enable: NOT OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("LinkSet \"%s\" Enable: OK\n", g_ftdm_sngss7_data.cfg.mtpLinkSet[x].name);
|
||||
}
|
||||
|
||||
/* set the SNGSS7_ACTIVE flag */
|
||||
g_ftdm_sngss7_data.cfg.mtpLinkSet[x].flags |= SNGSS7_ACTIVE;
|
||||
} /* if !SNGSS7_ACTIVE */
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.mtpLinkSet[x].id != 0) */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -223,7 +237,7 @@ static int ftmod_ss7_enable_mtpLinkSet(int lnkSetId)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_inhibit_mtplink(uint32_t id)
|
||||
int ftmod_ss7_inhibit_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
@@ -253,7 +267,7 @@ int ftmod_ss7_inhibit_mtplink(uint32_t id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_uninhibit_mtplink(uint32_t id)
|
||||
int ftmod_ss7_uninhibit_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
@@ -283,7 +297,7 @@ int ftmod_ss7_uninhibit_mtplink(uint32_t id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_activate_mtplink(uint32_t id)
|
||||
int ftmod_ss7_bind_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
@@ -304,7 +318,67 @@ int ftmod_ss7_activate_mtplink(uint32_t id)
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STDLSAP;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp3Link[id].id;
|
||||
|
||||
cntrl.t.cntrl.action = ABND; /* Activate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
|
||||
return (sng_cntrl_mtp3(&pst, &cntrl));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_unbind_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSN;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(SnMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STDLSAP;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp3Link[id].id;
|
||||
|
||||
cntrl.t.cntrl.action = AUBND_DIS; /* unbind and disable */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
|
||||
return (sng_cntrl_mtp3(&pst, &cntrl));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_activate_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSN;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(SnMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STDLSAP;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp3Link[id].id;
|
||||
|
||||
cntrl.t.cntrl.action = AENA; /* Activate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
@@ -313,7 +387,7 @@ int ftmod_ss7_activate_mtplink(uint32_t id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_deactivate_mtplink(uint32_t id)
|
||||
int ftmod_ss7_deactivate_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
@@ -334,7 +408,7 @@ int ftmod_ss7_deactivate_mtplink(uint32_t id)
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STDLSAP;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp3Link[id].id;
|
||||
|
||||
cntrl.t.cntrl.action = ADISIMM; /* Deactivate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
@@ -343,7 +417,7 @@ int ftmod_ss7_deactivate_mtplink(uint32_t id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_deactivate2_mtplink(uint32_t id)
|
||||
int ftmod_ss7_deactivate2_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
@@ -364,7 +438,7 @@ int ftmod_ss7_deactivate2_mtplink(uint32_t id)
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STDLSAP;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp3Link[id].id;
|
||||
|
||||
cntrl.t.cntrl.action = ADISIMM_L2; /* Deactivate...layer 2 only */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
@@ -463,7 +537,7 @@ int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_lpo_mtplink(uint32_t id)
|
||||
int ftmod_ss7_lpo_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
@@ -484,7 +558,7 @@ int ftmod_ss7_lpo_mtplink(uint32_t id)
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STDLSAP;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp3Link[id].id;
|
||||
|
||||
cntrl.t.cntrl.action = ACTION_LPO; /* Activate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
@@ -493,7 +567,7 @@ int ftmod_ss7_lpo_mtplink(uint32_t id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_lpr_mtplink(uint32_t id)
|
||||
int ftmod_ss7_lpr_mtp3link(uint32_t id)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
@@ -514,7 +588,7 @@ int ftmod_ss7_lpr_mtplink(uint32_t id)
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STDLSAP;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtpLink[id].id;
|
||||
cntrl.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp3Link[id].id;
|
||||
|
||||
cntrl.t.cntrl.action = ACTION_LPR; /* Activate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
@@ -523,6 +597,216 @@ int ftmod_ss7_lpr_mtplink(uint32_t id)
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_shutdown_isup(void)
|
||||
{
|
||||
SiMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSI;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(SiMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSI;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STGEN;
|
||||
|
||||
cntrl.t.cntrl.action = ASHUTDOWN; /* shutdown */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
|
||||
return (sng_cntrl_isup(&pst, &cntrl));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_shutdown_mtp3(void)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSN;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(SnMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STGEN;
|
||||
|
||||
cntrl.t.cntrl.action = ASHUTDOWN; /* Activate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
|
||||
return (sng_cntrl_mtp3(&pst, &cntrl));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_shutdown_mtp2(void)
|
||||
{
|
||||
SdMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSD;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(SdMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSD;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STGEN;
|
||||
|
||||
cntrl.t.cntrl.action = ASHUTDOWN; /* Activate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
|
||||
return (sng_cntrl_mtp2(&pst, &cntrl));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_shutdown_relay(void)
|
||||
{
|
||||
RyMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTRY;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(RyMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTRY;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STGEN;
|
||||
|
||||
cntrl.t.cntrl.action = ASHUTDOWN; /* Activate */
|
||||
cntrl.t.cntrl.subAction = SAELMNT; /* specificed element */
|
||||
|
||||
return (sng_cntrl_relay(&pst, &cntrl));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_disable_grp_mtp3Link(uint32_t procId)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSN;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(SnMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STGRDLSAP; /* group DLSAP */
|
||||
|
||||
cntrl.t.cntrl.ctlType.groupKey.dstProcId = procId; /* all SAPS to this ProcId */
|
||||
|
||||
cntrl.t.cntrl.action = AUBND_DIS; /* disable and unbind */
|
||||
cntrl.t.cntrl.subAction = SAGR_DSTPROCID; /* specificed element */
|
||||
|
||||
return (sng_cntrl_mtp3(&pst, &cntrl));
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId)
|
||||
{
|
||||
SnMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSN;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(SnMngmt));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSN;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STGRDLSAP; /* group DLSAP */
|
||||
|
||||
cntrl.t.cntrl.ctlType.groupKey.dstProcId = procId; /* all SAPS to this ProcId */
|
||||
|
||||
cntrl.t.cntrl.action = ABND_ENA; /* bind and enable */
|
||||
cntrl.t.cntrl.subAction = SAGR_DSTPROCID; /* specificed element */
|
||||
|
||||
return (sng_cntrl_mtp3(&pst, &cntrl));
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId)
|
||||
{
|
||||
SdMngmt cntrl;
|
||||
Pst pst;
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSD;
|
||||
|
||||
/* initalize the control structure */
|
||||
memset(&cntrl, 0x0, sizeof(cntrl));
|
||||
|
||||
/* initalize the control header */
|
||||
smHdrInit(&cntrl.hdr);
|
||||
|
||||
cntrl.hdr.msgType = TCNTRL; /* this is a control request */
|
||||
cntrl.hdr.entId.ent = ENTSD;
|
||||
cntrl.hdr.entId.inst = S_INST;
|
||||
cntrl.hdr.elmId.elmnt = STGRNSAP; /* group NSAP */
|
||||
|
||||
cntrl.t.cntrl.par.dstProcId = procId; /* all SAPS to this ProcId */
|
||||
|
||||
cntrl.t.cntrl.action = AUBND_DIS; /* disable and unbind */
|
||||
cntrl.t.cntrl.subAction = SAGR_DSTPROCID; /* specificed element */
|
||||
|
||||
return (sng_cntrl_mtp2(&pst, &cntrl));
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
|
||||
@@ -99,21 +99,21 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
/* lock the channel */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) {
|
||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx IAM (glare)\n", sngss7_info->circuit->cic);
|
||||
} else {
|
||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx IAM\n", sngss7_info->circuit->cic);
|
||||
}
|
||||
|
||||
/* check if the circuit has a remote block */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
|
||||
/* as per Q.764, 2.8.2.3 xiv ... remove the block from this channel */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX);
|
||||
|
||||
/* KONRAD FIX ME : check in case there is a ckt and grp block */
|
||||
}
|
||||
@@ -134,7 +134,7 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
ftdmchan->physical_chan_id);
|
||||
|
||||
/* set the flag to indicate this hangup is started from the local side */
|
||||
sngss7_set_flag(sngss7_info, FLAG_LOCAL_REL);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_LOCAL_REL);
|
||||
|
||||
ftdmchan->caller_data.hangup_cause = 41;
|
||||
|
||||
@@ -253,26 +253,26 @@ handle_glare:
|
||||
sngss7_info->glare.circuit = circuit;
|
||||
memcpy(&sngss7_info->glare.iam, siConEvnt, sizeof(*siConEvnt));
|
||||
|
||||
if (!(sngss7_test_flag(sngss7_info, FLAG_GLARE))) {
|
||||
if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE))) {
|
||||
/* glare, throw the flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GLARE);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GLARE);
|
||||
|
||||
/* setup the hangup cause */
|
||||
ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */
|
||||
|
||||
/* this is a remote hangup request */
|
||||
sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
|
||||
/* move the state of the channel to Terminating to end the call */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
} /* if (!(sngss7_test_flag(sngss7_info, FLAG_GLARE))) */
|
||||
} /* if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE))) */
|
||||
break;
|
||||
/**************************************************************************/
|
||||
default: /* should not have gotten an IAM while in this state */
|
||||
SS7_ERROR_CHAN(ftdmchan, "Got IAM on channel in invalid state(%s)...reset!\n", ftdm_channel_state2str (ftdmchan->state));
|
||||
|
||||
/* reset the cic */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_TX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
|
||||
|
||||
/* move the state of the channel to RESTART to force a reset */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
@@ -341,7 +341,7 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
ftdm_channel_state2str (ftdmchan->state));
|
||||
|
||||
/* reset the cic */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_TX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
|
||||
|
||||
/* go to RESTART */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
@@ -545,7 +545,7 @@ ftdm_status_t handle_con_cfm(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx ANM/CON\n", sngss7_info->circuit->cic);
|
||||
|
||||
/* throw the TX reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
|
||||
/* go to RESTART */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
@@ -597,7 +597,7 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
}
|
||||
|
||||
/* this is a remote hangup request */
|
||||
sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
|
||||
/* move the state of the channel to CANCEL to end the call */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
@@ -618,7 +618,7 @@ ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
|
||||
}
|
||||
|
||||
/* this is a remote hangup request */
|
||||
sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
|
||||
/* move the state of the channel to TERMINATING to end the call */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
@@ -631,7 +631,7 @@ ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
|
||||
|
||||
/* since we need to acknowledge the hang up set the flag for remote release */
|
||||
sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
|
||||
/* go to hangup complete to send the RLC */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
||||
@@ -645,7 +645,7 @@ ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
|
||||
default:
|
||||
|
||||
/* throw the reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_RX);
|
||||
|
||||
/* set the state to RESTART */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
@@ -1134,13 +1134,13 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci
|
||||
/* lock the channel */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) {
|
||||
/* the glare flag is already up so it was caught ... do nothing */
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Glare flag is already up...nothing to do!%s\n", " ");
|
||||
} else {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Glare flag is not up yet...indicating glare from reattempt!%s\n", " ");
|
||||
/* glare, throw the flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GLARE);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GLARE);
|
||||
|
||||
/* clear any existing glare data from the channel */
|
||||
memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t));
|
||||
@@ -1149,7 +1149,7 @@ ftdm_status_t handle_reattempt(uint32_t suInstId, uint32_t spInstId, uint32_t ci
|
||||
ftdmchan->caller_data.hangup_cause = 34; /* Circuit Congrestion */
|
||||
|
||||
/* this is a remote hangup request */
|
||||
sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
|
||||
|
||||
/* move the state of the channel to Terminating to end the call */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
@@ -1179,7 +1179,7 @@ ftdm_status_t handle_pause(uint32_t suInstId, uint32_t spInstId, uint32_t circui
|
||||
sngss7_set_flag(&g_ftdm_sngss7_data.cfg.isupIntf[infId], SNGSS7_PAUSED);
|
||||
|
||||
/* go through all the circuits now and find any other circuits on this infId */
|
||||
i = 1;
|
||||
i = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[i].id != 0) {
|
||||
|
||||
/* check that the infId matches and that this is not a siglink */
|
||||
@@ -1200,7 +1200,7 @@ ftdm_status_t handle_pause(uint32_t suInstId, uint32_t spInstId, uint32_t circui
|
||||
if (ftdm_test_flag(ftdmchan->span, FTDM_SPAN_IN_THREAD)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Rx PAUSE%s\n", "");
|
||||
/* set the pause flag on the channel */
|
||||
sngss7_set_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
}
|
||||
|
||||
/* unlock the channel again before we exit */
|
||||
@@ -1234,7 +1234,7 @@ ftdm_status_t handle_resume(uint32_t suInstId, uint32_t spInstId, uint32_t circu
|
||||
sngss7_clear_flag(&g_ftdm_sngss7_data.cfg.isupIntf[infId], SNGSS7_PAUSED);
|
||||
|
||||
/* go through all the circuits now and find any other circuits on this infId */
|
||||
i = 1;
|
||||
i = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[i].id != 0) {
|
||||
|
||||
/* check that the infId matches and that this is not a siglink */
|
||||
@@ -1252,14 +1252,14 @@ ftdm_status_t handle_resume(uint32_t suInstId, uint32_t spInstId, uint32_t circu
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* only resume if we are paused */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Rx RESUME%s\n", "");
|
||||
|
||||
/* set the resume flag on the channel */
|
||||
sngss7_set_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
|
||||
/* clear the paused flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
}
|
||||
|
||||
/* unlock the channel again before we exit */
|
||||
@@ -1421,12 +1421,12 @@ ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if the circuit is already blocked or not */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) {
|
||||
SS7_WARN("Received BLO on circuit that is already blocked!\n");
|
||||
}
|
||||
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -1484,15 +1484,15 @@ ftdm_status_t handle_ubl_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if the channel is blocked */
|
||||
if (!(sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX))) {
|
||||
if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX))) {
|
||||
SS7_WARN("Received UBL on circuit that is not blocked!\n");
|
||||
}
|
||||
|
||||
/* throw the unblock flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_CKT_MN_UNBLK_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_CKT_MN_UNBLK_RX);
|
||||
|
||||
/* clear the block flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -1550,7 +1550,7 @@ ftdm_status_t handle_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* throw the reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_RX);
|
||||
|
||||
switch (ftdmchan->state) {
|
||||
/**************************************************************************/
|
||||
@@ -1595,7 +1595,7 @@ ftdm_status_t handle_local_rsc_req(uint32_t suInstId, uint32_t spInstId, uint32_
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* throw the reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_RX);
|
||||
|
||||
switch (ftdmchan->state) {
|
||||
/**************************************************************************/
|
||||
@@ -1643,9 +1643,9 @@ ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
/**********************************************************************/
|
||||
case FTDM_CHANNEL_STATE_RESTART:
|
||||
|
||||
if ( sngss7_test_flag(sngss7_info, FLAG_RESET_TX) ) {
|
||||
if ( sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX) ) {
|
||||
/* throw the FLAG_RESET_TX_RSP to indicate we have acknowledgement from the remote side */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_TX_RSP);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP);
|
||||
|
||||
/* go to DOWN */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||
@@ -1667,7 +1667,7 @@ ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
|
||||
|
||||
/* throw the FLAG_RESET_TX_RSP to indicate we have acknowledgement from the remote side */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_TX_RSP);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP);
|
||||
|
||||
/* go to DOWN */
|
||||
/*ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);*/
|
||||
@@ -1795,12 +1795,12 @@ ftdm_status_t handle_local_blk(uint32_t suInstId, uint32_t spInstId, uint32_t ci
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if the circuit is already blocked or not */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX)) {
|
||||
SS7_WARN("Received local BLO on circuit that is already blocked!\n");
|
||||
}
|
||||
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -1831,12 +1831,12 @@ ftdm_status_t handle_local_ubl(uint32_t suInstId, uint32_t spInstId, uint32_t ci
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if the circuit is already blocked or not */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_CKT_LC_UNBLK_RX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_LC_UNBLK_RX)) {
|
||||
SS7_WARN("Received local UBL on circuit that is already unblocked!\n");
|
||||
}
|
||||
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_CKT_LC_UNBLK_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_CKT_LC_UNBLK_RX);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -1878,7 +1878,7 @@ ftdm_status_t handle_ucic(uint32_t suInstId, uint32_t spInstId, uint32_t circuit
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -1982,11 +1982,11 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
switch (blockType) {
|
||||
/**********************************************************************/
|
||||
case 0: /* maintenance oriented */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case 1: /* hardware failure oriented */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case 2: /* reserved for national use */
|
||||
@@ -2113,11 +2113,11 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
switch (blockType) {
|
||||
/**********************************************************************/
|
||||
case 0: /* maintenance oriented */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case 1: /* hardware failure oriented */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case 2: /* reserved for national use */
|
||||
|
||||
@@ -409,13 +409,80 @@ void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint
|
||||
sngss7_chan_data_t *sngss7_info = NULL;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
sngss7_event_data_t *sngss7_event = NULL;
|
||||
uint32_t intfId;
|
||||
int x;
|
||||
|
||||
/* get the ftdmchan and ss7_chan_data from the circuit */
|
||||
if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) {
|
||||
SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit);
|
||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
/* check if the eventType is a pause/resume */
|
||||
switch (evntType) {
|
||||
/**************************************************************************/
|
||||
case (SIT_STA_PAUSEIND):
|
||||
case (SIT_STA_RESUMEIND):
|
||||
|
||||
/* the circuit for this type of event may not exist on the local system
|
||||
* so first check if the circuit is local
|
||||
*/
|
||||
if ((circuit >= (g_ftdm_sngss7_data.cfg.procId * 1000)) &&
|
||||
(circuit < ((g_ftdm_sngss7_data.cfg.procId +1) * 1000))) {
|
||||
|
||||
/* the circuit is on the local system, handle normally */
|
||||
goto sta_ind_local;
|
||||
}
|
||||
|
||||
/* the circuit is not local, so find a local circuit with the same intfId
|
||||
* by finding the orginial circuit in our array first, finding the intfId
|
||||
* from there, then go through the local circuits to see if we find a
|
||||
* match and use that circuit instead
|
||||
*/
|
||||
intfId = g_ftdm_sngss7_data.cfg.isupCkt[circuit].infId;
|
||||
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while ((g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) &&
|
||||
(g_ftdm_sngss7_data.cfg.isupCkt[x].id < ((g_ftdm_sngss7_data.cfg.procId +1) * 1000))) {
|
||||
/**********************************************************************/
|
||||
/* confirm this is a voice channel and not a gap/sig (no ftdmchan there) */
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type != VOICE) goto move_along;
|
||||
|
||||
/* compare the intfIds */
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].infId == intfId) {
|
||||
/* we have a match, setup the pointers to the correct values */
|
||||
circuit = x;
|
||||
|
||||
if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) {
|
||||
SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit);
|
||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
|
||||
/* bounce out of the loop */
|
||||
break;
|
||||
} /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].intfId == intfId) */
|
||||
|
||||
move_along:
|
||||
/* move along ... nothing to see here */
|
||||
x++;
|
||||
|
||||
/**********************************************************************/
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
|
||||
|
||||
/* check if we found any circuits that are on the intfId, drop the message
|
||||
* if none are found
|
||||
*/
|
||||
if (ftdmchan == NULL) goto sta_ind_end;
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
default:
|
||||
sta_ind_local:
|
||||
/* get the ftdmchan and ss7_chan_data from the circuit */
|
||||
if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) {
|
||||
SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit);
|
||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
} /* switch (evntType) */
|
||||
|
||||
/* initalize the sngss7_event */
|
||||
sngss7_event = ftdm_malloc(sizeof(*sngss7_event));
|
||||
@@ -440,6 +507,7 @@ void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint
|
||||
/* enqueue this event */
|
||||
ftdm_queue_enqueue(((sngss7_span_data_t*)sngss7_info->ftdmchan->span->signal_data)->event_queue, sngss7_event);
|
||||
|
||||
sta_ind_end:
|
||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,6 +48,8 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta);
|
||||
void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta);
|
||||
void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta);
|
||||
void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta);
|
||||
void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta);
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
@@ -77,8 +79,8 @@ void handle_sng_log(uint8_t level, char *fmt,...)
|
||||
ftdm_log(FTDM_LOG_INFO, "sng_ss7->%s", data);
|
||||
break;
|
||||
/**************************************************************************/
|
||||
case SNG_LOGLEVEL_STATS:
|
||||
ftdm_log(FTDM_LOG_INFO, "sng_ss7->%s", data);
|
||||
case SNG_LOGLEVEL_NOTICE:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "sng_ss7->%s", data);
|
||||
break;
|
||||
/**************************************************************************/
|
||||
case SNG_LOGLEVEL_ERROR:
|
||||
@@ -132,17 +134,17 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
||||
|
||||
/* find the name for the sap in question */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == sta->t.usta.evntParm[0]) {
|
||||
while (g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == sta->t.usta.evntParm[0]) {
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == 0) {
|
||||
sprintf(buf, "[SAPID:%d]", sta->t.usta.evntParm[0]);
|
||||
} else {
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtpLink[x].name);
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name);
|
||||
}
|
||||
|
||||
|
||||
@@ -173,17 +175,17 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
||||
|
||||
/* find the name for the sap in question */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == sta->t.usta.evntParm[0]) {
|
||||
while (g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == sta->t.usta.evntParm[0]) {
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == 0) {
|
||||
sprintf(buf, "[SAPID:%d]", sta->t.usta.evntParm[0]);
|
||||
} else {
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtpLink[x].name);
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name);
|
||||
}
|
||||
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %s\n",
|
||||
@@ -196,17 +198,17 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
||||
|
||||
/* find the name for the sap in question */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == sta->t.usta.evntParm[0]) {
|
||||
while (g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == sta->t.usta.evntParm[0]) {
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == 0) {
|
||||
sprintf(buf, "[SAPID:%d]", sta->t.usta.evntParm[0]);
|
||||
} else {
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtpLink[x].name);
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name);
|
||||
}
|
||||
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %s\n",
|
||||
@@ -220,17 +222,17 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
||||
|
||||
/* find the name for the sap in question */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == sta->t.usta.evntParm[0]) {
|
||||
while (g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == sta->t.usta.evntParm[0]) {
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == 0) {
|
||||
sprintf(buf, "[SAPID:%d]", sta->t.usta.evntParm[0]);
|
||||
} else {
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtpLink[x].name);
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name);
|
||||
}
|
||||
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : RTB Queue Len(%d)|Oldest BSN(%d)|Tx Queue Len(%d)|Outstanding Frames(%d)\n",
|
||||
@@ -246,17 +248,17 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
||||
|
||||
/* find the name for the sap in question */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == sta->t.usta.evntParm[0]) {
|
||||
while (g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == sta->t.usta.evntParm[0]) {
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == 0) {
|
||||
sprintf(buf, "[SAPID:%d]", sta->t.usta.evntParm[0]);
|
||||
} else {
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtpLink[x].name);
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name);
|
||||
}
|
||||
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : RTB Queue Len(%d)\n",
|
||||
@@ -269,17 +271,17 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
||||
|
||||
/* find the name for the sap in question */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == sta->t.usta.evntParm[0]) {
|
||||
while (g_ftdm_sngss7_data.cfg.mtp2Link[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == sta->t.usta.evntParm[0]) {
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp2Link[x].id == 0) {
|
||||
sprintf(buf, "[SAPID:%d]", sta->t.usta.evntParm[0]);
|
||||
} else {
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtpLink[x].name);
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp2Link[x].name);
|
||||
}
|
||||
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2]%s %s : %d\n",
|
||||
@@ -290,9 +292,11 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta)
|
||||
/**********************************************************************/
|
||||
case (LCM_EVENT_UI_INV_EVT):
|
||||
case (LCM_EVENT_LI_INV_EVT):
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2] %s : %s : Primitive (%d)\n",
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP2] %s(%d) : %s(%d) : Primitive (%d)\n",
|
||||
DECODE_LSD_EVENT(sta->t.usta.alarm.event),
|
||||
sta->t.usta.alarm.event,
|
||||
DECODE_LCM_CAUSE(sta->t.usta.alarm.cause),
|
||||
sta->t.usta.alarm.cause,
|
||||
sta->t.usta.evntParm[0]);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
@@ -362,22 +366,23 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta)
|
||||
|
||||
/* find the name for the sap in question */
|
||||
x = 1;
|
||||
while (g_ftdm_sngss7_data.cfg.mtpLink[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == sta->hdr.elmId.elmntInst1) {
|
||||
while (g_ftdm_sngss7_data.cfg.mtp3Link[x].id != 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp3Link[x].id == sta->hdr.elmId.elmntInst1) {
|
||||
break;
|
||||
}
|
||||
x++;
|
||||
}
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.mtpLink[x].id == 0) {
|
||||
if (g_ftdm_sngss7_data.cfg.mtp3Link[x].id == 0) {
|
||||
sprintf(buf, "[SAPID:%d]", sta->hdr.elmId.elmntInst1);
|
||||
} else {
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtpLink[x].name);
|
||||
sprintf(buf, "[%s]", g_ftdm_sngss7_data.cfg.mtp3Link[x].name);
|
||||
}
|
||||
|
||||
switch (sta->t.usta.alarm.event) {
|
||||
/**********************************************************************/
|
||||
case (LSN_EVENT_INV_OPC_OTHER_END):
|
||||
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP3]%s %s : %s : OPC(0x%X%X%X%X)\n",
|
||||
buf,
|
||||
DECODE_LSN_EVENT(sta->t.usta.alarm.event),
|
||||
@@ -460,7 +465,7 @@ void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta)
|
||||
break;
|
||||
/**********************************************************************/
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP3][DPC:0x%d%d%d%d] %s : %s\n",
|
||||
ftdm_log(FTDM_LOG_ERROR,"[MTP3][DPC:0x%X%X%X%X] %s : %s\n",
|
||||
sta->t.usta.evntParm[0],
|
||||
sta->t.usta.evntParm[1],
|
||||
sta->t.usta.evntParm[2],
|
||||
@@ -744,7 +749,63 @@ void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta)
|
||||
|
||||
return;
|
||||
} /* handle_cc_alarm */
|
||||
|
||||
/******************************************************************************/
|
||||
void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta)
|
||||
{
|
||||
|
||||
|
||||
switch (sta->hdr.elmId.elmnt) {
|
||||
/**************************************************************************/
|
||||
case (LRY_USTA_ERR): /* ERROR */
|
||||
ftdm_log(FTDM_LOG_ERROR,"[RELAY] Error: tx procId %d: err procId %d: channel %d: seq %s: reason %s\n",
|
||||
sta->t.usta.s.ryErrUsta.sendPid,
|
||||
sta->t.usta.s.ryErrUsta.errPid,
|
||||
sta->t.usta.s.ryErrUsta.id,
|
||||
DECODE_LRY_SEQ(sta->t.usta.s.ryErrUsta.sequence),
|
||||
DECODE_LRY_REASON(sta->t.usta.s.ryErrUsta.reason));
|
||||
|
||||
/* process the event */
|
||||
handle_relay_disconnect_on_error(sta);
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
case (LRY_USTA_CNG): /* Congestion */
|
||||
ftdm_log(FTDM_LOG_ERROR,"[RELAY] Congestion: tx procId %d: rem procId %d: channel %d: %s\n",
|
||||
sta->t.usta.s.ryCongUsta.sendPid,
|
||||
sta->t.usta.s.ryCongUsta.remPid,
|
||||
sta->t.usta.s.ryCongUsta.id,
|
||||
DECODE_LRY_CONG_FLAGS(sta->t.usta.s.ryCongUsta.flags));
|
||||
break;
|
||||
/**************************************************************************/
|
||||
case (LRY_USTA_UP): /* channel up */
|
||||
ftdm_log(FTDM_LOG_ERROR,"[RELAY] Channel UP: tx procId %d: channel %d\n",
|
||||
sta->t.usta.s.ryUpUsta.sendPid,
|
||||
sta->t.usta.s.ryUpUsta.id);
|
||||
|
||||
/* process the event */
|
||||
handle_relay_connect(sta);
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
case (LRY_USTA_DN): /* channel down */
|
||||
ftdm_log(FTDM_LOG_ERROR,"[RELAY] Channel DOWN: tx procId %d: channel %d\n",
|
||||
sta->t.usta.s.ryUpUsta.sendPid,
|
||||
sta->t.usta.s.ryUpUsta.id);
|
||||
|
||||
/* process the event */
|
||||
handle_relay_disconnect_on_down(sta);
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_ERROR,"Unknown Relay Alram\n");
|
||||
break;
|
||||
/**************************************************************************/
|
||||
} /* switch (sta->hdr.elmId.elmnt) */
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
|
||||
@@ -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 */
|
||||
@@ -495,8 +512,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
/**************************************************************************/
|
||||
case FTDM_CHANNEL_STATE_COLLECT: /* IAM received but wating on digits */
|
||||
|
||||
isup_intf = &g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId];
|
||||
|
||||
if (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) {
|
||||
SS7_DEBUG("re-entering state from processing block/unblock request ... do nothing\n");
|
||||
break;
|
||||
@@ -516,8 +531,8 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
/*now go to the RING state */
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING);
|
||||
|
||||
} else if (i >= isup_intf->min_digits) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, isup_intf->min_digits);
|
||||
} else if (i >= sngss7_info->circuit->min_digits) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, sngss7_info->circuit->min_digits);
|
||||
|
||||
/*now go to the RING state */
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING);
|
||||
@@ -527,7 +542,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) {
|
||||
SS7_INFO_CHAN(ftdmchan,"Received %d out of %d so far: %s...starting T35\n",
|
||||
i,
|
||||
isup_intf->min_digits,
|
||||
sngss7_info->circuit->min_digits,
|
||||
ftdmchan->caller_data.dnis.digits);
|
||||
|
||||
/* start ISUP t35 */
|
||||
@@ -543,7 +558,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
ftdmchan->caller_data.hangup_cause = 41;
|
||||
|
||||
/* set the flag to indicate this hangup is started from the local side */
|
||||
sngss7_set_flag (sngss7_info, FLAG_LOCAL_REL);
|
||||
sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL);
|
||||
|
||||
/* end the call */
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_CANCEL);
|
||||
@@ -673,7 +688,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
}
|
||||
|
||||
/* set the flag to indicate this hangup is started from the remote side */
|
||||
sngss7_set_flag (sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_set_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
|
||||
|
||||
/*this state is set when the line is hanging up */
|
||||
sigev.event_id = FTDM_SIGEVENT_STOP;
|
||||
@@ -689,15 +704,15 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
}
|
||||
|
||||
/* check for remote hangup flag */
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_REMOTE_REL)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) {
|
||||
/* remote release ...do nothing here */
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Hanging up remotely requested call!%s\n", "");
|
||||
} else if (sngss7_test_flag (sngss7_info, FLAG_GLARE)) {
|
||||
} else if (sngss7_test_ckt_flag (sngss7_info, FLAG_GLARE)) {
|
||||
/* release due to glare */
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Hanging up requested call do to glare%s\n", "");
|
||||
} else {
|
||||
/* set the flag to indicate this hangup is started from the local side */
|
||||
sngss7_set_flag (sngss7_info, FLAG_LOCAL_REL);
|
||||
sngss7_set_ckt_flag (sngss7_info, FLAG_LOCAL_REL);
|
||||
|
||||
/*this state is set when FS is hanging up...so tell the stack */
|
||||
ft_to_sngss7_rel (ftdmchan);
|
||||
@@ -718,16 +733,16 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
break;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_REMOTE_REL)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) {
|
||||
/* check if this hangup is from a tx RSC */
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_RESET_TX)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) {
|
||||
/* go to RESTART State until RSCa is received */
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
} else {
|
||||
/* if the hangup is from a rx RSC, rx GRS, or glare don't sent RLC */
|
||||
if (!(sngss7_test_flag(sngss7_info, FLAG_RESET_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GLARE))) {
|
||||
if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE))) {
|
||||
|
||||
/* send out the release complete */
|
||||
ft_to_sngss7_rlc (ftdmchan);
|
||||
@@ -738,17 +753,17 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
}
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Completing remotely requested hangup!%s\n", "");
|
||||
} else if (sngss7_test_flag (sngss7_info, FLAG_LOCAL_REL)) {
|
||||
} else if (sngss7_test_ckt_flag (sngss7_info, FLAG_LOCAL_REL)) {
|
||||
|
||||
/* if this hang up is do to a rx RESET we need to sit here till the RSP arrives */
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_RESET_TX_RSP)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX_RSP)) {
|
||||
/* go to the down state as we have already received RSC-RLC */
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||
}
|
||||
|
||||
/* if it's a local release the user sends us to down */
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Completing locally requested hangup!%s\n", "");
|
||||
} else if (sngss7_test_flag (sngss7_info, FLAG_GLARE)) {
|
||||
} else if (sngss7_test_ckt_flag (sngss7_info, FLAG_GLARE)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Completing requested hangup due to glare!%s\n", "");
|
||||
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||
@@ -767,18 +782,18 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
}
|
||||
|
||||
/* check if there is a reset response that needs to be sent */
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_RESET_RX)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_RX)) {
|
||||
/* send a RSC-RLC */
|
||||
ft_to_sngss7_rsca (ftdmchan);
|
||||
|
||||
/* clear the reset flag */
|
||||
clear_rx_rsc_flags(sngss7_info);
|
||||
} /* if (sngss7_test_flag (sngss7_info, FLAG_RESET_RX)) */
|
||||
} /* if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_RX)) */
|
||||
|
||||
/* check if there was a GRS that needs a GRA */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX)) &&
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) &&
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT))) {
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX)) &&
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) &&
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT))) {
|
||||
|
||||
/* check if this is the base circuit and send out the GRA
|
||||
* we insure that this is the last circuit to have the state change queued
|
||||
@@ -794,40 +809,40 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
|
||||
/* clear the grp reset flag */
|
||||
clear_rx_grs_flags(sngss7_info);
|
||||
}/* if ( sngss7_test_flag ( sngss7_info, FLAG_GRP_RESET_RX ) ) */
|
||||
}/* if ( sngss7_test_ckt_flag ( sngss7_info, FLAG_GRP_RESET_RX ) ) */
|
||||
|
||||
/* check if we got the reset response */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_RESET_TX_RSP)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP)) {
|
||||
/* clear the reset flag */
|
||||
clear_tx_rsc_flags(sngss7_info);
|
||||
} /* if (sngss7_test_flag(sngss7_info, FLAG_RESET_TX_RSP)) */
|
||||
} /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP)) */
|
||||
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) {
|
||||
/* clear the reset flag */
|
||||
clear_tx_grs_flags(sngss7_info);
|
||||
|
||||
/* clean out the spans GRA structure */
|
||||
clear_rx_gra_data(sngss7_info);
|
||||
} /* if (sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) */
|
||||
} /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) */
|
||||
|
||||
/* check if we came from reset (aka we just processed a reset) */
|
||||
if ((ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART) ||
|
||||
(ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED)) {
|
||||
|
||||
/* check if reset flags are up indicating there is more processing to do yet */
|
||||
if (!(sngss7_test_flag (sngss7_info, FLAG_RESET_TX)) &&
|
||||
!(sngss7_test_flag (sngss7_info, FLAG_RESET_RX)) &&
|
||||
!(sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_TX)) &&
|
||||
!(sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_RX))) {
|
||||
if (!(sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) &&
|
||||
!(sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_RX)) &&
|
||||
!(sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_TX)) &&
|
||||
!(sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_RX))) {
|
||||
|
||||
/* now check if there is an active block */
|
||||
if (!(sngss7_test_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
if (!(sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_LC_BLOCK_RX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
|
||||
/* check if the sig status is down, and bring it up if it isn't */
|
||||
if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) {
|
||||
@@ -839,7 +854,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
} /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */
|
||||
} /* if !blocked */
|
||||
} else {
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->flags);
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Reset flags present (0x%X)\n", sngss7_info->ckt_flags);
|
||||
|
||||
/* there is still another reset pending so go back to reset*/
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
@@ -858,8 +873,8 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
sngss7_info->spId = 0;
|
||||
|
||||
/* clear any call related flags */
|
||||
sngss7_clear_flag (sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_clear_flag (sngss7_info, FLAG_LOCAL_REL);
|
||||
sngss7_clear_ckt_flag (sngss7_info, FLAG_REMOTE_REL);
|
||||
sngss7_clear_ckt_flag (sngss7_info, FLAG_LOCAL_REL);
|
||||
|
||||
|
||||
if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) {
|
||||
@@ -869,10 +884,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
} /* if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_OPEN)) */
|
||||
|
||||
/* check if there is a glared call that needs to be processed */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) {
|
||||
|
||||
/* clear the glare flag */
|
||||
sngss7_clear_flag (sngss7_info, FLAG_GLARE);
|
||||
sngss7_clear_ckt_flag (sngss7_info, FLAG_GLARE);
|
||||
|
||||
/* check if we have an IAM stored...if we don't have one just exit */
|
||||
if (sngss7_info->glare.circuit != 0) {
|
||||
@@ -885,23 +900,23 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
/* clear the glare info */
|
||||
memset(&sngss7_info->glare, 0x0, sizeof(sngss7_glare_data_t));
|
||||
} /* if (sngss7_info->glare.circuit != 0) */
|
||||
} /* if (sngss7_test_flag(sngss7_info, FLAG_GLARE)) */
|
||||
} /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_GLARE)) */
|
||||
|
||||
break;
|
||||
/**************************************************************************/
|
||||
case FTDM_CHANNEL_STATE_RESTART: /* CICs needs a Reset */
|
||||
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK)) {
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_RESET_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX))) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK)) {
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_RX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX))) {
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Incoming Reset request on CIC in UCIC block, removing UCIC block%s\n", "");
|
||||
|
||||
/* set the unblk flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_CKT_UCIC_UNBLK);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_CKT_UCIC_UNBLK);
|
||||
|
||||
/* clear the block flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
|
||||
/* process the flag */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -915,28 +930,28 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
* we can also check if we are in a PAUSED state (no point in sending message
|
||||
*/
|
||||
if ((ftdmchan->last_state != FTDM_CHANNEL_STATE_HANGUP_COMPLETE) &&
|
||||
(!sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED))) {
|
||||
(!sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED))) {
|
||||
|
||||
/* check if this is an outgoing RSC */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_RESET_TX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_RESET_SENT))) {
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_SENT))) {
|
||||
|
||||
/* send a reset request */
|
||||
ft_to_sngss7_rsc (ftdmchan);
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_SENT);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_SENT);
|
||||
|
||||
} /* if (sngss7_test_flag(sngss7_info, FLAG_RESET_TX)) */
|
||||
} /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_RESET_TX)) */
|
||||
|
||||
/* check if this is the first channel of a GRS (this flag is thrown when requesting reset) */
|
||||
if ( (sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_TX)) &&
|
||||
!(sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_SENT)) &&
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_BASE))) {
|
||||
if ( (sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_TX)) &&
|
||||
!(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_SENT)) &&
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_BASE))) {
|
||||
|
||||
/* send out the grs */
|
||||
ft_to_sngss7_grs (ftdmchan);
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_SENT);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_SENT);
|
||||
|
||||
}/* if ( sngss7_test_flag ( sngss7_info, FLAG_GRP_RESET_TX ) ) */
|
||||
}/* if ( sngss7_test_ckt_flag ( sngss7_info, FLAG_GRP_RESET_TX ) ) */
|
||||
} /* if ( last_state != HANGUP && !PAUSED */
|
||||
|
||||
/* if the sig_status is up...bring it down */
|
||||
@@ -946,10 +961,10 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
ftdm_span_send_signal (ftdmchan->span, &sigev);
|
||||
}
|
||||
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_RX)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_RX)) {
|
||||
/* set the grp reset done flag so we know we have finished this reset */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_RX_DN);
|
||||
} /* if (sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_RX)) */
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_DN);
|
||||
} /* if (sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_RX)) */
|
||||
|
||||
|
||||
if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_INUSE)) {
|
||||
@@ -987,17 +1002,17 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
} /* switch (ftdmchan->last_state) */
|
||||
} else {
|
||||
/* check if this an incoming RSC or we have a response already */
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_RESET_RX) ||
|
||||
sngss7_test_flag (sngss7_info, FLAG_RESET_TX_RSP) ||
|
||||
sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_TX_RSP) ||
|
||||
sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_RX_CMPLT)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_RX) ||
|
||||
sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX_RSP) ||
|
||||
sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_TX_RSP) ||
|
||||
sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_RX_CMPLT)) {
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Reset processed moving to DOWN (0x%X)\n", sngss7_info->flags);
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Reset processed moving to DOWN (0x%X)\n", sngss7_info->ckt_flags);
|
||||
|
||||
/* go to a down state to clear the channel and send the response */
|
||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||
} else {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Waiting on Reset Rsp/Grp Reset to move to DOWN (0x%X)\n", sngss7_info->flags);
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Waiting on Reset Rsp/Grp Reset to move to DOWN (0x%X)\n", sngss7_info->ckt_flags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1005,20 +1020,20 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
/**************************************************************************/
|
||||
case FTDM_CHANNEL_STATE_SUSPENDED: /* circuit has been blocked */
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Current flags: 0x%X\n", sngss7_info->flags);
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Current flags: 0x%X\n", sngss7_info->ckt_flags);
|
||||
|
||||
/**********************************************************************/
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_INFID_RESUME)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing RESUME%s\n", "");
|
||||
|
||||
/* clear the RESUME flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
|
||||
/* if there are any resets present */
|
||||
if ((sngss7_test_flag (sngss7_info, FLAG_RESET_TX)) ||
|
||||
(sngss7_test_flag (sngss7_info, FLAG_RESET_RX)) ||
|
||||
(sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_TX)) ||
|
||||
(sngss7_test_flag (sngss7_info, FLAG_GRP_RESET_RX))) {
|
||||
if ((sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_TX)) ||
|
||||
(sngss7_test_ckt_flag (sngss7_info, FLAG_RESET_RX)) ||
|
||||
(sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_TX)) ||
|
||||
(sngss7_test_ckt_flag (sngss7_info, FLAG_GRP_RESET_RX))) {
|
||||
|
||||
/* go back to the reset state */
|
||||
goto suspend_goto_restart;
|
||||
@@ -1034,7 +1049,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
goto suspend_goto_last;
|
||||
} /* if (sngss7_test_flag(sngss7_info, FLAG_INFID_RESUME)) */
|
||||
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing PAUSE%s\n", "");
|
||||
|
||||
/* bring the sig status down */
|
||||
@@ -1044,9 +1059,9 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
|
||||
/* go back to the last state */
|
||||
goto suspend_goto_last;
|
||||
} /* if (sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED)) { */
|
||||
} /* if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) { */
|
||||
/**********************************************************************/
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_MN_BLOCK_RX)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_MN_BLOCK_RX)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_MN_BLOCK_RX flag %s\n", "");
|
||||
|
||||
/* bring the sig status down */
|
||||
@@ -1061,11 +1076,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
goto suspend_goto_last;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX)){
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX)){
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_MN_UNBLK_RX flag %s\n", "");
|
||||
|
||||
/* clear the unblock flag */
|
||||
sngss7_clear_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX);
|
||||
sngss7_clear_ckt_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX);
|
||||
|
||||
/* bring the sig status up */
|
||||
sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
|
||||
@@ -1080,7 +1095,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_MN_BLOCK_TX)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_MN_BLOCK_TX)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_MN_BLOCK_TX flag %s\n", "");
|
||||
|
||||
/* bring the sig status down */
|
||||
@@ -1095,11 +1110,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
goto suspend_goto_last;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_MN_UNBLK_TX)){
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_MN_UNBLK_TX)){
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_MN_UNBLK_TX flag %s\n", "");
|
||||
|
||||
/* clear the unblock flag */
|
||||
sngss7_clear_flag (sngss7_info, FLAG_CKT_MN_UNBLK_TX);
|
||||
sngss7_clear_ckt_flag (sngss7_info, FLAG_CKT_MN_UNBLK_TX);
|
||||
|
||||
/* bring the sig status up */
|
||||
sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
|
||||
@@ -1114,7 +1129,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_LC_BLOCK_RX)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_LC_BLOCK_RX)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_LC_BLOCK_RX flag %s\n", "");
|
||||
|
||||
/* send a BLA */
|
||||
@@ -1124,11 +1139,11 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
goto suspend_goto_last;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_LC_UNBLK_RX)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_LC_UNBLK_RX)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_LC_UNBLK_RX flag %s\n", "");
|
||||
|
||||
/* clear the unblock flag */
|
||||
sngss7_clear_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX);
|
||||
sngss7_clear_ckt_flag (sngss7_info, FLAG_CKT_MN_UNBLK_RX);
|
||||
|
||||
/* send a uba */
|
||||
/*ft_to_sngss7_uba(ftdmchan);*/
|
||||
@@ -1137,7 +1152,7 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
goto suspend_goto_last;
|
||||
}
|
||||
/**********************************************************************/
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_UCIC_BLOCK)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_UCIC_BLOCK)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_UCIC_BLOCK flag %s\n", "");
|
||||
|
||||
/* bring the channel signaling status to down */
|
||||
@@ -1157,17 +1172,17 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
goto suspend_goto_last;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag (sngss7_info, FLAG_CKT_UCIC_UNBLK)) {
|
||||
if (sngss7_test_ckt_flag (sngss7_info, FLAG_CKT_UCIC_UNBLK)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Processing CKT_UCIC_UNBLK flag %s\n", "");;
|
||||
|
||||
/* remove the UCIC block flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
|
||||
/* remove the UCIC unblock flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_CKT_UCIC_UNBLK);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_CKT_UCIC_UNBLK);
|
||||
|
||||
/* throw the channel into reset to sync states */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_TX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
|
||||
|
||||
/* bring the channel into restart again */
|
||||
goto suspend_goto_restart;
|
||||
@@ -1232,9 +1247,9 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call)
|
||||
}
|
||||
|
||||
/* check if there is a remote block */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_RX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
|
||||
/* the channel is blocked...can't send any calls here */
|
||||
SS7_ERROR_CHAN(ftdmchan, "Requested channel is remotely blocked, re-hunt channel!%s\n", " ");
|
||||
@@ -1242,9 +1257,9 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call)
|
||||
}
|
||||
|
||||
/* check if there is a local block */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_HW_BLOCK_TX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_TX))) {
|
||||
|
||||
/* KONRAD FIX ME : we should check if this is a TEST call and allow it */
|
||||
|
||||
@@ -1339,48 +1354,6 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span)
|
||||
|
||||
SS7_INFO ("Starting span %s:%u.\n", span->name, span->span_id);
|
||||
|
||||
/* throw the channels in pause */
|
||||
for (x = 1; x < (span->chan_count + 1); x++) {
|
||||
/* extract the channel structure and sngss7 channel data */
|
||||
ftdmchan = span->channels[x];
|
||||
if (ftdmchan->call_data == NULL) continue;
|
||||
sngss7_info = ftdmchan->call_data;
|
||||
sngss7_span = ftdmchan->span->signal_data;
|
||||
sngss7_intf = &g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId];
|
||||
|
||||
|
||||
/* lock the channel */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if the interface is paused or resumed */
|
||||
if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) {
|
||||
/* throw the pause flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
sngss7_set_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
} else {
|
||||
/* throw the pause flag */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
sngss7_set_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
}
|
||||
#if 0
|
||||
/* throw the grp reset flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
if (x == 1) {
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_span->tx_grs.circuit = sngss7_info->circuit->id;
|
||||
sngss7_span->tx_grs.range = span->chan_count -1;
|
||||
}
|
||||
#else
|
||||
/* throw the channel into reset */
|
||||
sngss7_set_flag(sngss7_info, FLAG_RESET_TX);
|
||||
#endif
|
||||
/* throw the channel to suspend */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
|
||||
/* unlock the channel */
|
||||
ftdm_mutex_unlock(ftdmchan->mutex);
|
||||
}
|
||||
|
||||
/* clear the monitor thread stop flag */
|
||||
ftdm_clear_flag (span, FTDM_SPAN_STOP_THREAD);
|
||||
ftdm_clear_flag (span, FTDM_SPAN_IN_THREAD);
|
||||
@@ -1397,6 +1370,52 @@ static ftdm_status_t ftdm_sangoma_ss7_start(ftdm_span_t * span)
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
/* confirm the state of all isup interfaces*/
|
||||
check_status_of_all_isup_intf();
|
||||
|
||||
/* throw the channels in pause */
|
||||
for (x = 1; x < (span->chan_count + 1); x++) {
|
||||
/* extract the channel structure and sngss7 channel data */
|
||||
ftdmchan = span->channels[x];
|
||||
if (ftdmchan->call_data == NULL) continue;
|
||||
sngss7_info = ftdmchan->call_data;
|
||||
sngss7_span = ftdmchan->span->signal_data;
|
||||
sngss7_intf = &g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId];
|
||||
|
||||
/* lock the channel */
|
||||
ftdm_mutex_lock(ftdmchan->mutex);
|
||||
|
||||
/* check if the interface is paused or resumed */
|
||||
if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "ISUP intf %d is PAUSED\n", sngss7_intf->id);
|
||||
/* throw the pause flag */
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
} else {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "ISUP intf %d is RESUMED\n", sngss7_intf->id);
|
||||
/* throw the resume flag */
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
}
|
||||
#if 0
|
||||
/* throw the grp reset flag */
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
if (x == 1) {
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_span->tx_grs.circuit = sngss7_info->circuit->id;
|
||||
sngss7_span->tx_grs.range = span->chan_count -1;
|
||||
}
|
||||
#else
|
||||
/* throw the channel into reset */
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RESET_TX);
|
||||
#endif
|
||||
/* throw the channel to suspend */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
|
||||
/* unlock the channel */
|
||||
ftdm_mutex_unlock(ftdmchan->mutex);
|
||||
}
|
||||
|
||||
SS7_DEBUG ("Finished starting span %s:%u.\n", span->name, span->span_id);
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
@@ -1537,7 +1556,6 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init)
|
||||
sng_event.cc.sng_umsg_ind = sngss7_umsg_ind;
|
||||
sng_event.cc.sng_susp_ind = sngss7_susp_ind;
|
||||
sng_event.cc.sng_resm_ind = sngss7_resm_ind;
|
||||
sng_event.cc.sng_ssp_sta_cfm = sngss7_ssp_sta_cfm;
|
||||
|
||||
sng_event.sm.sng_log = handle_sng_log;
|
||||
sng_event.sm.sng_mtp1_alarm = handle_sng_mtp1_alarm;
|
||||
@@ -1545,9 +1563,10 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init)
|
||||
sng_event.sm.sng_mtp3_alarm = handle_sng_mtp3_alarm;
|
||||
sng_event.sm.sng_isup_alarm = handle_sng_isup_alarm;
|
||||
sng_event.sm.sng_cc_alarm = handle_sng_cc_alarm;
|
||||
sng_event.sm.sng_relay_alarm = handle_sng_relay_alarm;
|
||||
|
||||
/* initalize sng_ss7 library */
|
||||
sng_isup_init (&sng_event);
|
||||
sng_isup_init_gen(&sng_event);
|
||||
|
||||
/* print the version of the library being used */
|
||||
sng_isup_version(&major, &minor, &build);
|
||||
@@ -1566,7 +1585,41 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_ss7_unload)
|
||||
|
||||
ftdm_log (FTDM_LOG_INFO, "Starting ftmod_sangoma_ss7 unload...\n");
|
||||
|
||||
sng_isup_free();
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC)) {
|
||||
sng_isup_free_cc();
|
||||
sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_CC);
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP)) {
|
||||
ftmod_ss7_shutdown_isup();
|
||||
sng_isup_free_isup();
|
||||
sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_ISUP);
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3)) {
|
||||
ftmod_ss7_shutdown_mtp3();
|
||||
sng_isup_free_mtp3();
|
||||
sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP3);
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) {
|
||||
ftmod_ss7_shutdown_mtp2();
|
||||
sng_isup_free_mtp2();
|
||||
sng_isup_free_mtp1();
|
||||
sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2);
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY)) {
|
||||
ftmod_ss7_shutdown_relay();
|
||||
sng_isup_free_relay();
|
||||
sngss7_clear_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_RY);
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_SM)) {
|
||||
sng_isup_free_sm();
|
||||
}
|
||||
|
||||
sng_isup_free_gen();
|
||||
|
||||
ftdm_log (FTDM_LOG_INFO, "Finished ftmod_sangoma_ss7 unload!\n");
|
||||
return FTDM_SUCCESS;
|
||||
|
||||
@@ -83,10 +83,9 @@ typedef enum {
|
||||
} sng_ckt_type_t;
|
||||
|
||||
typedef enum {
|
||||
CONFIGURED = (1 << 0),
|
||||
ACTIVE = (1 << 1),
|
||||
SNGSS7_PAUSED = (1 << 7)
|
||||
} sng_flag_t;
|
||||
SNG_RTE_UP = 0,
|
||||
SNG_RTE_DN
|
||||
} sng_route_direction_t;
|
||||
|
||||
typedef enum {
|
||||
SNGSS7_LPA_FOR_COT = (1 << 0), /* send LPA when COT arrives */
|
||||
@@ -98,84 +97,124 @@ typedef enum {
|
||||
SNG_CALLING = 2
|
||||
} sng_addr_type_t;
|
||||
|
||||
typedef struct sng_mtp_link {
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t id;
|
||||
uint32_t flags;
|
||||
struct {
|
||||
uint32_t span;
|
||||
uint32_t chan;
|
||||
} mtp1;
|
||||
struct {
|
||||
uint32_t lssuLength;
|
||||
uint32_t errorType;
|
||||
uint32_t linkType;
|
||||
uint32_t mtp1Id;
|
||||
uint32_t t1;
|
||||
uint32_t t2;
|
||||
uint32_t t3;
|
||||
uint32_t t4n;
|
||||
uint32_t t4e;
|
||||
uint32_t t5;
|
||||
uint32_t t6;
|
||||
uint32_t t7;
|
||||
} mtp2;
|
||||
struct {
|
||||
uint32_t priority;
|
||||
uint32_t linkType;
|
||||
uint32_t switchType;
|
||||
uint32_t apc;
|
||||
uint32_t spc;
|
||||
uint32_t ssf;
|
||||
uint32_t slc;
|
||||
uint32_t linkSetId;
|
||||
uint32_t mtp2Id;
|
||||
uint32_t t1;
|
||||
uint32_t t2;
|
||||
uint32_t t3;
|
||||
uint32_t t4;
|
||||
uint32_t t5;
|
||||
uint32_t t6;
|
||||
uint32_t t7;
|
||||
uint32_t t8;
|
||||
uint32_t t9;
|
||||
uint32_t t10;
|
||||
uint32_t t11;
|
||||
uint32_t t12;
|
||||
uint32_t t13;
|
||||
uint32_t t14;
|
||||
uint32_t t15;
|
||||
uint32_t t16;
|
||||
uint32_t t17;
|
||||
uint32_t t18;
|
||||
uint32_t t19;
|
||||
uint32_t t20;
|
||||
uint32_t t21;
|
||||
uint32_t t22;
|
||||
uint32_t t23;
|
||||
uint32_t t24;
|
||||
uint32_t t25;
|
||||
uint32_t t27;
|
||||
uint32_t t28;
|
||||
uint32_t t29;
|
||||
uint32_t t30;
|
||||
uint32_t t31;
|
||||
uint32_t t32;
|
||||
uint32_t t33;
|
||||
uint32_t t34;
|
||||
uint32_t t35;
|
||||
uint32_t t36;
|
||||
uint32_t t37;
|
||||
uint32_t tcraft;
|
||||
uint32_t tflc;
|
||||
uint32_t tbnd;
|
||||
} mtp3;
|
||||
} sng_mtp_link_t;
|
||||
typedef struct sng_mtp2_error_type {
|
||||
int init;
|
||||
char sng_type[MAX_NAME_LEN];
|
||||
uint32_t tril_type;
|
||||
} sng_mtp2_error_type_t;
|
||||
|
||||
typedef struct sng_link_type {
|
||||
int init;
|
||||
char sng_type[MAX_NAME_LEN];
|
||||
uint32_t tril_mtp2_type;
|
||||
uint32_t tril_mtp3_type;
|
||||
} sng_link_type_t;
|
||||
|
||||
typedef struct sng_switch_type {
|
||||
int init;
|
||||
char sng_type[MAX_NAME_LEN];
|
||||
uint32_t tril_mtp3_type;
|
||||
uint32_t tril_isup_type;
|
||||
} sng_switch_type_t;
|
||||
|
||||
typedef struct sng_ssf_type {
|
||||
int init;
|
||||
char sng_type[MAX_NAME_LEN];
|
||||
uint32_t tril_type;
|
||||
} sng_ssf_type_t;
|
||||
|
||||
typedef struct sng_cic_cntrl_type {
|
||||
int init;
|
||||
char sng_type[MAX_NAME_LEN];
|
||||
uint32_t tril_type;
|
||||
} sng_cic_cntrl_type_t;
|
||||
|
||||
typedef struct sng_mtp1_link {
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t flags;
|
||||
uint32_t id;
|
||||
uint32_t span;
|
||||
uint32_t chan;
|
||||
} sng_mtp1_link_t;
|
||||
|
||||
typedef struct sng_mtp2_link {
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t flags;
|
||||
uint32_t id;
|
||||
uint32_t lssuLength;
|
||||
uint32_t errorType;
|
||||
uint32_t linkType;
|
||||
uint32_t mtp1Id;
|
||||
uint32_t mtp1ProcId;
|
||||
uint32_t t1;
|
||||
uint32_t t2;
|
||||
uint32_t t3;
|
||||
uint32_t t4n;
|
||||
uint32_t t4e;
|
||||
uint32_t t5;
|
||||
uint32_t t6;
|
||||
uint32_t t7;
|
||||
} sng_mtp2_link_t;
|
||||
|
||||
typedef struct sng_mtp3_link {
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t flags;
|
||||
uint32_t id;
|
||||
uint32_t priority;
|
||||
uint32_t linkType;
|
||||
uint32_t switchType;
|
||||
uint32_t apc;
|
||||
uint32_t spc;
|
||||
uint32_t ssf;
|
||||
uint32_t slc;
|
||||
uint32_t linkSetId;
|
||||
uint32_t mtp2Id;
|
||||
uint32_t mtp2ProcId;
|
||||
uint32_t t1;
|
||||
uint32_t t2;
|
||||
uint32_t t3;
|
||||
uint32_t t4;
|
||||
uint32_t t5;
|
||||
uint32_t t6;
|
||||
uint32_t t7;
|
||||
uint32_t t8;
|
||||
uint32_t t9;
|
||||
uint32_t t10;
|
||||
uint32_t t11;
|
||||
uint32_t t12;
|
||||
uint32_t t13;
|
||||
uint32_t t14;
|
||||
uint32_t t15;
|
||||
uint32_t t16;
|
||||
uint32_t t17;
|
||||
uint32_t t18;
|
||||
uint32_t t19;
|
||||
uint32_t t20;
|
||||
uint32_t t21;
|
||||
uint32_t t22;
|
||||
uint32_t t23;
|
||||
uint32_t t24;
|
||||
uint32_t t25;
|
||||
uint32_t t27;
|
||||
uint32_t t28;
|
||||
uint32_t t29;
|
||||
uint32_t t30;
|
||||
uint32_t t31;
|
||||
uint32_t t32;
|
||||
uint32_t t33;
|
||||
uint32_t t34;
|
||||
uint32_t t35;
|
||||
uint32_t t36;
|
||||
uint32_t t37;
|
||||
uint32_t tcraft;
|
||||
uint32_t tflc;
|
||||
uint32_t tbnd;
|
||||
} sng_mtp3_link_t;
|
||||
|
||||
typedef struct sng_link_set {
|
||||
uint32_t id;
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t flags;
|
||||
uint32_t id;
|
||||
uint32_t apc;
|
||||
uint32_t linkType;
|
||||
uint32_t switchType;
|
||||
@@ -185,18 +224,24 @@ typedef struct sng_link_set {
|
||||
uint32_t links[16];
|
||||
} sng_link_set_t;
|
||||
|
||||
typedef struct sng_link_set_list {
|
||||
uint32_t lsId;
|
||||
struct sng_link_set_list *next;
|
||||
} sng_link_set_list_t;
|
||||
|
||||
typedef struct sng_route {
|
||||
uint32_t id;
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t flags;
|
||||
uint32_t id;
|
||||
uint32_t dpc;
|
||||
uint32_t cmbLinkSetId;
|
||||
uint32_t linkSetId;
|
||||
struct sng_link_set_list lnkSets;
|
||||
uint32_t linkType;
|
||||
uint32_t switchType;
|
||||
uint32_t ssf;
|
||||
uint32_t nwId;
|
||||
uint32_t isSTP;
|
||||
uint32_t dir;
|
||||
uint32_t t6;
|
||||
uint32_t t8;
|
||||
uint32_t t10;
|
||||
@@ -211,10 +256,10 @@ typedef struct sng_route {
|
||||
} sng_route_t;
|
||||
|
||||
typedef struct sng_isup_intf {
|
||||
uint32_t id;
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t options;
|
||||
uint32_t flags;
|
||||
uint32_t id;
|
||||
uint32_t spc;
|
||||
uint32_t dpc;
|
||||
uint32_t switchType;
|
||||
@@ -222,9 +267,6 @@ typedef struct sng_isup_intf {
|
||||
uint32_t mtpRouteId;
|
||||
uint32_t ssf;
|
||||
uint32_t isap;
|
||||
uint32_t clg_nadi;
|
||||
uint32_t cld_nadi;
|
||||
uint32_t min_digits;
|
||||
uint16_t t4;
|
||||
uint32_t t10;
|
||||
uint32_t t11;
|
||||
@@ -241,7 +283,6 @@ typedef struct sng_isup_intf {
|
||||
uint32_t t29;
|
||||
uint32_t t30;
|
||||
uint32_t t32;
|
||||
uint32_t t35;
|
||||
uint32_t t37;
|
||||
uint32_t t38;
|
||||
uint32_t t39;
|
||||
@@ -251,15 +292,23 @@ typedef struct sng_isup_intf {
|
||||
} sng_isup_inf_t;
|
||||
|
||||
typedef struct sng_isup_ckt {
|
||||
uint32_t id;
|
||||
uint32_t options;
|
||||
uint32_t flags;
|
||||
uint32_t ckt_flags;
|
||||
uint32_t procId;
|
||||
uint32_t id;
|
||||
uint32_t ccSpanId;
|
||||
uint32_t span;
|
||||
uint32_t chan;
|
||||
uint32_t type; /* VOICE/SIG/HOLE */
|
||||
uint32_t cic;
|
||||
uint32_t infId;
|
||||
uint32_t ssf;
|
||||
uint32_t typeCntrl;
|
||||
uint32_t ssf;
|
||||
uint32_t switchType;
|
||||
uint32_t clg_nadi;
|
||||
uint32_t cld_nadi;
|
||||
uint32_t min_digits;
|
||||
void *obj;
|
||||
uint16_t t3;
|
||||
uint16_t t12;
|
||||
@@ -268,12 +317,13 @@ typedef struct sng_isup_ckt {
|
||||
uint16_t t15;
|
||||
uint16_t t16;
|
||||
uint16_t t17;
|
||||
uint32_t t35;
|
||||
uint16_t tval;
|
||||
} sng_isup_ckt_t;
|
||||
|
||||
typedef struct sng_nsap {
|
||||
uint32_t id;
|
||||
uint32_t flags;
|
||||
uint32_t id;
|
||||
uint32_t suId;
|
||||
uint32_t spId;
|
||||
uint32_t nwId;
|
||||
@@ -311,15 +361,30 @@ typedef struct sng_isap {
|
||||
uint32_t tfnlrelrsp;
|
||||
} sng_isap_t;
|
||||
|
||||
typedef struct sng_relay {
|
||||
uint32_t id;
|
||||
char name[MAX_NAME_LEN];
|
||||
uint32_t flags;
|
||||
uint32_t type;
|
||||
uint32_t port;
|
||||
char hostname[RY_REMHOSTNAME_SIZE];
|
||||
uint32_t procId;
|
||||
} sng_relay_t;
|
||||
|
||||
typedef struct sng_ss7_cfg {
|
||||
uint32_t spc;
|
||||
uint32_t procId;
|
||||
char license[MAX_PATH];
|
||||
char signature[MAX_PATH];
|
||||
sng_mtp_link_t mtpLink[MAX_MTP_LINKS+1];
|
||||
uint32_t flags;
|
||||
sng_relay_t relay[MAX_RELAY_CHANNELS+1];
|
||||
sng_mtp1_link_t mtp1Link[MAX_MTP_LINKS+1];
|
||||
sng_mtp2_link_t mtp2Link[MAX_MTP_LINKS+1];
|
||||
sng_mtp3_link_t mtp3Link[MAX_MTP_LINKS+1];
|
||||
sng_link_set_t mtpLinkSet[MAX_MTP_LINKSETS+1];
|
||||
sng_route_t mtpRoute[MAX_MTP_ROUTES+1];
|
||||
sng_isup_inf_t isupIntf[MAX_ISUP_INFS+1];
|
||||
sng_isup_ckt_t isupCkt[MAX_ISUP_CKTS+1];
|
||||
sng_isup_ckt_t isupCkt[10000]; /* KONRAD - only need 2000 ( and 0-1000 aren't used) since other servers are registerd else where */
|
||||
sng_nsap_t nsap[MAX_NSAPS+1];
|
||||
sng_isap_t isap[MAX_ISAPS+1];
|
||||
}sng_ss7_cfg_t;
|
||||
@@ -365,7 +430,7 @@ typedef struct sngss7_chan_data {
|
||||
uint32_t spInstId;
|
||||
uint32_t spId;
|
||||
uint8_t globalFlg;
|
||||
uint32_t flags;
|
||||
uint32_t ckt_flags;
|
||||
sngss7_glare_data_t glare;
|
||||
sngss7_timer_data_t t35;
|
||||
}sngss7_chan_data_t;
|
||||
@@ -407,8 +472,6 @@ typedef struct sngss7_event_data
|
||||
} sngss7_event_data_t;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef enum {
|
||||
FLAG_RESET_RX = (1 << 0),
|
||||
FLAG_RESET_TX = (1 << 1),
|
||||
@@ -439,15 +502,39 @@ typedef enum {
|
||||
FLAG_GRP_MN_BLOCK_RX = (1 << 26),
|
||||
FLAG_GRP_MN_BLOCK_TX = (1 << 27),
|
||||
FLAG_GRP_HW_UNBLK_TX = (1 << 28),
|
||||
FLAG_GRP_MN_UNBLK_TX = (1 << 29)
|
||||
} flag_t;
|
||||
FLAG_GRP_MN_UNBLK_TX = (1 << 29),
|
||||
FLAG_RELAY_DOWN = (1 << 30)
|
||||
} sng_ckt_flag_t;
|
||||
|
||||
/* valid for every cfg array except circuits */
|
||||
typedef enum {
|
||||
SNGSS7_CONFIGURED = (1 << 0),
|
||||
SNGSS7_ACTIVE = (1 << 1),
|
||||
SNGSS7_RELAY_INIT = (1 << 3),
|
||||
SNGSS7_PAUSED = (1 << 7) /* for isup interfaces */
|
||||
} sng_cfg_flag_t;
|
||||
|
||||
typedef enum {
|
||||
SNGSS7_SM = (1 << 0),
|
||||
SNGSS7_RY = (1 << 1),
|
||||
SNGSS7_MTP1 = (1 << 2),
|
||||
SNGSS7_MTP2 = (1 << 3),
|
||||
SNGSS7_MTP3 = (1 << 4),
|
||||
SNGSS7_ISUP = (1 << 5),
|
||||
SNGSS7_CC = (1 << 6)
|
||||
} sng_task_flag_t;
|
||||
/******************************************************************************/
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
extern ftdm_sngss7_data_t g_ftdm_sngss7_data;
|
||||
extern uint32_t sngss7_id;
|
||||
extern ftdm_sched_t *sngss7_sched;
|
||||
extern int cmbLinkSetId;
|
||||
extern ftdm_sngss7_data_t g_ftdm_sngss7_data;
|
||||
extern sng_ssf_type_t sng_ssf_type_map[];
|
||||
extern sng_switch_type_t sng_switch_type_map[];
|
||||
extern sng_link_type_t sng_link_type_map[];
|
||||
extern sng_mtp2_error_type_t sng_mtp2_error_type_map[];
|
||||
extern sng_cic_cntrl_type_t sng_cic_cntrl_type_map[];
|
||||
extern uint32_t sngss7_id;
|
||||
extern ftdm_sched_t *sngss7_sched;
|
||||
extern int cmbLinkSetId;
|
||||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
@@ -461,6 +548,12 @@ void handle_sng_mtp2_alarm(Pst *pst, SdMngmt *sta);
|
||||
void handle_sng_mtp3_alarm(Pst *pst, SnMngmt *sta);
|
||||
void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta);
|
||||
void handle_sng_cc_alarm(Pst *pst, CcMngmt *sta);
|
||||
void handle_sng_relay_alarm(Pst *pst, RyMngmt *sta);
|
||||
|
||||
/* in ftmod_sangoma_ss7_relay.c */
|
||||
ftdm_status_t handle_relay_connect(RyMngmt *sta);
|
||||
ftdm_status_t handle_relay_disconnect_on_down(RyMngmt *sta);
|
||||
ftdm_status_t handle_relay_disconnect_on_error(RyMngmt *sta);
|
||||
|
||||
/* in ftmod_sangoma_ss7_cfg.c */
|
||||
int ft_to_sngss7_cfg_all(void);
|
||||
@@ -484,20 +577,36 @@ int ftmod_ss7_cc_isap_config(int id);
|
||||
/* in ftmod_sangoma_ss7_cntrl.c */
|
||||
int ft_to_sngss7_activate_all(void);
|
||||
|
||||
int ftmod_ss7_inhibit_mtplink(uint32_t id);
|
||||
int ftmod_ss7_uninhibit_mtplink(uint32_t id);
|
||||
int ftmod_ss7_activate_mtplink(uint32_t id);
|
||||
int ftmod_ss7_deactivate_mtplink(uint32_t id);
|
||||
int ftmod_ss7_deactivate2_mtplink(uint32_t id);
|
||||
int ftmod_ss7_inhibit_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_uninhibit_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_bind_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_unbind_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_activate_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_deactivate_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_deactivate2_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_activate_mtplinkSet(uint32_t id);
|
||||
int ftmod_ss7_deactivate_mtplinkSet(uint32_t id);
|
||||
int ftmod_ss7_deactivate2_mtplinkSet(uint32_t id);
|
||||
int ftmod_ss7_lpo_mtplink(uint32_t id);
|
||||
int ftmod_ss7_lpr_mtplink(uint32_t id);
|
||||
int ftmod_ss7_lpo_mtp3link(uint32_t id);
|
||||
int ftmod_ss7_lpr_mtp3link(uint32_t id);
|
||||
|
||||
int ftmod_ss7_shutdown_isup(void);
|
||||
int ftmod_ss7_shutdown_mtp3(void);
|
||||
int ftmod_ss7_shutdown_mtp2(void);
|
||||
int ftmod_ss7_shutdown_relay(void);
|
||||
|
||||
int ftmod_ss7_disable_grp_mtp3Link(uint32_t procId);
|
||||
int ftmod_ss7_enable_grp_mtp3Link(uint32_t procId);
|
||||
|
||||
int ftmod_ss7_disable_grp_mtp2Link(uint32_t procId);
|
||||
|
||||
/* in ftmod_sangoma_ss7_sta.c */
|
||||
int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm);
|
||||
int ftmod_ss7_mtp1link_sta(uint32_t id, L1Mngmt *cfm);
|
||||
int ftmod_ss7_mtp2link_sta(uint32_t id, SdMngmt *cfm);
|
||||
int ftmod_ss7_mtp3link_sta(uint32_t id, SnMngmt *cfm);
|
||||
int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm);
|
||||
int ftmod_ss7_isup_intf_sta(uint32_t id, uint8_t *status);
|
||||
int ftmod_ss7_relay_status(uint32_t id, RyMngmt *cfm);
|
||||
|
||||
|
||||
/* in ftmod_sangoma_ss7_out.c */
|
||||
@@ -607,6 +716,14 @@ ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info);
|
||||
ftdm_status_t encode_subAddrIE_nsap(const char *subAddr, char *subAddrIE, int type);
|
||||
ftdm_status_t encode_subAddrIE_nat(const char *subAddr, char *subAddrIE, int type);
|
||||
|
||||
int find_mtp2_error_type_in_map(const char *err_type);
|
||||
int find_link_type_in_map(const char *linkType);
|
||||
int find_switch_type_in_map(const char *switchType);
|
||||
int find_ssf_type_in_map(const char *ssfType);
|
||||
int find_cic_cntrl_in_map(const char *cntrlType);
|
||||
|
||||
ftdm_status_t check_status_of_all_isup_intf(void);
|
||||
|
||||
/* in ftmod_sangoma_ss7_timers.c */
|
||||
void handle_isup_t35(void *userdata);
|
||||
/******************************************************************************/
|
||||
@@ -739,6 +856,10 @@ 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_ckt_flag(obj, flag) ((obj)->ckt_flags & flag)
|
||||
#define sngss7_clear_ckt_flag(obj, flag) ((obj)->ckt_flags &= ~(flag))
|
||||
#define sngss7_set_ckt_flag(obj, flag) ((obj)->ckt_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))
|
||||
|
||||
@@ -125,9 +125,9 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
iam.txMedReq.trMedReq.pres = PRSNT_NODEF;
|
||||
iam.txMedReq.trMedReq.val = ftdmchan->caller_data.bearer_capability;
|
||||
|
||||
if ((g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].switchType == LSI_SW_ANS88) ||
|
||||
(g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].switchType == LSI_SW_ANS92) ||
|
||||
(g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].switchType == LSI_SW_ANS95)) {
|
||||
if ((g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS88) ||
|
||||
(g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS92) ||
|
||||
(g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].switchType == LSI_SW_ANS95)) {
|
||||
|
||||
/* include only if we're running ANSI */
|
||||
iam.fwdCallInd.transCallNInd.pres = PRSNT_NODEF;
|
||||
@@ -178,7 +178,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
iam.usrServInfoA.rateMultiplier.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.rateMultiplier.val = 0x1; /* 1x rate multipler */
|
||||
} /* if ANSI */
|
||||
|
||||
|
||||
/* copy down the called number information */
|
||||
copy_cdPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cdPtyNum);
|
||||
|
||||
@@ -192,7 +192,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Calling NADI value \"%s\"\n", clg_nadi);
|
||||
iam.cgPtyNum.natAddrInd.val = atoi(clg_nadi);
|
||||
} else {
|
||||
iam.cgPtyNum.natAddrInd.val = g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].clg_nadi;
|
||||
iam.cgPtyNum.natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].clg_nadi;
|
||||
SS7_DEBUG_CHAN(ftdmchan,"No user supplied NADI value found for CLG, using \"%d\"\n", iam.cgPtyNum.natAddrInd.val);
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Called NADI value \"%s\"\n", cld_nadi);
|
||||
iam.cdPtyNum.natAddrInd.val = atoi(cld_nadi);
|
||||
} else {
|
||||
iam.cdPtyNum.natAddrInd.val = g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId].cld_nadi;
|
||||
iam.cdPtyNum.natAddrInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].cld_nadi;
|
||||
SS7_DEBUG_CHAN(ftdmchan,"No user supplied NADI value found for CLD, using \"%d\"\n", iam.cdPtyNum.natAddrInd.val);
|
||||
}
|
||||
|
||||
@@ -310,7 +310,6 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
|
||||
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));
|
||||
@@ -360,8 +359,8 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
|
||||
acm.bckCallInd.sccpMethInd.val = SCCPMTH_NOIND;
|
||||
|
||||
/* fill in any optional parameters */
|
||||
if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Found ACM_OBCI_BITA flag:0x%X\n", isup_intf->options);
|
||||
if (sngss7_test_options(&g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id], SNGSS7_ACM_OBCI_BITA)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "Found ACM_OBCI_BITA flag:0x%X\n", g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].options);
|
||||
acm.optBckCalInd.eh.pres = PRSNT_NODEF;
|
||||
acm.optBckCalInd.inbndInfoInd.pres = PRSNT_NODEF;
|
||||
acm.optBckCalInd.inbndInfoInd.val = 0x1;
|
||||
|
||||
@@ -0,0 +1,318 @@
|
||||
/*
|
||||
* Copyright (c) 2009|Konrad Hammel <konrad@sangoma.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms|with or without
|
||||
* modification|are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice|this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice|this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES|INCLUDING|BUT NOT
|
||||
* LIMITED TO|THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT|INDIRECT|INCIDENTAL|SPECIAL,
|
||||
* EXEMPLARY|OR CONSEQUENTIAL DAMAGES (INCLUDING|BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE|DATA|OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY|WHETHER IN CONTRACT|STRICT LIABILITY|OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE|EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* INCLUDE ********************************************************************/
|
||||
#include "ftmod_sangoma_ss7_main.h"
|
||||
/******************************************************************************/
|
||||
|
||||
/* DEFINES ********************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
ftdm_status_t handle_relay_connect(RyMngmt *sta);
|
||||
ftdm_status_t handle_relay_disconnect(RyMngmt *sta);
|
||||
|
||||
static ftdm_status_t enable_all_ckts_for_relay(void);
|
||||
static ftdm_status_t reconfig_all_ckts_for_relay(void);
|
||||
static ftdm_status_t disable_all_ckts_for_relay(void);
|
||||
static ftdm_status_t block_all_ckts_for_relay(uint32_t procId);
|
||||
static ftdm_status_t disable_all_sigs_for_relay(uint32_t procId);
|
||||
static ftdm_status_t disble_all_mtp2_sigs_for_relay(void);
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
ftdm_status_t handle_relay_connect(RyMngmt *sta)
|
||||
{
|
||||
sng_relay_t *sng_relay = &g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id];
|
||||
|
||||
|
||||
/* test if this is the first time the channel comes up */
|
||||
if (!sngss7_test_flag(sng_relay, SNGSS7_RELAY_INIT)) {
|
||||
SS7_DEBUG("Relay Channel %d initial connection UP\n", sng_relay->id);
|
||||
|
||||
/* mark the channel as being up */
|
||||
sngss7_set_flag(sng_relay, SNGSS7_RELAY_INIT);
|
||||
} else {
|
||||
SS7_DEBUG("Relay Channel %d connection UP\n", sng_relay->id);
|
||||
|
||||
/* react based on type of channel */
|
||||
switch (sng_relay->type) {
|
||||
/******************************************************************/
|
||||
case (LRY_CT_TCP_CLIENT):
|
||||
/* reconfigure all ISUP ckts, since the main system would have lost all configs */
|
||||
if (reconfig_all_ckts_for_relay()) {
|
||||
SS7_ERROR("Failed to reconfigure ISUP Ckts!\n");
|
||||
|
||||
/* we're done....this is very bad! */
|
||||
} else {
|
||||
enable_all_ckts_for_relay();
|
||||
}
|
||||
|
||||
break;
|
||||
/******************************************************************/
|
||||
case (LRY_CT_TCP_SERVER):
|
||||
/*unblock_all_ckts_for_relay(sta->t.usta.s.ryErrUsta.errPid);*/
|
||||
ftmod_ss7_enable_grp_mtp3Link(sta->t.usta.s.ryUpUsta.id);
|
||||
|
||||
break;
|
||||
/******************************************************************/
|
||||
default:
|
||||
break;
|
||||
/******************************************************************/
|
||||
} /* switch (g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id].type) */
|
||||
} /* intial up? */
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t handle_relay_disconnect_on_error(RyMngmt *sta)
|
||||
{
|
||||
|
||||
/* check which procId is in error, if it is 1, disable the ckts */
|
||||
if (sta->t.usta.s.ryErrUsta.errPid == 1 ) {
|
||||
disable_all_ckts_for_relay();
|
||||
|
||||
disble_all_mtp2_sigs_for_relay();
|
||||
}
|
||||
|
||||
/* check if the channel is a server, means we just lost a MGW */
|
||||
if (g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryErrUsta.errPid].type == LRY_CT_TCP_SERVER) {
|
||||
block_all_ckts_for_relay(sta->t.usta.s.ryErrUsta.errPid);
|
||||
|
||||
disable_all_sigs_for_relay(sta->t.usta.s.ryErrUsta.errPid);
|
||||
}
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t handle_relay_disconnect_on_down(RyMngmt *sta)
|
||||
{
|
||||
|
||||
/* check if the channel is a server, means we just lost a MGW */
|
||||
if (g_ftdm_sngss7_data.cfg.relay[sta->t.usta.s.ryUpUsta.id].type == LRY_CT_TCP_SERVER) {
|
||||
block_all_ckts_for_relay(sta->t.usta.s.ryUpUsta.id);
|
||||
|
||||
disable_all_sigs_for_relay(sta->t.usta.s.ryUpUsta.id);
|
||||
}
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t disable_all_ckts_for_relay(void)
|
||||
{
|
||||
sngss7_chan_data_t *sngss7_info = NULL;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
int x;
|
||||
|
||||
SS7_INFO("Disabling all ckts becuase of Relay loss\n");
|
||||
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
/**********************************************************************/
|
||||
/* make sure this is voice channel */
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
/* get the ftdmchan and ss7_chan_data from the circuit */
|
||||
if (extract_chan_data(g_ftdm_sngss7_data.cfg.isupCkt[x].id, &sngss7_info, &ftdmchan)) {
|
||||
SS7_ERROR("Failed to extract channel data for circuit = %d!\n", g_ftdm_sngss7_data.cfg.isupCkt[x].id);
|
||||
x++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* throw the relay_down flag */
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_RELAY_DOWN);
|
||||
|
||||
/* throw the channel infId status flags to PAUSED ... they will be executed next process cycle */
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
} /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) */
|
||||
|
||||
/* move along */
|
||||
x++;
|
||||
/**********************************************************************/
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t enable_all_ckts_for_relay(void)
|
||||
{
|
||||
sngss7_chan_data_t *sngss7_info = NULL;
|
||||
sng_isup_inf_t *sngIntf = NULL;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
int x;
|
||||
|
||||
SS7_INFO("Enabling all ckts becuase of Relay connection\n");
|
||||
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
/**********************************************************************/
|
||||
/* make sure this is voice channel */
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
/* get the ftdmchan and ss7_chan_data from the circuit */
|
||||
if (extract_chan_data(g_ftdm_sngss7_data.cfg.isupCkt[x].id, &sngss7_info, &ftdmchan)) {
|
||||
SS7_ERROR("Failed to extract channel data for circuit = %d!\n", g_ftdm_sngss7_data.cfg.isupCkt[x].id);
|
||||
x++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* bring the relay_down flag down */
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_RELAY_DOWN);
|
||||
|
||||
sngIntf = &g_ftdm_sngss7_data.cfg.isupIntf[g_ftdm_sngss7_data.cfg.isupCkt[x].infId];
|
||||
|
||||
/* check if the interface is paused or resumed */
|
||||
if (sngss7_test_flag(sngIntf, SNGSS7_PAUSED)) {
|
||||
/* don't bring the channel resume flag up...the interface is down */
|
||||
SS7_DEBUG_CHAN(ftdmchan, "ISUP interface (%d) set to paused, not resuming channel\n", sngIntf->id);
|
||||
} else {
|
||||
SS7_DEBUG_CHAN(ftdmchan, "ISUP interface (%d) set to resume, resuming channel\n", sngIntf->id);
|
||||
/* throw the channel infId status flags to PAUSED ... they will be executed next process cycle */
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_RESUME);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_INFID_PAUSED);
|
||||
}
|
||||
} /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) */
|
||||
|
||||
/* move along */
|
||||
x++;
|
||||
/**********************************************************************/
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t reconfig_all_ckts_for_relay(void)
|
||||
{
|
||||
#if 1
|
||||
int x;
|
||||
int ret;
|
||||
|
||||
x = (g_ftdm_sngss7_data.cfg.procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
if ( g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
|
||||
ret = ftmod_ss7_isup_ckt_config(x);
|
||||
if (ret) {
|
||||
SS7_CRITICAL("ISUP CKT %d configuration FAILED (%d)!\n", x, ret);
|
||||
return 1;
|
||||
} else {
|
||||
SS7_INFO("ISUP CKT %d configuration DONE!\n", x);
|
||||
}
|
||||
|
||||
} /* if ( g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) */
|
||||
|
||||
/* set the SNGSS7_CONFIGURED flag */
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].flags |= SNGSS7_CONFIGURED;
|
||||
|
||||
x++;
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
|
||||
#endif
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t block_all_ckts_for_relay(uint32_t procId)
|
||||
{
|
||||
int x;
|
||||
|
||||
SS7_INFO("BLOcking all ckts on ProcID = %d\n", procId);
|
||||
|
||||
/* we just lost connection to this procId, send out a block for all these circuits */
|
||||
x = (procId * 1000) + 1;
|
||||
while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) {
|
||||
/**************************************************************************/
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) {
|
||||
/* send out a BLO */
|
||||
sng_cc_sta_request (1,
|
||||
0,
|
||||
0,
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].id,
|
||||
0,
|
||||
SIT_STA_CIRBLOREQ,
|
||||
NULL);
|
||||
|
||||
} /* if (g_ftdm_sngss7_data.cfg.isupCkt[x].type == VOICE) */
|
||||
|
||||
/* move along */
|
||||
x++;
|
||||
/**************************************************************************/
|
||||
} /* while (g_ftdm_sngss7_data.cfg.isupCkt[x].id != 0) */
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t disable_all_sigs_for_relay(uint32_t procId)
|
||||
{
|
||||
SS7_INFO("Disalbing all sig links on ProcID = %d\n", procId);
|
||||
|
||||
ftmod_ss7_disable_grp_mtp3Link(procId);
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t disble_all_mtp2_sigs_for_relay(void)
|
||||
{
|
||||
/* check if there is a local mtp2 link*/
|
||||
if (sngss7_test_flag(&g_ftdm_sngss7_data.cfg, SNGSS7_MTP2)) {
|
||||
SS7_INFO("Disalbing all mtp2 sig links on local system\n");
|
||||
|
||||
ftmod_ss7_disable_grp_mtp2Link(1);
|
||||
}
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
/******************************************************************************/
|
||||
@@ -42,12 +42,43 @@
|
||||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm);
|
||||
int ftmod_ss7_mtp1link_sta(uint32_t id, L1Mngmt *cfm);
|
||||
int ftmod_ss7_mtp2link_sta(uint32_t id, SdMngmt *cfm);
|
||||
int ftmod_ss7_mtp3link_sta(uint32_t id, SnMngmt *cfm);
|
||||
int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm);
|
||||
int ftmod_ss7_isup_intf_sta(uint32_t id, uint8_t *status);
|
||||
int ftmod_ss7_relay_status(uint32_t id, RyMngmt *cfm);
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm)
|
||||
int ftmod_ss7_mtp1link_sta(uint32_t id, L1Mngmt *cfm)
|
||||
{
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_mtp2link_sta(uint32_t id, SdMngmt *cfm)
|
||||
{
|
||||
SdMngmt sta;
|
||||
Pst pst;
|
||||
|
||||
memset(&sta, 0x0, sizeof(sta));
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSD;
|
||||
|
||||
sta.hdr.elmId.elmnt = STDLSAP;
|
||||
sta.hdr.elmId.elmntInst1 = g_ftdm_sngss7_data.cfg.mtp2Link[id].id;
|
||||
|
||||
return(sng_sta_mtp2(&pst, &sta, cfm));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_mtp3link_sta(uint32_t id, SnMngmt *cfm)
|
||||
{
|
||||
SnMngmt sta;
|
||||
Pst pst;
|
||||
@@ -60,8 +91,13 @@ int ftmod_ss7_mtplink_sta(uint32_t id, SnMngmt *cfm)
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSN;
|
||||
|
||||
/* check the for the correct ProcId and make sure it goes to the right system */
|
||||
if (g_ftdm_sngss7_data.cfg.procId != 1) {
|
||||
pst.dstProcId = 1;
|
||||
}
|
||||
|
||||
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.mtp3Link[id].id;
|
||||
|
||||
return(sng_sta_mtp3(&pst, &sta, cfm));
|
||||
}
|
||||
@@ -80,13 +116,77 @@ int ftmod_ss7_mtplinkSet_sta(uint32_t id, SnMngmt *cfm)
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSN;
|
||||
|
||||
/* check the for the correct ProcId and make sure it goes to the right system */
|
||||
if (g_ftdm_sngss7_data.cfg.procId != 1) {
|
||||
pst.dstProcId = 1;
|
||||
}
|
||||
|
||||
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(&pst, &sta, cfm));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_isup_intf_sta(uint32_t id, uint8_t *status)
|
||||
{
|
||||
SiMngmt sta;
|
||||
SiMngmt cfm;
|
||||
Pst pst;
|
||||
int ret;
|
||||
|
||||
memset(&sta, 0x0, sizeof(sta));
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTSI;
|
||||
|
||||
/* check the for the correct ProcId and make sure it goes to the right system */
|
||||
if (g_ftdm_sngss7_data.cfg.procId != 1) {
|
||||
pst.dstProcId = 1;
|
||||
}
|
||||
|
||||
/* request the status of an inftId */
|
||||
sta.hdr.entId.ent = ENTSI;
|
||||
sta.hdr.entId.inst = S_INST;
|
||||
sta.hdr.msgType = TSSTA;
|
||||
sta.hdr.elmId.elmnt = SI_STINTF;
|
||||
|
||||
sta.t.ssta.elmntId.intfId = id;
|
||||
|
||||
ret = sng_sta_isup(&pst, &sta, &cfm);
|
||||
|
||||
*status = cfm.t.ssta.cfm.s.intf.state;
|
||||
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int ftmod_ss7_relay_status(uint32_t id, RyMngmt *cfm)
|
||||
{
|
||||
RyMngmt sta;
|
||||
Pst pst;
|
||||
|
||||
memset(&sta, 0x0, sizeof(sta));
|
||||
|
||||
/* initalize the post structure */
|
||||
smPstInit(&pst);
|
||||
|
||||
/* insert the destination Entity */
|
||||
pst.dstEnt = ENTRY;
|
||||
|
||||
sta.hdr.entId.ent = ENTRY;
|
||||
sta.hdr.entId.inst = S_INST;
|
||||
sta.hdr.msgType = TSSTA;
|
||||
sta.hdr.elmId.elmnt = STCHSTA;
|
||||
sta.hdr.elmId.elmntInst1 = id;
|
||||
|
||||
|
||||
return(sng_sta_relay(&pst, &sta, cfm));
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
|
||||
@@ -75,6 +75,14 @@ ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info);
|
||||
|
||||
ftdm_status_t encode_subAddrIE_nsap(const char *subAddr, char *subAddrIE, int type);
|
||||
ftdm_status_t encode_subAddrIE_nat(const char *subAddr, char *subAddrIE, int type);
|
||||
|
||||
int find_mtp2_error_type_in_map(const char *err_type);
|
||||
int find_link_type_in_map(const char *linkType);
|
||||
int find_switch_type_in_map(const char *switchType);
|
||||
int find_ssf_type_in_map(const char *ssfType);
|
||||
int find_cic_cntrl_in_map(const char *cntrlType);
|
||||
|
||||
ftdm_status_t check_status_of_all_isup_intf(void);
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
@@ -432,7 +440,7 @@ int check_cics_in_range(sngss7_chan_data_t *sngss7_info)
|
||||
}
|
||||
|
||||
/* check if the channel still has the reset flag done is up */
|
||||
if (!sngss7_test_flag(tmp_sngss7_info, FLAG_GRP_RESET_RX_DN)) {
|
||||
if (!sngss7_test_ckt_flag(tmp_sngss7_info, FLAG_GRP_RESET_RX_DN)) {
|
||||
SS7_DEBUG_CHAN(tmp_ftdmchan, "[CIC:%d] Still processing reset...\n", tmp_sngss7_info->circuit->cic);
|
||||
return 0;
|
||||
}
|
||||
@@ -475,19 +483,19 @@ ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_in
|
||||
int check_for_reset(sngss7_chan_data_t *sngss7_info)
|
||||
{
|
||||
|
||||
if (sngss7_test_flag(sngss7_info,FLAG_RESET_RX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info,FLAG_RESET_RX)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(sngss7_info,FLAG_RESET_TX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info,FLAG_RESET_TX)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(sngss7_info,FLAG_GRP_RESET_RX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info,FLAG_GRP_RESET_RX)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (sngss7_test_flag(sngss7_info,FLAG_GRP_RESET_TX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info,FLAG_GRP_RESET_TX)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -498,11 +506,13 @@ int check_for_reset(sngss7_chan_data_t *sngss7_info)
|
||||
/******************************************************************************/
|
||||
unsigned long get_unique_id(void)
|
||||
{
|
||||
int procId = sng_get_procId();
|
||||
|
||||
if (sngss7_id < 420000000) {
|
||||
/* id values are between (procId * 1,000,000) and ((procId + 1) * 1,000,000) */
|
||||
if (sngss7_id < ((procId + 1) * 1000000) ) {
|
||||
sngss7_id++;
|
||||
} else {
|
||||
sngss7_id = 1;
|
||||
sngss7_id = procId * 1000000;
|
||||
}
|
||||
|
||||
return(sngss7_id);
|
||||
@@ -525,7 +535,7 @@ ftdm_status_t check_if_rx_grs_started(ftdm_span_t *ftdmspan)
|
||||
}
|
||||
|
||||
/* check if the GRP_RESET_RX flag is already up */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX)) {
|
||||
/* we have already processed this channel...move along */
|
||||
continue;
|
||||
}
|
||||
@@ -543,7 +553,7 @@ ftdm_status_t check_if_rx_grs_started(ftdm_span_t *ftdmspan)
|
||||
(g_ftdm_sngss7_data.cfg.isupCkt[sngss7_span->rx_grs.circuit].cic + sngss7_span->rx_grs.range));
|
||||
|
||||
/* flag the channel as having received a reset */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_RX);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX);
|
||||
|
||||
switch (ftdmchan->state) {
|
||||
/**************************************************************************/
|
||||
@@ -598,10 +608,10 @@ ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan)
|
||||
/* check if there is a state change pending on the channel */
|
||||
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
|
||||
/* check the state to the GRP_RESET_RX_DN flag */
|
||||
if (!sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) {
|
||||
if (!sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) {
|
||||
/* this channel is still resetting...do nothing */
|
||||
goto GRS_UNLOCK_ALL;
|
||||
} /* if (!sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) */
|
||||
} /* if (!sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) */
|
||||
} else {
|
||||
/* state change pending */
|
||||
goto GRS_UNLOCK_ALL;
|
||||
@@ -625,16 +635,16 @@ ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan)
|
||||
}
|
||||
|
||||
/* throw the GRP reset flag complete flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT);
|
||||
|
||||
/* move the channel to the down state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||
|
||||
/* update the status map if the ckt is in blocked state */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_CKT_MN_BLOCK_TX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX)) ||
|
||||
(sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_MN_BLOCK_RX))) {
|
||||
|
||||
sngss7_span->rx_grs.status[byte] = (sngss7_span->rx_grs.status[byte] | (1 << bit));
|
||||
} /* if blocked */
|
||||
@@ -679,7 +689,7 @@ ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan)
|
||||
}
|
||||
|
||||
/* check if the channel is already procoessing the GRA */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP)) {
|
||||
/* move along */
|
||||
continue;
|
||||
}
|
||||
@@ -701,7 +711,7 @@ ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan)
|
||||
case FTDM_CHANNEL_STATE_RESTART:
|
||||
|
||||
/* throw the FLAG_RESET_TX_RSP to indicate we have acknowledgement from the remote side */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
|
||||
|
||||
/* go to DOWN */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
|
||||
@@ -720,7 +730,7 @@ ftdm_status_t check_if_rx_gra_started(ftdm_span_t *ftdmspan)
|
||||
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
|
||||
|
||||
/* throw the FLAG_RESET_TX_RSP to indicate we have acknowledgement from the remote side */
|
||||
sngss7_set_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
|
||||
|
||||
break;
|
||||
/**********************************************************************/
|
||||
@@ -775,7 +785,7 @@ ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan)
|
||||
sigev.channel = ftdmchan;
|
||||
|
||||
/* if we have the PAUSED flag and the sig status is still UP */
|
||||
if ((sngss7_test_flag(sngss7_info, FLAG_INFID_PAUSED)) &&
|
||||
if ((sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_PAUSED)) &&
|
||||
(ftdm_test_flag(ftdmchan, FTDM_CHANNEL_SIG_UP))) {
|
||||
|
||||
/* clear up any pending state changes */
|
||||
@@ -790,7 +800,7 @@ ftdm_status_t check_for_res_sus_flag(ftdm_span_t *ftdmspan)
|
||||
|
||||
/* if the RESUME flag is up go to SUSPENDED to process the flag */
|
||||
/* after doing this the flag will be cleared */
|
||||
if (sngss7_test_flag(sngss7_info, FLAG_INFID_RESUME)) {
|
||||
if (sngss7_test_ckt_flag(sngss7_info, FLAG_INFID_RESUME)) {
|
||||
|
||||
/* clear up any pending state changes */
|
||||
while (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
|
||||
@@ -839,7 +849,7 @@ ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan)
|
||||
}
|
||||
|
||||
/* throw the ckt block flag */
|
||||
sngss7_set_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_CKT_UCIC_BLOCK);
|
||||
|
||||
/* set the channel to suspended state */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_SUSPENDED);
|
||||
@@ -858,9 +868,9 @@ ftdm_status_t process_span_ucic(ftdm_span_t *ftdmspan)
|
||||
ftdm_status_t clear_rx_grs_flags(sngss7_chan_data_t *sngss7_info)
|
||||
{
|
||||
/* clear all the flags related to an incoming GRS */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_RX);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_RX_DN);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_DN);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_RESET_RX_CMPLT);
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
@@ -892,10 +902,10 @@ ftdm_status_t clear_rx_gra_data(sngss7_chan_data_t *sngss7_info)
|
||||
ftdm_status_t clear_tx_grs_flags(sngss7_chan_data_t *sngss7_info)
|
||||
{
|
||||
/* clear all the flags related to an outgoing GRS */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_SENT);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_RESET_BASE);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_RESET_SENT);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_GRP_RESET_TX_RSP);
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
@@ -918,7 +928,7 @@ ftdm_status_t clear_tx_grs_data(sngss7_chan_data_t *sngss7_info)
|
||||
ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info)
|
||||
{
|
||||
/* clear all the flags related to an incoming RSC */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_RESET_RX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_RESET_RX);
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
@@ -927,9 +937,9 @@ ftdm_status_t clear_rx_rsc_flags(sngss7_chan_data_t *sngss7_info)
|
||||
ftdm_status_t clear_tx_rsc_flags(sngss7_chan_data_t *sngss7_info)
|
||||
{
|
||||
/* clear all the flags related to an outgoing RSC */
|
||||
sngss7_clear_flag(sngss7_info, FLAG_RESET_TX);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_RESET_SENT);
|
||||
sngss7_clear_flag(sngss7_info, FLAG_RESET_TX_RSP);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_RESET_TX);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_RESET_SENT);
|
||||
sngss7_clear_ckt_flag(sngss7_info, FLAG_RESET_TX_RSP);
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
@@ -1147,6 +1157,197 @@ ftdm_status_t encode_subAddrIE_nat(const char *subAddr, char *subAddrIE, int typ
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int find_mtp2_error_type_in_map(const char *err_type)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (sng_mtp2_error_type_map[i].init == 1) {
|
||||
/* check if string matches the sng_type name */
|
||||
if (!strcasecmp(err_type, sng_mtp2_error_type_map[i].sng_type)) {
|
||||
/* we've found a match break from the loop */
|
||||
break;
|
||||
} else {
|
||||
/* move on to the next on */
|
||||
i++;
|
||||
}
|
||||
} /* while (sng_mtp2_error_type_map[i].init == 1) */
|
||||
|
||||
/* check how we exited the loop */
|
||||
if (sng_mtp2_error_type_map[i].init == 0) {
|
||||
return -1;
|
||||
} else {
|
||||
return i;
|
||||
} /* if (sng_mtp2_error_type_map[i].init == 0) */
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int find_link_type_in_map(const char *linkType)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (sng_link_type_map[i].init == 1) {
|
||||
/* check if string matches the sng_type name */
|
||||
if (!strcasecmp(linkType, sng_link_type_map[i].sng_type)) {
|
||||
/* we've found a match break from the loop */
|
||||
break;
|
||||
} else {
|
||||
/* move on to the next on */
|
||||
i++;
|
||||
}
|
||||
} /* while (sng_link_type_map[i].init == 1) */
|
||||
|
||||
/* check how we exited the loop */
|
||||
if (sng_link_type_map[i].init == 0) {
|
||||
return -1;
|
||||
} else {
|
||||
return i;
|
||||
} /* if (sng_link_type_map[i].init == 0) */
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int find_switch_type_in_map(const char *switchType)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (sng_switch_type_map[i].init == 1) {
|
||||
/* check if string matches the sng_type name */
|
||||
if (!strcasecmp(switchType, sng_switch_type_map[i].sng_type)) {
|
||||
/* we've found a match break from the loop */
|
||||
break;
|
||||
} else {
|
||||
/* move on to the next on */
|
||||
i++;
|
||||
}
|
||||
} /* while (sng_switch_type_map[i].init == 1) */
|
||||
|
||||
/* check how we exited the loop */
|
||||
if (sng_switch_type_map[i].init == 0) {
|
||||
return -1;
|
||||
} else {
|
||||
return i;
|
||||
} /* if (sng_switch_type_map[i].init == 0) */
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int find_ssf_type_in_map(const char *ssfType)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (sng_ssf_type_map[i].init == 1) {
|
||||
/* check if string matches the sng_type name */
|
||||
if (!strcasecmp(ssfType, sng_ssf_type_map[i].sng_type)) {
|
||||
/* we've found a match break from the loop */
|
||||
break;
|
||||
} else {
|
||||
/* move on to the next on */
|
||||
i++;
|
||||
}
|
||||
} /* while (sng_ssf_type_map[i].init == 1) */
|
||||
|
||||
/* check how we exited the loop */
|
||||
if (sng_ssf_type_map[i].init == 0) {
|
||||
return -1;
|
||||
} else {
|
||||
return i;
|
||||
} /* if (sng_ssf_type_map[i].init == 0) */
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int find_cic_cntrl_in_map(const char *cntrlType)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
while (sng_cic_cntrl_type_map[i].init == 1) {
|
||||
/* check if string matches the sng_type name */
|
||||
if (!strcasecmp(cntrlType, sng_cic_cntrl_type_map[i].sng_type)) {
|
||||
/* we've found a match break from the loop */
|
||||
break;
|
||||
} else {
|
||||
/* move on to the next on */
|
||||
i++;
|
||||
}
|
||||
} /* while (sng_cic_cntrl_type_map[i].init == 1) */
|
||||
|
||||
/* check how we exited the loop */
|
||||
if (sng_cic_cntrl_type_map[i].init == 0) {
|
||||
return -1;
|
||||
} else {
|
||||
return i;
|
||||
} /* if (sng_cic_cntrl_type_map[i].init == 0) */
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t check_status_of_all_isup_intf(void)
|
||||
{
|
||||
sng_isup_inf_t *sngss7_intf = NULL;
|
||||
uint8_t status = 0xff;
|
||||
int x;
|
||||
|
||||
/* go through all the isupIntfs and ask the stack to give their current state */
|
||||
x = 1;
|
||||
for (x = 1; x < (MAX_ISUP_INFS + 1); x++) {
|
||||
/**************************************************************************/
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.isupIntf[x].id == 0) continue;
|
||||
|
||||
sngss7_intf = &g_ftdm_sngss7_data.cfg.isupIntf[x];
|
||||
|
||||
if (ftmod_ss7_isup_intf_sta(sngss7_intf->id, &status)) {
|
||||
SS7_ERROR("Failed to get status of ISUP intf %d\n", sngss7_intf->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (status){
|
||||
/**********************************************************************/
|
||||
case (SI_INTF_AVAIL):
|
||||
SS7_DEBUG("State of ISUP intf %d = AVAIL\n", sngss7_intf->id);
|
||||
|
||||
/* check the current state for interface that we know */
|
||||
if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) {
|
||||
/* we thing the intf is paused...put into resume */
|
||||
sngss7_clear_flag(sngss7_intf, SNGSS7_PAUSED);
|
||||
} else {
|
||||
/* nothing to since we already know that interface is active */
|
||||
}
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case (SI_INTF_UNAVAIL):
|
||||
SS7_DEBUG("State of ISUP intf %d = UNAVAIL\n", sngss7_intf->id);
|
||||
/* check the current state for interface that we know */
|
||||
if (sngss7_test_flag(sngss7_intf, SNGSS7_PAUSED)) {
|
||||
/* nothing to since we already know that interface is active */
|
||||
} else {
|
||||
/* put the interface into pause */
|
||||
sngss7_set_flag(sngss7_intf, SNGSS7_PAUSED);
|
||||
}
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case (SI_INTF_CONG1):
|
||||
SS7_DEBUG("State of ISUP intf %d = Congestion 1\n", sngss7_intf->id);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case (SI_INTF_CONG2):
|
||||
SS7_DEBUG("State of ISUP intf %d = Congestion 2\n", sngss7_intf->id);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case (SI_INTF_CONG3):
|
||||
SS7_DEBUG("State of ISUP intf %d = Congestion 3\n", sngss7_intf->id);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
default:
|
||||
/* should do something here to handle the possiblity of an unknown case */
|
||||
SS7_ERROR("Unknown ISUP intf Status code (%d) for Intf = %d\n", status, sngss7_intf->id);
|
||||
break;
|
||||
/**********************************************************************/
|
||||
} /* switch (status) */
|
||||
|
||||
/**************************************************************************/
|
||||
} /* for (x = 1; x < MAX_ISUP_INFS + 1); i++) */
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
|
||||
@@ -61,7 +61,7 @@ void handle_isup_t35(void *userdata)
|
||||
SS7_ERROR("[Call-Control] Timer 35 expired on CIC = %d\n", sngss7_info->circuit->cic);
|
||||
|
||||
/* set the flag to indicate this hangup is started from the local side */
|
||||
sngss7_set_flag(sngss7_info, FLAG_LOCAL_REL);
|
||||
sngss7_set_ckt_flag(sngss7_info, FLAG_LOCAL_REL);
|
||||
|
||||
/* hang up on timer expiry */
|
||||
ftdmchan->caller_data.hangup_cause = 28;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -61,14 +61,14 @@
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
|
||||
Regular → Executable
+14
@@ -554,6 +554,7 @@ struct ftdm_sigmsg {
|
||||
uint32_t chan_id; /*!< easy access to chan id */
|
||||
uint32_t span_id; /*!< easy access to span_id */
|
||||
uint32_t call_id; /*!< unique call id for this call */
|
||||
void *call_priv; /*!< Private data for the FreeTDM user from ftdm_caller_data->priv */
|
||||
union {
|
||||
ftdm_event_sigstatus_t sigstatus; /*!< valid if event_id is FTDM_SIGEVENT_SIGSTATUS_CHANGED */
|
||||
ftdm_event_trace_t trace; /*!< valid if event_id is FTDM_SIGEVENT_TRACE or FTDM_SIGEVENT_TRACE_RAW */
|
||||
@@ -672,6 +673,9 @@ typedef enum {
|
||||
FTDM_COMMAND_SET_RX_QUEUE_SIZE = 54,
|
||||
FTDM_COMMAND_SET_TX_QUEUE_SIZE = 55,
|
||||
FTDM_COMMAND_SET_POLARITY = 56,
|
||||
FTDM_COMMAND_START_MF_PLAYBACK = 57,
|
||||
FTDM_COMMAND_STOP_MF_PLAYBACK = 58,
|
||||
|
||||
FTDM_COMMAND_COUNT,
|
||||
} ftdm_command_t;
|
||||
|
||||
@@ -846,6 +850,16 @@ typedef enum {
|
||||
FTDM_ALARM_GENERAL = (1 << 30)
|
||||
} ftdm_alarm_flag_t;
|
||||
|
||||
/*! \brief MF generation direction flags
|
||||
* \note Used in bitwise OR with channel ID as argument to MF_PLAYBACK I/O command, so value must be higher that 255
|
||||
* \see FTDM_COMMAND_START_MF_PLAYBACK
|
||||
* */
|
||||
|
||||
typedef enum {
|
||||
FTDM_MF_DIRECTION_FORWARD = (1 << 8),
|
||||
FTDM_MF_DIRECTION_BACKWARD = (1 << 9)
|
||||
} ftdm_mf_direction_flag_t;
|
||||
|
||||
/*! \brief Override the default queue handler */
|
||||
FT_DECLARE(ftdm_status_t) ftdm_global_set_queue_handler(ftdm_queue_handler_t *handler);
|
||||
|
||||
|
||||
Regular → Executable
+1
-1
@@ -49,6 +49,6 @@ FT_DECLARE(char *) ftdm_build_dso_path(const char *name, char *path, ftdm_size_t
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
|
||||
|
||||
@@ -688,6 +688,9 @@ FT_DECLARE(void) ftdm_set_echocancel_call_end(ftdm_channel_t *chan);
|
||||
if (!ftdm_test_flag((fchan), FTDM_CHANNEL_MEDIA)) { \
|
||||
ftdm_set_flag((fchan), FTDM_CHANNEL_MEDIA); \
|
||||
ftdm_set_echocancel_call_begin((fchan)); \
|
||||
if ((fchan)->dtmfdbg.requested) { \
|
||||
ftdm_channel_command((fchan), FTDM_COMMAND_ENABLE_DEBUG_DTMF, NULL); \
|
||||
} \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
|
||||
Regular → Executable
+1
@@ -203,6 +203,7 @@ typedef enum {
|
||||
FTDM_CHANNEL_FEATURE_HWEC = (1<<7), /*!< Channel has a hardware echo canceller */
|
||||
FTDM_CHANNEL_FEATURE_HWEC_DISABLED_ON_IDLE = (1<<8), /*!< hardware echo canceller is disabled when there are no calls on this channel */
|
||||
FTDM_CHANNEL_FEATURE_IO_STATS = (1<<9), /*!< Channel supports IO statistics (HDLC channels only) */
|
||||
FTDM_CHANNEL_FEATURE_MF_GENERATE = (1<<10), /*!< Channel can generate R2 MF tones (read-only) */
|
||||
} ftdm_channel_feature_t;
|
||||
|
||||
/*!< Channel flags. This used to be an enum but we reached the 32bit limit for enums, is safer this way */
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
#include "freetdm.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
static FIO_SIGNAL_CB_FUNCTION(on_signal)
|
||||
{
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
static int R = 0;
|
||||
#if 0
|
||||
static void handle_SIGINT(int sig)
|
||||
{
|
||||
if (sig);
|
||||
R = 0;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
ftdm_conf_parameter_t parameters[20];
|
||||
ftdm_span_t *span;
|
||||
int local_port, remote_port;
|
||||
|
||||
local_port = remote_port = 53000;
|
||||
|
||||
ftdm_global_set_default_logger(FTDM_LOG_LEVEL_DEBUG);
|
||||
#if 0
|
||||
if (argc < 2) {
|
||||
printf("invalid arguments\n");
|
||||
exit(-1);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ftdm_global_init() != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error loading FreeTDM\n");
|
||||
exit(-1);
|
||||
}
|
||||
if (ftdm_global_configuration() != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error configuring FreeTDM\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
printf("FreeTDM loaded\n");
|
||||
|
||||
if (ftdm_span_find_by_name("wp1", &span) != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error finding FreeTDM span %s\n", argv[1]);
|
||||
goto done;
|
||||
}
|
||||
parameters[0].var = "sigmod";
|
||||
parameters[0].val = "sangoma_prid";
|
||||
parameters[1].var = "switchtype";
|
||||
parameters[1].val = "euroisdn";
|
||||
parameters[1].var = "signalling";
|
||||
parameters[1].val = "pri_cpe";
|
||||
parameters[2].var = NULL;
|
||||
if (ftdm_configure_span_signaling(span, "sangoma_boost", on_signal, parameters) == FTDM_SUCCESS) {
|
||||
ftdm_span_start(span);
|
||||
} else {
|
||||
fprintf(stderr, "Error starting SS7_BOOST\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
while(ftdm_running() && R) {
|
||||
ftdm_sleep(1 * 1000);
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
ftdm_global_destroy();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
@@ -1,472 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Sangoma Technologies
|
||||
* Moises Silva <moy@sangoma.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sample program for the boost signaling absraction.
|
||||
* Usage: boostsample <span name>
|
||||
* The span name must be a valid span defined in freetdm.conf
|
||||
* compile this program linking to the freetdm library (ie -lfreetdm)
|
||||
**/
|
||||
|
||||
#ifndef __linux__
|
||||
#define _CRT_SECURE_NO_WARNINGS 1
|
||||
#endif
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "freetdm.h"
|
||||
|
||||
|
||||
/* arbitrary limit for max calls in this sample program */
|
||||
#define MAX_CALLS 255
|
||||
|
||||
/* some timers (in seconds) to fake responses in incoming calls */
|
||||
#define PROGRESS_TIMER 1
|
||||
#define ANSWER_TIMER 5
|
||||
#define HANGUP_TIMER 15
|
||||
|
||||
/* simple variable used to stop the application */
|
||||
static int app_running = 0;
|
||||
|
||||
typedef void (*expired_function_t)(ftdm_channel_t *channel);
|
||||
typedef struct dummy_timer_s {
|
||||
int time;
|
||||
ftdm_channel_t *channel;
|
||||
expired_function_t expired;
|
||||
} dummy_timer_t;
|
||||
|
||||
/* dummy second resolution timers */
|
||||
static dummy_timer_t g_timers[MAX_CALLS];
|
||||
|
||||
/* mutex to protect the timers (both, the test thread and the signaling thread may modify them) */
|
||||
static ftdm_mutex_t *g_schedule_mutex;
|
||||
|
||||
/* mutex to protect the channel */
|
||||
static ftdm_mutex_t *g_channel_mutex;
|
||||
|
||||
/* unique outgoing channel */
|
||||
static ftdm_channel_t *g_outgoing_channel = NULL;
|
||||
|
||||
static void interrupt_requested(int signal)
|
||||
{
|
||||
app_running = 0;
|
||||
}
|
||||
|
||||
static void schedule_timer(ftdm_channel_t *channel, int sec, expired_function_t expired)
|
||||
{
|
||||
int i;
|
||||
ftdm_mutex_lock(g_schedule_mutex);
|
||||
for (i = 0; i < sizeof(g_timers)/sizeof(g_timers[0]); i++) {
|
||||
/* check the timer slot is free to use */
|
||||
if (!g_timers[i].time) {
|
||||
g_timers[i].time = sec;
|
||||
g_timers[i].channel = channel;
|
||||
g_timers[i].expired = expired;
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
return;
|
||||
}
|
||||
}
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to schedule timer\n");
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
}
|
||||
|
||||
static void run_timers(void)
|
||||
{
|
||||
int i;
|
||||
void *channel;
|
||||
expired_function_t expired_func = NULL;
|
||||
ftdm_mutex_lock(g_schedule_mutex);
|
||||
for (i = 0; i < sizeof(g_timers)/sizeof(g_timers[0]); i++) {
|
||||
/* if there's time left, decrement */
|
||||
if (g_timers[i].time) {
|
||||
g_timers[i].time--;
|
||||
}
|
||||
|
||||
/* if time expired and we have an expired function, call it */
|
||||
if (!g_timers[i].time && g_timers[i].expired) {
|
||||
expired_func = g_timers[i].expired;
|
||||
channel = g_timers[i].channel;
|
||||
memset(&g_timers[i], 0, sizeof(g_timers[i]));
|
||||
expired_func(channel);
|
||||
}
|
||||
}
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
}
|
||||
|
||||
static void release_timers(ftdm_channel_t *channel)
|
||||
{
|
||||
int i;
|
||||
ftdm_mutex_lock(g_schedule_mutex);
|
||||
for (i = 0; i < sizeof(g_timers)/sizeof(g_timers[0]); i++) {
|
||||
/* clear any timer belonging to the given channel */
|
||||
if (g_timers[i].channel == channel) {
|
||||
memset(&g_timers[i], 0, sizeof(g_timers[i]));
|
||||
}
|
||||
}
|
||||
ftdm_mutex_unlock(g_schedule_mutex);
|
||||
}
|
||||
|
||||
/* hangup the call */
|
||||
static void send_hangup(ftdm_channel_t *channel)
|
||||
{
|
||||
char dtmfbuff[100];
|
||||
int rc;
|
||||
int spanid = ftdm_channel_get_span_id(channel);
|
||||
int chanid = ftdm_channel_get_id(channel);
|
||||
rc = ftdm_channel_dequeue_dtmf(channel, dtmfbuff, sizeof(dtmfbuff));
|
||||
if (rc) {
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Not hanging up channel %d:%d because has DTMF: %s\n", spanid, chanid, dtmfbuff);
|
||||
schedule_timer(channel, HANGUP_TIMER, send_hangup);
|
||||
return;
|
||||
}
|
||||
ftdm_log(FTDM_LOG_NOTICE, "-- Requesting hangup in channel %d:%d\n", spanid, chanid);
|
||||
ftdm_channel_call_hangup(channel);
|
||||
}
|
||||
|
||||
/* send answer for an incoming call */
|
||||
static void send_answer(ftdm_channel_t *channel)
|
||||
{
|
||||
/* we move the channel signaling state machine to UP (answered) */
|
||||
int spanid = ftdm_channel_get_span_id(channel);
|
||||
int chanid = ftdm_channel_get_id(channel);
|
||||
ftdm_log(FTDM_LOG_NOTICE, "-- Requesting answer in channel %d:%d\n", spanid, chanid);
|
||||
ftdm_channel_call_answer(channel);
|
||||
schedule_timer(channel, HANGUP_TIMER, send_hangup);
|
||||
}
|
||||
|
||||
/* send progress for an incoming */
|
||||
static void send_progress(ftdm_channel_t *channel)
|
||||
{
|
||||
/* we move the channel signaling state machine to UP (answered) */
|
||||
int spanid = ftdm_channel_get_span_id(channel);
|
||||
int chanid = ftdm_channel_get_id(channel);
|
||||
ftdm_log(FTDM_LOG_NOTICE, "-- Requesting progress\n", spanid, chanid);
|
||||
ftdm_channel_call_indicate(channel, FTDM_CHANNEL_INDICATE_PROGRESS);
|
||||
schedule_timer(channel, ANSWER_TIMER, send_answer);
|
||||
}
|
||||
|
||||
/* This function will be called in an undetermined signaling thread, you must not do
|
||||
* any blocking operations here or the signaling stack may delay other call event processing
|
||||
* The arguments for this function are defined in FIO_SIGNAL_CB_FUNCTION prototype, I just
|
||||
* name them here for your convenience:
|
||||
* ftdm_sigmsg_t *sigmsg
|
||||
* - The sigmsg structure contains the ftdm_channel structure that represents the channel where
|
||||
* the event occurred and the event_id of the signaling event that just occurred.
|
||||
* */
|
||||
static FIO_SIGNAL_CB_FUNCTION(on_signaling_event)
|
||||
{
|
||||
switch (sigmsg->event_id) {
|
||||
/* This event signals the start of an incoming call */
|
||||
case FTDM_SIGEVENT_START:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Incoming call received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
schedule_timer(sigmsg->channel, PROGRESS_TIMER, send_progress);
|
||||
break;
|
||||
/* This event signals progress on an outgoing call */
|
||||
case FTDM_SIGEVENT_PROGRESS_MEDIA:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Progress message received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
break;
|
||||
/* This event signals answer in an outgoing call */
|
||||
case FTDM_SIGEVENT_UP:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Answer received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
ftdm_channel_command(sigmsg->channel, FTDM_COMMAND_ENABLE_DTMF_DETECT, NULL);
|
||||
/* now the channel is answered and we can use
|
||||
* ftdm_channel_wait() to wait for input/output in a channel (equivalent to poll() or select())
|
||||
* ftdm_channel_read() to read available data in a channel
|
||||
* ftdm_channel_write() to write to the channel */
|
||||
break;
|
||||
/* This event signals hangup from the other end */
|
||||
case FTDM_SIGEVENT_STOP:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Hangup received in channel %d:%d\n", sigmsg->span_id, sigmsg->chan_id);
|
||||
ftdm_mutex_lock(g_channel_mutex);
|
||||
if (g_outgoing_channel == sigmsg->channel) {
|
||||
g_outgoing_channel = NULL;
|
||||
}
|
||||
ftdm_mutex_unlock(g_channel_mutex);
|
||||
/* release any timer for this channel */
|
||||
release_timers(sigmsg->channel);
|
||||
/* acknowledge the hangup */
|
||||
ftdm_channel_call_hangup(sigmsg->channel);
|
||||
break;
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_WARNING, "Unhandled event %s in channel %d:%d\n", ftdm_signal_event2str(sigmsg->event_id),
|
||||
sigmsg->span_id, sigmsg->chan_id);
|
||||
break;
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
static void place_call(const ftdm_span_t *span, const char *number)
|
||||
{
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
ftdm_caller_data_t caller_data = {{ 0 }};
|
||||
ftdm_status_t status = FTDM_FAIL;
|
||||
|
||||
/* set destiny number */
|
||||
ftdm_set_string(caller_data.dnis.digits, number);
|
||||
|
||||
/* set callerid */
|
||||
ftdm_set_string(caller_data.cid_name, "testsangomaboost");
|
||||
ftdm_set_string(caller_data.cid_num.digits, "1234");
|
||||
|
||||
/* request to search for an outgoing channel top down with the given caller data.
|
||||
* it is also an option to use ftdm_channel_open_by_group to let freetdm hunt
|
||||
* an available channel in a given group instead of per span
|
||||
* */
|
||||
status = ftdm_channel_open_by_span(ftdm_span_get_id(span), FTDM_TOP_DOWN, &caller_data, &ftdmchan);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to originate call\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ftdm_mutex_lock(g_channel_mutex);
|
||||
g_outgoing_channel = ftdmchan;
|
||||
ftdm_mutex_unlock(g_channel_mutex);
|
||||
|
||||
/* set the caller data for the outgoing channel */
|
||||
ftdm_channel_set_caller_data(ftdmchan, &caller_data);
|
||||
|
||||
status = ftdm_channel_call_place(ftdmchan);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Failed to originate call\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* this is required to initialize the outgoing channel */
|
||||
ftdm_channel_init(ftdmchan);
|
||||
}
|
||||
|
||||
static void *media_thread(ftdm_thread_t *th, void *data)
|
||||
{
|
||||
/* The application thread can go on and do anything else, like waiting for a shutdown signal */
|
||||
ftdm_wait_flag_t flags = FTDM_NO_FLAGS;
|
||||
ftdm_status_t status;
|
||||
ftdm_channel_t *chan;
|
||||
char iobuff[160];
|
||||
char dnis_str[] = "1234";
|
||||
int tx_dtmf = 0;
|
||||
ftdm_size_t datalen = 0;
|
||||
memset(iobuff, 0, sizeof(iobuff));
|
||||
while(ftdm_running() && app_running) {
|
||||
ftdm_mutex_lock(g_channel_mutex);
|
||||
chan = g_outgoing_channel;
|
||||
ftdm_mutex_unlock(g_channel_mutex);
|
||||
if (chan && tx_dtmf) {
|
||||
flags = FTDM_WRITE | FTDM_READ;
|
||||
ftdm_channel_wait(chan, &flags, 100);
|
||||
if (flags & FTDM_WRITE) {
|
||||
datalen = sizeof(iobuff);
|
||||
status = ftdm_channel_write(chan, iobuff, datalen, &datalen);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "writing to channel failed\n");
|
||||
}
|
||||
}
|
||||
if (flags & FTDM_READ) {
|
||||
datalen = sizeof(iobuff);
|
||||
status = ftdm_channel_read(chan, iobuff, &datalen);
|
||||
if (status != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "reading from channel failed\n");
|
||||
}
|
||||
}
|
||||
} else if (chan && ftdm_channel_call_check_answered(chan)) {
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Transmitting DNIS %s\n", dnis_str);
|
||||
ftdm_channel_command(g_outgoing_channel, FTDM_COMMAND_SEND_DTMF, dnis_str);
|
||||
tx_dtmf = 1;
|
||||
} else {
|
||||
tx_dtmf = 0;
|
||||
ftdm_sleep(100);
|
||||
}
|
||||
}
|
||||
printf("Shutting down media thread ...\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
ftdm_conf_parameter_t parameters[20];
|
||||
ftdm_span_t *span;
|
||||
char *todial = NULL;
|
||||
const char *sigtype = NULL;
|
||||
int32_t ticks = 0;
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "Usage: %s <span name> <cpe|net> [number to dial if any]\n", argv[0]);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* register a handler to shutdown things properly */
|
||||
#ifdef _WIN64
|
||||
// still trying to figure this one out otherwise triggers error
|
||||
if (signal(SIGINT, interrupt_requested) < 0) {
|
||||
#else
|
||||
if (signal(SIGINT, interrupt_requested) == SIG_ERR) {
|
||||
#endif
|
||||
fprintf(stderr, "Could not set the SIGINT signal handler: %s\n", strerror(errno));
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if (!strcmp(argv[2], "cpe")) {
|
||||
sigtype = "pri_cpe";
|
||||
} else if (!strcmp(argv[2], "net")) {
|
||||
sigtype = "pri_net";
|
||||
} else {
|
||||
fprintf(stderr, "Valid signaling types are cpe and net only\n");
|
||||
exit(-1);
|
||||
}
|
||||
printf("Using signalling %s\n", sigtype);
|
||||
|
||||
if (argc >= 4) {
|
||||
todial = argv[3];
|
||||
if (!strlen(todial)) {
|
||||
todial = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* clear any outstanding timers */
|
||||
memset(&g_timers, 0, sizeof(g_timers));
|
||||
|
||||
/* set the logging level to use */
|
||||
ftdm_global_set_default_logger(FTDM_LOG_LEVEL_DEBUG);
|
||||
|
||||
/* Initialize the FTDM library */
|
||||
if (ftdm_global_init() != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error loading FreeTDM\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* create the schedule and channel mutex */
|
||||
ftdm_mutex_create(&g_schedule_mutex);
|
||||
ftdm_mutex_create(&g_channel_mutex);
|
||||
|
||||
/* Load the FreeTDM configuration */
|
||||
if (ftdm_global_configuration() != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error configuring FreeTDM\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
/* At this point FreeTDM is ready to be used, the spans defined in freetdm.conf have the basic I/O board configuration
|
||||
* but no telephony signaling configuration at all. */
|
||||
printf("FreeTDM loaded ...\n");
|
||||
|
||||
/* Retrieve a span by name (according to freetdm.conf) */
|
||||
if (ftdm_span_find_by_name(argv[1], &span) != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error finding FreeTDM span %s\n", argv[1]);
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* prepare the configuration parameters that will be sent down to the signaling stack, the array of paramters must be terminated by an
|
||||
* array element with a null .var member */
|
||||
|
||||
/* for sangoma_boost signaling (abstraction signaling used by Sangoma for PRI, BRI and SS7) the first parameter you must send
|
||||
* is sigmod, which must be either sangoma_prid, if you have the PRI stack available, or sangoma_brid for the BRI stack */
|
||||
parameters[0].var = "sigmod";
|
||||
parameters[0].val = "sangoma_prid";
|
||||
|
||||
/* following parameters are signaling stack specific, this ones are for PRI */
|
||||
parameters[1].var = "switchtype";
|
||||
parameters[1].val = "national";
|
||||
|
||||
parameters[2].var = "signalling";
|
||||
parameters[2].val = sigtype;
|
||||
|
||||
/*
|
||||
* parameters[3].var = "nfas_primary";
|
||||
* parameters[3].val = "4"; //span number
|
||||
*
|
||||
* parameters[4].var = "nfas_secondary";
|
||||
* parameters[4].val = "2"; //span number
|
||||
*
|
||||
* parameters[5].var = "nfas_group";
|
||||
* parameters[5].val = "1";
|
||||
* */
|
||||
|
||||
/* the last parameter .var member must be NULL! */
|
||||
parameters[3].var = NULL;
|
||||
|
||||
/* send the configuration values down to the stack */
|
||||
if (ftdm_configure_span_signaling(span, "sangoma_boost", on_signaling_event, parameters) != FTDM_SUCCESS) {
|
||||
fprintf(stderr, "Error configuring sangoma_boost signaling abstraction in span %s\n", ftdm_span_get_name(span));
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* configuration succeeded, we can proceed now to start the span
|
||||
* This step will launch at least 1 background (may be more, depending on the signaling stack used)
|
||||
* to handle *ALL* signaling events for this span, your on_signaling_event callback will be called always
|
||||
* in one of those infraestructure threads and you MUST NOT block in that handler to avoid delays and errors
|
||||
* in the signaling processing for any call.
|
||||
* */
|
||||
ftdm_span_start(span);
|
||||
|
||||
if (ftdm_thread_create_detached(media_thread, NULL) != FTDM_SUCCESS){
|
||||
fprintf(stderr, "Error launching media thread\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
app_running = 1;
|
||||
|
||||
/* The application thread can go on and do anything else, like waiting for a shutdown signal */
|
||||
while(ftdm_running() && app_running) {
|
||||
ftdm_sleep(1000);
|
||||
run_timers();
|
||||
ticks++;
|
||||
if (!(ticks % 10) && todial && !g_outgoing_channel) {
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Originating call to number %s\n", todial);
|
||||
place_call(span, todial);
|
||||
}
|
||||
}
|
||||
printf("Shutting down FreeTDM ...\n");
|
||||
done:
|
||||
|
||||
ftdm_mutex_destroy(&g_schedule_mutex);
|
||||
ftdm_mutex_destroy(&g_channel_mutex);
|
||||
|
||||
/* whenever you're done, this function will shutdown the signaling threads in any span that was started */
|
||||
ftdm_global_destroy();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
@@ -83,12 +83,12 @@ AC_ARG_ENABLE(64,
|
||||
|
||||
if test "x${ax_cv_c_compiler_vendor}" = "xsun" ; then
|
||||
if test "${enable_64}" = "yes"; then
|
||||
CFLAGS="$CFLAGS -xc99=all -mt -m64 -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -xc99=all -mt -m64 -lgpg-error"
|
||||
CFLAGS="$CFLAGS -mt -m64 -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -mt -m64 -lgpg-error"
|
||||
SUNFLAGS="-xc99=all -mt -m64 -lgpg-error"
|
||||
else
|
||||
CFLAGS="$CFLAGS -xc99=all -mt -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -xc99=all -mt -lgpg-error"
|
||||
CFLAGS="$CFLAGS -mt -lgpg-error"
|
||||
CXXFLAGS="$CXXFLAGS -mt -lgpg-error"
|
||||
SUNFLAGS="-xc99=all -mt -lgpg-error"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -47,7 +47,9 @@
|
||||
{
|
||||
fld dbl
|
||||
frndint
|
||||
fstp dbl
|
||||
}
|
||||
return (long int) dbl;
|
||||
}
|
||||
#elif defined (_WIN64)
|
||||
#include <intrin.h>
|
||||
|
||||
@@ -135,7 +135,9 @@ void dump_chan_xml(zap_span_t *span, uint32_t chan_id, switch_stream_handle_t *s
|
||||
|
||||
static void zap_set_npi(const char *npi_string, uint8_t *target)
|
||||
{
|
||||
if (!strcasecmp(npi_string, "isdn") || !strcasecmp(npi_string, "e164")) {
|
||||
if (switch_is_number(npi_string)) {
|
||||
*target = (uint8_t)atoi(npi_string);
|
||||
} else if (!strcasecmp(npi_string, "isdn") || !strcasecmp(npi_string, "e164")) {
|
||||
*target = ZAP_NPI_ISDN;
|
||||
} else if (!strcasecmp(npi_string, "data")) {
|
||||
*target = ZAP_NPI_DATA;
|
||||
@@ -157,7 +159,9 @@ static void zap_set_npi(const char *npi_string, uint8_t *target)
|
||||
|
||||
static void zap_set_ton(const char *ton_string, uint8_t *target)
|
||||
{
|
||||
if (!strcasecmp(ton_string, "national")) {
|
||||
if (switch_is_number(ton_string)) {
|
||||
*target = (uint8_t)atoi(ton_string);
|
||||
} else if (!strcasecmp(ton_string, "national")) {
|
||||
*target = ZAP_TON_NATIONAL;
|
||||
} else if (!strcasecmp(ton_string, "international")) {
|
||||
*target = ZAP_TON_INTERNATIONAL;
|
||||
@@ -1230,27 +1234,25 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||
zap_set_string(caller_data.ani.digits, dest);
|
||||
}
|
||||
|
||||
if ((var = switch_event_get_header(var_event, "openzap_outbound_ton")) || (var = switch_core_get_variable("openzap_outbound_ton"))) {
|
||||
if (!strcasecmp(var, "national")) {
|
||||
caller_data.ani.type = ZAP_TON_NATIONAL;
|
||||
} else if (!strcasecmp(var, "international")) {
|
||||
caller_data.ani.type = ZAP_TON_INTERNATIONAL;
|
||||
} else if (!strcasecmp(var, "local")) {
|
||||
caller_data.ani.type = ZAP_TON_SUBSCRIBER_NUMBER;
|
||||
} else if (!strcasecmp(var, "unknown")) {
|
||||
caller_data.ani.type = ZAP_TON_UNKNOWN;
|
||||
}
|
||||
if ((var = switch_event_get_header(var_event, "openzap_outbound_ton"))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Setting TON to: %s\n", var);
|
||||
zap_set_ton(var, &caller_data.ani.type);
|
||||
} else {
|
||||
caller_data.ani.type = outbound_profile->destination_number_ton;
|
||||
}
|
||||
|
||||
if ((var = switch_event_get_header(var_event, "openzap_custom_call_data")) || (var = switch_core_get_variable("openzap_custom_call_data"))) {
|
||||
if ((var = switch_event_get_header(var_event, "openzap_custom_call_data"))) {
|
||||
zap_set_string((char *)caller_data.raw_data, var);
|
||||
caller_data.raw_data_len = strlen(var);
|
||||
}
|
||||
|
||||
caller_data.ani.plan = outbound_profile->destination_number_numplan;
|
||||
|
||||
|
||||
if ((var = switch_event_get_header(var_event, "openzap_outbound_npi"))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Setting NPI to: %s\n", var);
|
||||
zap_set_npi(var, &caller_data.ani.plan);
|
||||
} else {
|
||||
caller_data.ani.plan = outbound_profile->destination_number_numplan;
|
||||
}
|
||||
|
||||
/* blindly copy data from outbound_profile. They will be overwritten
|
||||
* by calling zap_caller_data if needed after */
|
||||
caller_data.cid_num.type = outbound_profile->caller_ton;
|
||||
|
||||
@@ -41,11 +41,11 @@
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
@@ -57,11 +57,11 @@
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
@@ -77,9 +77,11 @@
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\..\..\w32\extlib.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\..\..\..\w32\extlib.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
@@ -92,10 +94,12 @@
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||
<Import Project="..\..\..\..\w32\extlib.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" />
|
||||
<Import Project="..\..\..\..\w32\extlib.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
@@ -110,18 +114,6 @@
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">false</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Midl>
|
||||
@@ -231,45 +223,23 @@
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>Win32</TargetEnvironment>
|
||||
<TypeLibraryName>.\Debug_x86/portaudio.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\src\common;..\..\include;.\;..\..\src\os\win;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;PA_NO_ASIO;PAWIN_USE_WDMKS_DEVICE_INFO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;PA_NO_ASIO;PA_NO_WMME;PAWIN_USE_WDMKS_DEVICE_INFO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)/portaudio.pch</PrecompiledHeaderOutputFile>
|
||||
<AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
|
||||
<ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>ksuser.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>$(Platform)\$(Configuration)\portaudio_x86.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<ModuleDefinitionFile>.\portaudio.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>$(Platform)\$(Configuration)\portaudio_x86.pdb</ProgramDatabaseFile>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(Platform)\$(Configuration)\portaudio_x86.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>$(Platform)\$(Configuration)\portaudio.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">
|
||||
@@ -278,45 +248,23 @@
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
<TypeLibraryName>.\Debug_x86/portaudio.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<AdditionalIncludeDirectories>..\..\src\common;..\..\include;.\;..\..\src\os\win;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;PAWIN_USE_WDMKS_DEVICE_INFO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;PA_NO_ASIO;PA_NO_WMME;PAWIN_USE_WDMKS_DEVICE_INFO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\portaudio.pch</PrecompiledHeaderOutputFile>
|
||||
<AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
|
||||
<ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<ResourceCompile>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>ksuser.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<OutputFile>$(Platform)\$(Configuration)\portaudio_x64.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<ModuleDefinitionFile>.\portaudio.def</ModuleDefinitionFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<ProgramDatabaseFile>$(Platform)\$(Configuration)/portaudio_x64.pdb</ProgramDatabaseFile>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(Platform)\$(Configuration)\portaudio_x64.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>$(Platform)\$(Configuration)/portaudio_x64.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">
|
||||
@@ -325,22 +273,15 @@
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>Win32</TargetEnvironment>
|
||||
<TypeLibraryName>.\Release_x86/portaudio.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||
<AdditionalIncludeDirectories>..\..\src\common;..\..\include;.\;..\..\src\os\win;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;PA_NO_ASIO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;PA_NO_ASIO;PA_NO_WMME;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)/portaudio.pch</PrecompiledHeaderOutputFile>
|
||||
<AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
|
||||
<ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</ClCompile>
|
||||
@@ -348,20 +289,8 @@
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<OutputFile>$(Platform)\$(Configuration)\portaudio_x86.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<ModuleDefinitionFile>.\portaudio.def</ModuleDefinitionFile>
|
||||
<ProgramDatabaseFile>$(Platform)\$(Configuration)\portaudio_x86.pdb</ProgramDatabaseFile>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(Platform)\$(Configuration)\portaudio_x86.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>$(Platform)\$(Configuration)\portaudio.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">
|
||||
@@ -370,22 +299,15 @@
|
||||
<MkTypLibCompatible>true</MkTypLibCompatible>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<TargetEnvironment>X64</TargetEnvironment>
|
||||
<TypeLibraryName>.\Release_x86/portaudio.tlb</TypeLibraryName>
|
||||
<HeaderFileName>
|
||||
</HeaderFileName>
|
||||
</Midl>
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<AdditionalIncludeDirectories>..\..\src\common;..\..\include;.\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||
<AdditionalIncludeDirectories>..\..\src\common;..\..\include;.\;..\..\src\os\win;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_USRDLL;PA_ENABLE_DEBUG_OUTPUT;_CRT_SECURE_NO_DEPRECATE;PA_NO_ASIO;PA_NO_WMME;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<PrecompiledHeaderOutputFile>$(Platform)\$(Configuration)\portaudio.pch</PrecompiledHeaderOutputFile>
|
||||
<AssemblerListingLocation>$(Platform)\$(Configuration)\</AssemblerListingLocation>
|
||||
<ObjectFileName>$(Platform)\$(Configuration)\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>$(Platform)\$(Configuration)\</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
</ClCompile>
|
||||
@@ -393,20 +315,8 @@
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Culture>0x0409</Culture>
|
||||
</ResourceCompile>
|
||||
<Link>
|
||||
<OutputFile>$(Platform)\$(Configuration)\portaudio_x64.dll</OutputFile>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<ModuleDefinitionFile>.\portaudio.def</ModuleDefinitionFile>
|
||||
<ProgramDatabaseFile>$(Platform)\$(Configuration)/portaudio_x64.pdb</ProgramDatabaseFile>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<ImportLibrary>$(Platform)\$(Configuration)/portaudio_x64.lib</ImportLibrary>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>$(Platform)\$(Configuration)\portaudio_x64.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
@@ -594,6 +504,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -605,6 +516,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
@@ -618,6 +530,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -629,6 +542,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
@@ -642,6 +556,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -653,6 +568,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
@@ -666,6 +582,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -677,6 +594,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
@@ -690,6 +608,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -701,6 +620,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
@@ -714,6 +634,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -725,6 +646,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
@@ -738,6 +660,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -749,6 +672,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
@@ -762,6 +686,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
@@ -773,6 +698,7 @@
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">true</ExcludedFromBuild>
|
||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">..\..\src\hostapi\asio\ASIOSDK\host;..\..\src\hostapi\asio\ASIOSDK\host\pc;..\..\src\hostapi\asio\ASIOSDK\common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release DirectSound|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||
|
||||
@@ -508,6 +508,12 @@ if not exist "$(ProjectDir)$(IntDir)\auth_client.obj" "autogen.cmd"
|
||||
<Project>{8b3b4c4c-13c2-446c-beb0-f412cc2cfb9a}</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\openssl\libeay32.2010.vcxproj">
|
||||
<Project>{d331904d-a00a-4694-a5a3-fcff64ab5dbe}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\openssl\ssleay32.2010.vcxproj">
|
||||
<Project>{b4b62169-5ad4-4559-8707-3d933ac5db39}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\pthread\pthread.2010.vcxproj">
|
||||
<Project>{df018947-0fff-4eb3-bdee-441dc81da7a4}</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
|
||||
@@ -246,6 +246,7 @@ struct switch_runtime {
|
||||
int sql_buffer_len;
|
||||
int max_sql_buffer_len;
|
||||
switch_dbtype_t odbc_dbtype;
|
||||
char hostname[256];
|
||||
};
|
||||
|
||||
extern struct switch_runtime runtime;
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
* Contributor(s):
|
||||
*
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Luke Dashjr <luke@openmethods.com> (OpenMethods, LLC)
|
||||
*
|
||||
*
|
||||
* switch_core.h -- Core Library
|
||||
@@ -758,6 +759,9 @@ SWITCH_DECLARE(switch_core_session_t *) switch_core_session_force_locate(_In_z_
|
||||
\return the value of the desired variable
|
||||
*/
|
||||
SWITCH_DECLARE(char *) switch_core_get_variable(_In_z_ const char *varname);
|
||||
SWITCH_DECLARE(char *) switch_core_get_variable_dup(_In_z_ const char *varname);
|
||||
SWITCH_DECLARE(char *) switch_core_get_variable_pdup(_In_z_ const char *varname, switch_memory_pool_t *pool);
|
||||
SWITCH_DECLARE(const char *) switch_core_get_hostname(void);
|
||||
|
||||
/*!
|
||||
\brief Add a global variable to the core
|
||||
@@ -1734,6 +1738,15 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_close(switch_asr_handle_t *ah, s
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags);
|
||||
|
||||
/*!
|
||||
\brief Feed DTMF to an asr handle
|
||||
\param ah the handle to feed data to
|
||||
\param dtmf a string of DTMF digits
|
||||
\param flags flags to influence behaviour
|
||||
\return SWITCH_STATUS_SUCCESS
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);
|
||||
|
||||
/*!
|
||||
\brief Check an asr handle for results
|
||||
\param ah the handle to check
|
||||
@@ -1768,6 +1781,29 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_load_grammar(switch_asr_handle_t
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_asr_unload_grammar(switch_asr_handle_t *ah, const char *name);
|
||||
|
||||
/*!
|
||||
\brief Enable a grammar from an asr handle
|
||||
\param ah the handle to enable the grammar from
|
||||
\param name the name of the grammar to enable
|
||||
\return SWITCH_STATUS_SUCCESS
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_asr_enable_grammar(switch_asr_handle_t *ah, const char *name);
|
||||
|
||||
/*!
|
||||
\brief Disable a grammar from an asr handle
|
||||
\param ah the handle to disable the grammar from
|
||||
\param name the name of the grammar to disable
|
||||
\return SWITCH_STATUS_SUCCESS
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_grammar(switch_asr_handle_t *ah, const char *name);
|
||||
|
||||
/*!
|
||||
\brief Disable all grammars from an asr handle
|
||||
\param ah the handle to disable the grammars from
|
||||
\return SWITCH_STATUS_SUCCESS
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_all_grammars(switch_asr_handle_t *ah);
|
||||
|
||||
/*!
|
||||
\brief Pause detection on an asr handle
|
||||
\param ah the handle to pause
|
||||
|
||||
@@ -68,6 +68,10 @@ Note that the first parameter to the new operator is implicitly handled by c++..
|
||||
SWITCH_DECLARE(void) consoleLog(char *level_str, char *msg);
|
||||
SWITCH_DECLARE(void) consoleCleanLog(char *msg);
|
||||
|
||||
SWITCH_DECLARE(bool) email(char *to, char *from, char *headers = NULL, char *body = NULL,
|
||||
char *file = NULL, char *convert_cmd = NULL, char *convert_ext = NULL);
|
||||
|
||||
|
||||
class CoreSession;
|
||||
|
||||
class IVRMenu {
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Neal Horman <neal at wanlink dot com>
|
||||
* Bret McDanel <trixter AT 0xdecafbad dot com>
|
||||
* Luke Dashjr <luke@openmethods.com> (OpenMethods, LLC)
|
||||
*
|
||||
* switch_ivr.h -- IVR Library
|
||||
*
|
||||
@@ -198,8 +199,38 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_load_grammar(switch_cor
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_core_session_t *session, const char *name);
|
||||
|
||||
/*!
|
||||
\brief Enable a grammar on a background speech detection handle
|
||||
\param session The session to change the grammar on
|
||||
\param name the grammar name
|
||||
\return SWITCH_STATUS_SUCCESS if all is well
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_enable_grammar(switch_core_session_t *session, const char *name);
|
||||
|
||||
/*!
|
||||
\brief Disable a grammar on a background speech detection handle
|
||||
\param session The session to change the grammar on
|
||||
\param name the grammar name
|
||||
\return SWITCH_STATUS_SUCCESS if all is well
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_grammar(switch_core_session_t *session, const char *name);
|
||||
|
||||
/*!
|
||||
\brief Disable all grammars on a background speech detection handle
|
||||
\param session The session to change the grammar on
|
||||
\return SWITCH_STATUS_SUCCESS if all is well
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_all_grammars(switch_core_session_t *session);
|
||||
|
||||
SWITCH_DECLARE(switch_status_t) switch_ivr_set_param_detect_speech(switch_core_session_t *session, const char *name, const char *val);
|
||||
|
||||
/*!
|
||||
\brief Start input timers on a background speech detection handle
|
||||
\param session The session to start the timers on
|
||||
\return SWITCH_STATUS_SUCCESS if all is well
|
||||
*/
|
||||
SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_start_input_timers(switch_core_session_t *session);
|
||||
|
||||
/*!
|
||||
\brief Record a session to disk
|
||||
\param session the session to record
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
* Contributor(s):
|
||||
*
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Luke Dashjr <luke@openmethods.com> (OpenMethods, LLC)
|
||||
*
|
||||
*
|
||||
* switch_module_interfaces.h -- Module Interface Definitions
|
||||
@@ -396,6 +397,14 @@ struct switch_asr_interface {
|
||||
switch_mutex_t *reflock;
|
||||
switch_loadable_module_interface_t *parent;
|
||||
struct switch_asr_interface *next;
|
||||
/*! function to enable a grammar to the asr interface */
|
||||
switch_status_t (*asr_enable_grammar) (switch_asr_handle_t *ah, const char *name);
|
||||
/*! function to disable a grammar to the asr interface */
|
||||
switch_status_t (*asr_disable_grammar) (switch_asr_handle_t *ah, const char *name);
|
||||
/*! function to disable all grammars to the asr interface */
|
||||
switch_status_t (*asr_disable_all_grammars) (switch_asr_handle_t *ah);
|
||||
/*! function to feed DTMF to the ASR */
|
||||
switch_status_t (*asr_feed_dtmf) (switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);
|
||||
};
|
||||
|
||||
/*! an abstract representation of an asr speech interface. */
|
||||
|
||||
@@ -49,7 +49,7 @@ typedef enum {
|
||||
SWITCH_NAT_TCP
|
||||
} switch_nat_ip_proto_t;
|
||||
|
||||
|
||||
SWITCH_DECLARE(const char *) switch_nat_get_type(void);
|
||||
|
||||
/*!
|
||||
\brief Initilize the NAT Traversal System
|
||||
|
||||
@@ -2625,8 +2625,10 @@ SWITCH_STANDARD_API(cc_config_api_function)
|
||||
cc_queue_t *queue = NULL;
|
||||
if ((queue = get_queue(queue_name))) {
|
||||
queue_rwunlock(queue);
|
||||
stream->write_function(stream, "%s", "+OK\n");
|
||||
} else {
|
||||
stream->write_function(stream, "%s", "-ERR Invalid Queue not found!\n");
|
||||
}
|
||||
stream->write_function(stream, "%s", "+OK\n");
|
||||
}
|
||||
} else if (action && !strcasecmp(action, "unload")) {
|
||||
if (argc-initial_argc < 1) {
|
||||
@@ -2648,8 +2650,10 @@ SWITCH_STANDARD_API(cc_config_api_function)
|
||||
destroy_queue(queue_name, SWITCH_FALSE);
|
||||
if ((queue = get_queue(queue_name))) {
|
||||
queue_rwunlock(queue);
|
||||
stream->write_function(stream, "%s", "+OK\n");
|
||||
} else {
|
||||
stream->write_function(stream, "%s", "-ERR Invalid Queue not found!\n");
|
||||
}
|
||||
stream->write_function(stream, "%s", "+OK\n");
|
||||
}
|
||||
} else if (action && !strcasecmp(action, "list")) {
|
||||
if (argc-initial_argc < 1) {
|
||||
@@ -2671,7 +2675,6 @@ SWITCH_STANDARD_API(cc_config_api_function)
|
||||
goto done;
|
||||
} else {
|
||||
const char *queue_name = argv[0 + initial_argc];
|
||||
|
||||
struct list_result cbt;
|
||||
cbt.row_process = 0;
|
||||
cbt.stream = stream;
|
||||
|
||||
@@ -349,7 +349,7 @@ SWITCH_STANDARD_API(timer_test_function)
|
||||
|
||||
SWITCH_STANDARD_API(group_call_function)
|
||||
{
|
||||
char *domain;
|
||||
char *domain, *dup_domain = NULL;
|
||||
char *group_name = NULL;
|
||||
char *flags;
|
||||
int ok = 0;
|
||||
@@ -392,7 +392,9 @@ SWITCH_STANDARD_API(group_call_function)
|
||||
if (domain) {
|
||||
*domain++ = '\0';
|
||||
} else {
|
||||
domain = switch_core_get_variable("domain");
|
||||
if ((dup_domain = switch_core_get_variable_dup("domain"))) {
|
||||
domain = dup_domain;
|
||||
}
|
||||
}
|
||||
|
||||
if (!zstr(domain)) {
|
||||
@@ -544,13 +546,14 @@ SWITCH_STANDARD_API(group_call_function)
|
||||
}
|
||||
|
||||
end:
|
||||
|
||||
|
||||
switch_safe_free(group_name);
|
||||
switch_safe_free(dup_domain);
|
||||
|
||||
if (!ok) {
|
||||
stream->write_function(stream, "error/NO_ROUTE_DESTINATION");
|
||||
}
|
||||
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -559,7 +562,7 @@ SWITCH_STANDARD_API(in_group_function)
|
||||
{
|
||||
switch_xml_t x_domain, xml = NULL, x_user = NULL, x_group;
|
||||
int argc;
|
||||
char *mydata = NULL, *argv[2], *user, *domain;
|
||||
char *mydata = NULL, *argv[2], *user, *domain, *dup_domain = NULL;
|
||||
char delim = ',';
|
||||
switch_event_t *params = NULL;
|
||||
const char *rval = "false";
|
||||
@@ -579,7 +582,9 @@ SWITCH_STANDARD_API(in_group_function)
|
||||
if ((domain = strchr(user, '@'))) {
|
||||
*domain++ = '\0';
|
||||
} else {
|
||||
domain = switch_core_get_variable("domain");
|
||||
if ((dup_domain = switch_core_get_variable_dup("domain"))) {
|
||||
domain = dup_domain;
|
||||
}
|
||||
}
|
||||
|
||||
switch_event_create(¶ms, SWITCH_EVENT_REQUEST_PARAMS);
|
||||
@@ -601,6 +606,7 @@ SWITCH_STANDARD_API(in_group_function)
|
||||
|
||||
switch_xml_free(xml);
|
||||
switch_safe_free(mydata);
|
||||
switch_safe_free(dup_domain);
|
||||
switch_event_destroy(¶ms);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
@@ -610,7 +616,7 @@ SWITCH_STANDARD_API(user_data_function)
|
||||
{
|
||||
switch_xml_t x_domain, xml = NULL, x_user = NULL, x_group = NULL, x_param, x_params;
|
||||
int argc;
|
||||
char *mydata = NULL, *argv[3], *key = NULL, *type = NULL, *user, *domain;
|
||||
char *mydata = NULL, *argv[3], *key = NULL, *type = NULL, *user, *domain, *dup_domain = NULL;
|
||||
char delim = ' ';
|
||||
const char *container = "params", *elem = "param";
|
||||
const char *result = NULL;
|
||||
@@ -631,7 +637,9 @@ SWITCH_STANDARD_API(user_data_function)
|
||||
if ((domain = strchr(user, '@'))) {
|
||||
*domain++ = '\0';
|
||||
} else {
|
||||
if (!(domain = switch_core_get_variable("domain"))) {
|
||||
if ((dup_domain = switch_core_get_variable("domain"))) {
|
||||
domain = dup_domain;
|
||||
} else {
|
||||
domain = "cluecon.com";
|
||||
}
|
||||
}
|
||||
@@ -694,6 +702,7 @@ SWITCH_STANDARD_API(user_data_function)
|
||||
}
|
||||
switch_xml_free(xml);
|
||||
switch_safe_free(mydata);
|
||||
switch_safe_free(dup_domain);
|
||||
switch_event_destroy(¶ms);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
@@ -4375,7 +4384,9 @@ SWITCH_STANDARD_API(global_getvar_function)
|
||||
if (zstr(cmd)) {
|
||||
switch_core_dump_variables(stream);
|
||||
} else {
|
||||
stream->write_function(stream, "%s", switch_str_nil(switch_core_get_variable(cmd)));
|
||||
char *var = switch_core_get_variable_dup(cmd);
|
||||
stream->write_function(stream, "%s", switch_str_nil(var));
|
||||
switch_safe_free(var);
|
||||
}
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -4428,19 +4439,23 @@ SWITCH_STANDARD_API(strftime_tz_api_function)
|
||||
|
||||
if ((format = strchr(mycmd, ' '))) {
|
||||
*format++ = '\0';
|
||||
}
|
||||
|
||||
if ((p = strchr(format, '|'))) {
|
||||
*p++ = '\0';
|
||||
when = atol(format);
|
||||
format = p;
|
||||
if (format && (p = strchr(format, '|'))) {
|
||||
*p++ = '\0';
|
||||
when = atol(format);
|
||||
format = p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (switch_strftime_tz(tz_name, format, date, sizeof(date), when * 1000000) == SWITCH_STATUS_SUCCESS) { /* The lookup of the zone may fail. */
|
||||
if (zstr(format)) {
|
||||
format = "%Y-%m-%d";
|
||||
}
|
||||
|
||||
if (format && switch_strftime_tz(tz_name, format, date, sizeof(date), when * 1000000) == SWITCH_STATUS_SUCCESS) { /* The lookup of the zone may fail. */
|
||||
stream->write_function(stream, "%s", date);
|
||||
} else {
|
||||
stream->write_function(stream, "-ERR Invalid Timezone\n");
|
||||
stream->write_function(stream, "-ERR Invalid Timezone/Format\n");
|
||||
}
|
||||
|
||||
switch_safe_free(mycmd);
|
||||
|
||||
@@ -401,13 +401,14 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
char *bridgeto, uint32_t timeout,
|
||||
char *flags,
|
||||
char *cid_name,
|
||||
char *cid_num,
|
||||
char *cid_num,
|
||||
char *profile,
|
||||
switch_call_cause_t *cause,
|
||||
switch_call_cause_t *cancel_cause);
|
||||
static switch_status_t conference_outcall_bg(conference_obj_t *conference,
|
||||
char *conference_name,
|
||||
switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name,
|
||||
const char *cid_num, const char *call_uuid, switch_call_cause_t *cancel_cause);
|
||||
const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause);
|
||||
SWITCH_STANDARD_APP(conference_function);
|
||||
static void launch_conference_thread(conference_obj_t *conference);
|
||||
static void launch_conference_video_thread(conference_obj_t *conference);
|
||||
@@ -2410,6 +2411,7 @@ static void conference_loop_output(conference_member_t *member)
|
||||
const char *cid_num = switch_channel_get_variable(channel, "conference_auto_outcall_caller_id_number");
|
||||
const char *toval = switch_channel_get_variable(channel, "conference_auto_outcall_timeout");
|
||||
const char *flags = switch_channel_get_variable(channel, "conference_auto_outcall_flags");
|
||||
const char *profile = switch_channel_get_variable(channel, "conference_auto_outcall_profile");
|
||||
const char *ann = switch_channel_get_variable(channel, "conference_auto_outcall_announce");
|
||||
const char *prefix = switch_channel_get_variable(channel, "conference_auto_outcall_prefix");
|
||||
int to = 60;
|
||||
@@ -2441,7 +2443,7 @@ static void conference_loop_output(conference_member_t *member)
|
||||
char *dial_str = switch_mprintf("%s%s", switch_str_nil(prefix), argv[x]);
|
||||
switch_assert(dial_str);
|
||||
conference_outcall_bg(member->conference, NULL, NULL, dial_str, to, switch_str_nil(flags), cid_name, cid_num, NULL,
|
||||
&member->conference->cancel_cause);
|
||||
profile, &member->conference->cancel_cause);
|
||||
switch_safe_free(dial_str);
|
||||
}
|
||||
switch_safe_free(cpstr);
|
||||
@@ -3778,6 +3780,7 @@ static void conference_xlist(conference_obj_t *conference, switch_xml_t x_confer
|
||||
switch_xml_set_attr_d(x_conference, "member-count", ival);
|
||||
switch_snprintf(i, sizeof(i), "%u", conference->rate);
|
||||
switch_xml_set_attr_d(x_conference, "rate", ival);
|
||||
switch_xml_set_attr_d(x_conference, "uuid", conference->uuid_str);
|
||||
|
||||
if (switch_test_flag(conference, CFLAG_LOCKED)) {
|
||||
switch_xml_set_attr_d(x_conference, "locked", "true");
|
||||
@@ -4263,9 +4266,9 @@ static switch_status_t conf_api_sub_dial(conference_obj_t *conference, switch_st
|
||||
}
|
||||
|
||||
if (conference) {
|
||||
conference_outcall(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], &cause, NULL);
|
||||
conference_outcall(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], NULL, &cause, NULL);
|
||||
} else {
|
||||
conference_outcall(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], &cause, NULL);
|
||||
conference_outcall(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], NULL, &cause, NULL);
|
||||
}
|
||||
stream->write_function(stream, "Call Requested: result: [%s]\n", switch_channel_cause2str(cause));
|
||||
|
||||
@@ -4288,9 +4291,9 @@ static switch_status_t conf_api_sub_bgdial(conference_obj_t *conference, switch_
|
||||
switch_uuid_format(uuid_str, &uuid);
|
||||
|
||||
if (conference) {
|
||||
conference_outcall_bg(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL);
|
||||
conference_outcall_bg(conference, NULL, NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL, NULL);
|
||||
} else {
|
||||
conference_outcall_bg(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL);
|
||||
conference_outcall_bg(NULL, argv[0], NULL, argv[2], 60, NULL, argv[4], argv[3], uuid_str, NULL, NULL);
|
||||
}
|
||||
|
||||
stream->write_function(stream, "OK Job-UUID: %s\n", uuid_str);
|
||||
@@ -4806,7 +4809,8 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
switch_core_session_t *session,
|
||||
char *bridgeto, uint32_t timeout,
|
||||
char *flags, char *cid_name,
|
||||
char *cid_num,
|
||||
char *cid_num,
|
||||
char *profile,
|
||||
switch_call_cause_t *cause,
|
||||
switch_call_cause_t *cancel_cause)
|
||||
{
|
||||
@@ -4816,6 +4820,7 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
switch_channel_t *caller_channel = NULL;
|
||||
char appdata[512];
|
||||
int rdlock = 0;
|
||||
switch_bool_t have_flags = SWITCH_FALSE;
|
||||
|
||||
*cause = SWITCH_CAUSE_NORMAL_CLEARING;
|
||||
|
||||
@@ -4901,13 +4906,16 @@ static switch_status_t conference_outcall(conference_obj_t *conference,
|
||||
status = SWITCH_STATUS_MEMERR;
|
||||
goto done;
|
||||
}
|
||||
/* add them to the conference */
|
||||
|
||||
if (flags && strcasecmp(flags, "none")) {
|
||||
switch_snprintf(appdata, sizeof(appdata), "%s+flags{%s}", conference_name, flags);
|
||||
switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, appdata);
|
||||
} else {
|
||||
switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, conference_name);
|
||||
have_flags = SWITCH_TRUE;
|
||||
}
|
||||
/* add them to the conference */
|
||||
|
||||
switch_snprintf(appdata, sizeof(appdata), "%s%s%s%s%s%s", conference_name,
|
||||
profile?"@":"", profile?profile:"",
|
||||
have_flags?"+flags{":"", have_flags?flags:"", have_flags?"}":"");
|
||||
switch_caller_extension_add_application(peer_session, extension, (char *) global_app_name, appdata);
|
||||
|
||||
switch_channel_set_caller_extension(peer_channel, extension);
|
||||
switch_channel_set_state(peer_channel, CS_EXECUTE);
|
||||
@@ -4939,6 +4947,7 @@ struct bg_call {
|
||||
char *cid_num;
|
||||
char *conference_name;
|
||||
char *uuid;
|
||||
char *profile;
|
||||
switch_call_cause_t *cancel_cause;
|
||||
switch_memory_pool_t *pool;
|
||||
};
|
||||
@@ -4952,7 +4961,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
|
||||
switch_event_t *event;
|
||||
|
||||
conference_outcall(call->conference, call->conference_name,
|
||||
call->session, call->bridgeto, call->timeout, call->flags, call->cid_name, call->cid_num, &cause, call->cancel_cause);
|
||||
call->session, call->bridgeto, call->timeout, call->flags, call->cid_name, call->cid_num, call->profile, &cause, call->cancel_cause);
|
||||
|
||||
if (call->conference && test_eflag(call->conference, EFLAG_BGDIAL_RESULT) &&
|
||||
switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) {
|
||||
@@ -4968,6 +4977,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
|
||||
switch_safe_free(call->cid_num);
|
||||
switch_safe_free(call->conference_name);
|
||||
switch_safe_free(call->uuid);
|
||||
switch_safe_free(call->profile);
|
||||
if (call->pool) {
|
||||
switch_core_destroy_memory_pool(&call->pool);
|
||||
}
|
||||
@@ -4980,7 +4990,7 @@ static void *SWITCH_THREAD_FUNC conference_outcall_run(switch_thread_t *thread,
|
||||
static switch_status_t conference_outcall_bg(conference_obj_t *conference,
|
||||
char *conference_name,
|
||||
switch_core_session_t *session, char *bridgeto, uint32_t timeout, const char *flags, const char *cid_name,
|
||||
const char *cid_num, const char *call_uuid, switch_call_cause_t *cancel_cause)
|
||||
const char *cid_num, const char *call_uuid, const char *profile, switch_call_cause_t *cancel_cause)
|
||||
{
|
||||
struct bg_call *call = NULL;
|
||||
switch_thread_t *thread;
|
||||
@@ -5024,6 +5034,10 @@ static switch_status_t conference_outcall_bg(conference_obj_t *conference,
|
||||
call->uuid = strdup(call_uuid);
|
||||
}
|
||||
|
||||
if (profile) {
|
||||
call->profile = strdup(profile);
|
||||
}
|
||||
|
||||
switch_threadattr_create(&thd_attr, pool);
|
||||
switch_threadattr_detach_set(thd_attr, 1);
|
||||
switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
|
||||
@@ -5749,7 +5763,7 @@ SWITCH_STANDARD_APP(conference_function)
|
||||
/* if we're using "bridge:" make an outbound call and bridge it in */
|
||||
if (!zstr(bridgeto) && strcasecmp(bridgeto, "none")) {
|
||||
switch_call_cause_t cause;
|
||||
if (conference_outcall(conference, NULL, session, bridgeto, 60, NULL, NULL, NULL, &cause, NULL) != SWITCH_STATUS_SUCCESS) {
|
||||
if (conference_outcall(conference, NULL, session, bridgeto, 60, NULL, NULL, NULL, NULL, &cause, NULL) != SWITCH_STATUS_SUCCESS) {
|
||||
goto done;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
* Michael Murdock <mike at mmurdock dot org>
|
||||
* Neal Horman <neal at wanlink dot com>
|
||||
* Bret McDanel <trixter AT 0xdecafbad dot com>
|
||||
* Luke Dashjr <luke@openmethods.com> (OpenMethods, LLC)
|
||||
*
|
||||
* mod_dptools.c -- Raw Audio File Streaming Application Module
|
||||
*
|
||||
@@ -269,7 +270,7 @@ SWITCH_STANDARD_APP(bind_digit_action_function)
|
||||
}
|
||||
|
||||
|
||||
#define DETECT_SPEECH_SYNTAX "<mod_name> <gram_name> <gram_path> [<addr>] OR grammar <gram_name> [<path>] OR nogrammar <gram_name> OR pause OR resume OR stop OR param <name> <value>"
|
||||
#define DETECT_SPEECH_SYNTAX "<mod_name> <gram_name> <gram_path> [<addr>] OR grammar <gram_name> [<path>] OR nogrammar <gram_name> OR grammaron/grammaroff <gram_name> OR grammarsalloff OR pause OR resume OR start_input_timers OR stop OR param <name> <value>"
|
||||
SWITCH_STANDARD_APP(detect_speech_function)
|
||||
{
|
||||
char *argv[4];
|
||||
@@ -282,6 +283,12 @@ SWITCH_STANDARD_APP(detect_speech_function)
|
||||
switch_ivr_detect_speech_load_grammar(session, argv[1], argv[2]);
|
||||
} else if (!strcasecmp(argv[0], "nogrammar")) {
|
||||
switch_ivr_detect_speech_unload_grammar(session, argv[1]);
|
||||
} else if (!strcasecmp(argv[0], "grammaron")) {
|
||||
switch_ivr_detect_speech_enable_grammar(session, argv[1]);
|
||||
} else if (!strcasecmp(argv[0], "grammaroff")) {
|
||||
switch_ivr_detect_speech_disable_grammar(session, argv[1]);
|
||||
} else if (!strcasecmp(argv[0], "grammarsalloff")) {
|
||||
switch_ivr_detect_speech_disable_all_grammars(session);
|
||||
} else if (!strcasecmp(argv[0], "pause")) {
|
||||
switch_ivr_pause_detect_speech(session);
|
||||
} else if (!strcasecmp(argv[0], "resume")) {
|
||||
@@ -290,6 +297,8 @@ SWITCH_STANDARD_APP(detect_speech_function)
|
||||
switch_ivr_stop_detect_speech(session);
|
||||
} else if (!strcasecmp(argv[0], "param")) {
|
||||
switch_ivr_set_param_detect_speech(session, argv[1], argv[2]);
|
||||
} else if (!strcasecmp(argv[0], "start_input_timers")) {
|
||||
switch_ivr_detect_speech_start_input_timers(session);
|
||||
} else if (argc >= 3) {
|
||||
switch_ivr_detect_speech(session, argv[0], argv[1], argv[2], argv[3], NULL);
|
||||
}
|
||||
@@ -1855,6 +1864,7 @@ SWITCH_STANDARD_APP(att_xfer_function)
|
||||
|
||||
if (switch_ivr_originate(session, &peer_session, &cause, data, 0, NULL, NULL, NULL, NULL, NULL, SOF_NONE, NULL)
|
||||
!= SWITCH_STATUS_SUCCESS || !peer_session) {
|
||||
switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
|
||||
goto end;
|
||||
}
|
||||
|
||||
@@ -1869,6 +1879,7 @@ SWITCH_STANDARD_APP(att_xfer_function)
|
||||
|
||||
if (zstr(bond) && switch_channel_down(peer_channel)) {
|
||||
switch_core_session_rwunlock(peer_session);
|
||||
switch_channel_set_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE, bond);
|
||||
goto end;
|
||||
}
|
||||
|
||||
@@ -2765,7 +2776,7 @@ static switch_call_cause_t group_outgoing_channel(switch_core_session_t *session
|
||||
switch_originate_flag_t myflags = SOF_NONE;
|
||||
char *cid_name_override = NULL;
|
||||
char *cid_num_override = NULL;
|
||||
char *domain = NULL;
|
||||
char *domain = NULL, *dup_domain = NULL;
|
||||
switch_channel_t *new_channel = NULL;
|
||||
unsigned int timelimit = 60;
|
||||
const char *skip, *var;
|
||||
@@ -2778,7 +2789,8 @@ static switch_call_cause_t group_outgoing_channel(switch_core_session_t *session
|
||||
if ((domain = strchr(group, '@'))) {
|
||||
*domain++ = '\0';
|
||||
} else {
|
||||
domain = switch_core_get_variable("domain");
|
||||
domain = switch_core_get_variable_pdup("domain", switch_core_session_get_pool(session));
|
||||
dup_domain = domain;
|
||||
}
|
||||
|
||||
if (!domain) {
|
||||
@@ -2850,6 +2862,7 @@ static switch_call_cause_t group_outgoing_channel(switch_core_session_t *session
|
||||
|
||||
switch_safe_free(template);
|
||||
switch_safe_free(group);
|
||||
switch_safe_free(dup_domain);
|
||||
|
||||
if (cause == SWITCH_CAUSE_NONE) {
|
||||
cause = SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
|
||||
@@ -2878,7 +2891,7 @@ static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session,
|
||||
switch_call_cause_t *cancel_cause)
|
||||
{
|
||||
switch_xml_t x_domain = NULL, xml = NULL, x_user = NULL, x_group = NULL, x_param, x_params;
|
||||
char *user = NULL, *domain = NULL;
|
||||
char *user = NULL, *domain = NULL, *dup_domain = NULL;
|
||||
const char *dest = NULL;
|
||||
static switch_call_cause_t cause = SWITCH_CAUSE_NONE;
|
||||
unsigned int timelimit = 60;
|
||||
@@ -2899,7 +2912,8 @@ static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session,
|
||||
if ((domain = strchr(user, '@'))) {
|
||||
*domain++ = '\0';
|
||||
} else {
|
||||
domain = switch_core_get_variable("domain");
|
||||
domain = switch_core_get_variable_dup("domain");
|
||||
dup_domain = domain;
|
||||
}
|
||||
|
||||
if (!domain) {
|
||||
@@ -3106,6 +3120,7 @@ static switch_call_cause_t user_outgoing_channel(switch_core_session_t *session,
|
||||
}
|
||||
|
||||
switch_safe_free(user);
|
||||
switch_safe_free(dup_domain);
|
||||
|
||||
return cause;
|
||||
}
|
||||
@@ -3184,10 +3199,11 @@ static switch_status_t event_chat_send(const char *proto, const char *from, cons
|
||||
if (body)
|
||||
switch_event_add_body(event, "%s", body);
|
||||
if (to) {
|
||||
const char *v;
|
||||
char *v;
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "To", to);
|
||||
if ((v = switch_core_get_variable(to))) {
|
||||
if ((v = switch_core_get_variable_dup(to))) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Command", v);
|
||||
free(v);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3205,15 +3221,15 @@ static switch_status_t api_chat_send(const char *proto, const char *from, const
|
||||
const char *body, const char *type, const char *hint)
|
||||
{
|
||||
if (to) {
|
||||
const char *v;
|
||||
char *v = NULL;
|
||||
switch_stream_handle_t stream = { 0 };
|
||||
char *cmd = NULL, *arg;
|
||||
|
||||
if (!(v = switch_core_get_variable(to))) {
|
||||
v = to;
|
||||
if (!(v = switch_core_get_variable_dup(to))) {
|
||||
v = strdup(to);
|
||||
}
|
||||
|
||||
cmd = strdup(v);
|
||||
cmd = v;
|
||||
switch_assert(cmd);
|
||||
|
||||
switch_url_decode(cmd);
|
||||
|
||||
@@ -220,6 +220,7 @@ static switch_bool_t fsk_detect_callback(switch_media_bug_t *bug, void *user_dat
|
||||
char *sp;
|
||||
switch_event_t *event;
|
||||
const char *app_var;
|
||||
int total = 0;
|
||||
|
||||
switch_event_create_plain(&event, SWITCH_EVENT_CHANNEL_DATA);
|
||||
|
||||
@@ -255,6 +256,7 @@ static switch_bool_t fsk_detect_callback(switch_media_bug_t *bug, void *user_dat
|
||||
}
|
||||
|
||||
if (varname && val) {
|
||||
total++;
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(pvt->session), SWITCH_LOG_DEBUG, "%s setting FSK var [%s][%s]\n",
|
||||
switch_channel_get_name(channel), varname, val);
|
||||
switch_channel_set_variable(channel, varname, val);
|
||||
@@ -270,7 +272,7 @@ static switch_bool_t fsk_detect_callback(switch_media_bug_t *bug, void *user_dat
|
||||
}
|
||||
}
|
||||
|
||||
if ((app_var = switch_channel_get_variable(channel, "execute_on_fsk"))) {
|
||||
if (total && (app_var = switch_channel_get_variable(channel, "execute_on_fsk"))) {
|
||||
char *app_arg;
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(pvt->session), SWITCH_LOG_DEBUG, "%s processing execute_on_fsk [%s]\n",
|
||||
|
||||
@@ -89,7 +89,7 @@ SWITCH_LIMIT_INCR(limit_incr_redis)
|
||||
}
|
||||
|
||||
/* Get the keys for redis server */
|
||||
uuid_rediskey = switch_core_session_sprintf(session,"%s_%s_%s", switch_core_get_variable("hostname"), realm, resource);
|
||||
uuid_rediskey = switch_core_session_sprintf(session,"%s_%s_%s", switch_core_get_hostname(), realm, resource);
|
||||
rediskey = switch_core_session_sprintf(session, "%s_%s", realm, resource);
|
||||
|
||||
if ((pvt = switch_channel_get_private(channel, "limit_redis"))) {
|
||||
@@ -179,7 +179,7 @@ SWITCH_LIMIT_RELEASE(limit_release_redis)
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Couldn't decrement value corresponding to %s\n", (char *)p_key);
|
||||
switch_goto_status(SWITCH_STATUS_FALSE, end);
|
||||
}
|
||||
p_uuid_key = switch_core_session_sprintf(session, "%s_%s", switch_core_get_variable("hostname"), (char *)p_key);
|
||||
p_uuid_key = switch_core_session_sprintf(session, "%s_%s", switch_core_get_hostname(), (char *)p_key);
|
||||
if (credis_decr(redis,p_uuid_key,&uuid_val) != 0) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Couldn't decrement value corresponding to %s\n", p_uuid_key);
|
||||
switch_goto_status(SWITCH_STATUS_FALSE, end);
|
||||
@@ -193,7 +193,7 @@ SWITCH_LIMIT_RELEASE(limit_release_redis)
|
||||
|
||||
} else {
|
||||
rediskey = switch_core_session_sprintf(session, "%s_%s", realm, resource);
|
||||
uuid_rediskey = switch_core_session_sprintf(session, "%s_%s_%s", switch_core_get_variable("hostname"), realm, resource);
|
||||
uuid_rediskey = switch_core_session_sprintf(session, "%s_%s_%s", switch_core_get_hostname(), realm, resource);
|
||||
switch_core_hash_delete(pvt->hash, (const char *) rediskey);
|
||||
|
||||
if (credis_decr(redis, rediskey, &val) != 0) {
|
||||
@@ -249,13 +249,13 @@ SWITCH_LIMIT_RESET(limit_reset_redis)
|
||||
{
|
||||
REDIS redis;
|
||||
if (redis_factory(&redis) == SWITCH_STATUS_SUCCESS) {
|
||||
char *rediskey = switch_mprintf("%s_*", switch_core_get_variable("hostname"));
|
||||
char *rediskey = switch_mprintf("%s_*", switch_core_get_hostname());
|
||||
int dec = 0, val = 0, keyc;
|
||||
char *uuids[2000];
|
||||
|
||||
if ((keyc = credis_keys(redis, rediskey, uuids, switch_arraylen(uuids))) > 0) {
|
||||
int i = 0;
|
||||
int hostnamelen = strlen(switch_core_get_variable("hostname"))+1;
|
||||
int hostnamelen = strlen(switch_core_get_hostname())+1;
|
||||
|
||||
for (i = 0; i < keyc && uuids[i]; i++){
|
||||
const char *key = uuids[i] + hostnamelen;
|
||||
|
||||
@@ -201,14 +201,14 @@ static void event_handler(switch_event_t *event)
|
||||
}
|
||||
|
||||
if (!(peer_session = switch_core_session_locate(peer_uuid))) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cant locate peer session for uuid %s\n", peer_uuid);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Can't locate peer session for uuid %s\n", peer_uuid);
|
||||
return;
|
||||
}
|
||||
|
||||
peer_channel = switch_core_session_get_channel(peer_session);
|
||||
|
||||
if (switch_event_create(&peer_event, SWITCH_EVENT_CHANNEL_BRIDGE) != SWITCH_STATUS_SUCCESS) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cant create bridge event for peer channel %s\n", peer_uuid);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't create bridge event for peer channel %s\n", peer_uuid);
|
||||
goto end;
|
||||
}
|
||||
|
||||
@@ -249,7 +249,7 @@ SWITCH_STANDARD_APP(userspy_function)
|
||||
status = switch_core_hash_insert(globals.spy_hash, argv[0], (void *) uuid);
|
||||
|
||||
if ((status != SWITCH_STATUS_SUCCESS)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cant insert to spy hash\n");
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Can't insert to spy hash\n");
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED);
|
||||
switch_thread_rwlock_unlock(globals.spy_hash_lock);
|
||||
return;
|
||||
|
||||
@@ -1011,6 +1011,11 @@ typedef struct msg_cnt_callback msg_cnt_callback_t;
|
||||
static int message_count_callback(void *pArg, int argc, char **argv, char **columnNames)
|
||||
{
|
||||
msg_cnt_callback_t *cbt = (msg_cnt_callback_t *) pArg;
|
||||
|
||||
if (argc < 3 || zstr(argv[0]) || zstr(argv[1]) || zstr(argv[2])) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (atoi(argv[0]) == 1) { /* UnRead */
|
||||
if (!strcasecmp(argv[1], "A_URGENT")) { /* Urgent */
|
||||
cbt->total_new_urgent_messages = atoi(argv[2]);
|
||||
@@ -1263,7 +1268,7 @@ static void message_count(vm_profile_t *profile, const char *id_in, const char *
|
||||
{
|
||||
char msg_count[80] = "";
|
||||
msg_cnt_callback_t cbt = { 0 };
|
||||
char sql[256];
|
||||
char *sql;
|
||||
char *myid = NULL;
|
||||
|
||||
|
||||
@@ -1277,11 +1282,20 @@ static void message_count(vm_profile_t *profile, const char *id_in, const char *
|
||||
|
||||
myid = resolve_id(id_in, domain_name, "message-count");
|
||||
|
||||
switch_snprintf(sql, sizeof(sql),
|
||||
"select read_epoch=0, read_flags, count(read_epoch) from voicemail_msgs where username='%s' and domain='%s' and in_folder='%s' group by read_epoch=0,read_flags;",
|
||||
myid, domain_name, myfolder);
|
||||
sql = switch_mprintf(
|
||||
"select 1, read_flags, count(read_epoch) from voicemail_msgs where "
|
||||
"username='%q' and domain='%q' and in_folder='%q' and read_epoch=0 "
|
||||
"group by read_flags "
|
||||
"union "
|
||||
"select 0, read_flags, count(read_epoch) from voicemail_msgs where "
|
||||
"username='%q' and domain='%q' and in_folder='%q' and read_epoch<>0 "
|
||||
"group by read_flags;",
|
||||
|
||||
myid, domain_name, myfolder,
|
||||
myid, domain_name, myfolder);
|
||||
|
||||
vm_execute_sql_callback(profile, profile->mutex, sql, message_count_callback, &cbt);
|
||||
free(sql);
|
||||
|
||||
*total_new_messages = cbt.total_new_messages + cbt.total_new_urgent_messages;
|
||||
*total_new_urgent_messages = cbt.total_new_urgent_messages;
|
||||
@@ -2734,6 +2748,7 @@ static switch_status_t voicemail_inject(const char *data, switch_core_session_t
|
||||
switch_memory_pool_t *pool = NULL;
|
||||
char *forwarded_by = NULL;
|
||||
char *read_flags = NORMAL_FLAG_STRING;
|
||||
char *dup_domain = NULL;
|
||||
|
||||
if (zstr(data)) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
@@ -2781,7 +2796,9 @@ static switch_status_t voicemail_inject(const char *data, switch_core_session_t
|
||||
}
|
||||
|
||||
if (zstr(domain)) {
|
||||
domain = switch_core_get_variable("domain");
|
||||
if ((dup_domain = switch_core_get_variable_dup("domain"))) {
|
||||
domain = dup_domain;
|
||||
}
|
||||
profile_name = domain;
|
||||
}
|
||||
|
||||
@@ -2915,6 +2932,7 @@ static switch_status_t voicemail_inject(const char *data, switch_core_session_t
|
||||
end:
|
||||
|
||||
switch_safe_free(dup);
|
||||
switch_safe_free(dup_domain);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
*
|
||||
* Brian West <brian@freeswitch.org>
|
||||
* Christopher M. Rienzo <chris@rienzo.net>
|
||||
* Luke Dashjr <luke@openmethods.com> (OpenMethods, LLC)
|
||||
*
|
||||
* mod_unimrcp.c -- UniMRCP module (MRCP client)
|
||||
*
|
||||
@@ -48,6 +49,7 @@
|
||||
#include "mrcp_resource_loader.h"
|
||||
#include "mpf_engine.h"
|
||||
#include "mpf_codec_manager.h"
|
||||
#include "mpf_dtmf_generator.h"
|
||||
#include "mpf_rtp_termination_factory.h"
|
||||
#include "mrcp_sofiasip_client_agent.h"
|
||||
#include "mrcp_unirtsp_client_agent.h"
|
||||
@@ -258,6 +260,7 @@ static switch_status_t audio_queue_create(audio_queue_t ** queue, const char *na
|
||||
static switch_status_t audio_queue_write(audio_queue_t *queue, void *data, switch_size_t *data_len);
|
||||
static switch_status_t audio_queue_read(audio_queue_t *queue, void *data, switch_size_t *data_len, int block);
|
||||
static switch_status_t audio_queue_clear(audio_queue_t *queue);
|
||||
static switch_status_t audio_queue_signal(audio_queue_t *queue);
|
||||
static switch_status_t audio_queue_destroy(audio_queue_t *queue);
|
||||
|
||||
/*********************************************************************************************************************************************
|
||||
@@ -285,6 +288,8 @@ enum speech_channel_state {
|
||||
SPEECH_CHANNEL_READY,
|
||||
/** processing speech request */
|
||||
SPEECH_CHANNEL_PROCESSING,
|
||||
/** finished processing speech request */
|
||||
SPEECH_CHANNEL_DONE,
|
||||
/** error opening channel */
|
||||
SPEECH_CHANNEL_ERROR
|
||||
};
|
||||
@@ -433,14 +438,20 @@ static const char *grammar_type_to_mime(grammar_type_t type, profile_t *profile)
|
||||
struct recognizer_data {
|
||||
/** the available grammars */
|
||||
switch_hash_t *grammars;
|
||||
/** the last grammar used (for pause/resume) */
|
||||
grammar_t *last_grammar;
|
||||
/** the enabled grammars */
|
||||
switch_hash_t *enabled_grammars;
|
||||
/** recognize result */
|
||||
char *result;
|
||||
/** true, if voice has started */
|
||||
int start_of_input;
|
||||
/** true, if input timers have started */
|
||||
int timers_started;
|
||||
/** UniMRCP mpf stream */
|
||||
mpf_audio_stream_t *unimrcp_stream;
|
||||
/** DTMF generator */
|
||||
mpf_dtmf_generator_t *dtmf_generator;
|
||||
/** true, if presently transmitting DTMF */
|
||||
char dtmf_generator_active;
|
||||
};
|
||||
typedef struct recognizer_data recognizer_data_t;
|
||||
|
||||
@@ -451,8 +462,12 @@ static switch_status_t recog_shutdown();
|
||||
static switch_status_t recog_asr_open(switch_asr_handle_t *ah, const char *codec, int rate, const char *dest, switch_asr_flag_t *flags);
|
||||
static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const char *grammar, const char *name);
|
||||
static switch_status_t recog_asr_unload_grammar(switch_asr_handle_t *ah, const char *name);
|
||||
static switch_status_t recog_asr_enable_grammar(switch_asr_handle_t *ah, const char *name);
|
||||
static switch_status_t recog_asr_disable_grammar(switch_asr_handle_t *ah, const char *name);
|
||||
static switch_status_t recog_asr_disable_all_grammars(switch_asr_handle_t *ah);
|
||||
static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_t *flags);
|
||||
static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags);
|
||||
static switch_status_t recog_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);
|
||||
#if 0
|
||||
static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name);
|
||||
#endif
|
||||
@@ -468,12 +483,16 @@ static void recog_asr_float_param(switch_asr_handle_t *ah, char *param, double v
|
||||
/* recognizer's interface for UniMRCP */
|
||||
static apt_bool_t recog_message_handler(const mrcp_app_message_t *app_message);
|
||||
static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_message_t *message);
|
||||
static apt_bool_t recog_stream_open(mpf_audio_stream_t *stream, mpf_codec_t *codec);
|
||||
static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame);
|
||||
|
||||
/* recognizer specific speech_channel_funcs */
|
||||
static switch_status_t recog_channel_start(speech_channel_t *schannel, const char *name);
|
||||
static switch_status_t recog_channel_start(speech_channel_t *schannel);
|
||||
static switch_status_t recog_channel_load_grammar(speech_channel_t *schannel, const char *name, grammar_type_t type, const char *data);
|
||||
static switch_status_t recog_channel_unload_grammar(speech_channel_t *schannel, const char *name);
|
||||
static switch_status_t recog_channel_enable_grammar(speech_channel_t *schannel, const char *name);
|
||||
static switch_status_t recog_channel_disable_grammar(speech_channel_t *schannel, const char *name);
|
||||
static switch_status_t recog_channel_disable_all_grammars(speech_channel_t *schannel);
|
||||
static switch_status_t recog_channel_check_results(speech_channel_t *schannel);
|
||||
static switch_status_t recog_channel_set_start_of_input(speech_channel_t *schannel);
|
||||
static switch_status_t recog_channel_start_input_timers(speech_channel_t *schannel);
|
||||
@@ -651,10 +670,12 @@ static switch_status_t audio_queue_create(audio_queue_t ** audio_queue, const ch
|
||||
static switch_status_t audio_queue_write(audio_queue_t *queue, void *data, switch_size_t *data_len)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
|
||||
switch_size_t len = *data_len;
|
||||
#endif
|
||||
switch_mutex_lock(queue->mutex);
|
||||
|
||||
#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
|
||||
switch_size_t len = *data_len;
|
||||
if (queue->file_write) {
|
||||
switch_file_write(queue->file_write, data, &len);
|
||||
}
|
||||
@@ -692,6 +713,9 @@ static switch_status_t audio_queue_read(audio_queue_t *queue, void *data, switch
|
||||
{
|
||||
switch_size_t requested = *data_len;
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
|
||||
switch_size_t len = *data_len;
|
||||
#endif
|
||||
switch_mutex_lock(queue->mutex);
|
||||
|
||||
/* wait for data, if allowed */
|
||||
@@ -720,7 +744,6 @@ static switch_status_t audio_queue_read(audio_queue_t *queue, void *data, switch
|
||||
#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) audio queue read total = %ld\tread = %ld\trequested = %ld\n", queue->name,
|
||||
queue->read_bytes, *data_len, requested);
|
||||
switch_size_t len = *data_len;
|
||||
if (queue->file_read) {
|
||||
switch_file_write(queue->file_read, data, &len);
|
||||
}
|
||||
@@ -747,6 +770,20 @@ static switch_status_t audio_queue_clear(audio_queue_t *queue)
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wake any threads waiting on this queue
|
||||
*
|
||||
* @param queue the queue to empty
|
||||
* @return SWITCH_STATUS_SUCCESS
|
||||
*/
|
||||
static switch_status_t audio_queue_signal(audio_queue_t *queue)
|
||||
{
|
||||
switch_mutex_lock(queue->mutex);
|
||||
switch_thread_cond_signal(queue->cond);
|
||||
switch_mutex_unlock(queue->mutex);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy the audio queue
|
||||
*
|
||||
@@ -1325,6 +1362,8 @@ static switch_status_t speech_channel_stop(speech_channel_t *schannel)
|
||||
goto done;
|
||||
}
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) %s stopped\n", schannel->name, speech_channel_type_to_string(schannel->type));
|
||||
} else if (schannel->state == SPEECH_CHANNEL_DONE) {
|
||||
speech_channel_set_state_unlocked(schannel, SPEECH_CHANNEL_READY);
|
||||
}
|
||||
|
||||
done:
|
||||
@@ -1422,9 +1461,19 @@ static switch_status_t speech_channel_read(speech_channel_t *schannel, void *dat
|
||||
}
|
||||
|
||||
switch_mutex_lock(schannel->mutex);
|
||||
if (schannel->state == SPEECH_CHANNEL_PROCESSING) {
|
||||
switch (schannel->state) {
|
||||
case SPEECH_CHANNEL_DONE:
|
||||
/* pull any remaining audio - never blocking */
|
||||
if (audio_queue_read(schannel->audio_queue, data, len, 0) == SWITCH_STATUS_FALSE) {
|
||||
/* all frames read */
|
||||
status = SWITCH_STATUS_BREAK;
|
||||
}
|
||||
break;
|
||||
case SPEECH_CHANNEL_PROCESSING:
|
||||
/* IN-PROGRESS */
|
||||
audio_queue_read(schannel->audio_queue, data, len, block);
|
||||
} else {
|
||||
break;
|
||||
default:
|
||||
status = SWITCH_STATUS_BREAK;
|
||||
}
|
||||
switch_mutex_unlock(schannel->mutex);
|
||||
@@ -1447,6 +1496,8 @@ static const char *speech_channel_state_to_string(speech_channel_state_t state)
|
||||
return "READY";
|
||||
case SPEECH_CHANNEL_PROCESSING:
|
||||
return "PROCESSING";
|
||||
case SPEECH_CHANNEL_DONE:
|
||||
return "DONE";
|
||||
case SPEECH_CHANNEL_ERROR:
|
||||
return "ERROR";
|
||||
}
|
||||
@@ -1482,7 +1533,7 @@ static switch_status_t speech_channel_set_state_unlocked(speech_channel_t *schan
|
||||
{
|
||||
if (schannel->state == SPEECH_CHANNEL_PROCESSING && state != SPEECH_CHANNEL_PROCESSING) {
|
||||
/* wake anyone waiting for audio data */
|
||||
audio_queue_clear(schannel->audio_queue);
|
||||
audio_queue_signal(schannel->audio_queue);
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) %s ==> %s\n", schannel->name, speech_channel_state_to_string(schannel->state),
|
||||
@@ -1635,6 +1686,8 @@ static switch_status_t synth_speech_read_tts(switch_speech_handle_t *sh, void *d
|
||||
memset((uint8_t *) data + bytes_read, schannel->silence, *datalen - bytes_read);
|
||||
}
|
||||
} else {
|
||||
/* ready for next speak request */
|
||||
speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
|
||||
*datalen = 0;
|
||||
status = SWITCH_STATUS_BREAK;
|
||||
}
|
||||
@@ -1862,7 +1915,7 @@ static apt_bool_t synth_on_message_receive(mrcp_application_t *application, mrcp
|
||||
if (message->start_line.request_state == MRCP_REQUEST_STATE_COMPLETE) {
|
||||
/* got COMPLETE */
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) COMPLETE\n", schannel->name);
|
||||
speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
|
||||
speech_channel_set_state(schannel, SPEECH_CHANNEL_DONE);
|
||||
} else {
|
||||
/* received unexpected request state */
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) unexpected STOP response, request_state = %d\n", schannel->name,
|
||||
@@ -1880,7 +1933,7 @@ static apt_bool_t synth_on_message_receive(mrcp_application_t *application, mrcp
|
||||
if (message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) {
|
||||
/* got SPEAK-COMPLETE */
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) SPEAK-COMPLETE\n", schannel->name);
|
||||
speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
|
||||
speech_channel_set_state(schannel, SPEECH_CHANNEL_DONE);
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) unexpected event, method_id = %d\n", schannel->name,
|
||||
(int) message->start_line.method_id);
|
||||
@@ -2055,19 +2108,24 @@ static const char *grammar_type_to_mime(grammar_type_t type, profile_t *profile)
|
||||
* Start RECOGNIZE request
|
||||
*
|
||||
* @param schannel the channel to start
|
||||
* @param name the name of the grammar to use or NULL if to reuse the last grammar
|
||||
* @return SWITCH_STATUS_SUCCESS if successful
|
||||
*/
|
||||
static switch_status_t recog_channel_start(speech_channel_t *schannel, const char *name)
|
||||
static switch_status_t recog_channel_start(speech_channel_t *schannel)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
switch_hash_index_t *egk;
|
||||
mrcp_message_t *mrcp_message;
|
||||
mrcp_recog_header_t *recog_header;
|
||||
mrcp_generic_header_t *generic_header;
|
||||
recognizer_data_t *r;
|
||||
char *start_input_timers;
|
||||
const char *mime_type;
|
||||
grammar_t *grammar = NULL;
|
||||
char *key;
|
||||
switch_size_t len;
|
||||
grammar_t *grammar;
|
||||
switch_size_t grammar_uri_count = 0;
|
||||
switch_size_t grammar_uri_list_len = 0;
|
||||
char *grammar_uri_list = NULL;
|
||||
|
||||
switch_mutex_lock(schannel->mutex);
|
||||
if (schannel->state != SPEECH_CHANNEL_READY) {
|
||||
@@ -2088,21 +2146,55 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
|
||||
start_input_timers = (char *) switch_core_hash_find(schannel->params, "start-input-timers");
|
||||
r->timers_started = zstr(start_input_timers) || strcasecmp(start_input_timers, "false");
|
||||
|
||||
/* get the cached grammar */
|
||||
if (zstr(name)) {
|
||||
grammar = r->last_grammar;
|
||||
} else {
|
||||
grammar = (grammar_t *) switch_core_hash_find(r->grammars, name);
|
||||
r->last_grammar = grammar;
|
||||
}
|
||||
if (grammar == NULL) {
|
||||
if (name) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Undefined grammar, %s\n", schannel->name, name);
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) No grammar specified\n", schannel->name);
|
||||
/* count enabled grammars */
|
||||
for (egk = switch_hash_first(NULL, r->enabled_grammars); egk; egk = switch_hash_next(egk)) {
|
||||
// NOTE: This postponed type check is necessary to allow a non-URI-list grammar to execute alone
|
||||
if (grammar_uri_count == 1 && grammar->type != GRAMMAR_TYPE_URI)
|
||||
goto no_grammar_alone;
|
||||
++grammar_uri_count;
|
||||
switch_hash_this(egk, (void *) &key, NULL, (void *) &grammar);
|
||||
if (grammar->type != GRAMMAR_TYPE_URI && grammar_uri_count != 1) {
|
||||
no_grammar_alone:
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Grammar '%s' can only be used alone (not a URI list)\n", schannel->name, key);
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
goto done;
|
||||
}
|
||||
len = strlen(grammar->data);
|
||||
if (!len)
|
||||
continue;
|
||||
grammar_uri_list_len += len;
|
||||
if (grammar->data[len - 1] != '\n')
|
||||
grammar_uri_list_len += 2;
|
||||
}
|
||||
|
||||
switch (grammar_uri_count) {
|
||||
case 0:
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) No grammar specified\n", schannel->name);
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
goto done;
|
||||
case 1:
|
||||
/* grammar should already be the unique grammar */
|
||||
break;
|
||||
default:
|
||||
/* get the enabled grammars list */
|
||||
grammar_uri_list = switch_core_alloc(schannel->memory_pool, grammar_uri_list_len + 1);
|
||||
grammar_uri_list_len = 0;
|
||||
for (egk = switch_hash_first(NULL, r->enabled_grammars); egk; egk = switch_hash_next(egk)) {
|
||||
switch_hash_this(egk, (void *) &key, NULL, (void *) &grammar);
|
||||
len = strlen(grammar->data);
|
||||
if (!len)
|
||||
continue;
|
||||
memcpy(&(grammar_uri_list[grammar_uri_list_len]), grammar->data, len);
|
||||
grammar_uri_list_len += len;
|
||||
if (grammar_uri_list[grammar_uri_list_len - 1] != '\n')
|
||||
{
|
||||
grammar_uri_list_len += 2;
|
||||
grammar_uri_list[grammar_uri_list_len - 2] = '\r';
|
||||
grammar_uri_list[grammar_uri_list_len - 1] = '\n';
|
||||
}
|
||||
}
|
||||
grammar_uri_list[grammar_uri_list_len++] = '\0';
|
||||
grammar = NULL;
|
||||
}
|
||||
|
||||
/* create MRCP message */
|
||||
@@ -2120,7 +2212,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
|
||||
}
|
||||
|
||||
/* set Content-Type */
|
||||
mime_type = grammar_type_to_mime(grammar->type, schannel->profile);
|
||||
mime_type = grammar_type_to_mime(grammar ? grammar->type : GRAMMAR_TYPE_URI, schannel->profile);
|
||||
if (zstr(mime_type)) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
goto done;
|
||||
@@ -2129,7 +2221,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
|
||||
mrcp_generic_header_property_add(mrcp_message, GENERIC_HEADER_CONTENT_TYPE);
|
||||
|
||||
/* set Content-ID for inline grammars */
|
||||
if (grammar->type != GRAMMAR_TYPE_URI) {
|
||||
if (grammar && grammar->type != GRAMMAR_TYPE_URI) {
|
||||
apt_string_assign(&generic_header->content_id, grammar->name, mrcp_message->pool);
|
||||
mrcp_generic_header_property_add(mrcp_message, GENERIC_HEADER_CONTENT_ID);
|
||||
}
|
||||
@@ -2151,7 +2243,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha
|
||||
recog_channel_set_params(schannel, mrcp_message, generic_header, recog_header);
|
||||
|
||||
/* set message body */
|
||||
apt_string_assign(&mrcp_message->body, grammar->data, mrcp_message->pool);
|
||||
apt_string_assign(&mrcp_message->body, grammar ? grammar->data : grammar_uri_list, mrcp_message->pool);
|
||||
|
||||
/* Empty audio queue and send RECOGNIZE to MRCP server */
|
||||
audio_queue_clear(schannel->audio_queue);
|
||||
@@ -2286,12 +2378,84 @@ static switch_status_t recog_channel_unload_grammar(speech_channel_t *schannel,
|
||||
} else {
|
||||
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Unloading grammar %s\n", schannel->name, grammar_name);
|
||||
switch_core_hash_delete(r->enabled_grammars, grammar_name);
|
||||
switch_core_hash_delete(r->grammars, grammar_name);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable speech recognition grammar
|
||||
*
|
||||
* @param schannel the recognizer channel
|
||||
* @param grammar_name the name of the grammar to enable
|
||||
* @return SWITCH_STATUS_SUCCESS if successful
|
||||
*/
|
||||
static switch_status_t recog_channel_enable_grammar(speech_channel_t *schannel, const char *grammar_name)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
|
||||
if (zstr(grammar_name)) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
} else {
|
||||
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
|
||||
grammar_t *grammar;
|
||||
grammar = (grammar_t *) switch_core_hash_find(r->grammars, grammar_name);
|
||||
if (grammar == NULL)
|
||||
{
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Undefined grammar, %s\n", schannel->name, grammar_name);
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
}
|
||||
else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Enabling grammar %s\n", schannel->name, grammar_name);
|
||||
switch_core_hash_insert(r->enabled_grammars, grammar_name, grammar);
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable speech recognition grammar
|
||||
*
|
||||
* @param schannel the recognizer channel
|
||||
* @param grammar_name the name of the grammar to disable
|
||||
* @return SWITCH_STATUS_SUCCESS if successful
|
||||
*/
|
||||
static switch_status_t recog_channel_disable_grammar(speech_channel_t *schannel, const char *grammar_name)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
|
||||
if (zstr(grammar_name)) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
} else {
|
||||
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Disabling grammar %s\n", schannel->name, grammar_name);
|
||||
switch_core_hash_delete(r->enabled_grammars, grammar_name);
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable all speech recognition grammars
|
||||
*
|
||||
* @param schannel the recognizer channel
|
||||
* @return SWITCH_STATUS_SUCCESS if successful
|
||||
*/
|
||||
static switch_status_t recog_channel_disable_all_grammars(speech_channel_t *schannel)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
|
||||
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Disabling all grammars\n", schannel->name);
|
||||
switch_core_hash_destroy(&r->enabled_grammars);
|
||||
switch_core_hash_init(&r->enabled_grammars, schannel->memory_pool);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if recognition is complete
|
||||
*
|
||||
@@ -2451,6 +2615,8 @@ static switch_status_t recog_channel_set_params(speech_channel_t *schannel, mrcp
|
||||
if (id) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) \"%s\": \"%s\"\n", schannel->name, param_name, param_val);
|
||||
recog_channel_set_header(schannel, id->id, param_val, msg, recog_hdr);
|
||||
} else if (!strcasecmp(param_name, "start-recognize")) {
|
||||
// This parameter is used internally only, not in MRCP headers
|
||||
} else {
|
||||
/* this is probably a vendor-specific MRCP param */
|
||||
apt_str_t apt_param_name = { 0 };
|
||||
@@ -2737,6 +2903,7 @@ static switch_status_t recog_asr_open(switch_asr_handle_t *ah, const char *codec
|
||||
schannel->data = r;
|
||||
memset(r, 0, sizeof(recognizer_data_t));
|
||||
switch_core_hash_init(&r->grammars, ah->memory_pool);
|
||||
switch_core_hash_init(&r->enabled_grammars, ah->memory_pool);
|
||||
|
||||
/* Open the channel */
|
||||
if (zstr(profile_name)) {
|
||||
@@ -2782,6 +2949,7 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha
|
||||
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
|
||||
const char *grammar_data = NULL;
|
||||
char *grammar_file_data = NULL;
|
||||
char *start_recognize;
|
||||
switch_file_t *grammar_file = NULL;
|
||||
switch_size_t grammar_file_size = 0, to_read = 0;
|
||||
grammar_type_t type = GRAMMAR_TYPE_UNKNOWN;
|
||||
@@ -2886,7 +3054,19 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = recog_channel_start(schannel, name);
|
||||
start_recognize = (char *) switch_core_hash_find(schannel->params, "start-recognize");
|
||||
if (zstr(start_recognize) || strcasecmp(start_recognize, "false"))
|
||||
{
|
||||
if (recog_channel_disable_all_grammars(schannel) != SWITCH_STATUS_SUCCESS) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
goto done;
|
||||
}
|
||||
if (recog_channel_enable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
goto done;
|
||||
}
|
||||
status = recog_channel_start(schannel);
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
@@ -2914,6 +3094,57 @@ static switch_status_t recog_asr_unload_grammar(switch_asr_handle_t *ah, const c
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process asr_enable_grammar request from FreeSWITCH.
|
||||
*
|
||||
* FreeSWITCH sends this request to enable recognition on this grammar.
|
||||
* @param ah the FreeSWITCH speech recognition handle
|
||||
* @param name the grammar name.
|
||||
*/
|
||||
static switch_status_t recog_asr_enable_grammar(switch_asr_handle_t *ah, const char *name)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
|
||||
if (zstr(name) || speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_enable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process asr_disable_grammar request from FreeSWITCH.
|
||||
*
|
||||
* FreeSWITCH sends this request to disable recognition on this grammar.
|
||||
* @param ah the FreeSWITCH speech recognition handle
|
||||
* @param name the grammar name.
|
||||
*/
|
||||
static switch_status_t recog_asr_disable_grammar(switch_asr_handle_t *ah, const char *name)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
|
||||
if (zstr(name) || speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_disable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process asr_disable_all_grammars request from FreeSWITCH.
|
||||
*
|
||||
* FreeSWITCH sends this request to disable recognition of all grammars.
|
||||
* @param ah the FreeSWITCH speech recognition handle
|
||||
* @param name the grammar name.
|
||||
*/
|
||||
static switch_status_t recog_asr_disable_all_grammars(switch_asr_handle_t *ah)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
|
||||
if (speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_disable_all_grammars(schannel) != SWITCH_STATUS_SUCCESS) {
|
||||
status = SWITCH_STATUS_FALSE;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process asr_close request from FreeSWITCH
|
||||
*
|
||||
@@ -2928,6 +3159,10 @@ static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_
|
||||
speech_channel_stop(schannel);
|
||||
speech_channel_destroy(schannel);
|
||||
switch_core_hash_destroy(&r->grammars);
|
||||
switch_core_hash_destroy(&r->enabled_grammars);
|
||||
if (r->dtmf_generator) {
|
||||
mpf_dtmf_generator_destroy(r->dtmf_generator);
|
||||
}
|
||||
|
||||
/* this lets FreeSWITCH's speech_thread know the handle is closed */
|
||||
switch_set_flag(ah, SWITCH_ASR_FLAG_CLOSED);
|
||||
@@ -2948,18 +3183,50 @@ static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsig
|
||||
return speech_channel_write(schannel, data, &slen);
|
||||
}
|
||||
|
||||
/**
|
||||
* Process asr_feed_dtmf request from FreeSWITCH
|
||||
*
|
||||
* @param ah the FreeSWITCH speech recognition handle
|
||||
* @return SWITCH_STATUS_SUCCESS if successful
|
||||
*/
|
||||
static switch_status_t recog_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags)
|
||||
{
|
||||
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
|
||||
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
|
||||
char digits[2];
|
||||
|
||||
if (!r->dtmf_generator) {
|
||||
if (!r->unimrcp_stream) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Cannot queue DTMF: No UniMRCP stream object open\n", schannel->name);
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
r->dtmf_generator = mpf_dtmf_generator_create(r->unimrcp_stream, schannel->unimrcp_session->pool);
|
||||
if (!r->dtmf_generator) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Cannot queue DTMF: Failed to create DTMF generator\n", schannel->name);
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
digits[0] = dtmf->digit;
|
||||
digits[1] = '\0';
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) Queued DTMF: %s\n", schannel->name, digits);
|
||||
mpf_dtmf_generator_enqueue(r->dtmf_generator, digits);
|
||||
r->dtmf_generator_active = 1;
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* Process asr_start request from FreeSWITCH
|
||||
* @param ah the FreeSWITCH speech recognition handle
|
||||
* @param name name of the grammar to use
|
||||
* @return SWITCH_STATUS_SUCCESS if successful
|
||||
*/
|
||||
static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name)
|
||||
static switch_status_t recog_asr_start(switch_asr_handle_t *ah)
|
||||
{
|
||||
switch_status_t status;
|
||||
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
|
||||
status = recog_channel_start(schannel, name);
|
||||
status = recog_channel_start(schannel);
|
||||
return status;
|
||||
}
|
||||
#endif
|
||||
@@ -2972,7 +3239,7 @@ static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name
|
||||
static switch_status_t recog_asr_resume(switch_asr_handle_t *ah)
|
||||
{
|
||||
speech_channel_t *schannel = (speech_channel_t *) ah->private_info;
|
||||
return recog_channel_start(schannel, NULL);
|
||||
return recog_channel_start(schannel);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3194,6 +3461,23 @@ static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* UniMRCP callback requesting open for speech recognition
|
||||
*
|
||||
* @param stream the UniMRCP stream
|
||||
* @param codec the codec
|
||||
* @return TRUE
|
||||
*/
|
||||
static apt_bool_t recog_stream_open(mpf_audio_stream_t *stream, mpf_codec_t *codec)
|
||||
{
|
||||
speech_channel_t *schannel = (speech_channel_t *) stream->obj;
|
||||
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
|
||||
|
||||
r->unimrcp_stream = stream;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* UniMRCP callback requesting next frame for speech recognition
|
||||
*
|
||||
@@ -3204,6 +3488,7 @@ static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp
|
||||
static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame)
|
||||
{
|
||||
speech_channel_t *schannel = (speech_channel_t *) stream->obj;
|
||||
recognizer_data_t *r = (recognizer_data_t *) schannel->data;
|
||||
switch_size_t to_read = frame->codec_frame.size;
|
||||
|
||||
/* grab the data. pad it if there isn't enough */
|
||||
@@ -3213,6 +3498,13 @@ static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *fra
|
||||
}
|
||||
frame->type |= MEDIA_FRAME_TYPE_AUDIO;
|
||||
}
|
||||
|
||||
if (r->dtmf_generator_active) {
|
||||
if (!mpf_dtmf_generator_put_frame(r->dtmf_generator, frame)) {
|
||||
if (!mpf_dtmf_generator_sending(r->dtmf_generator))
|
||||
r->dtmf_generator_active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -3231,8 +3523,12 @@ static switch_status_t recog_load(switch_loadable_module_interface_t *module_int
|
||||
asr_interface->asr_open = recog_asr_open;
|
||||
asr_interface->asr_load_grammar = recog_asr_load_grammar;
|
||||
asr_interface->asr_unload_grammar = recog_asr_unload_grammar;
|
||||
asr_interface->asr_enable_grammar = recog_asr_enable_grammar;
|
||||
asr_interface->asr_disable_grammar = recog_asr_disable_grammar;
|
||||
asr_interface->asr_disable_all_grammars = recog_asr_disable_all_grammars;
|
||||
asr_interface->asr_close = recog_asr_close;
|
||||
asr_interface->asr_feed = recog_asr_feed;
|
||||
asr_interface->asr_feed_dtmf = recog_asr_feed_dtmf;
|
||||
#if 0
|
||||
asr_interface->asr_start = recog_asr_start;
|
||||
#endif
|
||||
@@ -3255,7 +3551,7 @@ static switch_status_t recog_load(switch_loadable_module_interface_t *module_int
|
||||
globals.recog.dispatcher.on_channel_remove = speech_on_channel_remove;
|
||||
globals.recog.dispatcher.on_message_receive = recog_on_message_receive;
|
||||
globals.recog.audio_stream_vtable.destroy = NULL;
|
||||
globals.recog.audio_stream_vtable.open_rx = NULL;
|
||||
globals.recog.audio_stream_vtable.open_rx = recog_stream_open;
|
||||
globals.recog.audio_stream_vtable.close_rx = NULL;
|
||||
globals.recog.audio_stream_vtable.read_frame = recog_stream_read;
|
||||
globals.recog.audio_stream_vtable.open_tx = NULL;
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
BASE=../../../..
|
||||
|
||||
OPUS=opus-0.9.0
|
||||
|
||||
OPUS_DIR=$(switch_srcdir)/libs/$(OPUS)
|
||||
OPUS_BUILDDIR=$(switch_builddir)/libs/$(OPUS)
|
||||
LOCAL_CFLAGS=-I$(OPUS_DIR)/src -g -O2
|
||||
|
||||
IETF_LA=$(OPUS_BUILDDIR)/src/.libs/libietfcodec.a
|
||||
CELT_LA=$(OPUS_BUILDDIR)/celt/libcelt/.libs/libcelt0.a
|
||||
SILK_LA=$(OPUS_BUILDDIR)/silk/.libs/libSKP_SILK_SDK.a
|
||||
|
||||
LOCAL_LIBADD=$(IETF_LA) $(CELT_LA) $(SILK_LA) -lm -lz
|
||||
|
||||
include $(BASE)/build/modmake.rules
|
||||
|
||||
$(OPUS_DIR):
|
||||
$(GETLIB) $(OPUS).tar.gz
|
||||
|
||||
$(OPUS_BUILDDIR)/Makefile: $(OPUS_DIR)
|
||||
mkdir -p $(OPUS_BUILDDIR)
|
||||
cd $(OPUS_BUILDDIR) && $(DEFAULT_VARS) $(OPUS_DIR)/configure --disable-shared --with-pic --srcdir=$(OPUS_DIR)
|
||||
$(TOUCH_TARGET)
|
||||
|
||||
$(IETF_LA): $(OPUS_BUILDDIR)/Makefile
|
||||
cd $(OPUS_BUILDDIR) && $(MAKE)
|
||||
$(TOUCH_TARGET)
|
||||
|
||||
@@ -0,0 +1,200 @@
|
||||
/*
|
||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
* Copyright (C) 2005-2011, Anthony Minessale II <anthm@freeswitch.org>
|
||||
*
|
||||
* Version: MPL 1.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Anthony Minessale II <anthm@freeswitch.org>
|
||||
* Portions created by the Initial Developer are Copyright (C)
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* Brian K. West <brian@freeswitch.org>
|
||||
*
|
||||
* mod_opus.c -- The OPUS ultra-low delay audio codec (http://www.opus-codec.org/)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "switch.h"
|
||||
#include "opus.h"
|
||||
|
||||
|
||||
SWITCH_MODULE_LOAD_FUNCTION(mod_opus_load);
|
||||
SWITCH_MODULE_DEFINITION(mod_opus, mod_opus_load, NULL, NULL);
|
||||
|
||||
struct opus_context {
|
||||
OpusEncoder *encoder_object;
|
||||
OpusDecoder *decoder_object;
|
||||
int frame_size;
|
||||
};
|
||||
|
||||
static switch_status_t switch_opus_init(switch_codec_t *codec, switch_codec_flag_t flags, const switch_codec_settings_t *codec_settings)
|
||||
{
|
||||
struct opus_context *context = NULL;
|
||||
int encoding = (flags & SWITCH_CODEC_FLAG_ENCODE);
|
||||
int decoding = (flags & SWITCH_CODEC_FLAG_DECODE);
|
||||
|
||||
if (!(encoding || decoding) || (!(context = switch_core_alloc(codec->memory_pool, sizeof(*context))))) {
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
context->frame_size = codec->implementation->samples_per_packet;
|
||||
|
||||
if (encoding) {
|
||||
/* come up with a way to specify these */
|
||||
int bitrate_bps = codec->implementation->bits_per_second;
|
||||
int mode = MODE_HYBRID;
|
||||
int use_vbr = 1;
|
||||
int complexity = 10;
|
||||
int use_inbandfec = 1;
|
||||
int use_dtx = 1;
|
||||
int bandwidth = BANDWIDTH_FULLBAND;
|
||||
|
||||
context->encoder_object = opus_encoder_create(codec->implementation->actual_samples_per_second, codec->implementation->number_of_channels);
|
||||
|
||||
opus_encoder_ctl(context->encoder_object, OPUS_SET_MODE(mode));
|
||||
opus_encoder_ctl(context->encoder_object, OPUS_SET_BITRATE(bitrate_bps));
|
||||
opus_encoder_ctl(context->encoder_object, OPUS_SET_BANDWIDTH(bandwidth));
|
||||
opus_encoder_ctl(context->encoder_object, OPUS_SET_VBR_FLAG(use_vbr));
|
||||
opus_encoder_ctl(context->encoder_object, OPUS_SET_COMPLEXITY(complexity));
|
||||
opus_encoder_ctl(context->encoder_object, OPUS_SET_INBAND_FEC_FLAG(use_inbandfec));
|
||||
opus_encoder_ctl(context->encoder_object, OPUS_SET_DTX_FLAG(use_dtx));
|
||||
|
||||
}
|
||||
|
||||
if (decoding) {
|
||||
context->decoder_object = opus_decoder_create(codec->implementation->actual_samples_per_second, codec->implementation->number_of_channels);
|
||||
}
|
||||
|
||||
codec->private_info = context;
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static switch_status_t switch_opus_destroy(switch_codec_t *codec)
|
||||
{
|
||||
codec->private_info = NULL;
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static switch_status_t switch_opus_encode(switch_codec_t *codec,
|
||||
switch_codec_t *other_codec,
|
||||
void *decoded_data,
|
||||
uint32_t decoded_data_len,
|
||||
uint32_t decoded_rate, void *encoded_data, uint32_t *encoded_data_len, uint32_t *encoded_rate,
|
||||
unsigned int *flag)
|
||||
{
|
||||
struct opus_context *context = codec->private_info;
|
||||
int bytes = 0;
|
||||
int len = (int) *encoded_data_len;
|
||||
|
||||
if (!context) {
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
if (len > 1275) len = 1275;
|
||||
|
||||
bytes = opus_encode(context->encoder_object, (void *) decoded_data, decoded_data_len / 2, (unsigned char *) encoded_data, len);
|
||||
|
||||
if (bytes > 0) {
|
||||
*encoded_data_len = (uint32_t) bytes;
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Encoder Error!\n");
|
||||
return SWITCH_STATUS_GENERR;
|
||||
}
|
||||
|
||||
static switch_status_t switch_opus_decode(switch_codec_t *codec,
|
||||
switch_codec_t *other_codec,
|
||||
void *encoded_data,
|
||||
uint32_t encoded_data_len,
|
||||
uint32_t encoded_rate, void *decoded_data, uint32_t *decoded_data_len, uint32_t *decoded_rate,
|
||||
unsigned int *flag)
|
||||
{
|
||||
struct opus_context *context = codec->private_info;
|
||||
int samples = 0;
|
||||
|
||||
if (!context) {
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
samples = opus_decode(context->decoder_object, encoded_data, encoded_data_len, decoded_data, *decoded_data_len);
|
||||
|
||||
if (samples < 0) {
|
||||
return SWITCH_STATUS_GENERR;
|
||||
}
|
||||
|
||||
*decoded_data_len = samples * 2;
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
SWITCH_MODULE_LOAD_FUNCTION(mod_opus_load)
|
||||
{
|
||||
switch_codec_interface_t *codec_interface;
|
||||
int samples = 80;
|
||||
int bytes = 960;
|
||||
int mss = 10000;
|
||||
int x = 0;
|
||||
int rate = 48000;
|
||||
int bits = 32000;
|
||||
|
||||
/* connect my internal structure to the blank pointer passed to me */
|
||||
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
|
||||
|
||||
SWITCH_ADD_CODEC(codec_interface, "OPUS (BETA 0.9.0)");
|
||||
|
||||
for (x = 0; x < 2; x++) {
|
||||
switch_core_codec_add_implementation(pool, codec_interface, SWITCH_CODEC_TYPE_AUDIO, /* enumeration defining the type of the codec */
|
||||
115, /* the IANA code number */
|
||||
"Opus-0.9.0",/* the IANA code name */
|
||||
NULL, /* default fmtp to send (can be overridden by the init function) */
|
||||
rate, /* samples transferred per second */
|
||||
rate, /* actual samples transferred per second */
|
||||
bits, /* bits transferred per second */
|
||||
mss, /* number of microseconds per frame */
|
||||
samples, /* number of samples per frame */
|
||||
bytes, /* number of bytes per frame decompressed */
|
||||
0, /* number of bytes per frame compressed */
|
||||
1, /* number of channels represented */
|
||||
1, /* number of frames per network packet */
|
||||
switch_opus_init, /* function to initialize a codec handle using this implementation */
|
||||
switch_opus_encode, /* function to encode raw data into encoded data */
|
||||
switch_opus_decode, /* function to decode encoded data into raw data */
|
||||
switch_opus_destroy); /* deinitalize a codec handle using this implementation */
|
||||
|
||||
bytes *= 2;
|
||||
samples *= 2;
|
||||
mss *= 2;
|
||||
|
||||
}
|
||||
|
||||
/* indicate that the module should continue to be loaded */
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
@@ -309,11 +309,13 @@ static switch_call_cause_t sip_outgoing_channel(switch_core_session_t *session,
|
||||
switch_call_cause_t *cancel_cause)
|
||||
{
|
||||
const char *profile;
|
||||
char *dup_profile = NULL;
|
||||
|
||||
if (session) {
|
||||
profile = switch_channel_get_variable(switch_core_session_get_channel(session), "sip_profile");
|
||||
} else {
|
||||
profile = switch_core_get_variable("sip_profile");
|
||||
dup_profile = switch_core_get_variable_dup("sip_profile");
|
||||
profile = dup_profile;
|
||||
}
|
||||
if (zstr(profile)) {
|
||||
profile = "default";
|
||||
@@ -323,6 +325,8 @@ static switch_call_cause_t sip_outgoing_channel(switch_core_session_t *session,
|
||||
|
||||
UNPROTECT_INTERFACE(sip_endpoint_interface);
|
||||
|
||||
switch_safe_free(dup_profile);
|
||||
|
||||
return switch_core_session_outgoing_channel(session, var_event, "sofia", outbound_profile, new_session, pool, SOF_NONE, cancel_cause);
|
||||
}
|
||||
|
||||
|
||||
@@ -2049,7 +2049,7 @@ static void set_profile_val(mdl_profile_t *profile, char *var, char *val)
|
||||
} else if (!strcasecmp(var, "ext-rtp-ip")) {
|
||||
char *ip = globals.guess_ip;
|
||||
if (val && !strcasecmp(val, "auto-nat")) {
|
||||
ip = globals.auto_nat ? switch_core_get_variable("nat_public_addr") : globals.guess_ip;
|
||||
ip = globals.auto_nat ? switch_core_get_variable_pdup("nat_public_addr", module_pool) : globals.guess_ip;
|
||||
} else if (val && !strcasecmp(val, "auto")) {
|
||||
globals.auto_nat = 0;
|
||||
ip = globals.guess_ip;
|
||||
@@ -2523,7 +2523,7 @@ static switch_status_t load_config(void)
|
||||
|
||||
memset(&globals, 0, sizeof(globals));
|
||||
globals.running = 1;
|
||||
globals.auto_nat = (switch_core_get_variable("nat_type") ? 1 : 0);
|
||||
globals.auto_nat = (switch_nat_get_type() ? 1 : 0);
|
||||
|
||||
switch_find_local_ip(globals.guess_ip, sizeof(globals.guess_ip), NULL, AF_INET);
|
||||
|
||||
|
||||
@@ -1625,9 +1625,10 @@ bool Board::KhompPvt::setCollectCall()
|
||||
DBG(FUNC, PVT_FMT(_target, "option drop collect call is '%s'") % (Opt::_options._drop_collect_call() ? "yes" : "no"));
|
||||
|
||||
// get global filter configuration value
|
||||
tmp_var = switch_core_get_variable("KDropCollectCall");
|
||||
tmp_var = switch_core_get_variable_dup("KDropCollectCall");
|
||||
confvalues.push_back(getTriStateValue(tmp_var));
|
||||
DBG(FUNC, PVT_FMT(_target, "global KDropCollectCall was '%s'") % (tmp_var ? tmp_var : "(empty)"));
|
||||
switch_safe_free(tmp_var);
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -77,11 +77,12 @@ struct private_object {
|
||||
|
||||
switch_frame_t cng_frame;
|
||||
unsigned char cng_databuf[SWITCH_RECOMMENDED_BUFFER_SIZE];
|
||||
switch_timer_t timer;
|
||||
switch_caller_profile_t *caller_profile;
|
||||
int32_t bowout_frame_count;
|
||||
char *other_uuid;
|
||||
switch_queue_t *frame_queue;
|
||||
switch_codec_implementation_t read_impl;
|
||||
int64_t packet_count;
|
||||
};
|
||||
|
||||
typedef struct private_object private_t;
|
||||
@@ -111,6 +112,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
|
||||
int interval = 20;
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
const switch_codec_implementation_t *read_impl;
|
||||
|
||||
if (codec) {
|
||||
iananame = codec->implementation->iananame;
|
||||
@@ -165,7 +167,15 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
|
||||
switch_core_session_set_read_codec(session, &tech_pvt->read_codec);
|
||||
switch_core_session_set_write_codec(session, &tech_pvt->write_codec);
|
||||
|
||||
tech_pvt->read_impl = *tech_pvt->read_codec.implementation;
|
||||
if (tech_pvt->flag_mutex) {
|
||||
switch_core_timer_destroy(&tech_pvt->timer);
|
||||
}
|
||||
|
||||
read_impl = tech_pvt->read_codec.implementation;
|
||||
|
||||
switch_core_timer_init(&tech_pvt->timer, "soft",
|
||||
read_impl->microseconds_per_packet / 1000, read_impl->samples_per_packet * 4, switch_core_session_get_pool(session));
|
||||
|
||||
|
||||
if (!tech_pvt->flag_mutex) {
|
||||
switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
|
||||
@@ -367,6 +377,7 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
|
||||
tech_pvt = switch_core_session_get_private(session);
|
||||
|
||||
if (tech_pvt) {
|
||||
switch_core_timer_destroy(&tech_pvt->timer);
|
||||
|
||||
if (switch_core_codec_ready(&tech_pvt->read_codec)) {
|
||||
switch_core_codec_destroy(&tech_pvt->read_codec);
|
||||
@@ -558,49 +569,31 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
|
||||
goto end;
|
||||
}
|
||||
|
||||
switch_core_timer_next(&tech_pvt->timer);
|
||||
|
||||
mutex = tech_pvt->mutex;
|
||||
switch_mutex_lock(mutex);
|
||||
|
||||
|
||||
if (switch_queue_pop_timeout(tech_pvt->frame_queue, &pop, tech_pvt->read_impl.microseconds_per_packet) == SWITCH_STATUS_SUCCESS && pop) {
|
||||
if (switch_queue_trypop(tech_pvt->frame_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
|
||||
if (tech_pvt->write_frame) {
|
||||
switch_frame_free(&tech_pvt->write_frame);
|
||||
}
|
||||
|
||||
|
||||
tech_pvt->write_frame = (switch_frame_t *) pop;
|
||||
tech_pvt->write_frame->codec = &tech_pvt->read_codec;
|
||||
*frame = tech_pvt->write_frame;
|
||||
tech_pvt->packet_count++;
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_CNG);
|
||||
switch_clear_flag(tech_pvt->write_frame, SFF_CNG);
|
||||
} else {
|
||||
switch_set_flag(tech_pvt, TFLAG_CNG);
|
||||
}
|
||||
|
||||
switch_mutex_lock(mutex);
|
||||
|
||||
if (switch_test_flag(tech_pvt, TFLAG_CNG)) {
|
||||
unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE];
|
||||
uint32_t flag = 0;
|
||||
switch_status_t encode_status;
|
||||
uint32_t rate = tech_pvt->read_codec.implementation->actual_samples_per_second;
|
||||
|
||||
*frame = &tech_pvt->cng_frame;
|
||||
tech_pvt->cng_frame.codec = &tech_pvt->read_codec;
|
||||
tech_pvt->cng_frame.datalen = tech_pvt->read_codec.implementation->decoded_bytes_per_packet;
|
||||
|
||||
memset(tech_pvt->cng_frame.data, 0, tech_pvt->cng_frame.datalen);
|
||||
memset(&data, 0, tech_pvt->read_codec.implementation->decoded_bytes_per_packet);
|
||||
|
||||
if (strcasecmp(tech_pvt->read_codec.implementation->iananame, "L16")) {
|
||||
encode_status = switch_core_codec_encode(&tech_pvt->read_codec,
|
||||
NULL,
|
||||
data,
|
||||
tech_pvt->read_codec.implementation->decoded_bytes_per_packet,
|
||||
tech_pvt->read_codec.implementation->actual_samples_per_second,
|
||||
tech_pvt->cng_frame.data, &tech_pvt->cng_frame.datalen, &rate, &flag);
|
||||
if (encode_status != SWITCH_STATUS_SUCCESS) {
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
|
||||
}
|
||||
|
||||
}
|
||||
//switch_set_flag((&tech_pvt->cng_frame), SFF_CNG);
|
||||
switch_set_flag((&tech_pvt->cng_frame), SFF_CNG);
|
||||
switch_clear_flag_locked(tech_pvt, TFLAG_CNG);
|
||||
}
|
||||
|
||||
@@ -632,7 +625,10 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
|
||||
tech_pvt = switch_core_session_get_private(session);
|
||||
switch_assert(tech_pvt != NULL);
|
||||
|
||||
if (switch_test_flag(frame, SFF_CNG) || switch_test_flag(tech_pvt, TFLAG_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) && switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {
|
||||
if (switch_test_flag(frame, SFF_CNG) ||
|
||||
switch_test_flag(tech_pvt, TFLAG_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) && switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {
|
||||
switch_core_timer_sync(&tech_pvt->timer);
|
||||
switch_core_timer_sync(&tech_pvt->other_tech_pvt->timer);
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -765,6 +761,8 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
|
||||
switch_frame_free(&frame);
|
||||
}
|
||||
|
||||
switch_core_timer_sync(&tech_pvt->timer);
|
||||
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -68,6 +68,13 @@ struct PACKED keypad_button_message {
|
||||
uint32_t call_id;
|
||||
};
|
||||
|
||||
/* EnblocCallMessage */
|
||||
#define ENBLOC_CALL_MESSAGE 0x0004
|
||||
struct PACKED enbloc_call_message {
|
||||
char called_party[24];
|
||||
uint32_t line_instance;
|
||||
};
|
||||
|
||||
/* StimulusMessage */
|
||||
#define STIMULUS_MESSAGE 0x0005
|
||||
struct PACKED stimulus_message {
|
||||
@@ -562,6 +569,7 @@ union skinny_data {
|
||||
struct register_message reg;
|
||||
struct port_message port;
|
||||
struct keypad_button_message keypad_button;
|
||||
struct enbloc_call_message enbloc_call;
|
||||
struct stimulus_message stimulus;
|
||||
struct off_hook_message off_hook;
|
||||
struct on_hook_message on_hook;
|
||||
|
||||
@@ -1171,6 +1171,29 @@ switch_status_t skinny_handle_keypad_button_message(listener_t *listener, skinny
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_status_t skinny_handle_enbloc_call_message(listener_t *listener, skinny_message_t *request)
|
||||
{
|
||||
uint32_t line_instance = 1;
|
||||
switch_core_session_t *session = NULL;
|
||||
|
||||
skinny_check_data_length(request, sizeof(request->data.enbloc_call.called_party));
|
||||
|
||||
if(skinny_check_data_length_soft(request, sizeof(request->data.enbloc_call))) {
|
||||
if (request->data.enbloc_call.line_instance > 0) {
|
||||
line_instance = request->data.enbloc_call.line_instance;
|
||||
}
|
||||
}
|
||||
|
||||
session = skinny_profile_find_session(listener->profile, listener, &line_instance, 0);
|
||||
|
||||
if(session) {
|
||||
skinny_session_process_dest(session, listener, line_instance, request->data.enbloc_call.called_party, '\0', 0);
|
||||
switch_core_session_rwunlock(session);
|
||||
}
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
switch_status_t skinny_handle_stimulus_message(listener_t *listener, skinny_message_t *request)
|
||||
{
|
||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||
@@ -2004,6 +2027,8 @@ switch_status_t skinny_handle_request(listener_t *listener, skinny_message_t *re
|
||||
return skinny_handle_port_message(listener, request);
|
||||
case KEYPAD_BUTTON_MESSAGE:
|
||||
return skinny_handle_keypad_button_message(listener, request);
|
||||
case ENBLOC_CALL_MESSAGE:
|
||||
return skinny_handle_enbloc_call_message(listener, request);
|
||||
case STIMULUS_MESSAGE:
|
||||
return skinny_handle_stimulus_message(listener, request);
|
||||
case OFF_HOOK_MESSAGE:
|
||||
|
||||
@@ -39,6 +39,7 @@ struct skinny_table SKINNY_MESSAGE_TYPES[] = {
|
||||
{"RegisterMessage", REGISTER_MESSAGE},
|
||||
{"PortMessage", PORT_MESSAGE},
|
||||
{"KeypadButtonMessage", KEYPAD_BUTTON_MESSAGE},
|
||||
{"EnblocCallMessage", ENBLOC_CALL_MESSAGE},
|
||||
{"StimulusMessage", STIMULUS_MESSAGE},
|
||||
{"OffHookMessage", OFF_HOOK_MESSAGE},
|
||||
{"OnHookMessage", ON_HOOK_MESSAGE},
|
||||
|
||||
@@ -87,7 +87,7 @@ uint32_t func(const char *str)\
|
||||
}
|
||||
|
||||
|
||||
extern struct skinny_table SKINNY_MESSAGE_TYPES[66];
|
||||
extern struct skinny_table SKINNY_MESSAGE_TYPES[67];
|
||||
const char *skinny_message_type2str(uint32_t id);
|
||||
uint32_t skinny_str2message_type(const char *str);
|
||||
#define SKINNY_PUSH_MESSAGE_TYPES SKINNY_DECLARE_PUSH_MATCH(SKINNY_MESSAGE_TYPES)
|
||||
|
||||
@@ -707,11 +707,20 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session)
|
||||
cid = generate_pai_str(tech_pvt);
|
||||
|
||||
|
||||
if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE) && tech_pvt->early_sdp && strcmp(tech_pvt->early_sdp, tech_pvt->local_sdp_str)) {
|
||||
/* The SIP RFC for SOA forbids sending a 183 with one sdp then a 200 with another but it won't do us much good unless
|
||||
we do so in this case we will abandon the SOA rules and go rogue.
|
||||
*/
|
||||
sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);
|
||||
if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE) && tech_pvt->early_sdp) {
|
||||
char *a, *b;
|
||||
|
||||
/* start at the s= line to avoid some devices who update the o= between messages */
|
||||
a = strstr(tech_pvt->early_sdp, "s=");
|
||||
b = strstr(tech_pvt->local_sdp_str, "s=");
|
||||
|
||||
if (!a || !b || strcmp(a, b)) {
|
||||
|
||||
/* The SIP RFC for SOA forbids sending a 183 with one sdp then a 200 with another but it won't do us much good unless
|
||||
we do so in this case we will abandon the SOA rules and go rogue.
|
||||
*/
|
||||
sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);
|
||||
}
|
||||
}
|
||||
|
||||
if (sofia_use_soa(tech_pvt)) {
|
||||
@@ -3449,7 +3458,7 @@ SWITCH_STANDARD_API(sofia_contact_function)
|
||||
{
|
||||
char *data;
|
||||
char *user = NULL;
|
||||
char *domain = NULL;
|
||||
char *domain = NULL, *dup_domain = NULL;
|
||||
char *concat = NULL;
|
||||
char *profile_name = NULL;
|
||||
char *p;
|
||||
@@ -3492,7 +3501,8 @@ SWITCH_STANDARD_API(sofia_contact_function)
|
||||
}
|
||||
|
||||
if (zstr(domain)) {
|
||||
domain = switch_core_get_variable("domain");
|
||||
dup_domain = switch_core_get_variable_dup("domain");
|
||||
domain = dup_domain;
|
||||
}
|
||||
|
||||
if (!user) goto end;
|
||||
@@ -3558,6 +3568,7 @@ SWITCH_STANDARD_API(sofia_contact_function)
|
||||
switch_safe_free(mystream.data);
|
||||
|
||||
switch_safe_free(data);
|
||||
switch_safe_free(dup_domain);
|
||||
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -3699,7 +3710,7 @@ SWITCH_STANDARD_API(sofia_function)
|
||||
|
||||
if (argc > 2) {
|
||||
if (strstr(argv[2], "presence")) {
|
||||
mod_sofia_globals.debug_presence = 1;
|
||||
mod_sofia_globals.debug_presence = 10;
|
||||
stream->write_function(stream, "+OK Debugging presence\n");
|
||||
}
|
||||
|
||||
@@ -4767,7 +4778,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)
|
||||
mod_sofia_globals.running = 1;
|
||||
switch_mutex_unlock(mod_sofia_globals.mutex);
|
||||
|
||||
mod_sofia_globals.auto_nat = (switch_core_get_variable("nat_type") ? 1 : 0);
|
||||
mod_sofia_globals.auto_nat = (switch_nat_get_type() ? 1 : 0);
|
||||
|
||||
switch_queue_create(&mod_sofia_globals.presence_queue, SOFIA_QUEUE_SIZE, mod_sofia_globals.pool);
|
||||
switch_queue_create(&mod_sofia_globals.mwi_queue, SOFIA_QUEUE_SIZE, mod_sofia_globals.pool);
|
||||
|
||||
@@ -1459,7 +1459,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
||||
|
||||
supported = switch_core_sprintf(profile->pool, "%s%sprecondition, path, replaces", use_100rel ? "100rel, " : "", use_timer ? "timer, " : "");
|
||||
|
||||
if (sofia_test_pflag(profile, PFLAG_AUTO_NAT) && switch_core_get_variable("nat_type")) {
|
||||
if (sofia_test_pflag(profile, PFLAG_AUTO_NAT) && switch_nat_get_type()) {
|
||||
if (switch_nat_add_mapping(profile->sip_port, SWITCH_NAT_UDP, NULL, SWITCH_FALSE) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Created UDP nat mapping for %s port %d\n", profile->name, profile->sip_port);
|
||||
}
|
||||
@@ -1676,7 +1676,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void
|
||||
switch_event_fire(&s_event);
|
||||
}
|
||||
|
||||
if (sofia_test_pflag(profile, PFLAG_AUTO_NAT) && switch_core_get_variable("nat_type")) {
|
||||
if (sofia_test_pflag(profile, PFLAG_AUTO_NAT) && switch_nat_get_type()) {
|
||||
if (switch_nat_del_mapping(profile->sip_port, SWITCH_NAT_UDP) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Deleted UDP nat mapping for %s port %d\n", profile->name, profile->sip_port);
|
||||
}
|
||||
@@ -3741,9 +3741,9 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
if (!profile->rtpip[0]) {
|
||||
profile->rtpip[profile->rtpip_index++] = switch_core_strdup(profile->pool, mod_sofia_globals.guess_ip);
|
||||
}
|
||||
|
||||
if (switch_core_get_variable("nat_type")) {
|
||||
const char *ip = switch_core_get_variable("nat_public_addr");
|
||||
|
||||
if (switch_nat_get_type()) {
|
||||
char *ip = switch_core_get_variable_dup("nat_public_addr");
|
||||
if (ip && !strchr(profile->sipip, ':')) {
|
||||
if (!profile->extrtpip) {
|
||||
profile->extrtpip = switch_core_strdup(profile->pool, ip);
|
||||
@@ -3754,6 +3754,7 @@ switch_status_t config_sofia(int reload, char *profile_name)
|
||||
sofia_set_pflag(profile, PFLAG_AUTO_NAT);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "NAT detected setting external ip to %s\n", ip);
|
||||
}
|
||||
switch_safe_free(ip);
|
||||
}
|
||||
|
||||
if (profile->nonce_ttl < 60) {
|
||||
|
||||
@@ -4071,15 +4071,22 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
||||
greedy = !!sofia_test_pflag(tech_pvt->profile, PFLAG_GREEDY);
|
||||
scrooge = !!sofia_test_pflag(tech_pvt->profile, PFLAG_SCROOGE);
|
||||
|
||||
if (!greedy || !scrooge) {
|
||||
if ((val = switch_channel_get_variable(channel, "sip_codec_negotiation"))) {
|
||||
if (!strcasecmp(val, "greedy")) {
|
||||
greedy = 1;
|
||||
} else if (!strcasecmp(val, "scrooge")) {
|
||||
scrooge = 1;
|
||||
greedy = 1;
|
||||
}
|
||||
}
|
||||
if ((val = switch_channel_get_variable(channel, "sip_codec_negotiation"))) {
|
||||
if (!strcasecmp(val, "generous")) {
|
||||
greedy = 0;
|
||||
scrooge = 0;
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "sip_codec_negotiation overriding sofia inbound-codec-negotiation : generous\n" );
|
||||
} else if (!strcasecmp(val, "greedy")) {
|
||||
greedy = 1;
|
||||
scrooge = 0;
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "sip_codec_negotiation overriding sofia inbound-codec-negotiation : greedy\n" );
|
||||
} else if (!strcasecmp(val, "scrooge")) {
|
||||
scrooge = 1;
|
||||
greedy = 1;
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "sip_codec_negotiation overriding sofia inbound-codec-negotiation : scrooge\n" );
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "sip_codec_negotiation ignored invalid value : '%s' \n", val );
|
||||
}
|
||||
}
|
||||
|
||||
if ((tech_pvt->origin = switch_core_session_strdup(session, (char *) sdp->sdp_origin->o_username))) {
|
||||
@@ -4473,7 +4480,7 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
||||
match = strcasecmp(rm_encoding, imp->iananame) ? 0 : 1;
|
||||
}
|
||||
|
||||
if (match && bit_rate && map_bit_rate && map_bit_rate != bit_rate) {
|
||||
if (match && bit_rate && map_bit_rate && map_bit_rate != bit_rate && strcasecmp(map->rm_encoding, "ilbc")) {
|
||||
/* nevermind */
|
||||
match = 0;
|
||||
}
|
||||
|
||||
@@ -2570,6 +2570,19 @@ static int sofia_counterpath_crutch(void *pArg, int argc, char **argv, char **co
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
uint32_t sofia_presence_contact_count(sofia_profile_t *profile, const char *contact_str)
|
||||
{
|
||||
char buf[32] = "";
|
||||
char *sql;
|
||||
|
||||
sql = switch_mprintf("select count(*) from sip_subscriptions where profile_name='%q' and contact='%q'", profile->name, contact_str);
|
||||
|
||||
sofia_glue_execute_sql2str(profile, profile->ireg_mutex, sql, buf, sizeof(buf));
|
||||
switch_safe_free(sql);
|
||||
return atoi(buf);
|
||||
}
|
||||
|
||||
void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip,
|
||||
tagi_t tags[])
|
||||
{
|
||||
@@ -2584,7 +2597,7 @@ void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, n
|
||||
char expstr[30] = "";
|
||||
long exp = 0, exp_delta = 3600;
|
||||
char *pd_dup = NULL;
|
||||
int count = 1;
|
||||
int count = 1, sub_count = 0;
|
||||
char *contact_str;
|
||||
int open = 1;
|
||||
|
||||
@@ -2667,24 +2680,25 @@ void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, n
|
||||
count = sofia_reg_reg_count(profile, from_user, from_host);
|
||||
}
|
||||
|
||||
sub_count = sofia_presence_contact_count(profile, contact_str);
|
||||
|
||||
/* if (count > 1) let's not and say we did or all the clients who subscribe to their own presence will think they selves is offline */
|
||||
|
||||
event_type = sip_header_as_string(profile->home, (void *) sip->sip_event);
|
||||
|
||||
if (count < 2) {
|
||||
if ((sql =
|
||||
switch_mprintf("delete from sip_presence where sip_user='%q' and sip_host='%q' "
|
||||
" and profile_name='%q' and hostname='%q'", from_user, from_host, profile->name, mod_sofia_globals.hostname))) {
|
||||
if ((sql = switch_mprintf("delete from sip_presence where sip_user='%q' and sip_host='%q' "
|
||||
" and profile_name='%q' and hostname='%q'",
|
||||
from_user, from_host, profile->name, mod_sofia_globals.hostname))) {
|
||||
sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
|
||||
}
|
||||
|
||||
if ((sql =
|
||||
switch_mprintf("insert into sip_presence (sip_user, sip_host, status, rpid, expires, user_agent,"
|
||||
" profile_name, hostname, open_closed) "
|
||||
"values ('%q','%q','%q','%q',%ld,'%q','%q','%q','%q')",
|
||||
from_user, from_host, note_txt, rpid, exp, full_agent, profile->name, mod_sofia_globals.hostname, open_closed))) {
|
||||
|
||||
if (sub_count > 0 && (sql = switch_mprintf("insert into sip_presence (sip_user, sip_host, status, rpid, expires, user_agent,"
|
||||
" profile_name, hostname, open_closed) "
|
||||
"values ('%q','%q','%q','%q',%ld,'%q','%q','%q','%q')",
|
||||
from_user, from_host, note_txt, rpid, exp, full_agent, profile->name,
|
||||
mod_sofia_globals.hostname, open_closed))) {
|
||||
|
||||
sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
|
||||
}
|
||||
|
||||
@@ -2696,16 +2710,17 @@ void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, n
|
||||
switch_safe_free(sql);
|
||||
}
|
||||
|
||||
|
||||
if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "user-agent", full_agent);
|
||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", from_user, from_host);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", note_txt);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", event_type);
|
||||
switch_event_fire(&event);
|
||||
if (sub_count > 0) {
|
||||
if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) {
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "rpid", rpid);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "user-agent", full_agent);
|
||||
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", from_user, from_host);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", note_txt);
|
||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", event_type);
|
||||
switch_event_fire(&event);
|
||||
}
|
||||
}
|
||||
|
||||
if (event_type) {
|
||||
@@ -2728,7 +2743,12 @@ void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, n
|
||||
|
||||
switch_snprintf(expstr, sizeof(expstr), "%d", exp_delta);
|
||||
switch_stun_random_string(etag, 8, NULL);
|
||||
nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS(nua), SIPTAG_ETAG_STR(etag), SIPTAG_EXPIRES_STR(expstr), TAG_END());
|
||||
|
||||
if (sub_count > 0) {
|
||||
nua_respond(nh, SIP_200_OK, NUTAG_WITH_THIS(nua), SIPTAG_ETAG_STR(etag), SIPTAG_EXPIRES_STR(expstr), TAG_END());
|
||||
} else {
|
||||
nua_respond(nh, SIP_404_NOT_FOUND, NUTAG_WITH_THIS(nua), TAG_END());
|
||||
}
|
||||
|
||||
switch_safe_free(contact_str);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user