[Users] Call Hunting: use Avpop or LCR module ?
Alexandre Snarskii
snar at paranoia.ru
Thu Jun 1 13:32:07 CEST 2006
On Thu, Jun 01, 2006 at 01:20:28PM +0300, Daniel-Constantin Mierla wrote:
>
>
> On 06/01/06 12:53, Alexandre Snarskii wrote:
> >On Wed, May 31, 2006 at 12:04:41AM +0300, Daniel-Constantin Mierla wrote:
> >
> >>Hello,
> >>
> >>On 05/30/06 19:47, Rafael J. Risco G.V. wrote:
> >>
> >>>hi
> >>>I would like to read some opinions to know which method its better to
> >>>implement Call Hunting, using serial forking with 'avpops' or 'lcr'
> >>>module 'load_contacts()/next_contact()' functions, does someone has an
> >>>example of any of these methods?
> >>>
> >>if it is a global scope you can use any of them, Which is better?
> >>Depends on your environment and how you organize your data.
> >>
> >>If is per user, then avpops is more suitable. An example of using avpops
> >>you can find at:
> >>
> >>http://www.voice-system.ro/docs/avpops/ar01s08.html#ex_serial_forking
> >>
> >
> >It is suitable, but for some scenarios it require much more complicated
> >config, which is not easy to understand.
> >
> >Scenario:
> >User A (PSTN side) calls user B (SIP). With avpops we select some numbers
> >for this user, trying original number (returns 486/BUSY), hunting to next
> >number (creating new transaction on router).
> it does not create a new transaction, just adds a new branch to it.
> > Phone B2 starts with
> >100/Trying 180/Ringing, then user A hangs.
> >CANCEL message first visits original number, which returns
> >481/Call leg/transaction does not exists [1],
> you mean that sends CANCEL to B1? I do not think so, CANCEL is not sent
> to completed branches, just to ones that haven't received a final response.
> > then hunts to second
> >number and successfully cancel's call. But, at point [1], first transaction
> >_does not store_ new reply code (modules/tm/t_reply.c, line 762 just logs
> >message
> > LOG(L_ERR, "ERROR: t_should_relay_response: status rewrite by UAS:
> > "
> > "stored: %d, received: %d\n",
> > Trans->uac[branch].last_received, new_code );
> > goto discard;
> >), and again hunts, so, third number of user B starts ringing...
> >
> What version of openser do you use?
ser 0.9.6, freebsd 6.1, database backend is postgresql.
Did not tried that setup with openser yet.
Initial question was in ser-users mailing list..
> >The only solution for this which I found yet is:
> >
> >#The only way to really check return code is to check it in onreply_route,
> >#then set flag which will permit failure_route to hunt this call again.
> >#You can't check status with t_check_status within failure_route,
> >#because t_check_status in failure_route returns the lowest value
> >#of all branches..
> >onreply_route[1] {
> > if(status=~"40[48]" || status=~"486") {
> > #not-so-fatal response, should hunt
> > setflag(2);
> > };
> >}
> >failure_route[1] {
> > if(isflagset(2)) {
> > resetflag(2);
> > if(avp_pushto("$ruri","$serial_fork")) {
> >#and then everytingh should work as in example.
> >
>
> You can use t_was_cancelled() in failure route:
> http://openser.org/docs/modules/1.1.x/tm.html#AEN479 . It will ensure
> that you get the proper status of canceled transactions.
>
> >But, this config is not yet complete - with this configuration
> >CANCEL's does not hunt after 481 Call leg does not exists, so,
> >in situation when we need to cancel call on second or third number,
> >we're not able to do that :(
> >Just adding another code (481) to our list of not-so-fatal response
> >does nothing but returns us to initial problem, and the only
> >solution found is to complicate configuration again to:
> >
> >#main post-routing code
> >route[1] {
> > if(method=="CANCEL") {
> > t_on_reply("2");
> > } else {
> > t_on_reply("1");
> > };
> > t_on_failure("1");
> > t_relay();
> >};
> >
> >onreply_route[1] { #onreply for everyting but CANCEL
> > if(status=~"40[48]" || status=~"486") {
> > #not-so-fatal response, should hunt
> > setflag(2);
> > };
> >}
> >onreply_route[2] { #onreply for CANCEL's
> > if(status=~"481") {
> > #not-so-fatal response, should hunt
> > setflag(2);
> > };
> >}
> >
> >failure_route[1] {
> > if(isflagset(2)) {
> > resetflag(2);
> > if(avp_pushto("$ruri","$serial_fork")) {
> >
> >
> >Please note, that config is in pre-production stage, tested, but
> >without really massive tests. Also, note that this is not complete
> >config, just parts to allow serial hunting without noted problem.
> >
> >If anyone knows more elegant solution for my problem - please, let
> >me know. Also, if anyone can see a problem with my config - let me
> >know how to test it...
> >
>
> Could you try the latest version of OpenSER CVS, it is now in
> frozen/testing phase, just to be release in a few weeks. Any feedback
> will help to fix eventual issues. The part with reply code selections
> and CANCEL processing was refurbished and should have fixed some old issues.
>
> Cheers,
> Daniel
>
>
> >PS: another problem may arise with maximal number of branches.
> >With default configuration of ser (config.h, #define MAX_BRANCHES 12)
> >maximum number of hunts is limited to 11. If you need more hunts than
> >this - you need to recompile ser.
> >
> >
> >
More information about the Users
mailing list