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

Daniel-Constantin Mierla miconda at gmail.com
Mon Sep 12 09:19:23 CEST 2011


Hello,

over the weekend I backported the implementation of t_flush_flags() as 
well as auto-update of transaction flags after branch/failure route. 
Just pull the latest branch 3.1 and you are ready to compile/install.

Let us know if it solves the case.

Cheers,
Daniel

On 9/9/11 2:40 PM, Daniel-Constantin Mierla wrote:
> Hello,
>
> when you pulled the GIT branch 3.1, did you use --depth 1, like next?
>
>   git clone --depth 1 git://git.sip-router.org/sip-router kamailio
>
> The you just got the snapshot at that time without the history of the 
> commit and probably you did the git clone after I did the commit, a 
> new git pull taking newer commit. So try cloning again the latest 
> branch 3.1, without --depth 1 parameter.
>
> Cheers,
> Daniel
>
>
> On 9/7/11 2:20 PM, Ozren Lapcevic wrote:
>> 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 <mailto: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 <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  <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
>
>
> _______________________________________________
> 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/20110912/f753a4ad/attachment-0001.htm>


More information about the sr-users mailing list