[Serusers] route loop quandary

Daniel Poulsen dpoulsen at gmail.com
Wed Aug 3 18:34:33 CEST 2005


I am having a problem with calls that are parallel forked. The problem 
happens when a call comes in, gets forked using multiple aliases and one UA 
is unavailable. The question is, how do I handle the offline call leg?

I can't do if (!lookup("location")) { break; (or sl_send_reply("404") } 
because then the whole call dies since each branch of the call uses the same 
callid.

If I t_relay them both, then the fork works but I the offline leg gets 
repeatedly relayed unltil I get a 483 "Too many hops". This scenario would 
be OK [althought certainly not ideal], except it does not allow me to add a 
condition to hunt to the next number upon a failed lookup("location"). If I 
do, the online UA will ring once and the offline UA will get routed 
immediately to voicemail which picks up after just one ring.

How are other handling these problems? I think the answer lies in letting 
failure_route handle everything, but I don't know how to get that to work 
because if I don't handle the offline users in the (!lookup("location"), I 
end up with routing loops and eventualluy a 483. Anybody that has no online 
contacts whatsoever never makes it to failure_route (where the forward to VM 
is handled).

Below is my ser.cfg. I've been playing around with things like if 
(isflagset(6)) { route(x) } but I still need some way to handle the failed 
portion of the fork. Is there a way to "null route" the failed portion or 
something?



route {

/* Registration and other logic snipped for brevity */

# Translate local address according to aliases table
xlog("L_INFO", "%ci: Preparing to look up alias for %ru\n");
if(lookup("aliases")) {
xlog("L_NOTICE", "%ci: alias lookup changed uri to %ru\n");

if (!(uri==myself)) {
xlog("L_NOTICE", "%ci: Outbound aliases %ru\n");
route(4);
break;
};

};


if ( (uri=~"^sip:411 at .*") | (uri=~"^sip:911 at .*") | 
(uri=~"^sip:011[0-9]+ at .*") | (uri=~"^sip:1[0-9]{10}@.*") ) {
route(3); # 3: PSTN with authentication
break;
};

# Anything left is a local call.

xlog("L_INFO", "%ci: Preparing to look up location for %ru\n");
if (!lookup("location")) {
xlog("L_NOTICE", "%ci: no location for %ru\n");
setflag(5);
} else {
# Had a sucessful lookup
setflag(6);
};

route(4);

}



route[4] {
# If an invitation, we want to hunt on failure

if(method == "INVITE") {
t_on_failure("1"); # first hunt
};

append_hf("P-hint: relay\r\n");

xlog("L_NOTICE", "%ci: r4: t_relay %ru\n");
if (!t_relay()) {
xlog("L_NOTICE", "%ci: %ru r4: Relay Failed\n");
sl_reply_error();
break;
};

}


failure_route[1] { revert_uri(); route(7); } ### Handle hunt sequences.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20050803/6f593e3a/attachment.htm>


More information about the sr-users mailing list