On 08/06/2013 09:00 AM, Grant Bagdasarian wrote:
Hello,
Consider the following Kamailio script:
route {
…. route(DISPATCH); route(RELAY);
}
route[DISPATCH] {
ds_select_domain("1", "8");
return;
}
Dispatcher Table
SetID
Destination
1
192.168.1.10
1
192.168.1.11
Algorithm 8 uses the first destination, but if it’s not available, it uses the next one.
Does the ds_select_domain function send the SIP request to the first destination or is it the responsibility of the RELAY route to do this? I believe it’s the latter, according to the documentation.
All the ds_select_domain() function does is change the domain part of the Request URI ($rd). It's still up to you to take that modified SIP request, perform any additional processing, and relay/forward it as desired. When you do this, t_relay() will consume the domain part of the request URI, in the absence of an overriding destination set ($du, as would be the case if you used ds_select_dst()).
When Kamailio can’t reach the first destination, how does it internally handle the failover? Because once the SIP request has been relayed to the host, the script doesn’t have any instructions anymore.
You must arm a failure_route before t_relay(), and call ds_select_domain() again to advance through the gateways in the dispatcher set.
Example:
route[DISPATCHER_INITIAL] { xlog("L_INFO", "[R-DISPATCHER-INITIAL:$ci] Entering dispatcher selection route\n");
if(!ds_select_domain("1", "4")) { # This should only happen if the route set is empty.
sl_send_reply("503", "Out of Gateways");
xlog("L_ERR", "[R-DISPATCHER-INITIAL:$ci] !> " "No gateways available!\n"); exit; }
xlog("L_INFO", "[R-DISPATCHER-INITIAL:$ci] -> " "Selected gateway: $rd:$rp\n");
t_on_failure("DISPATCHER_ROLLOVER");
t_relay() etc blah blah; }
failure_route[DISPATCHER_ROLLOVER] { xlog("L_INFO", "[R-DISPATCHER-ROLLOVER:$ci] " "Relay to dispatcher-selected gateway failed\n");
if(t_is_expired()) { xlog("L_INFO", "[R-DISPATCHER-ROLLOVER:$ci] !> " "Transaction expired - aborting\n"); exit; }
if(t_is_canceled()) { xlog("L_INFO", "[R-DISPATCHER-ROLLOVER:$ci] !> " "Transaction cancelled - aborting\n"); exit; }
if(!ds_next_domain()) { # This should happen when we are out of gateways/have tried # the last one in the route set.
xlog("L_ERR", "[R-DISPATCHER-ROLLOVER:$ci] !> " "No more gateways in route set\n");
t_reply("503", "Out of gateways"); exit; }
xlog("L_INFO", "[R-DISPATCHER-ROLLOVER:$ci] -> " "Attempting relay to new gateway: $rd:$rp\n");
t_on_failure("DISPATCHER_ROLLOVER"); t_relay(); }
-- Alex