[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