Dear All,
I want to make use of avpops module to achieve forward on-no-reply. When ua1 calls ua2 and
ua2 is off-line, or busy, or doesn't answer the phone, the invite should be forwarded
to ua3 and ua3 begins ringing.
In my tests, first, ua1 sends "cancel" when ua2 is ringing. Ua1 receives
"487 Request Terminated" from SER. Second, ua1 sends "cancel" when ua3
is ringing. So, theoretically, ua1 should receive "487 Request Terminated" after
"200 canceling" from SER, right? But, ua1 received "408 Request
Timeout" instead. So strange. How come?
I think something is wrong with my ser.cfg. Could anyone help me about this? Thanks in
advance.
Here is my ser.cfg:
# ------------------ module loading ----------------------------------
loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"
loadmodule "/usr/local/lib/ser/modules/avp.so"
loadmodule "/usr/local/lib/ser/modules/acc.so"
loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/dbtext.so"
loadmodule "/usr/local/lib/ser/modules/avpops.so"
#loadmodule "/usr/local/lib/ser/modules/postgres.so"
#loadmodule "/usr/local/lib/ser/modules/flatstore.so"
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/usr/local/lib/ser/modules/auth.so"
#loadmodule "/usr/local/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/lib/ser/modules/auth_radius.so"
loadmodule "/usr/local/lib/ser/modules/group_radius.so"
loadmodule "/usr/local/lib/ser/modules/uri_radius.so"
# ----------------- setting module-specific parameters ---------------
# -- usrloc params --
#modparam("usrloc", "db_mode", 0)
# Uncomment this if you want to use SQL database
# for persistent storage and comment the previous line
modparam("usrloc", "db_mode", 1)
# -- auth params --
# Uncomment if you are using auth module
#
#modparam("auth_db", "calculate_ha1", yes)
#
# If you set "calculate_ha1" parameter to yes (which true in this config),
# uncomment also the following parameter)
#
#modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
modparam("tm", "fr_timer", 10 )
modparam("tm", "fr_inv_timer", 20)
modparam("tm", "noisy_ctimer", 1)
modparam("auth_radius|uri_radius|group_radius", "radius_config",
"/usr/local/etc/radiusclient-ng/radiusclient.conf")
modparam("avpops","avp_url","mysql://ser:heslo@localhost/ser")
modparam("avpops","avp_table","usr_preferences")
# ------------------------- request routing logic -------------------
# main routing logic
route{
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
break;
};
if (msg:len >= 2048 ) {
sl_send_reply("513", "Message too big");
break;
};
if (!method=="REGISTER") record_route();
if (loose_route()) {
t_relay();
break;
};
if (method=="INVITE") {
lookup("location");
#if (!lookup("location")) {
# sl_send_reply("404", "Not Found");
# break;
#};
}
if (method=="REGISTER") {
log("REGISTER\n");
if (!radius_www_authorize("localhost.localdomain")) {
www_challenge("localhost.localdomain", "0");
break;
};
save("location");
break;
};
if (method=="INVITE") {
if (!radius_proxy_authorize("localhost.localdomain")) {
proxy_challenge("localhost.localdomain",
"1");
break;
};
}
# if we do not get a positive reply, continue at failure_route[1]
t_on_failure("1");
# forward the request to all destinations in destination set now
t_relay();
#if (!t_relay()) {
# sl_reply_error();
#};
}
failure_route[1] {
#when caller cancel, terminate the call
if (t_check_status("487")) {
t_reply("487", "Request Terminated");
break;
};
if ( ( avp_db_load("$ruri","s:redirect_on_failure") &&
avp_check("redirect_on_failure","eq/i:1"))) {
# User need to forward
log(1, "User wants redirection.\n");
if ( ( avp_db_load("$ruri","s:redirectnumber") &&
!avp_check("redirectnumber","re/^$"))) {
log(1,"first redirect\n");
#avp_print();
attr2uri("redirect number");
lookup("location");
append_branch();
#t_on_failure("2");
t_relay();
}
else {
t_reply("408", "TimeOut");
break;
};
}
else {
t_reply("404", "Not Found");
break;
};
}