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

Ozren Lapcevic ozren.lapcevic at gmail.com
Wed Sep 7 14:20:17 CEST 2011


Hi,

I've previously installed kamailio from git branch 3.1. Now, I've manged to
git cherry-pick your patch, but got "fatal: Could not find
83620cb7cd14ee3b509eef72d99337567f53967f" when tried to get t_flush_flags().
I've double-checked commit and found it here:
http://git.sip-router.org/cgi-bin/gitweb.cgi?p=sip-router;a=commit;h=83620cb7cd14ee3b509eef72d99337567f53967f.
I don't know why I can't cherry-pick it.

Your patch alone, without t_flush_flags(), doesn't change anything in my
scenario, there is still no logging of 2nd branch.

Cheers
Ozren


On Wed, Sep 7, 2011 at 1:05 PM, Daniel-Constantin Mierla
<miconda at gmail.com>wrote:

>  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> 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 and pero at abc.hr. pero at abc.hralso has set telephone number as alternative number if he is not reachable
>> at sip:pero at abc.hr. Moreover, pero at abc.hr has voicemail turned on. When
>> oz at abc.hr calls pero at abc.hr, first 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 calls pero at abc.hr, there are no answers and call is forked
>> to voicemail.
>> 2. oz at abc.hr calls 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 listsr-users at 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 at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20110907/15e12da4/attachment-0001.htm>


More information about the sr-users mailing list