[OpenSIPS-Users] R: R: Ring Group - Memory Hunt - with serial forking?

Steven C. Blair blairs at isc.upenn.edu
Tue Apr 21 13:56:19 CEST 2009


There are somewhat ugly ways to do this. I did it in SER v0.9.x but admit my approach was not very elegant. SER v2 has a module to do sequential hunting in a more elegant fashion.

In my approach I check if the extension has permission to use call hunting and if hunting is enabled at this time. I use two avp flags for this as follows. I also use a new table call "sam" which can store multiple entries for the same extension where the extension is a primary key and duplicate keys are permitted. Huntlist is the attribute name which contains the extension to which the call should hunt.


        # hunting (serial forking)
        if (avp_db_load("$ruri/username", "s:allow_hunt")) {
           if (avp_check("s:allow_hunt", "eq/y/i")) {
              if (avp_db_load("$ruri/username", "s:use_hunt")) {
                 if (avp_check("s:use_hunt", "eq/y/i")) {
                    avp_write("$ruri/username", "$ocn");
                    avp_delete("s:allow_hunt");
                    xlog("L_INFO", "\n[SER]: [%Tf] [%ci] Call Hunting Enabled for <%ru>\n");
                    avp_db_load("$ruri/username", "s:huntlist/sam");
                    xlog("L_INFO", "\n[SER]: [%Tf] [%ci] Call Hunting Started to <%ru>\n");
                    t_on_failure("6");
                    t_relay();
                    break;
                 };
              } else {
                 xlog("L_INFO", "\n[SER]: [%Tf] [%ci] Call Hunting allowed but use_hunt is undefined <%ru>\n");
                 avp_delete("s:allow_hunt");
                 avp_delete("s:use_hunt");
                 break;
              }; # end load use_hunt
           };
        };


Then in failure_route[6] iterate through each huntlist entry. "ocn" is the original called number and is saved so we can redirect an unanswered call to that extension's voicemail mailbox


# Iterate through extension list for subscribers with call hunting enabled   
failure_route[6] {
  xlog("L_INFO", "\n[SER]: [%Tf] [%ci] Failure Block #6: CALL HUNTING for <%ru> from <%fu> at <%is>\n");
  # use the first element of the list (if any) and delete it from list

  if (avp_pushto("$ruri/username", "s:huntlist"))
  {
     xlog("L_INFO", "\n[SER]: [%Tf] [%ci] FB#6: Substitute huntlist member for R-URI. Change R-URI to <%ru> for <%tu>\n");
     route(10);
     xlog("L_INFO", "\n[SER]: [%Tf] [%ci] FB#6: Checking if huntlist member should be skipped. <%ru>,<%tu>\n");
     if (avp_check("$huntskip","eq/y/i")) {
       xlog("L_INFO", "\n[SER]: [%Tf] [%ci] FB#6: Skipping huntlist member. <%ru>,<%tu>\n");
       avp_delete("s:huntlist");
       rewriteuser("010101");
       avp_write("1", "inv_timeout"); # new
     } else {
       xlog("L_INFO", "\n[SER]: [%Tf] [%ci] FB#6: Do NOT skip huntlist member. Trying <%ru> for <%tu>\n");
       avp_delete("s:huntlist");
       avp_delete("$afn");
       avp_write("$ruri/username", "$afn");
     };
     xlog("L_INFO", "\n[SER]: [%Tf] [%ci] FB#6: Check complete. Looking up location for <%ru> to <%tu>\n");
     lookup("location");
     append_branch();
     t_on_failure("6");
     xlog("L_INFO", "\n[SER]: [%Tf] [%ci] RB#6: Preparing to relay call to next huntlist member To <%tu>  R-uri: <%ru>:  \n");
     t_relay();
  } else {
     xlog("L_INFO", "\n[SER]: [%Tf] [%ci] FB#6: No more huntlist members for <%ru>. Going to voicemail\n");
     avp_pushto("$ruri/username", "$ocn");
     route(9);
     break;
  };
  xlog("L_INFO", "\n[SER]: [%Tf] [%ci] FB#6: END CALL HUNTING for <%ru> from <%fu> at <%is>\n");
  break;
}



-Steve





-----Original Message-----
From: users-bounces at lists.opensips.org [mailto:users-bounces at lists.opensips.org] On Behalf Of Bogdan-Andrei Iancu
Sent: Tuesday, April 21, 2009 6:54 AM
To: Mauro Davi'
Cc: users at lists.opensips.org
Subject: Re: [OpenSIPS-Users] R: R: Ring Group - Memory Hunt - with serial forking?

Hi Mauro,

yes, you can can obtain a sequential forking, but what Chris is a 
parallel forking but with delayed branches.

Regards,
Bogdan


Mauro Davi' wrote:
> Sorry,
>
> and if I can change the qvalue with the lookup function (how with the path proposed) I cannot obtain a working sequential forking (i.e. the first call is sent to the first contact after the ring timeout the call (with the next_branch function) is forwarded to the second contact and so on...)? 
>
> Regards,
> 	MD
>
> -----Messaggio originale-----
> Da: Bogdan-Andrei Iancu [mailto:bogdan at voice-system.ro] 
> Inviato: martedì 21 aprile 2009 11:11
> A: Mauro Davi'
> Cc: Chris Maciejewski; users at lists.opensips.org
> Oggetto: Re: R: [OpenSIPS-Users] Ring Group - Memory Hunt - with serial forking?
>
> Hi Mauro,
>
> not really (as I understand it). What Chris wants to do is not to start 
> all branches (for parallel forking) in the same time (as you do), but to 
> start them one by one (ad different time intervals).
>
> Regards,
> bogdan
>
> Mauro Davi' wrote:
>   
>> Sorry Bogdan,
>>
>> If I understand, this is the scenarious that I implemented.
>>
>> With the lookup function patch (that add the q value to the input parameter, the same assigned to you) Chris can invoke the lookup function three time with the three subscriber and obviously three different qvalue. After he can invoke the serialize_branches(1) function.
>> Finally he can use the next_branch route in the failure route block to fork sequentially the INVITE on the next subscriber...
>> And when the next_branch function return "no other branches" he can forward the call to the voicemail...
>>
>> I don't know if the patch is applied but in this way, I think, that Chris can solve his problem...
>>
>> Regards,
>> 	MD
>>
>>  
>> -----Messaggio originale-----
>> Da: users-bounces at lists.opensips.org [mailto:users-bounces at lists.opensips.org] Per conto di Bogdan-Andrei Iancu
>> Inviato: martedì 21 aprile 2009 10:39
>> A: Chris Maciejewski
>> Cc: users at lists.opensips.org
>> Oggetto: Re: [OpenSIPS-Users] Ring Group - Memory Hunt - with serial forking?
>>
>> Hi Chris,
>>
>> Chris Maciejewski wrote:
>>   
>>     
>>> Hi,
>>>
>>> I am trying to implement a Ring Group with
>>> a Memory Hunt ring strategy.
>>>
>>> The scenario looks as follows:
>>>
>>> There is a subscriber A, B and C. All of them are members of the same
>>> Ring Group.
>>>
>>> When there is a INVITE to a "Ring Group" Opensips should send an
>>> INVITE to subscriber A, after 10 seconds it should send an INVITE to
>>> subscriber B and after another 10 seconds one more INVITE
>>> to subscriber C. If there is no 200 OK from A,B or C in 40 seconds,
>>> call should be forwarded to Voicemail server.
>>>   
>>>     
>>>       
>> This is something you cannot do right now - to wait N seconds and create 
>> another branch of an existing call (without cancelling the previous 
>> branches).
>>
>> What you want to do is a kind of "asynchronous" parallel forking.
>>
>> Regards,
>> Bogdan
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.opensips.org
>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>
>>   
>>     
>
>
>   


_______________________________________________
Users mailing list
Users at lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users



More information about the Users mailing list