<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div dir="ltr" class=""><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/" class="">10.0.1.30:5061</a></p><p class="MsoNormal">kamailio server 2(k2): <a href="http://10.0.1.32:5061/" class="">10.0.1.32:5061</a></p><p class="MsoNormal">sip client c1: <a href="mailto:sip%3A16317@10.0.1.30" class="">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" class="">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/" class="">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/" class="">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/" class="">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/" class="">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 will be sent later to avoid exceeding email size limit.</p><p class="MsoNormal">Thanks</p><div class=""><br class=""></div></div></body></html>