Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
F
freeswitch
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
张华
freeswitch
Commits
5c8bdedc
提交
5c8bdedc
authored
6月 14, 2010
作者:
Konrad Hammel
提交者:
Moises Silva
6月 18, 2010
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
-> added support for GRS...attempt 1
上级
6f511b94
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
162 行增加
和
48 行删除
+162
-48
ftmod_sangoma_ss7_in.c
...reetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c
+61
-1
ftmod_sangoma_ss7_main.c
...etdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
+26
-6
ftmod_sangoma_ss7_main.h
...etdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
+50
-41
ftmod_sangoma_ss7_out.c
...eetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
+25
-0
没有找到文件。
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_in.c
浏览文件 @
5c8bdedc
...
...
@@ -70,6 +70,8 @@ static ftdm_status_t handle_blo_rsp(uint32_t suInstId, uint32_t spInstId, uint32
static
ftdm_status_t
handle_ubl_req
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
);
static
ftdm_status_t
handle_ubl_rsp
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
);
static
ftdm_status_t
handle_grs_req
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
);
/******************************************************************************/
...
...
@@ -701,7 +703,7 @@ void sngss7_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint
break
;
/**************************************************************************/
case
SIT_STA_GRSREQ
:
/* circuit group reset request */
SS7_WARN
(
" %s indication not currently supported
\n
"
,
DECODE_LCC_EVENT
(
evntType
)
);
handle_grs_req
(
suInstId
,
spInstId
,
circuit
,
globalFlg
,
evntType
,
siStaEvnt
);
break
;
/**************************************************************************/
case
SIT_STA_CIRUNEQPD
:
/* circuit unequipped indication */
...
...
@@ -1413,6 +1415,64 @@ static ftdm_status_t handle_ubl_rsp(uint32_t suInstId, uint32_t spInstId, uint32
return
FTDM_SUCCESS
;
}
/******************************************************************************/
static
ftdm_status_t
handle_grs_req
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
)
{
SS7_FUNC_TRACE_ENTER
(
__FUNCTION__
);
sngss7_chan_data_t
*
sngss7_info
=
NULL
;
ftdm_channel_t
*
ftdmchan
=
NULL
;
int
range
;
int
x
;
/* extract the range value from the event structure */
if
((
siStaEvnt
->
rangStat
.
eh
.
pres
==
PRSNT_NODEF
)
&&
(
siStaEvnt
->
rangStat
.
range
.
pres
==
PRSNT_NODEF
))
{
range
=
siStaEvnt
->
rangStat
.
range
.
val
;
}
else
{
SS7_ERROR
(
"Received GRS with no range value on CIC = %d
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
FTDM_FAIL
;
}
/* loop over the cics starting from circuit until range+1 */
for
(
x
=
circuit
;
x
<
(
circuit
+
range
+
1
);
x
++
)
{
/* grab the circuit in question */
if
(
extract_chan_data
(
circuit
,
&
sngss7_info
,
&
ftdmchan
))
{
SS7_ERROR
(
"Failed to extract channel data for circuit = %d!
\n
"
,
circuit
);
/* konrad fix me */
}
/* now that we have the right channel...put a lock on it so no-one else can use it */
ftdm_mutex_lock
(
ftdmchan
->
mutex
);
/* check if there is a pending state change, give it a bit to clear */
if
(
check_for_state_change
(
ftdmchan
))
{
SS7_ERROR
(
"Failed to wait for pending state change on CIC = %d
\n
"
,
sngss7_info
->
circuit
->
cic
);
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
/* konrad fix me */
};
/* store the circuit and range into the sngss7 info so that we can figure out when to send GRA */
sngss7_info
->
grs
.
circuit
=
circuit
;
sngss7_info
->
grs
.
range
=
range
;
sngss7_info
->
globalFlg
=
globalFlg
;
/* flag the channel as having received a reset */
sngss7_set_flag
(
sngss7_info
,
FLAG_GRP_RESET_RX
);
/* throw the channel into RESTART state */
ftdm_set_state_locked
(
ftdmchan
,
FTDM_CHANNEL_STATE_RESTART
);
/* unlock the channel again before we exit */
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
}
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
FTDM_SUCCESS
;
}
/******************************************************************************/
#if 0
{
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
浏览文件 @
5c8bdedc
...
...
@@ -300,6 +300,9 @@ static void ftdm_sangoma_ss7_process_state_change(ftdm_channel_t *ftdmchan)
ftdm_sigmsg_t
sigev
;
ftdm_signaling_status_t
status
;
sngss7_chan_data_t
*
sngss7_info
=
ftdmchan
->
call_data
;
sngss7_chan_data_t
*
tmp_ss7info
=
NULL
;
ftdm_channel_t
*
tmp_chan
=
NULL
;
int
i
=
0
;
memset
(
&
sigev
,
0
,
sizeof
(
sigev
));
...
...
@@ -325,8 +328,6 @@ static void ftdm_sangoma_ss7_process_state_change(ftdm_channel_t *ftdmchan)
break
;
}
int
i
=
0
;
while
(
ftdmchan
->
caller_data
.
cid_num
.
digits
[
i
]
!=
'\0'
)
{
i
++
;
}
...
...
@@ -587,6 +588,28 @@ static void ftdm_sangoma_ss7_process_state_change(ftdm_channel_t *ftdmchan)
ftdm_span_send_signal
(
ftdmchan
->
span
,
&
sigev
);
}
/* check if there was a GRS that needs a GRA */
if
(
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_RESET_RX
))
{
/* check all the circuits in the range to see if we are the last ckt to reset */
for
(
i
=
sngss7_info
->
grs
.
circuit
;
i
<
(
sngss7_info
->
grs
.
range
+
1
);
i
++
)
{
if
(
g_ftdm_sngss7_data
.
cfg
.
isupCircuit
[
i
].
siglink
==
0
)
{
/* extract the sngss7_info for the circuit */
tmp_ss7info
=
g_ftdm_sngss7_data
.
cfg
.
isupCircuit
[
i
].
obj
;
tmp_chan
=
tmp_ss7info
->
ftdmchan
;
/* check if the circuit is done going through reset */
/* KONRAD FIX ME...better way to check this??? */
if
(
!
(
tmp_chan
->
state
==
FTDM_CHANNEL_STATE_DOWN
)
&&
(
sngss7_test_flag
(
tmp_ss7info
,
FLAG_GRP_RESET_RX
)))
{
/* exit the for loop since we found a circuit still in reset */
continue
;
}
/* if inreset */
}
/* if not siglink */
}
/* for */
/* if we got through the whole range send out a GRA */
if
(
i
==
(
sngss7_info
->
grs
.
range
+
1
))
{
ft_to_sngss7_gra
(
ftdmchan
);
}
}
/* check if we got the reset response */
if
(
sngss7_test_flag
(
sngss7_info
,
FLAG_RESET_TX
))
{
/* inform Ftdm that the "sig" is up now for this channel */
...
...
@@ -666,7 +689,7 @@ static void ftdm_sangoma_ss7_process_state_change(ftdm_channel_t *ftdmchan)
}
else
{
/* check if this an incoming RSC */
if
(
sngss7_test_flag
(
sngss7_info
,
FLAG_RESET_RX
))
{
if
(
sngss7_test_flag
(
sngss7_info
,
FLAG_RESET_RX
)
||
sngss7_test_flag
(
sngss7_info
,
FLAG_GRP_RESET_RX
)
)
{
/* go to a down state to clear the channel and send RSCa */
ftdm_set_state_locked
(
ftdmchan
,
FTDM_CHANNEL_STATE_DOWN
);
}
/* if (sngss7_test_flag(sngss7_info, FLAG_RESET_RX)) */
...
...
@@ -910,9 +933,6 @@ static FIO_CHANNEL_OUTGOING_CALL_FUNCTION(ftdm_sangoma_ss7_outgoing_call)
/**************************************************************************/
}
/* we should not get to this here...all exit points above use goto */
SS7_ERROR
(
"WE SHOULD NOT HERE HERE!!!!
\n
"
);
SS7_DEBUG
(
"Call Request on span=%d, chan=%d failed
\n
"
);
/* unlock the channel */
ftdm_mutex_unlock
(
ftdmchan
->
mutex
);
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.h
浏览文件 @
5c8bdedc
...
...
@@ -96,6 +96,11 @@ typedef struct sngss7_glare_data {
SiConEvnt
iam
;
}
sngss7_glare_data_t
;
typedef
struct
sngss7_group_data
{
uint32_t
circuit
;
uint32_t
range
;
}
sngss7_group_data_t
;
typedef
struct
sngss7_chan_data
{
ftdm_channel_t
*
ftdmchan
;
sng_isupCircuit_t
*
circuit
;
...
...
@@ -106,6 +111,7 @@ typedef struct sngss7_chan_data {
uint32_t
flags
;
sngss7_glare_data_t
glare
;
sngss7_timer_data_t
t35
;
sngss7_group_data_t
grs
;
}
sngss7_chan_data_t
;
...
...
@@ -113,9 +119,11 @@ typedef struct sngss7_chan_data {
typedef
enum
{
FLAG_RESET_RX
=
(
1
<<
0
),
FLAG_RESET_TX
=
(
1
<<
1
),
FLAG_REMOTE_REL
=
(
1
<<
2
),
FLAG_LOCAL_REL
=
(
1
<<
3
),
FLAG_GLARE
=
(
1
<<
4
),
FLAG_GRP_RESET_RX
=
(
1
<<
2
),
FLAG_GRP_RESET_TX
=
(
1
<<
3
),
FLAG_REMOTE_REL
=
(
1
<<
4
),
FLAG_LOCAL_REL
=
(
1
<<
5
),
FLAG_GLARE
=
(
1
<<
6
),
FLAG_INFID_RESUME
=
(
1
<<
17
),
FLAG_INFID_PAUSED
=
(
1
<<
18
),
FLAG_CKT_MN_BLOCK_RX
=
(
1
<<
19
),
...
...
@@ -140,51 +148,52 @@ extern ftdm_sched_t *sngss7_sched;
/******************************************************************************/
/* PROTOTYPES *****************************************************************/
extern
void
handle_sng_log
(
uint8_t
level
,
char
*
fmt
,...);
extern
void
handle_sng_alarm
(
sng_alrm_t
t_alarm
);
void
handle_sng_log
(
uint8_t
level
,
char
*
fmt
,...);
void
handle_sng_alarm
(
sng_alrm_t
t_alarm
);
extern
int
ft_to_sngss7_cfg
(
void
);
extern
int
ft_to_sngss7_activate_all
(
void
);
int
ft_to_sngss7_cfg
(
void
);
int
ft_to_sngss7_activate_all
(
void
);
extern
void
ft_to_sngss7_iam
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_acm
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_anm
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_rel
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_rlc
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_rsc
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_rsca
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_blo
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_bla
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_ubl
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_uba
(
ftdm_channel_t
*
ftdmchan
);
extern
void
ft_to_sngss7_lpa
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_iam
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_acm
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_anm
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_rel
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_rlc
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_rsc
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_rsca
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_blo
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_bla
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_ubl
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_uba
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_lpa
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_gra
(
ftdm_channel_t
*
ftdmchan
);
extern
void
sngss7_sta_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
);
extern
void
sngss7_con_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiConEvnt
*
siConEvnt
);
extern
void
sngss7_con_cfm
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiConEvnt
*
siConEvnt
);
extern
void
sngss7_con_sta
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiCnStEvnt
*
siCnStEvnt
,
uint8_t
evntType
);
extern
void
sngss7_rel_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiRelEvnt
*
siRelEvnt
);
extern
void
sngss7_rel_cfm
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiRelEvnt
*
siRelEvnt
);
extern
void
sngss7_dat_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiInfoEvnt
*
siInfoEvnt
);
extern
void
sngss7_fac_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
evntType
,
SiFacEvnt
*
siFacEvnt
);
extern
void
sngss7_fac_cfm
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
evntType
,
SiFacEvnt
*
siFacEvnt
);
extern
void
sngss7_sta_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
);
extern
void
sngss7_umsg_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
);
void
sngss7_sta_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
);
void
sngss7_con_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiConEvnt
*
siConEvnt
);
void
sngss7_con_cfm
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiConEvnt
*
siConEvnt
);
void
sngss7_con_sta
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiCnStEvnt
*
siCnStEvnt
,
uint8_t
evntType
);
void
sngss7_rel_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiRelEvnt
*
siRelEvnt
);
void
sngss7_rel_cfm
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiRelEvnt
*
siRelEvnt
);
void
sngss7_dat_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
SiInfoEvnt
*
siInfoEvnt
);
void
sngss7_fac_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
evntType
,
SiFacEvnt
*
siFacEvnt
);
void
sngss7_fac_cfm
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
evntType
,
SiFacEvnt
*
siFacEvnt
);
void
sngss7_sta_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
,
uint8_t
globalFlg
,
uint8_t
evntType
,
SiStaEvnt
*
siStaEvnt
);
void
sngss7_umsg_ind
(
uint32_t
suInstId
,
uint32_t
spInstId
,
uint32_t
circuit
);
extern
uint8_t
copy_cgPtyNum_from_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCgPtyNum
*
cgPtyNum
);
extern
uint8_t
copy_cgPtyNum_to_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCgPtyNum
*
cgPtyNum
);
extern
uint8_t
copy_cdPtyNum_from_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCdPtyNum
*
cdPtyNum
);
extern
uint8_t
copy_cdPtyNum_to_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCdPtyNum
*
cdPtyNum
);
extern
uint8_t
copy_tknStr_from_sngss7
(
TknStr
str
,
char
*
ftdm
,
TknU8
oddEven
);
extern
int
check_for_state_change
(
ftdm_channel_t
*
ftdmchan
);
extern
ftdm_status_t
extract_chan_data
(
uint32_t
circuit
,
sngss7_chan_data_t
**
sngss7_info
,
ftdm_channel_t
**
ftdmchan
);
extern
unsigned
long
get_unique_id
(
void
);
uint8_t
copy_cgPtyNum_from_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCgPtyNum
*
cgPtyNum
);
uint8_t
copy_cgPtyNum_to_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCgPtyNum
*
cgPtyNum
);
uint8_t
copy_cdPtyNum_from_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCdPtyNum
*
cdPtyNum
);
uint8_t
copy_cdPtyNum_to_sngss7
(
ftdm_caller_data_t
*
ftdm
,
SiCdPtyNum
*
cdPtyNum
);
uint8_t
copy_tknStr_from_sngss7
(
TknStr
str
,
char
*
ftdm
,
TknU8
oddEven
);
int
check_for_state_change
(
ftdm_channel_t
*
ftdmchan
);
ftdm_status_t
extract_chan_data
(
uint32_t
circuit
,
sngss7_chan_data_t
**
sngss7_info
,
ftdm_channel_t
**
ftdmchan
);
unsigned
long
get_unique_id
(
void
);
extern
int
ftmod_ss7_parse_xml
(
ftdm_conf_parameter_t
*
ftdm_parameters
,
ftdm_span_t
*
span
);
int
ftmod_ss7_parse_xml
(
ftdm_conf_parameter_t
*
ftdm_parameters
,
ftdm_span_t
*
span
);
extern
void
handle_isup_t35
(
void
*
userdata
);
void
handle_isup_t35
(
void
*
userdata
);
extern
ftdm_status_t
ftdm_sngss7_handle_cli_cmd
(
ftdm_stream_handle_t
*
stream
,
const
char
*
data
);
ftdm_status_t
ftdm_sngss7_handle_cli_cmd
(
ftdm_stream_handle_t
*
stream
,
const
char
*
data
);
/******************************************************************************/
/* MACROS *********************************************************************/
...
...
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c
浏览文件 @
5c8bdedc
...
...
@@ -58,6 +58,7 @@ void ft_to_sngss7_uba(ftdm_channel_t *ftdmchan);
void
ft_to_sngss7_lpa
(
ftdm_channel_t
*
ftdmchan
);
void
ft_to_sngss7_gra
(
ftdm_channel_t
*
ftdmchan
);
/* FUNCTIONS ******************************************************************/
void
ft_to_sngss7_iam
(
ftdm_channel_t
*
ftdmchan
)
{
...
...
@@ -404,6 +405,30 @@ void ft_to_sngss7_lpa(ftdm_channel_t *ftdmchan)
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
}
/******************************************************************************/
void
ft_to_sngss7_gra
(
ftdm_channel_t
*
ftdmchan
)
{
SS7_FUNC_TRACE_ENTER
(
__FUNCTION__
);
sngss7_chan_data_t
*
sngss7_info
=
ftdmchan
->
call_data
;
/* get the original channel the message came in on */
sngss7_info
=
g_ftdm_sngss7_data
.
cfg
.
isupCircuit
[
sngss7_info
->
grs
.
circuit
].
obj
;
sng_cc_sta_request
(
1
,
0
,
0
,
sngss7_info
->
circuit
->
id
,
sngss7_info
->
globalFlg
,
SIT_STA_GRSRSP
,
NULL
);
SS7_MSG_TRACE
(
"Transmitted GRA on CIC # %d
\n
"
,
sngss7_info
->
circuit
->
cic
);
SS7_FUNC_TRACE_EXIT
(
__FUNCTION__
);
return
;
}
/******************************************************************************/
/* For Emacs:
* Local Variables:
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论