<div>My whole configuration is:</div><div>[Sip clients] &lt; = &gt; Kamailio 3.2 &lt;=&gt; 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 &quot;mysql://<a href="http://user:pass@192.168.2.251/openser">user:pass@192.168.2.251/openser</a>&quot;</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 = &quot;192.168.2.251&quot; desc &quot;PSTN GW Address&quot;</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=&quot;modules_k:modules&quot;</div><div>#!else</div>
<div>mpath=&quot;//lib64/kamailio/modules_k/://lib64/kamailio/modules/&quot;</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_MYSQL</div><div>loadmodule &quot;db_mysql.so&quot;</div><div>#!endif</div><div><br></div>
<div>loadmodule &quot;mi_fifo.so&quot;</div><div>loadmodule &quot;kex.so&quot;</div><div>loadmodule &quot;tm.so&quot;</div><div>loadmodule &quot;tmx.so&quot;</div><div>loadmodule &quot;sl.so&quot;</div><div>loadmodule &quot;rr.so&quot;</div>
<div>loadmodule &quot;pv.so&quot;</div><div>loadmodule &quot;maxfwd.so&quot;</div><div>loadmodule &quot;usrloc.so&quot;</div><div>loadmodule &quot;registrar.so&quot;</div><div>loadmodule &quot;textops.so&quot;</div><div>loadmodule &quot;siputils.so&quot;</div>
<div>loadmodule &quot;xlog.so&quot;</div><div>loadmodule &quot;sanity.so&quot;</div><div>loadmodule &quot;ctl.so&quot;</div><div>loadmodule &quot;cfg_rpc.so&quot;</div><div>loadmodule &quot;mi_rpc.so&quot;</div><div>loadmodule &quot;acc.so&quot;</div>
<div><br></div><div>#!ifdef WITH_AUTH</div><div>loadmodule &quot;auth.so&quot;</div><div>loadmodule &quot;auth_db.so&quot;</div><div>#!ifdef WITH_IPAUTH</div><div>loadmodule &quot;permissions.so&quot;</div><div>#!endif</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_ALIASDB</div><div>loadmodule &quot;alias_db.so&quot;</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_SPEEDDIAL</div><div>loadmodule &quot;speeddial.so&quot;</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_MULTIDOMAIN</div><div>loadmodule &quot;domain.so&quot;</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_PRESENCE</div><div>loadmodule &quot;presence.so&quot;</div>
<div>loadmodule &quot;presence_xml.so&quot;</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_NAT</div><div>loadmodule &quot;nathelper.so&quot;</div><div>loadmodule &quot;rtpproxy.so&quot;</div><div>#!endif</div><div>
<br></div><div>#!ifdef WITH_TLS</div><div>loadmodule &quot;tls.so&quot;</div><div>#!endif</div><div><br></div><div>loadmodule &quot;htable.so&quot;</div><div>#!ifdef WITH_ANTIFLOOD</div><div>loadmodule &quot;pike.so&quot;</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_XMLRPC</div><div>loadmodule &quot;xmlrpc.so&quot;</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_DEBUG</div><div>loadmodule &quot;debugger.so&quot;</div><div>#!endif</div>
<div><br></div><div># ----------------- setting module-specific parameters ---------------</div><div><br></div><div><br></div><div>loadmodule &quot;dispatcher.so&quot;</div><div>modparam(&quot;dispatcher&quot;, &quot;db_url&quot;, DBURL)</div>
<div># ----- mi_fifo params -----</div><div>modparam(&quot;mi_fifo&quot;, &quot;fifo_name&quot;, &quot;/tmp/kamailio_fifo&quot;)</div><div><br></div><div><br></div><div># ----- tm params -----</div><div># auto-discard branches from previous serial forking leg</div>
<div>modparam(&quot;tm&quot;, &quot;failure_reply_mode&quot;, 3)</div><div># default retransmission timeout: 30sec</div><div>modparam(&quot;tm&quot;, &quot;fr_timer&quot;, 30000)</div><div># default invite retransmission timeout after 1xx: 120sec</div>
<div>modparam(&quot;tm&quot;, &quot;fr_inv_timer&quot;, 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(&quot;rr&quot;, &quot;enable_full_lr&quot;, 1)</div>
<div># do not append from tag to the RR (no need for this script)</div><div>modparam(&quot;rr&quot;, &quot;append_fromtag&quot;, 0)</div><div><br></div><div><br></div><div># ----- registrar params -----</div><div>modparam(&quot;registrar&quot;, &quot;method_filtering&quot;, 1)</div>
<div>/* uncomment the next line to disable parallel forking via location */</div><div># modparam(&quot;registrar&quot;, &quot;append_branches&quot;, 0)</div><div>/* uncomment the next line not to allow more than 10 contacts per AOR */</div>
<div>#modparam(&quot;registrar&quot;, &quot;max_contacts&quot;, 10)</div><div># max value for expires of registrations</div><div>modparam(&quot;registrar&quot;, &quot;max_expires&quot;, 3600)</div><div><br></div><div><br>
</div><div># ----- acc params -----</div><div>/* what special events should be accounted ? */</div><div>modparam(&quot;acc&quot;, &quot;early_media&quot;, 0)</div><div>modparam(&quot;acc&quot;, &quot;report_ack&quot;, 0)</div>
<div>modparam(&quot;acc&quot;, &quot;report_cancels&quot;, 0)</div><div>modparam(&quot;acc&quot;, &quot;detect_direction&quot;, 0)</div><div>/* account triggers (flags) */</div><div>modparam(&quot;acc&quot;, &quot;log_flag&quot;, FLT_ACC)</div>
<div>modparam(&quot;acc&quot;, &quot;log_missed_flag&quot;, FLT_ACCMISSED)</div><div>modparam(&quot;acc&quot;, &quot;log_extra&quot;, </div><div><span class="Apple-tab-span" style="white-space:pre">        </span>&quot;src_user=$fU;src_domain=$fd;src_ip=$si;&quot;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>&quot;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&quot;)</div><div>modparam(&quot;acc&quot;, &quot;failed_transaction_flag&quot;, FLT_ACCFAILED)</div><div>/* enhanced DB accounting */</div>
<div>#!ifdef WITH_ACCDB</div><div>modparam(&quot;acc&quot;, &quot;db_flag&quot;, FLT_ACC)</div><div>modparam(&quot;acc&quot;, &quot;db_missed_flag&quot;, FLT_ACCMISSED)</div><div>modparam(&quot;acc&quot;, &quot;db_url&quot;, DBURL)</div>
<div>modparam(&quot;acc&quot;, &quot;db_extra&quot;,</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>&quot;src_user=$fU;src_domain=$fd;src_ip=$si;&quot;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>&quot;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&quot;)</div>
<div>#!endif</div><div>#!ifdef WITH_USRLOCDB</div><div>modparam(&quot;usrloc&quot;, &quot;db_url&quot;, DBURL)</div><div>modparam(&quot;usrloc&quot;, &quot;db_mode&quot;, 2)</div><div>modparam(&quot;usrloc&quot;, &quot;use_domain&quot;, MULTIDOMAIN)</div>
<div>#!endif</div><div>#!ifdef WITH_AUTH</div><div>modparam(&quot;auth_db&quot;, &quot;db_url&quot;, DBURL)</div><div>modparam(&quot;auth_db&quot;, &quot;calculate_ha1&quot;, yes)</div><div>modparam(&quot;auth_db&quot;, &quot;password_column&quot;, &quot;password&quot;)</div>
<div>modparam(&quot;auth_db&quot;, &quot;load_credentials&quot;, &quot;&quot;)</div><div>modparam(&quot;auth_db&quot;, &quot;use_domain&quot;, MULTIDOMAIN)</div><div>#!ifdef WITH_IPAUTH</div><div>modparam(&quot;permissions&quot;, &quot;db_url&quot;, DBURL)</div>
<div>modparam(&quot;permissions&quot;, &quot;db_mode&quot;, 1)</div><div>#!endif</div><div>#!endif</div><div>#!ifdef WITH_ALIASDB</div><div>modparam(&quot;alias_db&quot;, &quot;db_url&quot;, DBURL)</div><div>modparam(&quot;alias_db&quot;, &quot;use_domain&quot;, MULTIDOMAIN)</div>
<div>#!endif</div><div><br></div><div># ----- speedial params -----</div><div>#!ifdef WITH_SPEEDDIAL</div><div>modparam(&quot;speeddial&quot;, &quot;db_url&quot;, DBURL)</div><div>modparam(&quot;speeddial&quot;, &quot;use_domain&quot;, MULTIDOMAIN)</div>
<div>#!endif</div><div><br></div><div><br></div><div>#!ifdef WITH_NAT</div><div># ----- rtpproxy params -----</div><div>modparam(&quot;rtpproxy&quot;, &quot;rtpproxy_sock&quot;, &quot;udp:<a href="http://127.0.0.1:7722">127.0.0.1:7722</a>&quot;)</div>
<div><br></div><div># ----- nathelper params -----</div><div>modparam(&quot;nathelper&quot;, &quot;natping_interval&quot;, 30)</div><div>modparam(&quot;nathelper&quot;, &quot;ping_nated_only&quot;, 1)</div><div>modparam(&quot;nathelper&quot;, &quot;sipping_bflag&quot;, FLB_NATSIPPING)</div>
<div>modparam(&quot;nathelper&quot;, &quot;sipping_from&quot;, &quot;<a href="mailto:sip%3Apinger@kamailio.org">sip:pinger@kamailio.org</a>&quot;)</div><div><br></div><div># params needed for NAT traversal in other modules</div>
<div>modparam(&quot;nathelper|registrar&quot;, &quot;received_avp&quot;, &quot;$avp(RECEIVED)&quot;)</div><div>modparam(&quot;usrloc&quot;, &quot;nat_bflag&quot;, FLB_NATB)</div><div>#!endif</div><div><br></div><div><br></div>
<div>#!ifdef WITH_TLS</div><div># ----- tls params -----</div><div>modparam(&quot;tls&quot;, &quot;config&quot;, &quot;//etc/kamailio/tls.cfg&quot;)</div><div>#!endif</div><div><br></div><div>modparam(&quot;htable&quot;, &quot;htable&quot;, &quot;forw=&gt;size=8;autoexpire=7200;&quot;)</div>
<div><br></div><div><br></div><div>#!ifdef WITH_DEBUG</div><div># ----- debugger params -----</div><div>modparam(&quot;debugger&quot;, &quot;cfgtrace&quot;, 1)</div><div>#!endif</div><div><br></div><div>request_route {</div>
<div>xlog(&quot;L_ALERT&quot;,&quot;Pakage $rm from $fu (IP:$si:$sp)\n&quot;);</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(&quot;CANCEL&quot;))</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(&quot;Route&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method(&quot;INVITE|SUBSCRIBE&quot;))</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(&quot;INVITE&quot;))</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(&quot;484&quot;,&quot;Address Incomplete&quot;);</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(&quot;INVITE|SUBSCRIBE&quot;)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_branch(&quot;MANAGE_BRANCH&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_reply(&quot;MANAGE_REPLY&quot;);</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(&quot;INVITE&quot;)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_failure(&quot;MANAGE_FAILURE&quot;);</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(&quot;10&quot;)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply(&quot;483&quot;,&quot;Too Many Hops&quot;);</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(&quot;1511&quot;, &quot;7&quot;))</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(&quot;Malformed SIP message from $si:$sp\n&quot;);</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(&quot;BYE&quot;)) {</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(&quot;ACK&quot;) ) {</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(&quot;SUBSCRIBE&quot;) &amp;&amp; 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(&quot;ACK&quot;) ) {</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(&quot;404&quot;,&quot;Not here&quot;);</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(&quot;REGISTER&quot;))</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(&quot;location&quot;))</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(&quot;location&quot;)) {</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(&quot;404&quot;, &quot;Not Found&quot;);</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(&quot;405&quot;, &quot;Method Not Allowed&quot;);</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(&quot;INVITE&quot;))</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(&quot;PUBLISH|SUBSCRIBE&quot;))</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(&quot;PUBLISH&quot;) || $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(&quot;404&quot;, &quot;Not here&quot;);</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(&quot;REGISTER&quot;))</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(&quot;$td&quot;, &quot;subscriber&quot;))</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(&quot;$td&quot;, &quot;0&quot;);</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(&quot;403&quot;,&quot;Forbidden auth ID&quot;);</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(&quot;$fd&quot;, &quot;subscriber&quot;)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>proxy_challenge(&quot;$fd&quot;, &quot;0&quot;);</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(&quot;PUBLISH&quot;))</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(&quot;403&quot;,&quot;Forbidden auth ID&quot;);</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(&quot;403&quot;,&quot;Forbidden R-URI&quot;);</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(&quot;403&quot;,&quot;Forbidden auth ID&quot;);</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(&quot;403&quot;,&quot;Not relaying&quot;);</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(&quot;19&quot;)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (is_method(&quot;REGISTER&quot;)) {</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(&quot;nat=yes&quot;)) {</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(&quot;;nat=yes&quot;);</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(&quot;P-hint: outbound\r\n&quot;);</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(&quot;BYE|ACK&quot;))</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(&quot;L_ALERT&quot;,&quot;AB $rm $sht(forw=&gt;$ft) $td&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if(($sht(forw=&gt;$ft))=~&quot;MessageCPIM&quot;){</div><div># Direct messages between clients</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>xlog(&quot;L_ALERT&quot;,&quot;AB $rm CPIM $td&quot;);</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(&quot;L_ALERT&quot;,&quot;ACK,Bye Method equalIP&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$du=$sht(forw=&gt;$ft);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>xlog(&quot;L_ALERT&quot;,&quot;ACK,Bye $ft $du&quot;);</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(&quot;L_ALERT&quot;,&quot;ACK,Bye Not me&quot;);</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(&quot;INVITE&quot;)){</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if($rb=~&quot;message/CPIM&quot;){</div>
<div># Direct messages between clients</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>$sht(forw=&gt;$ft)=&quot;MessageCPIM&quot;;</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(&quot;1&quot;,&quot;4&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>$sht(forw=&gt;$ft)=$du;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply(&quot;100&quot;,&quot;Trying&quot;);</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(&quot;SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n&quot;);</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(&quot;403&quot;, &quot;Not Allowed&quot;);</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(&quot;MESSAGE&quot;))</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(&quot;new branch [$T_branch_idx] to $ru\n&quot;);</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(&quot;incoming reply\n&quot;);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(status=~&quot;[12][0-9][0-9]&quot;)</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(&quot;3[0-9][0-9]&quot;)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_reply(&quot;404&quot;,&quot;Not found&quot;);</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(&quot;486|408&quot;)) {</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>