[OpenSIPS-Users] Dynamic routing fail-over scenario .
Sasmita Panda
spanda at 3clogic.com
Wed Oct 7 15:26:49 CEST 2015
Hi All ,
I am using opensips-1.11 . I have some scenario in which there is two
or more gateways corresponding to a single group .
for example :
grp id : 1 , domain : mongodb1.sasmita.com
gate ways :
gw:1 , address : 162.1.1.1:5090
gw:2 , address : 162.10.1.1:5080
So , what I want is that when call get connected to gw1 , if its fail
then call get routed to the next gateway .
What I have done for this is bellow :
mysql> select * from dr_groups;
+----+----------+-------------------------------+---------+--------------+
| id | username | domain | groupid | description |
+----+----------+-------------------------------+---------+--------------+
| 1 | | mongodb1.sasmita.com | 9 | out |
+----+----------+-------------------------------+---------+--------------+
mysql> select * from dr_gateways;
+----+------+------+---------------------+-------+------------+-------+------------+-------+--------+--------------+
| id | gwid | type | address | strip | pri_prefix | attrs |
probe_mode | state | socket | description |
+----+------+------+---------------------+-------+------------+-------+------------+-------+--------+--------------+
| 10 | 4 | 2 | 162.1.1.1:5090 | 0 | NULL | NULL |
0 | 0 | NULL | sipp one |
| 8 | 2 | 2 | 162.10.1.1:5080 | 0 | NULL | NULL |
0 | 0 | NULL | asterisk |
+----+------+------+---------------------+-------+------------+-------+------------+-------+--------+--------------+
mysql>
mysql> select * from dr_rules;
+--------+---------+--------+---------+----------+---------+--------+-------+---------------+
| ruleid | groupid | prefix | timerec | priority | routeid | gwlist | attrs
| description |
+--------+---------+--------+---------+----------+---------+--------+-------+---------------+
| 32 | 9 | | | 0 | | 2 | NULL
| fail route |
| 29 | 9 | | | 1 | | 4 | NULL
| out |
+--------+---------+--------+---------+----------+---------+--------+-------+---------------+
This is my table of content .
In my opensips script I have done the bellow things .
Starting I have loaded all the modules . then the below things happening .
I have loaded drouting and dialplan , inaddition to this all the
necessary modules .
route{
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
};
if (msg:len >= 2048 ) {
sl_send_reply("513", "Message too big");
exit;
};
if (method=="SUBSCRIBE") {
sl_send_reply("405", "Method not allowed");
exit;
}
if (method=="NOTIFY") {
sl_send_reply("405", "Method not allowed");
exit;
}
if (method=="OPTIONS") {
sl_send_reply("200", "OK");
exit;
}
if (!method=="REGISTER")
record_route();
if (loose_route()) {
setflag(2);
route(1);
};
if (!uri==myself) {
# drop packets, look at orig file for original config
route(1);
exit;
}
if (uri==myself) {
force_rport();
if ( is_method("REGISTER")) {
if(($hdr(User-Agent)!~"scanner")||($hdr(User-Agent)!~"SJphone")) # to
stop scanners
{
if(is_present_hf("X-Info"))
{
$var(x)=$hdr(X-Info);
$var(y)=$(var(x){s.select,0,;});
$var(z)=$(var(x){s.select,1,;});
$var(y)=$(var(y){s.select,1,=});
$var(z)=$(var(z){s.select,1,=});
if($(var(y){s.int})!=0)
{
save("location","p1n$var(z)");
exit;
}else{
save("location","rp1");
append_to_reply("Contact: $ct \r\n");
xlog( "L_NOTICE", "Contact & $ct \n" );
sl_send_reply("200","OK");
exit;
}
}else{
save("location","p1n5");
exit;
}
; save("location","fc10p1");
m_dump("$fu");
}
exit;
}
if ( is_method("CANCEL") )
{
if ( t_check_trans() ){
t_relay();
}
else {
t_reply("200","OK");
}
exit;
}
if (is_method("BYE")) {
setflag(2);
setflag(TRACE_FLAG);
t_relay();
exit;
}
if (is_method("INVITE")) {
setflag(4);
setflag(2);
xlog( "L_NOTICE", "CallCenter_Info & $ci,$var(c) \n" );
if(is_from_gw() || (to_uri=~"@190.168.1.1"))
{
xlog( "L_WARN", "Source IP sas : $Ri To Uri : $tu From : $fU
Request URI: $oU Call ID:$ci" );
if ( !lookup("location")){
sl_send_reply("404","NO Match Found");
exit;
}
#do lcr
if ( !serialize_branches(1)){
sl_send_reply("500","Internal Server Error");
exit;
}
else{
next_branches();
t_on_failure("3");
route(1);
exit;
}
}
#}
else{
}
}
route(10);
};
route[1] {
if (nat_uac_test("7")) {
fix_nated_contact();
};
t_on_reply("1");
if (!t_relay()) {
sl_reply_error();
};
exit;
}
route[10] {
$avp(src) = $rd;
xlog("request domain,$avp(trl)");
dp_translate("5", "$avp(src)/$avp(trl)");
$avp(grp)=$(avp(trl){s.int});
xlog("translated to $avp(grp) \n");
if (!do_routing("$avp(grp)","F")) {
xlog("do_routing: No rules matching the URI\n");
send_reply("503","No rules matching the URI");
exit;
}
if (is_method("INVITE")) {
t_on_failure("10");
}
route(1);
}
onreply_route[1] {
if( status =~ "18[0-9]" ) {
t_on_failure("4");
}
if (nat_uac_test("1")) {
fix_nated_contact();
};
}
failure_route[10] {
xlog("DEBUG: DROUTING failure route active\n");
if (t_check_status("408|402|50[234]")) {
# route to the next gateway
xlog("DEBUG: DROUTING use next gateway \n");
if (use_next_gw()) {
# prepare for lcr failover
xlog( "L_NOTICE", "[$Tf] ACC: $ci Next gateway $fU
-> $tU via $rd\n" );
t_on_reply("1");
t_on_failure("10");
# send from 5060 for primus gateways
if (!t_relay()){
exit;
}
} else {
xlog( "L_WARN", "[$Tf] FR: $ci No more buscuits in
the biscuit tin -> 503.\n" );
t_reply("503", "Service unavailable -- no more
gateways");
exit;
};
};
exit;
}
failure_route[4] {
xlog("L_NOTICE","could not complete");
}
I want to switch to the next gateway in the status codes defined
in the failure route . But , now its not switching the gateway . Its just
coming to the else loop and giving 503 error . I think there is
something missing in my script or in my dynamic routing table .
Please let me know if I need to change something . I am trying this
from very long time but not getting any result . Any kind of help is
appreciated .
*Thanks & Regards*
*Sasmita Panda*
*Network Testing and Software Engineer*
*3CLogic , ph:07827611765*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20151007/b43b1529/attachment-0001.htm>
More information about the Users
mailing list