<div dir="ltr">Hi all,<div><br></div><div>I've the following infrastructure</div><div>(fake IPs)</div><div><br></div><div>62.128.128.68 (Telco SBC Inbound)</div><div>      |</div><div>      | </div><div>10.19.139.66 (Kamailio + RTPEngine)</div><div>      | </div><div>      |</div><div>10.19.139.69 (Asterisk 13)<br></div><div>      | </div><div>      |</div><div>62.128.128.68 (Telco SBC Outbound)</div><div><br></div><div> </div><div>Test scenario is:</div><div>- a mobile calls a destination; the call comes in from Telco SBC Inbound, goes through Kamailio+RTPengine and then to Asterisk which redirects the call to Telco SBC Outbound.</div><div>- Asterisk box is set with canreinvite=no and nat=force_rport,comedia so it stays in the path</div><div><br></div><div>when a call comes in SBC Inbound, it is correctly redireted to SBC Outbound. The call is answered, and after 5 or so seconds, SBC Inbound sends a new INVITE to force codecs, which Asterisk replies correctly.</div><div>the problem is that between Kamailio and SBC Inbund, when Asterisk replies to the second invite, the media port changes, resulting in audio loss: during the call, audio from destination to originator works OK but originator to destination is mute.</div><div><br></div><div>According to the telco's guys,this is due to the fact that Kamailio is changing during call the media port from original media port to a new one, on reply to the second Invite, and this is wrong and reason why sound from the originator to destination is lost (but not from destination to originator)</div><div><br></div><div>I'm lost too here.....</div><div><br></div><div>Any clue? Can anyone help? Resuming I need to make sure that, if during a call some INVITES are sent from SBC to Asterisk, that the reply keeps the same IP_ADDR:port from beginning to the end of the call. As it is today, the second invite changes te RTP Media port and no audi is heard....</div><div><br></div><div>If needed I can send PCap files.</div><div><br></div><div>please find below my kamailio.cfg file</div><div><br></div><div><div>#!define WITH_NAT<br></div><div>#!define WITH_PSTN</div><div>/* enables Accounting Log functions */</div><div>#!define FLT_ACC 1</div><div>/* enable Accounting of missed or failed calls */</div><div>#!define FLT_ACCMISSED 2</div><div>#!define FLT_ACCFAILED 3</div><div><br></div><div>/* sets the dispatcher list file path */</div><div>#!define DS_LIST "/etc/kamailio/dispatcher.list"</div><div><br></div><div>/* sets the RTP Engine address and port; RTP Engine is a NAT enabled RTP Proxy */</div><div>#!define RTP_ENGINE_ADDR "udp:<a href="http://127.0.0.1:60000/" target="_blank">127.0.0.1:60000</a>" </div><div>// was udp:localhost:60000</div><div><br></div><div>/* defines DB connection string */</div><div>#!ifndef DBURL</div><div>#!define DBURL "mysql://<a href="http://kamailio:kamailiorw@10.19.139.110/kamailio" target="_blank">kamailio:kamailiorw@10.19.139.110/kamailio</a>"</div><div>#!endif</div><div><br></div><div># - the value for 'use_domain' parameters</div><div>#!define MULTIDOMAIN 1</div><div><br></div><div>####### Global Parameters #########</div><div><br></div><div>#!ifdef WITH_DEBUG</div><div>debug=4</div><div>log_stderror=yes</div><div>#!else</div><div>debug=2</div><div>log_stderror=no</div><div>#!endif</div><div><br></div><div>#!define FLT_DISPATCH_SETID 1</div><div>#!define FLT_FS 10</div><div>#!define FLT_NATS 5</div><div>#!define FLB_NATB 6</div><div>#!define FLB_NATSIPPING 7</div><div><br></div><div>memdbg=5</div><div>memlog=5</div><div><br></div><div>log_facility=LOG_LOCAL0</div><div><br></div><div>fork=yes</div><div>children=4</div><div><br></div><div>/* comment the next line to enable TCP */</div><div>disable_tcp=no</div><div><br></div><div>/* uncomment the next line to disable the auto discovery of local aliases</div><div>   based on revers DNS on IPs (default on) */</div><div>auto_aliases=no</div><div><br></div><div>/* add local domain aliases */</div><div># alias="<a href="http://mysipserver.com/" target="_blank">mysipserver.com</a>"</div><div><br></div><div>port=5060</div><div><br></div><div>/* uncomment and configure the following line if you want Kamailio to </div><div>   bind on a specific interface/port/proto (default bind on all available) */</div><div>//listen=udp:<a href="http://10.19.139.66:5060/" target="_blank">10.19.139.66:5060</a></div><div>listen=udp:eth1:5060</div><div><br></div><div>sip_warning=no;</div><div>####### Modules Section ########</div><div><br></div><div>#set module path</div><div>mpath="/usr/lib64/kamailio/modules/"</div><div><br></div><div>loadmodule "db_mysql.so"</div><div>loadmodule "jsonrpcs.so"</div><div>loadmodule "kex.so"</div><div>loadmodule "tm.so"</div><div>loadmodule "tmx.so"</div><div>loadmodule "sl.so"</div><div>loadmodule "rr.so"</div><div>loadmodule "pv.so"</div><div>loadmodule "maxfwd.so"</div><div>/**************/</div><div>loadmodule "usrloc.so"</div><div>/**************/</div><div>loadmodule "textops.so"</div><div>loadmodule "siputils.so"</div><div>loadmodule "xlog.so"</div><div>loadmodule "sanity.so"</div><div>loadmodule "ctl.so"</div><div>loadmodule "acc.so"</div><div>loadmodule "path.so"</div><div>loadmodule "dispatcher.so"</div><div>loadmodule "rtpengine.so"</div><div>loadmodule "nathelper.so"</div><div>loadmodule "rtimer.so"</div><div>loadmodule "sqlops.so"</div><div># ----------------- setting module-specific parameters ---------------</div><div># ----- jsonrpcs params -----</div><div>modparam("jsonrpcs", "fifo_name", "/var/run/kamailio/kamailio_rpc.fifo")</div><div>modparam("jsonrpcs", "pretty_format", 1)</div><div><br></div><div><br></div><div># ----- rr params -----</div><div># add value to ;lr param to cope with most of the UAs</div><div>modparam("rr", "enable_full_lr", 1)</div><div># do not append from tag to the RR (no need for this script)</div><div>modparam("rr", "append_fromtag", 0)</div><div><br></div><div><br></div><div># ----- acc params -----</div><div>modparam("acc", "failed_transaction_flag", 3)</div><div>modparam("acc", "log_extra","src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd;src_ip=$si")</div><div><br></div><div># ----- acc params -----</div><div>/* what special events should be accounted ? */</div><div>modparam("acc", "early_media", 0)</div><div>modparam("acc", "report_ack", 0)</div><div>modparam("acc", "report_cancels", 0)</div><div>/* by default we do not adjust the direct of the sequential requests.</div><div>   if you enable this parameter, be sure the enable "append_fromtag"</div><div>   in "rr" module */</div><div>modparam("acc", "detect_direction", 0)</div><div>/* account triggers (flags) */</div><div>modparam("acc", "log_flag", FLT_ACC)</div><div>modparam("acc", "log_missed_flag", FLT_ACCMISSED)</div><div>modparam("acc", "log_extra","src_user=$fU;src_domain=$fd;src_ip=$si;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")</div><div>modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)</div><div>/* enhanced DB accounting */</div><div>modparam("acc", "db_flag", FLT_ACC)</div><div>modparam("acc", "db_missed_flag", FLT_ACCMISSED)</div><div>modparam("acc", "db_url", DBURL)</div><div>modparam("acc", "db_extra","src_user=$fU;src_domain=$fd;src_ip=$si;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd") //;calltype=$avp(calltype)")</div><div><br></div><div># ----- usrloc params -----</div><div>/* enable DB persistency for location entries */</div><div>modparam("usrloc", "db_url", DBURL)</div><div>modparam("usrloc", "db_mode", 2)</div><div>modparam("usrloc", "use_domain", MULTIDOMAIN)</div><div><br></div><div># ----- tm params -----</div><div># ----- the TM module enables stateful processing of SIP requests</div><div>modparam("tm", "fr_timer", 2000)</div><div>modparam("tm", "fr_inv_timer", 40000)</div><div><br></div><div># ----- dispatcher params -----</div><div>modparam("dispatcher", "list_file", DS_LIST)</div><div>modparam("dispatcher", "flags", 2)</div><div>modparam("dispatcher", "dst_avp", "$avp(AVP_DST)")</div><div>modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)")</div><div>modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)")</div><div>modparam("dispatcher", "sock_avp", "$avp(AVP_SOCK)")</div><div>modparam("dispatcher", "ds_hash_size", 9)</div><div>modparam("dispatcher", "dstid_avp", "$avp(dsdstid)")</div><div>modparam("path", "use_received", 1)</div><div><br></div><div># ----- rtpproxy params -----</div><div>modparam("rtpengine", "rtpengine_sock", RTP_ENGINE_ADDR)</div><div>modparam("nathelper", "received_avp", "$avp(s:rcv)")</div><div><br></div><div>/************************/</div><div><span style="white-space:pre-wrap">        </span># ----- nathelper params -----</div><div><span style="white-space:pre-wrap">   </span>modparam("nathelper", "natping_interval", 30)</div><div><span style="white-space:pre-wrap">        </span>modparam("nathelper", "ping_nated_only", 1)</div><div><span style="white-space:pre-wrap">  </span>modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)</div><div><span style="white-space:pre-wrap">       </span>modparam("nathelper", "sipping_from", "<a href="mailto:sip%3Aping@kamailio.org" target="_blank">sip:ping@kamailio.org</a>")</div><div><br></div><div><span style="white-space:pre-wrap">       </span># params needed for NAT traversal in other modules</div><div><span style="white-space:pre-wrap">       </span>modparam("usrloc", "nat_bflag", FLB_NATB)</div><div>/***********************/</div><div><br></div><div>modparam("rtimer", "timer", "name=cdr;interval=300;mode=1;")</div><div>modparam("rtimer", "exec", "timer=cdr;route=CDRS")</div><div>modparam("sqlops", "sqlcon", "ca=>mysql://kamailio:**********@*************/kamailio")</div><div><br></div><div><br></div><div><br></div><div>####### Routing Logic ########</div><div><br></div><div><br></div><div># main request routing logic</div><div><br></div><div>route {</div><div>xlog("L_INFO","$rm from $si");</div><div>xlog("L_DBG","[$fU@$si:$sp]{$rm} {$ru} ");</div><div><br></div><div><br></div><div><span style="white-space:pre-wrap"> </span># OPTIONS requests without a username in the Request-URI but one</div><div><span style="white-space:pre-wrap"> </span># of our domains or IPs are addressed to the proxy itself and</div><div><span style="white-space:pre-wrap">    </span># can be answered statelessly.</div><div><span style="white-space:pre-wrap">   </span>if (is_method("OPTIONS")) // && $fU=="ping" )// && $si=="62.28.173.10" && $fU=="ping")// && strempty(@ruri.user) && (uri == myself))</div><div><span style="white-space:pre-wrap">     </span>{</div><div><span style="white-space:pre-wrap">                </span>sl_send_reply("200","OK");</div><div><span style="white-space:pre-wrap">           </span>exit;</div><div><span style="white-space:pre-wrap">    </span>}<span style="white-space:pre-wrap">       </span></div><div><br></div><div><span style="white-space:pre-wrap">        </span># per request initial checks</div><div><span style="white-space:pre-wrap">     </span>route(REQINIT);</div><div>rtpengine_manage();<span style="white-space:pre-wrap">       </span></div><div><span style="white-space:pre-wrap"> </span># NAT detection</div><div><span style="white-space:pre-wrap">  </span>route(NATDETECT);</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap"> </span># handle requests within SIP dialogs</div><div><span style="white-space:pre-wrap">             </span>### only initial requests (no To tag)</div><div><span style="white-space:pre-wrap">            </span># CANCEL processing</div><div><span style="white-space:pre-wrap">              </span>if (is_method("CANCEL"))</div><div><span style="white-space:pre-wrap">               </span>{</div><div><span style="white-space:pre-wrap">                        </span>if (t_check_trans()){</div><div><span style="white-space:pre-wrap">                            </span>route(RELAY);</div><div><span style="white-space:pre-wrap">                    </span>}</div><div><span style="white-space:pre-wrap">                        </span>exit;</div><div><span style="white-space:pre-wrap">            </span>}</div><div><span style="white-space:pre-wrap">                </span># handle retransmissions</div><div><span style="white-space:pre-wrap">         </span>if (!is_method("ACK")) {</div><div><span style="white-space:pre-wrap">                       </span>if(t_precheck_trans()) {</div><div><span style="white-space:pre-wrap">                         </span>t_check_trans();</div><div><span style="white-space:pre-wrap">                         </span>exit;</div><div><span style="white-space:pre-wrap">                    </span>}</div><div><span style="white-space:pre-wrap">                        </span>t_check_trans();</div><div><span style="white-space:pre-wrap">         </span>}</div><div><span style="white-space:pre-wrap">                </span></div><div><span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap">         </span>route(WITHINDLG);</div><div><br></div><div><span style="white-space:pre-wrap">               </span># record routing for dialog forming requests (in case they are routed)</div><div>                # - remove preloaded route headers</div><div>                xlog("L_INFO","Removing Headers");</div><div>                remove_hf("Route");</div><div>                if (is_method("INVITE|SUBSCRIBE")){</div><div>                        xlog("L_INFO","Recording Route");</div><div>                        record_route();</div><div><br></div><div><span style="white-space:pre-wrap">                  </span>if (is_method("INVITE")) {</div><div>    <span style="white-space:pre-wrap">                      </span>    if (has_body("application/sdp")) {</div><div><span style="white-space:pre-wrap">                       </span>            if (rtpengine_offer())</div><div><span style="white-space:pre-wrap">                 </span>                t_on_reply("1");</div><div><span style="white-space:pre-wrap">                       </span>        } else {</div><div><span style="white-space:pre-wrap">                     </span>            t_on_reply("2");</div><div><span style="white-space:pre-wrap">                     </span>        }</div><div><span style="white-space:pre-wrap">                    </span>}</div><div>                }</div><div><br></div><div><span style="white-space:pre-wrap">               </span>if (is_method("ACK") && has_body("application/sdp"))</div><div><span style="white-space:pre-wrap">         </span>        rtpengine_answer();</div><div><br></div><div><span style="white-space:pre-wrap">         </span># account only INVITEs</div><div>                if (is_method("INVITE"))</div><div>                {</div><div>                        setflag(FLT_ACC); # do accounting</div><div><span style="white-space:pre-wrap">                      </span></div><div>                }</div><div><br></div><div><br></div><div><span style="white-space:pre-wrap">               </span>//route(SIPOUT);</div><div><br></div><div><br></div><div><span style="white-space:pre-wrap">               </span>xlog("L_INFO","Setting PRESENCE");</div><div><span style="white-space:pre-wrap">           </span># handle presence related requests</div><div><span style="white-space:pre-wrap">               </span>route(PRESENCE);</div><div><br></div><div><span style="white-space:pre-wrap">                </span># handle registrations</div><div><span style="white-space:pre-wrap">           </span>xlog("L_INFO","Handling REGISTRAR");</div><div><span style="white-space:pre-wrap">         </span>route(REGISTRAR);</div><div><br></div><div><span style="white-space:pre-wrap">               </span>if ($rU==$null)</div><div><span style="white-space:pre-wrap">          </span>{</div><div><span style="white-space:pre-wrap">                        </span># request with no Username in RURI</div><div><span style="white-space:pre-wrap">                       </span>sl_send_reply("484","Address Incomplete");</div><div><span style="white-space:pre-wrap">                   </span>exit;</div><div><span style="white-space:pre-wrap">            </span>}</div><div><br></div><div><span style="white-space:pre-wrap">               </span># dispatch destinations</div><div><span style="white-space:pre-wrap">          </span>route(DISPATCH);</div><div><br></div><div><span style="white-space:pre-wrap">        </span>xlog("L_INFO","**********END*************");</div><div>}</div><div><br></div><div>onreply_route[1]</div><div>{</div><div>    if (has_body("application/sdp"))</div><div>        rtpengine_answer();</div><div>}</div><div><br></div><div>onreply_route[2]</div><div>{</div><div>    if (has_body("application/sdp"))</div><div>        rtpengine_offer();</div><div>}</div><div><br></div><div># Per SIP request initial checks</div><div>route[REQINIT] {</div><div>xlog("L_INFO","REQINIT Starting");</div><div>        if (!mf_process_maxfwd_header("10")) {</div><div><span style="white-space:pre-wrap">         </span>xlog("L_INFO","483 - Too Many Hops");</div><div>                sl_send_reply("483","Too Many Hops");</div><div>                exit;</div><div>        }</div><div><br></div><div>        if(!sanity_check("1511", "7"))</div><div>        {</div><div>                xlog("Sanity Check -> Malformed SIP message from $si:$sp\n");</div><div>                exit;</div><div>        }</div><div>xlog("L_INFO","REQINIT Finishing");</div><div>}</div><div><br></div><div>/***********************/</div><div>        # Caller NAT detection</div><div>        route[NATDETECT] {</div><div><span style="white-space:pre-wrap">        </span>xlog("L_INFO","Entering NATDTECT");</div><div>        #!ifdef WITH_NAT</div><div>                force_rport();</div><div>                if (nat_uac_test("19")) {</div><div>                        if (is_method("REGISTER")) {</div><div><span style="white-space:pre-wrap">                               </span>xlog("L_INFO","Fix Nated Register");</div><div>                                fix_nated_register();</div><div>                        } else {</div><div>                              if(is_first_hop())</div><div><span style="white-space:pre-wrap">                    </span>      {</div><div><span style="white-space:pre-wrap">                               </span>  xlog("L_INFO","Set Contact Alias");</div><div>                                        set_contact_alias();</div><div><span style="white-space:pre-wrap">                        </span>      }</div><div>                        }</div><div><span style="white-space:pre-wrap">                   </span>xlog("L_INFO","Set FLT_NATS" + FLT_NATS);</div><div>                        setflag(FLT_NATS);</div><div>                }</div><div>        #!endif</div><div><span style="white-space:pre-wrap">     </span>xlog("L_INFO","NAT Detect set FLT_NTS = " + FLT_NATS);</div><div><span style="white-space:pre-wrap">       </span>xlog("L_INFO","Finishing NATDETECT");</div><div>           return;</div><div>        }</div><div>/***********************/</div><div><br></div><div><br></div><div># Handle requests within SIP dialogs</div><div>route[WITHINDLG] {</div><div><span style="white-space:pre-wrap">       </span>xlog("L_INFO","Entering WITHDLG");</div><div>        if (!has_totag()) return;</div><div><br></div><div>        # sequential request withing a dialog should</div><div>        # take the path determined by record-routing</div><div>        if (loose_route()) {</div><div>                route(DLGURI);</div><div>                if (is_method("BYE")) {</div><div>                        setflag(FLT_ACC); # do accounting ...</div><div>                        setflag(FLT_ACCFAILED); # ... even if the transaction fails</div><div>                }</div><div>                else if ( is_method("ACK") ) {</div><div>                        # ACK is forwarded statelessy</div><div><span style="white-space:pre-wrap">                       </span>xlog("L_INFO","Going to NATMANAGE");</div><div>                        route(NATMANAGE);</div><div>                }</div><div>                else if ( is_method("NOTIFY") ) {</div><div>                        # Add Record-Route for in-dialog NOTIFY as per RFC 6665.</div><div>                        record_route();</div><div>                }</div><div>                route(RELAY);</div><div>                exit;</div><div>        }</div><div><br></div><div>        if (is_method("SUBSCRIBE") && uri == myself) {</div><div>                # in-dialog subscribe requests</div><div>                route(PRESENCE);</div><div>                exit;</div><div>        }</div><div>        if ( is_method("ACK") ) {</div><div>                if ( t_check_trans() ) {</div><div>                        # no loose-route, but stateful ACK;</div><div>                        # must be an ACK after a 487</div><div>                        # or e.g. 404 from upstream server</div><div>                        route(RELAY);</div><div>                        exit;</div><div>                } else {</div><div>                        # ACK without matching transaction.  Try to route anyway - being optimistic</div><div>                        # since it has at least a To Tag</div><div>                        route(RELAY);</div><div>                        exit;</div><div>                }</div><div>        }</div><div>        sl_send_reply("404","Not here");</div><div><span style="white-space:pre-wrap">       </span>xlog("L_INFO","Finishing WITHINDLG");</div><div>        exit;</div><div>}</div><div><br></div><div># Routing to foreign domains</div><div>route[SIPOUT] {</div><div>xlog("L_INFO","Entering SIPOUT");</div><div><span style="white-space:pre-wrap">  </span>if (uri==myself) </div><div><span style="white-space:pre-wrap">       </span>{</div><div><span style="white-space:pre-wrap">                </span>xlog("L_INFO","URI is MySelf!");</div><div><span style="white-space:pre-wrap">             </span>return;</div><div><span style="white-space:pre-wrap">  </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>append_hf("P-hint: outbound\r\n");</div><div><span style="white-space:pre-wrap">     </span>xlog("L_INFO","Finishing SIPOUT");</div><div><span style="white-space:pre-wrap">   </span>route(RELAY);</div><div><span style="white-space:pre-wrap">    </span>exit;</div><div>}</div><div><br></div><div><br></div><div># Wrapper for relaying requests</div><div>route[RELAY] {</div><div>xlog("L_INFO","******** RELAY *******");</div><div><br></div><div><span style="white-space:pre-wrap">   </span># enable additional event routes for forwarded requests</div><div><span style="white-space:pre-wrap">  </span># - serial forking, RTP relaying handling, a.s.o.</div><div><span style="white-space:pre-wrap">        </span>if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {</div><div><span style="white-space:pre-wrap">                </span>if(!t_is_set("branch_route")) {</div><div><span style="white-space:pre-wrap">                        </span>xlog("L_INFO","branch_route NOT SET!");</div><div><span style="white-space:pre-wrap">                      </span>t_on_branch("MANAGE_BRANCH");</div><div><span style="white-space:pre-wrap">          </span>}</div><div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span>if (is_method("INVITE|SUBSCRIBE|UPDATE")) {</div><div><span style="white-space:pre-wrap">            </span>if(!t_is_set("onreply_route")) {</div><div><span style="white-space:pre-wrap">                       </span>xlog("L_INFO","onreply_route NOT SET!");</div><div><span style="white-space:pre-wrap">                     </span>t_on_reply("MANAGE_REPLY");</div><div><span style="white-space:pre-wrap">            </span>}</div><div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span>if (is_method("INVITE")) {</div><div><span style="white-space:pre-wrap">             </span>if(!t_is_set("failure_route")) {</div><div><span style="white-space:pre-wrap">                       </span> xlog("L_INFO","failure_route NOT SET!");</div><div><span style="white-space:pre-wrap">                   </span>t_on_failure("MANAGE_FAILURE");</div><div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><span style="white-space:pre-wrap">       </span>if (!t_relay()) {</div><div><span style="white-space:pre-wrap">                </span> xlog("L_INFO","t_relay returns FALSE");</div><div><span style="white-space:pre-wrap">            </span>sl_reply_error();</div><div><span style="white-space:pre-wrap">        </span>}</div><div><span style="white-space:pre-wrap">        </span>exit;</div><div>}</div><div><br></div><div># URI update for dialog requests</div><div>route[DLGURI] {</div><div>xlog("L_INFO","Entering DLGURI");</div><div>#!ifdef WITH_NAT</div><div><span style="white-space:pre-wrap">   </span>if(!isdsturiset()) {</div><div><span style="white-space:pre-wrap">             </span> xlog("L_INFO","Handle ruri ALIAS");</div><div><span style="white-space:pre-wrap">                </span>handle_ruri_alias();</div><div><span style="white-space:pre-wrap">     </span>}</div><div>#!endif</div><div><span style="white-space:pre-wrap">  </span>return;</div><div>}</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><span style="white-space:pre-wrap">     </span># RTPProxy control and singaling updates for NAT traversal</div><div><span style="white-space:pre-wrap">       </span>route[NATMANAGE] {</div><div><span style="white-space:pre-wrap">       </span>xlog("L_INFO","Entering NATMANAGE");</div><div><span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span> #!ifdef WITH_NAT</div><div><span style="white-space:pre-wrap">               </span>if (is_request()) {</div><div><span style="white-space:pre-wrap">                      </span>if(has_totag()) {</div><div><span style="white-space:pre-wrap">                                </span>if(check_route_param("nat=yes")) {</div><div><span style="white-space:pre-wrap">                                     </span>xlog("L_INFO","nat=yes --- Setting FLB_NATB");</div><div><span style="white-space:pre-wrap">                                       </span>setbflag(FLB_NATB);</div><div><span style="white-space:pre-wrap">                              </span>}</div><div><span style="white-space:pre-wrap">                        </span>}</div><div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">         </span>if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB) ))</div><div><span style="white-space:pre-wrap">             </span>{</div><div><span style="white-space:pre-wrap">                        </span>xlog("L_INFO","NO FLT_NATS/B Set!!! Getting out of NATMANAGE");</div><div><span style="white-space:pre-wrap">                      </span>return;</div><div><span style="white-space:pre-wrap">          </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap">         </span>xlog("L_INFO","Starting RTPEngine");</div><div><span style="white-space:pre-wrap">         </span>rtpengine_manage();</div><div><br></div><div><span style="white-space:pre-wrap">             </span>if (is_request()) {</div><div><span style="white-space:pre-wrap">                      </span>if (!has_totag()) {</div><div><span style="white-space:pre-wrap">                              </span>if(t_is_branch_route()) {</div><div><span style="white-space:pre-wrap">                                        </span>xlog("L_INFO","adding nat=yes");</div><div><span style="white-space:pre-wrap">                                     </span>add_rr_param(";nat=yes");</div><div><span style="white-space:pre-wrap">                              </span>}</div><div><span style="white-space:pre-wrap">                        </span>}</div><div><span style="white-space:pre-wrap">                </span>}</div><div><span style="white-space:pre-wrap">                </span>if (is_reply()) {</div><div><span style="white-space:pre-wrap">                        </span>if(isbflagset(FLB_NATB)) {</div><div><span style="white-space:pre-wrap">                               </span>if(is_first_hop())</div><div><span style="white-space:pre-wrap">                               </span>{</div><div><span style="white-space:pre-wrap">                                        </span>xlog("L_INFO","Set Contact Alias");</div><div><span style="white-space:pre-wrap">                                  </span>set_contact_alias();</div><div><span style="white-space:pre-wrap">                             </span>}</div><div><span style="white-space:pre-wrap">                        </span>}</div><div><span style="white-space:pre-wrap">                </span>}</div><div> <span style="white-space:pre-wrap">      </span> #!endif</div><div><span style="white-space:pre-wrap">                </span>return;</div><div><span style="white-space:pre-wrap">  </span>}</div><div><br></div><div><br></div><div><br></div><div><br></div><div># Handle SIP registrations</div><div>route[REGISTRAR] {</div><div><span style="white-space:pre-wrap">  </span>if(!is_method("REGISTER"))</div><div><span style="white-space:pre-wrap">             </span>return;</div><div><span style="white-space:pre-wrap">  </span>add_path_received();</div><div>        route(DISPATCH);</div><div>}</div><div><br></div><div># Presence server route</div><div>route[PRESENCE] {</div><div><span style="white-space:pre-wrap">   </span>if(!is_method("PUBLISH|SUBSCRIBE"))</div><div><span style="white-space:pre-wrap">            </span>return;</div><div><br></div><div><span style="white-space:pre-wrap"> </span>sl_send_reply("404", "Not here");</div><div><span style="white-space:pre-wrap">    </span>exit;</div><div>}</div><div><br></div><div><br></div><div># Dispatch requests</div><div>route[DISPATCH] {</div><div><span style="white-space:pre-wrap">        </span>xlog("L_INFO","Entering DISPATCH");<span style="white-space:pre-wrap">         </span></div><div><span style="white-space:pre-wrap"> </span># hash over callerid dispatching on gateways group '1'</div><div><span style="white-space:pre-wrap">   </span>if(!ds_select_dst("1", "10","4"))</div><div><span style="white-space:pre-wrap">  </span>{</div><div><span style="white-space:pre-wrap">                </span>xlog("L_INFO","no destination selected from dispatcher list!");<span style="white-space:pre-wrap">     </span></div><div><span style="white-space:pre-wrap">         </span>send_reply("404", "No destination");</div><div><span style="white-space:pre-wrap">         </span>exit;</div><div><span style="white-space:pre-wrap">    </span>}</div><div><span style="white-space:pre-wrap">        </span></div><div><span style="white-space:pre-wrap"> </span>xlog("L_INFO","going to <$ru> via <$du>\n");</div><div><br></div><div><span style="white-space:pre-wrap">    </span>t_on_failure("RTF_DISPATCH");</div><div><span style="white-space:pre-wrap">  </span>route(RELAY);</div><div><span style="white-space:pre-wrap">    </span></div><div><span style="white-space:pre-wrap"> </span>exit;</div><div><span style="white-space:pre-wrap">    </span></div><div>}</div><div><br></div><div><br></div><div><br></div><div><br></div><div># Sample failure route</div><div>failure_route[RTF_DISPATCH] {</div><div><span style="white-space:pre-wrap">    </span>if (t_is_canceled()) {</div><div><span style="white-space:pre-wrap">           </span>exit;</div><div><span style="white-space:pre-wrap">    </span>}</div><div><span style="white-space:pre-wrap">        </span>xlog("L_INFO", "Media server $du failed to answer, selecting other one!");</div><div><span style="white-space:pre-wrap">   </span># next DST - only for 500 or local timeout</div><div><span style="white-space:pre-wrap">       </span>if ( t_check_status("500") || (t_branch_timeout() && !t_branch_replied()) )</div><div><span style="white-space:pre-wrap">    </span>{</div><div><span style="white-space:pre-wrap">                </span>#we mark the destination Inactive and Probing</div><div>                ds_mark_dst("ip");</div><div><span style="white-space:pre-wrap">         </span>if(ds_next_dst())</div><div><span style="white-space:pre-wrap">                </span>{</div><div><span style="white-space:pre-wrap">                        </span>t_on_failure("RTF_DISPATCH");</div><div><span style="white-space:pre-wrap">                  </span>route(RELAY);</div><div><span style="white-space:pre-wrap">                    </span>exit;</div><div><span style="white-space:pre-wrap">            </span>}</div><div><span style="white-space:pre-wrap">        </span>}</div><div>}</div><div><br></div><div>route[CDRS]{</div><div><span style="white-space:pre-wrap">    </span>sql_query("ca","call kamailio_cdrs();","rb");</div><div><span style="white-space:pre-wrap">      </span>sql_query("ca","call kamailio_rating('default');","rb");</div><div>}</div><div><br></div></div><div><br></div><div>Cheers,</div><div><br clear="all"><div><div dir="ltr" class="gmail-m_354794027205501891gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><b><font size="2">Sérgio </font></b></div></div></div></div></div></div></div></div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><p style="color:rgb(0,0,0);margin:0px;font-size:11pt;font-family:Calibri,sans-serif;background-color:rgb(253,253,253)"><br></p></div></div></div></div></div></div></div></div></div></div>