Greetings list,
I’m trying to setup uri rewriting and failover using
NAPTR records. I’ve gone wrong somewhere since instead of trying the
first uri and only failing over if there’s a transactional and/or
communications problem it’s creating two branches and doing parallel
forking on the records.
Example:
From my test SIP phone I dial 3759.
Openser receives this INVITE and does a private ENUM lookup
on it which returns two NAPTR records:
9.5.7.3
NAPTR 10 10 "u" "E2U+sip"
"!^.*$!sip:3759@mygateway1.whoever.com!" .
NAPTR
20 10 "u" "E2U+sip"
"!^.*$!sip:7100@myfailovergateway1.whoever.com!" .
From what I understand this should first try to contact my
gateway (a cisco box) using a uri of sip:3759@mygateway1.whoever.com. If this
fails it should then take the second higher order and rewrite the URI to
sip:7100@myfailovergateway1.whoever.com.
Instead what I end up with is two parallel calls to gateway
and failover, the second NAPTR record is a conference bridge so the cisco
immediately sends back a 200 OK and openser cancels the first branch. First
gateway barely gets off a ring to my phone. I haven’t adjusted any of the
SIP timers so the defaults should allow plenty of time for call setup etc.
Debug output from the call is in http://www.idled.net/~bobm/openser-debug.txt
. Am I handling the INVITE incorrectly in my config? Any assistance would be
appreciated.
route[1] {
if (!t_relay()) {
xlog("L_NOTICE", "sipprx-wpf1.globeop.com: $mi route[$rm][0] $fu
-> $ru -> Error with t_relay\n");
sl_reply_error();
}
exit;
}
INVITE routing block
route[6] {
sl_send_reply("100",
"Trying");
if (isflagset(1))
{
xlog("L_NOTICE", "sipprx-wpf1.globeop.com: $mi route[$rm][0] $fu
-> $ru Processing INVITE\n");
}
if
(!proxy_authorize("", "subscriber")) {
proxy_challenge("", "0");
exit;
}
if
(!check_from()) {
sl_send_reply("403","Forbidden auth ID");
exit;
}
consume_credentials();
if ((uri =~
"sip:[0-9]{4}@.*") || (uri =~ "sip:[0-9]{10}@.*")) {
prefix ("+");
if (enum_query("e164.globeop.com")) {
xlog("L_INFO", "sipprx-wpf1.globeop.com: Number found in ENUM,
new uri is $ru\n");
} else {
xlog("L_INFO", "sipprx-wpf1.globeop.com: Number not found in
ENUM\n");
revert_uri();
}
}
if
(!is_uri_host_local()) {
append_hf("P-hint: outbound\r\n");
route(1);
} else if
(lookup("location")) {
append_hf("P-hint: usrloc applied\r\n");
route(1);
} else {
sl_send_reply("404","Not found");
exit;
}
exit;
}
-- Bob