Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
55757c4f
提交
55757c4f
authored
9月 24, 2010
作者:
Moises Silva
浏览文件
操作
浏览文件
下载
差异文件
Merge remote branch 'smgorig/master'
上级
54bf6575
4865e38d
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
19 个修改的文件
包含
706 行增加
和
510 行删除
+706
-510
mod_freetdm.c
libs/freetdm/mod_freetdm/mod_freetdm.c
+28
-5
ftdm_config.c
libs/freetdm/src/ftdm_config.c
+61
-9
ftdm_io.c
libs/freetdm/src/ftdm_io.c
+201
-32
ftdm_sched.c
libs/freetdm/src/ftdm_sched.c
+41
-36
ftmod_sangoma_isdn.h
...freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
+1
-1
ftmod_sangoma_isdn_stack_cfg.c
...c/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
+2
-1
ftmod_sangoma_isdn_stack_hndl.c
.../ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
+33
-20
ftmod_sangoma_ss7_cli.c
...eetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
+24
-0
ftmod_sangoma_ss7_handle.c
...dm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
+140
-319
ftmod_sangoma_ss7_logger.c
...dm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c
+8
-0
ftmod_sangoma_ss7_main.c
...etdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
+52
-15
ftmod_sangoma_ss7_main.h
...etdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
+1
-1
ftmod_sangoma_ss7_out.c
...eetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
+27
-18
ftmod_sangoma_ss7_support.c
...m/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
+46
-46
ftmod_sangoma_ss7_timers.c
...dm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c
+1
-1
freetdm.h
libs/freetdm/src/include/freetdm.h
+13
-1
ftdm_core.h
libs/freetdm/src/include/private/ftdm_core.h
+12
-0
ftdm_sched.h
libs/freetdm/src/include/private/ftdm_sched.h
+9
-5
ftdm_types.h
libs/freetdm/src/include/private/ftdm_types.h
+6
-0
没有找到文件。
libs/freetdm/mod_freetdm/mod_freetdm.c
浏览文件 @
55757c4f
...
...
@@ -3451,7 +3451,10 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
const
char
*
chan_type
;
const
char
*
state
;
const
char
*
last_state
;
const
char
*
uuid
=
NULL
;
char
sessionid
[
255
];
float
txgain
,
rxgain
;
switch_core_session_t
*
session
=
NULL
;
ftdm_alarm_flag_t
alarmflag
;
ftdm_caller_data_t
*
caller_data
;
ftdm_channel_t
*
ftdmchan
;
...
...
@@ -3461,6 +3464,7 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
return
;
}
strcpy
(
sessionid
,
"(none)"
);
ftdmchan
=
ftdm_span_get_channel
(
span
,
chan_id
);
span_id
=
ftdm_span_get_id
(
span
);
...
...
@@ -3475,6 +3479,16 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
ftdm_channel_get_sig_status
(
ftdmchan
,
&
sigstatus
);
ftdm_channel_get_alarms
(
ftdmchan
,
&
alarmflag
);
uuid
=
ftdm_channel_get_uuid
(
ftdmchan
,
0
);
if
(
!
zstr
(
uuid
))
{
if
(
!
(
session
=
switch_core_session_locate
(
uuid
)))
{
snprintf
(
sessionid
,
sizeof
(
sessionid
),
"%s (dead)"
,
uuid
);
}
else
{
snprintf
(
sessionid
,
sizeof
(
sessionid
),
"%s"
,
uuid
);
switch_core_session_rwunlock
(
session
);
}
}
stream
->
write_function
(
stream
,
"span_id: %u
\n
"
"chan_id: %u
\n
"
...
...
@@ -3494,7 +3508,8 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
"aniII: %s
\n
"
"dnis: %s
\n
"
"rdnis: %s
\n
"
"cause: %s
\n\n
"
,
"cause: %s
\n
"
"session: %s
\n\n
"
,
span_id
,
chan_id
,
phspan_id
,
...
...
@@ -3513,7 +3528,8 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
caller_data
->
aniII
,
caller_data
->
dnis
.
digits
,
caller_data
->
rdnis
.
digits
,
switch_channel_cause2str
(
caller_data
->
hangup_cause
));
switch_channel_cause2str
(
caller_data
->
hangup_cause
),
sessionid
);
}
void
dump_chan_xml
(
ftdm_span_t
*
span
,
uint32_t
chan_id
,
switch_stream_handle_t
*
stream
)
...
...
@@ -3660,7 +3676,12 @@ SWITCH_STANDARD_API(ft_function)
if
(
chan_id
>
ftdm_span_get_chan_count
(
span
))
{
stream
->
write_function
(
stream
,
"-ERR invalid channel
\n
"
);
}
else
{
char
*
dbgstr
=
NULL
;
ftdm_channel_t
*
fchan
=
ftdm_span_get_channel
(
span
,
chan_id
);
dump_chan
(
span
,
chan_id
,
stream
);
dbgstr
=
ftdm_channel_get_history_str
(
fchan
);
stream
->
write_function
(
stream
,
"%s
\n
"
,
dbgstr
);
ftdm_free
(
dbgstr
);
}
}
else
{
stream
->
write_function
(
stream
,
"+OK
\n
"
);
...
...
@@ -3989,7 +4010,7 @@ SWITCH_STANDARD_API(ft_function)
if
(
rply
)
{
stream
->
write_function
(
stream
,
"%s"
,
rply
);
free
(
rply
);
f
tdm_f
ree
(
rply
);
}
else
{
stream
->
write_function
(
stream
,
"-ERR Usage: %s
\n
"
,
FT_SYNTAX
);
}
...
...
@@ -4074,8 +4095,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_freetdm_load)
ftdm_global_set_logger
(
ftdm_logger
);
ftdm_cpu_monitor_disable
();
ftdm_global_set_mod_directory
(
SWITCH_GLOBAL_dirs
.
mod_dir
);
ftdm_global_set_config_directory
(
SWITCH_GLOBAL_dirs
.
conf_dir
);
if
(
ftdm_global_init
()
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error loading FreeTDM
\n
"
);
return
SWITCH_STATUS_TERM
;
...
...
libs/freetdm/src/ftdm_config.c
浏览文件 @
55757c4f
...
...
@@ -37,6 +37,27 @@
#include "private/ftdm_core.h"
#ifndef FTDM_MOD_DIR
#define FTDM_MOD_DIR "."
#endif
#define FTDM_MAX_CONF_DIR 512
static
char
g_ftdm_config_dir
[
FTDM_MAX_CONF_DIR
]
=
FTDM_CONFIG_DIR
;
static
char
g_ftdm_mod_dir
[
FTDM_MAX_CONF_DIR
]
=
FTDM_MOD_DIR
;
FT_DECLARE
(
void
)
ftdm_global_set_mod_directory
(
const
char
*
path
)
{
snprintf
(
g_ftdm_mod_dir
,
sizeof
(
g_ftdm_mod_dir
),
"%s"
,
path
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"New mod directory: %s
\n
"
,
g_ftdm_mod_dir
);
}
FT_DECLARE
(
void
)
ftdm_global_set_config_directory
(
const
char
*
path
)
{
snprintf
(
g_ftdm_config_dir
,
sizeof
(
g_ftdm_config_dir
),
"%s"
,
path
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"New config directory: %s
\n
"
,
g_ftdm_config_dir
);
}
int
ftdm_config_open_file
(
ftdm_config_t
*
cfg
,
const
char
*
file_path
)
{
FILE
*
f
;
...
...
@@ -46,7 +67,7 @@ int ftdm_config_open_file(ftdm_config_t *cfg, const char *file_path)
if
(
file_path
[
0
]
==
'/'
)
{
path
=
file_path
;
}
else
{
snprintf
(
path_buf
,
sizeof
(
path_buf
),
"%s%s%s"
,
FTDM_CONFIG_DIR
,
FTDM_PATH_SEPARATOR
,
file_path
);
snprintf
(
path_buf
,
sizeof
(
path_buf
),
"%s%s%s"
,
g_ftdm_config_dir
,
FTDM_PATH_SEPARATOR
,
file_path
);
path
=
path_buf
;
}
...
...
@@ -64,7 +85,7 @@ int ftdm_config_open_file(ftdm_config_t *cfg, const char *file_path)
int
last
=
-
1
;
char
*
var
,
*
val
;
snprintf
(
path_buf
,
sizeof
(
path_buf
),
"%s%sfreetdm.conf"
,
FTDM_CONFIG_DIR
,
FTDM_PATH_SEPARATOR
);
snprintf
(
path_buf
,
sizeof
(
path_buf
),
"%s%sfreetdm.conf"
,
g_ftdm_config_dir
,
FTDM_PATH_SEPARATOR
);
path
=
path_buf
;
if
((
f
=
fopen
(
path
,
"r"
))
==
0
)
{
...
...
@@ -268,13 +289,24 @@ FT_DECLARE(ftdm_status_t) ftdm_conf_node_create(const char *name, ftdm_conf_node
if
(
parent
)
{
/* store who my parent is */
newnode
->
parent
=
parent
;
/* save any siblings */
sibling
=
parent
->
child
;
/* as a newborn I am first */
parent
->
child
=
newnode
;
if
(
sibling
)
{
/* store a pointer to my next sibling */
newnode
->
next
=
sibling
;
/* arrange them in FIFO order (newnode should be last) */
if
(
!
parent
->
child
)
{
/* we're the first node being added */
parent
->
child
=
newnode
;
}
else
{
if
(
!
parent
->
last
)
{
/* we're the second node being added */
parent
->
last
=
newnode
;
parent
->
child
->
next
=
newnode
;
newnode
->
prev
=
parent
->
child
;
}
else
{
/* we're the third or Nth node to be added */
sibling
=
parent
->
last
;
sibling
->
next
=
newnode
;
parent
->
last
=
newnode
;
newnode
->
prev
=
sibling
;
}
}
}
...
...
@@ -318,6 +350,26 @@ FT_DECLARE(ftdm_status_t) ftdm_conf_node_destroy(ftdm_conf_node_t *node)
return
FTDM_SUCCESS
;
}
FT_DECLARE
(
char
*
)
ftdm_build_dso_path
(
const
char
*
name
,
char
*
path
,
ftdm_size_t
len
)
{
#ifdef WIN32
const
char
*
ext
=
".dll"
;
//const char *EXT = ".DLL";
#elif defined (MACOSX) || defined (DARWIN)
const
char
*
ext
=
".dylib"
;
//const char *EXT = ".DYLIB";
#else
const
char
*
ext
=
".so"
;
//const char *EXT = ".SO";
#endif
if
(
*
name
==
*
FTDM_PATH_SEPARATOR
)
{
snprintf
(
path
,
len
,
"%s%s"
,
name
,
ext
);
}
else
{
snprintf
(
path
,
len
,
"%s%s%s%s"
,
g_ftdm_mod_dir
,
FTDM_PATH_SEPARATOR
,
name
,
ext
);
}
return
path
;
}
/* For Emacs:
* Local Variables:
* mode:c
...
...
libs/freetdm/src/ftdm_io.c
浏览文件 @
55757c4f
差异被折叠。
点击展开。
libs/freetdm/src/ftdm_sched.c
浏览文件 @
55757c4f
...
...
@@ -34,6 +34,8 @@
#include "private/ftdm_core.h"
typedef
struct
ftdm_timer
ftdm_timer_t
;
static
struct
{
ftdm_sched_t
*
freeruns
;
ftdm_mutex_t
*
mutex
;
...
...
@@ -42,6 +44,7 @@ static struct {
struct
ftdm_sched
{
char
name
[
80
];
ftdm_timer_id_t
currid
;
ftdm_mutex_t
*
mutex
;
ftdm_timer_t
*
timers
;
int
freerun
;
...
...
@@ -51,6 +54,7 @@ struct ftdm_sched {
struct
ftdm_timer
{
char
name
[
80
];
ftdm_timer_id_t
id
;
#ifdef __linux__
struct
timeval
time
;
#endif
...
...
@@ -191,6 +195,7 @@ FT_DECLARE(ftdm_status_t) ftdm_sched_create(ftdm_sched_t **sched, const char *na
}
ftdm_set_string
(
newsched
->
name
,
name
);
newsched
->
currid
=
1
;
*
sched
=
newsched
;
ftdm_log
(
FTDM_LOG_DEBUG
,
"Created schedule %s
\n
"
,
name
);
...
...
@@ -219,12 +224,13 @@ FT_DECLARE(ftdm_status_t) ftdm_sched_run(ftdm_sched_t *sched)
int
rc
=
-
1
;
void
*
data
;
struct
timeval
now
;
ftdm_assert_return
(
sched
!=
NULL
,
FTDM_EINVAL
,
"sched is null!
\n
"
);
ftdm_
mutex_lock
(
sched
->
mutex
);
ftdm_
assert_return
(
sched
!=
NULL
,
FTDM_EINVAL
,
"sched is null!
\n
"
);
tryagain
:
ftdm_mutex_lock
(
sched
->
mutex
);
rc
=
gettimeofday
(
&
now
,
NULL
);
if
(
rc
==
-
1
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Failed to retrieve time of day
\n
"
);
...
...
@@ -257,11 +263,16 @@ tryagain:
runtimer
->
prev
->
next
=
runtimer
->
next
;
}
runtimer
->
id
=
0
;
ftdm_safe_free
(
runtimer
);
/* avoid deadlocks by releasing the sched lock before triggering callbacks */
ftdm_mutex_unlock
(
sched
->
mutex
);
callback
(
data
);
/* after calling a callback we must start the scanning again since the
* callback may have added or cancelled timers to the linked list */
* callback or some other thread may have added or cancelled timers to
* the linked list */
goto
tryagain
;
}
}
...
...
@@ -283,7 +294,7 @@ done:
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_timer
(
ftdm_sched_t
*
sched
,
const
char
*
name
,
int
ms
,
ftdm_sched_callback_t
callback
,
void
*
data
,
ftdm_timer_
t
**
timer
)
int
ms
,
ftdm_sched_callback_t
callback
,
void
*
data
,
ftdm_timer_
id_t
*
timerid
)
{
ftdm_status_t
status
=
FTDM_FAIL
;
#ifdef __linux__
...
...
@@ -296,8 +307,8 @@ FT_DECLARE(ftdm_status_t) ftdm_sched_timer(ftdm_sched_t *sched, const char *name
ftdm_assert_return
(
callback
!=
NULL
,
FTDM_EINVAL
,
"sched callback is null!
\n
"
);
ftdm_assert_return
(
ms
>
0
,
FTDM_EINVAL
,
"milliseconds must be bigger than 0!
\n
"
);
if
(
timer
)
{
*
timer
=
NULL
;
if
(
timer
id
)
{
*
timer
id
=
0
;
}
rc
=
gettimeofday
(
&
now
,
NULL
);
...
...
@@ -312,6 +323,15 @@ FT_DECLARE(ftdm_status_t) ftdm_sched_timer(ftdm_sched_t *sched, const char *name
if
(
!
newtimer
)
{
goto
done
;
}
newtimer
->
id
=
sched
->
currid
;
sched
->
currid
++
;
if
(
!
sched
->
currid
)
{
ftdm_log
(
FTDM_LOG_NOTICE
,
"Timer id wrap around for sched %s
\n
"
,
sched
->
name
);
/* we do not want currid to be zero since is an invalid id
* TODO: check that currid does not exists already in the context, it'd be insane
* though, having a timer to live all that time */
sched
->
currid
++
;
}
ftdm_set_string
(
newtimer
->
name
,
name
);
newtimer
->
callback
=
callback
;
...
...
@@ -332,9 +352,10 @@ FT_DECLARE(ftdm_status_t) ftdm_sched_timer(ftdm_sched_t *sched, const char *name
sched
->
timers
=
newtimer
;
}
if
(
timer
)
{
*
timer
=
newtimer
;
if
(
timer
id
)
{
*
timer
id
=
newtimer
->
id
;
}
status
=
FTDM_SUCCESS
;
done
:
...
...
@@ -418,53 +439,37 @@ done:
return
status
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_cancel_timer
(
ftdm_sched_t
*
sched
,
ftdm_timer_
t
**
intimer
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_cancel_timer
(
ftdm_sched_t
*
sched
,
ftdm_timer_
id_t
timerid
)
{
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_timer_t
*
timer
;
ftdm_assert_return
(
sched
!=
NULL
,
FTDM_EINVAL
,
"sched is null!
\n
"
);
ftdm_assert_return
(
intimer
!=
NULL
,
FTDM_EINVAL
,
"timer is null!
\n
"
);
ftdm_assert_return
(
*
intimer
!=
NULL
,
FTDM_EINVAL
,
"timer is null!
\n
"
);
ftdm_mutex_lock
(
sched
->
mutex
);
/* special case where the cancelled timer is the head */
if
(
*
intimer
==
sched
->
timers
)
{
timer
=
*
intimer
;
/* the timer next is the new head (even if that means the new head will be NULL)*/
sched
->
timers
=
timer
->
next
;
/* if there is a new head, clean its prev member */
if
(
sched
->
timers
)
{
sched
->
timers
->
prev
=
NULL
;
}
/* free the old head */
ftdm_safe_free
(
timer
);
status
=
FTDM_SUCCESS
;
*
intimer
=
NULL
;
goto
done
;
if
(
!
timerid
)
{
return
FTDM_SUCCESS
;
}
/* look for the timer and destroy it (we know now that is not head, se we start at the next member after head) */
for
(
timer
=
sched
->
timers
->
next
;
timer
;
timer
=
timer
->
next
)
{
if
(
timer
==
*
intimer
)
{
ftdm_mutex_lock
(
sched
->
mutex
);
/* look for the timer and destroy it */
for
(
timer
=
sched
->
timers
;
timer
;
timer
=
timer
->
next
)
{
if
(
timer
->
id
==
timerid
)
{
if
(
timer
==
sched
->
timers
)
{
/* it's the head timer, put a new head */
sched
->
timers
=
timer
->
next
;
}
if
(
timer
->
prev
)
{
timer
->
prev
->
next
=
timer
->
next
;
}
if
(
timer
->
next
)
{
timer
->
next
->
prev
=
timer
->
prev
;
}
ftdm_log
(
FTDM_LOG_DEBUG
,
"cancelled timer %s
\n
"
,
timer
->
name
);
ftdm_safe_free
(
timer
);
status
=
FTDM_SUCCESS
;
*
intimer
=
NULL
;
break
;
}
}
done
:
if
(
status
==
FTDM_FAIL
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Could not find timer %s to cancel it
\n
"
,
(
*
intimer
)
->
name
);
}
ftdm_mutex_unlock
(
sched
->
mutex
);
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
浏览文件 @
55757c4f
...
...
@@ -156,7 +156,7 @@ typedef struct sngisdn_chan_data {
uint8_t
globalFlg
;
sngisdn_glare_data_t
glare
;
ftdm_timer_
t
*
timers
[
SNGISDN_NUM_TIMERS
];
ftdm_timer_
id_t
timers
[
SNGISDN_NUM_TIMERS
];
}
sngisdn_chan_data_t
;
/* Span specific data */
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cfg.c
浏览文件 @
55757c4f
...
...
@@ -608,9 +608,10 @@ ftdm_status_t sng_isdn_stack_cfg_q931_dlsap(ftdm_span_t *span)
cfg
.
hdr
.
entId
.
ent
=
ENTIN
;
cfg
.
hdr
.
entId
.
inst
=
S_INST
;
cfg
.
hdr
.
elmId
.
elmnt
=
STDLSAP
;
cfg
.
hdr
.
response
.
selector
=
0
;
cfg
.
t
.
cfg
.
s
.
inDLSAP
.
sapId
=
signal_data
->
link_id
;
cfg
.
t
.
cfg
.
s
.
inDLSAP
.
spId
=
signal_data
->
link_id
;
cfg
.
t
.
cfg
.
s
.
inDLSAP
.
swtch
=
sng_isdn_stack_switchtype
(
signal_data
->
switchtype
);
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
浏览文件 @
55757c4f
...
...
@@ -131,14 +131,12 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
}
if
(
conEvnt
->
facilityStr
.
eh
.
pres
)
{
if
(
signal_data
->
facility
==
SNGISDN_OPT_TRUE
&&
conEvnt
->
facilityStr
.
eh
.
pres
)
{
/* Verify whether the Caller Name will come in a subsequent FACILITY message */
uint16_t
ret_val
;
uint8_t
facility_str
[
255
];
char
retrieved_str
[
255
];
memcpy
(
facility_str
,
(
uint8_t
*
)
&
conEvnt
->
facilityStr
.
facilityStr
.
val
,
conEvnt
->
facilityStr
.
facilityStr
.
len
);
ret_val
=
sng_isdn_retrieve_facility_caller_name
(
facility_str
,
conEvnt
->
facilityStr
.
facilityStr
.
len
,
retrieved_str
);
ret_val
=
sng_isdn_retrieve_facility_caller_name
(
conEvnt
->
facilityStr
.
facilityStr
.
val
,
conEvnt
->
facilityStr
.
facilityStr
.
len
,
retrieved_str
);
/*
return values for "sng_isdn_retrieve_facility_information_following":
If there will be no information following, or fails to decode IE, returns -1
...
...
@@ -151,7 +149,8 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
ftdm_set_state
(
ftdmchan
,
FTDM_CHANNEL_STATE_GET_CALLERID
);
/* Launch timer in case we never get a FACILITY msg */
if
(
signal_data
->
facility_timeout
)
{
ftdm_sched_timer
(
signal_data
->
sched
,
"facility_timeout"
,
signal_data
->
facility_timeout
,
sngisdn_facility_timeout
,
(
void
*
)
sngisdn_info
,
&
sngisdn_info
->
timers
[
SNGISDN_TIMER_FACILITY
]);
ftdm_sched_timer
(
signal_data
->
sched
,
"facility_timeout"
,
signal_data
->
facility_timeout
,
sngisdn_facility_timeout
,
(
void
*
)
sngisdn_info
,
&
sngisdn_info
->
timers
[
SNGISDN_TIMER_FACILITY
]);
}
break
;
}
else
if
(
ret_val
==
0
)
{
...
...
@@ -702,14 +701,23 @@ void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event)
case
FTDM_CHANNEL_STATE_GET_CALLERID
:
/* Update the caller ID Name */
if
(
facEvnt
->
facElmt
.
facStr
.
pres
)
{
uint8_t
facility_str
[
255
];
memcpy
(
facility_str
,
(
uint8_t
*
)
&
facEvnt
->
facElmt
.
facStr
.
val
,
facEvnt
->
facElmt
.
facStr
.
len
);
char
retrieved_str
[
255
];
if
(
sng_isdn_retrieve_facility_caller_name
(
facility_str
,
facEvnt
->
facElmt
.
facStr
.
len
,
retrieved_str
)
!=
FTDM_SUCCESS
)
{
/* return values for "sng_isdn_retrieve_facility_information_following":
If there will be no information following, or fails to decode IE, returns -1
If there will be no information following, but current FACILITY IE contains a caller name, returns 0
If there will be information following, returns 1
*/
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
"
);
}
/* Cancel facility timeout */
ftdm_sched_cancel_timer
(
signal_data
->
sched
,
&
sngisdn_info
->
timers
[
SNGISDN_TIMER_FACILITY
]);
if
(
signal_data
->
facility_timeout
)
{
/* Cancel facility timeout */
ftdm_sched_cancel_timer
(
signal_data
->
sched
,
sngisdn_info
->
timers
[
SNGISDN_TIMER_FACILITY
]);
}
}
ftdm_set_state
(
ftdmchan
,
FTDM_CHANNEL_STATE_RING
);
...
...
@@ -884,27 +892,32 @@ void sngisdn_process_sta_cfm (sngisdn_event_data_t *sngisdn_event)
break
;
}
break
;
case
10
:
/* Remote switch is in active
state */
case
9
:
/* Remote switch is in "Incoming call proceeding"
state */
switch
(
ftdmchan
->
state
)
{
case
FTDM_CHANNEL_STATE_UP
:
/* This is ok, they are in active state and we are in active state */
case
FTDM_CHANNEL_STATE_PROGRESS
:
case
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
:
case
FTDM_CHANNEL_STATE_GET_CALLERID
:
/* Do nothing */
break
;
case
FTDM_CHANNEL_STATE_
HANGUP_COMPLETE
:
/*
We sent a disconnect message, but remote side missed it ?
*/
ftdm_sched_timer
(((
sngisdn_span_data_t
*
)
ftdmchan
->
span
->
signal_data
)
->
sched
,
"delayed_
disconnect"
,
1
,
sngisdn_delayed_dis
connect
,
(
void
*
)
sngisdn_info
,
NULL
);
case
FTDM_CHANNEL_STATE_
UP
:
/*
Remote switch missed our CONNECT message, re-send
*/
ftdm_sched_timer
(((
sngisdn_span_data_t
*
)
ftdmchan
->
span
->
signal_data
)
->
sched
,
"delayed_
connect"
,
1
,
sngisdn_delayed_
connect
,
(
void
*
)
sngisdn_info
,
NULL
);
break
;
default:
ftdm_log_chan
(
ftdmchan
,
FTDM_LOG_CRIT
,
"Don't know how to handle incompatible state. remote call state:%d our state:%s
\n
"
,
call_state
,
ftdm_channel_state2str
(
ftdmchan
->
state
));
break
;
}
break
;
case
9
:
case
10
:
/* Remote switch is in active state */
switch
(
ftdmchan
->
state
)
{
case
FTDM_CHANNEL_STATE_
PROGRESS
:
case
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
:
case
FTDM_CHANNEL_STATE_
UP
:
/* This is ok, they are in active state and we are in active state */
/* Do nothing */
break
;
case
FTDM_CHANNEL_STATE_HANGUP_COMPLETE
:
/* We sent a disconnect message, but remote side missed it ? */
ftdm_sched_timer
(((
sngisdn_span_data_t
*
)
ftdmchan
->
span
->
signal_data
)
->
sched
,
"delayed_disconnect"
,
1
,
sngisdn_delayed_disconnect
,
(
void
*
)
sngisdn_info
,
NULL
);
break
;
default:
ftdm_log_chan
(
ftdmchan
,
FTDM_LOG_CRIT
,
"Don't know how to handle incompatible state. remote call state:%d our state:%s
\n
"
,
call_state
,
ftdm_channel_state2str
(
ftdmchan
->
state
));
break
;
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
浏览文件 @
55757c4f
...
...
@@ -1506,6 +1506,10 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
sngss7_span_data_t
*
sngss7_span
;
int
byte
=
0
;
int
bit
=
0
;
ftdm_sigmsg_t
sigev
;
memset
(
&
sigev
,
0
,
sizeof
(
sigev
));
if
(
range
>
31
)
{
stream
->
write_function
(
stream
,
"Invalid range value %d"
,
range
);
...
...
@@ -1531,6 +1535,14 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
/* throw the grp maint. block flag */
sngss7_set_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_TX
);
/* bring the sig status down */
sigev
.
chan_id
=
ftdmchan
->
chan_id
;
sigev
.
span_id
=
ftdmchan
->
span_id
;
sigev
.
channel
=
ftdmchan
;
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_DOWN
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
/* if this is the first channel in the range */
if
(
ftdmchan
->
physical_chan_id
==
chan
)
{
/* attach the cgb information */
...
...
@@ -1575,6 +1587,10 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
sngss7_span_data_t
*
sngss7_span
;
int
byte
=
0
;
int
bit
=
0
;
ftdm_sigmsg_t
sigev
;
memset
(
&
sigev
,
0
,
sizeof
(
sigev
));
if
(
range
>
31
)
{
stream
->
write_function
(
stream
,
"Invalid range value %d"
,
range
);
...
...
@@ -1600,6 +1616,14 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
/* throw the grp maint. block flag */
sngss7_clear_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_TX
);
/* bring the sig status up */
sigev
.
chan_id
=
ftdmchan
->
chan_id
;
sigev
.
span_id
=
ftdmchan
->
span_id
;
sigev
.
channel
=
ftdmchan
;
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_UP
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
/* if this is the first channel in the range */
if
(
ftdmchan
->
physical_chan_id
==
chan
)
{
/* attach the cgb information */
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
浏览文件 @
55757c4f
差异被折叠。
点击展开。
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_logger.c
浏览文件 @
55757c4f
...
...
@@ -496,6 +496,12 @@ void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta)
/* initalize the msg variable to NULLs */
memset
(
&
msg
[
0
],
'\0'
,
sizeof
(
&
msg
));
/* if the event is REMOTE/LOCAL we don't need to print these */
if
((
sta
->
t
.
usta
.
alarm
.
event
==
LSI_EVENT_REMOTE
)
||
(
sta
->
t
.
usta
.
alarm
.
event
==
LSI_EVENT_LOCAL
))
{
return
;
}
/* point p to the first spot in msg */
p
=
&
msg
[
0
];
...
...
@@ -728,6 +734,8 @@ void handle_sng_isup_alarm(Pst *pst, SiMngmt *sta)
DECODE_LSI_EVENT
(
sta
->
t
.
usta
.
alarm
.
event
),
DECODE_LSI_CAUSE
(
sta
->
t
.
usta
.
alarm
.
cause
));
return
;
}
/* handle_isup_alarm */
/******************************************************************************/
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
浏览文件 @
55757c4f
...
...
@@ -454,9 +454,9 @@ static void ftdm_sangoma_ss7_process_stack_event (sngss7_event_data_t *sngss7_ev
/******************************************************************************/
static
void
ftdm_sangoma_ss7_process_state_change
(
ftdm_channel_t
*
ftdmchan
)
{
ftdm_sigmsg_t
sigev
;
sngss7_chan_data_t
*
sngss7_info
=
ftdmchan
->
call_data
;
int
i
=
0
;
ftdm_sigmsg_t
sigev
;
memset
(
&
sigev
,
0
,
sizeof
(
sigev
));
...
...
@@ -493,7 +493,7 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/*now go to the RING state */
ftdm_set_state_locked
(
ftdmchan
,
FTDM_CHANNEL_STATE_RING
);
}
else
if
(
i
>
g_ftdm_sngss7_data
.
min_digits
)
{
}
else
if
(
i
>
=
g_ftdm_sngss7_data
.
min_digits
)
{
SS7_DEBUG_CHAN
(
ftdmchan
,
"Received %d digits (min digits = %d)
\n
"
,
i
,
g_ftdm_sngss7_data
.
min_digits
);
/*now go to the RING state */
...
...
@@ -511,7 +511,7 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
sngss7_info
->
t35
.
beat
,
sngss7_info
->
t35
.
callback
,
&
sngss7_info
->
t35
,
&
sngss7_info
->
t35
.
h
eartbeat_timer
))
{
&
sngss7_info
->
t35
.
h
b_timer_id
))
{
SS7_ERROR
(
"Unable to schedule timer, hanging up call!
\n
"
);
...
...
@@ -536,8 +536,8 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
}
/* kill t35 if active */
if
(
sngss7_info
->
t35
.
h
eartbeat_timer
)
{
ftdm_sched_cancel_timer
(
sngss7_info
->
t35
.
sched
,
&
sngss7_info
->
t35
.
heartbeat_timer
);
if
(
sngss7_info
->
t35
.
h
b_timer_id
)
{
ftdm_sched_cancel_timer
(
sngss7_info
->
t35
.
sched
,
sngss7_info
->
t35
.
hb_timer_id
);
}
SS7_DEBUG_CHAN
(
ftdmchan
,
"Sending incoming call from %s to %s to FTDM core
\n
"
,
...
...
@@ -788,14 +788,24 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_RESET_TX
))
&&
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_RESET_RX
)))
{
/* check if the sig status is down, and bring it up if it isn't */
if
(
!
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_SIG_UP
))
{
SS7_DEBUG_CHAN
(
ftdmchan
,
"All reset flags cleared %s
\n
"
,
""
);
/* all flags are down so we can bring up the sig status */
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_UP
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
}
/* now check if there is an active block */
if
(
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_LC_BLOCK_RX
))
&&
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_RX
))
&&
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_TX
))
&&
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_HW_BLOCK_RX
))
&&
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_HW_BLOCK_TX
))
&&
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_RX
))
&&
!
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_TX
)))
{
/* check if the sig status is down, and bring it up if it isn't */
if
(
!
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_SIG_UP
))
{
SS7_DEBUG_CHAN
(
ftdmchan
,
"All reset flags cleared %s
\n
"
,
""
);
/* all flags are down so we can bring up the sig status */
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_UP
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
}
/* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */
}
/* if !blocked */
}
else
{
SS7_DEBUG_CHAN
(
ftdmchan
,
"Reset flags present (0x%X)
\n
"
,
sngss7_info
->
flags
);
...
...
@@ -806,8 +816,8 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
}
/* if ((ftdmchan->last_state == FTDM_CHANNEL_STATE_RESTART) */
/* check if t35 is active */
if
(
sngss7_info
->
t35
.
h
eartbeat_timer
)
{
ftdm_sched_cancel_timer
(
sngss7_info
->
t35
.
sched
,
&
sngss7_info
->
t35
.
heartbeat_timer
);
if
(
sngss7_info
->
t35
.
h
b_timer_id
)
{
ftdm_sched_cancel_timer
(
sngss7_info
->
t35
.
sched
,
sngss7_info
->
t35
.
hb_timer_id
);
}
/* clear all of the call specific data store in the channel structure */
...
...
@@ -993,6 +1003,11 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
if
(
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_RX
))
{
SS7_DEBUG_CHAN
(
ftdmchan
,
"Processing CKT_MN_BLOCK_RX flag %s
\n
"
,
""
);
/* bring the sig status down */
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_DOWN
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
/* send a BLA */
ft_to_sngss7_bla
(
ftdmchan
);
...
...
@@ -1006,6 +1021,11 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/* clear the unblock flag */
sngss7_clear_flag
(
sngss7_info
,
FLAG_CKT_MN_UNBLK_RX
);
/* bring the sig status up */
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_UP
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
/* send a uba */
ft_to_sngss7_uba
(
ftdmchan
);
...
...
@@ -1017,6 +1037,11 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
if
(
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_TX
))
{
SS7_DEBUG_CHAN
(
ftdmchan
,
"Processing CKT_MN_BLOCK_TX flag %s
\n
"
,
""
);
/* bring the sig status down */
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_DOWN
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
/* send a blo */
ft_to_sngss7_blo
(
ftdmchan
);
...
...
@@ -1030,6 +1055,11 @@ static void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/* clear the unblock flag */
sngss7_clear_flag
(
sngss7_info
,
FLAG_CKT_MN_UNBLK_TX
);
/* bring the sig status up */
sigev
.
event_id
=
FTDM_SIGEVENT_SIGSTATUS_CHANGED
;
sigev
.
sigstatus
=
FTDM_SIG_STATE_UP
;
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
/* send a ubl */
ft_to_sngss7_ubl
(
ftdmchan
);
...
...
@@ -1403,6 +1433,9 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_ss7_span_config)
static
FIO_SIG_LOAD_FUNCTION
(
ftdm_sangoma_ss7_init
)
{
/*this function is called by the FT-core to load the signaling module */
uint32_t
major
=
0
;
uint32_t
minor
=
0
;
uint32_t
build
=
0
;
ftdm_log
(
FTDM_LOG_INFO
,
"Loading ftmod_sangoma_ss7...
\n
"
);
...
...
@@ -1452,6 +1485,10 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init)
/* initalize sng_ss7 library */
sng_isup_init
(
&
sng_event
);
/* print the version of the library being used */
sng_isup_version
(
&
major
,
&
minor
,
&
build
);
SS7_INFO
(
"Loaded LibSng-SS7 %d.%d.%d
\n
"
,
major
,
minor
,
build
);
/* crash on assert fail */
ftdm_global_set_crash_policy
(
FTDM_CRASH_ON_ASSERT
);
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
浏览文件 @
55757c4f
...
...
@@ -316,7 +316,7 @@ typedef struct ftdm_sngss7_data {
}
ftdm_sngss7_data_t
;
typedef
struct
sngss7_timer_data
{
ftdm_timer_
t
*
heartbeat_timer
;
ftdm_timer_
id_t
hb_timer_id
;
int
beat
;
int
counter
;
ftdm_sched_callback_t
callback
;
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
浏览文件 @
55757c4f
...
...
@@ -199,7 +199,8 @@ void ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
&
iam
,
0
);
SS7_INFO_CHAN
(
ftdmchan
,
"Tx IAM clg =
\"
%s
\"
, cld =
\"
%s
\"\n
"
,
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx IAM clg =
\"
%s
\"
, cld =
\"
%s
\"\n
"
,
sngss7_info
->
circuit
->
cic
,
ftdmchan
->
caller_data
.
cid_num
.
digits
,
ftdmchan
->
caller_data
.
dnis
.
digits
);
...
...
@@ -250,7 +251,7 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
&
acm
,
ADDRCMPLT
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx ACM
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx ACM
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -274,7 +275,7 @@ void ft_to_sngss7_anm (ftdm_channel_t * ftdmchan)
&
anm
,
5
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx ANM
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx ANM
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -307,7 +308,9 @@ void ft_to_sngss7_rel (ftdm_channel_t * ftdmchan)
sngss7_info
->
circuit
->
id
,
&
rel
);
SS7_MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx REL
\n
"
);
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx REL cause=%d
\n
"
,
sngss7_info
->
circuit
->
cic
,
ftdmchan
->
caller_data
.
hangup_cause
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -330,7 +333,7 @@ void ft_to_sngss7_rlc (ftdm_channel_t * ftdmchan)
sngss7_info
->
circuit
->
id
,
&
rlc
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx RLC
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx RLC
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -351,7 +354,7 @@ void ft_to_sngss7_rsc (ftdm_channel_t * ftdmchan)
SIT_STA_CIRRESREQ
,
NULL
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx RSC
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx RSC
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -372,7 +375,7 @@ void ft_to_sngss7_rsca (ftdm_channel_t * ftdmchan)
SIT_STA_CIRRESRSP
,
NULL
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx RSC-RLC
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx RSC-RLC
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -393,7 +396,7 @@ void ft_to_sngss7_blo (ftdm_channel_t * ftdmchan)
SIT_STA_CIRBLOREQ
,
NULL
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx BLO
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx BLO
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -414,7 +417,7 @@ void ft_to_sngss7_bla (ftdm_channel_t * ftdmchan)
SIT_STA_CIRBLORSP
,
NULL
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx BLA
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx BLA
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -436,7 +439,7 @@ ft_to_sngss7_ubl (ftdm_channel_t * ftdmchan)
SIT_STA_CIRUBLREQ
,
NULL
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx UBL
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx UBL
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -457,7 +460,7 @@ void ft_to_sngss7_uba (ftdm_channel_t * ftdmchan)
SIT_STA_CIRUBLRSP
,
NULL
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx UBA
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx UBA
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -478,7 +481,7 @@ void ft_to_sngss7_lpa (ftdm_channel_t * ftdmchan)
SIT_STA_LOOPBACKACK
,
NULL
);
SS7_
MSG_TRACE
(
ftdmchan
,
sngss7_info
,
"Tx LPA
\n
"
);
SS7_
INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx LPA
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
...
...
@@ -519,7 +522,8 @@ void ft_to_sngss7_gra (ftdm_channel_t * ftdmchan)
SIT_STA_GRSRSP
,
&
gra
);
SS7_INFO_CHAN
(
ftdmchan
,
"Tx GRA (%d:%d)
\n
"
,
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx GRA (%d:%d)
\n
"
,
sngss7_info
->
circuit
->
cic
,
sngss7_info
->
circuit
->
cic
,
(
sngss7_info
->
circuit
->
cic
+
sngss7_span
->
rx_grs
.
range
));
...
...
@@ -551,7 +555,8 @@ void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan)
SIT_STA_GRSREQ
,
&
grs
);
SS7_INFO_CHAN
(
ftdmchan
,
"Tx GRS (%d:%d)
\n
"
,
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx GRS (%d:%d)
\n
"
,
sngss7_info
->
circuit
->
cic
,
sngss7_info
->
circuit
->
cic
,
(
sngss7_info
->
circuit
->
cic
+
sngss7_span
->
tx_grs
.
range
));
...
...
@@ -596,7 +601,8 @@ void ft_to_sngss7_cgba(ftdm_channel_t * ftdmchan)
SIT_STA_CGBRSP
,
&
cgba
);
SS7_INFO_CHAN
(
ftdmchan
,
"Tx CGBA (%d:%d)
\n
"
,
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx CGBA (%d:%d)
\n
"
,
sngss7_info
->
circuit
->
cic
,
sngss7_info
->
circuit
->
cic
,
(
sngss7_info
->
circuit
->
cic
+
sngss7_span
->
rx_cgb
.
range
));
...
...
@@ -644,7 +650,8 @@ void ft_to_sngss7_cgua(ftdm_channel_t * ftdmchan)
SIT_STA_CGURSP
,
&
cgua
);
SS7_INFO_CHAN
(
ftdmchan
,
"Tx CGUA (%d:%d)
\n
"
,
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx CGUA (%d:%d)
\n
"
,
sngss7_info
->
circuit
->
cic
,
sngss7_info
->
circuit
->
cic
,
(
sngss7_info
->
circuit
->
cic
+
sngss7_span
->
rx_cgu
.
range
));
...
...
@@ -693,7 +700,8 @@ void ft_to_sngss7_cgb(ftdm_channel_t * ftdmchan)
SIT_STA_CGBREQ
,
&
cgb
);
SS7_INFO_CHAN
(
ftdmchan
,
"Tx CGB (%d:%d)
\n
"
,
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx CGB (%d:%d)
\n
"
,
sngss7_info
->
circuit
->
cic
,
sngss7_info
->
circuit
->
cic
,
(
sngss7_info
->
circuit
->
cic
+
sngss7_span
->
tx_cgb
.
range
));
...
...
@@ -742,7 +750,8 @@ void ft_to_sngss7_cgu(ftdm_channel_t * ftdmchan)
SIT_STA_CGUREQ
,
&
cgu
);
SS7_INFO_CHAN
(
ftdmchan
,
"Tx CGU (%d:%d)
\n
"
,
SS7_INFO_CHAN
(
ftdmchan
,
"[CIC:%d]Tx CGU (%d:%d)
\n
"
,
sngss7_info
->
circuit
->
cic
,
sngss7_info
->
circuit
->
cic
,
(
sngss7_info
->
circuit
->
cic
+
sngss7_span
->
tx_cgu
.
range
));
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c
浏览文件 @
55757c4f
...
...
@@ -464,7 +464,7 @@ ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan)
/* extract the channel in question */
if
(
extract_chan_data
(
i
,
&
sngss7_info
,
&
ftdmchan
))
{
SS7_ERROR
(
"Failed to extract channel data for circuit = %d!
\n
"
,
i
);
SS7_ASSERT
;
continue
;
}
/* lock the channel */
...
...
@@ -476,61 +476,61 @@ ftdm_status_t check_if_rx_grs_processed(ftdm_span_t *ftdmspan)
if
(
!
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_RESET_RX_DN
))
{
/* this channel is still resetting...do nothing */
goto
GRS_UNLOCK_ALL
;
}
/* if (!sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) */
}
else
{
/* state change pending */
goto
GRS_UNLOCK_ALL
;
}
}
/* for ( i = circuit; i < (circuit + range + 1); i++) */
}
/* if (!sngss7_test_flag(sngss7_info, FLAG_GRP_RESET_RX_DN)) */
}
else
{
/* state change pending */
goto
GRS_UNLOCK_ALL
;
}
}
/* for ( i = circuit; i < (circuit + range + 1); i++) */
SS7_DEBUG
(
"All circuits out of reset for GRS: circuit=%d, range=%d
\n
"
,
sngss7_span
->
rx_grs
.
circuit
,
sngss7_span
->
rx_grs
.
range
);
SS7_DEBUG
(
"All circuits out of reset for GRS: circuit=%d, range=%d
\n
"
,
sngss7_span
->
rx_grs
.
circuit
,
sngss7_span
->
rx_grs
.
range
);
/* check all the circuits in the range to see if they are done resetting */
for
(
i
=
sngss7_span
->
rx_grs
.
circuit
;
i
<
(
sngss7_span
->
rx_grs
.
circuit
+
sngss7_span
->
rx_grs
.
range
+
1
);
i
++
)
{
/* check all the circuits in the range to see if they are done resetting */
for
(
i
=
sngss7_span
->
rx_grs
.
circuit
;
i
<
(
sngss7_span
->
rx_grs
.
circuit
+
sngss7_span
->
rx_grs
.
range
+
1
);
i
++
)
{
/* extract the channel in question */
if
(
extract_chan_data
(
i
,
&
sngss7_info
,
&
ftdmchan
))
{
SS7_ERROR
(
"Failed to extract channel data for circuit = %d!
\n
"
,
i
);
SS7_ASSERT
;
}
/* extract the channel in question */
if
(
extract_chan_data
(
i
,
&
sngss7_info
,
&
ftdmchan
))
{
SS7_ERROR
(
"Failed to extract channel data for circuit = %d!
\n
"
,
i
);
SS7_ASSERT
;
}
/* throw the GRP reset flag complete flag */
sngss7_set_flag
(
sngss7_info
,
FLAG_GRP_RESET_RX_CMPLT
);
/* throw the GRP reset flag complete flag */
sngss7_set_flag
(
sngss7_info
,
FLAG_GRP_RESET_RX_CMPLT
);
/* move the channel to the down state */
ftdm_set_state_locked
(
ftdmchan
,
FTDM_CHANNEL_STATE_DOWN
);
/* move the channel to the down state */
ftdm_set_state_locked
(
ftdmchan
,
FTDM_CHANNEL_STATE_DOWN
);
/* update the status map if the ckt is in blocked state */
if
((
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_RX
))
||
(
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_TX
))
||
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_RX
))
||
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_RX
)))
{
sngss7_span
->
rx_grs
.
status
[
byte
]
=
(
sngss7_span
->
rx_grs
.
status
[
byte
]
|
(
1
<<
bit
));
}
/* if blocked */
/* update the bit and byte counter*/
bit
++
;
if
(
bit
==
8
)
{
byte
++
;
bit
=
0
;
}
}
/* for ( i = circuit; i < (circuit + range + 1); i++) */
/* update the status map if the ckt is in blocked state */
if
((
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_RX
))
||
(
sngss7_test_flag
(
sngss7_info
,
FLAG_CKT_MN_BLOCK_TX
))
||
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_RX
))
||
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_MN_BLOCK_RX
)))
{
sngss7_span
->
rx_grs
.
status
[
byte
]
=
(
sngss7_span
->
rx_grs
.
status
[
byte
]
|
(
1
<<
bit
));
}
/* if blocked */
/* update the bit and byte counter*/
bit
++
;
if
(
bit
==
8
)
{
byte
++
;
bit
=
0
;
}
}
/* for ( i = circuit; i < (circuit + range + 1); i++) */
GRS_UNLOCK_ALL:
for
(
i
=
sngss7_span
->
rx_grs
.
circuit
;
i
<
(
sngss7_span
->
rx_grs
.
circuit
+
sngss7_span
->
rx_grs
.
range
+
1
);
i
++
)
{
/* extract the channel in question */
if
(
extract_chan_data
(
i
,
&
sngss7_info
,
&
ftdmchan
))
{
SS7_ERROR
(
"Failed to extract channel data for circuit = %d!
\n
"
,
i
);
SS7_ASSERT
;
}
/* unlock the channel */
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
for
(
i
=
sngss7_span
->
rx_grs
.
circuit
;
i
<
(
sngss7_span
->
rx_grs
.
circuit
+
sngss7_span
->
rx_grs
.
range
+
1
);
i
++
)
{
/* extract the channel in question */
if
(
extract_chan_data
(
i
,
&
sngss7_info
,
&
ftdmchan
))
{
SS7_ERROR
(
"Failed to extract channel data for circuit = %d!
\n
"
,
i
);
continue
;
}
/* unlock the channel */
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
}
return
FTDM_SUCCESS
;
}
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_timers.c
浏览文件 @
55757c4f
...
...
@@ -64,7 +64,7 @@ void handle_isup_t35(void *userdata)
sngss7_set_flag
(
sngss7_info
,
FLAG_LOCAL_REL
);
/* hang up on timer expiry */
ftdmchan
->
caller_data
.
hangup_cause
=
102
;
ftdmchan
->
caller_data
.
hangup_cause
=
28
;
/* end the call */
ftdm_set_state_locked
(
ftdmchan
,
FTDM_CHANNEL_STATE_CANCEL
);
...
...
libs/freetdm/src/include/freetdm.h
浏览文件 @
55757c4f
...
...
@@ -1277,7 +1277,13 @@ FT_DECLARE(const char *) ftdm_channel_get_state_str(const ftdm_channel_t *channe
/*! \brief For display debugging purposes you can display this string which describes the last channel internal state */
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_last_state_str
(
const
ftdm_channel_t
*
channel
);
/*! \brief For display debugging purposes you can display this string which describes the last channel internal state */
/*! \brief For display debugging purposes you can display this string which describes the history of the channel
* \param The channel
* \return History string for the channel. You must free the string with ftdm_free
*/
FT_DECLARE
(
char
*
)
ftdm_channel_get_history_str
(
const
ftdm_channel_t
*
channel
);
/*! \brief Initialize channel state for an outgoing call */
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_init
(
ftdm_channel_t
*
ftdmchan
);
/*! \brief Initialize the library */
...
...
@@ -1301,6 +1307,12 @@ FT_DECLARE(void) ftdm_global_set_logger(ftdm_logger_t logger);
/*! \brief Set the default logger level */
FT_DECLARE
(
void
)
ftdm_global_set_default_logger
(
int
level
);
/*! \brief Set the directory to look for modules */
FT_DECLARE
(
void
)
ftdm_global_set_mod_directory
(
const
char
*
path
);
/*! \brief Set the directory to look for configs */
FT_DECLARE
(
void
)
ftdm_global_set_config_directory
(
const
char
*
path
);
/*! \brief Check if the FTDM library is initialized and running */
FT_DECLARE
(
ftdm_bool_t
)
ftdm_running
(
void
);
...
...
libs/freetdm/src/include/private/ftdm_core.h
浏览文件 @
55757c4f
...
...
@@ -356,6 +356,15 @@ typedef struct {
}
ftdm_dtmf_debug_t
;
#endif
typedef
struct
{
const
char
*
file
;
const
char
*
func
;
int
line
;
ftdm_channel_state_t
state
;
ftdm_channel_state_t
last_state
;
ftdm_time_t
time
;
}
ftdm_channel_history_entry_t
;
/* 2^8 table size, one for each byte (sample) value */
#define FTDM_GAINS_TABLE_SIZE 256
struct
ftdm_channel
{
...
...
@@ -381,6 +390,8 @@ struct ftdm_channel {
ftdm_channel_state_t
state
;
ftdm_channel_state_t
last_state
;
ftdm_channel_state_t
init_state
;
ftdm_channel_history_entry_t
history
[
10
];
uint8_t
hindex
;
ftdm_mutex_t
*
mutex
;
teletone_dtmf_detect_state_t
dtmf_detect
;
uint32_t
buffer_delay
;
...
...
@@ -425,6 +436,7 @@ struct ftdm_channel {
float
txgain
;
int
availability_rate
;
void
*
user_private
;
ftdm_timer_id_t
hangup_timer
;
#ifdef FTDM_DEBUG_DTMF
ftdm_dtmf_debug_t
dtmfdbg
;
#endif
...
...
libs/freetdm/src/include/private/ftdm_sched.h
浏览文件 @
55757c4f
...
...
@@ -44,8 +44,8 @@ extern "C" {
#define FTDM_MICROSECONDS_PER_SECOND 1000000
typedef
struct
ftdm_sched
ftdm_sched_t
;
typedef
struct
ftdm_timer
ftdm_timer_t
;
typedef
void
(
*
ftdm_sched_callback_t
)(
void
*
data
);
typedef
uint64_t
ftdm_timer_id_t
;
/*! \brief Create a new scheduling context */
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_create
(
ftdm_sched_t
**
sched
,
const
char
*
name
);
...
...
@@ -62,18 +62,22 @@ FT_DECLARE(ftdm_status_t) ftdm_sched_free_run(ftdm_sched_t *sched);
* \param name Timer name, typically unique but is not required to be unique, any null terminated string is fine (required)
* \param callback The callback to call upon timer expiration (required)
* \param data Optional data to pass to the callback
* \param timer The timer that was created, it can be NULL if you dont care,
* but you need this if you want to be able to cancel the timer with ftdm_sched_cancel_timer
* \param timer Timer id pointer to store the id of the newly created timer. It can be null
* if you do not need to know the id, but you need this if you want to be able
* to cancel the timer with ftdm_sched_cancel_timer
*/
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_timer
(
ftdm_sched_t
*
sched
,
const
char
*
name
,
int
ms
,
ftdm_sched_callback_t
callback
,
void
*
data
,
ftdm_timer_
t
*
*
timer
);
int
ms
,
ftdm_sched_callback_t
callback
,
void
*
data
,
ftdm_timer_
id_t
*
timer
);
/*!
* \brief Cancel the timer
* Note that there is a race between cancelling and triggering a timer.
* By the time you call this function the timer may be about to be triggered.
* This is specially true with timers in free run schedule.
* \param sched The scheduling context (required)
* \param timer The timer to cancel (required)
*/
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_cancel_timer
(
ftdm_sched_t
*
sched
,
ftdm_timer_
t
**
timer
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_cancel_timer
(
ftdm_sched_t
*
sched
,
ftdm_timer_
id_t
timer
);
/*! \brief Destroy the context and all of the scheduled timers in it */
FT_DECLARE
(
ftdm_status_t
)
ftdm_sched_destroy
(
ftdm_sched_t
**
sched
);
...
...
libs/freetdm/src/include/private/ftdm_types.h
浏览文件 @
55757c4f
...
...
@@ -322,9 +322,15 @@ struct ftdm_conf_node {
/* first node child */
struct
ftdm_conf_node
*
child
;
/* last node child */
struct
ftdm_conf_node
*
last
;
/* next node sibling */
struct
ftdm_conf_node
*
next
;
/* prev node sibling */
struct
ftdm_conf_node
*
prev
;
/* my parent if any */
struct
ftdm_conf_node
*
parent
;
};
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论