Hello,
On 9/7/11 11:25 AM, Ozren Lapcevic wrote:
Hi Daniel,
thanks for the quick fix and reply.
What is the easiest way to try this new patch? I'm running kamailio 3.1.4
and there is no t_flush_flags() in tmx module in that version. I suppose I
need to install Kamailio Devel from git (
)
to get t_flush flags() and your patch or is there a workaround to apply them
to my 3.1.4 branch?
did you install 3.1.4 from tarball/packages or is it from git branch 3.1?
If later, then you can do:
git pull origin
git cherry-pick -x 83620cb7cd14ee3b509eef72d99337567f53967f
git cherry-pick -x c589ca35b2aa3097a3c9e2a5a050514337300c05
then recompile/install. First cherry-pick brings the t_flush_flags, the
second auto-update of the flags after branch/failure route.
If you installed from packages, then you would need to repackage yourself
after patching. The patches are available at commit url, for example:
There you find at top of the page a link named 'patch' that you can use
with git tools to apply or extract the diff-patch part and apply with patch.
Cheers,
Daniel
Cheers
Ozren
On Tue, Sep 6, 2011 at 2:18 PM, Daniel-Constantin Mierla <
miconda(a)gmail.com> wrote:
Hello,
can you use t_flush_flags() after setting the accounting flag in
falure_route? Automatic update was missing so far, reported by Alex Hermann
as well. I just did a patch, so if you want to try it, see the commit:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c589ca3…
Actually, reporting if all goes fine with this patch, will help in
backporting it to 3.1 branch.
Thanks,
Daniel
On 9/5/11 2:41 PM, Ozren Lapcevic wrote:
Hi,
I'm having some problems accounting missed serial forked calls to mysql
database.
I have following setup. Each user can have up to two contacts: telephone
number (routed to asterisk) and SIP URI. Users can specify which contact has
higher priority - which one should ring first. There is also SEMS voicemail
which is forked as 3rd serial call leg if there is no answer at first two
contacts.
For example, I have two users: oz(a)abc.hr and pero(a)abc.hr. pero(a)abc.hralso has set
telephone number as alternative number if he is not reachable
at sip:pero@abc.hr. Moreover, pero(a)abc.hr has voicemail turned on. When
oz(a)abc.hr calls pero(a)abc.hr, first pero(a)abc.hr's SIP client rings, then
if there is no answer and after the timeout telephone number rings and
finally, if there is no answer at telephone and after the timeout INVITE is
forked to SEMS.
There are two interesting scenarios accounting-wise which can happened:
1. oz(a)abc.hr calls pero(a)abc.hr, there are no answers and call is forked
to voicemail.
2. oz(a)abc.hr calls pero(a)abc.hr, there is no answer at SIP client, but
pero answers call at telephone.
When scenario 1 happens, I want to have only one log (row) in missed_calls
table.
When scenario 2 happens, I don't want to have a log in missed_calls table.
To accomplish this,* I want to log only the 2nd branch of the forked
call. However, there is either a bug in acc module or I'm doing something
wrong, and I can't get Kamailio to log only the 2nd branch*. I think that
I am setting the FLT_ACCMISSED flag correctly - after the 2nd branch is
handled and prior to calling the RELAY route. Logs show that FLT_ACCMISSED
flag is set prior to calling t_relay(), and there are no errors in debug
log. I am using $ru = "something" to rewrite URI prior to forking request.
I can easily set up logging of every call (two missed calls for serially
forked call to two locations) by setting FLT_ACCMISSED flag for each INVITE.
I can set up logging of every call's 1st branch, by reseting FLT_ACCMISSED
flag when handling 2nd branch of the call. Interestingly, logging of only
the 2nd branch of the serial forked call works when there is no forking to
voicemail!
Any ideas how to solve this problem?
Bellow are important parts of my config file. I'm running kamailio 3.1.4.
Cheers
Ozren
# ----- acc params -----
/* what special events should be accounted ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 0)
modparam("acc", "detect_direction", 0)
/* account triggers (flags) */
modparam("acc", "log_flag", FLT_ACC)
modparam("acc", "log_missed_flag", FLT_ACCMISSED)
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)
modparam("acc",
"log_extra","src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
/* enhanced DB accounting */
#!ifdef WITH_ACCDB
modparam("acc", "db_flag", FLT_ACC)
modparam("acc", "db_missed_flag", FLT_ACCMISSED)
modparam("acc", "db_url", DBURL)
modparam("acc", "db_extra",
"src_user=$fU;src_domain=$fd;dst_user=$tU;dst_domain=$td;src_ip=$si")
#!endif
...
# Main SIP request routing logic
# - processing of any incoming SIP request starts with this route
route {
# per request initial checks
route(REQINIT);
if (src_ip != ****) {
# NAT detection
route(NAT);
}
# handle requests within SIP dialogs
route(WITHINDLG);
### only initial requests (no To tag)
# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}
t_check_trans();
# authentication
route(AUTH);
# record routing for dialog forming requests (in case they are
routed)
# - remove preloaded route headers
remove_hf("Route");
if (is_method("INVITE|SUBSCRIBE"))
record_route();
# account only INVITEs
if (is_method("INVITE"))
{
setflag(FLT_ACC); # do accounting
}
# dispatch requests to foreign domains
route(SIPOUT);
### requests for my local domains
# handle presence related requests
route(PRESENCE);
# handle registrations
route(REGISTRAR);
if ($rU==$null)
{
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}
# dispatch destinations to PSTN
route(PSTN);
if ( is_method("INVITE") ) {
route(DBALIASES);
#check for user defined forking priorities and timers
route(FORK);
}
# user location service
route(LOCATION);
route(RELAY);
}
#check for user defined forking priorities and timers
route[FORK]{
sql_query("con", "select * from usr_pref_custom where
uuid='$tu'",
"pref");
$avp(uuid)=$dbr(pref=>[0,0]);
$avp(email)=$dbr(pref=>[0,1]);
$avp(prio1)=$dbr(pref=>[0,2]);
$avp(prio2)=$dbr(pref=>[0,3]);
$avp(timer1)=$dbr(pref=>[0,5]);
$avp(timer2)=$dbr(pref=>[0,6]);
if (strlen($avp(prio1))>5) {
# user has multiple contacts, do serial forking
setflag(FLT_USRPREF);
# set counter
if (!$avp(prio)) {
$avp(prio) = 1;
}
# overwrite request URI with highest priority contact
if ($avp(prio1) =~ "^sip:00") {
$ru = $avp(prio1) + "@host";
xlog("L_INFO","PRIO 1 is tel number, RURI set:
$ru");
}
else {
$ru = $avp(prio1);
xlog("L_INFO","PRIO 1 is SIP URI, RURI set:
$ru");
}
}
}
route[RELAY] {
#!ifdef WITH_NAT
if (check_route_param("nat=yes")) {
setbflag(FLB_NATB);
}
if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {
route(RTPPROXY);
}
#!endif
/* example how to enable some additional event routes */
if (is_method("INVITE")) {
t_on_reply("REPLY_ONE");
t_on_failure("FAIL_ONE");
#if users have priorities set, use FAIL_FORK failure route
if ( isflagset(FLT_USRPREF) ) {
t_on_failure("FAIL_FORK");
}
}
if (isflagset(FLT_ACCMISSED)) xlog("L_INFO","RELAY, $rm $ru,
ACCMISSED FLAG IS SET");
else xlog("L_INFO","RELAY, $rm $ru, ACCMISSED FLAG IS NOT
SET");
if (!t_relay()) {
sl_reply_error();
}
exit;
}
# Handle requests within SIP dialogs
route[WITHINDLG] {
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
xlog("L_INFO","WITHINDLG, loose_route()");
if (is_method("BYE")) {
xlog("L_INFO","WITHINDLG, BYE, DO
ACCOUNTING");
setflag(FLT_ACC); # do accounting ...
setflag(FLT_ACCFAILED); # ... even if the
transaction fails
}
route(RELAY);
} else {
if (is_method("SUBSCRIBE") && uri == myself) {
# in-dialog subscribe requests
route(PRESENCE);
exit;
}
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
# no 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
exit;
}
}
sl_send_reply("404","Not here");
}
exit;
}
}
# USER location service
route[LOCATION] {
#skip if $ru is telephone number
if ($ru =~ "^sip:00") {
xlog("L_INFO","SKIP lookup...");
}
else {
if (!lookup("location")) {
switch ($rc) {
case -1:
case -3:
t_newtran();
t_reply("404", "Not Found");
exit;
case -2:
sl_send_reply("405", "Method Not
Allowed");
exit;
}
}
}
# when routing via usrloc, log the missed calls also, but only if
user doesn't have prios set
if ( is_method("INVITE") && !(isflagset(FLT_USRPREF))) {
setflag(FLT_ACCMISSED);
}
}
# Failure route for forked calls
failure_route[FAIL_FORK] {
#!ifdef WITH_NAT
if (is_method("INVITE") && (isbflagset(FLB_NATB) ||
isflagset(FLT_NATS))) {
unforce_rtp_proxy();
}
#!endif
if ($avp(prio) >= 1) {
$avp(prio) = $avp(prio) + 1;
# handle 2nd branch
if ( ($avp(prio) == 2) && ( isflagset(FLT_USRPREF) )) {
t_on_failure("FAIL_FORK");
if ($avp(prio2) =~ "^sip:00") {
xlog("L_INFO","FAIL FORK, PRIO 2 is tel
number");
$ru = $avp(prio2) + "@host";
}
else {
xlog("L_INFO","FAIL FORK, PRIO 2 is SIP
URI");
$ru = $avp(prio2);
route(LOCATION);
}
setflag(FLT_ACCMISSED);
}
else {
$avp(prio) = 0;
$ru = $(avp(uuid));
rewritehostport("host:port");
xlog("L_INFO","FAIL FORK, VOICEMAIL
email:$avp(email), ru:$ru, br: $br");
append_hf("P-App-Name: voicemail\r\n");
append_hf("P-App-Param:
Email-Address=$avp(email)\r\n");
}
route(RELAY);
}
if (t_is_canceled()) {
exit;
}
}
_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing
listsr-users@lists.sip-router.orghttp://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
--
Daniel-Constantin Mierla --
http://www.asipto.com
Kamailio Advanced Training, Oct 10-13, Berlin:
http://asipto.com/u/kathttp://linkedin.com/in/miconda --
http://twitter.com/miconda
_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing
listsr-users@lists.sip-router.orghttp://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
--
Daniel-Constantin Mierla --