The internal SER timer hits and the request times out (the request is not
terminated).
See SER-GettingStarted doc at
for a full example of call features
like forwarding.
g-)
----- Original Message -----
From: "zhangshuai" <zhangshuai(a)goldentek.biz>
To: "serusers" <serusers(a)lists.iptel.org>
Cc: "wuyuan" <wuyuan(a)goldentek.biz>
Sent: Friday, February 10, 2006 11:18 AM
Subject: [Serusers] a question about "cancel" in forwarding scenario
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;
};
}
_______________________________________________
Serusers mailing list
serusers(a)lists.iptel.org
http://lists.iptel.org/mailman/listinfo/serusers