Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
836604cf
提交
836604cf
authored
12月 23, 2010
作者:
Arnaldo Pereira
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into arnaldo.r2_reset_channel
上级
fa5ec0e5
da5b3822
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
197 行增加
和
343 行删除
+197
-343
ftdm_io.c
libs/freetdm/src/ftdm_io.c
+36
-45
ftmod_wanpipe.c
libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
+86
-178
ftmod_zt.c
libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
+75
-120
没有找到文件。
libs/freetdm/src/ftdm_io.c
浏览文件 @
836604cf
...
...
@@ -1091,54 +1091,65 @@ FT_DECLARE(ftdm_status_t) ftdm_span_poll_event(ftdm_span_t *span, uint32_t ms, s
return
FTDM_NOTIMPL
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_next_event
(
ftdm_span_t
*
span
,
ftdm_event_t
**
event
)
/* handle oob events and send the proper SIGEVENT signal to user, when applicable */
static
__inline__
ftdm_status_t
ftdm_event_handle_oob
(
ftdm_event_t
*
event
)
{
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_sigmsg_t
sigmsg
;
ftdm_assert_return
(
span
->
fio
!=
NULL
,
FTDM_FAIL
,
"No I/O module attached to this span!
\n
"
);
if
(
!
span
->
fio
->
next_event
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"next_event method not implemented in module %s!"
,
span
->
fio
->
name
);
return
FTDM_NOTIMPL
;
}
status
=
span
->
fio
->
next_event
(
span
,
event
);
if
(
status
!=
FTDM_SUCCESS
)
{
return
status
;
}
ftdm_status_t
status
=
FTDM_SUCCESS
;
ftdm_channel_t
*
fchan
=
event
->
channel
;
ftdm_span_t
*
span
=
fchan
->
span
;
/* before returning the event to the user we do some core operations with certain OOB events */
memset
(
&
sigmsg
,
0
,
sizeof
(
sigmsg
));
sigmsg
.
span_id
=
span
->
span_id
;
sigmsg
.
chan_id
=
(
*
event
)
->
channel
->
chan_id
;
sigmsg
.
channel
=
(
*
event
)
->
channel
;
switch
(
(
*
event
)
->
enum_id
)
{
sigmsg
.
chan_id
=
fchan
->
chan_id
;
sigmsg
.
channel
=
fchan
;
switch
(
event
->
enum_id
)
{
case
FTDM_OOB_ALARM_CLEAR
:
{
sigmsg
.
event_id
=
FTDM_SIGEVENT_ALARM_CLEAR
;
ftdm_clear_flag_locked
(
(
*
event
)
->
channel
,
FTDM_CHANNEL_IN_ALARM
);
ftdm_span_send_signal
(
span
,
&
sigmsg
);
ftdm_clear_flag_locked
(
fchan
,
FTDM_CHANNEL_IN_ALARM
);
status
=
ftdm_span_send_signal
(
span
,
&
sigmsg
);
}
break
;
case
FTDM_OOB_ALARM_TRAP
:
{
sigmsg
.
event_id
=
FTDM_SIGEVENT_ALARM_TRAP
;
ftdm_set_flag_locked
(
(
*
event
)
->
channel
,
FTDM_CHANNEL_IN_ALARM
);
ftdm_span_send_signal
(
span
,
&
sigmsg
);
ftdm_set_flag_locked
(
fchan
,
FTDM_CHANNEL_IN_ALARM
);
status
=
ftdm_span_send_signal
(
span
,
&
sigmsg
);
}
break
;
default
:
/* NOOP */
break
;
}
return
status
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_span_next_event
(
ftdm_span_t
*
span
,
ftdm_event_t
**
event
)
{
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_assert_return
(
span
->
fio
!=
NULL
,
FTDM_FAIL
,
"No I/O module attached to this span!
\n
"
);
if
(
!
span
->
fio
->
next_event
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"next_event method not implemented in module %s!"
,
span
->
fio
->
name
);
return
FTDM_NOTIMPL
;
}
status
=
span
->
fio
->
next_event
(
span
,
event
);
if
(
status
!=
FTDM_SUCCESS
)
{
return
status
;
}
status
=
ftdm_event_handle_oob
(
*
event
);
if
(
status
!=
FTDM_SUCCESS
)
{
ftdm_log
(
FTDM_LOG_ERROR
,
"failed to handle event %d
\n
"
,
**
event
);
}
return
status
;
}
FT_DECLARE
(
ftdm_status_t
)
ftdm_channel_read_event
(
ftdm_channel_t
*
ftdmchan
,
ftdm_event_t
**
event
)
{
ftdm_status_t
status
=
FTDM_FAIL
;
ftdm_sigmsg_t
sigmsg
;
ftdm_span_t
*
span
=
ftdmchan
->
span
;
ftdm_assert_return
(
span
->
fio
!=
NULL
,
FTDM_FAIL
,
"No I/O module attached to this span!
\n
"
);
...
...
@@ -1155,29 +1166,9 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read_event(ftdm_channel_t *ftdmchan, ftdm
goto
done
;
}
/* before returning the event to the user we do some core operations with certain OOB events */
memset
(
&
sigmsg
,
0
,
sizeof
(
sigmsg
));
sigmsg
.
span_id
=
span
->
span_id
;
sigmsg
.
chan_id
=
(
*
event
)
->
channel
->
chan_id
;
sigmsg
.
channel
=
(
*
event
)
->
channel
;
switch
((
*
event
)
->
enum_id
)
{
case
FTDM_OOB_ALARM_CLEAR
:
{
sigmsg
.
event_id
=
FTDM_SIGEVENT_ALARM_CLEAR
;
ftdm_clear_flag_locked
((
*
event
)
->
channel
,
FTDM_CHANNEL_IN_ALARM
);
ftdm_span_send_signal
(
span
,
&
sigmsg
);
}
break
;
case
FTDM_OOB_ALARM_TRAP
:
{
sigmsg
.
event_id
=
FTDM_SIGEVENT_ALARM_TRAP
;
ftdm_set_flag_locked
((
*
event
)
->
channel
,
FTDM_CHANNEL_IN_ALARM
);
ftdm_span_send_signal
(
span
,
&
sigmsg
);
}
break
;
default
:
/* NOOP */
break
;
status
=
ftdm_event_handle_oob
(
*
event
);
if
(
status
!=
FTDM_SUCCESS
)
{
ftdm_log_chan
(
ftdmchan
,
FTDM_LOG_ERROR
,
"failed to handle event %d
\n
"
,
**
event
);
}
done
:
...
...
libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c
浏览文件 @
836604cf
差异被折叠。
点击展开。
libs/freetdm/src/ftmod/ftmod_zt/ftmod_zt.c
浏览文件 @
836604cf
...
...
@@ -993,27 +993,14 @@ FIO_SPAN_POLL_EVENT_FUNCTION(zt_poll_event)
}
/**
* \brief Retrieves an event from a ftdm channel
* \param ftdmchan Channel to retrieve event from
* \param event FreeTDM event to return
* \return Success or failure
* \brief Process an event from a ftdmchan and set the proper OOB event_id. The channel must be locked.
* \param fchan Channel to retrieve event from
* \param event_id Pointer to OOB event id
* \param zt_event_id Zaptel event id
* \return FTDM_SUCCESS or FTDM_FAIL
*/
FIO_CHANNEL_NEXT_EVENT_FUNCTION
(
zt_channel_next_event
)
static
__inline__
ftdm_status_t
zt_channel_process_event
(
ftdm_channel_t
*
fchan
,
ftdm_oob_event_t
*
event_id
,
zt_event_t
zt_event_id
)
{
ftdm_oob_event_t
event_id
=
FTDM_OOB_INVALID
;
zt_event_t
zt_event_id
=
0
;
ftdm_span_t
*
span
=
ftdmchan
->
span
;
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_EVENT
))
{
ftdm_clear_flag
(
ftdmchan
,
FTDM_CHANNEL_EVENT
);
}
if
(
ioctl
(
ftdmchan
->
sockfd
,
codes
.
GETEVENT
,
&
zt_event_id
)
==
-
1
)
{
ftdm_log_chan
(
ftdmchan
,
FTDM_LOG_ERROR
,
"Failed retrieving event from channel: %s
\n
"
,
strerror
(
errno
));
return
FTDM_FAIL
;
}
switch
(
zt_event_id
)
{
case
ZT_EVENT_RINGEROFF
:
{
...
...
@@ -1027,63 +1014,93 @@ FIO_CHANNEL_NEXT_EVENT_FUNCTION(zt_channel_next_event)
break
;
case
ZT_EVENT_RINGBEGIN
:
{
event_id
=
FTDM_OOB_RING_START
;
*
event_id
=
FTDM_OOB_RING_START
;
}
break
;
case
ZT_EVENT_ONHOOK
:
{
event_id
=
FTDM_OOB_ONHOOK
;
*
event_id
=
FTDM_OOB_ONHOOK
;
}
break
;
case
ZT_EVENT_WINKFLASH
:
{
if
(
f
tdmchan
->
state
==
FTDM_CHANNEL_STATE_DOWN
||
ftdm
chan
->
state
==
FTDM_CHANNEL_STATE_DIALING
)
{
event_id
=
FTDM_OOB_WINK
;
if
(
f
chan
->
state
==
FTDM_CHANNEL_STATE_DOWN
||
f
chan
->
state
==
FTDM_CHANNEL_STATE_DIALING
)
{
*
event_id
=
FTDM_OOB_WINK
;
}
else
{
event_id
=
FTDM_OOB_FLASH
;
*
event_id
=
FTDM_OOB_FLASH
;
}
}
break
;
case
ZT_EVENT_RINGOFFHOOK
:
{
if
(
f
tdmchan
->
type
==
FTDM_CHAN_TYPE_FXS
||
(
ftdmchan
->
type
==
FTDM_CHAN_TYPE_EM
&&
ftdm
chan
->
state
!=
FTDM_CHANNEL_STATE_UP
))
{
ftdm_set_flag
(
ftdm
chan
,
FTDM_CHANNEL_OFFHOOK
);
event_id
=
FTDM_OOB_OFFHOOK
;
}
else
if
(
f
tdm
chan
->
type
==
FTDM_CHAN_TYPE_FXO
)
{
event_id
=
FTDM_OOB_RING_START
;
if
(
f
chan
->
type
==
FTDM_CHAN_TYPE_FXS
||
(
fchan
->
type
==
FTDM_CHAN_TYPE_EM
&&
f
chan
->
state
!=
FTDM_CHANNEL_STATE_UP
))
{
ftdm_set_flag
_locked
(
f
chan
,
FTDM_CHANNEL_OFFHOOK
);
*
event_id
=
FTDM_OOB_OFFHOOK
;
}
else
if
(
fchan
->
type
==
FTDM_CHAN_TYPE_FXO
)
{
*
event_id
=
FTDM_OOB_RING_START
;
}
else
{
event_id
=
FTDM_OOB_NOOP
;
*
event_id
=
FTDM_OOB_NOOP
;
}
}
break
;
case
ZT_EVENT_ALARM
:
{
event_id
=
FTDM_OOB_ALARM_TRAP
;
*
event_id
=
FTDM_OOB_ALARM_TRAP
;
}
break
;
case
ZT_EVENT_NOALARM
:
{
event_id
=
FTDM_OOB_ALARM_CLEAR
;
*
event_id
=
FTDM_OOB_ALARM_CLEAR
;
}
break
;
case
ZT_EVENT_BITSCHANGED
:
{
event_id
=
FTDM_OOB_CAS_BITS_CHANGE
;
*
event_id
=
FTDM_OOB_CAS_BITS_CHANGE
;
int
bits
=
0
;
int
err
=
ioctl
(
f
tdm
chan
->
sockfd
,
codes
.
GETRXBITS
,
&
bits
);
int
err
=
ioctl
(
fchan
->
sockfd
,
codes
.
GETRXBITS
,
&
bits
);
if
(
err
)
{
return
FTDM_FAIL
;
}
f
tdm
chan
->
rx_cas_bits
=
bits
;
fchan
->
rx_cas_bits
=
bits
;
}
break
;
default
:
{
ftdm_log_chan
(
f
tdm
chan
,
FTDM_LOG_WARNING
,
"Unhandled event %d
\n
"
,
zt_event_id
);
event_id
=
FTDM_OOB_INVALID
;
ftdm_log_chan
(
fchan
,
FTDM_LOG_WARNING
,
"Unhandled event %d
\n
"
,
zt_event_id
);
*
event_id
=
FTDM_OOB_INVALID
;
}
break
;
}
return
FTDM_SUCCESS
;
}
/**
* \brief Retrieves an event from a ftdm channel
* \param ftdmchan Channel to retrieve event from
* \param event FreeTDM event to return
* \return Success or failure
*/
FIO_CHANNEL_NEXT_EVENT_FUNCTION
(
zt_channel_next_event
)
{
uint32_t
event_id
=
FTDM_OOB_INVALID
;
zt_event_t
zt_event_id
=
0
;
ftdm_span_t
*
span
=
ftdmchan
->
span
;
if
(
ftdm_test_flag
(
ftdmchan
,
FTDM_CHANNEL_EVENT
))
{
ftdm_clear_flag
(
ftdmchan
,
FTDM_CHANNEL_EVENT
);
}
if
(
ioctl
(
ftdmchan
->
sockfd
,
codes
.
GETEVENT
,
&
zt_event_id
)
==
-
1
)
{
ftdm_log_chan
(
ftdmchan
,
FTDM_LOG_ERROR
,
"Failed retrieving event from channel: %s
\n
"
,
strerror
(
errno
));
return
FTDM_FAIL
;
}
/* the core already locked the channel for us, so it's safe to call zt_channel_process_event() here */
if
((
zt_channel_process_event
(
ftdmchan
,
&
event_id
,
zt_event_id
))
!=
FTDM_SUCCESS
)
{
ftdm_log_chan_msg
(
ftdmchan
,
FTDM_LOG_ERROR
,
"Failed to process event from channel
\n
"
);
return
FTDM_FAIL
;
}
ftdmchan
->
last_event_time
=
0
;
span
->
event_header
.
e_type
=
FTDM_EVENT_OOB
;
...
...
@@ -1105,91 +1122,29 @@ FIO_SPAN_NEXT_EVENT_FUNCTION(zt_next_event)
zt_event_t
zt_event_id
=
0
;
for
(
i
=
1
;
i
<=
span
->
chan_count
;
i
++
)
{
if
(
ftdm_test_flag
(
span
->
channels
[
i
],
FTDM_CHANNEL_EVENT
))
{
ftdm_clear_flag
(
span
->
channels
[
i
],
FTDM_CHANNEL_EVENT
);
if
(
ioctl
(
span
->
channels
[
i
]
->
sockfd
,
codes
.
GETEVENT
,
&
zt_event_id
)
==
-
1
)
{
snprintf
(
span
->
last_error
,
sizeof
(
span
->
last_error
),
"%s"
,
strerror
(
errno
));
return
FTDM_FAIL
;
}
switch
(
zt_event_id
)
{
case
ZT_EVENT_RINGEROFF
:
{
return
FTDM_FAIL
;
}
break
;
case
ZT_EVENT_RINGERON
:
{
return
FTDM_FAIL
;
}
break
;
case
ZT_EVENT_RINGBEGIN
:
{
event_id
=
FTDM_OOB_RING_START
;
}
break
;
case
ZT_EVENT_ONHOOK
:
{
event_id
=
FTDM_OOB_ONHOOK
;
}
break
;
case
ZT_EVENT_WINKFLASH
:
{
if
(
span
->
channels
[
i
]
->
state
==
FTDM_CHANNEL_STATE_DOWN
||
span
->
channels
[
i
]
->
state
==
FTDM_CHANNEL_STATE_DIALING
)
{
event_id
=
FTDM_OOB_WINK
;
}
else
{
event_id
=
FTDM_OOB_FLASH
;
}
}
break
;
case
ZT_EVENT_RINGOFFHOOK
:
{
if
(
span
->
channels
[
i
]
->
type
==
FTDM_CHAN_TYPE_FXS
||
(
span
->
channels
[
i
]
->
type
==
FTDM_CHAN_TYPE_EM
&&
span
->
channels
[
i
]
->
state
!=
FTDM_CHANNEL_STATE_UP
))
{
ftdm_set_flag_locked
(
span
->
channels
[
i
],
FTDM_CHANNEL_OFFHOOK
);
event_id
=
FTDM_OOB_OFFHOOK
;
}
else
if
(
span
->
channels
[
i
]
->
type
==
FTDM_CHAN_TYPE_FXO
)
{
event_id
=
FTDM_OOB_RING_START
;
}
else
{
event_id
=
FTDM_OOB_NOOP
;
}
}
break
;
case
ZT_EVENT_ALARM
:
{
event_id
=
FTDM_OOB_ALARM_TRAP
;
}
break
;
case
ZT_EVENT_NOALARM
:
{
event_id
=
FTDM_OOB_ALARM_CLEAR
;
}
break
;
case
ZT_EVENT_BITSCHANGED
:
{
event_id
=
FTDM_OOB_CAS_BITS_CHANGE
;
int
bits
=
0
;
int
err
=
ioctl
(
span
->
channels
[
i
]
->
sockfd
,
codes
.
GETRXBITS
,
&
bits
);
if
(
err
)
{
return
FTDM_FAIL
;
}
span
->
channels
[
i
]
->
rx_cas_bits
=
bits
;
}
break
;
default
:
{
ftdm_log
(
FTDM_LOG_WARNING
,
"Unhandled event %d for %d:%d
\n
"
,
zt_event_id
,
span
->
span_id
,
i
);
event_id
=
FTDM_OOB_INVALID
;
}
break
;
}
ftdm_channel_t
*
fchan
=
span
->
channels
[
i
];
if
(
ftdm_test_flag
(
fchan
,
FTDM_CHANNEL_EVENT
))
{
ftdm_clear_flag
(
fchan
,
FTDM_CHANNEL_EVENT
);
}
if
(
ioctl
(
fchan
->
sockfd
,
codes
.
GETEVENT
,
&
zt_event_id
)
==
-
1
)
{
snprintf
(
span
->
last_error
,
sizeof
(
span
->
last_error
),
"%s"
,
strerror
(
errno
));
return
FTDM_FAIL
;
}
span
->
channels
[
i
]
->
last_event_time
=
0
;
span
->
event_header
.
e_type
=
FTDM_EVENT_OOB
;
span
->
event_header
.
enum_id
=
event_id
;
span
->
event_header
.
channel
=
span
->
channels
[
i
];
*
event
=
&
span
->
event_header
;
return
FTDM_SUCCESS
;
ftdm_channel_lock
(
fchan
);
if
((
zt_channel_process_event
(
fchan
,
&
event_id
,
zt_event_id
))
!=
FTDM_SUCCESS
)
{
ftdm_log_chan_msg
(
fchan
,
FTDM_LOG_ERROR
,
"Failed to process event from channel
\n
"
);
ftdm_channel_unlock
(
fchan
);
return
FTDM_FAIL
;
}
ftdm_channel_unlock
(
fchan
);
fchan
->
last_event_time
=
0
;
span
->
event_header
.
e_type
=
FTDM_EVENT_OOB
;
span
->
event_header
.
enum_id
=
event_id
;
span
->
event_header
.
channel
=
fchan
;
*
event
=
&
span
->
event_header
;
return
FTDM_SUCCESS
;
}
return
FTDM_FAIL
;
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论