
概述freeswitch是一款简单好用的VOIP开源软交换平台。在之前的文章中,我们简单介绍过gateway的三种配置方案,但是实际应用之后发现,方案中的参数设置有缺陷,会导致一些问题。本文档中,针对......

freeswitch是一款简单好用的VOIP开源软交换平台。
在之前的文章中,我们简单介绍过gateway的三种配置方案,但是实际应用之后发现,方案中的参数设置有缺陷,会导致一些问题。
本文档中,针对具体的gateway配置问题进行分析和解决。
环境centos:(Final)或以上版本
freeswitch:
GCC:4.8.5
之前的gateway配置和问题配置conf/sip_profile/external/,设置网关参数,例子中只列举了必须的参数,非注册模式。
include
gatewayname="gw-138-5080"
paramname="username"value="not-used"/
paramname="realm"value="10.55.55.138:5080"/
paramname="password"value="not-used"/
paramname="register"value="false"/
!--sanoptionspingeveryxseconds,failurewillunregisterand/ormarkitdown--
paramname="ping"value="20"/
paramname="ping-min"value="3"/
paramname="ping-max"value="6"/
paramname="ping-user-agent"value="proxy"/
/gateway
/include
在使用该网关发起呼叫的时候,会有三个问题。
问题一,gateway的invite消息的from头域“caller_id_number”字段内容错误。
From:"123456"sip:not-used@10.55.55.138:5080;transport=udp;user=phone;tag=Kpe5rrr9Nr9jK
问题二,网关参数"ping-user-agent"会导致fs刷新配置(reloadxml)的时候coredump。从core文件分析可以看到“sofia_reg_check_gateway”函数中的问题点。
(gdb)bt
10x00007f4310d96974int_str_xtra()from/lib64/
30x00007f4310d3d990innua_signal()from/lib64/
50x00007f4308826bf9insofia_reg_check_gateway(profile=profile@entry=0xe027f0,now=1684490085)atsofia_:392
70x00007f4312db2d50indummy_worker(opaque=0xe07080)atthreadproc/unix/:151
90x00007f430f33bb0dinclone()from/lib64/
(gdb)f5
#50x00007f4308826bf9insofia_reg_check_gateway(profile=profile@entry=0xe027f0,now=1684490085)atsofia_:392
392nua_options(nh,
(gdb)l
387switch_copy_string(pvt-gateway_name,gateway_ptr-name,sizeof(pvt-gateway_name));
388nua_handle_bind(nh,pvt);
389
390gateway_ptr-pinging=1;
391gateway_ptr-ping_sent=switch_time_now();
392nua_options(nh,
393TAG_IF(gateway_ptr-register_sticky_proxy,NUTAG_PROXY(gateway_ptr-register_sticky_proxy)),
394TAG_IF(user_via,SIPTAG_VIA_STR(user_via)),
395SIPTAG_TO_STR(gateway_ptr-options_to_uri),SIPTAG_FROM_STR(gateway_ptr-options_from_uri),
396TAG_IF(gateway_ptr-contact_in_ping,SIPTAG_CONTACT_STR(gateway_ptr-register_contact)),
(gdb)
397TAG_IF(gateway_ptr-options_user_agent,SIPTAG_USER_AGENT_STR(gateway_ptr-options_user_agent)),
398TAG_END());
399
400switch_safe_free(user_via);
401user_via=NULL;
402}
(gdb)pgateway_ptr-options_user_agent
$1=0x7f430adc3092Address0x7f430adc3092outofbounds
问题三,options检测不够灵敏,自动切换时间较长,通过修改“ping-min”和“ping-max”参数的值,达到故障转移40秒内自动切换,故障恢复后40秒内切回。
新的gateway配置方法include
gatewayname="gw-138-5080"
paramname="realm"value="10.55.55.138:5080"/
paramname="caller-id-in-from"value="true"/
paramname="register"value="false"/
!--sanoptionspingeveryxseconds,failurewillunregisterand/ormarkitdown--
paramname="ping"value="20"/
paramname="ping-min"value="2"/
paramname="ping-max"value="3"/
/gateway
/include
新的参数在测试后验证成功,结果符合预期。
总结freeswitch的gateway概念有多种类型和参数,需要在实际应用场景下测试验证。
gateway的参数详情请参考fs官网文档。
空空如常
求真得真