<div>My whole configuration is:</div><div>[Sip clients] < = > Kamailio 3.2 <=> Asterisk servers (behind Kamailio)</div><div>Asterisk servers have only local IP addresses, and I use t_relay instead of forward.</div>
<div>Kamailio runs on same server as rtpproxy.</div><div><br></div><div>Now I played lot of combinations and I have next results:</div><div>1. Clients are in same net with Kamailio server (and Asterisk server). Client call Kamailio, Kamailio t_relay to Asterisk, Asterisk dial back to Kamailio, and Kamailio dial Client. rtpproxy is working. Video and audio are fine...</div>
<div>2. Same as above, but clients are behind NAT. Sound is perfect, no video.</div><div>3. Same as in point 1, but no rtpproxy, and no Asterisk servers. Sound and video are perfect. With rtpproxy - no voice, no video.</div>
<div><br></div><div>I would like to find solution for point 2. Sound and video are on different rports (seen in wireshark). As I understand, my error is either in wrong forwarding of ACK (I do t_relay to Asterisk in case from and to addresses are same), or may be I have to find correct FLAGS for rtpproxy_manage(), or even replace it and place with rtpproxy_offer (answer etc).</div>
<div><br></div><div>Bellow is my kamailio.cfg:</div><div>####### Defined Values #########</div><div>#!define WITH_MYSQL</div><div>#!define WITH_AUTH</div><div>#!define WITH_USRLOCDB</div><div><br></div><div>#!define WITH_IPAUTH</div>
<div>#!define WITH_NAT</div><div>#!define WITH_PSTN</div><div><br></div><div># *** Value defines - IDs used later in config</div><div>#!define DBURL "mysql://<a href="http://user:pass@192.168.2.251/openser">user:pass@192.168.2.251/openser</a>"</div>
<div>#!define MULTIDOMAIN 0</div><div><br></div><div>#!define FLT_ACC 1</div><div>#!define FLT_ACCMISSED 2</div><div>#!define FLT_ACCFAILED 3</div><div>#!define FLT_NATS 5</div><div><br></div><div>#!define FLB_NATB 6</div>
<div>#!define FLB_NATSIPPING 7</div><div><br></div><div>####### Global Parameters #########</div><div><br></div><div>debug=3</div><div>log_stderror=no</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>port=5060</div><div><br></div><div>tcp_connection_lifetime=3605</div><div>#!ifdef WITH_PSTN</div><div>pstn.gw_ip = "192.168.2.251" desc "PSTN GW Address"</div>
<div>#!endif</div><div><br></div><div><br></div><div># set paths to location of modules (to sources or installation folders)</div><div>#!ifdef WITH_SRCPATH</div><div>mpath="modules_k:modules"</div><div>#!else</div>
<div>mpath="//lib64/kamailio/modules_k/://lib64/kamailio/modules/"</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_MYSQL</div><div>loadmodule "db_mysql.so"</div><div>#!endif</div><div><br></div>
<div>loadmodule "mi_fifo.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>loadmodule "usrloc.so"</div><div>loadmodule "registrar.so"</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 "cfg_rpc.so"</div><div>loadmodule "mi_rpc.so"</div><div>loadmodule "acc.so"</div>
<div><br></div><div>#!ifdef WITH_AUTH</div><div>loadmodule "auth.so"</div><div>loadmodule "auth_db.so"</div><div>#!ifdef WITH_IPAUTH</div><div>loadmodule "permissions.so"</div><div>#!endif</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_ALIASDB</div><div>loadmodule "alias_db.so"</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_SPEEDDIAL</div><div>loadmodule "speeddial.so"</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_MULTIDOMAIN</div><div>loadmodule "domain.so"</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_PRESENCE</div><div>loadmodule "presence.so"</div>
<div>loadmodule "presence_xml.so"</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_NAT</div><div>loadmodule "nathelper.so"</div><div>loadmodule "rtpproxy.so"</div><div>#!endif</div><div>
<br></div><div>#!ifdef WITH_TLS</div><div>loadmodule "tls.so"</div><div>#!endif</div><div><br></div><div>loadmodule "htable.so"</div><div>#!ifdef WITH_ANTIFLOOD</div><div>loadmodule "pike.so"</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_XMLRPC</div><div>loadmodule "xmlrpc.so"</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_DEBUG</div><div>loadmodule "debugger.so"</div><div>#!endif</div>
<div><br></div><div># ----------------- setting module-specific parameters ---------------</div><div><br></div><div><br></div><div>loadmodule "dispatcher.so"</div><div>modparam("dispatcher", "db_url", DBURL)</div>
<div># ----- mi_fifo params -----</div><div>modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")</div><div><br></div><div><br></div><div># ----- tm params -----</div><div># auto-discard branches from previous serial forking leg</div>
<div>modparam("tm", "failure_reply_mode", 3)</div><div># default retransmission timeout: 30sec</div><div>modparam("tm", "fr_timer", 30000)</div><div># default invite retransmission timeout after 1xx: 120sec</div>
<div>modparam("tm", "fr_inv_timer", 120000)</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># ----- registrar params -----</div><div>modparam("registrar", "method_filtering", 1)</div>
<div>/* uncomment the next line to disable parallel forking via location */</div><div># modparam("registrar", "append_branches", 0)</div><div>/* uncomment the next line not to allow more than 10 contacts per AOR */</div>
<div>#modparam("registrar", "max_contacts", 10)</div><div># max value for expires of registrations</div><div>modparam("registrar", "max_expires", 3600)</div><div><br></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>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", </div><div><span class="Apple-tab-span" style="white-space:pre">        </span>"src_user=$fU;src_domain=$fd;src_ip=$si;"</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>"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>#!ifdef WITH_ACCDB</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",</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>"src_user=$fU;src_domain=$fd;src_ip=$si;"</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>"dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")</div>
<div>#!endif</div><div>#!ifdef WITH_USRLOCDB</div><div>modparam("usrloc", "db_url", DBURL)</div><div>modparam("usrloc", "db_mode", 2)</div><div>modparam("usrloc", "use_domain", MULTIDOMAIN)</div>
<div>#!endif</div><div>#!ifdef WITH_AUTH</div><div>modparam("auth_db", "db_url", DBURL)</div><div>modparam("auth_db", "calculate_ha1", yes)</div><div>modparam("auth_db", "password_column", "password")</div>
<div>modparam("auth_db", "load_credentials", "")</div><div>modparam("auth_db", "use_domain", MULTIDOMAIN)</div><div>#!ifdef WITH_IPAUTH</div><div>modparam("permissions", "db_url", DBURL)</div>
<div>modparam("permissions", "db_mode", 1)</div><div>#!endif</div><div>#!endif</div><div>#!ifdef WITH_ALIASDB</div><div>modparam("alias_db", "db_url", DBURL)</div><div>modparam("alias_db", "use_domain", MULTIDOMAIN)</div>
<div>#!endif</div><div><br></div><div># ----- speedial params -----</div><div>#!ifdef WITH_SPEEDDIAL</div><div>modparam("speeddial", "db_url", DBURL)</div><div>modparam("speeddial", "use_domain", MULTIDOMAIN)</div>
<div>#!endif</div><div><br></div><div><br></div><div>#!ifdef WITH_NAT</div><div># ----- rtpproxy params -----</div><div>modparam("rtpproxy", "rtpproxy_sock", "udp:<a href="http://127.0.0.1:7722">127.0.0.1:7722</a>")</div>
<div><br></div><div># ----- nathelper params -----</div><div>modparam("nathelper", "natping_interval", 30)</div><div>modparam("nathelper", "ping_nated_only", 1)</div><div>modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)</div>
<div>modparam("nathelper", "sipping_from", "<a href="mailto:sip%3Apinger@kamailio.org">sip:pinger@kamailio.org</a>")</div><div><br></div><div># params needed for NAT traversal in other modules</div>
<div>modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")</div><div>modparam("usrloc", "nat_bflag", FLB_NATB)</div><div>#!endif</div><div><br></div><div><br></div>
<div>#!ifdef WITH_TLS</div><div># ----- tls params -----</div><div>modparam("tls", "config", "//etc/kamailio/tls.cfg")</div><div>#!endif</div><div><br></div><div>modparam("htable", "htable", "forw=>size=8;autoexpire=7200;")</div>
<div><br></div><div><br></div><div>#!ifdef WITH_DEBUG</div><div># ----- debugger params -----</div><div>modparam("debugger", "cfgtrace", 1)</div><div>#!endif</div><div><br></div><div>request_route {</div>
<div>xlog("L_ALERT","Pakage $rm from $fu (IP:$si:$sp)\n");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># per request initial checks</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(REQINIT);</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># NAT detection</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(NATDETECT);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(ACKBYE);</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># handle requests within SIP dialogs</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(WITHINDLG);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("CANCEL"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (t_check_trans())</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>t_relay();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>t_check_trans();</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(AUTH);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># record routing for dialog forming requests (in case they are routed)</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span># - remove preloaded route headers</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>remove_hf("Route");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE|SUBSCRIBE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>record_route();</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># account only INVITEs</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>setflag(FLT_ACC); # do accounting</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(SIPOUT);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(PRESENCE);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(REGISTRAR);</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if ($rU==$null)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("484","Address Incomplete");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(PSTN);</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(LOCATION);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(RELAY);</div><div>}</div><div><br></div><div>route[RELAY] {</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE|SUBSCRIBE")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_branch("MANAGE_BRANCH");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_reply("MANAGE_REPLY");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_failure("MANAGE_FAILURE");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!t_relay()) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_reply_error();</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div>
<div>}</div><div><br></div><div>route[REQINIT] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!mf_process_maxfwd_header("10")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("483","Too Many Hops");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!sanity_check("1511", "7"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog("Malformed SIP message from $si:$sp\n");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>}</div><div><br></div><div># Handle requests within SIP dialogs</div><div>route[WITHINDLG] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (has_totag()) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if (loose_route()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (is_method("BYE")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>setflag(FLT_ACC); # do accounting ...</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>setflag(FLT_ACCFAILED); # ... even if the transaction fails</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if ( is_method("ACK") ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span># ACK is forwarded statelessy</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>route(NATMANAGE);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (is_method("SUBSCRIBE") && uri == myself) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span># in-dialog subscribe requests</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>route(PRESENCE);</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if ( is_method("ACK") ) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ( t_check_trans() ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>t_relay();</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span># ACK without matching transaction ... ignore and discard</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>sl_send_reply("404","Not here");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>}</div><div><br></div><div># Handle SIP registrations</div><div>route[REGISTRAR] {</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("REGISTER"))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(isflagset(FLT_NATS))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>setbflag(FLB_NATB);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span># uncomment next line to do SIP NAT pinging </div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>## setbflag(FLB_NATSIPPING);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (!save("location"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>sl_reply_error();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>}</div><div><br></div><div># USER location service</div><div>route[LOCATION] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$avp(oexten) = $rU;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!lookup("location")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>$var(rc) = $rc;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>route(TOVOICEMAIL);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_newtran();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>switch ($var(rc)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>case -1:</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>case -3:</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>send_reply("404", "Not Found");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>case -2:</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>send_reply("405", "Method Not Allowed");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># when routing via usrloc, log the missed calls also</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>setflag(FLT_ACCMISSED);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>}</div><div><br></div><div># Presence server route</div><div>route[PRESENCE] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!is_method("PUBLISH|SUBSCRIBE"))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># if presence enabled, this part will not be executed</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("PUBLISH") || $rU==$null)</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("404", "Not here");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># Authentication route</div><div>route[AUTH] {</div>
<div>#!ifdef WITH_AUTH</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("REGISTER"))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span># authenticate the REGISTER requests (uncomment to enable auth)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if (!www_authorize("$td", "subscriber"))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>www_challenge("$td", "0");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if ($au!=$tU)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>sl_send_reply("403","Forbidden auth ID");</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>} else {</div><div><br></div><div>#!ifdef WITH_IPAUTH</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(allow_source_address())</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span># source IP allowed</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>return;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div>#!endif</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span># authenticate if from local subscriber</div><div>
<span class="Apple-tab-span" style="white-space:pre">                </span>if (from_uri==myself)</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (!proxy_authorize("$fd", "subscriber")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>proxy_challenge("$fd", "0");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (is_method("PUBLISH"))</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($au!=$fU || $au!=$tU) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply("403","Forbidden auth ID");</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div>
<span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($au!=$rU) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply("403","Forbidden R-URI");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($au!=$fU) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply("403","Forbidden auth ID");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>consume_credentials();</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span># caller authenticated</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span># a local destination, otherwise deny, not an open relay here</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (!uri==myself)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>sl_send_reply("403","Not relaying");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># Caller NAT detection route</div><div>route[NATDETECT] {</div><div>#!ifdef WITH_NAT</div><div>
<span class="Apple-tab-span" style="white-space:pre">        </span>force_rport();</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (nat_uac_test("19")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (is_method("REGISTER")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>fix_nated_register();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>fix_nated_contact();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>setflag(FLT_NATS);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># RTPProxy control</div><div>route[NATMANAGE] {</div><div>#!ifdef WITH_NAT</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_request()) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if(has_totag()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if(check_route_param("nat=yes")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>setbflag(FLB_NATB);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>rtpproxy_manage();</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_request()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (!has_totag()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>add_rr_param(";nat=yes");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_reply()) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if(isbflagset(FLB_NATB)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>fix_nated_contact();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># Routing to foreign domains</div>
<div>route[SIPOUT] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!uri==myself)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>append_hf("P-hint: outbound\r\n");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>}</div><div><br></div><div>route[ACKBYE] {</div><div>#!ifdef WITH_PSTN</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("BYE|ACK"))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog("L_ALERT","AB $rm $sht(forw=>$ft) $td");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if(($sht(forw=>$ft))=~"MessageCPIM"){</div><div># Direct messages between clients</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>xlog("L_ALERT","AB $rm CPIM $td");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>return;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(src_ip==$td){</div>
<div>#I have to rewrite du - messages loop in Kamailio</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>xlog("L_ALERT","ACK,Bye Method equalIP");</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$du=$sht(forw=>$ft);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>xlog("L_ALERT","ACK,Bye $ft $du");</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog("L_ALERT","ACK,Bye Not me");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>#!endif</div><div>return;</div><div>}</div><div>route[PSTNINVITE] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(is_method("INVITE")){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if($rb=~"message/CPIM"){</div>
<div># Direct messages between clients</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$sht(forw=>$ft)="MessageCPIM";</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>route(LOCATION);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div>#This way I can select from multiple Asterisk servers. I will t_relay instead of forward, because Asterisk servers are with local IP.</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>ds_select_dst("1","4");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>$sht(forw=>$ft)=$du;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("100","Trying");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit();</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>}</div><div>route[PSTN] {</div><div>#I am using this routine to forward to Asterisks (instead of additional one for balancing)</div><div>#!ifdef WITH_PSTN</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># check if PSTN GW IP is defined</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (strempty($sel(cfg_get.pstn.gw_ip))) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(allow_source_address())</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(from_uri!=myself) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("403", "Not Allowed");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(is_method("MESSAGE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(PSTNINVITE);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(RELAY);</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div><div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div><br></div><div>
# route to voicemail server</div><div>route[TOVOICEMAIL] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># manage outgoing branches</div><div>branch_route[MANAGE_BRANCH] {</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>xdbg("new branch [$T_branch_idx] to $ru\n");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(NATMANAGE);</div><div>}</div>
<div><br></div><div># manage incoming replies</div><div>onreply_route[MANAGE_REPLY] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>xdbg("incoming reply\n");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(status=~"[12][0-9][0-9]")</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>route(NATMANAGE);</div><div>}</div><div><br></div><div># manage failure routing cases</div><div>failure_route[MANAGE_FAILURE] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(NATMANAGE);</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (t_is_canceled()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><br></div><div>#!ifdef WITH_BLOCK3XX</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># block call redirect based on 3xx replies.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (t_check_status("3[0-9][0-9]")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_reply("404","Not found");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_VOICEMAIL</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># serial forking</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - route to voicemail on busy or no answer (timeout)</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (t_check_status("486|408")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>route(TOVOICEMAIL);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>#!endif</div><div>}</div>