[SR-Users] Accounting only the 2nd branch of missed serial forked call

Daniel-Constantin Mierla miconda at gmail.com
Wed Sep 7 13:05:47 CEST 2011


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 
> (http://www.kamailio.org/dokuwiki/doku.php/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:

http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c589ca35b2aa3097a3c9e2a5a050514337300c05

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 at gmail.com <mailto:miconda at 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=c589ca35b2aa3097a3c9e2a5a050514337300c05
>
>     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 at abc.hr <mailto:oz at abc.hr> and
>>     pero at abc.hr <mailto:pero at abc.hr>. pero at abc.hr
>>     <mailto:pero at abc.hr> also has set telephone number as alternative
>>     number if he is not reachable at sip:pero at abc.hr
>>     <mailto:sip%3Apero at abc.hr>. Moreover, pero at abc.hr
>>     <mailto:pero at abc.hr> has voicemail turned on. When oz at abc.hr
>>     <mailto:oz at abc.hr> calls pero at abc.hr <mailto:pero at abc.hr>, first
>>     pero at abc.hr <mailto:pero at 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 at abc.hr <mailto:oz at abc.hr> calls pero at abc.hr
>>     <mailto:pero at abc.hr>, there are no answers and call is forked to
>>     voicemail.
>>     2. oz at abc.hr <mailto:oz at abc.hr> calls pero at abc.hr
>>     <mailto:pero at 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 list
>>     sr-users at lists.sip-router.org  <mailto:sr-users at lists.sip-router.org>
>>     http://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/kat
>     http://linkedin.com/in/miconda  -- http://twitter.com/miconda
>
>
>
>
> _______________________________________________
> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
> sr-users at lists.sip-router.org
> http://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/kat
http://linkedin.com/in/miconda -- http://twitter.com/miconda

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20110907/af9eca42/attachment-0001.htm>


More information about the sr-users mailing list