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;
};
}