<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>