[SR-Users] bug in 4.0.2 dialog module, no keep alives when src==dst
Daniel Tryba
daniel at pocos.nl
Wed Jun 19 11:11:45 CEST 2013
Trying to implement calllimits with the dialog module I can reproduce a
hanging dialog using a Linksys 962 by calling itself. When trying to answer
the call the INVITES end in a 200 OK but the call is terminated [linksys.txt].
That might be a bug in the 962, but the bad part is the dialog will be kept in
kamailio even though keep alives are enabled. OPTIONS are not being sent to
detect this dead dialog. If this devices calls an other device (either
registered to this kamailio or to the PSTN) KA work like configured (they are
being send to this device). Severing the connection will be detected and the
dialog will be removed. But when source and destination is the same device, no
OPTIONS are sent.
About 1 hour later the dialog is still there:
# kamctl mi dlg_list
dialog:: hash=3456:6742
state:: 3
ref_count:: 2
timestart:: 1371572203
timeout:: 68536211
callid:: 86a23723-4b71d5ad at localhost
from_uri:: sip:anonymous at localhost
from_tag:: 1736b8ab3ea801c5o0
caller_contact:: sip:+31880100781 at 10.0.34.226:17852
caller_cseq:: 102
caller_route_set::
caller_bind_addr:: udp:10.0.32.42:5060
callee_bind_addr:: udp:10.0.32.42:5060
to_uri:: sip:0880100781 at 10.0.32.42
to_tag:: 195218c1d50330b5i0
callee_contact:: sip:+31880100781 at 10.0.34.226:17852
callee_cseq:: 102
callee_route_set::
A part of syslog with debug=4 for above dialog is attached (not the same
dialog as the attached linksys capture).
Relevant kamailio.cfg parts:
modparam("dialog","dlg_flag",4)
modparam("dialog","hash_size",4096)
modparam("dialog","enable_stats",1)
modparam("dialog","db_url",DBURL)
modparam("dialog","db_mode", 2)
modparam("dialog","db_update_period", 15)
modparam("dialog","profiles_with_value","channelsinbound;channelsoutbound")
modparam("dialog","profiles_no_value", "all")
modparam("dialog","dlg_match_mode", 1)
modparam("dialog","send_bye", 1)
modparam("dialog","default_timeout", 43200)
modparam("dialog","ka_timer", 45)
modparam("dialog","ka_interval", 45)
routes to DIALIOG in request_route for CANCEL and before route(SIPOUT)
request_route {
# per request initial checks
route(REQINIT);
# NAT detection
route(NATDETECT);
# CANCEL processing
if (is_method("CANCEL"))
{
route(DIALOG);
if (t_check_trans())
{
t_relay();
}
exit;
}
[...]
route(DIALOG);
# dispatch requests to foreign domains
route(SIPOUT);
routes to DIALOG within WITHINDLG
# Handle requests within SIP dialogs
route[WITHINDLG] {
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
route(DLGURI);
if (is_method("BYE")) {
route(DIALOG);
[...]
route(RELAY);
} else {
route(DIALOG);
[...]
exit;
}
}
# active calls/dialog management
route[DIALOG]
{
if (is_method("CANCEL|ACK|BYE") || (has_totag() && is_method("INVITE|
BYE")))
{
dlg_manage();
return;
}
if (is_method("INVITE") && !has_totag())
{
if($avp(dst_maxchannels))
{
route(MAXCALLSINBOUND);
}
if($avp(src_maxchannels))
{
route(MAXCALLSOUTBOUND);
}
dlg_manage();
}
}
route[MAXCALLSOUTBOUND]
{
if(method=="INVITE")
{
if($au!=$null && $avp(src_maxchannels)>0)
{
$var(channelsinbound) = 0;
$var(channelsoutbound) = 0;
get_profile_size("channelsinbound", "$au",
"$var(channelsinbound)");
get_profile_size("channelsoutbound", "$au",
"$var(channelsoutbound)");
if(($var(channelsinbound)+$var(channelsoutbound))>=$avp(src_maxchannels))
{
send_reply("403","Call limit reached");
exit;
}
set_dlg_profile("channelsoutbound","$au");
dlg_set_property("ka-src");
}
}
return;
}
route[MAXCALLSINBOUND]
{
if(method=="INVITE")
{
if($avp(dst_maxchannels)>0)
{
$var(channelsinbound) = 0;
$var(channelsoutbound) = 0;
get_profile_size("channelsinbound", "$rU",
"$var(channelsinbound)");
get_profile_size("channelsoutbound", "$rU",
"$var(channelsoutbound)");
if(($var(channelsinbound)+$var(channelsoutbound))>=$avp(dst_maxchannels))
{
route(CALLREDIRECT);
route(TOVOICEMAIL);
send_reply("486","Call limit reached");
exit;
}
set_dlg_profile("channelsinbound","$rU");
dlg_set_property("ka-dst");
}
}
return;
}
version: kamailio 4.0.2 (x86_64/linux)
flags: STATS: Off, USE_IPV6, USE_TCP, USE_TLS, TLS_HOOKS, USE_RAW_SOCKS,
DISABLE_NAGLE, USE_MCAST, DNS_IP_HACK, SHM_MEM, SHM_MMAP, PKG_MALLOC,
USE_FUTEX, FAST_LOCK-ADAPTIVE_WAIT, USE_DNS_CACHE, USE_DNS_FAILOVER,
USE_NAPTR, USE_DST_BLACKLIST, HAVE_RESOLV_RES
ADAPTIVE_WAIT_LOOPS=1024, MAX_RECV_BUFFER_SIZE 262144, MAX_LISTEN 16,
MAX_URI_SIZE 1024, BUF_SIZE 65535, DEFAULT PKG_SIZE 4MB
poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
id: unknown
compiled on 11:28:09 Jun 17 2013 with gcc 4.7.2
--
POCOS B.V. - Croy 9c - 5653 LC Eindhoven
Telefoon: 040 293 8661 - Fax: 040 293 8658
http://www.pocos.nl/ - http://www.sipo.nl/
K.v.K. Eindhoven 17097024
-------------- next part --------------
A non-text attachment was scrubbed...
Name: linksys.txt.gz
Type: application/x-gzip
Size: 1720 bytes
Desc: not available
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20130619/83c07eee/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: syslog.gz
Type: application/x-gzip
Size: 4776 bytes
Desc: not available
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20130619/83c07eee/attachment-0001.bin>
More information about the sr-users
mailing list