[SR-Users] Multiple parallel branches, one invalid
Anthony Joseph Messina
amessina at messinet.com
Fri Mar 10 15:06:29 CET 2017
On Thursday, March 9, 2017 8:16:55 PM CST Nathan Ward wrote:
> I have a scenario I’m not sure of the best way to solve.
>
> I use alias_db and have multiple destinations for a single number, and have
> append_branches set to 1. I then use lookup_branches to get details from
> the location table for each branch. I then do t_load_contacts and
> t_next_contacts, then t_relay to parallel fork the calls to the
> destination, and all the phones ring at once.
>
> This all works great if all the destinations from the dbaliases table are
> online.
>
> However, if one of them is offline, lookup_branches says "Not found in
> usrloc”. This branch is still there, and the call is attempted. In my
> environment, this then does a DNS lookup, can’t resolve the domain, and the
> branch fails. This is the first branch that is tried, and when this branch
> has an error like this, it causes t_relay() to fail - I check for the
> output of t_relay() and reply with an error - per the default config that
> Kamailio ships with.
>
> I guess what I need to figure out, is if there’s a way to have t_relay fail
> only if all branches fail? Or, is there a more elegant way to handle this?
>
> I should add, I only allow a single registration per subscriber - so,
> lookup_branches only returns one branch per alias from alias_db_lookup.
I'm not sure if this will work for you, but I have a similar situation where I
lookup_branches after alias_db_lookup. Just like you, if at least one of the
branches is found by lookup_branches, then the call works ok. If none of the
branches are found, then things don't work. If I understand you correctly,
you need to check if lookup_branches fails (no branches are found) and handle
the call differently before any call to t_relay.
For me, I do a quick check of the branch count and decide what to do from
there, i.e., multibranch calls get handled differently and in my case will
route to voicemail using $avp(oexten) if none of the users are online.
route[LOCATION] {
# Save the original extension
$avp(oexten)=$rU;
#!ifdef WITH_ALIASDB
if(alias_db_lookup("dbaliases")) {
# Only route a single branch via SIPOUT
if($branch(count)==0) {
route(SIPOUT);
}
}
#!endif
if(!lookup_branches("location")) {
# Save the return code from the lookup_branches function
$var(rc_lookup_branches)=$rc;
# Asterisk failover route (for non-multibranch INVITEs)
if($branch(count)==0) {
route(ASTERISK);
}
# Route to VoiceMail (Leave VoiceMail)
route(VOICEMAIL);
t_newtran();
switch($var(rc_lookup_branches)) {
case -1:
case -3:
send_reply("404", "Not Found");
exit;
case -2:
send_reply("405", "Method Not Allowed");
exit;
}
}
... other stuff ...
... eventually: t_relay();
}
--
Anthony - https://messinet.com/ - https://messinet.com/~amessina/gallery
F9B6 560E 68EA 037D 8C3D D1C9 FF31 3BDB D9D8 99B6
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20170310/aa6cbc99/attachment.sig>
More information about the sr-users
mailing list