Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
c1657714
提交
c1657714
authored
4月 21, 2010
作者:
Moises Silva
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
freetdm: completion of compilation with initial reworked API
上级
73a80ba9
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
854 行增加
和
397 行删除
+854
-397
mod_freetdm.c
libs/freetdm/mod_freetdm/mod_freetdm.c
+413
-287
ftdm_io.c
libs/freetdm/src/ftdm_io.c
+310
-12
freetdm.h
libs/freetdm/src/include/freetdm.h
+126
-6
ftdm_core.h
libs/freetdm/src/include/private/ftdm_core.h
+3
-9
ftdm_types.h
libs/freetdm/src/include/private/ftdm_types.h
+0
-81
testanalog.c
libs/freetdm/src/testanalog.c
+2
-2
没有找到文件。
libs/freetdm/mod_freetdm/mod_freetdm.c
浏览文件 @
c1657714
...
@@ -4,10 +4,10 @@
...
@@ -4,10 +4,10 @@
*
*
* Version: MPL 1.1
* Version: MPL 1.1
*
*
* The contents of this file are subject to the M
ft
illa Public License Version
* The contents of this file are subject to the M
oz
illa Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* the License. You may obtain a copy of the License at
* http://www.m
ft
illa.org/MPL/
* http://www.m
oz
illa.org/MPL/
*
*
* Software distributed under the License is distributed on an "AS IS" basis,
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
...
@@ -138,14 +138,11 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
...
@@ -138,14 +138,11 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
static
switch_core_session_t
*
ftdm_channel_get_session
(
ftdm_channel_t
*
channel
,
int32_t
id
)
static
switch_core_session_t
*
ftdm_channel_get_session
(
ftdm_channel_t
*
channel
,
int32_t
id
)
{
{
switch_core_session_t
*
session
=
NULL
;
switch_core_session_t
*
session
=
NULL
;
const
char
*
token
=
ftdm_channel_get_token
(
channel
,
id
);
if
(
id
>
FTDM_MAX_TOKENS
)
{
if
(
!
zstr
(
token
))
{
return
NULL
;
if
(
!
(
session
=
switch_core_session_locate
(
token
)))
{
}
ftdm_channel_clear_token
(
channel
,
token
);
if
(
!
zstr
(
channel
->
tokens
[
id
]))
{
if
(
!
(
session
=
switch_core_session_locate
(
channel
->
tokens
[
id
])))
{
ftdm_channel_clear_token
(
channel
,
channel
->
tokens
[
id
]);
}
}
}
}
...
@@ -154,14 +151,7 @@ static switch_core_session_t *ftdm_channel_get_session(ftdm_channel_t *channel,
...
@@ -154,14 +151,7 @@ static switch_core_session_t *ftdm_channel_get_session(ftdm_channel_t *channel,
static
const
char
*
ftdm_channel_get_uuid
(
ftdm_channel_t
*
channel
,
int32_t
id
)
static
const
char
*
ftdm_channel_get_uuid
(
ftdm_channel_t
*
channel
,
int32_t
id
)
{
{
if
(
id
>
FTDM_MAX_TOKENS
)
{
return
ftdm_channel_get_token
(
channel
,
id
);
return
NULL
;
}
if
(
!
zstr
(
channel
->
tokens
[
id
]))
{
return
channel
->
tokens
[
id
];
}
return
NULL
;
}
}
static
void
stop_hold
(
switch_core_session_t
*
session_a
,
const
char
*
uuid
)
static
void
stop_hold
(
switch_core_session_t
*
session_a
,
const
char
*
uuid
)
...
@@ -195,19 +185,20 @@ static void start_hold(ftdm_channel_t *ftdmchan, switch_core_session_t *session_
...
@@ -195,19 +185,20 @@ static void start_hold(ftdm_channel_t *ftdmchan, switch_core_session_t *session_
{
{
switch_core_session_t
*
session
;
switch_core_session_t
*
session
;
switch_channel_t
*
channel
,
*
channel_a
;
switch_channel_t
*
channel
,
*
channel_a
;
int32_t
spanid
=
0
;
if
(
!
uuid
)
{
if
(
!
uuid
)
{
return
;
return
;
}
}
spanid
=
ftdm_channel_get_span_id
(
ftdmchan
);
if
((
session
=
switch_core_session_locate
(
uuid
)))
{
if
((
session
=
switch_core_session_locate
(
uuid
)))
{
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
if
(
zstr
(
stream
))
{
if
(
zstr
(
stream
))
{
if
(
!
strcasecmp
(
globals
.
hold_music
,
"indicate_hold"
))
{
if
(
!
strcasecmp
(
globals
.
hold_music
,
"indicate_hold"
))
{
stream
=
"indicate_hold"
;
stream
=
"indicate_hold"
;
}
}
if
(
!
strcasecmp
(
SPAN_CONFIG
[
ftdmchan
->
span
->
span_
id
].
hold_music
,
"indicate_hold"
))
{
if
(
!
strcasecmp
(
SPAN_CONFIG
[
span
id
].
hold_music
,
"indicate_hold"
))
{
stream
=
"indicate_hold"
;
stream
=
"indicate_hold"
;
}
}
}
}
...
@@ -217,7 +208,7 @@ static void start_hold(ftdm_channel_t *ftdmchan, switch_core_session_t *session_
...
@@ -217,7 +208,7 @@ static void start_hold(ftdm_channel_t *ftdmchan, switch_core_session_t *session_
}
}
if
(
zstr
(
stream
))
{
if
(
zstr
(
stream
))
{
stream
=
SPAN_CONFIG
[
ftdmchan
->
span
->
span_
id
].
hold_music
;
stream
=
SPAN_CONFIG
[
span
id
].
hold_music
;
}
}
if
(
zstr
(
stream
))
{
if
(
zstr
(
stream
))
{
...
@@ -250,9 +241,10 @@ static void cycle_foreground(ftdm_channel_t *ftdmchan, int flash, const char *bc
...
@@ -250,9 +241,10 @@ static void cycle_foreground(ftdm_channel_t *ftdmchan, int flash, const char *bc
switch_core_session_t
*
session
;
switch_core_session_t
*
session
;
switch_channel_t
*
channel
;
switch_channel_t
*
channel
;
private_t
*
tech_pvt
;
private_t
*
tech_pvt
;
int32_t
tokencnt
=
ftdm_channel_get_token_count
(
ftdmchan
);
for
(
i
=
0
;
i
<
ftdmchan
->
token_cou
nt
;
i
++
)
{
for
(
i
=
0
;
i
<
tokenc
nt
;
i
++
)
{
if
((
session
=
ftdm_channel_get_session
(
ftdmchan
,
i
)))
{
if
((
session
=
ftdm_channel_get_session
(
ftdmchan
,
i
)))
{
const
char
*
buuid
;
const
char
*
buuid
;
tech_pvt
=
switch_core_session_get_private
(
session
);
tech_pvt
=
switch_core_session_get_private
(
session
);
...
@@ -260,7 +252,7 @@ static void cycle_foreground(ftdm_channel_t *ftdmchan, int flash, const char *bc
...
@@ -260,7 +252,7 @@ static void cycle_foreground(ftdm_channel_t *ftdmchan, int flash, const char *bc
buuid
=
switch_channel_get_variable
(
channel
,
SWITCH_SIGNAL_BOND_VARIABLE
);
buuid
=
switch_channel_get_variable
(
channel
,
SWITCH_SIGNAL_BOND_VARIABLE
);
if
(
ftdmchan
->
token_count
==
1
&&
flash
)
{
if
(
tokencnt
==
1
&&
flash
)
{
if
(
switch_test_flag
(
tech_pvt
,
TFLAG_HOLD
))
{
if
(
switch_test_flag
(
tech_pvt
,
TFLAG_HOLD
))
{
stop_hold
(
session
,
buuid
);
stop_hold
(
session
,
buuid
);
switch_clear_flag_locked
(
tech_pvt
,
TFLAG_HOLD
);
switch_clear_flag_locked
(
tech_pvt
,
TFLAG_HOLD
);
...
@@ -460,6 +452,8 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
...
@@ -460,6 +452,8 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
{
{
switch_channel_t
*
channel
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
private_t
*
tech_pvt
=
NULL
;
private_t
*
tech_pvt
=
NULL
;
ftdm_chan_type_t
chantype
;
uint32_t
tokencnt
;
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
assert
(
channel
!=
NULL
);
assert
(
channel
!=
NULL
);
...
@@ -472,28 +466,31 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
...
@@ -472,28 +466,31 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
}
}
ftdm_channel_clear_token
(
tech_pvt
->
ftdmchan
,
switch_core_session_get_uuid
(
session
));
ftdm_channel_clear_token
(
tech_pvt
->
ftdmchan
,
switch_core_session_get_uuid
(
session
));
switch
(
tech_pvt
->
ftdmchan
->
type
)
{
chantype
=
ftdm_channel_get_type
(
tech_pvt
->
ftdmchan
);
switch
(
chantype
)
{
case
FTDM_CHAN_TYPE_FXO
:
case
FTDM_CHAN_TYPE_FXO
:
case
FTDM_CHAN_TYPE_EM
:
case
FTDM_CHAN_TYPE_EM
:
case
FTDM_CHAN_TYPE_CAS
:
case
FTDM_CHAN_TYPE_CAS
:
{
{
ftdm_
set_state_locked
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_STATE_HANGUP
);
ftdm_
channel_call_hangup
(
tech_pvt
->
ftdmchan
);
}
}
break
;
break
;
case
FTDM_CHAN_TYPE_FXS
:
case
FTDM_CHAN_TYPE_FXS
:
{
{
if
(
tech_pvt
->
ftdmchan
->
state
!=
FTDM_CHANNEL_STATE_BUSY
&&
tech_pvt
->
ftdmchan
->
state
!=
FTDM_CHANNEL_STATE_DOWN
)
{
if
(
!
ftdm_channel_call_check_busy
(
tech_pvt
->
ftdmchan
)
&&
!
ftdm_channel_call_check_done
(
tech_pvt
->
ftdmchan
))
{
if
(
tech_pvt
->
ftdmchan
->
token_count
)
{
tokencnt
=
ftdm_channel_get_token_count
(
tech_pvt
->
ftdmchan
);
if
(
tokencnt
)
{
cycle_foreground
(
tech_pvt
->
ftdmchan
,
0
,
NULL
);
cycle_foreground
(
tech_pvt
->
ftdmchan
,
0
,
NULL
);
}
else
{
}
else
{
ftdm_
set_state_locked
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_STATE_HANGUP
);
ftdm_
channel_call_hangup
(
tech_pvt
->
ftdmchan
);
}
}
}
}
}
}
break
;
break
;
case
FTDM_CHAN_TYPE_B
:
case
FTDM_CHAN_TYPE_B
:
{
{
#if 0
if (tech_pvt->ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) {
if (tech_pvt->ftdmchan->state != FTDM_CHANNEL_STATE_DOWN) {
if (tech_pvt->ftdmchan->state != FTDM_CHANNEL_STATE_TERMINATING) {
if (tech_pvt->ftdmchan->state != FTDM_CHANNEL_STATE_TERMINATING) {
tech_pvt->ftdmchan->caller_data.hangup_cause = switch_channel_get_cause_q850(channel);
tech_pvt->ftdmchan->caller_data.hangup_cause = switch_channel_get_cause_q850(channel);
...
@@ -503,11 +500,18 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
...
@@ -503,11 +500,18 @@ static switch_status_t channel_on_hangup(switch_core_session_t *session)
}
}
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_HANGUP);
}
}
#else
ftdm_call_cause_t
hcause
=
switch_channel_get_cause_q850
(
channel
);
if
(
hcause
<
1
||
hcause
>
127
)
{
hcause
=
FTDM_CAUSE_DESTINATION_OUT_OF_ORDER
;
}
ftdm_channel_call_hangup_with_cause
(
tech_pvt
->
ftdmchan
,
hcause
);
#endif
}
}
break
;
break
;
default:
default:
{
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Unhandled channel type %d for channel %s
\n
"
,
tech_pvt
->
ftdmchan
->
type
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Unhandled channel type %d for channel %s
\n
"
,
chan
type
,
switch_channel_get_name
(
channel
));
switch_channel_get_name
(
channel
));
}
}
break
;
break
;
...
@@ -611,7 +615,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
...
@@ -611,7 +615,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
/* Digium Cards sometimes timeout several times in a row here.
/* Digium Cards sometimes timeout several times in a row here.
Yes, we support digium cards, ain't we nice.......
Yes, we support digium cards, ain't we nice.......
6 double length intervals should compensate */
6 double length intervals should compensate */
chunk
=
tech_pvt
->
ftdmchan
->
effective_interval
*
2
;
chunk
=
ftdm_channel_get_io_interval
(
tech_pvt
->
ftdmchan
)
*
2
;
total_to
=
chunk
*
6
;
total_to
=
chunk
*
6
;
top:
top:
...
@@ -626,12 +630,12 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
...
@@ -626,12 +630,12 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
}
}
if
(
switch_test_flag
(
tech_pvt
,
TFLAG_HOLD
)
||
do_break
)
{
if
(
switch_test_flag
(
tech_pvt
,
TFLAG_HOLD
)
||
do_break
)
{
switch_yield
(
tech_pvt
->
ftdmchan
->
effective_interval
*
1000
);
switch_yield
(
ftdm_channel_get_io_interval
(
tech_pvt
->
ftdmchan
)
*
1000
);
tech_pvt
->
cng_frame
.
datalen
=
tech_pvt
->
ftdmchan
->
packet_len
;
tech_pvt
->
cng_frame
.
datalen
=
ftdm_channel_get_io_packet_len
(
tech_pvt
->
ftdmchan
)
;
tech_pvt
->
cng_frame
.
samples
=
tech_pvt
->
cng_frame
.
datalen
;
tech_pvt
->
cng_frame
.
samples
=
tech_pvt
->
cng_frame
.
datalen
;
tech_pvt
->
cng_frame
.
flags
=
SFF_CNG
;
tech_pvt
->
cng_frame
.
flags
=
SFF_CNG
;
*
frame
=
&
tech_pvt
->
cng_frame
;
*
frame
=
&
tech_pvt
->
cng_frame
;
if
(
tech_pvt
->
ftdmchan
->
effective_codec
==
FTDM_CODEC_SLIN
)
{
if
(
ftdm_channel_get_codec
(
tech_pvt
->
ftdmchan
)
==
FTDM_CODEC_SLIN
)
{
tech_pvt
->
cng_frame
.
samples
/=
2
;
tech_pvt
->
cng_frame
.
samples
/=
2
;
}
}
return
SWITCH_STATUS_SUCCESS
;
return
SWITCH_STATUS_SUCCESS
;
...
@@ -672,7 +676,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
...
@@ -672,7 +676,7 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
tech_pvt
->
read_frame
.
datalen
=
(
uint32_t
)
len
;
tech_pvt
->
read_frame
.
datalen
=
(
uint32_t
)
len
;
tech_pvt
->
read_frame
.
samples
=
tech_pvt
->
read_frame
.
datalen
;
tech_pvt
->
read_frame
.
samples
=
tech_pvt
->
read_frame
.
datalen
;
if
(
tech_pvt
->
ftdmchan
->
effective_codec
==
FTDM_CODEC_SLIN
)
{
if
(
ftdm_channel_get_codec
(
tech_pvt
->
ftdmchan
)
==
FTDM_CODEC_SLIN
)
{
tech_pvt
->
read_frame
.
samples
/=
2
;
tech_pvt
->
read_frame
.
samples
/=
2
;
}
}
...
@@ -738,7 +742,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
...
@@ -738,7 +742,7 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc
wflags
=
FTDM_WRITE
;
wflags
=
FTDM_WRITE
;
status
=
ftdm_channel_wait
(
tech_pvt
->
ftdmchan
,
&
wflags
,
tech_pvt
->
ftdmchan
->
effective_interval
*
10
);
status
=
ftdm_channel_wait
(
tech_pvt
->
ftdmchan
,
&
wflags
,
ftdm_channel_get_io_interval
(
tech_pvt
->
ftdmchan
)
*
10
);
if
(
!
(
wflags
&
FTDM_WRITE
))
{
if
(
!
(
wflags
&
FTDM_WRITE
))
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Dropping frame! (write not ready)
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Dropping frame! (write not ready)
\n
"
);
...
@@ -768,6 +772,7 @@ static switch_status_t channel_receive_message_cas(switch_core_session_t *sessio
...
@@ -768,6 +772,7 @@ static switch_status_t channel_receive_message_cas(switch_core_session_t *sessio
{
{
switch_channel_t
*
channel
;
switch_channel_t
*
channel
;
private_t
*
tech_pvt
;
private_t
*
tech_pvt
;
uint32_t
phy_id
;
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
assert
(
channel
!=
NULL
);
assert
(
channel
!=
NULL
);
...
@@ -779,22 +784,31 @@ static switch_status_t channel_receive_message_cas(switch_core_session_t *sessio
...
@@ -779,22 +784,31 @@ static switch_status_t channel_receive_message_cas(switch_core_session_t *sessio
switch_channel_hangup
(
channel
,
SWITCH_CAUSE_LOSE_RACE
);
switch_channel_hangup
(
channel
,
SWITCH_CAUSE_LOSE_RACE
);
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
ftdm_log
(
FTDM_LOG_DEBUG
,
"Got Freeswitch message in R2 channel %d [%d]
\n
"
,
tech_pvt
->
ftdmchan
->
physical_chan_id
,
phy_id
=
ftdm_channel_get_ph_id
(
tech_pvt
->
ftdmchan
);
msg
->
message_id
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"Got Freeswitch message in R2 channel %d [%d]
\n
"
,
phy_id
,
msg
->
message_id
);
if
(
switch_channel_test_flag
(
channel
,
CF_OUTBOUND
))
{
return
SWITCH_STATUS_SUCCESS
;
}
switch
(
msg
->
message_id
)
{
switch
(
msg
->
message_id
)
{
case
SWITCH_MESSAGE_INDICATE_RINGING
:
case
SWITCH_MESSAGE_INDICATE_RINGING
:
{
{
#if 0
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
} else {
} else {
ftdm_set_state_locked_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
ftdm_set_state_locked_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
}
}
#else
ftdm_channel_call_indicate
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_INDICATE_PROGRESS
);
#endif
}
}
break
;
break
;
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
{
{
#if 0
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_MEDIA);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_MEDIA);
...
@@ -802,24 +816,14 @@ static switch_status_t channel_receive_message_cas(switch_core_session_t *sessio
...
@@ -802,24 +816,14 @@ static switch_status_t channel_receive_message_cas(switch_core_session_t *sessio
ftdm_set_state_locked_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
ftdm_set_state_locked_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
ftdm_set_state_locked_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
ftdm_set_state_locked_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
}
}
#else
ftdm_channel_call_indicate
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA
);
#endif
}
}
break
;
break
;
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
{
{
if
(
switch_channel_test_flag
(
channel
,
CF_OUTBOUND
))
{
ftdm_channel_call_answer
(
tech_pvt
->
ftdmchan
);
ftdm_set_flag_locked
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_ANSWERED
);
}
else
{
/* lets make the ftmod_r2 module life easier by moving thru each
* state waiting for completion, clumsy, but does the job
*/
if
(
tech_pvt
->
ftdmchan
->
state
<
FTDM_CHANNEL_STATE_PROGRESS
)
{
ftdm_set_state_locked_wait
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS
);
}
if
(
tech_pvt
->
ftdmchan
->
state
<
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
)
{
ftdm_set_state_locked_wait
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
);
}
ftdm_set_state_locked_wait
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_STATE_UP
);
}
}
}
break
;
break
;
default:
default:
...
@@ -845,23 +849,31 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session,
...
@@ -845,23 +849,31 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session,
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
if
(
tech_pvt
->
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_TERMINATING
)
{
if
(
ftdm_channel_call_check_hangup
(
tech_pvt
->
ftdmchan
))
{
ftdm_mutex_unlock
(
tech_pvt
->
ftdmchan
->
mutex
);
return
SWITCH_STATUS_SUCCESS
;
}
if
(
switch_channel_test_flag
(
channel
,
CF_OUTBOUND
))
{
return
SWITCH_STATUS_SUCCESS
;
return
SWITCH_STATUS_SUCCESS
;
}
}
switch
(
msg
->
message_id
)
{
switch
(
msg
->
message_id
)
{
case
SWITCH_MESSAGE_INDICATE_RINGING
:
case
SWITCH_MESSAGE_INDICATE_RINGING
:
{
{
#if 0
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
} else {
} else {
ftdm_set_state_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
ftdm_set_state_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
}
}
#else
ftdm_channel_call_indicate
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_INDICATE_PROGRESS
);
#endif
}
}
break
;
break
;
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
{
{
#if 0
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_MEDIA);
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_MEDIA);
...
@@ -875,10 +887,14 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session,
...
@@ -875,10 +887,14 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session,
}
}
ftdm_set_state_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
ftdm_set_state_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
}
}
#else
ftdm_channel_call_indicate
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA
);
#endif
}
}
break
;
break
;
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
{
{
#if 0
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_ANSWERED);
ftdm_set_flag(tech_pvt->ftdmchan, FTDM_CHANNEL_ANSWERED);
} else {
} else {
...
@@ -894,6 +910,9 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session,
...
@@ -894,6 +910,9 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session,
}
}
ftdm_set_state_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_UP);
ftdm_set_state_wait(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_UP);
}
}
#else
ftdm_channel_call_answer
(
tech_pvt
->
ftdmchan
);
#endif
}
}
break
;
break
;
default:
default:
...
@@ -919,9 +938,14 @@ static switch_status_t channel_receive_message_fxo(switch_core_session_t *sessio
...
@@ -919,9 +938,14 @@ static switch_status_t channel_receive_message_fxo(switch_core_session_t *sessio
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
if
(
switch_channel_test_flag
(
channel
,
CF_OUTBOUND
))
{
return
SWITCH_STATUS_SUCCESS
;
}
switch
(
msg
->
message_id
)
{
switch
(
msg
->
message_id
)
{
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
#if 0
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
if (switch_channel_test_flag(channel, CF_OUTBOUND)) {
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_ANSWERED);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_ANSWERED);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
...
@@ -929,6 +953,9 @@ static switch_status_t channel_receive_message_fxo(switch_core_session_t *sessio
...
@@ -929,6 +953,9 @@ static switch_status_t channel_receive_message_fxo(switch_core_session_t *sessio
} else {
} else {
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_UP);
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_UP);
}
}
#else
ftdm_channel_call_answer
(
tech_pvt
->
ftdmchan
);
#endif
break
;
break
;
default:
default:
break
;
break
;
...
@@ -952,10 +979,15 @@ static switch_status_t channel_receive_message_fxs(switch_core_session_t *sessio
...
@@ -952,10 +979,15 @@ static switch_status_t channel_receive_message_fxs(switch_core_session_t *sessio
switch_channel_hangup
(
channel
,
SWITCH_CAUSE_LOSE_RACE
);
switch_channel_hangup
(
channel
,
SWITCH_CAUSE_LOSE_RACE
);
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
if
(
switch_channel_test_flag
(
channel
,
CF_OUTBOUND
))
{
return
SWITCH_STATUS_SUCCESS
;
}
switch
(
msg
->
message_id
)
{
switch
(
msg
->
message_id
)
{
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
case
SWITCH_MESSAGE_INDICATE_PROGRESS
:
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
case
SWITCH_MESSAGE_INDICATE_ANSWER
:
#if 0
if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_ANSWERED);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_ANSWERED);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
ftdm_set_flag_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_PROGRESS);
...
@@ -963,17 +995,22 @@ static switch_status_t channel_receive_message_fxs(switch_core_session_t *sessio
...
@@ -963,17 +995,22 @@ static switch_status_t channel_receive_message_fxs(switch_core_session_t *sessio
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_UP);
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_UP);
switch_channel_mark_answered(channel);
switch_channel_mark_answered(channel);
}
}
#else
ftdm_channel_call_answer
(
tech_pvt
->
ftdmchan
);
switch_channel_mark_answered
(
channel
);
#endif
break
;
break
;
case
SWITCH_MESSAGE_INDICATE_RINGING
:
case
SWITCH_MESSAGE_INDICATE_RINGING
:
if
(
!
switch_channel_test_flag
(
channel
,
CF_OUTBOUND
))
{
if
(
!
switch_channel_test_flag
(
channel
,
CF_ANSWERED
)
&&
!
switch_channel_test_flag
(
channel
,
CF_EARLY_MEDIA
)
&&
if
(
!
switch_channel_test_flag
(
channel
,
CF_ANSWERED
)
&&
!
switch_channel_test_flag
(
channel
,
CF_RING_READY
)
!
switch_channel_test_flag
(
channel
,
CF_EARLY_MEDIA
)
&&
)
{
!
switch_channel_test_flag
(
channel
,
CF_RING_READY
)
#if 0
)
{
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_RING);
ftdm_set_state_locked(tech_pvt->ftdmchan, FTDM_CHANNEL_STATE_RING);
#else
ftdm_channel_call_indicate
(
tech_pvt
->
ftdmchan
,
FTDM_CHANNEL_INDICATE_RING
);
#endif
switch_channel_mark_ring_ready
(
channel
);
switch_channel_mark_ring_ready
(
channel
);
}
}
}
break
;
break
;
default:
default:
...
@@ -1006,12 +1043,9 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
...
@@ -1006,12 +1043,9 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
return
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
}
}
ftdm_mutex_lock
(
ftdmchan
->
mutex
);
if
(
!
tech_pvt
->
ftdmchan
)
{
if
(
!
tech_pvt
->
ftdmchan
)
{
switch_channel_hangup
(
channel
,
SWITCH_CAUSE_LOSE_RACE
);
switch_channel_hangup
(
channel
,
SWITCH_CAUSE_LOSE_RACE
);
status
=
SWITCH_STATUS_FALSE
;
return
SWITCH_STATUS_FALSE
;
goto
end
;
}
}
switch
(
msg
->
message_id
)
{
switch
(
msg
->
message_id
)
{
...
@@ -1035,7 +1069,7 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
...
@@ -1035,7 +1069,7 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
break
;
break
;
}
}
switch
(
tech_pvt
->
ftdmchan
->
type
)
{
switch
(
ftdm_channel_get_type
(
tech_pvt
->
ftdmchan
)
)
{
case
FTDM_CHAN_TYPE_FXS
:
case
FTDM_CHAN_TYPE_FXS
:
case
FTDM_CHAN_TYPE_EM
:
case
FTDM_CHAN_TYPE_EM
:
status
=
channel_receive_message_fxs
(
session
,
msg
);
status
=
channel_receive_message_fxs
(
session
,
msg
);
...
@@ -1054,10 +1088,6 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
...
@@ -1054,10 +1088,6 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
break
;
break
;
}
}
end:
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
return
status
;
return
status
;
}
}
...
@@ -1098,7 +1128,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
...
@@ -1098,7 +1128,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
const
char
*
dest
=
NULL
;
const
char
*
dest
=
NULL
;
char
*
data
=
NULL
;
char
*
data
=
NULL
;
int
span_id
=
-
1
,
group_id
=
-
1
,
chan_id
=
0
;
int
span_id
=
-
1
,
group_id
=
-
1
,
chan_id
=
0
;
ftdm_channel_t
*
ftdmchan
=
NULL
;
ftdm_channel_t
*
ftdmchan
=
NULL
;
switch_call_cause_t
cause
=
SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER
;
switch_call_cause_t
cause
=
SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER
;
char
name
[
128
];
char
name
[
128
];
...
@@ -1169,7 +1199,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
...
@@ -1169,7 +1199,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
ftdm_span_t
*
span
;
ftdm_span_t
*
span
;
ftdm_status_t
zstatus
=
ftdm_span_find_by_name
(
span_name
,
&
span
);
ftdm_status_t
zstatus
=
ftdm_span_find_by_name
(
span_name
,
&
span
);
if
(
zstatus
==
FTDM_SUCCESS
&&
span
)
{
if
(
zstatus
==
FTDM_SUCCESS
&&
span
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
}
}
...
@@ -1178,7 +1208,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
...
@@ -1178,7 +1208,7 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
ftdm_group_t
*
group
;
ftdm_group_t
*
group
;
ftdm_status_t
zstatus
=
ftdm_group_find_by_name
(
span_name
,
&
group
);
ftdm_status_t
zstatus
=
ftdm_group_find_by_name
(
span_name
,
&
group
);
if
(
zstatus
==
FTDM_SUCCESS
&&
group
)
{
if
(
zstatus
==
FTDM_SUCCESS
&&
group
)
{
group_id
=
group
->
group_id
;
group_id
=
ftdm_group_get_id
(
group
)
;
}
else
{
}
else
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Missing ftdm span or group: %s
\n
"
,
span_name
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Missing ftdm span or group: %s
\n
"
,
span_name
);
return
SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER
;
return
SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER
;
...
@@ -1275,12 +1305,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
...
@@ -1275,12 +1305,12 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
goto
fail
;
goto
fail
;
}
}
snprintf
(
name
,
sizeof
(
name
),
"FreeTDM/%u:%u/%s"
,
ftdm
chan
->
span_id
,
ftdmchan
->
chan_id
,
dest
);
snprintf
(
name
,
sizeof
(
name
),
"FreeTDM/%u:%u/%s"
,
ftdm
_channel_get_span_id
(
ftdmchan
),
ftdm_channel_get_id
(
ftdmchan
)
,
dest
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Connect outbound channel %s
\n
"
,
name
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Connect outbound channel %s
\n
"
,
name
);
switch_channel_set_name
(
channel
,
name
);
switch_channel_set_name
(
channel
,
name
);
switch_channel_set_variable
(
channel
,
"freetdm_span_name"
,
ftdm
chan
->
span
->
name
);
switch_channel_set_variable
(
channel
,
"freetdm_span_name"
,
ftdm
_channel_get_span_name
(
ftdmchan
)
);
switch_channel_set_variable_printf
(
channel
,
"freetdm_span_number"
,
"%d"
,
ftdm
chan
->
span_id
);
switch_channel_set_variable_printf
(
channel
,
"freetdm_span_number"
,
"%d"
,
ftdm
_channel_get_span_id
(
ftdmchan
));
switch_channel_set_variable_printf
(
channel
,
"freetdm_chan_number"
,
"%d"
,
ftdm
chan
->
chan_id
);
switch_channel_set_variable_printf
(
channel
,
"freetdm_chan_number"
,
"%d"
,
ftdm
_channel_get_id
(
ftdmchan
)
);
ftdm_channel_set_caller_data
(
ftdmchan
,
&
caller_data
);
ftdm_channel_set_caller_data
(
ftdmchan
,
&
caller_data
);
caller_profile
=
switch_caller_profile_clone
(
*
new_session
,
outbound_profile
);
caller_profile
=
switch_caller_profile_clone
(
*
new_session
,
outbound_profile
);
caller_profile
->
destination_number
=
switch_core_strdup
(
caller_profile
->
pool
,
switch_str_nil
(
dest_num
));
caller_profile
->
destination_number
=
switch_core_strdup
(
caller_profile
->
pool
,
switch_str_nil
(
dest_num
));
...
@@ -1291,14 +1321,14 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
...
@@ -1291,14 +1321,14 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
switch_channel_set_flag
(
channel
,
CF_OUTBOUND
);
switch_channel_set_flag
(
channel
,
CF_OUTBOUND
);
switch_channel_set_state
(
channel
,
CS_INIT
);
switch_channel_set_state
(
channel
,
CS_INIT
);
if
(
ftdm_channel_add_token
(
ftdmchan
,
switch_core_session_get_uuid
(
*
new_session
),
ftdm
chan
->
token_count
)
!=
FTDM_SUCCESS
)
{
if
(
ftdm_channel_add_token
(
ftdmchan
,
switch_core_session_get_uuid
(
*
new_session
),
ftdm
_channel_get_token_count
(
ftdmchan
)
)
!=
FTDM_SUCCESS
)
{
switch_core_session_destroy
(
new_session
);
switch_core_session_destroy
(
new_session
);
cause
=
SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER
;
cause
=
SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER
;
goto
fail
;
goto
fail
;
}
}
if
(
ftdm_channel_
outgoing_call
(
ftdmchan
)
!=
FTDM_SUCCESS
)
{
if
(
ftdm_channel_
call_place
(
ftdmchan
)
!=
FTDM_SUCCESS
)
{
if
(
tech_pvt
->
read_codec
.
implementation
)
{
if
(
tech_pvt
->
read_codec
.
implementation
)
{
switch_core_codec_destroy
(
&
tech_pvt
->
read_codec
);
switch_core_codec_destroy
(
&
tech_pvt
->
read_codec
);
}
}
...
@@ -1331,9 +1361,14 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
...
@@ -1331,9 +1361,14 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
switch_core_session_t
*
session
=
NULL
;
switch_core_session_t
*
session
=
NULL
;
private_t
*
tech_pvt
=
NULL
;
private_t
*
tech_pvt
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
uint32_t
spanid
,
chanid
;
char
name
[
128
];
char
name
[
128
];
ftdm_caller_data_t
*
channel_caller_data
=
sigmsg
->
raw_data
;
*
sp
=
NULL
;
*
sp
=
NULL
;
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
chanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
if
(
!
(
session
=
switch_core_session_request
(
freetdm_endpoint_interface
,
SWITCH_CALL_DIRECTION_INBOUND
,
NULL
)))
{
if
(
!
(
session
=
switch_core_session_request
(
freetdm_endpoint_interface
,
SWITCH_CALL_DIRECTION_INBOUND
,
NULL
)))
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"Initilization Error!
\n
"
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_CRIT
,
"Initilization Error!
\n
"
);
...
@@ -1350,61 +1385,61 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
...
@@ -1350,61 +1385,61 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
switch_core_session_destroy
(
&
session
);
switch_core_session_destroy
(
&
session
);
return
FTDM_FAIL
;
return
FTDM_FAIL
;
}
}
channel_caller_data
->
collected
[
0
]
=
'\0'
;
*
sigmsg
->
channel
->
caller_data
.
collected
=
'\0'
;
if
(
zstr
(
channel_caller_data
->
cid_name
))
{
switch_set_string
(
channel_caller_data
->
cid_name
,
ftdm_channel_get_name
(
sigmsg
->
channel
));
if
(
zstr
(
sigmsg
->
channel
->
caller_data
.
cid_name
))
{
switch_set_string
(
sigmsg
->
channel
->
caller_data
.
cid_name
,
sigmsg
->
channel
->
chan_name
);
}
}
if
(
zstr
(
sigmsg
->
channel
->
caller_data
.
cid_num
.
digits
))
{
if
(
zstr
(
channel_caller_data
->
cid_num
.
digits
))
{
if
(
!
zstr
(
sigmsg
->
channel
->
caller_data
.
ani
.
digits
))
{
if
(
!
zstr
(
channel_caller_data
->
ani
.
digits
))
{
switch_set_string
(
sigmsg
->
channel
->
caller_data
.
cid_num
.
digits
,
sigmsg
->
channel
->
caller_data
.
ani
.
digits
);
switch_set_string
(
channel_caller_data
->
cid_num
.
digits
,
channel_caller_data
->
ani
.
digits
);
}
else
{
}
else
{
switch_set_string
(
sigmsg
->
channel
->
caller_data
.
cid_num
.
digits
,
sigmsg
->
channel
->
chan_number
);
switch_set_string
(
channel_caller_data
->
cid_num
.
digits
,
ftdm_channel_get_number
(
sigmsg
->
channel
)
);
}
}
}
}
tech_pvt
->
caller_profile
=
switch_caller_profile_new
(
switch_core_session_get_pool
(
session
),
tech_pvt
->
caller_profile
=
switch_caller_profile_new
(
switch_core_session_get_pool
(
session
),
"FreeTDM"
,
"FreeTDM"
,
SPAN_CONFIG
[
s
igmsg
->
channel
->
span_
id
].
dialplan
,
SPAN_CONFIG
[
s
pan
id
].
dialplan
,
sigmsg
->
channel
->
caller_data
.
cid_name
,
channel_caller_data
->
cid_name
,
sigmsg
->
channel
->
caller_data
.
cid_num
.
digits
,
channel_caller_data
->
cid_num
.
digits
,
NULL
,
NULL
,
sigmsg
->
channel
->
caller_data
.
ani
.
digits
,
channel_caller_data
->
ani
.
digits
,
sigmsg
->
channel
->
caller_data
.
aniII
,
channel_caller_data
->
aniII
,
sigmsg
->
channel
->
caller_data
.
rdnis
.
digits
,
channel_caller_data
->
rdnis
.
digits
,
(
char
*
)
modname
,
(
char
*
)
modname
,
SPAN_CONFIG
[
s
igmsg
->
channel
->
span_
id
].
context
,
SPAN_CONFIG
[
s
pan
id
].
context
,
sigmsg
->
channel
->
caller_data
.
dnis
.
digits
);
channel_caller_data
->
dnis
.
digits
);
assert
(
tech_pvt
->
caller_profile
!=
NULL
);
assert
(
tech_pvt
->
caller_profile
!=
NULL
);
if
(
sigmsg
->
channel
->
caller_data
.
screen
==
1
||
sigmsg
->
channel
->
caller_data
.
screen
==
3
)
{
if
(
channel_caller_data
->
screen
==
1
||
channel_caller_data
->
screen
==
3
)
{
switch_set_flag
(
tech_pvt
->
caller_profile
,
SWITCH_CPF_SCREEN
);
switch_set_flag
(
tech_pvt
->
caller_profile
,
SWITCH_CPF_SCREEN
);
}
}
tech_pvt
->
caller_profile
->
caller_ton
=
sigmsg
->
channel
->
caller_data
.
cid_num
.
type
;
tech_pvt
->
caller_profile
->
caller_ton
=
channel_caller_data
->
cid_num
.
type
;
tech_pvt
->
caller_profile
->
caller_numplan
=
sigmsg
->
channel
->
caller_data
.
cid_num
.
plan
;
tech_pvt
->
caller_profile
->
caller_numplan
=
channel_caller_data
->
cid_num
.
plan
;
tech_pvt
->
caller_profile
->
ani_ton
=
sigmsg
->
channel
->
caller_data
.
ani
.
type
;
tech_pvt
->
caller_profile
->
ani_ton
=
channel_caller_data
->
ani
.
type
;
tech_pvt
->
caller_profile
->
ani_numplan
=
sigmsg
->
channel
->
caller_data
.
ani
.
plan
;
tech_pvt
->
caller_profile
->
ani_numplan
=
channel_caller_data
->
ani
.
plan
;
tech_pvt
->
caller_profile
->
destination_number_ton
=
sigmsg
->
channel
->
caller_data
.
dnis
.
type
;
tech_pvt
->
caller_profile
->
destination_number_ton
=
channel_caller_data
->
dnis
.
type
;
tech_pvt
->
caller_profile
->
destination_number_numplan
=
sigmsg
->
channel
->
caller_data
.
dnis
.
plan
;
tech_pvt
->
caller_profile
->
destination_number_numplan
=
channel_caller_data
->
dnis
.
plan
;
tech_pvt
->
caller_profile
->
rdnis_ton
=
sigmsg
->
channel
->
caller_data
.
rdnis
.
type
;
tech_pvt
->
caller_profile
->
rdnis_ton
=
channel_caller_data
->
rdnis
.
type
;
tech_pvt
->
caller_profile
->
rdnis_numplan
=
sigmsg
->
channel
->
caller_data
.
rdnis
.
plan
;
tech_pvt
->
caller_profile
->
rdnis_numplan
=
channel_caller_data
->
rdnis
.
plan
;
if
(
sigmsg
->
channel
->
caller_data
.
pres
)
{
if
(
channel_caller_data
->
pres
)
{
switch_set_flag
(
tech_pvt
->
caller_profile
,
SWITCH_CPF_HIDE_NAME
|
SWITCH_CPF_HIDE_NUMBER
);
switch_set_flag
(
tech_pvt
->
caller_profile
,
SWITCH_CPF_HIDE_NAME
|
SWITCH_CPF_HIDE_NUMBER
);
}
}
snprintf
(
name
,
sizeof
(
name
),
"FreeTDM/%u:%u/%s"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
,
tech_pvt
->
caller_profile
->
destination_number
);
snprintf
(
name
,
sizeof
(
name
),
"FreeTDM/%u:%u/%s"
,
s
panid
,
chan
id
,
tech_pvt
->
caller_profile
->
destination_number
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Connect inbound channel %s
\n
"
,
name
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_DEBUG
,
"Connect inbound channel %s
\n
"
,
name
);
switch_channel_set_name
(
channel
,
name
);
switch_channel_set_name
(
channel
,
name
);
switch_channel_set_caller_profile
(
channel
,
tech_pvt
->
caller_profile
);
switch_channel_set_caller_profile
(
channel
,
tech_pvt
->
caller_profile
);
switch_channel_set_variable
(
channel
,
"freetdm_span_name"
,
sigmsg
->
channel
->
span
->
name
);
switch_channel_set_variable
(
channel
,
"freetdm_span_name"
,
ftdm_channel_get_span_name
(
sigmsg
->
channel
)
);
switch_channel_set_variable_printf
(
channel
,
"freetdm_span_number"
,
"%d"
,
s
igmsg
->
channel
->
span_
id
);
switch_channel_set_variable_printf
(
channel
,
"freetdm_span_number"
,
"%d"
,
s
pan
id
);
switch_channel_set_variable_printf
(
channel
,
"freetdm_chan_number"
,
"%d"
,
sigmsg
->
channel
->
chan_
id
);
switch_channel_set_variable_printf
(
channel
,
"freetdm_chan_number"
,
"%d"
,
chan
id
);
switch_channel_set_state
(
channel
,
CS_INIT
);
switch_channel_set_state
(
channel
,
CS_INIT
);
if
(
switch_core_session_thread_launch
(
session
)
!=
SWITCH_STATUS_SUCCESS
)
{
if
(
switch_core_session_thread_launch
(
session
)
!=
SWITCH_STATUS_SUCCESS
)
{
...
@@ -1426,13 +1461,16 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
...
@@ -1426,13 +1461,16 @@ ftdm_status_t ftdm_channel_from_event(ftdm_sigmsg_t *sigmsg, switch_core_session
static
FIO_SIGNAL_CB_FUNCTION
(
on_common_signal
)
static
FIO_SIGNAL_CB_FUNCTION
(
on_common_signal
)
{
{
switch_event_t
*
event
=
NULL
;
switch_event_t
*
event
=
NULL
;
ftdm_alarm_flag_t
alarmbits
=
FTDM_ALARM_NONE
;
uint32_t
chanid
,
spanid
;
chanid
=
ftdm_channel_get_id
(
sigmsg
->
channel
);
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
switch
(
sigmsg
->
event_id
)
{
switch
(
sigmsg
->
event_id
)
{
case
FTDM_SIGEVENT_ALARM_CLEAR
:
case
FTDM_SIGEVENT_ALARM_CLEAR
:
case
FTDM_SIGEVENT_ALARM_TRAP
:
case
FTDM_SIGEVENT_ALARM_TRAP
:
{
{
if
(
ftdm_channel_get_alarms
(
sigmsg
->
channel
)
!=
FTDM_SUCCESS
)
{
if
(
ftdm_channel_get_alarms
(
sigmsg
->
channel
,
&
alarmbits
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"failed to retrieve alarms
\n
"
);
ftdm_log
(
FTDM_LOG_ERROR
,
"failed to retrieve alarms
\n
"
);
return
FTDM_FAIL
;
return
FTDM_FAIL
;
}
}
...
@@ -1441,10 +1479,10 @@ static FIO_SIGNAL_CB_FUNCTION(on_common_signal)
...
@@ -1441,10 +1479,10 @@ static FIO_SIGNAL_CB_FUNCTION(on_common_signal)
return
FTDM_FAIL
;
return
FTDM_FAIL
;
}
}
if
(
sigmsg
->
event_id
==
FTDM_SIGEVENT_ALARM_CLEAR
)
{
if
(
sigmsg
->
event_id
==
FTDM_SIGEVENT_ALARM_CLEAR
)
{
ftdm_log
(
FTDM_LOG_NOTICE
,
"Alarm cleared on channel %d:%d
\n
"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
ftdm_log
(
FTDM_LOG_NOTICE
,
"Alarm cleared on channel %d:%d
\n
"
,
s
panid
,
chan
id
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"condition"
,
"ftdm-alarm-clear"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"condition"
,
"ftdm-alarm-clear"
);
}
else
{
}
else
{
ftdm_log
(
FTDM_LOG_NOTICE
,
"Alarm raised on channel %d:%d
\n
"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
ftdm_log
(
FTDM_LOG_NOTICE
,
"Alarm raised on channel %d:%d
\n
"
,
s
panid
,
chan
id
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"condition"
,
"ftdm-alarm-trap"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"condition"
,
"ftdm-alarm-trap"
);
}
}
}
}
...
@@ -1454,35 +1492,26 @@ static FIO_SIGNAL_CB_FUNCTION(on_common_signal)
...
@@ -1454,35 +1492,26 @@ static FIO_SIGNAL_CB_FUNCTION(on_common_signal)
break
;
break
;
}
}
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"span-name"
,
"%s"
,
sigmsg
->
channel
->
span
->
name
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"span-name"
,
"%s"
,
ftdm_channel_get_span_name
(
sigmsg
->
channel
)
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"span-number"
,
"%d"
,
sigmsg
->
channel
->
span_id
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"span-number"
,
"%d"
,
ftdm_channel_get_span_id
(
sigmsg
->
channel
)
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"chan-number"
,
"%d"
,
sigmsg
->
channel
->
chan_id
);
switch_event_add_header
(
event
,
SWITCH_STACK_BOTTOM
,
"chan-number"
,
"%d"
,
ftdm_channel_get_id
(
sigmsg
->
channel
)
);
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_RECOVER
))
{
if
(
alarmbits
&
FTDM_ALARM_RED
)
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"recover"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"red"
);
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_LOOPBACK
))
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"loopback"
);
}
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_YELLOW
)
)
{
if
(
alarmbits
&
FTDM_ALARM_YELLOW
)
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"yellow"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"yellow"
);
}
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_RED
)
)
{
if
(
alarmbits
&
FTDM_ALARM_RAI
)
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"r
ed
"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"r
ai
"
);
}
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_BLUE
)
)
{
if
(
alarmbits
&
FTDM_ALARM_BLUE
)
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"blue"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"blue"
);
}
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_NOTOPEN
))
{
if
(
alarmbits
&
FTDM_ALARM_AIS
)
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"notopen"
);
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_AIS
))
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"ais"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"ais"
);
}
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_RAI
))
{
if
(
alarmbits
&
FTDM_ALARM_GENERAL
)
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"rai"
);
}
if
(
ftdm_test_alarm_flag
(
sigmsg
->
channel
,
FTDM_ALARM_GENERAL
))
{
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"general"
);
switch_event_add_header_string
(
event
,
SWITCH_STACK_BOTTOM
,
"alarm"
,
"general"
);
}
}
switch_event_fire
(
&
event
);
switch_event_fire
(
&
event
);
...
@@ -1495,8 +1524,15 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
...
@@ -1495,8 +1524,15 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
switch_core_session_t
*
session
=
NULL
;
switch_core_session_t
*
session
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
ftdm_status_t
status
;
ftdm_status_t
status
;
uint32_t
spanid
;
uint32_t
chanid
;
ftdm_caller_data_t
*
callerdata
;
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
chanid
=
ftdm_channel_get_id
(
sigmsg
->
channel
);
callerdata
=
sigmsg
->
raw_data
;
ftdm_log
(
FTDM_LOG_DEBUG
,
"got FXO sig %d:%d [%s]
\n
"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
ftdm_log
(
FTDM_LOG_DEBUG
,
"got FXO sig %d:%d [%s]
\n
"
,
s
panid
,
chan
id
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
switch
(
sigmsg
->
event_id
)
{
switch
(
sigmsg
->
event_id
)
{
...
@@ -1517,7 +1553,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
...
@@ -1517,7 +1553,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
switch_set_flag_locked
(
tech_pvt
,
TFLAG_DEAD
);
switch_set_flag_locked
(
tech_pvt
,
TFLAG_DEAD
);
ftdm_channel_clear_token
(
sigmsg
->
channel
,
0
);
ftdm_channel_clear_token
(
sigmsg
->
channel
,
0
);
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
switch_channel_hangup
(
channel
,
sigmsg
->
channel
->
caller_data
.
hangup_cause
);
switch_channel_hangup
(
channel
,
callerdata
->
hangup_cause
);
ftdm_channel_clear_token
(
sigmsg
->
channel
,
switch_core_session_get_uuid
(
session
));
ftdm_channel_clear_token
(
sigmsg
->
channel
,
switch_core_session_get_uuid
(
session
));
switch_core_session_rwunlock
(
session
);
switch_core_session_rwunlock
(
session
);
}
}
...
@@ -1536,7 +1572,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
...
@@ -1536,7 +1572,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
{
{
status
=
ftdm_channel_from_event
(
sigmsg
,
&
session
);
status
=
ftdm_channel_from_event
(
sigmsg
,
&
session
);
if
(
status
!=
FTDM_SUCCESS
)
{
if
(
status
!=
FTDM_SUCCESS
)
{
ftdm_
set_state_locked
(
sigmsg
->
channel
,
FTDM_CHANNEL_STATE_DOWN
);
ftdm_
channel_call_hangup
(
sigmsg
->
channel
);
}
}
}
}
break
;
break
;
...
@@ -1544,7 +1580,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
...
@@ -1544,7 +1580,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
default:
default:
{
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled msg type %d for channel %d:%d
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled msg type %d for channel %d:%d
\n
"
,
sigmsg
->
event_id
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
sigmsg
->
event_id
,
s
panid
,
chan
id
);
}
}
break
;
break
;
...
@@ -1558,6 +1594,11 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1558,6 +1594,11 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
switch_core_session_t
*
session
=
NULL
;
switch_core_session_t
*
session
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
ftdm_status_t
status
=
FTDM_SUCCESS
;
ftdm_status_t
status
=
FTDM_SUCCESS
;
uint32_t
chanid
,
spanid
,
tokencount
;
chanid
=
ftdm_channel_get_id
(
sigmsg
->
channel
);
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
tokencount
=
ftdm_channel_get_token_count
(
sigmsg
->
channel
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"got FXS sig [%s]
\n
"
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
ftdm_log
(
FTDM_LOG_DEBUG
,
"got FXS sig [%s]
\n
"
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
...
@@ -1582,10 +1623,9 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1582,10 +1623,9 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
break
;
break
;
case
FTDM_SIGEVENT_START
:
case
FTDM_SIGEVENT_START
:
{
{
ftdm_clear_flag_locked
(
sigmsg
->
channel
,
FTDM_CHANNEL_HOLD
);
status
=
ftdm_channel_from_event
(
sigmsg
,
&
session
);
status
=
ftdm_channel_from_event
(
sigmsg
,
&
session
);
if
(
status
!=
FTDM_SUCCESS
)
{
if
(
status
!=
FTDM_SUCCESS
)
{
ftdm_
set_state_locked
(
sigmsg
->
channel
,
FTDM_CHANNEL_ST
ATE_BUSY
);
ftdm_
channel_call_indicate
(
sigmsg
->
channel
,
FTDM_CHANNEL_INDIC
ATE_BUSY
);
}
}
}
}
break
;
break
;
...
@@ -1593,15 +1633,19 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1593,15 +1633,19 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
{
{
private_t
*
tech_pvt
=
NULL
;
private_t
*
tech_pvt
=
NULL
;
switch_call_cause_t
cause
=
SWITCH_CAUSE_NORMAL_CLEARING
;
switch_call_cause_t
cause
=
SWITCH_CAUSE_NORMAL_CLEARING
;
if
(
sigmsg
->
channel
->
token_
count
)
{
if
(
token
count
)
{
switch_core_session_t
*
session_a
,
*
session_b
,
*
session_t
=
NULL
;
switch_core_session_t
*
session_a
,
*
session_b
,
*
session_t
=
NULL
;
switch_channel_t
*
channel_a
=
NULL
,
*
channel_b
=
NULL
;
switch_channel_t
*
channel_a
=
NULL
,
*
channel_b
=
NULL
;
#if 0
int digits = !zstr(sigmsg->channel->caller_data.collected);
int digits = !zstr(sigmsg->channel->caller_data.collected);
#else
int
digits
=
0
;
#endif
const
char
*
br_a_uuid
=
NULL
,
*
br_b_uuid
=
NULL
;
const
char
*
br_a_uuid
=
NULL
,
*
br_b_uuid
=
NULL
;
private_t
*
tech_pvt
=
NULL
;
private_t
*
tech_pvt
=
NULL
;
if
((
session_a
=
switch_core_session_locate
(
sigmsg
->
channel
->
tokens
[
0
]
)))
{
if
((
session_a
=
switch_core_session_locate
(
ftdm_channel_get_token
(
sigmsg
->
channel
,
0
)
)))
{
channel_a
=
switch_core_session_get_channel
(
session_a
);
channel_a
=
switch_core_session_get_channel
(
session_a
);
br_a_uuid
=
switch_channel_get_variable
(
channel_a
,
SWITCH_SIGNAL_BOND_VARIABLE
);
br_a_uuid
=
switch_channel_get_variable
(
channel_a
,
SWITCH_SIGNAL_BOND_VARIABLE
);
...
@@ -1610,7 +1654,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1610,7 +1654,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
switch_clear_flag_locked
(
tech_pvt
,
TFLAG_HOLD
);
switch_clear_flag_locked
(
tech_pvt
,
TFLAG_HOLD
);
}
}
if
((
session_b
=
switch_core_session_locate
(
sigmsg
->
channel
->
tokens
[
1
]
)))
{
if
((
session_b
=
switch_core_session_locate
(
ftdm_channel_get_token
(
sigmsg
->
channel
,
1
)
)))
{
channel_b
=
switch_core_session_get_channel
(
session_b
);
channel_b
=
switch_core_session_get_channel
(
session_b
);
br_b_uuid
=
switch_channel_get_variable
(
channel_b
,
SWITCH_SIGNAL_BOND_VARIABLE
);
br_b_uuid
=
switch_channel_get_variable
(
channel_b
,
SWITCH_SIGNAL_BOND_VARIABLE
);
...
@@ -1630,10 +1674,12 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1630,10 +1674,12 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
}
}
}
}
#if 0
if (session_t) {
if (session_t) {
switch_ivr_session_transfer(session_t, sigmsg->channel->caller_data.collected, NULL, NULL);
switch_ivr_session_transfer(session_t, sigmsg->channel->caller_data.collected, NULL, NULL);
switch_core_session_rwunlock(session_t);
switch_core_session_rwunlock(session_t);
}
}
#endif
if
(
session_a
)
{
if
(
session_a
)
{
switch_core_session_rwunlock
(
session_a
);
switch_core_session_rwunlock
(
session_a
);
...
@@ -1666,8 +1712,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1666,8 +1712,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
break
;
break
;
case
FTDM_SIGEVENT_FLASH
:
case
FTDM_SIGEVENT_FLASH
:
{
{
if
(
ftdm_channel_call_check_hold
(
sigmsg
->
channel
)
&&
tokencount
==
1
)
{
if
(
ftdm_test_flag
(
sigmsg
->
channel
,
FTDM_CHANNEL_HOLD
)
&&
sigmsg
->
channel
->
token_count
==
1
)
{
switch_core_session_t
*
session
;
switch_core_session_t
*
session
;
if
((
session
=
ftdm_channel_get_session
(
sigmsg
->
channel
,
0
)))
{
if
((
session
=
ftdm_channel_get_session
(
sigmsg
->
channel
,
0
)))
{
const
char
*
buuid
;
const
char
*
buuid
;
...
@@ -1677,12 +1722,13 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1677,12 +1722,13 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
tech_pvt
=
switch_core_session_get_private
(
session
);
tech_pvt
=
switch_core_session_get_private
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
buuid
=
switch_channel_get_variable
(
channel
,
SWITCH_SIGNAL_BOND_VARIABLE
);
buuid
=
switch_channel_get_variable
(
channel
,
SWITCH_SIGNAL_BOND_VARIABLE
);
ftdm_
set_state_locked
(
sigmsg
->
channel
,
FTDM_CHANNEL_STATE_UP
);
ftdm_
channel_call_unhold
(
sigmsg
->
channel
);
stop_hold
(
session
,
buuid
);
stop_hold
(
session
,
buuid
);
switch_clear_flag_locked
(
tech_pvt
,
TFLAG_HOLD
);
switch_clear_flag_locked
(
tech_pvt
,
TFLAG_HOLD
);
switch_core_session_rwunlock
(
session
);
switch_core_session_rwunlock
(
session
);
}
}
}
else
if
(
sigmsg
->
channel
->
token_count
==
2
&&
(
SPAN_CONFIG
[
sigmsg
->
span_id
].
analog_options
&
ANALOG_OPTION_3WAY
))
{
#if 0
} else if (tokencount == 2 && (SPAN_CONFIG[sigmsg->span_id].analog_options & ANALOG_OPTION_3WAY)) {
if (ftdm_test_flag(sigmsg->channel, FTDM_CHANNEL_3WAY)) {
if (ftdm_test_flag(sigmsg->channel, FTDM_CHANNEL_3WAY)) {
ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_3WAY);
ftdm_clear_flag(sigmsg->channel, FTDM_CHANNEL_3WAY);
if ((session = ftdm_channel_get_session(sigmsg->channel, 1))) {
if ((session = ftdm_channel_get_session(sigmsg->channel, 1))) {
...
@@ -1703,15 +1749,16 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1703,15 +1749,16 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
|| (SPAN_CONFIG[sigmsg->span_id].analog_options & ANALOG_OPTION_3WAY)
|| (SPAN_CONFIG[sigmsg->span_id].analog_options & ANALOG_OPTION_3WAY)
) {
) {
cycle_foreground(sigmsg->channel, 1, NULL);
cycle_foreground(sigmsg->channel, 1, NULL);
if
(
sigmsg
->
channel
->
token_count
==
1
)
{
if (tokencount == 1) {
ftdm_set_flag_locked
(
sigmsg
->
channel
,
FTDM_CHANNEL_HOLD
);
ftdm_channel_call_hold(sigmsg->channel);
ftdm_set_state_locked
(
sigmsg
->
channel
,
FTDM_CHANNEL_STATE_DIALTONE
);
}
}
#endif
}
}
}
}
break
;
break
;
#if 0
case FTDM_SIGEVENT_COLLECTED_DIGIT:
case FTDM_SIGEVENT_COLLECTED_DIGIT:
{
{
char *dtmf = sigmsg->raw_data;
char *dtmf = sigmsg->raw_data;
...
@@ -1750,11 +1797,12 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1750,11 +1797,12 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
}
}
break;
break;
#endif
default:
default:
{
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled msg type %d for channel %d:%d
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled msg type %d for channel %d:%d
\n
"
,
sigmsg
->
event_id
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
sigmsg
->
event_id
,
s
panid
,
chan
id
);
}
}
break
;
break
;
...
@@ -1765,11 +1813,17 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
...
@@ -1765,11 +1813,17 @@ static FIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
static
FIO_SIGNAL_CB_FUNCTION
(
on_r2_signal
)
static
FIO_SIGNAL_CB_FUNCTION
(
on_r2_signal
)
{
{
uint32_t
phyid
,
chanid
,
spanid
;
switch_core_session_t
*
session
=
NULL
;
switch_core_session_t
*
session
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
ftdm_status_t
status
=
FTDM_SUCCESS
;
ftdm_status_t
status
=
FTDM_SUCCESS
;
ftdm_caller_data_t
*
caller_data
=
sigmsg
->
raw_data
;
phyid
=
ftdm_channel_get_ph_id
(
sigmsg
->
channel
);
chanid
=
ftdm_channel_get_id
(
sigmsg
->
channel
);
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"Got R2 channel sig [%s] in channel %d
\n
"
,
ftdm_signal_event2str
(
sigmsg
->
event_id
),
sigmsg
->
channel
->
physical_chan_
id
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"Got R2 channel sig [%s] in channel %d
\n
"
,
ftdm_signal_event2str
(
sigmsg
->
event_id
),
phy
id
);
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
return
FTDM_SUCCESS
;
return
FTDM_SUCCESS
;
...
@@ -1784,7 +1838,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
...
@@ -1784,7 +1838,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
tech_pvt
=
switch_core_session_get_private
(
session
);
tech_pvt
=
switch_core_session_get_private
(
session
);
switch_set_flag_locked
(
tech_pvt
,
TFLAG_DEAD
);
switch_set_flag_locked
(
tech_pvt
,
TFLAG_DEAD
);
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
switch_channel_hangup
(
channel
,
sigmsg
->
channel
->
caller_data
.
hangup_cause
);
switch_channel_hangup
(
channel
,
caller_data
->
hangup_cause
);
ftdm_channel_clear_token
(
sigmsg
->
channel
,
switch_core_session_get_uuid
(
session
));
ftdm_channel_clear_token
(
sigmsg
->
channel
,
switch_core_session_get_uuid
(
session
));
switch_core_session_rwunlock
(
session
);
switch_core_session_rwunlock
(
session
);
}
}
...
@@ -1798,6 +1852,8 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
...
@@ -1798,6 +1852,8 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
}
}
break
;
break
;
#if 0
FIXME: collected DNIS
/* on DNIS received from the R2 forward side, return status == FTDM_BREAK to stop requesting DNIS */
/* on DNIS received from the R2 forward side, return status == FTDM_BREAK to stop requesting DNIS */
case FTDM_SIGEVENT_COLLECTED_DIGIT:
case FTDM_SIGEVENT_COLLECTED_DIGIT:
{
{
...
@@ -1834,6 +1890,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
...
@@ -1834,6 +1890,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
}
}
}
}
break;
break;
#endif
case
FTDM_SIGEVENT_PROGRESS
:
case
FTDM_SIGEVENT_PROGRESS
:
{
{
...
@@ -1852,7 +1909,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
...
@@ -1852,7 +1909,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
switch_channel_mark_answered
(
channel
);
switch_channel_mark_answered
(
channel
);
if
(
ftdm_channel_command
(
sigmsg
->
channel
,
FTDM_COMMAND_ENABLE_DTMF_DETECT
,
&
tt
)
!=
FTDM_SUCCESS
)
{
if
(
ftdm_channel_command
(
sigmsg
->
channel
,
FTDM_COMMAND_ENABLE_DTMF_DETECT
,
&
tt
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Failed to enable DTMF detection in R2 channel %d:%d
\n
"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Failed to enable DTMF detection in R2 channel %d:%d
\n
"
,
s
panid
,
chan
id
);
}
}
switch_core_session_rwunlock
(
session
);
switch_core_session_rwunlock
(
session
);
}
}
...
@@ -1862,7 +1919,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
...
@@ -1862,7 +1919,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_r2_signal)
default:
default:
{
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled event %d from R2 for channel %d:%d
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled event %d from R2 for channel %d:%d
\n
"
,
sigmsg
->
event_id
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
sigmsg
->
event_id
,
s
panid
,
chan
id
);
}
}
break
;
break
;
}
}
...
@@ -1874,9 +1931,15 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
...
@@ -1874,9 +1931,15 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
{
{
switch_core_session_t
*
session
=
NULL
;
switch_core_session_t
*
session
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
switch_channel_t
*
channel
=
NULL
;
ftdm_caller_data_t
*
caller_data
;
uint32_t
spanid
,
chanid
;
ftdm_log
(
FTDM_LOG_DEBUG
,
"got clear channel sig [%s]
\n
"
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
ftdm_log
(
FTDM_LOG_DEBUG
,
"got clear channel sig [%s]
\n
"
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
caller_data
=
sigmsg
->
raw_data
;
chanid
=
ftdm_channel_get_id
(
sigmsg
->
channel
);
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
return
FTDM_SUCCESS
;
return
FTDM_SUCCESS
;
}
}
...
@@ -1901,7 +1964,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
...
@@ -1901,7 +1964,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
tech_pvt
=
switch_core_session_get_private
(
session
);
tech_pvt
=
switch_core_session_get_private
(
session
);
switch_set_flag_locked
(
tech_pvt
,
TFLAG_DEAD
);
switch_set_flag_locked
(
tech_pvt
,
TFLAG_DEAD
);
channel
=
switch_core_session_get_channel
(
session
);
channel
=
switch_core_session_get_channel
(
session
);
switch_channel_hangup
(
channel
,
sigmsg
->
channel
->
caller_data
.
hangup_cause
);
switch_channel_hangup
(
channel
,
caller_data
->
hangup_cause
);
ftdm_channel_clear_token
(
sigmsg
->
channel
,
switch_core_session_get_uuid
(
session
));
ftdm_channel_clear_token
(
sigmsg
->
channel
,
switch_core_session_get_uuid
(
session
));
switch_core_session_rwunlock
(
session
);
switch_core_session_rwunlock
(
session
);
}
}
...
@@ -1921,7 +1984,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
...
@@ -1921,7 +1984,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
const
char
*
uuid
=
ftdm_channel_get_uuid
(
sigmsg
->
channel
,
0
);
const
char
*
uuid
=
ftdm_channel_get_uuid
(
sigmsg
->
channel
,
0
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Session for channel %d:%d not found [UUID: %s]
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Session for channel %d:%d not found [UUID: %s]
\n
"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
,
(
uuid
)
?
uuid
:
"N/A"
);
s
panid
,
chan
id
,
(
uuid
)
?
uuid
:
"N/A"
);
}
}
}
}
case
FTDM_SIGEVENT_PROGRESS_MEDIA
:
case
FTDM_SIGEVENT_PROGRESS_MEDIA
:
...
@@ -1934,7 +1997,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
...
@@ -1934,7 +1997,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
const
char
*
uuid
=
ftdm_channel_get_uuid
(
sigmsg
->
channel
,
0
);
const
char
*
uuid
=
ftdm_channel_get_uuid
(
sigmsg
->
channel
,
0
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Session for channel %d:%d not found [UUID: %s]
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Session for channel %d:%d not found [UUID: %s]
\n
"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
,
(
uuid
)
?
uuid
:
"N/A"
);
s
panid
,
chan
id
,
(
uuid
)
?
uuid
:
"N/A"
);
}
}
}
}
break
;
break
;
...
@@ -1948,7 +2011,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
...
@@ -1948,7 +2011,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
const
char
*
uuid
=
ftdm_channel_get_uuid
(
sigmsg
->
channel
,
0
);
const
char
*
uuid
=
ftdm_channel_get_uuid
(
sigmsg
->
channel
,
0
);
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Session for channel %d:%d not found [UUID: %s]
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_ERROR
,
"Session for channel %d:%d not found [UUID: %s]
\n
"
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
,
(
uuid
)
?
uuid
:
"N/A"
);
s
panid
,
chan
id
,
(
uuid
)
?
uuid
:
"N/A"
);
}
}
}
}
break
;
break
;
...
@@ -1962,7 +2025,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
...
@@ -1962,7 +2025,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
default:
default:
{
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled msg type %d for channel %d:%d
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled msg type %d for channel %d:%d
\n
"
,
sigmsg
->
event_id
,
s
igmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
sigmsg
->
event_id
,
s
panid
,
chan
id
);
}
}
break
;
break
;
}
}
...
@@ -1973,22 +2036,31 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
...
@@ -1973,22 +2036,31 @@ static FIO_SIGNAL_CB_FUNCTION(on_clear_channel_signal)
static
FIO_SIGNAL_CB_FUNCTION
(
on_ss7_signal
)
static
FIO_SIGNAL_CB_FUNCTION
(
on_ss7_signal
)
{
{
uint32_t
spanid
,
chanid
;
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
return
FTDM_SUCCESS
;
return
FTDM_SUCCESS
;
}
}
ftdm_log
(
FTDM_LOG_DEBUG
,
"got ss7 sig %d:%d [%s]
\n
"
,
sigmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_id
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
chanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"got ss7 sig %d:%d [%s]
\n
"
,
spanid
,
chanid
,
ftdm_signal_event2str
(
sigmsg
->
event_id
));
return
FTDM_SUCCESS
;
return
FTDM_SUCCESS
;
}
}
static
FIO_SIGNAL_CB_FUNCTION
(
on_analog_signal
)
static
FIO_SIGNAL_CB_FUNCTION
(
on_analog_signal
)
{
{
uint32_t
spanid
,
chanid
;
ftdm_chan_type_t
type
;
switch_status_t
status
=
SWITCH_STATUS_FALSE
;
switch_status_t
status
=
SWITCH_STATUS_FALSE
;
spanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
chanid
=
ftdm_channel_get_span_id
(
sigmsg
->
channel
);
type
=
ftdm_channel_get_type
(
sigmsg
->
channel
);
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
if
(
on_common_signal
(
sigmsg
)
==
FTDM_BREAK
)
{
return
FTDM_SUCCESS
;
return
FTDM_SUCCESS
;
}
}
switch
(
sigmsg
->
channel
->
type
)
{
switch
(
type
)
{
case
FTDM_CHAN_TYPE_FXO
:
case
FTDM_CHAN_TYPE_FXO
:
case
FTDM_CHAN_TYPE_EM
:
case
FTDM_CHAN_TYPE_EM
:
{
{
...
@@ -2003,7 +2075,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_analog_signal)
...
@@ -2003,7 +2075,7 @@ static FIO_SIGNAL_CB_FUNCTION(on_analog_signal)
default:
default:
{
{
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled analog channel type %d for channel %d:%d
\n
"
,
switch_log_printf
(
SWITCH_CHANNEL_LOG
,
SWITCH_LOG_WARNING
,
"Unhandled analog channel type %d for channel %d:%d
\n
"
,
sigmsg
->
channel
->
type
,
sigmsg
->
channel
->
span_id
,
sigmsg
->
channel
->
chan_
id
);
type
,
spanid
,
chan
id
);
}
}
break
;
break
;
}
}
...
@@ -2243,7 +2315,7 @@ static switch_status_t load_config(void)
...
@@ -2243,7 +2315,7 @@ static switch_status_t load_config(void)
}
}
if
(
!
span_id
)
{
if
(
!
span_id
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
ss7confnode
=
get_ss7_config_node
(
cfg
,
configname
);
ss7confnode
=
get_ss7_config_node
(
cfg
,
configname
);
...
@@ -2276,14 +2348,14 @@ static switch_status_t load_config(void)
...
@@ -2276,14 +2348,14 @@ static switch_status_t load_config(void)
if
(
ftdm_configure_span
(
"ss7"
,
span
,
on_ss7_signal
,
if
(
ftdm_configure_span
(
"ss7"
,
span
,
on_ss7_signal
,
"confnode"
,
ss7confnode
,
"confnode"
,
ss7confnode
,
"parameters"
,
spanparameters
,
"parameters"
,
spanparameters
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
FTDM_
TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error configuring ss7 FreeTDM span %d
\n
"
,
span_id
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error configuring ss7 FreeTDM span %d
\n
"
,
span_id
);
continue
;
continue
;
}
}
SPAN_CONFIG
[
span
->
span
_id
].
span
=
span
;
SPAN_CONFIG
[
span_id
].
span
=
span
;
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
type
,
"Sangoma (SS7)"
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
type
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
type
,
"Sangoma (SS7)"
,
sizeof
(
SPAN_CONFIG
[
span_id
].
type
));
ftdm_log
(
FTDM_LOG_DEBUG
,
"Configured ss7 FreeTDM span %d with config node %s
\n
"
,
span_id
,
configname
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"Configured ss7 FreeTDM span %d with config node %s
\n
"
,
span_id
,
configname
);
}
}
}
}
...
@@ -2375,7 +2447,7 @@ static switch_status_t load_config(void)
...
@@ -2375,7 +2447,7 @@ static switch_status_t load_config(void)
}
}
if
(
!
span_id
)
{
if
(
!
span_id
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
if
(
ftdm_configure_span
(
"analog"
,
span
,
on_analog_signal
,
if
(
ftdm_configure_span
(
"analog"
,
span
,
on_analog_signal
,
...
@@ -2384,28 +2456,28 @@ static switch_status_t load_config(void)
...
@@ -2384,28 +2456,28 @@ static switch_status_t load_config(void)
"max_dialstr"
,
&
max
,
"max_dialstr"
,
&
max
,
"hotline"
,
hotline
,
"hotline"
,
hotline
,
"enable_callerid"
,
enable_callerid
,
"enable_callerid"
,
enable_callerid
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
FTDM_
TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d
\n
"
,
span_id
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d
\n
"
,
span_id
);
continue
;
continue
;
}
}
SPAN_CONFIG
[
span
->
span
_id
].
span
=
span
;
SPAN_CONFIG
[
span_id
].
span
=
span
;
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
context
,
context
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
context
,
context
);
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
dialplan
,
dialplan
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
dialplan
,
dialplan
);
SPAN_CONFIG
[
span
->
span
_id
].
analog_options
=
analog_options
|
globals
.
analog_options
;
SPAN_CONFIG
[
span_id
].
analog_options
=
analog_options
|
globals
.
analog_options
;
if
(
dial_regex
)
{
if
(
dial_regex
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
dial_regex
,
dial_regex
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
dial_regex
,
dial_regex
);
}
}
if
(
fail_dial_regex
)
{
if
(
fail_dial_regex
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
fail_dial_regex
,
fail_dial_regex
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
fail_dial_regex
,
fail_dial_regex
);
}
}
if
(
hold_music
)
{
if
(
hold_music
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
hold_music
,
hold_music
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
hold_music
,
hold_music
);
}
}
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
type
,
"analog"
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
type
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
type
,
"analog"
,
sizeof
(
SPAN_CONFIG
[
span_id
].
type
));
ftdm_span_start
(
span
);
ftdm_span_start
(
span
);
}
}
}
}
...
@@ -2490,7 +2562,7 @@ static switch_status_t load_config(void)
...
@@ -2490,7 +2562,7 @@ static switch_status_t load_config(void)
}
}
if
(
!
span_id
)
{
if
(
!
span_id
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
...
@@ -2498,28 +2570,28 @@ static switch_status_t load_config(void)
...
@@ -2498,28 +2570,28 @@ static switch_status_t load_config(void)
"tonemap"
,
tonegroup
,
"tonemap"
,
tonegroup
,
"digit_timeout"
,
&
to
,
"digit_timeout"
,
&
to
,
"max_dialstr"
,
&
max
,
"max_dialstr"
,
&
max
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
FTDM_
TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d
\n
"
,
span_id
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d
\n
"
,
span_id
);
continue
;
continue
;
}
}
SPAN_CONFIG
[
span
->
span
_id
].
span
=
span
;
SPAN_CONFIG
[
span_id
].
span
=
span
;
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
context
,
context
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
context
,
context
);
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
dialplan
,
dialplan
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
dialplan
,
dialplan
);
SPAN_CONFIG
[
span
->
span
_id
].
analog_options
=
analog_options
|
globals
.
analog_options
;
SPAN_CONFIG
[
span_id
].
analog_options
=
analog_options
|
globals
.
analog_options
;
if
(
dial_regex
)
{
if
(
dial_regex
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
dial_regex
,
dial_regex
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
dial_regex
,
dial_regex
);
}
}
if
(
fail_dial_regex
)
{
if
(
fail_dial_regex
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
fail_dial_regex
,
fail_dial_regex
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
fail_dial_regex
,
fail_dial_regex
);
}
}
if
(
hold_music
)
{
if
(
hold_music
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
hold_music
,
hold_music
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
hold_music
,
hold_music
);
}
}
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
type
,
"analog_em"
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
type
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
type
,
"analog_em"
,
sizeof
(
SPAN_CONFIG
[
span_id
].
type
));
ftdm_span_start
(
span
);
ftdm_span_start
(
span
);
}
}
}
}
...
@@ -2603,9 +2675,9 @@ static switch_status_t load_config(void)
...
@@ -2603,9 +2675,9 @@ static switch_status_t load_config(void)
continue
;
continue
;
}
}
if
(
!
span_id
)
{
if
(
!
span_id
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
if
(
!
tonegroup
)
{
if
(
!
tonegroup
)
{
tonegroup
=
"us"
;
tonegroup
=
"us"
;
...
@@ -2619,15 +2691,16 @@ static switch_status_t load_config(void)
...
@@ -2619,15 +2691,16 @@ static switch_status_t load_config(void)
"tonemap"
,
tonegroup
,
"tonemap"
,
tonegroup
,
"q921loglevel"
,
q921loglevel
,
"q921loglevel"
,
q921loglevel
,
"q931loglevel"
,
q931loglevel
,
"q931loglevel"
,
q931loglevel
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
FTDM_TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d mode: %s dialect: %s error: %s
\n
"
,
span_id
,
mode
,
dialect
,
span
->
last_error
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d mode: %s dialect: %s error: %s
\n
"
,
span_id
,
mode
,
dialect
,
ftdm_span_get_last_error
(
span
));
continue
;
continue
;
}
}
SPAN_CONFIG
[
span
->
span
_id
].
span
=
span
;
SPAN_CONFIG
[
span_id
].
span
=
span
;
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
type
,
"isdn"
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
type
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
type
,
"isdn"
,
sizeof
(
SPAN_CONFIG
[
span_id
].
type
));
ftdm_span_start
(
span
);
ftdm_span_start
(
span
);
}
}
...
@@ -2701,7 +2774,7 @@ static switch_status_t load_config(void)
...
@@ -2701,7 +2774,7 @@ static switch_status_t load_config(void)
}
}
if
(
!
span_id
)
{
if
(
!
span_id
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
...
@@ -2712,17 +2785,17 @@ static switch_status_t load_config(void)
...
@@ -2712,17 +2785,17 @@ static switch_status_t load_config(void)
"l1"
,
o_l1
,
"l1"
,
o_l1
,
"debug"
,
o_debug
,
"debug"
,
o_debug
,
"opts"
,
opts
,
"opts"
,
opts
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
FTDM_
TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d node: %s switch: %s dp: %s l1: %s debug: %s error: %s
\n
"
,
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d node: %s switch: %s dp: %s l1: %s debug: %s error: %s
\n
"
,
span_id
,
switch_str_nil
(
o_node
),
switch_str_nil
(
o_switch
),
switch_str_nil
(
o_dp
),
switch_str_nil
(
o_l1
),
switch_str_nil
(
o_debug
),
span_id
,
switch_str_nil
(
o_node
),
switch_str_nil
(
o_switch
),
switch_str_nil
(
o_dp
),
switch_str_nil
(
o_l1
),
switch_str_nil
(
o_debug
),
span
->
last_error
);
ftdm_span_get_last_error
(
span
)
);
continue
;
continue
;
}
}
SPAN_CONFIG
[
span
->
span
_id
].
span
=
span
;
SPAN_CONFIG
[
span_id
].
span
=
span
;
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
type
,
"isdn"
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
type
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
type
,
"isdn"
,
sizeof
(
SPAN_CONFIG
[
span_id
].
type
));
ftdm_span_start
(
span
);
ftdm_span_start
(
span
);
}
}
...
@@ -2790,19 +2863,19 @@ static switch_status_t load_config(void)
...
@@ -2790,19 +2863,19 @@ static switch_status_t load_config(void)
}
}
if
(
!
span_id
)
{
if
(
!
span_id
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
if
(
ftdm_configure_span_signaling
(
"sangoma_boost"
,
span
,
on_clear_channel_signal
,
spanparameters
)
!=
FTDM_SUCCESS
)
{
if
(
ftdm_configure_span_signaling
(
"sangoma_boost"
,
span
,
on_clear_channel_signal
,
spanparameters
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d error: %s
\n
"
,
span_id
,
span
->
last_error
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting FreeTDM span %d error: %s
\n
"
,
span_id
,
ftdm_span_get_last_error
(
span
)
);
continue
;
continue
;
}
}
SPAN_CONFIG
[
span
->
span
_id
].
span
=
span
;
SPAN_CONFIG
[
span_id
].
span
=
span
;
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
type
,
"Sangoma (boost)"
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
type
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
type
,
"Sangoma (boost)"
,
sizeof
(
SPAN_CONFIG
[
span_id
].
type
));
boost_spans
[
boosti
++
]
=
span
;
boost_spans
[
boosti
++
]
=
span
;
}
}
}
}
...
@@ -2925,7 +2998,7 @@ static switch_status_t load_config(void)
...
@@ -2925,7 +2998,7 @@ static switch_status_t load_config(void)
}
}
if
(
!
span_id
)
{
if
(
!
span_id
)
{
span_id
=
span
->
span_id
;
span_id
=
ftdm_span_get_id
(
span
)
;
}
}
if
(
ftdm_configure_span
(
"r2"
,
span
,
on_r2_signal
,
if
(
ftdm_configure_span
(
"r2"
,
span
,
on_r2_signal
,
...
@@ -2946,27 +3019,27 @@ static switch_status_t load_config(void)
...
@@ -2946,27 +3019,27 @@ static switch_status_t load_config(void)
"call_files"
,
call_files
,
"call_files"
,
call_files
,
"mfback_timeout"
,
mfback_timeout
,
"mfback_timeout"
,
mfback_timeout
,
"metering_pulse_timeout"
,
metering_pulse_timeout
,
"metering_pulse_timeout"
,
metering_pulse_timeout
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
FTDM_
TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error configuring R2 FreeTDM span %d, error: %s
\n
"
,
ftdm_log
(
FTDM_LOG_ERROR
,
"Error configuring R2 FreeTDM span %d, error: %s
\n
"
,
span_id
,
span
->
last_error
);
span_id
,
ftdm_span_get_last_error
(
span
)
);
continue
;
continue
;
}
}
if
(
dial_regex
)
{
if
(
dial_regex
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
dial_regex
,
dial_regex
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
dial_regex
,
dial_regex
);
}
}
if
(
fail_dial_regex
)
{
if
(
fail_dial_regex
)
{
switch_set_string
(
SPAN_CONFIG
[
span
->
span
_id
].
fail_dial_regex
,
fail_dial_regex
);
switch_set_string
(
SPAN_CONFIG
[
span_id
].
fail_dial_regex
,
fail_dial_regex
);
}
}
SPAN_CONFIG
[
span
->
span
_id
].
span
=
span
;
SPAN_CONFIG
[
span_id
].
span
=
span
;
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
context
,
context
,
sizeof
(
SPAN_CONFIG
[
span_id
].
context
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
dialplan
,
dialplan
,
sizeof
(
SPAN_CONFIG
[
span_id
].
dialplan
));
switch_copy_string
(
SPAN_CONFIG
[
span
->
span_id
].
type
,
"r2"
,
sizeof
(
SPAN_CONFIG
[
span
->
span_id
].
type
));
switch_copy_string
(
SPAN_CONFIG
[
span
_id
].
type
,
"r2"
,
sizeof
(
SPAN_CONFIG
[
span_id
].
type
));
if
(
ftdm_span_start
(
span
)
==
FTDM_FAIL
)
{
if
(
ftdm_span_start
(
span
)
==
FTDM_FAIL
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting R2 FreeTDM span %d, error: %s
\n
"
,
span_id
,
span
->
last_error
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting R2 FreeTDM span %d, error: %s
\n
"
,
span_id
,
ftdm_span_get_last_error
(
span
)
);
continue
;
continue
;
}
}
}
}
...
@@ -2976,9 +3049,10 @@ static switch_status_t load_config(void)
...
@@ -2976,9 +3049,10 @@ static switch_status_t load_config(void)
* of needing all spans to be configured before starting them */
* of needing all spans to be configured before starting them */
for
(
;
i
<
boosti
;
i
++
)
{
for
(
;
i
<
boosti
;
i
++
)
{
boost_span
=
boost_spans
[
i
];
boost_span
=
boost_spans
[
i
];
ftdm_log
(
FTDM_LOG_DEBUG
,
"Starting boost span %d
\n
"
,
boost_span
->
span_id
);
ftdm_log
(
FTDM_LOG_DEBUG
,
"Starting boost span %d
\n
"
,
ftdm_span_get_id
(
boost_span
)
);
if
(
ftdm_span_start
(
boost_span
)
==
FTDM_FAIL
)
{
if
(
ftdm_span_start
(
boost_span
)
==
FTDM_FAIL
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting boost FreeTDM span %d, error: %s
\n
"
,
boost_span
->
span_id
,
boost_span
->
last_error
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error starting boost FreeTDM span %d, error: %s
\n
"
,
ftdm_span_get_id
(
boost_span
),
ftdm_span_get_last_error
(
boost_span
));
continue
;
continue
;
}
}
}
}
...
@@ -2989,15 +3063,37 @@ static switch_status_t load_config(void)
...
@@ -2989,15 +3063,37 @@ static switch_status_t load_config(void)
return
SWITCH_STATUS_SUCCESS
;
return
SWITCH_STATUS_SUCCESS
;
}
}
void
dump_chan
(
ftdm_span_t
*
span
,
uint32_t
chan_id
,
switch_stream_handle_t
*
stream
)
void
dump_chan
(
ftdm_span_t
*
span
,
uint32_t
chan_id
,
switch_stream_handle_t
*
stream
)
{
{
uint32_t
span_id
;
uint32_t
phspan_id
,
phchan_id
;
const
char
*
chan_type
;
const
char
*
state
;
const
char
*
last_state
;
float
txgain
,
rxgain
;
ftdm_alarm_flag_t
alarmflag
;
ftdm_caller_data_t
*
caller_data
;
ftdm_channel_t
*
ftdmchan
;
ftdm_signaling_status_t
sigstatus
=
FTDM_SIG_STATE_DOWN
;
ftdm_signaling_status_t
sigstatus
=
FTDM_SIG_STATE_DOWN
;
if
(
chan_id
>
span
->
chan_count
)
{
if
(
chan_id
>
ftdm_span_get_chan_count
(
span
))
{
return
;
return
;
}
}
ftdm_channel_get_sig_status
(
span
->
channels
[
chan_id
],
&
sigstatus
);
ftdmchan
=
ftdm_span_get_channel
(
span
,
chan_id
);
span_id
=
ftdm_span_get_id
(
span
);
phspan_id
=
ftdm_channel_get_ph_span_id
(
ftdmchan
);
phchan_id
=
ftdm_channel_get_ph_id
(
ftdmchan
);
chan_type
=
ftdm_chan_type2str
(
ftdm_channel_get_type
(
ftdmchan
));
state
=
ftdm_channel_get_state_str
(
ftdmchan
);
last_state
=
ftdm_channel_get_last_state_str
(
ftdmchan
);
ftdm_channel_command
(
ftdmchan
,
FTDM_COMMAND_GET_RX_GAIN
,
&
rxgain
);
ftdm_channel_command
(
ftdmchan
,
FTDM_COMMAND_GET_TX_GAIN
,
&
txgain
);
caller_data
=
ftdm_channel_get_caller_data
(
ftdmchan
);
ftdm_channel_get_sig_status
(
ftdmchan
,
&
sigstatus
);
ftdm_channel_get_alarms
(
ftdmchan
,
&
alarmflag
);
stream
->
write_function
(
stream
,
stream
->
write_function
(
stream
,
"span_id: %u
\n
"
"span_id: %u
\n
"
"chan_id: %u
\n
"
"chan_id: %u
\n
"
...
@@ -3018,35 +3114,59 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
...
@@ -3018,35 +3114,59 @@ void dump_chan(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *stre
"dnis: %s
\n
"
"dnis: %s
\n
"
"rdnis: %s
\n
"
"rdnis: %s
\n
"
"cause: %s
\n\n
"
,
"cause: %s
\n\n
"
,
span
->
channels
[
chan_id
]
->
span_id
,
span_id
,
span
->
channels
[
chan_id
]
->
chan_id
,
chan_id
,
span
->
channels
[
chan_id
]
->
physical_span_id
,
phspan_id
,
span
->
channels
[
chan_id
]
->
physical_chan_id
,
phchan_id
,
(
span
->
channels
[
chan_id
]
->
alarm_flags
)
?
"DOWN"
:
"UP"
,
alarmflag
?
"alarmed"
:
"ok"
,
ftdm_signaling_status2str
(
sigstatus
),
ftdm_signaling_status2str
(
sigstatus
),
ftdm_chan_type2str
(
span
->
channels
[
chan_id
]
->
type
),
chan_type
,
ftdm_channel_state2str
(
span
->
channels
[
chan_id
]
->
state
),
state
,
ftdm_channel_state2str
(
span
->
channels
[
chan_id
]
->
last_state
),
last_state
,
span
->
channels
[
chan_id
]
->
txgain
,
txgain
,
span
->
channels
[
chan_id
]
->
rxgain
,
rxgain
,
span
->
channels
[
chan_id
]
->
caller_data
.
cid_date
,
caller_data
->
cid_date
,
span
->
channels
[
chan_id
]
->
caller_data
.
cid_name
,
caller_data
->
cid_name
,
span
->
channels
[
chan_id
]
->
caller_data
.
cid_num
.
digits
,
caller_data
->
cid_num
.
digits
,
span
->
channels
[
chan_id
]
->
caller_data
.
ani
.
digits
,
caller_data
->
ani
.
digits
,
span
->
channels
[
chan_id
]
->
caller_data
.
aniII
,
caller_data
->
aniII
,
span
->
channels
[
chan_id
]
->
caller_data
.
dnis
.
digits
,
caller_data
->
dnis
.
digits
,
span
->
channels
[
chan_id
]
->
caller_data
.
rdnis
.
digits
,
caller_data
->
rdnis
.
digits
,
switch_channel_cause2str
(
span
->
channels
[
chan_id
]
->
caller_data
.
hangup_cause
)
switch_channel_cause2str
(
caller_data
->
hangup_cause
));
);
}
}
void
dump_chan_xml
(
ftdm_span_t
*
span
,
uint32_t
chan_id
,
switch_stream_handle_t
*
stream
)
void
dump_chan_xml
(
ftdm_span_t
*
span
,
uint32_t
chan_id
,
switch_stream_handle_t
*
stream
)
{
{
uint32_t
span_id
;
uint32_t
phspan_id
,
phchan_id
;
const
char
*
chan_type
;
const
char
*
state
;
const
char
*
last_state
;
float
txgain
,
rxgain
;
ftdm_caller_data_t
*
caller_data
;
ftdm_channel_t
*
ftdmchan
;
ftdm_alarm_flag_t
alarmflag
;
ftdm_signaling_status_t
sigstatus
=
FTDM_SIG_STATE_DOWN
;
ftdm_signaling_status_t
sigstatus
=
FTDM_SIG_STATE_DOWN
;
if
(
chan_id
>
span
->
chan_count
)
{
if
(
chan_id
>
ftdm_span_get_chan_count
(
span
))
{
return
;
return
;
}
}
ftdm_channel_get_sig_status
(
span
->
channels
[
chan_id
],
&
sigstatus
);
ftdmchan
=
ftdm_span_get_channel
(
span
,
chan_id
);
span_id
=
ftdm_span_get_id
(
span
);
phspan_id
=
ftdm_channel_get_ph_span_id
(
ftdmchan
);
phchan_id
=
ftdm_channel_get_ph_id
(
ftdmchan
);
chan_type
=
ftdm_chan_type2str
(
ftdm_channel_get_type
(
ftdmchan
));
state
=
ftdm_channel_get_state_str
(
ftdmchan
);
last_state
=
ftdm_channel_get_last_state_str
(
ftdmchan
);
ftdm_channel_command
(
ftdmchan
,
FTDM_COMMAND_GET_RX_GAIN
,
&
rxgain
);
ftdm_channel_command
(
ftdmchan
,
FTDM_COMMAND_GET_TX_GAIN
,
&
txgain
);
caller_data
=
ftdm_channel_get_caller_data
(
ftdmchan
);
ftdm_channel_get_sig_status
(
ftdmchan
,
&
sigstatus
);
ftdm_channel_get_alarms
(
ftdmchan
,
&
alarmflag
);
stream
->
write_function
(
stream
,
stream
->
write_function
(
stream
,
" <channel>
\n
"
" <channel>
\n
"
" <span-id>%u</span-id>
\n
"
" <span-id>%u</span-id>
\n
"
...
@@ -3069,26 +3189,25 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
...
@@ -3069,26 +3189,25 @@ void dump_chan_xml(ftdm_span_t *span, uint32_t chan_id, switch_stream_handle_t *
" <rdnis>%s</rdnis>
\n
"
" <rdnis>%s</rdnis>
\n
"
" <cause>%s</cause>
\n
"
" <cause>%s</cause>
\n
"
" </channel>
\n
"
,
" </channel>
\n
"
,
span
->
channels
[
chan_id
]
->
span_id
,
span_id
,
span
->
channels
[
chan_id
]
->
chan_id
,
chan_id
,
span
->
channels
[
chan_id
]
->
physical_span_id
,
phspan_id
,
span
->
channels
[
chan_id
]
->
physical_chan_id
,
phchan_id
,
(
span
->
channels
[
chan_id
]
->
alarm_flags
)
?
"DOWN"
:
"UP"
,
alarmflag
?
"alarmed"
:
"ok"
,
ftdm_signaling_status2str
(
sigstatus
),
ftdm_signaling_status2str
(
sigstatus
),
ftdm_chan_type2str
(
span
->
channels
[
chan_id
]
->
type
),
chan_type
,
ftdm_channel_state2str
(
span
->
channels
[
chan_id
]
->
state
),
state
,
ftdm_channel_state2str
(
span
->
channels
[
chan_id
]
->
last_state
),
last_state
,
span
->
channels
[
chan_id
]
->
txgain
,
txgain
,
span
->
channels
[
chan_id
]
->
rxgain
,
rxgain
,
span
->
channels
[
chan_id
]
->
caller_data
.
cid_date
,
caller_data
->
cid_date
,
span
->
channels
[
chan_id
]
->
caller_data
.
cid_name
,
caller_data
->
cid_name
,
span
->
channels
[
chan_id
]
->
caller_data
.
cid_num
.
digits
,
caller_data
->
cid_num
.
digits
,
span
->
channels
[
chan_id
]
->
caller_data
.
ani
.
digits
,
caller_data
->
ani
.
digits
,
span
->
channels
[
chan_id
]
->
caller_data
.
aniII
,
caller_data
->
aniII
,
span
->
channels
[
chan_id
]
->
caller_data
.
dnis
.
digits
,
caller_data
->
dnis
.
digits
,
span
->
channels
[
chan_id
]
->
caller_data
.
rdnis
.
digits
,
caller_data
->
rdnis
.
digits
,
switch_channel_cause2str
(
span
->
channels
[
chan_id
]
->
caller_data
.
hangup_cause
)
switch_channel_cause2str
(
caller_data
->
hangup_cause
));
);
}
}
#define FT_SYNTAX "list || dump <span_id> [<chan_id>] || q931_pcap <span_id> on|off [pcapfilename without suffix] || gains <txgain> <rxgain> <span_id> [<chan_id>]"
#define FT_SYNTAX "list || dump <span_id> [<chan_id>] || q931_pcap <span_id> on|off [pcapfilename without suffix] || gains <txgain> <rxgain> <span_id> [<chan_id>]"
...
@@ -3135,14 +3254,15 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3135,14 +3254,15 @@ SWITCH_STANDARD_API(ft_function)
stream
->
write_function
(
stream
,
"<error>invalid span</error>
\n
"
);
stream
->
write_function
(
stream
,
"<error>invalid span</error>
\n
"
);
}
else
{
}
else
{
if
(
chan_id
)
{
if
(
chan_id
)
{
if
(
chan_id
>
span
->
chan_count
)
{
if
(
chan_id
>
ftdm_span_get_chan_count
(
span
)
)
{
stream
->
write_function
(
stream
,
"<error>invalid channel</error>
\n
"
);
stream
->
write_function
(
stream
,
"<error>invalid channel</error>
\n
"
);
}
else
{
}
else
{
dump_chan_xml
(
span
,
chan_id
,
stream
);
dump_chan_xml
(
span
,
chan_id
,
stream
);
}
}
}
else
{
}
else
{
uint32_t
j
;
uint32_t
j
;
for
(
j
=
1
;
j
<=
span
->
chan_count
;
j
++
)
{
uint32_t
ccount
=
ftdm_span_get_chan_count
(
span
);
for
(
j
=
1
;
j
<=
ccount
;
j
++
)
{
dump_chan_xml
(
span
,
j
,
stream
);
dump_chan_xml
(
span
,
j
,
stream
);
}
}
...
@@ -3154,16 +3274,16 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3154,16 +3274,16 @@ SWITCH_STANDARD_API(ft_function)
stream
->
write_function
(
stream
,
"-ERR invalid span
\n
"
);
stream
->
write_function
(
stream
,
"-ERR invalid span
\n
"
);
}
else
{
}
else
{
if
(
chan_id
)
{
if
(
chan_id
)
{
if
(
chan_id
>
span
->
chan_count
)
{
if
(
chan_id
>
ftdm_span_get_chan_count
(
span
)
)
{
stream
->
write_function
(
stream
,
"-ERR invalid channel
\n
"
);
stream
->
write_function
(
stream
,
"-ERR invalid channel
\n
"
);
}
else
{
}
else
{
dump_chan
(
span
,
chan_id
,
stream
);
dump_chan
(
span
,
chan_id
,
stream
);
}
}
}
else
{
}
else
{
uint32_t
j
;
uint32_t
j
;
uint32_t
ccount
=
ftdm_span_get_chan_count
(
span
);
stream
->
write_function
(
stream
,
"+OK
\n
"
);
stream
->
write_function
(
stream
,
"+OK
\n
"
);
for
(
j
=
1
;
j
<=
span
->
chan_
count
;
j
++
)
{
for
(
j
=
1
;
j
<=
c
count
;
j
++
)
{
dump_chan
(
span
,
j
,
stream
);
dump_chan
(
span
,
j
,
stream
);
}
}
...
@@ -3198,10 +3318,10 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3198,10 +3318,10 @@ SWITCH_STANDARD_API(ft_function)
"hold_music: %s
\n
"
"hold_music: %s
\n
"
"analog_options %s
\n
"
,
"analog_options %s
\n
"
,
j
,
j
,
SPAN_CONFIG
[
j
].
span
->
name
,
ftdm_span_get_name
(
SPAN_CONFIG
[
j
].
span
)
,
SPAN_CONFIG
[
j
].
type
,
SPAN_CONFIG
[
j
].
type
,
ftdm_signaling_status2str
(
sigstatus
),
ftdm_signaling_status2str
(
sigstatus
),
SPAN_CONFIG
[
j
].
span
->
chan_count
,
ftdm_span_get_chan_count
(
SPAN_CONFIG
[
j
].
span
)
,
SPAN_CONFIG
[
j
].
dialplan
,
SPAN_CONFIG
[
j
].
dialplan
,
SPAN_CONFIG
[
j
].
context
,
SPAN_CONFIG
[
j
].
context
,
SPAN_CONFIG
[
j
].
dial_regex
,
SPAN_CONFIG
[
j
].
dial_regex
,
...
@@ -3222,9 +3342,9 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3222,9 +3342,9 @@ SWITCH_STANDARD_API(ft_function)
"hold_music: %s
\n
"
"hold_music: %s
\n
"
"analog_options %s
\n
"
,
"analog_options %s
\n
"
,
j
,
j
,
SPAN_CONFIG
[
j
].
span
->
name
,
ftdm_span_get_name
(
SPAN_CONFIG
[
j
].
span
)
,
SPAN_CONFIG
[
j
].
type
,
SPAN_CONFIG
[
j
].
type
,
SPAN_CONFIG
[
j
].
span
->
chan_count
,
ftdm_span_get_chan_count
(
SPAN_CONFIG
[
j
].
span
)
,
SPAN_CONFIG
[
j
].
dialplan
,
SPAN_CONFIG
[
j
].
dialplan
,
SPAN_CONFIG
[
j
].
context
,
SPAN_CONFIG
[
j
].
context
,
SPAN_CONFIG
[
j
].
dial_regex
,
SPAN_CONFIG
[
j
].
dial_regex
,
...
@@ -3290,14 +3410,14 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3290,14 +3410,14 @@ SWITCH_STANDARD_API(ft_function)
tmp_path
=
switch_mprintf
(
"%s%s%s.pcap"
,
SWITCH_GLOBAL_dirs
.
log_dir
,
SWITCH_PATH_SEPARATOR
,
pcapfn
);
tmp_path
=
switch_mprintf
(
"%s%s%s.pcap"
,
SWITCH_GLOBAL_dirs
.
log_dir
,
SWITCH_PATH_SEPARATOR
,
pcapfn
);
if
(
!
strcasecmp
(
argv
[
2
],
"on"
))
{
if
(
!
strcasecmp
(
argv
[
2
],
"on"
))
{
if
(
ftdm_configure_span
(
"isdn"
,
span
,
on_clear_channel_signal
,
"q931topcap"
,
1
,
"pcapfilename"
,
tmp_path
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
if
(
ftdm_configure_span
(
"isdn"
,
span
,
on_clear_channel_signal
,
"q931topcap"
,
1
,
"pcapfilename"
,
tmp_path
,
FTDM_
TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_WARNING
,
"Error couldn't (re-)enable Q931-To-Pcap!
\n
"
);
ftdm_log
(
FTDM_LOG_WARNING
,
"Error couldn't (re-)enable Q931-To-Pcap!
\n
"
);
goto
end
;
goto
end
;
}
else
{
}
else
{
stream
->
write_function
(
stream
,
"+OK
\n
"
);
stream
->
write_function
(
stream
,
"+OK
\n
"
);
}
}
}
else
if
(
!
strcasecmp
(
argv
[
2
],
"off"
))
{
}
else
if
(
!
strcasecmp
(
argv
[
2
],
"off"
))
{
if
(
ftdm_configure_span
(
"isdn"
,
span
,
on_clear_channel_signal
,
"q931topcap"
,
0
,
TAG_END
)
!=
FTDM_SUCCESS
)
{
if
(
ftdm_configure_span
(
"isdn"
,
span
,
on_clear_channel_signal
,
"q931topcap"
,
0
,
FTDM_
TAG_END
)
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"Error couldn't enable Q931-To-Pcap!
\n
"
);
ftdm_log
(
FTDM_LOG_ERROR
,
"Error couldn't enable Q931-To-Pcap!
\n
"
);
goto
end
;
goto
end
;
}
else
{
}
else
{
...
@@ -3313,6 +3433,8 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3313,6 +3433,8 @@ SWITCH_STANDARD_API(ft_function)
float
txgain
=
0
.
0
;
float
txgain
=
0
.
0
;
float
rxgain
=
0
.
0
;
float
rxgain
=
0
.
0
;
uint32_t
chan_id
=
0
;
uint32_t
chan_id
=
0
;
uint32_t
ccount
=
0
;
ftdm_channel_t
*
chan
;
ftdm_span_t
*
span
=
NULL
;
ftdm_span_t
*
span
=
NULL
;
if
(
argc
<
4
)
{
if
(
argc
<
4
)
{
stream
->
write_function
(
stream
,
"-ERR Usage: ft gains <txgain> <rxgain> <span_id> [<chan_id>]
\n
"
);
stream
->
write_function
(
stream
,
"-ERR Usage: ft gains <txgain> <rxgain> <span_id> [<chan_id>]
\n
"
);
...
@@ -3325,7 +3447,7 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3325,7 +3447,7 @@ SWITCH_STANDARD_API(ft_function)
}
}
if
(
argc
>
4
)
{
if
(
argc
>
4
)
{
chan_id
=
atoi
(
argv
[
4
]);
chan_id
=
atoi
(
argv
[
4
]);
if
(
chan_id
>
span
->
chan_count
)
{
if
(
chan_id
>
ftdm_span_get_chan_count
(
span
)
)
{
stream
->
write_function
(
stream
,
"-ERR invalid chan
\n
"
);
stream
->
write_function
(
stream
,
"-ERR invalid chan
\n
"
);
goto
end
;
goto
end
;
}
}
...
@@ -3336,13 +3458,17 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3336,13 +3458,17 @@ SWITCH_STANDARD_API(ft_function)
stream
->
write_function
(
stream
,
"-ERR invalid gains
\n
"
);
stream
->
write_function
(
stream
,
"-ERR invalid gains
\n
"
);
goto
end
;
goto
end
;
}
}
if
(
chan_id
)
{
if
(
chan_id
)
{
ftdm_channel_command
(
span
->
channels
[
chan_id
],
FTDM_COMMAND_SET_RX_GAIN
,
&
rxgain
);
chan
=
ftdm_span_get_channel
(
span
,
chan_id
);
ftdm_channel_command
(
span
->
channels
[
chan_id
],
FTDM_COMMAND_SET_TX_GAIN
,
&
txgain
);
ftdm_channel_command
(
chan
,
FTDM_COMMAND_SET_RX_GAIN
,
&
rxgain
);
ftdm_channel_command
(
chan
,
FTDM_COMMAND_SET_TX_GAIN
,
&
txgain
);
}
else
{
}
else
{
for
(
i
=
1
;
i
<
span
->
chan_count
;
i
++
)
{
ccount
=
ftdm_span_get_chan_count
(
span
);
ftdm_channel_command
(
span
->
channels
[
i
],
FTDM_COMMAND_SET_RX_GAIN
,
&
rxgain
);
for
(
i
=
1
;
i
<
ccount
;
i
++
)
{
ftdm_channel_command
(
span
->
channels
[
i
],
FTDM_COMMAND_SET_TX_GAIN
,
&
txgain
);
chan
=
ftdm_span_get_channel
(
span
,
i
);
ftdm_channel_command
(
chan
,
FTDM_COMMAND_SET_RX_GAIN
,
&
rxgain
);
ftdm_channel_command
(
chan
,
FTDM_COMMAND_SET_TX_GAIN
,
&
txgain
);
}
}
}
}
stream
->
write_function
(
stream
,
"+OK gains set to Rx %f and Tx %f
\n
"
,
rxgain
,
txgain
);
stream
->
write_function
(
stream
,
"+OK gains set to Rx %f and Tx %f
\n
"
,
rxgain
,
txgain
);
...
@@ -3352,7 +3478,7 @@ SWITCH_STANDARD_API(ft_function)
...
@@ -3352,7 +3478,7 @@ SWITCH_STANDARD_API(ft_function)
if
(
rply
)
{
if
(
rply
)
{
stream
->
write_function
(
stream
,
"%s"
,
rply
);
stream
->
write_function
(
stream
,
"%s"
,
rply
);
f
tdm_safe_f
ree
(
rply
);
free
(
rply
);
}
else
{
}
else
{
stream
->
write_function
(
stream
,
"-ERR Usage: %s
\n
"
,
FT_SYNTAX
);
stream
->
write_function
(
stream
,
"-ERR Usage: %s
\n
"
,
FT_SYNTAX
);
}
}
...
...
libs/freetdm/src/ftdm_io.c
浏览文件 @
c1657714
...
@@ -452,28 +452,38 @@ static ftdm_status_t ftdm_span_destroy(ftdm_span_t *span)
...
@@ -452,28 +452,38 @@ static ftdm_status_t ftdm_span_destroy(ftdm_span_t *span)
return
status
;
return
status
;
}
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_get_alarms
(
ftdm_channel_t
*
ftdmchan
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_get_alarms
(
ftdm_channel_t
*
ftdmchan
,
ftdm_alarm_flag_t
*
alarmbits
)
{
{
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_assert_return
(
alarmbits
!=
NULL
,
FTDM_FAIL
,
"null argument
\n
"
);
alarmbits
=
FTDM_ALARM_NONE
;
ftdm_channel_lock
(
ftdmchan
);
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_CONFIGURED
))
{
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_CONFIGURED
))
{
if
(
ftdmchan
->
span
->
fio
->
get_alarms
)
{
if
(
ftdmchan
->
span
->
fio
->
get_alarms
)
{
if
((
status
=
ftdmchan
->
span
->
fio
->
get_alarms
(
ftdmchan
))
==
FTDM_SUCCESS
)
{
if
((
status
=
ftdmchan
->
span
->
fio
->
get_alarms
(
ftdmchan
))
==
FTDM_SUCCESS
)
{
*
ftdmchan
->
last_error
=
'\0'
;
*
ftdmchan
->
last_error
=
'\0'
;
*
alarmbits
=
ftdmchan
->
alarm_flags
;
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_RED
))
{
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_RED
))
{
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"RED/"
);
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"RED/"
);
}
}
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_YELLOW
))
{
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_YELLOW
))
{
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"YELLOW/"
);
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"YELLOW/"
);
}
}
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_RAI
))
{
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"RAI/"
);
}
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_BLUE
))
{
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_BLUE
))
{
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"BLUE/"
);
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"BLUE/"
);
}
}
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_
LOOPBACK
))
{
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_
AIS
))
{
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"
LOOP
/"
);
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"
AIS
/"
);
}
}
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_
RECOVER
))
{
if
(
ftdm_test_alarm_flag
(
ftdmchan
,
FTDM_ALARM_
GENERAL
))
{
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"
RECOVER/
"
);
snprintf
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
),
sizeof
(
ftdmchan
->
last_error
)
-
strlen
(
ftdmchan
->
last_error
),
"
GENERAL
"
);
}
}
*
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
)
-
1
)
=
'\0'
;
*
(
ftdmchan
->
last_error
+
strlen
(
ftdmchan
->
last_error
)
-
1
)
=
'\0'
;
...
@@ -482,7 +492,9 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_get_alarms(ftdm_channel_t *ftdmchan)
...
@@ -482,7 +492,9 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_get_alarms(ftdm_channel_t *ftdmchan)
status
=
FTDM_NOTIMPL
;
status
=
FTDM_NOTIMPL
;
}
}
}
}
ftdm_channel_unlock
(
ftdmchan
);
return
status
;
return
status
;
}
}
...
@@ -990,6 +1002,58 @@ FT_DECLARE(void) ftdm_channel_replace_token(ftdm_channel_t *ftdmchan, const char
...
@@ -990,6 +1002,58 @@ FT_DECLARE(void) ftdm_channel_replace_token(ftdm_channel_t *ftdmchan, const char
}
}
}
}
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_token_count
(
const
ftdm_channel_t
*
ftdmchan
)
{
uint32_t
count
;
ftdm_mutex_lock
(
ftdmchan
->
mutex
);
count
=
ftdmchan
->
token_count
;
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
return
count
;
}
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_io_interval
(
const
ftdm_channel_t
*
ftdmchan
)
{
uint32_t
count
;
ftdm_mutex_lock
(
ftdmchan
->
mutex
);
count
=
ftdmchan
->
effective_interval
;
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
return
count
;
}
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_io_packet_len
(
const
ftdm_channel_t
*
ftdmchan
)
{
uint32_t
count
;
ftdm_mutex_lock
(
ftdmchan
->
mutex
);
count
=
ftdmchan
->
packet_len
;
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
return
count
;
}
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_type
(
const
ftdm_channel_t
*
ftdmchan
)
{
return
ftdmchan
->
type
;
}
FT_DECLARE
(
ftdm_codec_t
)
ftdm_channel_get_codec
(
const
ftdm_channel_t
*
ftdmchan
)
{
return
ftdmchan
->
effective_codec
;
}
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_token
(
const
ftdm_channel_t
*
ftdmchan
,
uint32_t
tokenid
)
{
const
char
*
token
=
NULL
;
ftdm_mutex_lock
(
ftdmchan
->
mutex
);
if
(
ftdmchan
->
token_count
<=
tokenid
)
{
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
return
NULL
;
}
token
=
ftdmchan
->
tokens
[
tokenid
];
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
return
token
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_add_token
(
ftdm_channel_t
*
ftdmchan
,
char
*
token
,
int
end
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_add_token
(
ftdm_channel_t
*
ftdmchan
,
char
*
token
,
int
end
)
{
{
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_status_t
status
=
FTDM_FAIL
;
...
@@ -1212,6 +1276,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_state(ftdm_channel_t *ftdmchan, ftdm_
...
@@ -1212,6 +1276,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_state(ftdm_channel_t *ftdmchan, ftdm_
return
ok
?
FTDM_SUCCESS
:
FTDM_FAIL
;
return
ok
?
FTDM_SUCCESS
:
FTDM_FAIL
;
}
}
FT_DECLARE
(
uint32_t
)
ftdm_group_get_id
(
const
ftdm_group_t
*
group
)
{
return
group
->
group_id
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_group_channel_use_count
(
ftdm_group_t
*
group
,
uint32_t
*
count
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_group_channel_use_count
(
ftdm_group_t
*
group
,
uint32_t
*
count
)
{
{
...
@@ -1607,6 +1675,16 @@ FT_DECLARE(uint32_t) ftdm_channel_get_span_id(const ftdm_channel_t *ftdmchan)
...
@@ -1607,6 +1675,16 @@ FT_DECLARE(uint32_t) ftdm_channel_get_span_id(const ftdm_channel_t *ftdmchan)
return
ftdmchan
->
span_id
;
return
ftdmchan
->
span_id
;
}
}
FT_DECLARE
(
ftdm_span_t
*
)
ftdm_channel_get_span
(
const
ftdm_channel_t
*
ftdmchan
)
{
return
ftdmchan
->
span
;
}
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_span_name
(
const
ftdm_channel_t
*
ftdmchan
)
{
return
ftdmchan
->
span
->
name
;
}
FT_DECLARE
(
uint32_t
)
ftdm_span_get_id
(
const
ftdm_span_t
*
span
)
FT_DECLARE
(
uint32_t
)
ftdm_span_get_id
(
const
ftdm_span_t
*
span
)
{
{
return
span
->
span_id
;
return
span
->
span_id
;
...
@@ -1617,14 +1695,123 @@ FT_DECLARE(const char *) ftdm_span_get_name(const ftdm_span_t *span)
...
@@ -1617,14 +1695,123 @@ FT_DECLARE(const char *) ftdm_span_get_name(const ftdm_span_t *span)
return
span
->
name
;
return
span
->
name
;
}
}
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_active
(
const
ftdm_channel_t
*
ftdmchan
)
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_name
(
const
ftdm_channel_t
*
ftdmchan
)
{
return
ftdmchan
->
chan_name
;
}
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_number
(
const
ftdm_channel_t
*
ftdmchan
)
{
return
ftdmchan
->
chan_number
;
}
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_hold
(
const
ftdm_channel_t
*
ftdmchan
)
{
ftdm_bool_t
condition
;
ftdm_channel_lock
(
ftdmchan
);
condition
=
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_HOLD
);
ftdm_channel_unlock
(
ftdmchan
);
return
condition
;
}
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_answered
(
const
ftdm_channel_t
*
ftdmchan
)
{
ftdm_bool_t
condition
=
FTDM_FALSE
;
ftdm_channel_lock
(
ftdmchan
);
condition
=
(
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_UP
)
?
FTDM_TRUE
:
FTDM_FALSE
;
ftdm_channel_unlock
(
ftdmchan
);
return
condition
;
}
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_busy
(
const
ftdm_channel_t
*
ftdmchan
)
{
ftdm_bool_t
condition
=
FTDM_FALSE
;
ftdm_channel_lock
(
ftdmchan
);
condition
=
(
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_BUSY
)
?
FTDM_TRUE
:
FTDM_FALSE
;
ftdm_channel_unlock
(
ftdmchan
);
return
condition
;
}
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_hangup
(
const
ftdm_channel_t
*
ftdmchan
)
{
ftdm_bool_t
condition
=
FTDM_FALSE
;
ftdm_channel_lock
(
ftdmchan
);
condition
=
(
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_HANGUP
||
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_TERMINATING
)
?
FTDM_TRUE
:
FTDM_FALSE
;
ftdm_channel_unlock
(
ftdmchan
);
return
condition
;
}
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_done
(
const
ftdm_channel_t
*
ftdmchan
)
{
ftdm_bool_t
condition
=
FTDM_FALSE
;
ftdm_channel_lock
(
ftdmchan
);
condition
=
(
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_DOWN
)
?
FTDM_TRUE
:
FTDM_FALSE
;
ftdm_channel_unlock
(
ftdmchan
);
return
condition
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_hold
(
ftdm_channel_t
*
ftdmchan
)
{
{
return
(
ftdmchan
->
state
==
FTDM_CHANNEL_STATE_UP
)
?
FTDM_TRUE
:
FTDM_FALSE
;
ftdm_channel_lock
(
ftdmchan
);
ftdm_set_flag
(
ftdmchan
,
FTDM_CHANNEL_HOLD
);
ftdm_set_state_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_DIALTONE
);
ftdm_channel_unlock
(
ftdmchan
);
return
FTDM_SUCCESS
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_unhold
(
ftdm_channel_t
*
ftdmchan
)
{
ftdm_channel_lock
(
ftdmchan
);
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_HOLD
))
{
ftdm_set_state_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_UP
);
}
ftdm_channel_unlock
(
ftdmchan
);
return
FTDM_SUCCESS
;
}
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_answer
(
ftdm_channel_t
*
ftdmchan
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_answer
(
ftdm_channel_t
*
ftdmchan
)
{
{
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_UP
);
ftdm_channel_lock
(
ftdmchan
);
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_ANSWERED
))
{
return
FTDM_SUCCESS
;
}
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_OUTBOUND
))
{
ftdm_set_flag
(
ftdmchan
,
FTDM_CHANNEL_ANSWERED
);
ftdm_set_flag
(
ftdmchan
,
FTDM_CHANNEL_PROGRESS
);
ftdm_set_flag
(
ftdmchan
,
FTDM_CHANNEL_MEDIA
);
ftdm_channel_unlock
(
ftdmchan
);
return
FTDM_SUCCESS
;
}
if
(
ftdmchan
->
state
<
FTDM_CHANNEL_STATE_PROGRESS
)
{
ftdm_set_state_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS
);
}
if
(
ftdmchan
->
state
<
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
)
{
ftdm_set_state_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
);
}
ftdm_set_state_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_UP
);
ftdm_channel_unlock
(
ftdmchan
);
return
FTDM_SUCCESS
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_hangup_with_cause
(
ftdm_channel_t
*
ftdmchan
,
ftdm_call_cause_t
cause
)
{
ftdmchan
->
caller_data
.
hangup_cause
=
cause
;
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_HANGUP
);
return
FTDM_SUCCESS
;
return
FTDM_SUCCESS
;
}
}
...
@@ -1639,15 +1826,101 @@ FT_DECLARE(const char *) ftdm_channel_get_last_error(const ftdm_channel_t *ftdmc
...
@@ -1639,15 +1826,101 @@ FT_DECLARE(const char *) ftdm_channel_get_last_error(const ftdm_channel_t *ftdmc
return
ftdmchan
->
last_error
;
return
ftdmchan
->
last_error
;
}
}
FT_DECLARE
(
const
char
*
)
ftdm_span_get_last_error
(
const
ftdm_span_t
*
span
)
{
return
span
->
last_error
;
}
FT_DECLARE
(
ftdm_caller_data_t
*
)
ftdm_channel_get_caller_data
(
ftdm_channel_t
*
ftdmchan
)
{
return
&
ftdmchan
->
caller_data
;
}
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_state_str
(
const
ftdm_channel_t
*
ftdmchan
)
{
const
char
*
state
;
ftdm_channel_lock
(
ftdmchan
);
state
=
ftdm_channel_state2str
(
ftdmchan
->
state
);
ftdm_channel_unlock
(
ftdmchan
);
return
state
;
}
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_last_state_str
(
const
ftdm_channel_t
*
ftdmchan
)
{
const
char
*
state
;
ftdm_channel_lock
(
ftdmchan
);
state
=
ftdm_channel_state2str
(
ftdmchan
->
last_state
);
ftdm_channel_unlock
(
ftdmchan
);
return
state
;
}
FT_DECLARE
(
ftdm_channel_t
*
)
ftdm_span_get_channel
(
const
ftdm_span_t
*
span
,
uint32_t
chanid
)
{
ftdm_channel_t
*
chan
;
ftdm_mutex_lock
(
span
->
mutex
);
if
(
chanid
==
0
||
chanid
>
span
->
chan_count
)
{
ftdm_mutex_unlock
(
span
->
mutex
);
return
NULL
;
}
chan
=
span
->
channels
[
chanid
];
ftdm_mutex_unlock
(
span
->
mutex
);
return
chan
;
}
FT_DECLARE
(
uint32_t
)
ftdm_span_get_chan_count
(
const
ftdm_span_t
*
span
)
{
uint32_t
count
;
ftdm_mutex_lock
(
span
->
mutex
);
count
=
span
->
chan_count
;
ftdm_mutex_unlock
(
span
->
mutex
);
return
count
;
}
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_ph_span_id
(
const
ftdm_channel_t
*
ftdmchan
)
{
uint32_t
id
;
ftdm_channel_lock
(
ftdmchan
);
id
=
ftdmchan
->
physical_span_id
;
ftdm_channel_unlock
(
ftdmchan
);
return
id
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_indicate
(
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_indication_t
indication
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_indicate
(
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_indication_t
indication
)
{
{
switch
(
indication
)
{
switch
(
indication
)
{
/* FIXME: ring and busy cannot be used with all signaling stacks
* (particularly isdn stacks I think, we should emulate or just move to hangup with busy cause) */
case
FTDM_CHANNEL_INDICATE_RING
:
case
FTDM_CHANNEL_INDICATE_RING
:
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_RING
);
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_RING
);
break
;
case
FTDM_CHANNEL_INDICATE_BUSY
:
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_BUSY
);
break
;
case
FTDM_CHANNEL_INDICATE_PROGRESS
:
case
FTDM_CHANNEL_INDICATE_PROGRESS
:
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
);
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_OUTBOUND
))
{
ftdm_set_flag_locked
(
ftdmchan
,
FTDM_CHANNEL_PROGRESS
);
}
else
{
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS
);
}
break
;
case
FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA
:
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_OUTBOUND
))
{
ftdm_set_flag_locked
(
ftdmchan
,
FTDM_CHANNEL_PROGRESS
);
ftdm_set_flag_locked
(
ftdmchan
,
FTDM_CHANNEL_MEDIA
);
}
else
{
if
(
ftdmchan
->
state
<
FTDM_CHANNEL_STATE_PROGRESS
)
{
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS
);
}
ftdm_set_state_locked_wait
(
ftdmchan
,
FTDM_CHANNEL_STATE_PROGRESS_MEDIA
);
}
break
;
default
:
default
:
ftdm_log
(
FTDM_LOG_
DEBU
G
,
"Do not know how to indicate %d
\n
"
,
indication
);
ftdm_log
(
FTDM_LOG_
WARNIN
G
,
"Do not know how to indicate %d
\n
"
,
indication
);
return
FTDM_FAIL
;
return
FTDM_FAIL
;
}
}
return
FTDM_SUCCESS
;
return
FTDM_SUCCESS
;
...
@@ -3762,17 +4035,41 @@ FT_DECLARE(ftdm_status_t) ftdm_group_create(ftdm_group_t **group, const char *na
...
@@ -3762,17 +4035,41 @@ FT_DECLARE(ftdm_status_t) ftdm_group_create(ftdm_group_t **group, const char *na
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_send_signal
(
ftdm_span_t
*
span
,
ftdm_sigmsg_t
*
sigmsg
)
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_send_signal
(
ftdm_span_t
*
span
,
ftdm_sigmsg_t
*
sigmsg
)
{
{
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_status_t
status
=
FTDM_FAIL
;
if
(
sigmsg
->
channel
)
{
if
(
sigmsg
->
channel
)
{
ftdm_mutex_lock
(
sigmsg
->
channel
->
mutex
);
ftdm_mutex_lock
(
sigmsg
->
channel
->
mutex
);
}
}
if
(
sigmsg
->
event_id
==
FTDM_SIGEVENT_SIGSTATUS_CHANGED
)
{
/* some core things to do on special events */
switch
(
sigmsg
->
event_id
)
{
case
FTDM_SIGEVENT_SIGSTATUS_CHANGED
:
if
(
*
((
ftdm_signaling_status_t
*
)(
sigmsg
->
raw_data
))
==
FTDM_SIG_STATE_UP
)
{
if
(
*
((
ftdm_signaling_status_t
*
)(
sigmsg
->
raw_data
))
==
FTDM_SIG_STATE_UP
)
{
ftdm_set_flag
(
sigmsg
->
channel
,
FTDM_CHANNEL_SIG_UP
);
ftdm_set_flag
(
sigmsg
->
channel
,
FTDM_CHANNEL_SIG_UP
);
}
else
{
}
else
{
ftdm_clear_flag
(
sigmsg
->
channel
,
FTDM_CHANNEL_SIG_UP
);
ftdm_clear_flag
(
sigmsg
->
channel
,
FTDM_CHANNEL_SIG_UP
);
}
}
break
;
case
FTDM_SIGEVENT_START
:
sigmsg
->
raw_data
=
&
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?
* */
ftdm_clear_flag
(
sigmsg
->
channel
,
FTDM_CHANNEL_HOLD
);
break
;
case
FTDM_SIGEVENT_STOP
:
sigmsg
->
raw_data
=
&
sigmsg
->
channel
->
caller_data
;
break
;
default
:
break
;
}
}
/* call the user callback only if set */
if
(
span
->
signal_cb
)
{
if
(
span
->
signal_cb
)
{
status
=
span
->
signal_cb
(
sigmsg
);
status
=
span
->
signal_cb
(
sigmsg
);
}
}
...
@@ -3780,6 +4077,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
...
@@ -3780,6 +4077,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
if
(
sigmsg
->
channel
)
{
if
(
sigmsg
->
channel
)
{
ftdm_mutex_unlock
(
sigmsg
->
channel
->
mutex
);
ftdm_mutex_unlock
(
sigmsg
->
channel
->
mutex
);
}
}
return
status
;
return
status
;
}
}
...
...
libs/freetdm/src/include/freetdm.h
浏览文件 @
c1657714
...
@@ -42,6 +42,15 @@
...
@@ -42,6 +42,15 @@
#include "ftdm_declare.h"
#include "ftdm_declare.h"
#define FTDM_MAX_CHANNELS_PHYSICAL_SPAN 32
#define FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN 32
#define FTDM_MAX_CHANNELS_SPAN FTDM_MAX_CHANNELS_PHYSICAL_SPAN * FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN
#define FTDM_MAX_SPANS_INTERFACE 128
#define FTDM_MAX_CHANNELS_GROUP 1024
#define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE
typedef
enum
{
typedef
enum
{
FTDM_SUCCESS
,
FTDM_SUCCESS
,
FTDM_FAIL
,
FTDM_FAIL
,
...
@@ -63,6 +72,70 @@ extern "C" {
...
@@ -63,6 +72,70 @@ extern "C" {
#define FTDM_MAX_NAME_STR_SZ 80
#define FTDM_MAX_NAME_STR_SZ 80
#define FTDM_MAX_NUMBER_STR_SZ 20
#define FTDM_MAX_NUMBER_STR_SZ 20
typedef
enum
{
FTDM_CAUSE_NONE
=
0
,
FTDM_CAUSE_UNALLOCATED
=
1
,
FTDM_CAUSE_NO_ROUTE_TRANSIT_NET
=
2
,
FTDM_CAUSE_NO_ROUTE_DESTINATION
=
3
,
FTDM_CAUSE_CHANNEL_UNACCEPTABLE
=
6
,
FTDM_CAUSE_CALL_AWARDED_DELIVERED
=
7
,
FTDM_CAUSE_NORMAL_CLEARING
=
16
,
FTDM_CAUSE_USER_BUSY
=
17
,
FTDM_CAUSE_NO_USER_RESPONSE
=
18
,
FTDM_CAUSE_NO_ANSWER
=
19
,
FTDM_CAUSE_SUBSCRIBER_ABSENT
=
20
,
FTDM_CAUSE_CALL_REJECTED
=
21
,
FTDM_CAUSE_NUMBER_CHANGED
=
22
,
FTDM_CAUSE_REDIRECTION_TO_NEW_DESTINATION
=
23
,
FTDM_CAUSE_EXCHANGE_ROUTING_ERROR
=
25
,
FTDM_CAUSE_DESTINATION_OUT_OF_ORDER
=
27
,
FTDM_CAUSE_INVALID_NUMBER_FORMAT
=
28
,
FTDM_CAUSE_FACILITY_REJECTED
=
29
,
FTDM_CAUSE_RESPONSE_TO_STATUS_ENQUIRY
=
30
,
FTDM_CAUSE_NORMAL_UNSPECIFIED
=
31
,
FTDM_CAUSE_NORMAL_CIRCUIT_CONGESTION
=
34
,
FTDM_CAUSE_NETWORK_OUT_OF_ORDER
=
38
,
FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE
=
41
,
FTDM_CAUSE_SWITCH_CONGESTION
=
42
,
FTDM_CAUSE_ACCESS_INFO_DISCARDED
=
43
,
FTDM_CAUSE_REQUESTED_CHAN_UNAVAIL
=
44
,
FTDM_CAUSE_PRE_EMPTED
=
45
,
FTDM_CAUSE_FACILITY_NOT_SUBSCRIBED
=
50
,
FTDM_CAUSE_OUTGOING_CALL_BARRED
=
52
,
FTDM_CAUSE_INCOMING_CALL_BARRED
=
54
,
FTDM_CAUSE_BEARERCAPABILITY_NOTAUTH
=
57
,
FTDM_CAUSE_BEARERCAPABILITY_NOTAVAIL
=
58
,
FTDM_CAUSE_SERVICE_UNAVAILABLE
=
63
,
FTDM_CAUSE_BEARERCAPABILITY_NOTIMPL
=
65
,
FTDM_CAUSE_CHAN_NOT_IMPLEMENTED
=
66
,
FTDM_CAUSE_FACILITY_NOT_IMPLEMENTED
=
69
,
FTDM_CAUSE_SERVICE_NOT_IMPLEMENTED
=
79
,
FTDM_CAUSE_INVALID_CALL_REFERENCE
=
81
,
FTDM_CAUSE_INCOMPATIBLE_DESTINATION
=
88
,
FTDM_CAUSE_INVALID_MSG_UNSPECIFIED
=
95
,
FTDM_CAUSE_MANDATORY_IE_MISSING
=
96
,
FTDM_CAUSE_MESSAGE_TYPE_NONEXIST
=
97
,
FTDM_CAUSE_WRONG_MESSAGE
=
98
,
FTDM_CAUSE_IE_NONEXIST
=
99
,
FTDM_CAUSE_INVALID_IE_CONTENTS
=
100
,
FTDM_CAUSE_WRONG_CALL_STATE
=
101
,
FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE
=
102
,
FTDM_CAUSE_MANDATORY_IE_LENGTH_ERROR
=
103
,
FTDM_CAUSE_PROTOCOL_ERROR
=
111
,
FTDM_CAUSE_INTERWORKING
=
127
,
FTDM_CAUSE_SUCCESS
=
142
,
FTDM_CAUSE_ORIGINATOR_CANCEL
=
487
,
FTDM_CAUSE_CRASH
=
500
,
FTDM_CAUSE_SYSTEM_SHUTDOWN
=
501
,
FTDM_CAUSE_LOSE_RACE
=
502
,
FTDM_CAUSE_MANAGER_REQUEST
=
503
,
FTDM_CAUSE_BLIND_TRANSFER
=
600
,
FTDM_CAUSE_ATTENDED_TRANSFER
=
601
,
FTDM_CAUSE_ALLOTTED_TIMEOUT
=
602
,
FTDM_CAUSE_USER_CHALLENGE
=
603
,
FTDM_CAUSE_MEDIA_TIMEOUT
=
604
}
ftdm_call_cause_t
;
typedef
enum
{
typedef
enum
{
FTDM_TOP_DOWN
,
FTDM_TOP_DOWN
,
FTDM_BOTTOM_UP
FTDM_BOTTOM_UP
...
@@ -180,6 +253,10 @@ typedef struct ftdm_caller_data {
...
@@ -180,6 +253,10 @@ typedef struct ftdm_caller_data {
uint32_t
chan_id
;
uint32_t
chan_id
;
}
ftdm_caller_data_t
;
}
ftdm_caller_data_t
;
typedef
enum
{
FTDM_TONE_DTMF
=
(
1
<<
0
)
}
ftdm_tone_type_t
;
typedef
enum
{
typedef
enum
{
FTDM_SIGEVENT_START
,
FTDM_SIGEVENT_START
,
FTDM_SIGEVENT_STOP
,
FTDM_SIGEVENT_STOP
,
...
@@ -427,6 +504,7 @@ typedef enum {
...
@@ -427,6 +504,7 @@ typedef enum {
FTDM_CHANNEL_INDICATE_RING
,
FTDM_CHANNEL_INDICATE_RING
,
FTDM_CHANNEL_INDICATE_PROCEED
,
FTDM_CHANNEL_INDICATE_PROCEED
,
FTDM_CHANNEL_INDICATE_PROGRESS
,
FTDM_CHANNEL_INDICATE_PROGRESS
,
FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA
,
FTDM_CHANNEL_INDICATE_BUSY
,
FTDM_CHANNEL_INDICATE_BUSY
,
}
ftdm_channel_indication_t
;
}
ftdm_channel_indication_t
;
...
@@ -435,6 +513,16 @@ typedef enum {
...
@@ -435,6 +513,16 @@ typedef enum {
FTDM_TRUE
FTDM_TRUE
}
ftdm_bool_t
;
}
ftdm_bool_t
;
typedef
enum
{
FTDM_ALARM_NONE
=
0
,
FTDM_ALARM_RED
=
(
1
<<
1
),
FTDM_ALARM_YELLOW
=
(
1
<<
2
),
FTDM_ALARM_RAI
=
(
1
<<
3
),
FTDM_ALARM_BLUE
=
(
1
<<
4
),
FTDM_ALARM_AIS
=
(
1
<<
5
),
FTDM_ALARM_GENERAL
=
(
1
<<
30
)
}
ftdm_alarm_flag_t
;
/*! \brief Override the default queue handler */
/*! \brief Override the default queue handler */
FT_DECLARE
(
ftdm_status_t
)
ftdm_global_set_queue_handler
(
ftdm_queue_handler_t
*
handler
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_global_set_queue_handler
(
ftdm_queue_handler_t
*
handler
);
...
@@ -442,22 +530,37 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_call_answer(ftdm_channel_t *ftdmchan);
...
@@ -442,22 +530,37 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_call_answer(ftdm_channel_t *ftdmchan);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_place
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_place
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_indicate
(
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_indication_t
indication
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_indicate
(
ftdm_channel_t
*
ftdmchan
,
ftdm_channel_indication_t
indication
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_hangup
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_hangup
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_active
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_hangup_with_cause
(
ftdm_channel_t
*
ftdmchan
,
ftdm_call_cause_t
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_hold
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_call_unhold
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_answered
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_busy
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_hangup
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_done
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_channel_call_check_hold
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_set_sig_status
(
ftdm_channel_t
*
ftdmchan
,
ftdm_signaling_status_t
status
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_set_sig_status
(
ftdm_channel_t
*
ftdmchan
,
ftdm_signaling_status_t
status
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_get_sig_status
(
ftdm_channel_t
*
ftdmchan
,
ftdm_signaling_status_t
*
status
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_get_sig_status
(
ftdm_channel_t
*
ftdmchan
,
ftdm_signaling_status_t
*
status
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_set_sig_status
(
ftdm_span_t
*
span
,
ftdm_signaling_status_t
status
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_set_sig_status
(
ftdm_span_t
*
span
,
ftdm_signaling_status_t
status
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_get_sig_status
(
ftdm_span_t
*
span
,
ftdm_signaling_status_t
*
status
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_get_sig_status
(
ftdm_span_t
*
span
,
ftdm_signaling_status_t
*
status
);
FT_DECLARE
(
void
)
ftdm_channel_rotate_tokens
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
void
)
ftdm_channel_clear_detected_tones
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
void
)
ftdm_channel_clear_detected_tones
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
void
)
ftdm_channel_clear_needed_tones
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
void
)
ftdm_channel_clear_needed_tones
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_last_error
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
void
)
ftdm_channel_rotate_tokens
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_get_alarms
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_clear_token
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
token
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_clear_token
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
token
);
FT_DECLARE
(
void
)
ftdm_channel_replace_token
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
old_token
,
const
char
*
new_token
);
FT_DECLARE
(
void
)
ftdm_channel_replace_token
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
old_token
,
const
char
*
new_token
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_add_token
(
ftdm_channel_t
*
ftdmchan
,
char
*
token
,
int
end
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_add_token
(
ftdm_channel_t
*
ftdmchan
,
char
*
token
,
int
end
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_token
(
const
ftdm_channel_t
*
ftdmchan
,
uint32_t
tokenid
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_token_count
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_io_interval
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_io_packet_len
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_codec_t
)
ftdm_channel_get_codec
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_last_error
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_get_alarms
(
ftdm_channel_t
*
ftdmchan
,
ftdm_alarm_flag_t
*
alarmbits
);
FT_DECLARE
(
ftdm_chan_type_t
)
ftdm_channel_get_type
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_size_t
)
ftdm_channel_dequeue_dtmf
(
ftdm_channel_t
*
ftdmchan
,
char
*
dtmf
,
ftdm_size_t
len
);
FT_DECLARE
(
ftdm_size_t
)
ftdm_channel_dequeue_dtmf
(
ftdm_channel_t
*
ftdmchan
,
char
*
dtmf
,
ftdm_size_t
len
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_queue_dtmf
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
dtmf
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_queue_dtmf
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
dtmf
);
...
@@ -465,6 +568,7 @@ FT_DECLARE(void) ftdm_channel_flush_dtmf(ftdm_channel_t *ftdmchan);
...
@@ -465,6 +568,7 @@ FT_DECLARE(void) ftdm_channel_flush_dtmf(ftdm_channel_t *ftdmchan);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_poll_event
(
ftdm_span_t
*
span
,
uint32_t
ms
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_poll_event
(
ftdm_span_t
*
span
,
uint32_t
ms
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_next_event
(
ftdm_span_t
*
span
,
ftdm_event_t
**
event
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_next_event
(
ftdm_span_t
*
span
,
ftdm_event_t
**
event
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_find
(
uint32_t
id
,
ftdm_span_t
**
span
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_find
(
uint32_t
id
,
ftdm_span_t
**
span
);
FT_DECLARE
(
const
char
*
)
ftdm_span_get_last_error
(
const
ftdm_span_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_create
(
ftdm_io_interface_t
*
fio
,
ftdm_span_t
**
span
,
const
char
*
name
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_create
(
ftdm_io_interface_t
*
fio
,
ftdm_span_t
**
span
,
const
char
*
name
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_close_all
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_close_all
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_add_channel
(
ftdm_span_t
*
span
,
ftdm_socket_t
sockfd
,
ftdm_chan_type_t
type
,
ftdm_channel_t
**
chan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_add_channel
(
ftdm_span_t
*
span
,
ftdm_socket_t
sockfd
,
ftdm_chan_type_t
type
,
ftdm_channel_t
**
chan
);
...
@@ -479,6 +583,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id,
...
@@ -479,6 +583,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open(uint32_t span_id, uint32_t chan_id,
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_open_chan
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_open_chan
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_channel_use_count
(
ftdm_span_t
*
span
,
uint32_t
*
count
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_channel_use_count
(
ftdm_span_t
*
span
,
uint32_t
*
count
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_group_channel_use_count
(
ftdm_group_t
*
group
,
uint32_t
*
count
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_group_channel_use_count
(
ftdm_group_t
*
group
,
uint32_t
*
count
);
FT_DECLARE
(
uint32_t
)
ftdm_group_get_id
(
const
ftdm_group_t
*
group
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_open_by_span
(
uint32_t
span_id
,
ftdm_direction_t
direction
,
ftdm_caller_data_t
*
caller_data
,
ftdm_channel_t
**
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_open_by_span
(
uint32_t
span_id
,
ftdm_direction_t
direction
,
ftdm_caller_data_t
*
caller_data
,
ftdm_channel_t
**
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_open_by_group
(
uint32_t
group_id
,
ftdm_direction_t
direction
,
ftdm_caller_data_t
*
caller_data
,
ftdm_channel_t
**
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_open_by_group
(
uint32_t
group_id
,
ftdm_direction_t
direction
,
ftdm_caller_data_t
*
caller_data
,
ftdm_channel_t
**
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_close
(
ftdm_channel_t
**
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_close
(
ftdm_channel_t
**
ftdmchan
);
...
@@ -489,8 +594,13 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
...
@@ -489,8 +594,13 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_write(ftdm_channel_t *ftdmchan, void *dat
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_add_var
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
var_name
,
const
char
*
value
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_add_var
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
var_name
,
const
char
*
value
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_var
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
var_name
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_var
(
ftdm_channel_t
*
ftdmchan
,
const
char
*
var_name
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_clear_vars
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_clear_vars
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_span_t
*
)
ftdm_channel_get_span
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_span_id
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_span_id
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_ph_span_id
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_span_name
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_id
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_id
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_name
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_number
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_ph_id
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
uint32_t
)
ftdm_channel_get_ph_id
(
const
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_global_init
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_global_init
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_global_configuration
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_global_configuration
(
void
);
...
@@ -500,7 +610,6 @@ FT_DECLARE(void) ftdm_global_set_crash_policy(ftdm_crash_policy_t policy);
...
@@ -500,7 +610,6 @@ FT_DECLARE(void) ftdm_global_set_crash_policy(ftdm_crash_policy_t policy);
FT_DECLARE
(
void
)
ftdm_global_set_logger
(
ftdm_logger_t
logger
);
FT_DECLARE
(
void
)
ftdm_global_set_logger
(
ftdm_logger_t
logger
);
FT_DECLARE
(
void
)
ftdm_global_set_default_logger
(
int
level
);
FT_DECLARE
(
void
)
ftdm_global_set_default_logger
(
int
level
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_running
(
void
);
FT_DECLARE
(
ftdm_bool_t
)
ftdm_running
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_init
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_configure_span
(
const
char
*
type
,
ftdm_span_t
*
span
,
fio_signal_cb_t
sig_cb
,
...);
FT_DECLARE
(
ftdm_status_t
)
ftdm_configure_span
(
const
char
*
type
,
ftdm_span_t
*
span
,
fio_signal_cb_t
sig_cb
,
...);
FT_DECLARE
(
ftdm_status_t
)
ftdm_configure_span_signaling
(
const
char
*
type
,
ftdm_span_t
*
span
,
fio_signal_cb_t
sig_cb
,
ftdm_conf_parameter_t
*
parameters
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_configure_span_signaling
(
const
char
*
type
,
ftdm_span_t
*
span
,
fio_signal_cb_t
sig_cb
,
ftdm_conf_parameter_t
*
parameters
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_start
(
ftdm_span_t
*
span
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_start
(
ftdm_span_t
*
span
);
...
@@ -510,12 +619,23 @@ FT_DECLARE(ftdm_status_t) ftdm_span_find_by_name(const char *name, ftdm_span_t *
...
@@ -510,12 +619,23 @@ FT_DECLARE(ftdm_status_t) ftdm_span_find_by_name(const char *name, ftdm_span_t *
FT_DECLARE
(
uint32_t
)
ftdm_span_get_id
(
const
ftdm_span_t
*
span
);
FT_DECLARE
(
uint32_t
)
ftdm_span_get_id
(
const
ftdm_span_t
*
span
);
FT_DECLARE
(
const
char
*
)
ftdm_span_get_name
(
const
ftdm_span_t
*
span
);
FT_DECLARE
(
const
char
*
)
ftdm_span_get_name
(
const
ftdm_span_t
*
span
);
FT_DECLARE
(
char
*
)
ftdm_api_execute
(
const
char
*
type
,
const
char
*
cmd
);
FT_DECLARE
(
char
*
)
ftdm_api_execute
(
const
char
*
type
,
const
char
*
cmd
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_set_caller_data
(
ftdm_channel_t
*
ftdmchan
,
ftdm_caller_data_t
*
caller_data
);
FT_DECLARE
(
void
)
ftdm_cpu_monitor_disable
(
void
);
FT_DECLARE
(
void
)
ftdm_cpu_monitor_disable
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_conf_node_create
(
const
char
*
name
,
ftdm_conf_node_t
**
node
,
ftdm_conf_node_t
*
parent
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_conf_node_create
(
const
char
*
name
,
ftdm_conf_node_t
**
node
,
ftdm_conf_node_t
*
parent
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_conf_node_add_param
(
ftdm_conf_node_t
*
node
,
const
char
*
param
,
const
char
*
val
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_conf_node_add_param
(
ftdm_conf_node_t
*
node
,
const
char
*
param
,
const
char
*
val
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_conf_node_destroy
(
ftdm_conf_node_t
*
node
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_conf_node_destroy
(
ftdm_conf_node_t
*
node
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_configure_span_channels
(
ftdm_span_t
*
span
,
const
char
*
str
,
ftdm_channel_config_t
*
chan_config
,
unsigned
*
configured
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_configure_span_channels
(
ftdm_span_t
*
span
,
const
char
*
str
,
ftdm_channel_config_t
*
chan_config
,
unsigned
*
configured
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_done
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_channel_t
*
)
ftdm_span_get_channel
(
const
ftdm_span_t
*
span
,
uint32_t
chanid
);
FT_DECLARE
(
uint32_t
)
ftdm_span_get_chan_count
(
const
ftdm_span_t
*
span
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_set_caller_data
(
ftdm_channel_t
*
ftdmchan
,
ftdm_caller_data_t
*
caller_data
);
FT_DECLARE
(
ftdm_caller_data_t
*
)
ftdm_channel_get_caller_data
(
ftdm_channel_t
*
channel
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_state_str
(
const
ftdm_channel_t
*
channel
);
FT_DECLARE
(
const
char
*
)
ftdm_channel_get_last_state_str
(
const
ftdm_channel_t
*
channel
);
/* TODO: try to get rid of this API */
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_init
(
ftdm_channel_t
*
ftdmchan
);
#define FIO_CODEC_ARGS (void *data, ftdm_size_t max, ftdm_size_t *datalen)
#define FIO_CODEC_ARGS (void *data, ftdm_size_t max, ftdm_size_t *datalen)
#define FIO_CODEC_FUNCTION(name) FT_DECLARE_NONSTD(ftdm_status_t) name FIO_CODEC_ARGS
#define FIO_CODEC_FUNCTION(name) FT_DECLARE_NONSTD(ftdm_status_t) name FIO_CODEC_ARGS
...
...
libs/freetdm/src/include/private/ftdm_core.h
浏览文件 @
c1657714
...
@@ -120,14 +120,6 @@
...
@@ -120,14 +120,6 @@
extern
"C"
{
extern
"C"
{
#endif
#endif
#define FTDM_MAX_CHANNELS_PHYSICAL_SPAN 32
#define FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN 32
#define FTDM_MAX_CHANNELS_SPAN FTDM_MAX_CHANNELS_PHYSICAL_SPAN * FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN
#define FTDM_MAX_SPANS_INTERFACE 128
#define FTDM_MAX_CHANNELS_GROUP 1024
#define FTDM_MAX_GROUPS_INTERFACE FTDM_MAX_SPANS_INTERFACE
#define GOTO_STATUS(label,st) status = st; goto label ;
#define GOTO_STATUS(label,st) status = st; goto label ;
#define ftdm_copy_string(x,y,z) strncpy(x, y, z - 1)
#define ftdm_copy_string(x,y,z) strncpy(x, y, z - 1)
...
@@ -542,7 +534,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_state(ftdm_channel_t *ftdmchan, ftdm_
...
@@ -542,7 +534,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_state(ftdm_channel_t *ftdmchan, ftdm_
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_load_tones
(
ftdm_span_t
*
span
,
const
char
*
mapname
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_load_tones
(
ftdm_span_t
*
span
,
const
char
*
mapname
);
FT_DECLARE
(
ftdm_time_t
)
ftdm_current_time_in_ms
(
void
);
FT_DECLARE
(
ftdm_time_t
)
ftdm_current_time_in_ms
(
void
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_done
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_use
(
ftdm_channel_t
*
ftdmchan
);
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_use
(
ftdm_channel_t
*
ftdmchan
);
...
@@ -639,6 +630,9 @@ FIO_CODEC_FUNCTION(fio_alaw2ulaw);
...
@@ -639,6 +630,9 @@ FIO_CODEC_FUNCTION(fio_alaw2ulaw);
#define ftdm_array_len(array) sizeof(array)/sizeof(array[0])
#define ftdm_array_len(array) sizeof(array)/sizeof(array[0])
#define ftdm_channel_lock(chan) ftdm_mutex_lock(chan->mutex)
#define ftdm_channel_unlock(chan) ftdm_mutex_unlock(chan->mutex)
static
__inline__
void
ftdm_abort
(
void
)
static
__inline__
void
ftdm_abort
(
void
)
{
{
#ifdef __cplusplus
#ifdef __cplusplus
...
...
libs/freetdm/src/include/private/ftdm_types.h
浏览文件 @
c1657714
...
@@ -151,19 +151,6 @@ typedef enum {
...
@@ -151,19 +151,6 @@ typedef enum {
#define OOB_STRINGS "DTMF", "ONHOOK", "OFFHOOK", "WINK", "FLASH", "RING_START", "RING_STOP", "ALARM_TRAP", "ALARM_CLEAR", "NOOP", "CAS_BITS_CHANGE", "INVALID"
#define OOB_STRINGS "DTMF", "ONHOOK", "OFFHOOK", "WINK", "FLASH", "RING_START", "RING_STOP", "ALARM_TRAP", "ALARM_CLEAR", "NOOP", "CAS_BITS_CHANGE", "INVALID"
FTDM_STR2ENUM_P
(
ftdm_str2ftdm_oob_event
,
ftdm_oob_event2str
,
ftdm_oob_event_t
)
FTDM_STR2ENUM_P
(
ftdm_str2ftdm_oob_event
,
ftdm_oob_event2str
,
ftdm_oob_event_t
)
typedef
enum
{
FTDM_ALARM_NONE
=
0
,
FTDM_ALARM_RECOVER
=
(
1
<<
0
),
FTDM_ALARM_LOOPBACK
=
(
1
<<
2
),
FTDM_ALARM_YELLOW
=
(
1
<<
3
),
FTDM_ALARM_RED
=
(
1
<<
4
),
FTDM_ALARM_BLUE
=
(
1
<<
5
),
FTDM_ALARM_NOTOPEN
=
(
1
<<
6
),
FTDM_ALARM_AIS
=
(
1
<<
7
),
FTDM_ALARM_RAI
=
(
1
<<
8
),
FTDM_ALARM_GENERAL
=
(
1
<<
30
)
}
ftdm_alarm_flag_t
;
typedef
enum
{
typedef
enum
{
FTDM_SIGTYPE_NONE
,
FTDM_SIGTYPE_NONE
,
FTDM_SIGTYPE_ISDN
,
FTDM_SIGTYPE_ISDN
,
...
@@ -174,10 +161,6 @@ typedef enum {
...
@@ -174,10 +161,6 @@ typedef enum {
FTDM_SIGTYPE_R2
FTDM_SIGTYPE_R2
}
ftdm_signal_type_t
;
}
ftdm_signal_type_t
;
typedef
enum
{
FTDM_TONE_DTMF
=
(
1
<<
0
)
}
ftdm_tone_type_t
;
typedef
enum
{
typedef
enum
{
FTDM_SPAN_CONFIGURED
=
(
1
<<
0
),
FTDM_SPAN_CONFIGURED
=
(
1
<<
0
),
FTDM_SPAN_READY
=
(
1
<<
1
),
FTDM_SPAN_READY
=
(
1
<<
1
),
...
@@ -368,70 +351,6 @@ typedef struct ftdm_fsk_modulator ftdm_fsk_modulator_t;
...
@@ -368,70 +351,6 @@ typedef struct ftdm_fsk_modulator ftdm_fsk_modulator_t;
typedef
ftdm_status_t
(
*
ftdm_span_start_t
)(
ftdm_span_t
*
span
);
typedef
ftdm_status_t
(
*
ftdm_span_start_t
)(
ftdm_span_t
*
span
);
typedef
ftdm_status_t
(
*
ftdm_span_stop_t
)(
ftdm_span_t
*
span
);
typedef
ftdm_status_t
(
*
ftdm_span_stop_t
)(
ftdm_span_t
*
span
);
typedef
enum
{
FTDM_CAUSE_NONE
=
0
,
FTDM_CAUSE_UNALLOCATED
=
1
,
FTDM_CAUSE_NO_ROUTE_TRANSIT_NET
=
2
,
FTDM_CAUSE_NO_ROUTE_DESTINATION
=
3
,
FTDM_CAUSE_CHANNEL_UNACCEPTABLE
=
6
,
FTDM_CAUSE_CALL_AWARDED_DELIVERED
=
7
,
FTDM_CAUSE_NORMAL_CLEARING
=
16
,
FTDM_CAUSE_USER_BUSY
=
17
,
FTDM_CAUSE_NO_USER_RESPONSE
=
18
,
FTDM_CAUSE_NO_ANSWER
=
19
,
FTDM_CAUSE_SUBSCRIBER_ABSENT
=
20
,
FTDM_CAUSE_CALL_REJECTED
=
21
,
FTDM_CAUSE_NUMBER_CHANGED
=
22
,
FTDM_CAUSE_REDIRECTION_TO_NEW_DESTINATION
=
23
,
FTDM_CAUSE_EXCHANGE_ROUTING_ERROR
=
25
,
FTDM_CAUSE_DESTINATION_OUT_OF_ORDER
=
27
,
FTDM_CAUSE_INVALID_NUMBER_FORMAT
=
28
,
FTDM_CAUSE_FACILITY_REJECTED
=
29
,
FTDM_CAUSE_RESPONSE_TO_STATUS_ENQUIRY
=
30
,
FTDM_CAUSE_NORMAL_UNSPECIFIED
=
31
,
FTDM_CAUSE_NORMAL_CIRCUIT_CONGESTION
=
34
,
FTDM_CAUSE_NETWORK_OUT_OF_ORDER
=
38
,
FTDM_CAUSE_NORMAL_TEMPORARY_FAILURE
=
41
,
FTDM_CAUSE_SWITCH_CONGESTION
=
42
,
FTDM_CAUSE_ACCESS_INFO_DISCARDED
=
43
,
FTDM_CAUSE_REQUESTED_CHAN_UNAVAIL
=
44
,
FTDM_CAUSE_PRE_EMPTED
=
45
,
FTDM_CAUSE_FACILITY_NOT_SUBSCRIBED
=
50
,
FTDM_CAUSE_OUTGOING_CALL_BARRED
=
52
,
FTDM_CAUSE_INCOMING_CALL_BARRED
=
54
,
FTDM_CAUSE_BEARERCAPABILITY_NOTAUTH
=
57
,
FTDM_CAUSE_BEARERCAPABILITY_NOTAVAIL
=
58
,
FTDM_CAUSE_SERVICE_UNAVAILABLE
=
63
,
FTDM_CAUSE_BEARERCAPABILITY_NOTIMPL
=
65
,
FTDM_CAUSE_CHAN_NOT_IMPLEMENTED
=
66
,
FTDM_CAUSE_FACILITY_NOT_IMPLEMENTED
=
69
,
FTDM_CAUSE_SERVICE_NOT_IMPLEMENTED
=
79
,
FTDM_CAUSE_INVALID_CALL_REFERENCE
=
81
,
FTDM_CAUSE_INCOMPATIBLE_DESTINATION
=
88
,
FTDM_CAUSE_INVALID_MSG_UNSPECIFIED
=
95
,
FTDM_CAUSE_MANDATORY_IE_MISSING
=
96
,
FTDM_CAUSE_MESSAGE_TYPE_NONEXIST
=
97
,
FTDM_CAUSE_WRONG_MESSAGE
=
98
,
FTDM_CAUSE_IE_NONEXIST
=
99
,
FTDM_CAUSE_INVALID_IE_CONTENTS
=
100
,
FTDM_CAUSE_WRONG_CALL_STATE
=
101
,
FTDM_CAUSE_RECOVERY_ON_TIMER_EXPIRE
=
102
,
FTDM_CAUSE_MANDATORY_IE_LENGTH_ERROR
=
103
,
FTDM_CAUSE_PROTOCOL_ERROR
=
111
,
FTDM_CAUSE_INTERWORKING
=
127
,
FTDM_CAUSE_SUCCESS
=
142
,
FTDM_CAUSE_ORIGINATOR_CANCEL
=
487
,
FTDM_CAUSE_CRASH
=
500
,
FTDM_CAUSE_SYSTEM_SHUTDOWN
=
501
,
FTDM_CAUSE_LOSE_RACE
=
502
,
FTDM_CAUSE_MANAGER_REQUEST
=
503
,
FTDM_CAUSE_BLIND_TRANSFER
=
600
,
FTDM_CAUSE_ATTENDED_TRANSFER
=
601
,
FTDM_CAUSE_ALLOTTED_TIMEOUT
=
602
,
FTDM_CAUSE_USER_CHALLENGE
=
603
,
FTDM_CAUSE_MEDIA_TIMEOUT
=
604
}
ftdm_call_cause_t
;
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif
#endif
...
...
libs/freetdm/src/testanalog.c
浏览文件 @
c1657714
...
@@ -18,7 +18,7 @@ static void *test_call(ftdm_thread_t *me, void *obj)
...
@@ -18,7 +18,7 @@ static void *test_call(ftdm_thread_t *me, void *obj)
ftdm_channel_call_answer
(
chan
);
ftdm_channel_call_answer
(
chan
);
ftdm_channel_command
(
chan
,
FTDM_COMMAND_SEND_DTMF
,
number
);
ftdm_channel_command
(
chan
,
FTDM_COMMAND_SEND_DTMF
,
number
);
while
(
ftdm_channel_call_
active
(
chan
))
{
while
(
ftdm_channel_call_
check_answered
(
chan
))
{
ftdm_wait_flag_t
flags
=
FTDM_READ
;
ftdm_wait_flag_t
flags
=
FTDM_READ
;
if
(
ftdm_channel_wait
(
chan
,
&
flags
,
-
1
)
==
FTDM_FAIL
)
{
if
(
ftdm_channel_wait
(
chan
,
&
flags
,
-
1
)
==
FTDM_FAIL
)
{
...
@@ -35,7 +35,7 @@ static void *test_call(ftdm_thread_t *me, void *obj)
...
@@ -35,7 +35,7 @@ static void *test_call(ftdm_thread_t *me, void *obj)
}
}
}
}
if
(
ftdm_channel_call_
active
(
chan
))
{
if
(
ftdm_channel_call_
check_answered
(
chan
))
{
ftdm_channel_call_indicate
(
chan
,
FTDM_CHANNEL_INDICATE_BUSY
);
ftdm_channel_call_indicate
(
chan
,
FTDM_CHANNEL_INDICATE_BUSY
);
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论