Hi there
I'm using ser v 0.9.6 and Freeradius v 1.1.0 on Ubuntu 5.10. I've set
up SER and implemented the radius accounting and it is working, except
that it will record the start and stop for a call, and then 20 seconds
later will create duplicate entries for the call. The duration is
exactly the same, except the start and stop are offset by 20 secs. Does
anyone know why this is happening? I've spent hours trawling the list
and haven't found a solution for the problem.
I'm pretty new to SER to apologies if there is anything obviously wrong.
My ser.cfg is as follows:
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
#children=4
fifo="/tmp/ser_fifo"
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/lib/ser/modules/sl.so"
loadmodule "/usr/lib/ser/modules/tm.so"
loadmodule "/usr/lib/ser/modules/rr.so"
loadmodule "/usr/lib/ser/modules/maxfwd.so"
loadmodule "/usr/lib/ser/modules/usrloc.so"
loadmodule "/usr/lib/ser/modules/registrar.so"
loadmodule "/usr/lib/ser/modules/textops.so"
loadmodule "/usr/lib/ser/modules/auth.so"
loadmodule "/usr/lib/ser/modules/auth_radius.so"
loadmodule "/usr/lib/ser/modules/acc_radius.so"
# ----------------- setting module-specific parameters ---------------
# -- usrloc params --
modparam("usrloc", "db_mode", 0)
#set auth_radius exported parameters
modparam("auth_radius","radius_config","/usr/local/etc/radiusclient/radiusclient.conf")
modparam("auth_radius","service_type",12)
# Uncomment this if you want to use SQL database
# for persistent storage and comment the previous line
#modparam("usrloc", "db_mode", 2)
# accounting stuff
modparam("acc", "log_level", 1)
modparam("acc", "log_flag", 1)
modparam("acc", "log_fmt", "cdfimorstup")
modparam("acc", "radius_config", "/usr/local/etc/radiusclient/radiusclient.conf")
modparam("acc", "radius_flag", 1)
modparam("acc", "radius_missed_flag", 3)
modparam("acc", "service_type", 15)
modparam("acc", "report_ack", 0)
#random string for authentication
modparam("auth", "secret", "59t8eu4gnajdfg98qbuoarisdfhgjv-98iuQE[AFJV9M8CRWUPDXIN")
# -- 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)
# ------------------------- request routing logic -------------------
# main routing logic
route{
if (!search("^(f|From):.*192.168.0.36"))
{
break;
};
# 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 a UA is attempting a register or invite, authorize him
if(method == "REGISTER" || method == "INVITE")
{
log(1, "Attempting to authenticate user on domain 192.168.0.36");
if(!radius_www_authorize("192.168.0.36"))
{
log(1, "User authentication on domain 192.168.0.36 failed");
www_challenge("192.168.0.36","1");
break;
};
};
# we record-route all messages -- to make sure that
# subsequent messages will go through our proxy; that's
# particularly good if upstream and downstream entities
# use different transport protocol
if (!method=="REGISTER") record_route();
if (method == "ACK")
{
route(2);
break;
};
if (method=="INVITE") {
log(1, "INVITE MESSAGE RECEIVED - START ACCOUNTING\n");
setflag(1);
};
if (method=="BYE" || method=="CANCEL") {
log (1, "BYE/CANCEL RECEIVED - STOP ACCOUNTING\n");
setflag(1);
route(2);
break;
};
# subsequent messages withing a dialog should take the
# path determined by record-routing
if (loose_route())
{
# mark routing logic in request
append_hf("P-hint: rr-enforced\r\n");
};
if (!uri==myself)
{
# mark routing logic in request
append_hf("P-hint: outbound\r\n");
};
# if the request is for other domain use UsrLoc
# (in case, it does not work, use the following command
# with proper names and addresses in it)
if (uri==myself)
{
if (method=="REGISTER")
{
log(1, "User registered on domain 192.168.0.36");
save("location");
sl_send_reply("200", "ok");
break;
}
else
{
# lookup("aliases");
# native SIP destinations are handled using our USRLOC DB
if (!lookup("location"))
{
log(1, "Unknown user referenced for domain
192.168.0.36, exiting (404)");
sl_send_reply("404", "Not Found");
break;
};
};
};
append_hf("P-hint: usrloc applied\r\n");
route(2);
}
route[2]
{
if (!t_relay()) {
sl_reply_error();
};
}
The accounting logs are as follows:
Wed Apr 19 12:20:43 2006
Acct-Status-Type = Start
Service-Type = Sip-Session
Sip-Response-Code = 200
Sip-Method = 1
User-Name = "seb@192.168.0.36"
Calling-Station-Id = "sip:Seb@192.168.0.36"
Called-Station-Id = "sip:0824152727@192.168.0.36"
Sip-Translated-Request-URI = "sip:0824152727@192.168.0.37:5070"
Acct-Session-Id = "xzszxqjpwygwkky@192.168.0.36"
Sip-To-Tag = "8004"
Sip-From-Tag = "lazwk"
Sip-Cseq = "778"
NAS-Port = 5060
Acct-Delay-Time = 0
NAS-IP-Address = 127.0.0.1
Client-IP-Address = 127.0.0.1
Acct-Unique-Session-Id = "1877d2d9ca784853"
Stripped-User-Name = "seb"
Realm = "192.168.0.36"
Freeradius-Proxied-To = 192.168.0.36
Timestamp = 1145442043
Wed Apr 19 12:20:51 2006
Acct-Status-Type = Stop
Service-Type = Sip-Session
Sip-Response-Code = 200
Sip-Method = 8
User-Name = "0824152727@192.168.0.36"
Calling-Station-Id = "sip:0824152727@192.168.0.36"
Called-Station-Id = "sip:Seb@192.168.0.36"
Sip-Translated-Request-URI = "sip:Seb_192_168_0_36@192.168.0.36:5061"
Acct-Session-Id = "xzszxqjpwygwkky@192.168.0.36"
Sip-To-Tag = "lazwk"
Sip-From-Tag = "8004"
Sip-Cseq = "391"
NAS-Port = 5060
Acct-Delay-Time = 0
NAS-IP-Address = 127.0.0.1
Client-IP-Address = 127.0.0.1
Acct-Unique-Session-Id = "badf62373eccd795"
Stripped-User-Name = "0824152727"
Realm = "192.168.0.36"
Freeradius-Proxied-To = 192.168.0.36
Timestamp = 1145442051
As you can see, it seems to be generating another accounting report
corresponding to a call going the other way. The first entry is
correct. The second just seems to appear 20 secs after the call has
been disconnected. There are corresponding stops for both entries as
well as entries into the mysql database. Any ideas?
Thanks in advance
Sebastian