mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-24 13:12:03 +00:00
Merge branch 'master' into smgmaster
Conflicts: src/switch_console.c
This commit is contained in:
+1
-1
@@ -840,9 +840,9 @@ static const char *basic_gets(int *cnt)
|
||||
}
|
||||
Sleep(20);
|
||||
}
|
||||
#endif
|
||||
|
||||
return command_buf;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ESL", "esl_lua.2010.vcxproj", "{86B6AB99-A261-455A-9CD6-9142A5A1652E}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Debug|x64 = Debug|x64
|
||||
Release|Win32 = Release|Win32
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Debug|x64.Build.0 = Debug|x64
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Release|Win32.Build.0 = Release|Win32
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Release|x64.ActiveCfg = Release|x64
|
||||
{86B6AB99-A261-455A-9CD6-9142A5A1652E}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,178 @@
|
||||
<?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>ESL</ProjectName>
|
||||
<ProjectGuid>{86B6AB99-A261-455A-9CD6-9142A5A1652E}</ProjectGuid>
|
||||
<RootNamespace>esl_lua.2010</RootNamespace>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
</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.40219.1</_ProjectFileVersion>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</LinkIncremental>
|
||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(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'">$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</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>$(ProjectDir)..\..\..\src\mod\languages\mod_lua\lua\;$(ProjectDir)..\src\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ESL_DECLARE_STATIC;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>esl.lib;lua51.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(ProjectDir)..\..\..\$(Platform)\$(Configuration)\;$(ProjectDir)..\..\..\libs\esl\src\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\src\mod\languages\mod_lua\lua\;$(ProjectDir)..\src\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ESL_DECLARE_STATIC;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>esl.lib;lua51.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(ProjectDir)..\..\..\$(Platform)\$(Configuration)\;$(ProjectDir)..\..\..\libs\esl\src\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<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>$(ProjectDir)..\..\..\src\mod\languages\mod_lua\lua\;$(ProjectDir)..\src\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ESL_DECLARE_STATIC;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>esl.lib;lua51.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(ProjectDir)..\..\..\$(Platform)\$(Configuration);$(ProjectDir)..\..\..\libs\esl\src\$(Platform)\$(Configuration);%(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>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)..\..\..\src\mod\languages\mod_lua\lua\;$(ProjectDir)..\src\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>ESL_DECLARE_STATIC;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>esl.lib;lua51.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(ProjectDir)..\..\..\$(Platform)\$(Configuration);$(ProjectDir)..\..\..\libs\esl\src\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\src\esl_oop.cpp" />
|
||||
<ClCompile Include="esl_wrap.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
|
||||
</Filter>
|
||||
<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>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\src\esl_oop.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="esl_wrap.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -73,13 +73,13 @@ sub setVar($;) {
|
||||
|
||||
sub playAndGetDigits($;) {
|
||||
my $self = shift;
|
||||
my ($min, $max, $tries, $to, $term, $file, $invalid_file, $var, $regex) = @_;
|
||||
my ($min, $max, $tries, $to, $term, $file, $invalid_file, $var, $regex, $digit_timeout) = @_;
|
||||
|
||||
if (!$self->{_esl}->connected()) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
$self->execute("play_and_get_digits", "$min $max $tries $to $term $file $invalid_file $var $regex");
|
||||
$self->execute("play_and_get_digits", "$min $max $tries $to $term $file $invalid_file $var $regex $digit_timeout");
|
||||
|
||||
return $self->getVar($var);
|
||||
|
||||
|
||||
+1
-1
@@ -323,7 +323,7 @@ static void default_logger(const char *file, const char *func, int line, int lev
|
||||
ret = esl_vasprintf(&data, fmt, ap);
|
||||
|
||||
if (ret != -1) {
|
||||
fprintf(stderr, "[%s] %s:%d %s() %s", LEVEL_NAMES[level], file, line, func, data);
|
||||
fprintf(stderr, "[%s] %s:%d %s() %s", LEVEL_NAMES[level], fp, line, func, data);
|
||||
free(data);
|
||||
}
|
||||
|
||||
|
||||
@@ -294,6 +294,19 @@ if test "${HAVE_SNG_SS7}" = "yes"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
##
|
||||
# zlib (required for Sangoma SS7 Transparent IAM)
|
||||
#
|
||||
HAVE_ZLIB="no"
|
||||
AC_MSG_RESULT([${as_nl}<<>> zlib])
|
||||
AC_CHECK_LIB([z], [compress], [HAVE_ZLIB="yes"])
|
||||
AC_MSG_RESULT([checking whether zlib is installed... ${HAVE_ZLIB}])
|
||||
AM_CONDITIONAL([HAVE_ZLIB], [test "{HAVE_ZLIB]" = "yes"])
|
||||
if test "${HAVE_ZLIB}" = "yes"; then
|
||||
CFLAGS="$CFLAGS -DHAVE_ZLIB"
|
||||
fi
|
||||
|
||||
##
|
||||
# libisdn
|
||||
#
|
||||
|
||||
@@ -87,7 +87,7 @@ static struct {
|
||||
analog_option_t analog_options;
|
||||
switch_hash_t *ss7_configs;
|
||||
int sip_headers;
|
||||
uint8_t crash_on_assert;
|
||||
int crash_on_assert;
|
||||
} globals;
|
||||
|
||||
/* private data attached to each fs session */
|
||||
@@ -130,6 +130,10 @@ struct span_config {
|
||||
int limit_calls;
|
||||
int limit_seconds;
|
||||
limit_reset_event_t limit_reset_event;
|
||||
/* digital codec and digital sampling rate are used to configure the codec
|
||||
* when bearer capability is set to unrestricted digital */
|
||||
const char *digital_codec;
|
||||
int digital_sampling_rate;
|
||||
chan_pvt_t pvts[FTDM_MAX_CHANNELS_SPAN];
|
||||
};
|
||||
|
||||
@@ -294,13 +298,11 @@ static void cycle_foreground(ftdm_channel_t *ftdmchan, int flash, const char *bc
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *session, ftdm_channel_t *ftdmchan)
|
||||
static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *session, ftdm_channel_t *ftdmchan, ftdm_caller_data_t *caller_data)
|
||||
{
|
||||
const char *dname = NULL;
|
||||
uint32_t interval = 0, srate = 8000;
|
||||
uint32_t span_id;
|
||||
ftdm_codec_t codec;
|
||||
|
||||
tech_pvt->ftdmchan = ftdmchan;
|
||||
@@ -321,6 +323,16 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
|
||||
return SWITCH_STATUS_GENERR;
|
||||
}
|
||||
|
||||
span_id = ftdm_channel_get_span_id(ftdmchan);
|
||||
if (caller_data->bearer_capability == FTDM_BEARER_CAP_UNRESTRICTED
|
||||
&& SPAN_CONFIG[span_id].digital_codec) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Initializing digital call with codec %s at %dhz.\n",
|
||||
SPAN_CONFIG[span_id].digital_codec, SPAN_CONFIG[span_id].digital_sampling_rate);
|
||||
dname = SPAN_CONFIG[span_id].digital_codec;
|
||||
srate = SPAN_CONFIG[span_id].digital_sampling_rate;
|
||||
goto init_codecs;
|
||||
}
|
||||
|
||||
if (FTDM_SUCCESS != ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_CODEC, &codec)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Failed to retrieve channel codec.\n");
|
||||
return SWITCH_STATUS_GENERR;
|
||||
@@ -349,6 +361,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
|
||||
}
|
||||
}
|
||||
|
||||
init_codecs:
|
||||
|
||||
if (switch_core_codec_init(&tech_pvt->read_codec,
|
||||
dname,
|
||||
@@ -720,7 +733,6 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
|
||||
ftdm_size_t len;
|
||||
unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE] = {0};
|
||||
ftdm_wait_flag_t wflags = FTDM_WRITE;
|
||||
ftdm_status_t status;
|
||||
|
||||
channel = switch_core_session_get_channel(session);
|
||||
assert(channel != NULL);
|
||||
@@ -755,7 +767,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
|
||||
|
||||
|
||||
wflags = FTDM_WRITE;
|
||||
status = ftdm_channel_wait(tech_pvt->ftdmchan, &wflags, ftdm_channel_get_io_interval(tech_pvt->ftdmchan) * 10);
|
||||
ftdm_channel_wait(tech_pvt->ftdmchan, &wflags, ftdm_channel_get_io_interval(tech_pvt->ftdmchan) * 10);
|
||||
|
||||
if (!(wflags & FTDM_WRITE)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Dropping frame! (write not ready)\n");
|
||||
@@ -1094,7 +1106,7 @@ static ftdm_status_t on_channel_found(ftdm_channel_t *fchan, ftdm_caller_data_t
|
||||
span_id = ftdm_channel_get_span_id(fchan);
|
||||
chan_id = ftdm_channel_get_id(fchan);
|
||||
|
||||
tech_init(hdata->tech_pvt, hdata->new_session, fchan);
|
||||
tech_init(hdata->tech_pvt, hdata->new_session, fchan, caller_data);
|
||||
|
||||
snprintf(name, sizeof(name), "FreeTDM/%u:%u/%s", span_id, chan_id, caller_data->dnis.digits);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Connect outbound channel %s\n", name);
|
||||
@@ -1367,7 +1379,15 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||
ftdm_usrmsg_add_var(&usrmsg, "ss7_pres_ind", sipvar);
|
||||
}
|
||||
|
||||
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-CPC");
|
||||
if (sipvar) {
|
||||
ftdm_set_calling_party_category(sipvar, (uint8_t *)&caller_data.cpc);
|
||||
}
|
||||
|
||||
sipvar = switch_channel_get_variable(channel, "sip_h_X-FreeTDM-IAM");
|
||||
if (sipvar) {
|
||||
ftdm_usrmsg_add_var(&usrmsg, "ss7_iam", sipvar);
|
||||
}
|
||||
}
|
||||
|
||||
if (switch_test_flag(outbound_profile, SWITCH_CPF_SCREEN)) {
|
||||
@@ -1440,7 +1460,13 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
|
||||
if (!strncasecmp(h->name, FREETDM_VAR_PREFIX, FREETDM_VAR_PREFIX_LEN)) {
|
||||
char *v = h->name + FREETDM_VAR_PREFIX_LEN;
|
||||
if (!zstr(v)) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding outbound freetdm variable %s=%s to channel %d:%d\n", v, h->value, span_id, chan_id);
|
||||
if (!strcasecmp(v, "ss7_iam")) {
|
||||
/* Do not print the value of ss7_iam as it is very long */
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding outbound freetdm variable %s to channel %d:%d\n", v, span_id, chan_id);
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Adding outbound freetdm variable %s=%s to channel %d:%d\n", v, h->value, span_id, chan_id);
|
||||
}
|
||||
|
||||
ftdm_usrmsg_add_var(&usrmsg, v, h->value);
|
||||
}
|
||||
}
|
||||
@@ -1543,7 +1569,7 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
||||
tech_pvt = (private_t *) switch_core_session_alloc(session, sizeof(private_t));
|
||||
assert(tech_pvt != NULL);
|
||||
channel = switch_core_session_get_channel(session);
|
||||
if (tech_init(tech_pvt, session, sigmsg->channel) != SWITCH_STATUS_SUCCESS) {
|
||||
if (tech_init(tech_pvt, session, sigmsg->channel, channel_caller_data) != SWITCH_STATUS_SUCCESS) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Initilization Error!\n");
|
||||
switch_core_session_destroy(&session);
|
||||
return FTDM_FAIL;
|
||||
@@ -1605,9 +1631,11 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
||||
switch_channel_set_variable_printf(channel, "freetdm_chan_number", "%d", chanid);
|
||||
switch_channel_set_variable_printf(channel, "freetdm_bearer_capability", "%d", channel_caller_data->bearer_capability);
|
||||
switch_channel_set_variable_printf(channel, "freetdm_bearer_layer1", "%d", channel_caller_data->bearer_layer1);
|
||||
switch_channel_set_variable_printf(channel, "freetdm_calling_party_category", ftdm_calling_party_category2str(channel_caller_data->cpc));
|
||||
switch_channel_set_variable_printf(channel, "screening_ind", ftdm_screening2str(channel_caller_data->screen));
|
||||
switch_channel_set_variable_printf(channel, "presentation_ind", ftdm_presentation2str(channel_caller_data->pres));
|
||||
|
||||
|
||||
if (globals.sip_headers) {
|
||||
switch_channel_set_variable(channel, "sip_h_X-FreeTDM-SpanName", ftdm_channel_get_span_name(sigmsg->channel));
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-SpanNumber", "%d", spanid);
|
||||
@@ -1628,6 +1656,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-RDNIS", "%s", channel_caller_data->rdnis.digits);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-NADI", "%d", channel_caller_data->rdnis.type);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-RDNIS-Plan", "%d", channel_caller_data->rdnis.plan);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-CPC", "%s", ftdm_calling_party_category2str(channel_caller_data->cpc));
|
||||
|
||||
|
||||
var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_rdnis_screen_ind");
|
||||
if (!ftdm_strlen_zero(var_value)) {
|
||||
@@ -1673,7 +1703,12 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-GN-NumInComp", "%d", var_value);
|
||||
}
|
||||
} /* End - var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_gn_digits"); */
|
||||
|
||||
|
||||
var_value = ftdm_sigmsg_get_var(sigmsg, "ss7_iam");
|
||||
if (!ftdm_strlen_zero(var_value)) {
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-IAM", "%s", var_value);
|
||||
}
|
||||
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Screen", "%d", channel_caller_data->screen);
|
||||
switch_channel_set_variable_printf(channel, "sip_h_X-FreeTDM-Presentation", "%d", channel_caller_data->pres);
|
||||
}
|
||||
@@ -1684,7 +1719,12 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
|
||||
ftdm_get_current_var(curr, &var_name, &var_value);
|
||||
snprintf(name, sizeof(name), FREETDM_VAR_PREFIX "%s", var_name);
|
||||
switch_channel_set_variable_printf(channel, name, "%s", var_value);
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s = %s\n", name, var_value);
|
||||
if (!strcasecmp(var_name, "ss7_iam")) {
|
||||
/* Do not print freetdm_ss7_iam as it is a very long variable */
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s is present\n", name);
|
||||
} else {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Call Variable: %s = %s\n", name, var_value);
|
||||
}
|
||||
}
|
||||
ftdm_iterator_free(iter);
|
||||
|
||||
@@ -2669,6 +2709,7 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans)
|
||||
/* some defaults first */
|
||||
SPAN_CONFIG[span_id].limit_backend = "hash";
|
||||
SPAN_CONFIG[span_id].limit_reset_event = FTDM_LIMIT_RESET_ON_TIMEOUT;
|
||||
SPAN_CONFIG[span_id].digital_sampling_rate = 8000;
|
||||
|
||||
for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
|
||||
char *var = (char *) switch_xml_attr_soft(param, "name");
|
||||
@@ -2683,6 +2724,21 @@ static void parse_bri_pri_spans(switch_xml_t cfg, switch_xml_t spans)
|
||||
context = val;
|
||||
} else if (!strcasecmp(var, "dialplan")) {
|
||||
dialplan = val;
|
||||
} else if (!strcasecmp(var, "unrestricted-digital-codec")) {
|
||||
//switch_core_strdup(pool, val);
|
||||
const switch_codec_implementation_t *codec = NULL;
|
||||
int num_codecs;
|
||||
num_codecs = switch_loadable_module_get_codecs_sorted(&codec, 1, &val, 1);
|
||||
if (num_codecs != 1 || !codec) {
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
|
||||
"Failed finding codec %s for unrestricted digital calls\n", val);
|
||||
} else {
|
||||
SPAN_CONFIG[span_id].digital_codec = switch_core_strdup(module_pool, codec->iananame);
|
||||
SPAN_CONFIG[span_id].digital_sampling_rate = codec->samples_per_second;
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG,
|
||||
"Unrestricted digital codec is %s at %dhz for span %d\n",
|
||||
SPAN_CONFIG[span_id].digital_codec, SPAN_CONFIG[span_id].digital_sampling_rate, span_id);
|
||||
}
|
||||
} else if (!strcasecmp(var, "call_limit_backend")) {
|
||||
SPAN_CONFIG[span_id].limit_backend = val;
|
||||
ftdm_log(FTDM_LOG_DEBUG, "Using limit backend %s for span %d\n", SPAN_CONFIG[span_id].limit_backend, span_id);
|
||||
@@ -3604,6 +3660,12 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
|
||||
"physical_span_id: %u\n"
|
||||
"physical_chan_id: %u\n"
|
||||
"physical_status: %s\n"
|
||||
"physical_status_red: %d\n"
|
||||
"physical_status_yellow: %d\n"
|
||||
"physical_status_rai: %d\n"
|
||||
"physical_status_blue: %d\n"
|
||||
"physical_status_ais: %d\n"
|
||||
"physical_status_general: %d\n"
|
||||
"signaling_status: %s\n"
|
||||
"type: %s\n"
|
||||
"state: %s\n"
|
||||
@@ -3624,7 +3686,13 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
|
||||
phspan_id,
|
||||
phchan_id,
|
||||
alarmflag ? "alarmed" : "ok",
|
||||
ftdm_signaling_status2str(sigstatus),
|
||||
(alarmflag & FTDM_ALARM_RED) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_YELLOW) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_RAI) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_BLUE) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_AIS) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_GENERAL) ? 1 : 0,
|
||||
ftdm_signaling_status2str(sigstatus),
|
||||
chan_type,
|
||||
state,
|
||||
last_state,
|
||||
@@ -3680,6 +3748,12 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
|
||||
" <physical-span-id>%u</physical-span-id>\n"
|
||||
" <physical-chan-id>%u</physical-chan-id>\n"
|
||||
" <physical-status>%s</physical-status>\n"
|
||||
" <physical-status-red>%d</physical-status-red>\n"
|
||||
" <physical-status-yellow>%d</physical-status-yellow>\n"
|
||||
" <physical-status-rai>%d</physical-status-rai>\n"
|
||||
" <physical-status-blue>%d</physical-status-blue>\n"
|
||||
" <physical-status-ais>%d</physical-status-ais>\n"
|
||||
" <physical-status-general>%d</physical-status-general>\n"
|
||||
" <signaling-status>%s</signaling-status>\n"
|
||||
" <type>%s</type>\n"
|
||||
" <state>%s</state>\n"
|
||||
@@ -3700,7 +3774,13 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
|
||||
phspan_id,
|
||||
phchan_id,
|
||||
alarmflag ? "alarmed" : "ok",
|
||||
ftdm_signaling_status2str(sigstatus),
|
||||
(alarmflag & FTDM_ALARM_RED) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_YELLOW) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_RAI) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_BLUE) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_AIS) ? 1 : 0,
|
||||
(alarmflag & FTDM_ALARM_GENERAL) ? 1 : 0,
|
||||
ftdm_signaling_status2str(sigstatus),
|
||||
chan_type,
|
||||
state,
|
||||
last_state,
|
||||
|
||||
@@ -42,6 +42,74 @@
|
||||
#include <ctype.h>
|
||||
|
||||
|
||||
|
||||
|
||||
FT_DECLARE(char *) ftdm_url_encode(const char *url, char *buf, ftdm_size_t len)
|
||||
{
|
||||
/* This implementation of url_encode is slightly different compared to the
|
||||
* Freeswitch one. This is because this implementation accepts the full
|
||||
* range of values (0x00 - 0xFF) compared to the Freeswitch implementation
|
||||
* that does not accept 0x00 */
|
||||
|
||||
const char *p;
|
||||
size_t x = 0,y = 0;
|
||||
const char urlunsafe[] = "\r\n \"#%&+:;<=>?@[\\]^`{|}";
|
||||
const char hex[] = "0123456789ABCDEF";
|
||||
|
||||
if (!buf) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!url) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
len--;
|
||||
|
||||
for (p = url; y <= len; p++) {
|
||||
if (*p < ' ' || *p > '~' || strchr(urlunsafe, *p)) {
|
||||
buf[x++] = '%';
|
||||
buf[x++] = hex[(*p >> 4) & 0x0f];
|
||||
buf[x++] = hex[*p & 0x0f];
|
||||
} else {
|
||||
buf[x++] = *p;
|
||||
}
|
||||
y++;
|
||||
}
|
||||
buf[x] = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
FT_DECLARE(char *) ftdm_url_decode(char *s, ftdm_size_t *len)
|
||||
{
|
||||
/* This implementation of url_decode is slightly different compared to the
|
||||
* Freeswitch one. This is because this implementation accepts the full
|
||||
* range of values (0x00 - 0xFF) compared to the Freeswitch implementation
|
||||
* that does not accept 0x00 */
|
||||
|
||||
char *o;
|
||||
unsigned int tmp;
|
||||
ftdm_size_t mylen = 0;
|
||||
|
||||
if (ftdm_strlen_zero(s)) {
|
||||
return s;
|
||||
}
|
||||
|
||||
for (o = s; *s; s++, o++) {
|
||||
if (*s == '%' && strlen(s) > 2 && sscanf(s + 1, "%2x", &tmp) == 1) {
|
||||
*o = (char) tmp;
|
||||
s += 2;
|
||||
} else {
|
||||
*o = *s;
|
||||
}
|
||||
mylen++;
|
||||
}
|
||||
*o = '\0';
|
||||
*len = mylen;
|
||||
return s;
|
||||
}
|
||||
|
||||
FT_DECLARE(ftdm_status_t) ftdm_set_npi(const char *string, uint8_t *target)
|
||||
{
|
||||
uint8_t val;
|
||||
|
||||
+25
-28
@@ -310,21 +310,6 @@ FTDM_STR2ENUM(ftdm_str2channel_indication, ftdm_channel_indication2str, ftdm_cha
|
||||
|
||||
static ftdm_status_t ftdm_group_add_channels(ftdm_span_t* span, int currindex, const char* name);
|
||||
|
||||
static const char *cut_path(const char *in)
|
||||
{
|
||||
const char *p, *ret = in;
|
||||
char delims[] = "/\\";
|
||||
char *i;
|
||||
|
||||
for (i = delims; *i; i++) {
|
||||
p = in;
|
||||
while ((p = strchr(p, *i)) != 0) {
|
||||
ret = ++p;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void null_logger(const char *file, const char *func, int line, int level, const char *fmt, ...)
|
||||
{
|
||||
if (file && func && line && level && fmt) {
|
||||
@@ -350,7 +335,6 @@ static int ftdm_log_level = FTDM_LOG_LEVEL_DEBUG;
|
||||
|
||||
static void default_logger(const char *file, const char *func, int line, int level, const char *fmt, ...)
|
||||
{
|
||||
const char *fp;
|
||||
char data[1024];
|
||||
va_list ap;
|
||||
|
||||
@@ -360,14 +344,11 @@ static void default_logger(const char *file, const char *func, int line, int lev
|
||||
if (level > ftdm_log_level) {
|
||||
return;
|
||||
}
|
||||
|
||||
fp = cut_path(file);
|
||||
|
||||
va_start(ap, fmt);
|
||||
|
||||
vsnprintf(data, sizeof(data), fmt, ap);
|
||||
|
||||
|
||||
fprintf(stderr, "[%s] %s:%d %s() %s", FTDM_LEVEL_NAMES[level], file, line, func, data);
|
||||
|
||||
va_end(ap);
|
||||
@@ -411,13 +392,13 @@ FT_DECLARE(void) ftdm_set_echocancel_call_begin(ftdm_channel_t *chan)
|
||||
if (ftdm_channel_test_feature(chan, FTDM_CHANNEL_FEATURE_HWEC)) {
|
||||
if (ftdm_channel_test_feature(chan, FTDM_CHANNEL_FEATURE_HWEC_DISABLED_ON_IDLE)) {
|
||||
/* If the ec is disabled on idle, we need to enable it unless is a digital call */
|
||||
if (caller_data->bearer_capability != FTDM_BEARER_CAP_64K_UNRESTRICTED) {
|
||||
if (caller_data->bearer_capability != FTDM_BEARER_CAP_UNRESTRICTED) {
|
||||
ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Enabling ec for call in channel state %s\n", ftdm_channel_state2str(chan->state));
|
||||
ftdm_channel_command(chan, FTDM_COMMAND_ENABLE_ECHOCANCEL, NULL);
|
||||
}
|
||||
} else {
|
||||
/* If the ec is enabled on idle, we do nothing unless is a digital call that needs it disabled */
|
||||
if (caller_data->bearer_capability == FTDM_BEARER_CAP_64K_UNRESTRICTED) {
|
||||
if (caller_data->bearer_capability == FTDM_BEARER_CAP_UNRESTRICTED) {
|
||||
ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Disabling ec for digital call in channel state %s\n", ftdm_channel_state2str(chan->state));
|
||||
ftdm_channel_command(chan, FTDM_COMMAND_DISABLE_ECHOCANCEL, NULL);
|
||||
}
|
||||
@@ -508,13 +489,16 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_caller_data(ftdm_channel_t *ftdmchan,
|
||||
{
|
||||
ftdm_status_t err = FTDM_SUCCESS;
|
||||
if (!ftdmchan) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "Error: trying to set caller data, but no ftdmchan!\n");
|
||||
ftdm_log(FTDM_LOG_CRIT, "trying to set caller data, but no ftdmchan!\n");
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
if ((err = ftdm_set_caller_data(ftdmchan->span, caller_data)) != FTDM_SUCCESS) {
|
||||
return err;
|
||||
}
|
||||
ftdmchan->caller_data = *caller_data;
|
||||
if (ftdmchan->caller_data.bearer_capability == FTDM_BEARER_CAP_UNRESTRICTED) {
|
||||
ftdm_set_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA);
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -2628,6 +2612,7 @@ static ftdm_status_t ftdm_channel_done(ftdm_channel_t *ftdmchan)
|
||||
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_MEDIA);
|
||||
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_ANSWERED);
|
||||
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_USER_HANGUP);
|
||||
ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA);
|
||||
ftdm_mutex_lock(ftdmchan->pre_buffer_mutex);
|
||||
ftdm_buffer_destroy(&ftdmchan->pre_buffer);
|
||||
ftdmchan->pre_buffer_size = 0;
|
||||
@@ -3566,7 +3551,7 @@ static FIO_READ_FUNCTION(ftdm_raw_read)
|
||||
|
||||
if (status == FTDM_SUCCESS && ftdm_test_flag(ftdmchan, FTDM_CHANNEL_USE_RX_GAIN)
|
||||
&& (ftdmchan->native_codec == FTDM_CODEC_ALAW || ftdmchan->native_codec == FTDM_CODEC_ULAW)) {
|
||||
int i = 0;
|
||||
ftdm_size_t i = 0;
|
||||
unsigned char *rdata = data;
|
||||
for (i = 0; i < *datalen; i++) {
|
||||
rdata[i] = ftdmchan->rxgain_table[rdata[i]];
|
||||
@@ -3780,6 +3765,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
||||
|
||||
handle_tone_generation(ftdmchan);
|
||||
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA)) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
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) {
|
||||
codec_func = fio_ulaw2slin;
|
||||
@@ -3934,7 +3923,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
||||
ftdm_mutex_unlock(ftdmchan->pre_buffer_mutex);
|
||||
|
||||
|
||||
memset(data, 255, *datalen);
|
||||
memset(data, FTDM_SILENCE_VALUE(ftdmchan), *datalen);
|
||||
|
||||
if (ftdmchan->skip_read_frames > 0) {
|
||||
ftdmchan->skip_read_frames--;
|
||||
@@ -3946,7 +3935,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read(ftdm_channel_t *ftdmchan, void *data
|
||||
if (ftdm_buffer_inuse(ftdmchan->pre_buffer) >= ftdmchan->pre_buffer_size) {
|
||||
ftdm_buffer_read(ftdmchan->pre_buffer, data, *datalen);
|
||||
} else {
|
||||
memset(data, 255, *datalen);
|
||||
memset(data, FTDM_SILENCE_VALUE(ftdmchan), *datalen);
|
||||
}
|
||||
}
|
||||
ftdm_mutex_unlock(ftdmchan->pre_buffer_mutex);
|
||||
@@ -3994,6 +3983,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
|
||||
status = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_DIGITAL_MEDIA)) {
|
||||
goto do_write;
|
||||
}
|
||||
|
||||
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) {
|
||||
@@ -4025,6 +4018,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
|
||||
}
|
||||
}
|
||||
|
||||
do_write:
|
||||
|
||||
if (ftdmchan->span->sig_write) {
|
||||
status = ftdmchan->span->sig_write(ftdmchan, data, *datalen);
|
||||
if (status == FTDM_BREAK) {
|
||||
@@ -5374,10 +5369,12 @@ 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);
|
||||
/* 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?
|
||||
* */
|
||||
* doing it during SIGEVENT_START, but now that flags are private they can't, wonder if
|
||||
* is needed at all? */
|
||||
ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_HOLD);
|
||||
if (sigmsg->channel->caller_data.bearer_capability == FTDM_BEARER_CAP_UNRESTRICTED) {
|
||||
ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_DIGITAL_MEDIA);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -426,7 +426,6 @@ static void *ftdm_analog_channel_run(ftdm_thread_t *me, void *obj)
|
||||
uint32_t state_counter = 0, elapsed = 0, collecting = 0, interval = 0, last_digit = 0, indicate = 0, dial_timeout = analog_data->wait_dialtone_timeout;
|
||||
uint32_t answer_on_polarity_counter = 0;
|
||||
ftdm_sigmsg_t sig;
|
||||
ftdm_status_t status;
|
||||
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "ANALOG CHANNEL thread starting.\n");
|
||||
|
||||
@@ -916,7 +915,7 @@ static void *ftdm_analog_channel_run(ftdm_thread_t *me, void *obj)
|
||||
}
|
||||
|
||||
if (codec_func) {
|
||||
status = codec_func(frame, sizeof(frame), &rlen);
|
||||
codec_func(frame, sizeof(frame), &rlen);
|
||||
} else {
|
||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "codec error!");
|
||||
goto done;
|
||||
|
||||
@@ -221,7 +221,6 @@ static void *ftdm_analog_em_channel_run(ftdm_thread_t *me, void *obj)
|
||||
ftdm_channel_t *closed_chan;
|
||||
uint32_t state_counter = 0, elapsed = 0, collecting = 0, interval = 0, last_digit = 0, indicate = 0, dial_timeout = 30000;
|
||||
ftdm_sigmsg_t sig;
|
||||
ftdm_status_t status;
|
||||
|
||||
ftdm_log(FTDM_LOG_DEBUG, "ANALOG EM CHANNEL thread starting.\n");
|
||||
|
||||
@@ -545,7 +544,7 @@ static void *ftdm_analog_em_channel_run(ftdm_thread_t *me, void *obj)
|
||||
}
|
||||
|
||||
if (codec_func) {
|
||||
status = codec_func(frame, sizeof(frame), &rlen);
|
||||
codec_func(frame, sizeof(frame), &rlen);
|
||||
} else {
|
||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "codec error!");
|
||||
goto done;
|
||||
|
||||
@@ -979,7 +979,6 @@ static L3INT ftdm_isdn_931_34(void *pvt, struct Q931_Call *call, Q931mes_Generic
|
||||
{
|
||||
Q931ie_CallingNum *callingnum = Q931GetIEPtr(gen->CallingNum, gen->buf);
|
||||
Q931ie_CalledNum *callednum = Q931GetIEPtr(gen->CalledNum, gen->buf);
|
||||
uint32_t cplen = mlen;
|
||||
int overlap_dial = 0;
|
||||
int fail_cause = 0;
|
||||
int fail = 1;
|
||||
@@ -2128,7 +2127,7 @@ static int ftdm_isdn_q921_log(void *pvt, Q921LogLevel_t level, char *msg, L2INT
|
||||
return 0;
|
||||
}
|
||||
|
||||
static L3INT ftdm_isdn_q931_log(void *pvt, Q931LogLevel_t level, char *msg, L3INT size)
|
||||
static L3INT ftdm_isdn_q931_log(void *pvt, Q931LogLevel_t level, const char *msg, L3INT size)
|
||||
{
|
||||
ftdm_span_t *span = (ftdm_span_t *) pvt;
|
||||
|
||||
|
||||
@@ -562,14 +562,18 @@ static ftdm_status_t state_advance(ftdm_channel_t *chan)
|
||||
sig.chan_id = ftdm_channel_get_id(chan);
|
||||
sig.span_id = ftdm_channel_get_span_id(chan);
|
||||
sig.channel = chan;
|
||||
|
||||
|
||||
ftdm_channel_complete_state(chan);
|
||||
|
||||
switch (ftdm_channel_get_state(chan)) {
|
||||
case FTDM_CHANNEL_STATE_DOWN:
|
||||
{
|
||||
ftdm_channel_t *chtmp = chan;
|
||||
chan->call_data = NULL;
|
||||
|
||||
if (call) {
|
||||
pri_destroycall(isdn_data->spri.pri, call);
|
||||
chan->call_data = NULL;
|
||||
}
|
||||
|
||||
if (ftdm_channel_close(&chtmp) != FTDM_SUCCESS) {
|
||||
ftdm_log(FTDM_LOG_WARNING, "-- Failed to close channel %d:%d\n",
|
||||
@@ -776,8 +780,7 @@ static ftdm_status_t state_advance(ftdm_channel_t *chan)
|
||||
|
||||
pri_hangup(isdn_data->spri.pri, call, caller_data->hangup_cause);
|
||||
// pri_destroycall(isdn_data->spri.pri, call);
|
||||
|
||||
chan->call_data = NULL;
|
||||
// chan->call_data = NULL;
|
||||
}
|
||||
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
||||
}
|
||||
@@ -785,10 +788,10 @@ static ftdm_status_t state_advance(ftdm_channel_t *chan)
|
||||
|
||||
case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
|
||||
{
|
||||
if (call) {
|
||||
pri_destroycall(isdn_data->spri.pri, call);
|
||||
chan->call_data = NULL;
|
||||
}
|
||||
// if (call) {
|
||||
// pri_destroycall(isdn_data->spri.pri, call);
|
||||
// chan->call_data = NULL;
|
||||
// }
|
||||
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_DOWN);
|
||||
}
|
||||
break;
|
||||
@@ -854,7 +857,6 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even
|
||||
{
|
||||
ftdm_span_t *span = spri->span;
|
||||
ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->hangup.channel);
|
||||
q931_call *call = NULL;
|
||||
|
||||
if (!chan) {
|
||||
ftdm_log(FTDM_LOG_CRIT, "-- Hangup on channel %d:%d %s but it's not in use?\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
|
||||
@@ -863,27 +865,61 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even
|
||||
|
||||
ftdm_channel_lock(chan);
|
||||
|
||||
if (ftdm_channel_get_state(chan) >= FTDM_CHANNEL_STATE_TERMINATING) {
|
||||
ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s\n", ftdm_channel_get_state_str(chan));
|
||||
goto done;
|
||||
switch (event_type) {
|
||||
case LPWRAP_PRI_EVENT_HANGUP_REQ: /* DISCONNECT */
|
||||
if (ftdm_channel_get_state(chan) >= FTDM_CHANNEL_STATE_TERMINATING) {
|
||||
ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s\n",
|
||||
ftdm_channel_get_state_str(chan));
|
||||
goto done;
|
||||
}
|
||||
ftdm_log(FTDM_LOG_DEBUG, "-- Hangup REQ on channel %d:%d\n",
|
||||
ftdm_span_get_id(spri->span), pevent->hangup.channel);
|
||||
|
||||
pri_hangup(spri->pri, pevent->hangup.call, pevent->hangup.cause);
|
||||
|
||||
chan->caller_data.hangup_cause = pevent->hangup.cause;
|
||||
ftdm_set_state(chan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
break;
|
||||
|
||||
case LPWRAP_PRI_EVENT_HANGUP_ACK: /* */
|
||||
ftdm_log(FTDM_LOG_DEBUG, "-- Hangup ACK on channel %d:%d\n",
|
||||
ftdm_span_get_id(spri->span), pevent->hangup.channel);
|
||||
|
||||
pri_hangup(spri->pri, pevent->hangup.call, pevent->hangup.cause);
|
||||
|
||||
ftdm_set_state(chan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
||||
break;
|
||||
|
||||
case LPWRAP_PRI_EVENT_HANGUP: /* "RELEASE/RELEASE_COMPLETE/other" */
|
||||
ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n",
|
||||
ftdm_span_get_id(spri->span), pevent->hangup.channel);
|
||||
|
||||
switch (ftdm_channel_get_state(chan)) {
|
||||
case FTDM_CHANNEL_STATE_DIALING:
|
||||
case FTDM_CHANNEL_STATE_RINGING:
|
||||
case FTDM_CHANNEL_STATE_PROGRESS:
|
||||
case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
|
||||
case FTDM_CHANNEL_STATE_PROCEED:
|
||||
case FTDM_CHANNEL_STATE_UP:
|
||||
chan->caller_data.hangup_cause = pevent->hangup.cause;
|
||||
ftdm_set_state(chan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
break;
|
||||
case FTDM_CHANNEL_STATE_HANGUP:
|
||||
chan->caller_data.hangup_cause = pevent->hangup.cause;
|
||||
ftdm_set_state(chan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
|
||||
break;
|
||||
// case FTDM_CHANNEL_STATE_TERMINATING:
|
||||
// ftdm_set_state(chan, FTDM_CHANNEL_STATE_HANGUP);
|
||||
// break;
|
||||
// case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
|
||||
// ftdm_set_state(chan, FTDM_CHANNEL_STATE_DOWN);
|
||||
// break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!chan->call_data) {
|
||||
ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s with no call data\n", ftdm_channel_get_state_str(chan));
|
||||
goto done;
|
||||
}
|
||||
|
||||
call = (q931_call *)chan->call_data;
|
||||
|
||||
ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
|
||||
|
||||
pri_release(spri->pri, call, 0);
|
||||
pri_destroycall(spri->pri, call);
|
||||
|
||||
chan->caller_data.hangup_cause = pevent->hangup.cause;
|
||||
chan->call_data = NULL;
|
||||
ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_TERMINATING);
|
||||
|
||||
done:
|
||||
ftdm_channel_unlock(chan);
|
||||
return 0;
|
||||
@@ -1654,6 +1690,7 @@ static void *ftdm_libpri_run(ftdm_thread_t *me, void *obj)
|
||||
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_DCHAN_UP, on_dchan_up);
|
||||
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_DCHAN_DOWN, on_dchan_down);
|
||||
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_HANGUP_REQ, on_hangup);
|
||||
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_HANGUP_ACK, on_hangup);
|
||||
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_HANGUP, on_hangup);
|
||||
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_INFO_RECEIVED, on_info);
|
||||
LPWRAP_MAP_PRI_EVENT(isdn_data->spri, LPWRAP_PRI_EVENT_RESTART, on_restart);
|
||||
@@ -1928,6 +1965,10 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_libpri_configure_span)
|
||||
assert(isdn_data != NULL);
|
||||
memset(isdn_data, 0, sizeof(*isdn_data));
|
||||
|
||||
/* set some default values */
|
||||
isdn_data->mode = PRI_CPE;
|
||||
isdn_data->ton = PRI_UNKNOWN;
|
||||
|
||||
switch (ftdm_span_get_trunk_type(span)) {
|
||||
case FTDM_TRUNK_BRI:
|
||||
case FTDM_TRUNK_BRI_PTMP:
|
||||
@@ -1938,12 +1979,14 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_libpri_configure_span)
|
||||
#endif
|
||||
case FTDM_TRUNK_E1:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ALAW since this is an E1/BRI/BRI PTMP trunk\n");
|
||||
isdn_data->layer1 = PRI_LAYER_1_ALAW;
|
||||
isdn_data->layer1 = PRI_LAYER_1_ALAW;
|
||||
isdn_data->dialect = PRI_SWITCH_EUROISDN_E1;
|
||||
break;
|
||||
case FTDM_TRUNK_T1:
|
||||
case FTDM_TRUNK_J1:
|
||||
ftdm_log(FTDM_LOG_NOTICE, "Setting default Layer 1 to ULAW since this is a T1/J1 trunk\n");
|
||||
isdn_data->layer1 = PRI_LAYER_1_ULAW;
|
||||
isdn_data->layer1 = PRI_LAYER_1_ULAW;
|
||||
isdn_data->dialect = PRI_SWITCH_LUCENT5E;
|
||||
break;
|
||||
default:
|
||||
ftdm_log(FTDM_LOG_ERROR, "Invalid trunk type: '%s'\n", ftdm_span_get_trunk_type_str(span));
|
||||
|
||||
@@ -1199,9 +1199,17 @@ static FIO_SIG_UNLOAD_FUNCTION(ftdm_sangoma_isdn_unload)
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
#define SANGOMA_ISDN_API_USAGE_TRACE "ftdm sangoma_isdn trace <q921|q931> <span name>\n"
|
||||
#define SANGOMA_ISDN_API_USAGE_SHOW_L1_STATS "ftdm sangoma_isdn l1_stats <span name>\n"
|
||||
#define SANGOMA_ISDN_API_USAGE_SHOW_SPANS "ftdm sangoma_isdn show_spans [<span name>]\n"
|
||||
|
||||
#define SANGOMA_ISDN_API_USAGE "\t"SANGOMA_ISDN_API_USAGE_TRACE \
|
||||
"\t"SANGOMA_ISDN_API_USAGE_SHOW_L1_STATS \
|
||||
"\t"SANGOMA_ISDN_API_USAGE_SHOW_SPANS
|
||||
|
||||
static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
|
||||
{
|
||||
ftdm_status_t status = FTDM_SUCCESS;
|
||||
ftdm_status_t status = FTDM_EINVAL;
|
||||
char *mycmd = NULL, *argv[10] = { 0 };
|
||||
int argc = 0;
|
||||
|
||||
@@ -1223,7 +1231,7 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
|
||||
ftdm_span_t *span;
|
||||
|
||||
if (argc < 3) {
|
||||
ftdm_log(FTDM_LOG_ERROR, "Usage: ftdm sangoma_isdn trace <q921|q931> <span name>\n");
|
||||
ftdm_log(FTDM_LOG_ERROR, "Usage: %s\n", SANGOMA_ISDN_API_USAGE_TRACE);
|
||||
status = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
@@ -1232,34 +1240,40 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
|
||||
status = ftdm_span_find_by_name(argv[2], &span);
|
||||
if (FTDM_SUCCESS != status) {
|
||||
stream->write_function(stream, "-ERR failed to find span by name %s\n", argv[2]);
|
||||
|
||||
status = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!strcasecmp(trace_opt, "q921")) {
|
||||
sngisdn_activate_trace(span, SNGISDN_TRACE_Q921);
|
||||
status = sngisdn_activate_trace(span, SNGISDN_TRACE_Q921);
|
||||
} else if (!strcasecmp(trace_opt, "q931")) {
|
||||
sngisdn_activate_trace(span, SNGISDN_TRACE_Q931);
|
||||
status = sngisdn_activate_trace(span, SNGISDN_TRACE_Q931);
|
||||
} else if (!strcasecmp(trace_opt, "disable")) {
|
||||
sngisdn_activate_trace(span, SNGISDN_TRACE_DISABLE);
|
||||
status = sngisdn_activate_trace(span, SNGISDN_TRACE_DISABLE);
|
||||
} else {
|
||||
stream->write_function(stream, "-ERR invalid trace option <q921|q931> <span name>\n");
|
||||
status = FTDM_FAIL;
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!strcasecmp(argv[0], "l1_stats")) {
|
||||
ftdm_span_t *span;
|
||||
if (argc < 2) {
|
||||
stream->write_function(stream, "Usage: ftdm sangoma_isdn l1_stats <span name>\n");
|
||||
stream->write_function(stream, "Usage: %s\n", SANGOMA_ISDN_API_USAGE_SHOW_L1_STATS);
|
||||
status = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
status = ftdm_span_find_by_name(argv[1], &span);
|
||||
if (FTDM_SUCCESS != status) {
|
||||
stream->write_function(stream, "-ERR failed to find span with name %s\n", argv[1]);
|
||||
/* Return SUCCESS because we do not want to print the general FTDM usage list */
|
||||
status = FTDM_SUCCESS;
|
||||
|
||||
status = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
sngisdn_print_phy_stats(stream, span);
|
||||
status = sngisdn_show_l1_stats(stream, span);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!strcasecmp(argv[0], "show_spans")) {
|
||||
@@ -1268,20 +1282,39 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
|
||||
status = ftdm_span_find_by_name(argv[1], &span);
|
||||
if (FTDM_SUCCESS != status) {
|
||||
stream->write_function(stream, "-ERR failed to find span with name %s\n", argv[1]);
|
||||
/* Return SUCCESS because we do not want to print the general FTDM usage list */
|
||||
status = FTDM_SUCCESS;
|
||||
|
||||
stream->write_function(stream, "Usage: %s\n", SANGOMA_ISDN_API_USAGE_SHOW_SPANS);
|
||||
status = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
sngisdn_print_span(stream, span);
|
||||
status = FTDM_SUCCESS;
|
||||
status = sngisdn_show_span(stream, span);
|
||||
goto done;
|
||||
}
|
||||
sngisdn_print_spans(stream);
|
||||
status = sngisdn_show_spans(stream);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!strcasecmp(argv[0], "check_ids")) {
|
||||
sngisdn_check_free_ids();
|
||||
status = sngisdn_check_free_ids();
|
||||
goto done;
|
||||
}
|
||||
done:
|
||||
switch (status) {
|
||||
case FTDM_SUCCESS:
|
||||
stream->write_function(stream, "Command executed OK\n");
|
||||
break;
|
||||
case FTDM_EINVAL:
|
||||
stream->write_function(stream, "Invalid arguments [%s]\n", mycmd);
|
||||
stream->write_function(stream, "Usage:\n%s\n", SANGOMA_ISDN_API_USAGE);
|
||||
break;
|
||||
default:
|
||||
/* FTDM_FAIL - Do nothing since we already printed the cause of the error */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Return SUCCESS because we do not want to print the general FTDM usage list */
|
||||
status = FTDM_SUCCESS;
|
||||
|
||||
ftdm_safe_free(mycmd);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -292,6 +292,12 @@ typedef struct ftdm_sngisdn_data {
|
||||
sngisdn_span_data_t *spans[MAX_L1_LINKS+1]; /* spans are indexed by link_id */
|
||||
}ftdm_sngisdn_data_t;
|
||||
|
||||
typedef struct ftdm2trillium
|
||||
{
|
||||
uint8_t ftdm_val;
|
||||
uint8_t trillium_val;
|
||||
}ftdm2trillium_t;
|
||||
|
||||
|
||||
/* TODO implement these 2 functions */
|
||||
#define ISDN_FUNC_TRACE_ENTER(a)
|
||||
@@ -471,9 +477,9 @@ ftdm_status_t sngisdn_stack_start(ftdm_span_t *span);
|
||||
ftdm_status_t sngisdn_stack_stop(ftdm_span_t *span);
|
||||
ftdm_status_t sngisdn_wake_up_phy(ftdm_span_t *span);
|
||||
|
||||
void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span);
|
||||
void sngisdn_print_spans(ftdm_stream_handle_t *stream);
|
||||
void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span);
|
||||
ftdm_status_t sngisdn_show_l1_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span);
|
||||
ftdm_status_t sngisdn_show_spans(ftdm_stream_handle_t *stream);
|
||||
ftdm_status_t sngisdn_show_span(ftdm_stream_handle_t *stream, ftdm_span_t *span);
|
||||
|
||||
#endif /* __FTMOD_SNG_ISDN_H__ */
|
||||
|
||||
|
||||
@@ -745,8 +745,16 @@ ftdm_status_t sngisdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
|
||||
/* TODO: Fill in these timers with proper values - eventually pass them */
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t301.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t301.val = 180;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.val = 15;
|
||||
|
||||
/* It looks like ETSI is the only variant that supports Overlap */
|
||||
if (signal_data->switchtype == SNGISDN_SWITCH_EUROISDN) {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.val = 15;
|
||||
} else {
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.enb = FALSE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t302.val = 0;
|
||||
}
|
||||
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t303.enb = TRUE;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t303.val = 4;
|
||||
cfg.t.cfg.s.inDLSAP.tmr.t304.enb = TRUE;
|
||||
|
||||
@@ -831,7 +831,7 @@ void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event)
|
||||
if (sng_isdn_retrieve_facility_caller_name(&facEvnt->facElmt.facStr.val[2], facEvnt->facElmt.facStr.len, retrieved_str) == 0) {
|
||||
strcpy(ftdmchan->caller_data.cid_name, retrieved_str);
|
||||
} else {
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_WARNING, "Failed to retrieve Caller Name from Facility IE\n");
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Failed to retrieve Caller Name from Facility IE\n");
|
||||
}
|
||||
if (signal_data->facility_timeout) {
|
||||
/* Cancel facility timeout */
|
||||
|
||||
@@ -779,7 +779,6 @@ void sngisdn_rcv_cc_ind(CcMngmt *status)
|
||||
void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf)
|
||||
{
|
||||
MsgLen mlen;
|
||||
MsgLen i;
|
||||
int16_t j;
|
||||
Buffer *tmp;
|
||||
Data *cptr;
|
||||
@@ -802,7 +801,6 @@ void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf)
|
||||
tmp = mBuf->b_cont;
|
||||
cptr = tmp->b_rptr;
|
||||
data = *cptr++;
|
||||
i = 0;
|
||||
|
||||
for(j=0;j<mlen;j++) {
|
||||
tdata[j]= data;
|
||||
|
||||
@@ -43,11 +43,55 @@ SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_descr, ftdm_sngisdn_progind_descr
|
||||
SNGISDN_ENUM_NAMES(SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_STRINGS)
|
||||
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str, ftdm_sngisdn_progind_loc_t, SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_INVALID)
|
||||
|
||||
ftdm_status_t sngisdn_check_free_ids(void);
|
||||
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val);
|
||||
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val);
|
||||
|
||||
extern ftdm_sngisdn_data_t g_sngisdn_data;
|
||||
void get_memory_info(void);
|
||||
|
||||
ftdm2trillium_t npi_codes[] = {
|
||||
{FTDM_NPI_UNKNOWN, IN_NP_UNK},
|
||||
{FTDM_NPI_ISDN, IN_NP_ISDN},
|
||||
{FTDM_NPI_DATA, IN_NP_DATA},
|
||||
{FTDM_NPI_TELEX, IN_NP_TELEX},
|
||||
{FTDM_NPI_NATIONAL, IN_NP_NATIONAL},
|
||||
{FTDM_NPI_PRIVATE, IN_NP_PRIVATE},
|
||||
{FTDM_NPI_RESERVED, IN_NP_EXT},
|
||||
};
|
||||
|
||||
ftdm2trillium_t ton_codes[] = {
|
||||
{FTDM_TON_UNKNOWN, IN_TON_UNK},
|
||||
{FTDM_TON_INTERNATIONAL, IN_TON_INT},
|
||||
{FTDM_TON_NATIONAL, IN_TON_NAT},
|
||||
{FTDM_TON_NETWORK_SPECIFIC, IN_TON_NETSPEC},
|
||||
{FTDM_TON_SUBSCRIBER_NUMBER, IN_TON_SUB},
|
||||
{FTDM_TON_ABBREVIATED_NUMBER, IN_TON_ABB},
|
||||
{FTDM_TON_RESERVED, IN_TON_EXT},
|
||||
};
|
||||
|
||||
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val)
|
||||
{
|
||||
ftdm2trillium_t *val = vals;
|
||||
while(val++) {
|
||||
if (val->ftdm_val == ftdm_val) {
|
||||
return val->trillium_val;
|
||||
}
|
||||
}
|
||||
return default_val;
|
||||
}
|
||||
|
||||
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val)
|
||||
{
|
||||
ftdm2trillium_t *val = vals;
|
||||
while(val++) {
|
||||
if (val->trillium_val == trillium_val) {
|
||||
return val->ftdm_val;
|
||||
}
|
||||
}
|
||||
return default_val;
|
||||
}
|
||||
|
||||
|
||||
void clear_call_data(sngisdn_chan_data_t *sngisdn_info)
|
||||
{
|
||||
uint32_t cc_id = ((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->cc_id;
|
||||
@@ -259,11 +303,11 @@ ftdm_status_t get_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb)
|
||||
}
|
||||
|
||||
if (cdPtyNmb->nmbPlanId.pres == PRSNT_NODEF) {
|
||||
caller_data->dnis.plan = cdPtyNmb->nmbPlanId.val;
|
||||
caller_data->dnis.plan = get_ftdm_val(npi_codes, cdPtyNmb->nmbPlanId.val, IN_NP_UNK);
|
||||
}
|
||||
|
||||
if (cdPtyNmb->typeNmb0.pres == PRSNT_NODEF) {
|
||||
caller_data->dnis.type = cdPtyNmb->typeNmb0.val;
|
||||
caller_data->dnis.type = get_ftdm_val(ton_codes, cdPtyNmb->typeNmb0.val, IN_TON_UNK);
|
||||
}
|
||||
|
||||
if (cdPtyNmb->nmbDigits.pres == PRSNT_NODEF) {
|
||||
@@ -283,11 +327,11 @@ ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
|
||||
}
|
||||
|
||||
if (redirNmb->nmbPlanId.pres == PRSNT_NODEF) {
|
||||
caller_data->rdnis.plan = redirNmb->nmbPlanId.val;
|
||||
caller_data->rdnis.plan = get_ftdm_val(npi_codes, redirNmb->nmbPlanId.val, IN_NP_UNK);
|
||||
}
|
||||
|
||||
if (redirNmb->typeNmb.pres == PRSNT_NODEF) {
|
||||
caller_data->rdnis.type = redirNmb->typeNmb.val;
|
||||
caller_data->rdnis.type = get_ftdm_val(ton_codes, redirNmb->typeNmb.val, IN_TON_UNK);
|
||||
}
|
||||
|
||||
if (redirNmb->nmbDigits.pres == PRSNT_NODEF) {
|
||||
@@ -382,11 +426,13 @@ ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8
|
||||
ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd)
|
||||
{
|
||||
uint8_t val;
|
||||
|
||||
if (!progInd->eh.pres) {
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
if (progInd->progDesc.pres) {
|
||||
/* TODO: use get_ftdm_val function and table here */
|
||||
switch (progInd->progDesc.val) {
|
||||
case IN_PD_NOTETEISDN:
|
||||
val = SNGISDN_PROGIND_DESCR_NETE_ISDN;
|
||||
@@ -464,19 +510,11 @@ ftdm_status_t set_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
||||
cgPtyNmb->presInd0.val = caller_data->pres;
|
||||
|
||||
cgPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
|
||||
if (caller_data->cid_num.plan >= FTDM_NPI_INVALID) {
|
||||
cgPtyNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
|
||||
} else {
|
||||
cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
|
||||
}
|
||||
cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->cid_num.plan, IN_NP_UNK);
|
||||
|
||||
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
|
||||
|
||||
if (caller_data->cid_num.type >= FTDM_TON_INVALID) {
|
||||
cgPtyNmb->typeNmb1.val = FTDM_TON_UNKNOWN;
|
||||
} else {
|
||||
cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
|
||||
}
|
||||
cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, caller_data->cid_num.type, IN_TON_UNK);
|
||||
|
||||
cgPtyNmb->nmbDigits.pres = PRSNT_NODEF;
|
||||
cgPtyNmb->nmbDigits.len = len;
|
||||
@@ -510,7 +548,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
||||
|
||||
val = FTDM_SCREENING_INVALID;
|
||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.screening_ind");
|
||||
if ((string != NULL) && (*string)) {
|
||||
if (!ftdm_strlen_zero(string)) {
|
||||
val = ftdm_str2ftdm_screening(string);
|
||||
}
|
||||
|
||||
@@ -527,7 +565,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
||||
|
||||
val = FTDM_PRES_INVALID;
|
||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.presentation_ind");
|
||||
if ((string != NULL) && (*string)) {
|
||||
if (!ftdm_strlen_zero(string)) {
|
||||
val = ftdm_str2ftdm_presentation(string);
|
||||
}
|
||||
|
||||
@@ -542,14 +580,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
||||
|
||||
val = FTDM_NPI_INVALID;
|
||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.npi");
|
||||
if ((string != NULL) && (*string)) {
|
||||
if (!ftdm_strlen_zero(string)) {
|
||||
val = ftdm_str2ftdm_npi(string);
|
||||
}
|
||||
|
||||
if (val == FTDM_NPI_INVALID) {
|
||||
cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
|
||||
} else {
|
||||
cgPtyNmb->nmbPlanId.val = val;
|
||||
cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, val, IN_NP_UNK);
|
||||
}
|
||||
|
||||
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
|
||||
@@ -557,14 +595,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
||||
/* Type of Number */
|
||||
val = FTDM_TON_INVALID;
|
||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.ton");
|
||||
if ((string != NULL) && (*string)) {
|
||||
if (!ftdm_strlen_zero(string)) {
|
||||
val = ftdm_str2ftdm_ton(string);
|
||||
}
|
||||
|
||||
if (val == FTDM_TON_INVALID) {
|
||||
cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
|
||||
} else {
|
||||
cgPtyNmb->typeNmb1.val = val;
|
||||
cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, val, IN_TON_UNK);
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
@@ -577,21 +615,14 @@ ftdm_status_t set_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb)
|
||||
if (!len) {
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
cdPtyNmb->eh.pres = PRSNT_NODEF;
|
||||
|
||||
cdPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
|
||||
if (caller_data->dnis.plan >= FTDM_NPI_INVALID) {
|
||||
cdPtyNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
|
||||
} else {
|
||||
cdPtyNmb->nmbPlanId.val = caller_data->dnis.plan;
|
||||
}
|
||||
|
||||
cdPtyNmb->typeNmb0.pres = PRSNT_NODEF;
|
||||
if (caller_data->dnis.type >= FTDM_TON_INVALID) {
|
||||
cdPtyNmb->typeNmb0.val = FTDM_TON_UNKNOWN;
|
||||
} else {
|
||||
cdPtyNmb->typeNmb0.val = caller_data->dnis.type;
|
||||
}
|
||||
cdPtyNmb->eh.pres = PRSNT_NODEF;
|
||||
|
||||
cdPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
|
||||
cdPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->dnis.plan, IN_NP_UNK);
|
||||
|
||||
cdPtyNmb->typeNmb0.pres = PRSNT_NODEF;
|
||||
cdPtyNmb->typeNmb0.val = get_trillium_val(ton_codes, caller_data->dnis.type, IN_TON_UNK);
|
||||
|
||||
cdPtyNmb->nmbDigits.pres = PRSNT_NODEF;
|
||||
cdPtyNmb->nmbDigits.len = len;
|
||||
@@ -612,18 +643,10 @@ ftdm_status_t set_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
|
||||
redirNmb->eh.pres = PRSNT_NODEF;
|
||||
|
||||
redirNmb->nmbPlanId.pres = PRSNT_NODEF;
|
||||
if (caller_data->rdnis.plan >= FTDM_NPI_INVALID) {
|
||||
redirNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
|
||||
} else {
|
||||
redirNmb->nmbPlanId.val = caller_data->rdnis.plan;
|
||||
}
|
||||
redirNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->rdnis.plan, IN_NP_UNK);
|
||||
|
||||
redirNmb->typeNmb.pres = PRSNT_NODEF;
|
||||
if (caller_data->rdnis.type >= FTDM_TON_INVALID) {
|
||||
redirNmb->typeNmb.val = FTDM_TON_UNKNOWN;
|
||||
} else {
|
||||
redirNmb->typeNmb.val = caller_data->rdnis.type;
|
||||
}
|
||||
redirNmb->typeNmb.val = get_trillium_val(ton_codes, caller_data->rdnis.type, IN_TON_UNK);
|
||||
|
||||
redirNmb->nmbDigits.pres = PRSNT_NODEF;
|
||||
redirNmb->nmbDigits.len = len;
|
||||
@@ -743,7 +766,7 @@ ftdm_status_t set_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd, ftdm_s
|
||||
int loc = prog_ind.loc;
|
||||
|
||||
str = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.prog_ind.descr");
|
||||
if (str && *str) {
|
||||
if (!ftdm_strlen_zero(str)) {
|
||||
/* User wants to override progress indicator */
|
||||
descr = ftdm_str2ftdm_sngisdn_progind_descr(str);
|
||||
}
|
||||
@@ -754,7 +777,7 @@ ftdm_status_t set_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd, ftdm_s
|
||||
}
|
||||
|
||||
str = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.prog_ind.loc");
|
||||
if (str && *str) {
|
||||
if (!ftdm_strlen_zero(str)) {
|
||||
loc = ftdm_str2ftdm_sngisdn_progind_loc(str);
|
||||
}
|
||||
if (loc == SNGISDN_PROGIND_LOC_INVALID) {
|
||||
@@ -1069,18 +1092,20 @@ void get_memory_info(void)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
uint8_t sngisdn_get_infoTranCap_from_user(ftdm_bearer_cap_t bearer_capability)
|
||||
{
|
||||
switch(bearer_capability) {
|
||||
case FTDM_BEARER_CAP_SPEECH:
|
||||
return IN_ITC_SPEECH;
|
||||
case FTDM_BEARER_CAP_64K_UNRESTRICTED:
|
||||
case FTDM_BEARER_CAP_UNRESTRICTED:
|
||||
return IN_ITC_UNRDIG;
|
||||
case FTDM_BEARER_CAP_3_1KHZ_AUDIO:
|
||||
return IN_ITC_A31KHZ;
|
||||
case FTDM_BEARER_CAP_INVALID:
|
||||
return IN_ITC_SPEECH;
|
||||
/* Do not put a default case here, so we can see compile warnings if we have unhandled cases */
|
||||
default:
|
||||
return IN_ITC_SPEECH;
|
||||
}
|
||||
return FTDM_BEARER_CAP_SPEECH;
|
||||
}
|
||||
@@ -1096,7 +1121,8 @@ uint8_t sngisdn_get_usrInfoLyr1Prot_from_user(ftdm_user_layer1_prot_t layer1_pro
|
||||
return IN_UIL1_G711ALAW;
|
||||
case FTDM_USER_LAYER1_PROT_INVALID:
|
||||
return IN_UIL1_G711ULAW;
|
||||
/* Do not put a default case here, so we can see compile warnings if we have unhandled cases */
|
||||
default:
|
||||
return IN_UIL1_G711ULAW;
|
||||
}
|
||||
return IN_UIL1_G711ULAW;
|
||||
}
|
||||
@@ -1105,9 +1131,9 @@ ftdm_bearer_cap_t sngisdn_get_infoTranCap_from_stack(uint8_t bearer_capability)
|
||||
{
|
||||
switch(bearer_capability) {
|
||||
case IN_ITC_SPEECH:
|
||||
return FTDM_BEARER_CAP_SPEECH;
|
||||
return FTDM_BEARER_CAP_SPEECH;
|
||||
case IN_ITC_UNRDIG:
|
||||
return FTDM_BEARER_CAP_64K_UNRESTRICTED;
|
||||
return FTDM_BEARER_CAP_UNRESTRICTED;
|
||||
case IN_ITC_A31KHZ:
|
||||
return FTDM_BEARER_CAP_3_1KHZ_AUDIO;
|
||||
default:
|
||||
@@ -1131,7 +1157,7 @@ ftdm_user_layer1_prot_t sngisdn_get_usrInfoLyr1Prot_from_stack(uint8_t layer1_pr
|
||||
return FTDM_USER_LAYER1_PROT_ULAW;
|
||||
}
|
||||
|
||||
void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span)
|
||||
ftdm_status_t sngisdn_show_l1_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span)
|
||||
{
|
||||
L1Mngmt sts;
|
||||
sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*)span->signal_data;
|
||||
@@ -1169,11 +1195,11 @@ void sngisdn_print_phy_stats(ftdm_stream_handle_t *stream, ftdm_span_t *span)
|
||||
stream->write_function(stream, " TX Errors Details");
|
||||
stream->write_function(stream, "\n---------------------------------------------------------------------\n");
|
||||
stream->write_function(stream, "Aborted:\t%u\tFifo:\t\t%u\tCarrier:\t%u\n", sts.t.sts.tx_aborted_errors, sts.t.sts.tx_fifo_errors, sts.t.sts.tx_carrier_errors);
|
||||
return;
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span)
|
||||
ftdm_status_t sngisdn_show_span(ftdm_stream_handle_t *stream, ftdm_span_t *span)
|
||||
{
|
||||
ftdm_signaling_status_t sigstatus;
|
||||
ftdm_alarm_flag_t alarmbits;
|
||||
@@ -1188,18 +1214,18 @@ void sngisdn_print_span(ftdm_stream_handle_t *stream, ftdm_span_t *span)
|
||||
stream->write_function(stream, "span:%s physical:%s signalling:%s\n",
|
||||
span->name, alarmbits ? "ALARMED" : "OK",
|
||||
ftdm_signaling_status2str(sigstatus));
|
||||
return;
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
void sngisdn_print_spans(ftdm_stream_handle_t *stream)
|
||||
ftdm_status_t sngisdn_show_spans(ftdm_stream_handle_t *stream)
|
||||
{
|
||||
int i;
|
||||
for(i=1;i<=MAX_L1_LINKS;i++) {
|
||||
if (g_sngisdn_data.spans[i]) {
|
||||
sngisdn_print_span(stream, g_sngisdn_data.spans[i]->ftdm_span);
|
||||
sngisdn_show_span(stream, g_sngisdn_data.spans[i]->ftdm_span);
|
||||
}
|
||||
}
|
||||
return;
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t sngisdn_add_var(sngisdn_chan_data_t *sngisdn_info, const char* var, const char* val)
|
||||
|
||||
@@ -334,11 +334,12 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
|
||||
switch(ieId) {
|
||||
case PROT_Q931_IE_BEARER_CAP:
|
||||
{
|
||||
uint8_t codingStandard, infTransferCap, transferMode, infTransferRate, usrL1Prot;
|
||||
uint8_t codingStandard, infTransferCap, infTransferRate, usrL1Prot;
|
||||
/*uint8_t transferMode;*/
|
||||
|
||||
codingStandard = get_bits(OCTET(3),6,7);
|
||||
infTransferCap = get_bits(OCTET(3),1,5);
|
||||
transferMode = get_bits(OCTET(4),6,7);
|
||||
/*transferMode = get_bits(OCTET(4),6,7);*/
|
||||
infTransferRate = get_bits(OCTET(4),1,5);
|
||||
usrL1Prot = get_bits(OCTET(5),1,5);
|
||||
|
||||
@@ -404,8 +405,9 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
|
||||
uint8_t infoChannelSelection=0;
|
||||
uint8_t prefExclusive=0;
|
||||
uint8_t ifaceIdPresent=0;
|
||||
uint8_t ifaceIdentifier = 0; /* octet_3_1 */
|
||||
uint8_t chanType=0, numberMap=0, codingStandard=0;
|
||||
/* uint8_t ifaceIdentifier = 0; */ /* octet_3_1 */
|
||||
uint8_t chanType=0, numberMap=0;
|
||||
/* uint8_t codingStandard=0; */
|
||||
uint8_t channelNo = 0;
|
||||
|
||||
infoChannelSelection = get_bits(OCTET(3),1,2);
|
||||
@@ -413,15 +415,15 @@ uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset
|
||||
ifaceIdPresent = get_bits(OCTET(3),7,7);
|
||||
|
||||
if (ifaceIdPresent) {
|
||||
ifaceIdentifier= get_bits(OCTET(4),1,7);
|
||||
/*ifaceIdentifier= get_bits(OCTET(4),1,7);*/
|
||||
chanType = get_bits(OCTET(5),1,4);
|
||||
numberMap = get_bits(OCTET(5),5,5);
|
||||
codingStandard = get_bits(OCTET(5),6,7);
|
||||
/*codingStandard = get_bits(OCTET(5),6,7);*/
|
||||
channelNo = get_bits(OCTET(6),1,7);
|
||||
} else {
|
||||
chanType = get_bits(OCTET(4),1,4);
|
||||
numberMap = get_bits(OCTET(4),5,5);
|
||||
codingStandard = get_bits(OCTET(4),6,7);
|
||||
/*codingStandard = get_bits(OCTET(4),6,7);*/
|
||||
channelNo = get_bits(OCTET(5),1,7);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,12 +33,14 @@
|
||||
|
||||
/* INCLUDE ********************************************************************/
|
||||
#include "ftmod_sangoma_ss7_main.h"
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* DEFINES ********************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
@@ -79,14 +81,14 @@ ftdm_status_t handle_olm_msg(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
||||
ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt)
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||
|
||||
sngss7_chan_data_t *sngss7_info = NULL;
|
||||
ftdm_channel_t *ftdmchan = NULL;
|
||||
char nadi[2];
|
||||
|
||||
|
||||
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||
memset(nadi, '\0', sizeof(nadi));
|
||||
|
||||
/* get the ftdmchan and ss7_chan_data from the circuit */
|
||||
@@ -189,6 +191,8 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
|
||||
copy_genNmb_from_sngss7(ftdmchan, &siConEvnt->genNmb);
|
||||
|
||||
copy_cgPtyCat_from_sngss7(ftdmchan, &siConEvnt->cgPtyCat);
|
||||
|
||||
/* fill in the TMR/bearer capability */
|
||||
if (siConEvnt->txMedReq.eh.pres) {
|
||||
if (siConEvnt->txMedReq.trMedReq.pres) {
|
||||
@@ -206,6 +210,10 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
sprintf(nadi, "%d", siConEvnt->cdPtyNum.natAddrInd.val);
|
||||
sngss7_add_var(sngss7_info, "ss7_cld_nadi", nadi);
|
||||
|
||||
if (sngss7_info->circuit->transparent_iam) {
|
||||
sngss7_save_iam(ftdmchan, siConEvnt);
|
||||
}
|
||||
|
||||
/* check if a COT test is requested */
|
||||
if ((siConEvnt->natConInd.eh.pres) &&
|
||||
(siConEvnt->natConInd.contChkInd.pres) &&
|
||||
@@ -229,7 +237,6 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
||||
siConEvnt->cgPtyNum.natAddrInd.val,
|
||||
ftdmchan->caller_data.dnis.digits,
|
||||
siConEvnt->cdPtyNum.natAddrInd.val);
|
||||
|
||||
} /* if (channel is usable */
|
||||
|
||||
break;
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
static sng_isup_event_interface_t sng_event;
|
||||
static ftdm_io_interface_t g_ftdm_sngss7_interface;
|
||||
ftdm_sngss7_data_t g_ftdm_sngss7_data;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
@@ -509,11 +510,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
|
||||
SS7_DEBUG_CHAN(ftdmchan, "ftmod_sangoma_ss7 processing state %s\n", ftdm_channel_state2str (ftdmchan->state));
|
||||
|
||||
#if 0
|
||||
/* clear the state change flag...since we might be setting a new state */
|
||||
ftdm_channel_complete_state(ftdmchan);
|
||||
#endif
|
||||
|
||||
/*check what state we are supposed to be in */
|
||||
switch (ftdmchan->state) {
|
||||
/**************************************************************************/
|
||||
@@ -674,9 +670,6 @@ ftdm_status_t ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
||||
} else {
|
||||
/*INBOUND...so FS told us it was going to answer...tell the stack */
|
||||
ft_to_sngss7_anm(ftdmchan);
|
||||
#if 1 /* DAVIDY */
|
||||
ft_to_sngss7_itx(ftdmchan);
|
||||
#endif
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -60,6 +60,13 @@
|
||||
|
||||
#define MAX_SIZEOF_SUBADDR_IE 24 /* as per Q931 4.5.9 */
|
||||
|
||||
typedef struct ftdm2trillium
|
||||
{
|
||||
uint8_t ftdm_val;
|
||||
uint8_t trillium_val;
|
||||
}ftdm2trillium_t;
|
||||
|
||||
|
||||
typedef enum {
|
||||
SNGSS7_CON_IND_EVENT = 0,
|
||||
SNGSS7_CON_CFM_EVENT,
|
||||
@@ -332,6 +339,7 @@ typedef struct sng_isup_ckt {
|
||||
|
||||
uint32_t min_digits;
|
||||
uint8_t itx_auto_reply;
|
||||
uint8_t transparent_iam;
|
||||
void *obj;
|
||||
uint16_t t3;
|
||||
uint16_t t12;
|
||||
@@ -399,6 +407,7 @@ typedef struct sng_ss7_cfg {
|
||||
uint32_t procId;
|
||||
char license[MAX_PATH];
|
||||
char signature[MAX_PATH];
|
||||
uint32_t transparent_iam_max_size;
|
||||
uint32_t flags;
|
||||
sng_relay_t relay[MAX_RELAY_CHANNELS+1];
|
||||
sng_mtp1_link_t mtp1Link[MAX_MTP_LINKS+1];
|
||||
@@ -758,6 +767,10 @@ void sngss7_resm_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiR
|
||||
void sngss7_susp_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiSuspEvnt *siSuspEvnt);
|
||||
void sngss7_ssp_sta_cfm(uint32_t infId);
|
||||
|
||||
ftdm_status_t sngss7_bufferzero_iam(SiConEvnt *siConEvnt);
|
||||
ftdm_status_t sngss7_retrieve_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt);
|
||||
ftdm_status_t sngss7_save_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt);
|
||||
|
||||
/* in ftmod_sangoma_ss7_handle.c */
|
||||
ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt);
|
||||
ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType);
|
||||
@@ -806,6 +819,13 @@ ftdm_status_t copy_redirgNum_to_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *red
|
||||
ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *redirgNum);
|
||||
ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb);
|
||||
ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb);
|
||||
ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat);
|
||||
ftdm_status_t copy_cgPtyCat_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat);
|
||||
ftdm_status_t copy_accTrnspt_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt);
|
||||
ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd);
|
||||
ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd);
|
||||
ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq);
|
||||
ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA);
|
||||
|
||||
ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
ftdm_status_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||
|
||||
@@ -36,10 +36,8 @@
|
||||
/******************************************************************************/
|
||||
|
||||
/* DEFINES ********************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
void ft_to_sngss7_iam(ftdm_channel_t * ftdmchan);
|
||||
@@ -66,221 +64,70 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan);
|
||||
|
||||
void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan);
|
||||
void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan);
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;;
|
||||
const char *clg_subAddr = NULL;
|
||||
const char *cld_subAddr = NULL;
|
||||
char subAddrIE[MAX_SIZEOF_SUBADDR_IE];
|
||||
{
|
||||
SiConEvnt iam;
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;;
|
||||
|
||||
SS7_FUNC_TRACE_ENTER (__FUNCTION__);
|
||||
|
||||
sngss7_info->suInstId = get_unique_id ();
|
||||
sngss7_info->spInstId = 0;
|
||||
sngss7_info->spId = 1;
|
||||
|
||||
memset (&iam, 0x0, sizeof (iam));
|
||||
|
||||
/* copy down the nature of connection indicators */
|
||||
iam.natConInd.eh.pres = PRSNT_NODEF;
|
||||
iam.natConInd.satInd.pres = PRSNT_NODEF;
|
||||
iam.natConInd.satInd.val = 0; /* no satellite circuit */
|
||||
iam.natConInd.contChkInd.pres = PRSNT_NODEF;
|
||||
iam.natConInd.contChkInd.val = CONTCHK_NOTREQ;
|
||||
iam.natConInd.echoCntrlDevInd.pres = PRSNT_NODEF;
|
||||
iam.natConInd.echoCntrlDevInd.val = ECHOCDEV_INCL;
|
||||
|
||||
/* copy down the forward call indicators */
|
||||
iam.fwdCallInd.eh.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.natIntCallInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.natIntCallInd.val = 0x00;
|
||||
iam.fwdCallInd.end2EndMethInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.end2EndMethInd.val = E2EMTH_NOMETH;
|
||||
iam.fwdCallInd.intInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.intInd.val = INTIND_NOINTW;
|
||||
iam.fwdCallInd.end2EndInfoInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.end2EndInfoInd.val = E2EINF_NOINFO;
|
||||
iam.fwdCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.isdnUsrPrtInd.val = ISUP_USED;
|
||||
iam.fwdCallInd.isdnUsrPrtPrfInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.isdnUsrPrtPrfInd.val = PREF_PREFAW;
|
||||
iam.fwdCallInd.isdnAccInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.isdnAccInd.val = ISDNACC_ISDN;
|
||||
iam.fwdCallInd.sccpMethInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.sccpMethInd.val = SCCPMTH_NOIND;
|
||||
|
||||
/* copy down the calling number information */
|
||||
iam.cgPtyCat.eh.pres = PRSNT_NODEF;
|
||||
iam.cgPtyCat.cgPtyCat.pres = PRSNT_NODEF;
|
||||
iam.cgPtyCat.cgPtyCat.val = CAT_ORD; /* ordinary suscriber */
|
||||
|
||||
/* copy down the transmission medium requirements */
|
||||
iam.txMedReq.eh.pres = PRSNT_NODEF;
|
||||
iam.txMedReq.trMedReq.pres = PRSNT_NODEF;
|
||||
iam.txMedReq.trMedReq.val = ftdmchan->caller_data.bearer_capability;
|
||||
|
||||
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)) {
|
||||
if (sngss7_info->circuit->transparent_iam &&
|
||||
sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) {
|
||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Transparent)\n", sngss7_info->circuit->cic);
|
||||
} else {
|
||||
/* Nature of Connection Indicators */
|
||||
copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd);
|
||||
|
||||
/* include only if we're running ANSI */
|
||||
iam.fwdCallInd.transCallNInd.pres = PRSNT_NODEF;
|
||||
iam.fwdCallInd.transCallNInd.val = 0x0;
|
||||
/* Forward Call Indicators */
|
||||
copy_fwdCallInd_to_sngss7(ftdmchan, &iam.fwdCallInd);
|
||||
|
||||
iam.usrServInfoA.eh.pres = PRSNT_NODEF;
|
||||
/* Transmission medium requirements */
|
||||
copy_txMedReq_to_sngss7(ftdmchan, &iam.txMedReq);
|
||||
|
||||
iam.usrServInfoA.infoTranCap.pres = PRSNT_NODEF;
|
||||
switch (ftdmchan->caller_data.bearer_capability) {
|
||||
/**********************************************************************/
|
||||
case (FTDM_BEARER_CAP_SPEECH):
|
||||
iam.usrServInfoA.infoTranCap.val = 0x0; /* speech as per ATIS-1000113.3.2005 */
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case (FTDM_BEARER_CAP_64K_UNRESTRICTED):
|
||||
iam.usrServInfoA.infoTranCap.val = 0x8; /* unrestricted digital as per ATIS-1000113.3.2005 */
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case (FTDM_BEARER_CAP_3_1KHZ_AUDIO):
|
||||
iam.usrServInfoA.infoTranCap.val = 0x10; /* 3.1kHz audio as per ATIS-1000113.3.2005 */
|
||||
break;
|
||||
/**********************************************************************/
|
||||
default:
|
||||
SS7_ERROR_CHAN(ftdmchan, "Unknown Bearer capability falling back to speech%s\n", " ");
|
||||
iam.usrServInfoA.infoTranCap.val = 0x0; /* speech as per ATIS-1000113.3.2005 */
|
||||
break;
|
||||
/**********************************************************************/
|
||||
} /* switch (ftdmchan->caller_data.bearer_capability) */
|
||||
|
||||
iam.usrServInfoA.cdeStand.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.cdeStand.val = 0x0; /* ITU-T standardized coding */
|
||||
iam.usrServInfoA.tranMode.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.tranMode.val = 0x0; /* circuit mode */
|
||||
iam.usrServInfoA.infoTranRate0.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.infoTranRate0.val = 0x10; /* 64kbps origination to destination */
|
||||
iam.usrServInfoA.infoTranRate1.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.infoTranRate1.val = 0x10; /* 64kbps destination to origination */
|
||||
iam.usrServInfoA.chanStruct.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.chanStruct.val = 0x1; /* 8kHz integrity */
|
||||
iam.usrServInfoA.config.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.config.val = 0x0; /* point to point configuration */
|
||||
iam.usrServInfoA.establish.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.establish.val = 0x0; /* on demand */
|
||||
iam.usrServInfoA.symmetry.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.symmetry.val = 0x0; /* bi-directional symmetric */
|
||||
iam.usrServInfoA.usrInfLyr1Prot.pres = PRSNT_NODEF;
|
||||
iam.usrServInfoA.usrInfLyr1Prot.val = 0x2; /* G.711 ulaw */
|
||||
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, &iam.cdPtyNum);
|
||||
|
||||
/* copy down the calling number information */
|
||||
copy_cgPtyNum_to_sngss7 (ftdmchan, &iam.cgPtyNum);
|
||||
|
||||
/* copy down the generic number information */
|
||||
copy_genNmb_to_sngss7(ftdmchan, &iam.genNmb);
|
||||
|
||||
/* TODO - move this to copy_clg_subAddr_to_sngss7 function */
|
||||
/* check if the user would like us to send a clg_sub-address */
|
||||
clg_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_clg_subaddr");
|
||||
if (!ftdm_strlen_zero(clg_subAddr)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Calling Sub-Address value \"%s\"\n", clg_subAddr);
|
||||
/* User Service Info A */
|
||||
copy_usrServInfoA_to_sngss7(ftdmchan, &iam.usrServInfoA);
|
||||
|
||||
/* clean out the subAddrIE */
|
||||
memset(subAddrIE, 0x0, sizeof(subAddrIE));
|
||||
/* Called Number information */
|
||||
copy_cdPtyNum_to_sngss7(ftdmchan, &iam.cdPtyNum);
|
||||
|
||||
/* Calling Number information */
|
||||
copy_cgPtyNum_to_sngss7(ftdmchan, &iam.cgPtyNum);
|
||||
|
||||
/* check the first character in the sub-address to see what type of encoding to use */
|
||||
switch (clg_subAddr[0]) {
|
||||
case '0': /* NSAP */
|
||||
encode_subAddrIE_nsap(&clg_subAddr[1], subAddrIE, SNG_CALLING);
|
||||
break;
|
||||
case '1': /* national variant */
|
||||
encode_subAddrIE_nat(&clg_subAddr[1], subAddrIE, SNG_CALLING);
|
||||
break;
|
||||
default:
|
||||
SS7_ERROR_CHAN(ftdmchan,"Invalid Calling Sub-Address encoding requested: %c\n", clg_subAddr[0]);
|
||||
break;
|
||||
} /* switch (cld_subAddr[0]) */
|
||||
/* Generic Number information */
|
||||
copy_genNmb_to_sngss7(ftdmchan, &iam.genNmb);
|
||||
|
||||
/* Calling Party's Category */
|
||||
copy_cgPtyCat_to_sngss7(ftdmchan, &iam.cgPtyCat);
|
||||
|
||||
/* if subaddIE is still empty don't copy it in */
|
||||
if (subAddrIE[0] != '0') {
|
||||
/* check if the clg_subAddr has already been added */
|
||||
if (iam.accTrnspt.eh.pres == PRSNT_NODEF) {
|
||||
/* append the subAddrIE */
|
||||
memcpy(&iam.accTrnspt.infoElmts.val[iam.accTrnspt.infoElmts.len], subAddrIE, (subAddrIE[1] + 2));
|
||||
iam.accTrnspt.infoElmts.len = iam.accTrnspt.infoElmts.len +subAddrIE[1] + 2;
|
||||
} else {
|
||||
/* fill in from the beginning */
|
||||
iam.accTrnspt.eh.pres = PRSNT_NODEF;
|
||||
iam.accTrnspt.infoElmts.pres = PRSNT_NODEF;
|
||||
memcpy(iam.accTrnspt.infoElmts.val, subAddrIE, (subAddrIE[1] + 2));
|
||||
iam.accTrnspt.infoElmts.len = subAddrIE[1] + 2;
|
||||
} /* if (iam.accTrnspt.eh.pres */
|
||||
} /* if (subAddrIE[0] != '0') */
|
||||
/* Redirecting Number */
|
||||
copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum);
|
||||
|
||||
/* Access Transport */
|
||||
copy_accTrnspt_to_sngss7(ftdmchan, &iam.accTrnspt);
|
||||
|
||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d)\n",
|
||||
sngss7_info->circuit->cic,
|
||||
ftdmchan->caller_data.cid_num.digits,
|
||||
iam.cgPtyNum.natAddrInd.val,
|
||||
ftdmchan->caller_data.dnis.digits,
|
||||
iam.cdPtyNum.natAddrInd.val);
|
||||
}
|
||||
|
||||
copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum);
|
||||
|
||||
/* check if the user would like us to send a cld_sub-address */
|
||||
cld_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_subaddr");
|
||||
if ((cld_subAddr != NULL) && (*cld_subAddr)) {
|
||||
SS7_DEBUG_CHAN(ftdmchan,"Found user supplied Called Sub-Address value \"%s\"\n", cld_subAddr);
|
||||
|
||||
/* clean out the subAddrIE */
|
||||
memset(subAddrIE, 0x0, sizeof(subAddrIE));
|
||||
|
||||
/* check the first character in the sub-address to see what type of encoding to use */
|
||||
switch (cld_subAddr[0]) {
|
||||
case '0': /* NSAP */
|
||||
encode_subAddrIE_nsap(&cld_subAddr[1], subAddrIE, SNG_CALLED);
|
||||
break;
|
||||
case '1': /* national variant */
|
||||
encode_subAddrIE_nat(&cld_subAddr[1], subAddrIE, SNG_CALLED);
|
||||
break;
|
||||
default:
|
||||
SS7_ERROR_CHAN(ftdmchan,"Invalid Called Sub-Address encoding requested: %c\n", cld_subAddr[0]);
|
||||
break;
|
||||
} /* switch (cld_subAddr[0]) */
|
||||
|
||||
/* if subaddIE is still empty don't copy it in */
|
||||
if (subAddrIE[0] != '0') {
|
||||
/* check if the cld_subAddr has already been added */
|
||||
if (iam.accTrnspt.eh.pres == PRSNT_NODEF) {
|
||||
/* append the subAddrIE */
|
||||
memcpy(&iam.accTrnspt.infoElmts.val[iam.accTrnspt.infoElmts.len], subAddrIE, (subAddrIE[1] + 2));
|
||||
iam.accTrnspt.infoElmts.len = iam.accTrnspt.infoElmts.len +subAddrIE[1] + 2;
|
||||
} else {
|
||||
/* fill in from the beginning */
|
||||
iam.accTrnspt.eh.pres = PRSNT_NODEF;
|
||||
iam.accTrnspt.infoElmts.pres = PRSNT_NODEF;
|
||||
memcpy(iam.accTrnspt.infoElmts.val, subAddrIE, (subAddrIE[1] + 2));
|
||||
iam.accTrnspt.infoElmts.len = subAddrIE[1] + 2;
|
||||
} /* if (iam.accTrnspt.eh.pres */
|
||||
} /* if (subAddrIE[0] != '0') */
|
||||
} /* if ((cld_subAddr != NULL) && (*cld_subAddr)) */
|
||||
|
||||
sng_cc_con_request (sngss7_info->spId,
|
||||
sngss7_info->suInstId,
|
||||
sngss7_info->spInstId,
|
||||
sngss7_info->circuit->id,
|
||||
&iam,
|
||||
sngss7_info->circuit->id,
|
||||
&iam,
|
||||
0);
|
||||
|
||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM clg = \"%s\" (NADI=%d), cld = \"%s\" (NADI=%d)\n",
|
||||
sngss7_info->circuit->cic,
|
||||
ftdmchan->caller_data.cid_num.digits,
|
||||
iam.cgPtyNum.natAddrInd.val,
|
||||
ftdmchan->caller_data.dnis.digits,
|
||||
iam.cdPtyNum.natAddrInd.val);
|
||||
|
||||
|
||||
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
@@ -321,7 +168,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
|
||||
acm.bckCallInd.echoCtrlDevInd.val = 0x1;
|
||||
break;
|
||||
/**********************************************************************/
|
||||
case (FTDM_BEARER_CAP_64K_UNRESTRICTED):
|
||||
case (FTDM_BEARER_CAP_UNRESTRICTED):
|
||||
acm.bckCallInd.echoCtrlDevInd.val = 0x0;
|
||||
break;
|
||||
/**********************************************************************/
|
||||
|
||||
@@ -33,6 +33,9 @@
|
||||
|
||||
/* INCLUDE ********************************************************************/
|
||||
#include "ftmod_sangoma_ss7_main.h"
|
||||
#ifdef HAVE_ZLIB
|
||||
#include <zlib.h>
|
||||
#endif
|
||||
/******************************************************************************/
|
||||
|
||||
/* DEFINES ********************************************************************/
|
||||
@@ -91,9 +94,60 @@ FTDM_ENUM_NAMES(BLK_FLAGS_NAMES, BLK_FLAGS_STRING)
|
||||
FTDM_STR2ENUM(ftmod_ss7_blk_state2flag, ftmod_ss7_blk_flag2str, sng_ckt_block_flag_t, BLK_FLAGS_NAMES, 31)
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val);
|
||||
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val);
|
||||
|
||||
|
||||
|
||||
/* Maps generic FreeTDM CPC codes to SS7 CPC codes */
|
||||
ftdm2trillium_t cpc_codes[] = {
|
||||
{FTDM_CPC_UNKNOWN, CAT_UNKNOWN},
|
||||
{FTDM_CPC_OPERATOR_FRENCH, CAT_OPLANGFR},
|
||||
{FTDM_CPC_OPERATOR_ENGLISH, CAT_OPLANGENG},
|
||||
{FTDM_CPC_OPERATOR_GERMAN, CAT_OPLANGGER},
|
||||
{FTDM_CPC_OPERATOR_RUSSIAN, CAT_OPLANGRUS},
|
||||
{FTDM_CPC_OPERATOR_SPANISH, CAT_OPLANGSP},
|
||||
{FTDM_CPC_ORDINARY, CAT_ORD},
|
||||
{FTDM_CPC_PRIORITY, CAT_PRIOR},
|
||||
{FTDM_CPC_DATA, CAT_DATA},
|
||||
{FTDM_CPC_TEST, CAT_TEST},
|
||||
{FTDM_CPC_PAYPHONE, CAT_PAYPHONE},
|
||||
};
|
||||
|
||||
ftdm2trillium_t bc_cap_codes[] = {
|
||||
{FTDM_BEARER_CAP_SPEECH, ITC_SPEECH}, /* speech as per ATIS-1000113.3.2005 */
|
||||
{FTDM_BEARER_CAP_UNRESTRICTED, ITC_UNRDIG}, /* unrestricted digital as per ATIS-1000113.3.2005 */
|
||||
{FTDM_BEARER_CAP_RESTRICTED, ITC_UNRDIG}, /* Restricted Digital */
|
||||
{FTDM_BEARER_CAP_3_1KHZ_AUDIO, ITC_A31KHZ}, /* 3.1kHz audio as per ATIS-1000113.3.2005 */
|
||||
{FTDM_BEARER_CAP_7KHZ_AUDIO, ITC_A7KHZ}, /* 7Khz audio */
|
||||
{FTDM_BEARER_CAP_15KHZ_AUDIO, ITC_A15KHZ}, /* 15Khz audio */
|
||||
{FTDM_BEARER_CAP_VIDEO, ITC_VIDEO}, /* Video */
|
||||
};
|
||||
|
||||
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val)
|
||||
{
|
||||
ftdm2trillium_t *val = vals;
|
||||
while(val++) {
|
||||
if (val->ftdm_val == ftdm_val) {
|
||||
return val->trillium_val;
|
||||
}
|
||||
}
|
||||
return default_val;
|
||||
}
|
||||
|
||||
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val)
|
||||
{
|
||||
ftdm2trillium_t *val = vals;
|
||||
while(val++) {
|
||||
if (val->trillium_val == trillium_val) {
|
||||
return val->ftdm_val;
|
||||
}
|
||||
}
|
||||
return default_val;
|
||||
}
|
||||
|
||||
ftdm_status_t copy_cgPtyNum_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyNum *cgPtyNum)
|
||||
{
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -174,7 +228,6 @@ ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb)
|
||||
{
|
||||
const char *val = NULL;
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||
|
||||
val = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_gn_digits");
|
||||
if (!ftdm_strlen_zero(val)) {
|
||||
@@ -183,9 +236,9 @@ ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb)
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
} else {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number qualifier \"%s\"\n", val);
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
genNmb->eh.pres = PRSNT_NODEF;
|
||||
genNmb->addrSig.pres = PRSNT_NODEF;
|
||||
|
||||
@@ -243,7 +296,6 @@ ftdm_status_t copy_genNmb_to_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb)
|
||||
genNmb->niInd.val = g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].gn_num_inc_ind;
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "No user supplied Generic Number \"number incomplete indicator\" \"%d\"\n", genNmb->niInd.val);
|
||||
}
|
||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -251,7 +303,6 @@ ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb
|
||||
{
|
||||
char val[64];
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||
|
||||
memset(val, 0, sizeof(val));
|
||||
|
||||
@@ -301,7 +352,6 @@ ftdm_status_t copy_genNmb_from_sngss7(ftdm_channel_t *ftdmchan, SiGenNum *genNmb
|
||||
sngss7_add_var(sngss7_info, "ss7_gn_num_inc_ind", val);
|
||||
}
|
||||
|
||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -423,6 +473,212 @@ ftdm_status_t copy_redirgNum_from_sngss7(ftdm_channel_t *ftdmchan, SiRedirNum *r
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t copy_cgPtyCat_to_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat)
|
||||
{
|
||||
ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
|
||||
|
||||
cgPtyCat->eh.pres = PRSNT_NODEF;
|
||||
cgPtyCat->cgPtyCat.pres = PRSNT_NODEF;
|
||||
|
||||
cgPtyCat->cgPtyCat.val = get_trillium_val(cpc_codes, caller_data->cpc, CAT_ORD);
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Category:0x%x\n",cgPtyCat->cgPtyCat.val);
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t copy_cgPtyCat_from_sngss7(ftdm_channel_t *ftdmchan, SiCgPtyCat *cgPtyCat)
|
||||
{
|
||||
ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
|
||||
|
||||
if (cgPtyCat->eh.pres == PRSNT_NODEF &&
|
||||
cgPtyCat->cgPtyCat.pres == PRSNT_NODEF) {
|
||||
|
||||
caller_data->cpc = get_ftdm_val(cpc_codes, cgPtyCat->cgPtyCat.val, FTDM_CPC_UNKNOWN);
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Calling Party Category:0x%x\n", cgPtyCat->cgPtyCat.val);
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
ftdm_status_t copy_accTrnspt_to_sngss7(ftdm_channel_t *ftdmchan, SiAccTrnspt *accTrnspt)
|
||||
{
|
||||
const char *clg_subAddr = NULL;
|
||||
const char *cld_subAddr = NULL;
|
||||
char subAddrIE[MAX_SIZEOF_SUBADDR_IE];
|
||||
|
||||
/* check if the user would like us to send a clg_sub-address */
|
||||
clg_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_clg_subaddr");
|
||||
if (!ftdm_strlen_zero(clg_subAddr)) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Calling Sub-Address value \"%s\"\n", clg_subAddr);
|
||||
|
||||
/* clean out the subAddrIE */
|
||||
memset(subAddrIE, 0x0, sizeof(subAddrIE));
|
||||
|
||||
/* check the first character in the sub-address to see what type of encoding to use */
|
||||
switch (clg_subAddr[0]) {
|
||||
case '0': /* NSAP */
|
||||
encode_subAddrIE_nsap(&clg_subAddr[1], subAddrIE, SNG_CALLING);
|
||||
break;
|
||||
case '1': /* national variant */
|
||||
encode_subAddrIE_nat(&clg_subAddr[1], subAddrIE, SNG_CALLING);
|
||||
break;
|
||||
default:
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Invalid Calling Sub-Address encoding requested: %c\n", clg_subAddr[0]);
|
||||
break;
|
||||
} /* switch (cld_subAddr[0]) */
|
||||
|
||||
|
||||
/* if subaddIE is still empty don't copy it in */
|
||||
if (subAddrIE[0] != '0') {
|
||||
/* check if the clg_subAddr has already been added */
|
||||
if (accTrnspt->eh.pres == PRSNT_NODEF) {
|
||||
/* append the subAddrIE */
|
||||
memcpy(&accTrnspt->infoElmts.val[accTrnspt->infoElmts.len], subAddrIE, (subAddrIE[1] + 2));
|
||||
accTrnspt->infoElmts.len = accTrnspt->infoElmts.len +subAddrIE[1] + 2;
|
||||
} else {
|
||||
/* fill in from the beginning */
|
||||
accTrnspt->eh.pres = PRSNT_NODEF;
|
||||
accTrnspt->infoElmts.pres = PRSNT_NODEF;
|
||||
memcpy(accTrnspt->infoElmts.val, subAddrIE, (subAddrIE[1] + 2));
|
||||
accTrnspt->infoElmts.len = subAddrIE[1] + 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* check if the user would like us to send a cld_sub-address */
|
||||
cld_subAddr = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_cld_subaddr");
|
||||
if ((cld_subAddr != NULL) && (*cld_subAddr)) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Found user supplied Called Sub-Address value \"%s\"\n", cld_subAddr);
|
||||
|
||||
/* clean out the subAddrIE */
|
||||
memset(subAddrIE, 0x0, sizeof(subAddrIE));
|
||||
|
||||
/* check the first character in the sub-address to see what type of encoding to use */
|
||||
switch (cld_subAddr[0]) {
|
||||
case '0': /* NSAP */
|
||||
encode_subAddrIE_nsap(&cld_subAddr[1], subAddrIE, SNG_CALLED);
|
||||
break;
|
||||
case '1': /* national variant */
|
||||
encode_subAddrIE_nat(&cld_subAddr[1], subAddrIE, SNG_CALLED);
|
||||
break;
|
||||
default:
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Invalid Called Sub-Address encoding requested: %c\n", cld_subAddr[0]);
|
||||
break;
|
||||
} /* switch (cld_subAddr[0]) */
|
||||
|
||||
/* if subaddIE is still empty don't copy it in */
|
||||
if (subAddrIE[0] != '0') {
|
||||
/* check if the cld_subAddr has already been added */
|
||||
if (accTrnspt->eh.pres == PRSNT_NODEF) {
|
||||
/* append the subAddrIE */
|
||||
memcpy(&accTrnspt->infoElmts.val[accTrnspt->infoElmts.len], subAddrIE, (subAddrIE[1] + 2));
|
||||
accTrnspt->infoElmts.len = accTrnspt->infoElmts.len +subAddrIE[1] + 2;
|
||||
} else {
|
||||
/* fill in from the beginning */
|
||||
accTrnspt->eh.pres = PRSNT_NODEF;
|
||||
accTrnspt->infoElmts.pres = PRSNT_NODEF;
|
||||
memcpy(accTrnspt->infoElmts.val, subAddrIE, (subAddrIE[1] + 2));
|
||||
accTrnspt->infoElmts.len = subAddrIE[1] + 2;
|
||||
}
|
||||
}
|
||||
} /* if ((cld_subAddr != NULL) && (*cld_subAddr)) */
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t copy_natConInd_to_sngss7(ftdm_channel_t *ftdmchan, SiNatConInd *natConInd)
|
||||
{
|
||||
/* copy down the nature of connection indicators */
|
||||
natConInd->eh.pres = PRSNT_NODEF;
|
||||
natConInd->satInd.pres = PRSNT_NODEF;
|
||||
natConInd->satInd.val = 0; /* no satellite circuit */
|
||||
natConInd->contChkInd.pres = PRSNT_NODEF;
|
||||
natConInd->contChkInd.val = CONTCHK_NOTREQ;
|
||||
natConInd->echoCntrlDevInd.pres = PRSNT_NODEF;
|
||||
natConInd->echoCntrlDevInd.val = ECHOCDEV_INCL;
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t copy_fwdCallInd_to_sngss7(ftdm_channel_t *ftdmchan, SiFwdCallInd *fwdCallInd)
|
||||
{
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
|
||||
fwdCallInd->eh.pres = PRSNT_NODEF;
|
||||
fwdCallInd->natIntCallInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->natIntCallInd.val = 0x00;
|
||||
fwdCallInd->end2EndMethInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->end2EndMethInd.val = E2EMTH_NOMETH;
|
||||
fwdCallInd->intInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->intInd.val = INTIND_NOINTW;
|
||||
fwdCallInd->end2EndInfoInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->end2EndInfoInd.val = E2EINF_NOINFO;
|
||||
fwdCallInd->isdnUsrPrtInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->isdnUsrPrtInd.val = ISUP_USED;
|
||||
fwdCallInd->isdnUsrPrtPrfInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->isdnUsrPrtPrfInd.val = PREF_PREFAW;
|
||||
fwdCallInd->isdnAccInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->isdnAccInd.val = ISDNACC_ISDN;
|
||||
fwdCallInd->sccpMethInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->sccpMethInd.val = SCCPMTH_NOIND;
|
||||
|
||||
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 */
|
||||
fwdCallInd->transCallNInd.pres = PRSNT_NODEF;
|
||||
fwdCallInd->transCallNInd.val = 0x0;
|
||||
}
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t copy_txMedReq_to_sngss7(ftdm_channel_t *ftdmchan, SiTxMedReq *txMedReq)
|
||||
{
|
||||
txMedReq->eh.pres = PRSNT_NODEF;
|
||||
txMedReq->trMedReq.pres = PRSNT_NODEF;
|
||||
txMedReq->trMedReq.val = ftdmchan->caller_data.bearer_capability;
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t copy_usrServInfoA_to_sngss7(ftdm_channel_t *ftdmchan, SiUsrServInfo *usrServInfoA)
|
||||
{
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
|
||||
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)) {
|
||||
|
||||
usrServInfoA->eh.pres = PRSNT_NODEF;
|
||||
|
||||
usrServInfoA->infoTranCap.pres = PRSNT_NODEF;
|
||||
|
||||
usrServInfoA->infoTranCap.val = get_trillium_val(bc_cap_codes, ftdmchan->caller_data.bearer_capability, ITC_SPEECH);
|
||||
|
||||
usrServInfoA->cdeStand.pres = PRSNT_NODEF;
|
||||
usrServInfoA->cdeStand.val = 0x0; /* ITU-T standardized coding */
|
||||
usrServInfoA->tranMode.pres = PRSNT_NODEF;
|
||||
usrServInfoA->tranMode.val = 0x0; /* circuit mode */
|
||||
usrServInfoA->infoTranRate0.pres = PRSNT_NODEF;
|
||||
usrServInfoA->infoTranRate0.val = 0x10; /* 64kbps origination to destination */
|
||||
usrServInfoA->infoTranRate1.pres = PRSNT_NODEF;
|
||||
usrServInfoA->infoTranRate1.val = 0x10; /* 64kbps destination to origination */
|
||||
usrServInfoA->chanStruct.pres = PRSNT_NODEF;
|
||||
usrServInfoA->chanStruct.val = 0x1; /* 8kHz integrity */
|
||||
usrServInfoA->config.pres = PRSNT_NODEF;
|
||||
usrServInfoA->config.val = 0x0; /* point to point configuration */
|
||||
usrServInfoA->establish.pres = PRSNT_NODEF;
|
||||
usrServInfoA->establish.val = 0x0; /* on demand */
|
||||
usrServInfoA->symmetry.pres = PRSNT_NODEF;
|
||||
usrServInfoA->symmetry.val = 0x0; /* bi-directional symmetric */
|
||||
usrServInfoA->usrInfLyr1Prot.pres = PRSNT_NODEF;
|
||||
usrServInfoA->usrInfLyr1Prot.val = 0x2; /* G.711 ulaw */
|
||||
usrServInfoA->rateMultiplier.pres = PRSNT_NODEF;
|
||||
usrServInfoA->rateMultiplier.val = 0x1; /* 1x rate multipler */
|
||||
} /* if ANSI */
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
ftdm_status_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
||||
{
|
||||
uint8_t i;
|
||||
@@ -524,10 +780,17 @@ ftdm_status_t copy_tknStr_to_sngss7(char* val, TknStr *tknStr, TknU8 *oddEven)
|
||||
|
||||
/* check if the digit is a number and that is not null */
|
||||
while (!(isxdigit(tmp[0])) && (tmp[0] != '\0')) {
|
||||
SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
|
||||
/* move on to the next value */
|
||||
k++;
|
||||
tmp[0] = val[k];
|
||||
if (tmp[0] == '*') {
|
||||
/* Could not find a spec that specifies this , but on customer system, * was transmitted as 0x0b */
|
||||
SS7_DEBUG("Replacing * with 0x0b");
|
||||
k++;
|
||||
tmp[0] = 0x0b;
|
||||
} else {
|
||||
SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
|
||||
/* move on to the next value */
|
||||
k++;
|
||||
tmp[0] = val[k];
|
||||
}
|
||||
} /* while(!(isdigit(tmp))) */
|
||||
|
||||
/* check if tmp is null or a digit */
|
||||
@@ -648,8 +911,6 @@ int check_cics_in_range(sngss7_chan_data_t *sngss7_info)
|
||||
/******************************************************************************/
|
||||
ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan)
|
||||
{
|
||||
/*SS7_FUNC_TRACE_ENTER(__FUNCTION__);*/
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.isupCkt[circuit].obj == NULL) {
|
||||
SS7_ERROR("sngss7_info is Null for circuit #%d\n", circuit);
|
||||
return FTDM_FAIL;
|
||||
@@ -662,7 +923,6 @@ ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_in
|
||||
ftdm_assert_return((*sngss7_info)->ftdmchan, FTDM_FAIL, "received message on signalling link or non-configured cic\n");
|
||||
*ftdmchan = (*sngss7_info)->ftdmchan;
|
||||
|
||||
/*SS7_FUNC_TRACE_EXIT(__FUNCTION__);*/
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1291,10 +1551,17 @@ ftdm_status_t encode_subAddrIE_nat(const char *subAddr, char *subAddrIE, int typ
|
||||
|
||||
/* confirm it is a hex digit */
|
||||
while ((!isxdigit(tmp[0])) && (tmp[0] != '\0')) {
|
||||
SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
|
||||
/* move to the next character in subAddr */
|
||||
x++;
|
||||
tmp[0] = subAddr[x];
|
||||
if (tmp[0] == '*') {
|
||||
/* Could not find a spec that specifies this, but on customer system, * was transmitted as 0x0b */
|
||||
SS7_DEBUG("Replacing * with 0x0b");
|
||||
x++;
|
||||
tmp[0] = 0x0b;
|
||||
} else {
|
||||
SS7_INFO("Dropping invalid digit: %c\n", tmp[0]);
|
||||
/* move to the next character in subAddr */
|
||||
x++;
|
||||
tmp[0] = subAddr[x];
|
||||
}
|
||||
}
|
||||
|
||||
/* check if tmp is null or a digit */
|
||||
@@ -1651,7 +1918,7 @@ void sngss7_set_sig_status(sngss7_chan_data_t *sngss7_info, ftdm_signaling_statu
|
||||
sig.ev_data.sigstatus.status = status;
|
||||
|
||||
if (ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS) {
|
||||
SS7_ERROR_CHAN(ftdmchan, "Failed to change channel status to %s\n",
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed to change channel status to %s\n",
|
||||
ftdm_signaling_status2str(status));
|
||||
}
|
||||
return;
|
||||
@@ -1826,6 +2093,336 @@ ftdm_status_t check_for_reconfig_flag(ftdm_span_t *ftdmspan)
|
||||
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t sngss7_bufferzero_iam(SiConEvnt *siConEvnt)
|
||||
{
|
||||
if (siConEvnt->natConInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->natConInd, 0, sizeof(siConEvnt->natConInd));
|
||||
if (siConEvnt->fwdCallInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->fwdCallInd, 0, sizeof(siConEvnt->fwdCallInd));
|
||||
if (siConEvnt->cgPtyCat.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyCat, 0, sizeof(siConEvnt->cgPtyCat));
|
||||
if (siConEvnt->txMedReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->txMedReq, 0, sizeof(siConEvnt->txMedReq));
|
||||
#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL)
|
||||
if (siConEvnt->usrServInfoA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrServInfoA, 0, sizeof(siConEvnt->usrServInfoA));
|
||||
#endif
|
||||
if (siConEvnt->cdPtyNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cdPtyNum, 0, sizeof(siConEvnt->cdPtyNum));
|
||||
#if TNS_ANSI
|
||||
#if (SS7_ANS92 || SS7_ANS95 || SS7_BELL)
|
||||
if (siConEvnt->tranNetSel1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->tranNetSel1, 0, sizeof(siConEvnt->tranNetSel1));
|
||||
#endif
|
||||
#endif
|
||||
if (siConEvnt->tranNetSel.eh.pres != PRSNT_NODEF) memset(&siConEvnt->tranNetSel, 0, sizeof(siConEvnt->tranNetSel));
|
||||
#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL || SS7_CHINA)
|
||||
if (siConEvnt->callRefA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callRefA, 0, sizeof(siConEvnt->callRefA));
|
||||
#endif
|
||||
if (siConEvnt->callRef.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callRef, 0, sizeof(siConEvnt->callRef));
|
||||
if (siConEvnt->cgPtyNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNum, 0, sizeof(siConEvnt->cgPtyNum));
|
||||
#if SS7_BELL
|
||||
if (siConEvnt->cgPtyNumB.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNumB, 0, sizeof(siConEvnt->cgPtyNumB));
|
||||
#endif
|
||||
if (siConEvnt->opFwdCalInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->opFwdCalInd, 0, sizeof(siConEvnt->opFwdCalInd));
|
||||
#if (SS7_Q767 || SS7_RUSSIA || SS7_NTT)
|
||||
if (siConEvnt->opFwdCalIndQ.eh.pres != PRSNT_NODEF) memset(&siConEvnt->opFwdCalIndQ, 0, sizeof(siConEvnt->opFwdCalIndQ));
|
||||
#endif
|
||||
#if SS7_Q767IT
|
||||
if (siConEvnt->fwdVad.eh.pres != PRSNT_NODEF) memset(&siConEvnt->fwdVad, 0, sizeof(siConEvnt->fwdVad));
|
||||
#endif
|
||||
#if SS7_ANS88
|
||||
if (siConEvnt->opFwdCalIndA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->opFwdCalIndA, 0, sizeof(siConEvnt->opFwdCalIndA));
|
||||
#endif
|
||||
if (siConEvnt->redirgNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirgNum, 0, sizeof(siConEvnt->redirgNum));
|
||||
if (siConEvnt->redirInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirInfo, 0, sizeof(siConEvnt->redirInfo));
|
||||
if (siConEvnt->cugIntCode.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cugIntCode, 0, sizeof(siConEvnt->cugIntCode));
|
||||
#if SS7_ANS88
|
||||
if (siConEvnt->cugIntCodeA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cugIntCodeA, 0, sizeof(siConEvnt->cugIntCodeA));
|
||||
#endif
|
||||
#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL || SS7_CHINA)
|
||||
if (siConEvnt->connReqA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connReqA, 0, sizeof(siConEvnt->connReqA));
|
||||
#endif
|
||||
#if SS7_ANS88
|
||||
if (siConEvnt->usr2UsrInfoA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usr2UsrInfoA, 0, sizeof(siConEvnt->usr2UsrInfoA));
|
||||
#endif
|
||||
if (siConEvnt->connReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connReq, 0, sizeof(siConEvnt->connReq));
|
||||
if (siConEvnt->origCdNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->origCdNum, 0, sizeof(siConEvnt->origCdNum));
|
||||
if (siConEvnt->usr2UsrInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usr2UsrInfo, 0, sizeof(siConEvnt->usr2UsrInfo));
|
||||
if (siConEvnt->accTrnspt.eh.pres != PRSNT_NODEF) memset(&siConEvnt->accTrnspt, 0, sizeof(siConEvnt->accTrnspt));
|
||||
if (siConEvnt->echoControl.eh.pres != PRSNT_NODEF) memset(&siConEvnt->echoControl, 0, sizeof(siConEvnt->echoControl));
|
||||
#if SS7_ANS88
|
||||
if (siConEvnt->redirInfoA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirInfoA, 0, sizeof(siConEvnt->redirInfoA));
|
||||
#endif
|
||||
#if (SS7_ANS88 || SS7_ANS92 || SS7_ANS95 || SS7_BELL)
|
||||
if (siConEvnt->chargeNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->chargeNum, 0, sizeof(siConEvnt->chargeNum));
|
||||
if (siConEvnt->origLineInf.eh.pres != PRSNT_NODEF) memset(&siConEvnt->origLineInf, 0, sizeof(siConEvnt->origLineInf));
|
||||
#endif
|
||||
if (siConEvnt->usrServInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrServInfo, 0, sizeof(siConEvnt->usrServInfo));
|
||||
if (siConEvnt->usr2UsrInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usr2UsrInd, 0, sizeof(siConEvnt->usr2UsrInd));
|
||||
if (siConEvnt->propDly.eh.pres != PRSNT_NODEF) memset(&siConEvnt->propDly, 0, sizeof(siConEvnt->propDly));
|
||||
if (siConEvnt->usrServInfo1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrServInfo1, 0, sizeof(siConEvnt->usrServInfo1));
|
||||
if (siConEvnt->netFac.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netFac, 0, sizeof(siConEvnt->netFac));
|
||||
#ifdef SS7_CHINA
|
||||
if (siConEvnt->orgPteCdeA.eh.pres != PRSNT_NODEF) memset(&siConEvnt->orgPteCdeA, 0, sizeof(siConEvnt->orgPteCdeA));
|
||||
#endif
|
||||
if (siConEvnt->orgPteCde.eh.pres != PRSNT_NODEF) memset(&siConEvnt->orgPteCde, 0, sizeof(siConEvnt->orgPteCde));
|
||||
if (siConEvnt->genDigits.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genDigits, 0, sizeof(siConEvnt->genDigits));
|
||||
if (siConEvnt->genDigitsR.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genDigitsR, 0, sizeof(siConEvnt->genDigitsR));
|
||||
if (siConEvnt->usrTSrvInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->usrTSrvInfo, 0, sizeof(siConEvnt->usrTSrvInfo));
|
||||
if (siConEvnt->remotOper.eh.pres != PRSNT_NODEF) memset(&siConEvnt->remotOper, 0, sizeof(siConEvnt->remotOper));
|
||||
if (siConEvnt->parmCom.eh.pres != PRSNT_NODEF) memset(&siConEvnt->parmCom, 0, sizeof(siConEvnt->parmCom));
|
||||
#if (SS7_ANS92 || SS7_ANS95)
|
||||
if (siConEvnt->servCode.eh.pres != PRSNT_NODEF) memset(&siConEvnt->servCode, 0, sizeof(siConEvnt->servCode));
|
||||
#endif
|
||||
#if SS7_ANS92
|
||||
if (siConEvnt->serviceAct1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct1, 0, sizeof(siConEvnt->serviceAct1));
|
||||
#endif
|
||||
#if SS7_CHINA
|
||||
if (siConEvnt->serviceAct2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct2, 0, sizeof(siConEvnt->serviceAct2));
|
||||
#endif
|
||||
if (siConEvnt->serviceAct2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct2, 0, sizeof(siConEvnt->serviceAct2));
|
||||
if (siConEvnt->serviceAct.eh.pres != PRSNT_NODEF) memset(&siConEvnt->serviceAct, 0, sizeof(siConEvnt->serviceAct));
|
||||
if (siConEvnt->mlppPrec.eh.pres != PRSNT_NODEF) memset(&siConEvnt->mlppPrec, 0, sizeof(siConEvnt->mlppPrec));
|
||||
#if (defined(SIT_PARAMETER) || defined(TDS_ROLL_UPGRADE_SUPPORT))
|
||||
if (siConEvnt->txMedUsPr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->txMedUsPr, 0, sizeof(siConEvnt->txMedUsPr));
|
||||
#endif
|
||||
if (siConEvnt->bckCallInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->bckCallInd, 0, sizeof(siConEvnt->bckCallInd));
|
||||
if (siConEvnt->cgPtyNum1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNum1, 0, sizeof(siConEvnt->cgPtyNum1));
|
||||
if (siConEvnt->optBckCalInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->optBckCalInd, 0, sizeof(siConEvnt->optBckCalInd));
|
||||
#if (SS7_Q767 || SS7_RUSSIA || SS7_NTT)
|
||||
if (siConEvnt->optBckCalIndQ.eh.pres != PRSNT_NODEF) memset(&siConEvnt->optBckCalIndQ, 0, sizeof(siConEvnt->optBckCalIndQ));
|
||||
#endif
|
||||
if (siConEvnt->connNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connNum, 0, sizeof(siConEvnt->connNum));
|
||||
#if (defined(SIT_PARAMETER) || defined(TDS_ROLL_UPGRADE_SUPPORT))
|
||||
if (siConEvnt->connNum2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->connNum2, 0, sizeof(siConEvnt->connNum2));
|
||||
#endif
|
||||
if (siConEvnt->accDelInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->accDelInfo, 0, sizeof(siConEvnt->accDelInfo));
|
||||
if (siConEvnt->notifInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifInd, 0, sizeof(siConEvnt->notifInd));
|
||||
if (siConEvnt->notifIndR2.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifIndR2, 0, sizeof(siConEvnt->notifIndR2));
|
||||
if (siConEvnt->cllHstry.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cllHstry, 0, sizeof(siConEvnt->cllHstry));
|
||||
if (siConEvnt->genNmb.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genNmb, 0, sizeof(siConEvnt->genNmb));
|
||||
if (siConEvnt->genNmbR.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genNmbR, 0, sizeof(siConEvnt->genNmbR));
|
||||
if (siConEvnt->redirNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirNum, 0, sizeof(siConEvnt->redirNum));
|
||||
if (siConEvnt->redirRstr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirRstr, 0, sizeof(siConEvnt->redirRstr));
|
||||
|
||||
#if SS7_Q767IT
|
||||
if (siConEvnt->backVad.eh.pres != PRSNT_NODEF) memset(&siConEvnt->backVad, 0, sizeof(siConEvnt->backVad));
|
||||
#endif
|
||||
#if SS7_SINGTEL
|
||||
if (siConEvnt->cgPtyNumS.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cgPtyNumS, 0, sizeof(siConEvnt->cgPtyNumS));
|
||||
#endif
|
||||
#if (SS7_ANS92 || SS7_ANS95 || SS7_BELL)
|
||||
if (siConEvnt->businessGrp.eh.pres != PRSNT_NODEF) memset(&siConEvnt->businessGrp, 0, sizeof(siConEvnt->businessGrp));
|
||||
if (siConEvnt->infoInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->infoInd, 0, sizeof(siConEvnt->infoInd));
|
||||
if (siConEvnt->carrierId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->carrierId, 0, sizeof(siConEvnt->carrierId));
|
||||
if (siConEvnt->carSelInf.eh.pres != PRSNT_NODEF) memset(&siConEvnt->carSelInf, 0, sizeof(siConEvnt->carSelInf));
|
||||
if (siConEvnt->egress.eh.pres != PRSNT_NODEF) memset(&siConEvnt->egress, 0, sizeof(siConEvnt->egress));
|
||||
if (siConEvnt->genAddr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genAddr, 0, sizeof(siConEvnt->genAddr));
|
||||
if (siConEvnt->genAddrR.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genAddrR, 0, sizeof(siConEvnt->genAddrR));
|
||||
if (siConEvnt->infoReqInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->infoReqInd, 0, sizeof(siConEvnt->infoReqInd));
|
||||
if (siConEvnt->jurisInf.eh.pres != PRSNT_NODEF) memset(&siConEvnt->jurisInf, 0, sizeof(siConEvnt->jurisInf));
|
||||
if (siConEvnt->netTransport.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netTransport, 0, sizeof(siConEvnt->netTransport));
|
||||
if (siConEvnt->specProcReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->specProcReq, 0, sizeof(siConEvnt->specProcReq));
|
||||
if (siConEvnt->transReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->transReq, 0, sizeof(siConEvnt->transReq));
|
||||
#endif
|
||||
#if (defined(SIT_PARAMETER) || defined(TDS_ROLL_UPGRADE_SUPPORT))
|
||||
#if (SS7_ANS92 || SS7_ANS95)
|
||||
if (siConEvnt->notifInd1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifInd1, 0, sizeof(siConEvnt->notifInd1));
|
||||
if (siConEvnt->notifIndR1.eh.pres != PRSNT_NODEF) memset(&siConEvnt->notifIndR1, 0, sizeof(siConEvnt->notifIndR1));
|
||||
#endif /* SS7_ANS92 */
|
||||
#endif /* SIT_PARAMETER || TDS_ROLL_UPGRADE_SUPPORT */
|
||||
#if (SS7_BELL || SS7_ANS95)
|
||||
if (siConEvnt->genName.eh.pres != PRSNT_NODEF) memset(&siConEvnt->genName, 0, sizeof(siConEvnt->genName));
|
||||
#endif
|
||||
#if (SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || SS7_ETSIV3 || \
|
||||
SS7_BELL || SS7_ANS95 || SS7_INDIA || SS7_UK || SS7_NZL || SS7_KZ)
|
||||
if (siConEvnt->hopCounter.eh.pres != PRSNT_NODEF) memset(&siConEvnt->hopCounter, 0, sizeof(siConEvnt->hopCounter));
|
||||
#endif
|
||||
#if (SS7_BELL || SS7_ITU2000 || SS7_KZ)
|
||||
if (siConEvnt->redirCap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirCap, 0, sizeof(siConEvnt->redirCap));
|
||||
if (siConEvnt->redirCntr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->redirCntr, 0, sizeof(siConEvnt->redirCntr));
|
||||
#endif
|
||||
#if (SS7_ETSI || SS7_FTZ)
|
||||
if (siConEvnt->ccbsParam.eh.pres != PRSNT_NODEF) memset(&siConEvnt->ccbsParam, 0, sizeof(siConEvnt->ccbsParam));
|
||||
if (siConEvnt->freePhParam.eh.pres != PRSNT_NODEF) memset(&siConEvnt->freePhParam, 0, sizeof(siConEvnt->freePhParam));
|
||||
#endif
|
||||
#ifdef SS7_FTZ
|
||||
if (siConEvnt->naPaFF.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaFF, 0, sizeof(siConEvnt->naPaFF));
|
||||
if (siConEvnt->naPaFE.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaFE, 0, sizeof(siConEvnt->naPaFE));
|
||||
if (siConEvnt->naPaSSP.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaSSP, 0, sizeof(siConEvnt->naPaSSP));
|
||||
if (siConEvnt->naPaCdPNO.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaCdPNO, 0, sizeof(siConEvnt->naPaCdPNO));
|
||||
if (siConEvnt->naPaSPV.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaSPV, 0, sizeof(siConEvnt->naPaSPV));
|
||||
if (siConEvnt->naPaUKK.eh.pres != PRSNT_NODEF) memset(&siConEvnt->naPaUKK, 0, sizeof(siConEvnt->naPaUKK));
|
||||
#endif
|
||||
#if SS7_NTT
|
||||
if (siConEvnt->msgAreaInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->msgAreaInfo, 0, sizeof(siConEvnt->msgAreaInfo));
|
||||
if (siConEvnt->subsNumber.eh.pres != PRSNT_NODEF) memset(&siConEvnt->subsNumber, 0, sizeof(siConEvnt->subsNumber));
|
||||
if (siConEvnt->rpCllngNo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->rpCllngNo, 0, sizeof(siConEvnt->rpCllngNo));
|
||||
if (siConEvnt->supplUserType.eh.pres != PRSNT_NODEF) memset(&siConEvnt->supplUserType, 0, sizeof(siConEvnt->supplUserType));
|
||||
if (siConEvnt->carrierInfoTrans.eh.pres != PRSNT_NODEF) memset(&siConEvnt->carrierInfoTrans, 0, sizeof(siConEvnt->carrierInfoTrans));
|
||||
if (siConEvnt->nwFuncType.eh.pres != PRSNT_NODEF) memset(&siConEvnt->nwFuncType, 0, sizeof(siConEvnt->nwFuncType));
|
||||
#endif
|
||||
#if SS7_ANS95
|
||||
if (siConEvnt->optrServicesInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->optrServicesInfo, 0, sizeof(siConEvnt->optrServicesInfo));
|
||||
#endif
|
||||
#if (SS7_ANS95 || SS7_ITU97 || SS7_RUSS2000|| SS7_ITU2000 || SS7_NZL || SS7_KZ)
|
||||
if (siConEvnt->cirAsgnMap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cirAsgnMap, 0, sizeof(siConEvnt->cirAsgnMap));
|
||||
#endif
|
||||
#if (SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || SS7_ETSIV3 || \
|
||||
SS7_INDIA || SS7_UK || SS7_NZL || SS7_KZ)
|
||||
if (siConEvnt->displayInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->displayInfo, 0, sizeof(siConEvnt->displayInfo));
|
||||
if (siConEvnt->confTrtInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->confTrtInd, 0, sizeof(siConEvnt->confTrtInd));
|
||||
if (siConEvnt->netMgmtControls.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netMgmtControls, 0, sizeof(siConEvnt->netMgmtControls));
|
||||
if (siConEvnt->correlationId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->correlationId, 0, sizeof(siConEvnt->correlationId));
|
||||
if (siConEvnt->callDivTrtInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callDivTrtInd, 0, sizeof(siConEvnt->callDivTrtInd));
|
||||
if (siConEvnt->callInNmb.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callInNmb, 0, sizeof(siConEvnt->callInNmb));
|
||||
if (siConEvnt->callOfferTrtInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->callOfferTrtInd, 0, sizeof(siConEvnt->callOfferTrtInd));
|
||||
if (siConEvnt->scfId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->scfId, 0, sizeof(siConEvnt->scfId));
|
||||
if (siConEvnt->uidCapInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->uidCapInd, 0, sizeof(siConEvnt->uidCapInd));
|
||||
if (siConEvnt->collCallReq.eh.pres != PRSNT_NODEF) memset(&siConEvnt->collCallReq, 0, sizeof(siConEvnt->collCallReq));
|
||||
if (siConEvnt->ccss.eh.pres != PRSNT_NODEF) memset(&siConEvnt->ccss, 0, sizeof(siConEvnt->ccss));
|
||||
#endif
|
||||
#if (SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || SS7_UK || SS7_NZL || SS7_KZ)
|
||||
if (siConEvnt->backGVNS.eh.pres != PRSNT_NODEF) memset(&siConEvnt->backGVNS, 0, sizeof(siConEvnt->backGVNS));
|
||||
if (siConEvnt->forwardGVNS.eh.pres != PRSNT_NODEF) memset(&siConEvnt->forwardGVNS, 0, sizeof(siConEvnt->forwardGVNS));
|
||||
#endif
|
||||
#if (SS7_ETSIV3 || SS7_ITU97 || SS7_RUSS2000 || SS7_ITU2000 || \
|
||||
SS7_INDIA || SS7_UK || SS7_NZL || SS7_KZ)
|
||||
if (siConEvnt->appTransParam.eh.pres != PRSNT_NODEF) memset(&siConEvnt->appTransParam, 0, sizeof(siConEvnt->appTransParam));
|
||||
#endif
|
||||
#if (SS7_ITU2000 || SS7_UK || SS7_NZL || SS7_KZ)
|
||||
if (siConEvnt->htrInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->htrInfo, 0, sizeof(siConEvnt->htrInfo));
|
||||
if (siConEvnt->pivotCap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotCap, 0, sizeof(siConEvnt->pivotCap));
|
||||
if (siConEvnt->cadDirNmb.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cadDirNmb, 0, sizeof(siConEvnt->cadDirNmb));
|
||||
if (siConEvnt->origCallInNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->origCallInNum, 0, sizeof(siConEvnt->origCallInNum));
|
||||
if (siConEvnt->calgGeoLoc.eh.pres != PRSNT_NODEF) memset(&siConEvnt->calgGeoLoc, 0, sizeof(siConEvnt->calgGeoLoc));
|
||||
if (siConEvnt->netRoutNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->netRoutNum, 0, sizeof(siConEvnt->netRoutNum));
|
||||
if (siConEvnt->qonRelCap.eh.pres != PRSNT_NODEF) memset(&siConEvnt->qonRelCap, 0, sizeof(siConEvnt->qonRelCap));
|
||||
if (siConEvnt->pivotCntr.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotCntr, 0, sizeof(siConEvnt->pivotCntr));
|
||||
if (siConEvnt->pivotRtgFwInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotRtgFwInfo, 0, sizeof(siConEvnt->pivotRtgFwInfo));
|
||||
if (siConEvnt->pivotRtgBkInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pivotRtgBkInfo, 0, sizeof(siConEvnt->pivotRtgBkInfo));
|
||||
if (siConEvnt->numPortFwdInfo.eh.pres != PRSNT_NODEF) memset(&siConEvnt->numPortFwdInfo, 0, sizeof(siConEvnt->numPortFwdInfo));
|
||||
#endif
|
||||
#ifdef SS7_UK
|
||||
if (siConEvnt->natFwdCalInd.eh.pres != PRSNT_NODEF) memset(&siConEvnt->natFwdCalInd, 0, sizeof(siConEvnt->natFwdCalInd));
|
||||
if (siConEvnt->presntNum.eh.pres != PRSNT_NODEF) memset(&siConEvnt->presntNum, 0, sizeof(siConEvnt->presntNum));
|
||||
if (siConEvnt->lstDvrtLineId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->lstDvrtLineId, 0, sizeof(siConEvnt->lstDvrtLineId));
|
||||
if (siConEvnt->pcgLineId.eh.pres != PRSNT_NODEF) memset(&siConEvnt->pcgLineId, 0, sizeof(siConEvnt->pcgLineId));
|
||||
if (siConEvnt->natFwdCalIndLnk.eh.pres != PRSNT_NODEF) memset(&siConEvnt->natFwdCalIndLnk, 0, sizeof(siConEvnt->natFwdCalIndLnk));
|
||||
if (siConEvnt->cdBascSrvcMrk.eh.pres != PRSNT_NODEF) memset(&siConEvnt->cdBascSrvcMrk, 0, sizeof(siConEvnt->cdBascSrvcMrk));
|
||||
#endif /* SS7_UK */
|
||||
#if (defined(CGPN_CHK))
|
||||
if (siConEvnt->causeDgnCgPnChk.eh.pres != PRSNT_NODEF) memset(&siConEvnt->causeDgnCgPnChk, 0, sizeof(siConEvnt->causeDgnCgPnChk));
|
||||
#endif
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
ftdm_status_t sngss7_save_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt)
|
||||
{
|
||||
#ifndef HAVE_ZLIB
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Cannot perform transparent IAM because zlib is missing\n");
|
||||
return FTDM_FAIL;
|
||||
#else
|
||||
unsigned ret_val = FTDM_FAIL;
|
||||
char *compressed_iam = NULL;
|
||||
char *url_encoded_iam = NULL;
|
||||
uLongf len = sizeof(*siConEvnt);
|
||||
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
|
||||
|
||||
/* By default, Trillium does not memset their whole structure to zero for
|
||||
* performance. But we want to memset all the IE's that are not present to
|
||||
* optimize compressed size */
|
||||
sngss7_bufferzero_iam(siConEvnt);
|
||||
|
||||
compressed_iam = ftdm_malloc(sizeof(*siConEvnt));
|
||||
if (!compressed_iam) {
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to allocate buffer for compressed_iam\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Compress IAM structure to minimize buffer size */
|
||||
ret_val = compress((Bytef *)compressed_iam, &len, (const Bytef *)siConEvnt, (uLong)sizeof(*siConEvnt));
|
||||
if (ret_val != Z_OK) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Failed to compress IAM (error:%d)\n", ret_val);
|
||||
ret_val = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Compressed IAM size:%d\n", len);
|
||||
|
||||
/* Worst case: size will triple after url encode */
|
||||
url_encoded_iam = ftdm_malloc(3*sizeof(*siConEvnt));
|
||||
if (!url_encoded_iam) {
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Failed to allocated buffer for url_encoded_iam\n");
|
||||
ret_val = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
memset(url_encoded_iam, 0, 2*sizeof(*siConEvnt));
|
||||
|
||||
/* URL encode buffer to that its safe to store it in a string */
|
||||
ftdm_url_encode((const char*)compressed_iam, url_encoded_iam, len);
|
||||
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "IAM variable length:%d\n", strlen(url_encoded_iam));
|
||||
|
||||
if (strlen(url_encoded_iam) > g_ftdm_sngss7_data.cfg.transparent_iam_max_size) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "IAM variable length exceeds max size (len:%d max:%d) \n", strlen(url_encoded_iam), g_ftdm_sngss7_data.cfg.transparent_iam_max_size);
|
||||
ret_val = FTDM_FAIL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
sngss7_add_var(sngss7_info, "ss7_iam", url_encoded_iam);
|
||||
done:
|
||||
ftdm_safe_free(compressed_iam);
|
||||
ftdm_safe_free(url_encoded_iam);
|
||||
return ret_val;
|
||||
#endif
|
||||
}
|
||||
|
||||
ftdm_status_t sngss7_retrieve_iam(ftdm_channel_t *ftdmchan, SiConEvnt *siConEvnt)
|
||||
{
|
||||
#ifndef HAVE_ZLIB
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "Cannot perform transparent IAM because zlib is missing\n");
|
||||
return FTDM_FAIL;
|
||||
#else
|
||||
uLongf len = 3*sizeof(*siConEvnt); /* worst case: URL encoded buffer is 3x length of buffer */
|
||||
char *val = NULL;
|
||||
unsigned ret_val = FTDM_FAIL;
|
||||
void *uncompressed_buffer = NULL;
|
||||
char *url_encoded_iam = NULL;
|
||||
ftdm_size_t url_encoded_iam_len;
|
||||
|
||||
val = (char*)ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_iam");
|
||||
if (ftdm_strlen_zero(val)) {
|
||||
ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "No Transparent IAM info available\n");
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
url_encoded_iam = ftdm_strdup(val);
|
||||
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "IAM variable length:%d\n", strlen(val));
|
||||
ftdm_url_decode(url_encoded_iam, &url_encoded_iam_len);
|
||||
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Compressed IAM size:%d\n", url_encoded_iam_len);
|
||||
|
||||
uncompressed_buffer = ftdm_malloc(sizeof(*siConEvnt));
|
||||
ftdm_assert_return(uncompressed_buffer, FTDM_FAIL, "Failed to allocate buffer for uncompressed buffer\n");
|
||||
|
||||
ret_val = uncompress(uncompressed_buffer, &len, (const Bytef *)url_encoded_iam, (uLong)url_encoded_iam_len);
|
||||
if (ret_val != Z_OK) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Failed to uncompress IAM (error:%d)\n", ret_val);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (len != sizeof(*siConEvnt)) {
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_CRIT, "Incompatible IAM structure size (expected:%d size:%d)\n", sizeof(*siConEvnt), strlen(uncompressed_buffer));
|
||||
goto done;
|
||||
}
|
||||
|
||||
memcpy(siConEvnt, uncompressed_buffer, sizeof(*siConEvnt));
|
||||
ret_val = FTDM_SUCCESS;
|
||||
|
||||
done:
|
||||
ftdm_safe_free(uncompressed_buffer);
|
||||
ftdm_safe_free(url_encoded_iam);
|
||||
return ret_val;
|
||||
#endif
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
|
||||
@@ -124,7 +124,8 @@ typedef struct sng_ccSpan
|
||||
uint32_t cld_nadi;
|
||||
uint32_t rdnis_nadi;
|
||||
uint32_t min_digits;
|
||||
uint32_t itx_auto_reply;
|
||||
uint8_t itx_auto_reply;
|
||||
uint8_t transparent_iam;
|
||||
uint32_t t3;
|
||||
uint32_t t12;
|
||||
uint32_t t13;
|
||||
@@ -466,6 +467,9 @@ static int ftmod_ss7_parse_sng_gen(ftdm_conf_node_t *sng_gen)
|
||||
SS7_DEBUG("Found license file = %s\n", g_ftdm_sngss7_data.cfg.license);
|
||||
SS7_DEBUG("Found signature file = %s\n", g_ftdm_sngss7_data.cfg.signature);
|
||||
/**********************************************************************/
|
||||
} else if (!strcasecmp(parm->var, "transparent_iam_max_size")) {
|
||||
g_ftdm_sngss7_data.cfg.transparent_iam_max_size = atoi(parm->val);
|
||||
SS7_DEBUG("Found a transparent_iam max size = %d\n", g_ftdm_sngss7_data.cfg.transparent_iam_max_size);
|
||||
} else {
|
||||
/**********************************************************************/
|
||||
SS7_ERROR("Found an invalid parameter \"%s\"!\n", parm->val);
|
||||
@@ -1896,6 +1900,13 @@ static int ftmod_ss7_parse_cc_span(ftdm_conf_node_t *cc_span)
|
||||
} else if (!strcasecmp(parm->var, "itx_auto_reply")) {
|
||||
sng_ccSpan.itx_auto_reply = ftdm_true(parm->val);
|
||||
SS7_DEBUG("Found itx_auto_reply %d\n", sng_ccSpan.itx_auto_reply);
|
||||
} else if (!strcasecmp(parm->var, "transparent_iam")) {
|
||||
#ifndef HAVE_ZLIB
|
||||
SS7_CRIT("Cannot enable transparent IAM becauze zlib not installed\n");
|
||||
#else
|
||||
sng_ccSpan.transparent_iam = ftdm_true(parm->val);
|
||||
SS7_DEBUG("Found transparent_iam %d\n", sng_ccSpan.transparent_iam);
|
||||
#endif
|
||||
} else if (!strcasecmp(parm->var, "cicbase")) {
|
||||
/**********************************************************************/
|
||||
sng_ccSpan.cicbase = atoi(parm->val);
|
||||
@@ -2907,16 +2918,17 @@ static int ftmod_ss7_fill_in_ccSpan(sng_ccSpan_t *ccSpan)
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].cic = 0;
|
||||
}
|
||||
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].infId = ccSpan->isupInf;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = ccSpan->typeCntrl;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = ccSpan->ssf;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].cld_nadi = ccSpan->cld_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].clg_nadi = ccSpan->clg_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].rdnis_nadi = ccSpan->rdnis_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].options = ccSpan->options;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].infId = ccSpan->isupInf;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].typeCntrl = ccSpan->typeCntrl;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].ssf = ccSpan->ssf;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].cld_nadi = ccSpan->cld_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].clg_nadi = ccSpan->clg_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].rdnis_nadi = ccSpan->rdnis_nadi;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].options = ccSpan->options;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].switchType = ccSpan->switchType;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].min_digits = ccSpan->min_digits;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].itx_auto_reply = ccSpan->itx_auto_reply;
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].transparent_iam = ccSpan->transparent_iam;
|
||||
|
||||
if (ccSpan->t3 == 0) {
|
||||
g_ftdm_sngss7_data.cfg.isupCkt[x].t3 = 1200;
|
||||
|
||||
@@ -950,7 +950,6 @@ static void wanpipe_read_stats(ftdm_channel_t *ftdmchan, wp_tdm_api_rx_hdr_t *rx
|
||||
static FIO_READ_FUNCTION(wanpipe_read)
|
||||
{
|
||||
int rx_len = 0;
|
||||
int myerrno = 0;
|
||||
wp_tdm_api_rx_hdr_t hdrframe;
|
||||
|
||||
memset(&hdrframe, 0, sizeof(hdrframe));
|
||||
@@ -964,7 +963,6 @@ static FIO_READ_FUNCTION(wanpipe_read)
|
||||
}
|
||||
|
||||
if (rx_len < 0) {
|
||||
myerrno = errno;
|
||||
snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "%s", strerror(errno));
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "Failed to read from sangoma device: %s (%d)\n", strerror(errno), rx_len);
|
||||
return FTDM_FAIL;
|
||||
@@ -1269,7 +1267,7 @@ static FIO_GET_ALARMS_FUNCTION(wanpipe_get_alarms)
|
||||
ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_LINK_STATUS, &sangoma_status);
|
||||
ftdmchan->alarm_flags = sangoma_status == FTDM_HW_LINK_DISCONNECTED ? FTDM_ALARM_RED : FTDM_ALARM_NONE;
|
||||
ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Link status is %d\n", sangoma_status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (alarms) {
|
||||
@@ -1293,6 +1291,7 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc
|
||||
switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_type) {
|
||||
case WP_API_EVENT_LINK_STATUS:
|
||||
{
|
||||
if (FTDM_IS_DIGITAL_CHANNEL(fchan)) {
|
||||
switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_link_status) {
|
||||
case WP_TDMAPI_EVENT_LINK_STATUS_CONNECTED:
|
||||
/* *event_id = FTDM_OOB_ALARM_CLEAR; */
|
||||
@@ -1305,6 +1304,22 @@ static __inline__ ftdm_status_t wanpipe_channel_process_event(ftdm_channel_t *fc
|
||||
};
|
||||
/* The WP_API_EVENT_ALARM event should be used to clear alarms */
|
||||
*event_id = FTDM_OOB_NOOP;
|
||||
} else {
|
||||
switch(tdm_api->wp_tdm_cmd.event.wp_tdm_api_event_link_status) {
|
||||
case WP_TDMAPI_EVENT_LINK_STATUS_CONNECTED:
|
||||
/* *event_id = FTDM_OOB_ALARM_CLEAR; */
|
||||
ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "Using analog link connected event as alarm clear\n");
|
||||
*event_id = FTDM_OOB_ALARM_CLEAR;
|
||||
fchan->alarm_flags = FTDM_ALARM_NONE;
|
||||
break;
|
||||
default:
|
||||
/* *event_id = FTDM_OOB_ALARM_TRAP; */
|
||||
ftdm_log_chan_msg(fchan, FTDM_LOG_DEBUG, "Using analog link disconnected event as alarm trap\n");
|
||||
*event_id = FTDM_OOB_ALARM_TRAP;
|
||||
fchan->alarm_flags = FTDM_ALARM_RED;
|
||||
break;
|
||||
};
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -241,12 +241,12 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_ton, ftdm_ton2str, ftdm_ton_t)
|
||||
/*! Numbering Plan Identification (NPI) */
|
||||
typedef enum {
|
||||
FTDM_NPI_UNKNOWN = 0,
|
||||
FTDM_NPI_ISDN = 1,
|
||||
FTDM_NPI_DATA = 3,
|
||||
FTDM_NPI_TELEX = 4,
|
||||
FTDM_NPI_NATIONAL = 8,
|
||||
FTDM_NPI_PRIVATE = 9,
|
||||
FTDM_NPI_RESERVED = 10,
|
||||
FTDM_NPI_ISDN,
|
||||
FTDM_NPI_DATA,
|
||||
FTDM_NPI_TELEX,
|
||||
FTDM_NPI_NATIONAL,
|
||||
FTDM_NPI_PRIVATE,
|
||||
FTDM_NPI_RESERVED,
|
||||
FTDM_NPI_INVALID
|
||||
} ftdm_npi_t;
|
||||
#define NPI_STRINGS "unknown", "ISDN", "data", "telex", "national", "private", "reserved", "invalid"
|
||||
@@ -276,12 +276,16 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_screening, ftdm_screening2str, ftdm_screening_t)
|
||||
|
||||
/*! \brief bearer capability */
|
||||
typedef enum {
|
||||
FTDM_BEARER_CAP_SPEECH = 0x00,
|
||||
FTDM_BEARER_CAP_64K_UNRESTRICTED = 0x02,
|
||||
FTDM_BEARER_CAP_3_1KHZ_AUDIO = 0x03,
|
||||
FTDM_BEARER_CAP_SPEECH = 0x00, /* Speech */
|
||||
FTDM_BEARER_CAP_UNRESTRICTED, /* Unrestricted Digital */
|
||||
FTDM_BEARER_CAP_RESTRICTED, /* Restricted Digital */
|
||||
FTDM_BEARER_CAP_3_1KHZ_AUDIO, /* 3.1 Khz Audio */
|
||||
FTDM_BEARER_CAP_7KHZ_AUDIO, /* 7 Khz Audio or Unrestricted digital w tones */
|
||||
FTDM_BEARER_CAP_15KHZ_AUDIO, /* 15 Khz Audio */
|
||||
FTDM_BEARER_CAP_VIDEO, /* Video */
|
||||
FTDM_BEARER_CAP_INVALID
|
||||
} ftdm_bearer_cap_t;
|
||||
#define BEARER_CAP_STRINGS "speech", "unrestricted-digital-information", "3.1-Khz-audio", "invalid"
|
||||
#define BEARER_CAP_STRINGS "speech", "unrestricted-digital-information", "restricted-digital-information", "3.1-Khz-audio", "7-Khz-audio", "15-Khz-audio", "video", "invalid"
|
||||
FTDM_STR2ENUM_P(ftdm_str2ftdm_bearer_cap, ftdm_bearer_cap2str, ftdm_bearer_cap_t)
|
||||
|
||||
/*! \brief user information layer 1 protocol */
|
||||
@@ -298,6 +302,11 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_usr_layer1_prot, ftdm_user_layer1_prot2str, ftdm_u
|
||||
typedef enum {
|
||||
FTDM_CPC_UNKNOWN,
|
||||
FTDM_CPC_OPERATOR,
|
||||
FTDM_CPC_OPERATOR_FRENCH,
|
||||
FTDM_CPC_OPERATOR_ENGLISH,
|
||||
FTDM_CPC_OPERATOR_GERMAN,
|
||||
FTDM_CPC_OPERATOR_RUSSIAN,
|
||||
FTDM_CPC_OPERATOR_SPANISH,
|
||||
FTDM_CPC_ORDINARY,
|
||||
FTDM_CPC_PRIORITY,
|
||||
FTDM_CPC_DATA,
|
||||
@@ -305,12 +314,14 @@ typedef enum {
|
||||
FTDM_CPC_PAYPHONE,
|
||||
FTDM_CPC_INVALID
|
||||
} ftdm_calling_party_category_t;
|
||||
#define CALLING_PARTY_CATEGORY_STRINGS "unknown", "operator", "ordinary", "priority", "data-call", "test-call", "payphone", "invalid"
|
||||
#define CALLING_PARTY_CATEGORY_STRINGS "unknown", "operator", "operator-french", "operator-english", "operator-german", "operator-russian", "operator-spanish", "ordinary", "priority", "data-call", "test-call", "payphone", "invalid"
|
||||
FTDM_STR2ENUM_P(ftdm_str2ftdm_calling_party_category, ftdm_calling_party_category2str, ftdm_calling_party_category_t)
|
||||
|
||||
/*! \brief Digit limit used in DNIS/ANI */
|
||||
#define FTDM_DIGITS_LIMIT 25
|
||||
|
||||
#define FTDM_SILENCE_VALUE(fchan) (fchan)->native_codec == FTDM_CODEC_ULAW ? 255 : (fchan)->native_codec == FTDM_CODEC_ALAW ? 0xD5 : 0x00
|
||||
|
||||
/*! \brief Number abstraction */
|
||||
typedef struct {
|
||||
char digits[FTDM_DIGITS_LIMIT];
|
||||
|
||||
@@ -131,5 +131,24 @@ FT_DECLARE(ftdm_status_t) ftdm_is_number(const char *number);
|
||||
*/
|
||||
FT_DECLARE(ftdm_status_t) ftdm_set_calling_party_category(const char *string, uint8_t *target);
|
||||
|
||||
/*!
|
||||
* \brief URL encode a buffer
|
||||
*
|
||||
* \param url buffer to convert
|
||||
* \param buf target to save converted string to
|
||||
* \param len size of buffer
|
||||
*
|
||||
* \retval pointer to converted string
|
||||
*/
|
||||
FT_DECLARE(char *) ftdm_url_encode(const char *url, char *buf, ftdm_size_t len);
|
||||
|
||||
/*!
|
||||
* \param s buffer to convert
|
||||
* \param len size of buffer
|
||||
*
|
||||
* \retval pointer to converted string
|
||||
*/
|
||||
FT_DECLARE(char *) ftdm_url_decode(char *s, ftdm_size_t *len);
|
||||
|
||||
#endif /* __FTDM_CALL_UTILS_H__ */
|
||||
|
||||
|
||||
@@ -249,6 +249,8 @@ typedef enum {
|
||||
#define FTDM_CHANNEL_IND_ACK_PENDING (1ULL << 34)
|
||||
/*!< There is someone blocking in the channel waiting for state completion */
|
||||
#define FTDM_CHANNEL_BLOCKING (1ULL << 35)
|
||||
/*!< Media is digital */
|
||||
#define FTDM_CHANNEL_DIGITAL_MEDIA (1ULL << 36)
|
||||
|
||||
#include "ftdm_state.h"
|
||||
|
||||
|
||||
@@ -273,7 +273,7 @@ TELETONE_API(int) teletone_mux_tones(teletone_generation_session_t *ts, teletone
|
||||
TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cmd)
|
||||
{
|
||||
char *data = NULL, *cur = NULL, *end = NULL;
|
||||
int var = 0, LOOPING = 0;
|
||||
int LOOPING = 0;
|
||||
|
||||
if (!cmd) {
|
||||
return -1;
|
||||
@@ -287,7 +287,6 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
|
||||
cur = data;
|
||||
|
||||
while (*cur) {
|
||||
var = 0;
|
||||
if (*cur == ' ' || *cur == '\r' || *cur == '\n') {
|
||||
cur++;
|
||||
continue;
|
||||
@@ -298,7 +297,6 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
|
||||
}
|
||||
|
||||
if (*(cur + 1) == '=') {
|
||||
var = 1;
|
||||
switch(*cur) {
|
||||
case 'c':
|
||||
ts->channels = atoi(cur + 2);
|
||||
|
||||
@@ -242,7 +242,7 @@ static void default_logger(char *file, const char *func, int line, int level, ch
|
||||
|
||||
vsnprintf(data, sizeof(data), fmt, ap);
|
||||
|
||||
fprintf(globals.log_stream, "%s:%d %s() %s", file, line, func, data);
|
||||
fprintf(globals.log_stream, "%s:%d %s() %s", fp, line, func, data);
|
||||
|
||||
va_end(ap);
|
||||
|
||||
@@ -997,9 +997,9 @@ static int on_commands(void *user_data, ikspak *pak)
|
||||
uint8_t is_result = strcasecmp(type, "result") ? 0 : 1;
|
||||
uint8_t is_error = strcasecmp(type, "error") ? 0 : 1;
|
||||
iks *xml, *xsession, *xerror = NULL, *xredir = NULL;
|
||||
struct iks_tag* tmp;
|
||||
|
||||
xml = iks_child (pak->x);
|
||||
tmp = (struct iks_tag*) xml;
|
||||
|
||||
if (is_error) {
|
||||
if ((xerror = working_find(xml, "error"))) {
|
||||
char *code = iks_find_attrib(xerror, "code");
|
||||
|
||||
@@ -321,7 +321,7 @@ static char *my_strdup (const char *s)
|
||||
TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cmd)
|
||||
{
|
||||
char *data = NULL, *cur = NULL, *end = NULL;
|
||||
int var = 0, LOOPING = 0;
|
||||
int LOOPING = 0;
|
||||
|
||||
if (!cmd) {
|
||||
return -1;
|
||||
@@ -335,7 +335,6 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
|
||||
cur = data;
|
||||
|
||||
while (*cur) {
|
||||
var = 0;
|
||||
if (*cur == ' ' || *cur == '\r' || *cur == '\n') {
|
||||
cur++;
|
||||
continue;
|
||||
@@ -346,7 +345,6 @@ TELETONE_API(int) teletone_run(teletone_generation_session_t *ts, const char *cm
|
||||
}
|
||||
|
||||
if (*(cur + 1) == '=') {
|
||||
var = 1;
|
||||
switch(*cur) {
|
||||
case 'c':
|
||||
ts->channels = atoi(cur + 2);
|
||||
|
||||
@@ -1 +1 @@
|
||||
Tue Mar 22 15:01:49 CDT 2011
|
||||
Wed Apr 27 11:49:37 CDT 2011
|
||||
|
||||
@@ -182,7 +182,7 @@ int time_d(char const **ss,
|
||||
issize_t msg_date_d(char const **ss, msg_time_t *date)
|
||||
{
|
||||
char const *s = *ss;
|
||||
char const *wkday;
|
||||
//char const *wkday;
|
||||
char const *tz;
|
||||
unsigned long day, year, hour, min, sec;
|
||||
int mon;
|
||||
@@ -190,7 +190,8 @@ issize_t msg_date_d(char const **ss, msg_time_t *date)
|
||||
if (!IS_TOKEN(*s) || !date)
|
||||
return -1;
|
||||
|
||||
wkday = s; skip_token(&s); if (*s == ',') s++;
|
||||
//wkday = s;
|
||||
skip_token(&s); if (*s == ',') s++;
|
||||
while (IS_LWS(*s)) s++;
|
||||
|
||||
if (is_digit(*s)) {
|
||||
|
||||
@@ -550,7 +550,7 @@ int nea_server_shutdown(nea_server_t *nes,
|
||||
int retry_after)
|
||||
{
|
||||
nea_sub_t *s;
|
||||
int status = 200;
|
||||
// int status = 200;
|
||||
int in_callback;
|
||||
|
||||
if (nes == NULL)
|
||||
@@ -576,8 +576,8 @@ int nea_server_shutdown(nea_server_t *nes,
|
||||
TAG_IF(!retry_after, NEATAG_REASON("deactivated")),
|
||||
TAG_IF(retry_after, NEATAG_RETRY_AFTER(retry_after)),
|
||||
TAG_END());
|
||||
else
|
||||
status = 180;
|
||||
//else
|
||||
//status = 180;
|
||||
}
|
||||
|
||||
nes->nes_in_callback = in_callback;
|
||||
|
||||
@@ -2307,7 +2307,7 @@ int agent_init_via(nta_agent_t *self, tport_t *primaries, int use_maddr)
|
||||
|
||||
/* Set via fields for the tports */
|
||||
for (tp = primaries; tp; tp = tport_next(tp)) {
|
||||
int maddr, first_via;
|
||||
int maddr;
|
||||
tp_name_t tpn[1];
|
||||
char const *comp = NULL;
|
||||
|
||||
@@ -2339,8 +2339,6 @@ int agent_init_via(nta_agent_t *self, tport_t *primaries, int use_maddr)
|
||||
|
||||
if (tport_has_tls(tp)) self->sa_tport_tls = 1;
|
||||
|
||||
first_via = 1;
|
||||
|
||||
ai = tport_get_address(tp);
|
||||
|
||||
for (; ai; ai = ai->ai_next) {
|
||||
|
||||
@@ -1879,14 +1879,14 @@ int nua_registration_process_request(nua_registration_t *list,
|
||||
nta_incoming_t *irq,
|
||||
sip_t const *sip)
|
||||
{
|
||||
sip_call_id_t *i;
|
||||
//sip_call_id_t *i;
|
||||
nua_registration_t *nr;
|
||||
|
||||
if (!outbound_targeted_request(sip))
|
||||
return 0;
|
||||
|
||||
/* Process by outbound... */
|
||||
i = sip->sip_call_id;
|
||||
//i = sip->sip_call_id;
|
||||
|
||||
for (nr = list; nr; nr = nr->nr_next) {
|
||||
outbound_t *ob = nr->nr_ob;
|
||||
|
||||
@@ -1743,7 +1743,7 @@ static int nua_prack_client_request(nua_client_request_t *cr,
|
||||
nua_client_request_t *cri;
|
||||
int offer_sent = 0, answer_sent = 0, retval;
|
||||
int status = 0; char const *phrase = "PRACK Sent";
|
||||
uint32_t rseq = 0;
|
||||
//uint32_t rseq = 0;
|
||||
|
||||
if (du == NULL) /* Call terminated */
|
||||
return nua_client_return(cr, SIP_481_NO_TRANSACTION, msg);
|
||||
@@ -1754,8 +1754,8 @@ static int nua_prack_client_request(nua_client_request_t *cr,
|
||||
|
||||
cri = du->du_cr;
|
||||
|
||||
if (sip->sip_rack)
|
||||
rseq = sip->sip_rack->ra_response;
|
||||
// if (sip->sip_rack)
|
||||
// rseq = sip->sip_rack->ra_response;
|
||||
|
||||
if (cri->cr_offer_recv && !cri->cr_answer_sent) {
|
||||
if (nh->nh_soa == NULL)
|
||||
|
||||
@@ -1883,12 +1883,11 @@ static char *next(char **message, const char *sep, const char *strip)
|
||||
|
||||
static int parsing_error(sdp_parser_t *p, char const *fmt, ...)
|
||||
{
|
||||
int n;
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
|
||||
memset(p->pr_error, 0, sizeof(p->pr_error));
|
||||
n = vsnprintf(p->pr_error, sizeof(p->pr_error), fmt, ap);
|
||||
vsnprintf(p->pr_error, sizeof(p->pr_error), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
p->pr_ok = 0;
|
||||
|
||||
@@ -685,9 +685,8 @@ static void printing_error(sdp_printer_t *p, const char *fmt, ...)
|
||||
va_list ap;
|
||||
|
||||
if (p->pr_ok) {
|
||||
int n;
|
||||
va_start(ap, fmt);
|
||||
n = vsnprintf(p->pr_buffer, p->pr_bsiz, fmt, ap);
|
||||
vsnprintf(p->pr_buffer, p->pr_bsiz, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
|
||||
@@ -1010,7 +1010,6 @@ int soa_sdp_mode_set(sdp_session_t const *user,
|
||||
int retval = 0, i, j;
|
||||
int hold_all;
|
||||
int inactive_all;
|
||||
int inactive = 0;
|
||||
char const *hold_media = NULL;
|
||||
sdp_mode_t send_mode, recv_mode;
|
||||
|
||||
@@ -1029,7 +1028,6 @@ int soa_sdp_mode_set(sdp_session_t const *user,
|
||||
|
||||
for (sm = session->sdp_media; sm; sm = sm->m_next, rm = rm_next, i++) {
|
||||
rm_next = rm ? rm->m_next : NULL;
|
||||
inactive = 0;
|
||||
|
||||
if (sm->m_rejected)
|
||||
continue;
|
||||
|
||||
@@ -3636,6 +3636,10 @@ sres_decode_msg(sres_resolver_t *res,
|
||||
m_get_domain(name, sizeof(name), m, 0); /* Query domain */
|
||||
qtype = m_get_uint16(m); /* Query type */
|
||||
qclass = m_get_uint16(m); /* Query class */
|
||||
if (qtype && qclass) {
|
||||
/* XXX: never mind these useless check, this is done to make compiler happy about unused value */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (m->m_error) {
|
||||
|
||||
@@ -673,12 +673,12 @@ static stun_request_t *stun_request_create(stun_discovery_t *sd)
|
||||
|
||||
void stun_request_destroy(stun_request_t *req)
|
||||
{
|
||||
stun_handle_t *sh;
|
||||
//stun_handle_t *sh;
|
||||
assert(req);
|
||||
|
||||
enter;
|
||||
|
||||
sh = req->sr_handle;
|
||||
//sh = req->sr_handle;
|
||||
|
||||
if (x_is_inserted(req, sr))
|
||||
x_remove(req, sr);
|
||||
@@ -1140,14 +1140,14 @@ static stun_discovery_t *stun_discovery_create(stun_handle_t *sh,
|
||||
|
||||
static int stun_discovery_destroy(stun_discovery_t *sd)
|
||||
{
|
||||
stun_handle_t *sh;
|
||||
//stun_handle_t *sh;
|
||||
|
||||
enter;
|
||||
|
||||
if (!sd)
|
||||
return errno = EFAULT, -1;
|
||||
|
||||
sh = sd->sd_handle;
|
||||
//sh = sd->sd_handle;
|
||||
|
||||
if (sd->sd_timer)
|
||||
su_timer_destroy(sd->sd_timer), sd->sd_timer = NULL;
|
||||
@@ -1883,7 +1883,7 @@ static int process_test_lifetime(stun_request_t *req, stun_msg_t *binding_respon
|
||||
stun_discovery_t *sd = req->sr_discovery;
|
||||
stun_request_t *new;
|
||||
stun_handle_t *sh = req->sr_handle;
|
||||
su_localinfo_t *li;
|
||||
//su_localinfo_t *li;
|
||||
su_sockaddr_t *sa;
|
||||
su_timer_t *sockfdy_timer = NULL;
|
||||
su_socket_t sockfdy = sd->sd_socket2;
|
||||
@@ -1954,7 +1954,7 @@ static int process_test_lifetime(stun_request_t *req, stun_msg_t *binding_respon
|
||||
/* Rock, we come from sockfdx */
|
||||
process_binding_request(req, binding_response);
|
||||
|
||||
li = &req->sr_localinfo;
|
||||
//li = &req->sr_localinfo;
|
||||
sa = req->sr_local_addr;
|
||||
stun_free_message(binding_response);
|
||||
|
||||
@@ -1981,7 +1981,7 @@ static int process_test_lifetime(stun_request_t *req, stun_msg_t *binding_respon
|
||||
|
||||
static int action_bind(stun_request_t *req, stun_msg_t *binding_response)
|
||||
{
|
||||
su_localinfo_t *li = NULL;
|
||||
//su_localinfo_t *li = NULL;
|
||||
su_sockaddr_t *sa = NULL;
|
||||
stun_discovery_t *sd = req->sr_discovery;
|
||||
stun_handle_t *sh = req->sr_handle;
|
||||
@@ -1992,7 +1992,7 @@ static int action_bind(stun_request_t *req, stun_msg_t *binding_response)
|
||||
|
||||
process_binding_request(req, binding_response);
|
||||
|
||||
li = &req->sr_localinfo;
|
||||
//li = &req->sr_localinfo;
|
||||
sa = req->sr_local_addr;
|
||||
|
||||
memcpy(sd->sd_addr_seen_outside, sa, sizeof(su_sockaddr_t));
|
||||
@@ -3039,7 +3039,7 @@ int stun_process_request(su_socket_t s, stun_msg_t *req,
|
||||
su_sockaddr_t mod_addr[1] = {{ 0 }}, src_addr[1] = {{ 0 }}, chg_addr[1] = {{ 0 }};
|
||||
stun_attr_t *tmp, m_attr[1], s_attr[1], c_attr[1], **p;
|
||||
su_sockaddr_t to_addr;
|
||||
int c, i;
|
||||
int i;
|
||||
|
||||
tmp = stun_get_attr(req->stun_attr, RESPONSE_ADDRESS);
|
||||
|
||||
@@ -3071,20 +3071,20 @@ int stun_process_request(su_socket_t s, stun_msg_t *req,
|
||||
/* SOURCE-ADDRESS depends on CHANGE_REQUEST */
|
||||
tmp = stun_get_attr(req->stun_attr, CHANGE_REQUEST);
|
||||
if (!tmp) {
|
||||
c = 0;
|
||||
//c = 0;
|
||||
}
|
||||
else {
|
||||
switch (((stun_attr_changerequest_t *) tmp->pattr)->value) {
|
||||
case STUN_CR_CHANGE_IP:
|
||||
c = 1;
|
||||
//c = 1;
|
||||
break;
|
||||
|
||||
case STUN_CR_CHANGE_PORT:
|
||||
c = 2;
|
||||
//c = 2;
|
||||
break;
|
||||
|
||||
case STUN_CR_CHANGE_IP | STUN_CR_CHANGE_PORT: /* bitwise or */
|
||||
c = 3;
|
||||
//c = 3;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -163,7 +163,10 @@ stun_dns_lookup_t *stun_dns_lookup(stun_magic_t *magic,
|
||||
query = sres_query(self->stun_sres, priv_sres_cb, self,
|
||||
sres_type_srv,
|
||||
srvname);
|
||||
}
|
||||
if (query) {
|
||||
/* TODO Just so compiler doesn't give error */
|
||||
}
|
||||
}
|
||||
else {
|
||||
su_free(NULL, self), self = NULL;
|
||||
}
|
||||
|
||||
@@ -429,13 +429,13 @@ void *sub_alloc(su_home_t *home,
|
||||
|
||||
if (sub == NULL || 3 * sub->sub_used > 2 * sub->sub_n) {
|
||||
/* Resize the hash table */
|
||||
size_t i, n, n2, used;
|
||||
size_t i, n, n2;
|
||||
su_block_t *b2;
|
||||
|
||||
if (sub)
|
||||
n = home->suh_blocks->sub_n, n2 = 4 * n + 3, used = sub->sub_used;
|
||||
n = home->suh_blocks->sub_n, n2 = 4 * n + 3; //, used = sub->sub_used;
|
||||
else
|
||||
n = 0, n2 = SUB_N, used = 0;
|
||||
n = 0, n2 = SUB_N; //, used = 0;
|
||||
|
||||
#if 0
|
||||
printf("su_alloc(home = %p): realloc block hash of size %d\n", home, n2);
|
||||
|
||||
@@ -194,7 +194,8 @@ static void li_sort(su_localinfo_t *i, su_localinfo_t **rresult);
|
||||
int su_getlocalinfo(su_localinfo_t const *hints,
|
||||
su_localinfo_t **return_localinfo)
|
||||
{
|
||||
int error = 0, ip4 = 0, ip6 = 0;
|
||||
int error = 0, ip4 = 0;
|
||||
int ip6 = 0;
|
||||
su_localinfo_t *result = NULL, **rr = &result;
|
||||
su_localinfo_t hh[1] = {{ 0 }};
|
||||
|
||||
@@ -231,7 +232,11 @@ int su_getlocalinfo(su_localinfo_t const *hints,
|
||||
break;
|
||||
|
||||
case 0:
|
||||
ip6 = ip4 = 1;
|
||||
ip4 = 1;
|
||||
#if SU_HAVE_IN6
|
||||
ip6 = 1;
|
||||
#endif
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -260,6 +265,9 @@ int su_getlocalinfo(su_localinfo_t const *hints,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ip6) {
|
||||
/* Required to make compiler happy */
|
||||
}
|
||||
if (!result)
|
||||
error = ELI_NOADDRESS;
|
||||
|
||||
|
||||
@@ -478,7 +478,7 @@ size_t su_memspn(const void *mem, size_t memlen,
|
||||
* of bytes not in @a reject.
|
||||
*
|
||||
* @param mem pointer to memory area
|
||||
* @param memlen size of @a mem in bytes
|
||||
* @param memlen size of @a mem in bytes
|
||||
* @param reject pointer to table containing bytes to reject
|
||||
* @param rejectlen size of @a reject table
|
||||
*
|
||||
|
||||
@@ -1595,7 +1595,7 @@ int tport_bind_server(tport_master_t *mr,
|
||||
{
|
||||
char hostname[TPORT_HOSTPORTSIZE];
|
||||
char const *canon = NULL, *host, *service;
|
||||
int error = 0, not_supported, family = 0;
|
||||
int error = 0, family = 0;
|
||||
tport_primary_t *pri = NULL, **tbf;
|
||||
su_addrinfo_t *ai, *res = NULL;
|
||||
unsigned port, port0, port1, old;
|
||||
@@ -1691,8 +1691,6 @@ int tport_bind_server(tport_master_t *mr,
|
||||
break;
|
||||
}
|
||||
|
||||
not_supported = 0;
|
||||
|
||||
if (port0 == 0 && port == 0) {
|
||||
port = port1 = ntohs(su->su_port);
|
||||
assert(public != tport_type_server || port != 0);
|
||||
|
||||
@@ -170,10 +170,10 @@ void tport_stun_bind_cb(tport_primary_t *pri,
|
||||
stun_action_t action,
|
||||
stun_state_t event)
|
||||
{
|
||||
tport_master_t *mr;
|
||||
//tport_master_t *mr;
|
||||
SU_DEBUG_3(("%s: %s\n", __func__, stun_str_state(event)));
|
||||
|
||||
mr = pri->pri_master;
|
||||
//mr = pri->pri_master;
|
||||
|
||||
if (event == stun_discovery_done) {
|
||||
tport_stun_bind_done(pri, sh, sd);
|
||||
|
||||
@@ -567,7 +567,7 @@ static
|
||||
int _url_d(url_t *url, char *s)
|
||||
{
|
||||
size_t n, p;
|
||||
char *s0, rest_c, *host, *user;
|
||||
char rest_c, *host, *user;
|
||||
int have_authority = 1;
|
||||
|
||||
memset(url, 0, sizeof(*url));
|
||||
@@ -578,8 +578,6 @@ int _url_d(url_t *url, char *s)
|
||||
return 0;
|
||||
}
|
||||
|
||||
s0 = s;
|
||||
|
||||
n = strcspn(s, ":/?#");
|
||||
|
||||
if (n && s[n] == ':') {
|
||||
|
||||
@@ -1 +1 @@
|
||||
Mon Jun 7 20:09:38 EDT 2010
|
||||
Wed May 4 10:03:23 CDT 2011
|
||||
|
||||
@@ -165,10 +165,10 @@ SPAN_DECLARE(int) plc_fillin(plc_state_t *s, int16_t amp[], int len)
|
||||
float old_weight;
|
||||
float new_weight;
|
||||
float gain;
|
||||
int16_t *orig_amp;
|
||||
//int16_t *orig_amp;
|
||||
int orig_len;
|
||||
|
||||
orig_amp = amp;
|
||||
//orig_amp = amp;
|
||||
orig_len = len;
|
||||
if (s->missing_samples == 0)
|
||||
{
|
||||
|
||||
@@ -799,7 +799,11 @@ SPAN_DECLARE(int) t38_core_send_indicator(t38_core_state_t *s, int indicator)
|
||||
return len;
|
||||
}
|
||||
span_log(&s->logging, SPAN_LOG_FLOW, "Tx %5d: indicator %s\n", s->tx_seq_no, t38_indicator_to_str(indicator));
|
||||
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, transmissions);
|
||||
if (s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, transmissions) < 0)
|
||||
{
|
||||
span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Tx Packet Handler Failure\n");
|
||||
return -1;
|
||||
}
|
||||
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
|
||||
delay = modem_startup_time[indicator].training;
|
||||
if (s->allow_for_tep)
|
||||
@@ -837,7 +841,11 @@ SPAN_DECLARE(int) t38_core_send_data(t38_core_state_t *s, int data_type, int fie
|
||||
span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len);
|
||||
return len;
|
||||
}
|
||||
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]);
|
||||
if (s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]) < 0)
|
||||
{
|
||||
span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Tx Packet Handler Failure\n");
|
||||
return -1;
|
||||
}
|
||||
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
|
||||
return 0;
|
||||
}
|
||||
@@ -853,7 +861,11 @@ SPAN_DECLARE(int) t38_core_send_data_multi_field(t38_core_state_t *s, int data_t
|
||||
span_log(&s->logging, SPAN_LOG_FLOW, "T.38 data len is %d\n", len);
|
||||
return len;
|
||||
}
|
||||
s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]);
|
||||
if (s->tx_packet_handler(s, s->tx_packet_user_data, buf, len, s->category_control[category]) < 0)
|
||||
{
|
||||
span_log(&s->logging, SPAN_LOG_PROTOCOL_WARNING, "Tx Packet Handler Failure\n");
|
||||
return -1;
|
||||
}
|
||||
s->tx_seq_no = (s->tx_seq_no + 1) & 0xFFFF;
|
||||
return 0;
|
||||
}
|
||||
|
||||
+106
-26
@@ -63,10 +63,18 @@
|
||||
#include "spandsp/v17rx.h"
|
||||
#include "spandsp/t4_rx.h"
|
||||
#include "spandsp/t4_tx.h"
|
||||
#if defined(SPANDSP_SUPPORT_T85)
|
||||
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85)
|
||||
#include "spandsp/t81_t82_arith_coding.h"
|
||||
#endif
|
||||
#if defined(SPANDSP_SUPPORT_T85)
|
||||
#include "spandsp/t85.h"
|
||||
#endif
|
||||
#if defined(SPANDSP_SUPPORT_T42)
|
||||
#include "spandsp/t42.h"
|
||||
#endif
|
||||
#if defined(SPANDSP_SUPPORT_T43)
|
||||
#include "spandsp/t43.h"
|
||||
#endif
|
||||
#include "spandsp/t4_t6_decode.h"
|
||||
#include "spandsp/t4_t6_encode.h"
|
||||
#include "spandsp/t30_fcf.h"
|
||||
@@ -78,10 +86,18 @@
|
||||
#include "spandsp/t38_terminal.h"
|
||||
|
||||
#include "spandsp/private/logging.h"
|
||||
#if defined(SPANDSP_SUPPORT_T85)
|
||||
#if defined(SPANDSP_SUPPORT_T42) || defined(SPANDSP_SUPPORT_T43) | defined(SPANDSP_SUPPORT_T85)
|
||||
#include "spandsp/private/t81_t82_arith_coding.h"
|
||||
#endif
|
||||
#if defined(SPANDSP_SUPPORT_T85)
|
||||
#include "spandsp/private/t85.h"
|
||||
#endif
|
||||
#if defined(SPANDSP_SUPPORT_T42)
|
||||
#include "spandsp/private/t42.h"
|
||||
#endif
|
||||
#if defined(SPANDSP_SUPPORT_T43)
|
||||
#include "spandsp/private/t43.h"
|
||||
#endif
|
||||
#include "spandsp/private/t4_t6_decode.h"
|
||||
#include "spandsp/private/t4_t6_encode.h"
|
||||
#include "spandsp/private/t4_rx.h"
|
||||
@@ -629,7 +645,9 @@ static int set_no_signal(t38_terminal_state_t *s)
|
||||
|
||||
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_REGULAR_INDICATORS))
|
||||
{
|
||||
t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL);
|
||||
if ((delay = t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
s->t38_fe.timed_step = T38_TIMED_STEP_NO_SIGNAL;
|
||||
#if 0
|
||||
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_2S_REGULAR_INDICATORS))
|
||||
@@ -641,7 +659,9 @@ static int set_no_signal(t38_terminal_state_t *s)
|
||||
return s->t38_fe.ms_per_tx_chunk*1000;
|
||||
}
|
||||
/*endif*/
|
||||
delay = t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL);
|
||||
if ((delay = t38_core_send_indicator(&s->t38_fe.t38, T38_IND_NO_SIGNAL)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
s->t38_fe.timed_step = T38_TIMED_STEP_NONE;
|
||||
return delay;
|
||||
}
|
||||
@@ -649,7 +669,11 @@ static int set_no_signal(t38_terminal_state_t *s)
|
||||
|
||||
static int stream_no_signal(t38_terminal_state_t *s)
|
||||
{
|
||||
t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL);
|
||||
int delay;
|
||||
|
||||
if ((delay = t38_core_send_indicator(&s->t38_fe.t38, 0x100 | T38_IND_NO_SIGNAL)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
#if 0
|
||||
if (s->t38_fe.timeout_tx_samples && s->t38_fe.next_tx_samples >= s->t38_fe.timeout_tx_samples)
|
||||
s->t38_fe.timed_step = T38_TIMED_STEP_NONE;
|
||||
@@ -663,6 +687,7 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
{
|
||||
t38_terminal_front_end_state_t *fe;
|
||||
uint8_t buf[MAX_OCTETS_PER_UNPACED_CHUNK + 50];
|
||||
int res;
|
||||
int delay;
|
||||
int len;
|
||||
|
||||
@@ -674,9 +699,15 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
case T38_TIMED_STEP_NON_ECM_MODEM:
|
||||
/* Create a 75ms silence */
|
||||
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
|
||||
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
|
||||
{
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
}
|
||||
else
|
||||
{
|
||||
delay = 75000;
|
||||
}
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2;
|
||||
#if 0
|
||||
@@ -690,7 +721,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
#if 0
|
||||
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_REGULAR_INDICATORS))
|
||||
{
|
||||
delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
if (fe->next_tx_samples >= fe->timeout_tx_samples)
|
||||
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
|
||||
/*endif*/
|
||||
@@ -698,7 +731,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
}
|
||||
/*endif*/
|
||||
#endif
|
||||
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
|
||||
break;
|
||||
case T38_TIMED_STEP_NON_ECM_MODEM_3:
|
||||
@@ -731,7 +766,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
else
|
||||
{
|
||||
/* If we are sending quickly there seems no point in doing any padding */
|
||||
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
|
||||
if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
|
||||
delay = 0;
|
||||
break;
|
||||
@@ -739,7 +776,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
/*endif*/
|
||||
}
|
||||
/*endif*/
|
||||
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
|
||||
if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
delay = bits_to_us(s, 8*len);
|
||||
break;
|
||||
case T38_TIMED_STEP_NON_ECM_MODEM_4:
|
||||
@@ -750,7 +789,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
{
|
||||
len += fe->non_ecm_trailer_bytes;
|
||||
memset(buf, 0, len);
|
||||
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END);
|
||||
if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_SIG_END, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA_END)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_5;
|
||||
/* Allow a bit more time than the data will take to play out, to ensure the far ATA does not
|
||||
cut things short. */
|
||||
@@ -763,7 +804,9 @@ static int stream_non_ecm(t38_terminal_state_t *s)
|
||||
}
|
||||
/*endif*/
|
||||
memset(buf, 0, len);
|
||||
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA);
|
||||
if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_T4_NON_ECM_DATA, buf, len, T38_PACKET_CATEGORY_IMAGE_DATA)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
delay = bits_to_us(s, 8*len);
|
||||
break;
|
||||
case T38_TIMED_STEP_NON_ECM_MODEM_5:
|
||||
@@ -785,6 +828,7 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
t38_data_field_t data_fields[2];
|
||||
int category;
|
||||
int previous;
|
||||
int res;
|
||||
int delay;
|
||||
int i;
|
||||
|
||||
@@ -796,9 +840,15 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
case T38_TIMED_STEP_HDLC_MODEM:
|
||||
/* Create a 75ms silence */
|
||||
if (fe->t38.current_tx_indicator != T38_IND_NO_SIGNAL)
|
||||
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
|
||||
{
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
}
|
||||
else
|
||||
{
|
||||
delay = 75000;
|
||||
}
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_2;
|
||||
#if 0
|
||||
@@ -814,7 +864,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
#if 0
|
||||
if ((s->t38_fe.chunking_modes & T38_CHUNKING_SEND_REGULAR_INDICATORS))
|
||||
{
|
||||
delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, 0x100 | fe->next_tx_indicator)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
if (fe->next_tx_samples >= fe->timeout_tx_samples)
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
|
||||
/*endif*/
|
||||
@@ -822,8 +874,10 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
}
|
||||
/*endif*/
|
||||
#endif
|
||||
delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)
|
||||
+ t38_core_send_flags_delay(&fe->t38, fe->next_tx_indicator);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, fe->next_tx_indicator)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
delay += t38_core_send_flags_delay(&fe->t38, fe->next_tx_indicator);
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
|
||||
break;
|
||||
case T38_TIMED_STEP_HDLC_MODEM_3:
|
||||
@@ -852,7 +906,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
data_fields[1].field = NULL;
|
||||
data_fields[1].field_len = 0;
|
||||
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
|
||||
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
|
||||
if ((res = t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
|
||||
/* We add a bit of extra time here, as with some implementations
|
||||
the carrier falling too abruptly causes data loss. */
|
||||
@@ -868,7 +924,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
data_fields[1].field = NULL;
|
||||
data_fields[1].field_len = 0;
|
||||
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
|
||||
t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category);
|
||||
if ((res = t38_core_send_data_multi_field(&fe->t38, fe->current_tx_data_type, data_fields, 2, category)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
|
||||
delay = bits_to_us(s, i*8 + fe->hdlc_tx.extra_bits);
|
||||
}
|
||||
@@ -877,14 +935,18 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
}
|
||||
/*endif*/
|
||||
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
|
||||
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category);
|
||||
if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = fe->octets_per_data_packet;
|
||||
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
|
||||
t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category);
|
||||
if ((res = t38_core_send_data(&fe->t38, fe->current_tx_data_type, T38_FIELD_HDLC_DATA, &fe->hdlc_tx.buf[fe->hdlc_tx.ptr], i, category)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->hdlc_tx.ptr += i;
|
||||
}
|
||||
/*endif*/
|
||||
@@ -901,7 +963,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
{
|
||||
/* End of transmission */
|
||||
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA_END : T38_PACKET_CATEGORY_IMAGE_DATA_END;
|
||||
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, category);
|
||||
if ((res = t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0, category)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_5;
|
||||
/* We add a bit of extra time here, as with some implementations
|
||||
the carrier falling too abruptly causes data loss. */
|
||||
@@ -922,7 +986,9 @@ static int stream_hdlc(t38_terminal_state_t *s)
|
||||
/*endif*/
|
||||
/* Finish the current frame off, and prepare for the next one. */
|
||||
category = (s->t38_fe.current_tx_data_type == T38_DATA_V21) ? T38_PACKET_CATEGORY_CONTROL_DATA : T38_PACKET_CATEGORY_IMAGE_DATA;
|
||||
t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category);
|
||||
if ((res = t38_core_send_data(&fe->t38, previous, T38_FIELD_HDLC_FCS_OK, NULL, 0, category)) < 0)
|
||||
return res;
|
||||
/*endif*/
|
||||
fe->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
|
||||
/* We should now wait enough time for everything to clear through an analogue modem at the far end. */
|
||||
delay = bits_to_us(s, fe->hdlc_tx.extra_bits);
|
||||
@@ -955,14 +1021,18 @@ static int stream_ced(t38_terminal_state_t *s)
|
||||
of silence, starting the delay with a no signal indication makes sense.
|
||||
We do need a 200ms delay, as that is a specification requirement. */
|
||||
fe->timed_step = T38_TIMED_STEP_CED_2;
|
||||
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
delay = 200000;
|
||||
fe->next_tx_samples = fe->samples;
|
||||
break;
|
||||
case T38_TIMED_STEP_CED_2:
|
||||
/* Initial 200ms delay over. Send the CED indicator */
|
||||
fe->timed_step = T38_TIMED_STEP_CED_3;
|
||||
delay = t38_core_send_indicator(&fe->t38, T38_IND_CED);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_CED)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
fe->current_tx_data_type = T38_DATA_NONE;
|
||||
break;
|
||||
case T38_TIMED_STEP_CED_3:
|
||||
@@ -994,7 +1064,9 @@ static int stream_cng(t38_terminal_state_t *s)
|
||||
be sending 200ms of silence, according to T.30, starting that delay with
|
||||
a no signal indication makes sense. */
|
||||
fe->timed_step = T38_TIMED_STEP_CNG_2;
|
||||
delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_NO_SIGNAL)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
delay = 200000;
|
||||
fe->next_tx_samples = fe->samples;
|
||||
break;
|
||||
@@ -1003,7 +1075,9 @@ static int stream_cng(t38_terminal_state_t *s)
|
||||
coming the other way interrupts it, or a long timeout controlled by the T.30 engine
|
||||
expires. */
|
||||
fe->timed_step = T38_TIMED_STEP_NONE;
|
||||
delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG);
|
||||
if ((delay = t38_core_send_indicator(&fe->t38, T38_IND_CNG)) < 0)
|
||||
return delay;
|
||||
/*endif*/
|
||||
fe->current_tx_data_type = T38_DATA_NONE;
|
||||
return delay;
|
||||
}
|
||||
@@ -1067,6 +1141,12 @@ SPAN_DECLARE(int) t38_terminal_send_timeout(t38_terminal_state_t *s, int samples
|
||||
break;
|
||||
}
|
||||
/*endswitch*/
|
||||
if (delay < 0)
|
||||
{
|
||||
t30_terminate(&s->t30);
|
||||
return TRUE;
|
||||
}
|
||||
/*endif*/
|
||||
fe->next_tx_samples += us_to_samples(delay);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -297,7 +297,7 @@ static inline char *strndup_lite(const char *s, size_t n)
|
||||
#define sqliteMalloc(x) zmalloc(x)//sqlite3Malloc(x,1)
|
||||
#define sqliteMallocRaw(x) malloc(x)//sqlite3MallocRaw(x,1)
|
||||
#define sqliteRealloc(x,y) realloc(x, y)//sqlite3Realloc(x,y)
|
||||
#define sqliteStrDup(x) strdup(x)//sqlite3StrDup(x)
|
||||
#define sqliteStrDup(x) (x?strdup(x):NULL)//sqlite3StrDup(x)
|
||||
#define sqliteStrNDup(x,y) strndup_lite(x,y) //sqlite3StrNDup(x,y)
|
||||
#define sqliteReallocOrFree(x,y) sqlite3ReallocOrFree(x,y)
|
||||
|
||||
|
||||
+13
-3
@@ -76,6 +76,7 @@ struct stfu_instance {
|
||||
uint32_t miss_count;
|
||||
uint32_t max_plc;
|
||||
uint32_t qlen;
|
||||
uint32_t most_qlen;
|
||||
uint32_t max_qlen;
|
||||
uint32_t orig_qlen;
|
||||
uint32_t packet_count;
|
||||
@@ -136,6 +137,11 @@ int32_t stfu_n_get_drift(stfu_instance_t *i)
|
||||
return i->ts_drift;
|
||||
}
|
||||
|
||||
int32_t stfu_n_get_most_qlen(stfu_instance_t *i)
|
||||
{
|
||||
return i->most_qlen;
|
||||
}
|
||||
|
||||
void stfu_global_set_logger(stfu_logger_t logger)
|
||||
{
|
||||
if (logger) {
|
||||
@@ -253,6 +259,10 @@ stfu_status_t stfu_n_resize(stfu_instance_t *i, uint32_t qlen)
|
||||
s = stfu_n_resize_aqueue(&i->b_queue, qlen);
|
||||
s = stfu_n_resize_aqueue(&i->c_queue, qlen);
|
||||
|
||||
if (qlen > i->most_qlen) {
|
||||
i->most_qlen = qlen;
|
||||
}
|
||||
|
||||
i->qlen = qlen;
|
||||
i->max_plc = 5;
|
||||
i->last_frame = NULL;
|
||||
@@ -506,9 +516,9 @@ stfu_status_t stfu_n_add_data(stfu_instance_t *i, uint32_t ts, uint32_t pt, void
|
||||
i->diff_total += i->diff;
|
||||
|
||||
if ((i->period_packet_in_count > i->period_time)) {
|
||||
uint32_t avg;
|
||||
//uint32_t avg;
|
||||
|
||||
avg = i->diff_total / least1(i->period_packet_in_count);
|
||||
//avg = i->diff_total / least1(i->period_packet_in_count);
|
||||
|
||||
i->period_packet_in_count = 0;
|
||||
|
||||
@@ -904,7 +914,7 @@ static void default_logger(const char *file, const char *func, int line, int lev
|
||||
ret = stfu_vasprintf(&data, fmt, ap);
|
||||
|
||||
if (ret != -1) {
|
||||
fprintf(stderr, "[%s] %s:%d %s() %s", LEVEL_NAMES[level], file, line, func, data);
|
||||
fprintf(stderr, "[%s] %s:%d %s() %s", LEVEL_NAMES[level], fp, line, func, data);
|
||||
free(data);
|
||||
}
|
||||
|
||||
|
||||
@@ -188,6 +188,7 @@ stfu_status_t stfu_n_sync(stfu_instance_t *i, uint32_t packets);
|
||||
void stfu_n_call_me(stfu_instance_t *i, stfu_n_call_me_t callback, void *udata);
|
||||
void stfu_n_debug(stfu_instance_t *i, const char *name);
|
||||
int32_t stfu_n_get_drift(stfu_instance_t *i);
|
||||
int32_t stfu_n_get_most_qlen(stfu_instance_t *i);
|
||||
|
||||
#define stfu_im_done(i) stfu_n_add_data(i, 0, NULL, 0, 0, 1)
|
||||
#define stfu_n_eat(i,t,p,d,l,tt) stfu_n_add_data(i, t, p, d, l, tt, 0)
|
||||
|
||||
Reference in New Issue
Block a user