Hello List,
I'm finishing my implementation of LCR with kamailio for outgoing calls but one use case does not work. Let me explain: - I have some sbc for one destination. If one destination fail, kamailio try to second one etc.. - If no SBC is available for this destination (for exemple, all are down), i want to send my call to an error server (asterisk), play an error sound.
To accomplish this, i re-write the RURI: "sip:error1@errorserver.local", and launch RELAY route. But kamailio dont make a DNS query to find IP of "errorserver.local", only change RURI and try to send to the last LCR gateway.
I have also try to add a new branch, but same result... Why kamailio do not make a new DNS query ?
*route[RELAY] { #if (is_method("INVITE")) { # if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE"); #} if (!t_relay()) { sl_reply_error(); } exit;}route[NOTFOUND]{ $ru = "sip:error1@errorserver.local"; xlog("L_WARN", "[$ci]|$si|Routing this call to $ru (error server)\n"); append_branch($ru); route(RELAY);}route[LCR] { xlog("L_INFO", "[$ci]|$si|Loading gateways...\n"); if (!load_gws(1)) { xlog("L_ERR", "[$ci]|$si|Can't load LCR gateways\n"); sl_send_reply("503", "Unable to load gateways"); exit; } else { $var(i) = 0; while(is_avp_set("$(avp(i:709)[$var(i)])")) { xlog("L_INFO", "[$ci]|$si|This gateway was found: gw_uri_avp[$var(i)]=$(avp(i:709)[$var(i)]) \n"); $var(i) = $var(i) + 1; }; if(is_avp_set("$avp(i:709)")) { xlog("L_INFO", "[$ci]|$si|Trying gateway ‘$avp(i:709)’\n"); } else { xlog("L_INFO", "[$ci]|$si|No more gateways. Goto route NOTFOUND...\n"); route(NOTFOUND); }; # try the first matched gateway if (next_gw()) { xlog("L_INFO", "[$ci]|$si|New request URI built: $ru . Relaying it (and arming backup destination if needed)."); # Route to failure for failover t_on_failure("lcrfailure"); route(RELAY); } else { xlog("L_INFO", "[$ci]|$si|No more gateways (after next_gw()). Goto route NOTFOUND..."); route(NOTFOUND); }; }; exit;}failure_route[lcrfailure] { # the previous gateway is no good if (t_check_status("408|50[34]")) { xlog("L_WARN", "[$ci]|$si|Entering in entering failure_route[lcrfailure]. Error code: $T_reply_code \n"); if(is_avp_set("$avp(i:709)")) { xlog("L_INFO", "[$ci]|$si|Trying gateway ‘$avp(i:709)’\n"); } else { xlog("L_ERR", "[$ci]|$si|AVP is not set\n"); }; if (next_gw()) { xlog("L_INFO", "[$ci]|$si|New request URI built: $ru . Relaying it (and arming backup destination if needed)."); # Route to failure for failover t_on_failure("lcrfailure"); route(RELAY); } else { xlog("L_INFO", "[$ci]|$si|No more gateways (after next_gw()). Goto route NOTFOUND..."); route(NOTFOUND); }; exit; };}*
Many thanks, Regards.
Loic Chabert writes:
To accomplish this, i re-write the RURI: "sip:error1@errorserver.local", and launch RELAY route. But kamailio dont make a DNS query to find IP of "errorserver.local", only change RURI and try to send to the last LCR gateway.
I have also try to add a new branch, but same result... Why kamailio do not make a new DNS query ?
check if both hostname and ip address are given for the gateway. if so, next_gw() also sets destination uri.
-- juha
On Fri, Sep 23, 2016 at 03:59:20PM +0200, Loic Chabert wrote:
- I have some sbc for one destination. If one destination fail, kamailio
try to second one etc..
- If no SBC is available for this destination (for exemple, all are down),
i want to send my call to an error server (asterisk), play an error sound.
To accomplish this, i re-write the RURI: "sip:error1@errorserver.local", and launch RELAY route. But kamailio dont make a DNS query to find IP of "errorserver.local", only change RURI and try to send to the last LCR gateway.
I have also try to add a new branch, but same result... Why kamailio do not make a new DNS query ?
I never used the LCR module myself, but the documentation mentions that the module "sets the R-URI and possibly the destination URI". If $du is set any modification of R-URI is just send to the same destination. The solution might be: $ru="sip:error1@errorserver.local"; $du=$null;