<div dir="ltr"><p class="MsoNormal">Hi, all</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">I'm trying to set up 2 kamailio servers for active-active
redundancy. The two kamailio severs share the the same database with db_mode=3,
and no registration replication. Use pjsua2 as SIP client for testing. The test
setup is as follows:</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">kamailio server 1(k1): <a href="http://10.0.1.30:5061">10.0.1.30:5061</a></p>

<p class="MsoNormal">kamailio server 2(k2): <a href="http://10.0.1.32:5061">10.0.1.32:5061</a></p>

<p class="MsoNormal">sip client c1: <a href="mailto:sip%3A16317@10.0.1.30">sip:16317@10.0.1.30</a>, client ip: 10.0.1.254</p>

<p class="MsoNormal">sip client c2: <a href="mailto:sip%3A72316@10.0.1.30">sip:72316@10.0.1.30</a>, client ip: 10.0.1.254</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">c1 is registered with k1.</p>

<p class="MsoNormal">c2 is registered with k2.</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">When c1 calls c2, the call flow is as follows:</p>

<p class="MsoNormal">INVITE:</p>

<p class="MsoNormal">c1------>k1------>k2------>c2</p>

<p class="MsoNormal">200 OK:</p>

<p class="MsoNormal">c1<------k1<------k2<------c2</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">So far, the INVITE works. c1 and c2 can establish a call.
However, when c2 hangs up and sends BYE, the BYE is forwarded all the way to
k1, and then k1 gives a 500 server error.</p>

<p class="MsoNormal">The log on k1 seems to indicate k1 was attempting to create
a TLS connection to itself instead of using the existing TLS connection to c1
to forward the BYE.</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">BYE:</p>

<p class="MsoNormal">c1   X   k1<------k2<------c2</p>

<p class="MsoNormal">       |</p>

<p class="MsoNormal">       |------->Connection
refused/500</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">Here is the kamailio log on k1:</p>

<p class="MsoNormal">Mar 16 10:34:21 <a href="http://kamailio.sip.com">kamailio.sip.com</a> /usr/sbin/kamailio[13396]:
ERROR: <core> [tcp_main.c:2740]: tcpconn_1st_send(): connect
<a href="http://10.0.1.30:55999">10.0.1.30:55999</a> failed (RST) Connection refused</p>

<p class="MsoNormal">Mar 16 10:34:21 <a href="http://kamailio.sip.com">kamailio.sip.com</a> /usr/sbin/kamailio[13396]:
ERROR: <core> [tcp_main.c:2750]: tcpconn_1st_send(): <a href="http://10.0.1.30:55999">10.0.1.30:55999</a>:
connect & send  for 0x7fc96a68a1a0
failed: Connection refused (111)</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">This is the routing logic for BYE in kamailio.cfg:</p>

<p class="MsoNormal">                if
(loose_route()) {</p>

<p class="MsoNormal">                       
route(DLGURI);</p>

<p class="MsoNormal">                       
if (is_method("BYE")) {</p>

<p class="MsoNormal">                               
xlog("L_DBG", "=====BYE $ru from $fu $si:$sp to
$du=====\n");</p>

<p class="MsoNormal">                                dlg_manage();</p>

<p class="MsoNormal">                            
   setflag(FLT_ACC); # do
accounting ...</p>

<p class="MsoNormal">                               
setflag(FLT_ACCFAILED); # ... even if the transaction fails</p>

<p class="MsoNormal">                       
}</p>

<p class="MsoNormal">                       
else if ( is_method("ACK") ) {</p>

<p class="MsoNormal">                                # ACK is forwarded
statelessy</p>

<p class="MsoNormal">                               
route(NATMANAGE);</p>

<p class="MsoNormal">                       
}</p>

<p class="MsoNormal">                       
else if ( is_method("NOTIFY") ) {</p>

<p class="MsoNormal">                                # Add
Record-Route for in-dialog NOTIFY as per RFC 6665.</p>

<p class="MsoNormal">                                record_route();</p>

<p class="MsoNormal">                       
}</p>

<p class="MsoNormal">                       
route(RELAY);</p>

<p class="MsoNormal">                       
exit;</p>

<p class="MsoNormal">                } else
{......</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">If I add location based routing for BYE from peer kamailio,
then the BYE seems to be forwarded correctly:</p>

<p class="MsoNormal">                if
(loose_route()) {</p>

<p class="MsoNormal">                       
route(DLGURI);</p>

<p class="MsoNormal">                       
if (is_method("BYE")) {</p>

<p class="MsoNormal">                               
xlog("L_DBG", "=====BYE $ru from $fu $si:$sp to
$du=====\n");</p>

<p class="MsoNormal">                          
     dlg_manage();</p>

<p class="MsoNormal">                               
setflag(FLT_ACC); # do accounting ...</p>

<p class="MsoNormal">                               
setflag(FLT_ACCFAILED); # ... even if the transaction fails</p>

<p class="MsoNormal">                                # If BYE coming
from Kamailio  peer, route BYE by
location</p>

<p class="MsoNormal">                               
$var(peerlist)=$sel(cfg_get.trusted.peers);</p>

<p class="MsoNormal">                                $var(i) = 0;</p>

<p class="MsoNormal">                                while($var(i)<$(var(peerlist){param.count}))
{</p>

<p class="MsoNormal">                                       
xlog("L_DBG",
"=====$(var(peerlist){param.count})=====$(var(peerlist){param.valueat,$var(i)})=====\n");</p>

<p class="MsoNormal">                                       
if(src_ip==$(var(peerlist){param.valueat,$var(i)})) {</p>

<p class="MsoNormal">                                               
lookup("location");</p>

<p class="MsoNormal">                                               
xlog("L_DBG", "=====BYE from $fu $si:$sp to
$du=====\n");</p>

<p class="MsoNormal">                                               
break;</p>

<p class="MsoNormal">                                        }</p>

<p class="MsoNormal">                                        $var(i)
= $var(i) + 1;</p>

<p class="MsoNormal">                                }</p>

<p class="MsoNormal">                       
}</p>

<p class="MsoNormal">                       
else if ( is_method("ACK") ) {</p>

<p class="MsoNormal">                                # ACK is forwarded
statelessy</p>

<p class="MsoNormal">                               
route(NATMANAGE);</p>

<p class="MsoNormal">                       
}</p>

<p class="MsoNormal">                       
else if ( is_method("NOTIFY") ) {</p>

<p class="MsoNormal">                                # Add
Record-Route for in-dialog NOTIFY as per RFC 6665.</p>

<p class="MsoNormal">                                record_route();</p>

<p class="MsoNormal">                       
}</p>

<p class="MsoNormal">                       
route(RELAY);</p>

<p class="MsoNormal">                       
exit;</p>

<p class="MsoNormal">                } else
{......</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">My first question is why k1 loose_route sends the BYE to
itself instead of the client. Is this a bug? </p>

<p class="MsoNormal">My next question is whether the above location routing for
BYE from peer kamailio a good/safe approach.</p>

<p class="MsoNormal">The SIP traces are enclosed.</p>

<p class="MsoNormal"> </p>

<p class="MsoNormal">Thanks</p></div>