Hi, i have a problem about the handling of
the “cancel” message.
The call flow is this:
A -----------------> (Invite) Proxy
(P) B
(100
Tryng) <---------------------------
----------------->(Invite) B
(100
Tryng) <---------------------------
(183
Progress) <---------------------------
(183 Progress) <---------------------------
(200
OK) <---------------------------
(200 OK) <---------------------------
--------------------------------->(CANCEL)
(200 canceling) <---------------------------
(200
OK) <---------------------------
(200 OK) <---------------------------
----------------->(ACK)
----------------->(ACK)
(BYE) <---------------------------
(BYE) <---------------------------
----------------->(481
Call Leg/Transaction Does Not Exist)
----------------->(481 Call Leg/Transaction Does Not Exist)
The B side
answer with OK, after a while , a send a CANCEL. I don’t know why
Kamailio don’t forward this message to the B side.
B retry to send
the OK message, then A send the ACK.
At the end , B
send BYE , but A don’t have the transactin.
In this
situation, kamailio should deliver the “CANCEL” to the B side ? (even
if, before B send the OK )
Or the proxy
should not consider the CANCEL because B has answered with “OK”
?
Where is the
error on my configuration ?
Thanks
I have Kamailio
1.5.3 and my configuration is this:
modparam("siptrace",
"trace_on", 0)
modparam("carrierroute",
"config_source", "db")
modparam("auth_db",
"password_column", "ha1")
modparam("auth_db",
"use_domain", 1)
modparam("usrloc",
"db_mode", 2)
#modparam("usrloc","nat_bflag",
8)
modparam("permissions",
"trusted_table", "trusted")
modparam("permissions",
"db_mode", 1)
modparam("permissions",
"peer_tag_avp", "$avp(i:707)")
modparam("mi_fifo",
"fifo_name", "/tmp/kamailio_fifo")
modparam("avpops","avp_table","usr_preferences")
modparam("avpops","attribute_column","attribute")
modparam("avpops","value_column","value")
modparam("uac","from_restore_mode","auto")
modparam("tm",
"fr_timer", 12)
modparam("tm",
"wt_timer", 32)
modparam("rr",
"append_fromtag", 1)
#modparam("rr",
"enable_full_lr", 1)
modparam("userblacklist",
"use_domain", 0)
#modparam("dialog",
"dlg_flag", 2)
modparam("registrar|nathelper",
"received_avp", "$avp(i:42)")
#modparam("registrar",
"min_expires", 17000)
modparam("acc",
"db_flag", 2)
modparam("acc",
"db_missed_flag", 3)
modparam("acc",
"db_table_acc", "acc")
modparam("acc",
"db_table_missed_calls", "missed_calls")
modparam("acc",
"detect_direction", 1)
route{
#
-----------------------------------------------------------------
# Sanity Check
Section
#
-----------------------------------------------------------------
if (!mf_process_maxfwd_header("10"))
{
sl_send_reply("483", "Too Many Hops");
exit;
};
if (msg:len > max_len)
{
sl_send_reply("513", "Message Overflow");
exit;
};
#
-----------------------------------------------------------------
# Preprocessing
#
-----------------------------------------------------------------
if
(!method=="REGISTER") record_route();
#
-----------------------------------------------------------------
# NAT Detection
#
-----------------------------------------------------------------
force_rport();
if
(nat_uac_test("19")) {
if
(method=="REGISTER") {
fix_nated_register();
}
else {
fix_nated_contact();
}
setflag(7);
}
#
-----------------------------------------------------------------
#
#
-----------------------------------------------------------------
sip_trace();
##Loose_route
packets
if
(has_totag()) {
if
(loose_route()) {
if(method=="BYE")
{
#Account
BYE transactions
setflag(2);
};
route(2);
}
else {
if
( is_method("ACK") ) {
if ( t_check_trans() ) {
#
non loose-route, but stateful ACK;
# must be an ACK after a 487 or e.g. 404 from upstream server
t_relay();
exit;
}
else {
# ACK without matching transaction ... ignore and discard.\n");
exit;
}
}
sl_send_reply("404","Not
here");
}
exit;
}
#
-----------------------------------------------------------------
# CANCEL
processing
#
-----------------------------------------------------------------
if
(is_method("CANCEL")) {
if
(t_check_trans()) t_relay();
exit;
};
t_check_trans();
#
-----------------------------------------------------------------
#
#
-----------------------------------------------------------------
if
(method =="OPTIONS" || method=="SUBSCRIBE") {exit;};
if
(method =="REGISTER") {route(3);};
route(1);
}
route[2]
{
t_on_reply("1");
if
(!t_relay()) {
sl_reply_error();
};
exit;
}
……
failure_route[2]
{
if
(t_was_cancelled()) {
# xlog("INFO:cancelled
transaction--\n");
exit;
}
revert_uri();
……
t_on_failure("2");
append_branch();
if
(!t_relay()) {
exit;
};
}