Hola, estoy utilizando kamailio 3.2.0 (x86_64/linux) y desde hace unos días estoy intentando comunicar un softphone desde el interior de una red con NAT con el exterior. La configuración es la siguiente:<div><br></div><div>

Softphone (192.168.0.5) &lt;--&gt; Kamailio (192.168.0.3) &lt;--&gt; Router (192.168.0.1) &lt;--&gt; Softphone sobre smartphone</div><div><br></div><div>Todos los puertos del router están redireccionados a 192.168.0.3</div>

<div>Tengo instalado rtpproxy 1.2.1-1 con la siguiente configuración:</div><div><br></div><div>--------------------------/etc/defaults/rtpproxy--------------------------------</div><div><div># The control socket.</div><div>

#CONTROL_SOCK=&quot;unix:/var/run/rtpproxy/rtpproxy.sock&quot;</div><div># To listen on an UDP socket, uncomment this line:</div><div>CONTROL_SOCK=udp:<a href="http://127.0.0.1:22222">127.0.0.1:22222</a></div><div><br></div>

<div># Additional options that are passed to the daemon.</div><div>EXTRA_OPTS=&quot;-l <a href="http://candamil.dyndns.org">candamil.dyndns.org</a>&quot;</div></div><div>----------------------------------------------------------------------------------------</div>

<div><br></div><div>y el funcionamiento es correcto. Este es el mensaje de salida del log de kamailio:</div><div><br></div><div>----------------------------------------------------------------------------------------------</div>

<div>Nov 12 20:09:13 condor kamailio[7001]: INFO: rtpproxy [rtpproxy.c:1415]: rtp proxy &lt;udp:<a href="http://127.0.0.1:22222">127.0.0.1:22222</a>&gt; found, support for it enabled</div><div>-----------------------------------------------------------------------------------------------</div>

<div><br></div><div><br></div><div>Tanto el softphone del interior de la red como el del exterior son linphone. La configuración del del interior de la red es la siguiente:</div><div><br></div><div>SIP identity: <a href="mailto:sip%3A1001@192.168.0.3">sip:1001@192.168.0.3</a></div>

<div>SIP proxy: sip:192.168.0.3</div><div>Indico conexión directa a internet.</div><div><br></div><div>En la del externo especifico como proxy y domain &quot;<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>&quot;, que es la dirección DNS que apunta a la IP de mi router.</div>

<div><br></div><div>En este caso, los síntomas son los siguientes:</div><div>La autentificación de ambos, tanto externo como interno, es correcta.</div><div>Al realizar una llamada en cualquiera de los dos sentidos, el softphone suena y la llamada se contesta y cuelga correctamente, pero no se transmite la señal de voz. En el log figura el siguiente mensaje:</div>

<div><br></div><div>----------------------------------------------------------------------------------------------</div><div>Nov 12 20:23:14 condor kamailio[6991]: ERROR: rtpproxy [rtpproxy.c:2260]: incorrect port 0 in reply from rtp proxy</div>

<div>----------------------------------------------------------------------------------------------</div><div><br></div><div><br></div><div>Ocurre lo mismo si en el interno indico que está tras NAT, con la ip del router, y que está tras NAT con un servidor STUN (<a href="http://stunserver.org">stunserver.org</a>). En los 3 casos, en el softphone externo, figura una llamada de <a href="mailto:1001@192.168.0.3">1001@192.168.0.3</a>, mientras que en el interno, figura una llamada de <a href="mailto:1002@candamil.dyndns.org">1002@candamil.dyndns.org</a>.</div>

<div><br></div><div>Si cambio en el softphone interno el proxy a sip:<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>, todo se vuelve a repetir.</div><div>Si lo que hago es cambiar la SIP identity a <a href="mailto:sip%3A1001@candamil.dyndns.org">sip:1001@candamil.dyndns.org</a>, al realizar una llamada desde interno a externo, el interno no llega a percatarse de que se respondió a la llamada, y aparece el siguiente error en el log:</div>

<div><br></div><div>----------------------------------------------------------------------------------------------------------</div><div><div>Nov 12 20:53:00 condor kamailio[7306]: ERROR: &lt;core&gt; [parser/parse_via.c:2600]: ERROR: parse_via: invalid port number &lt;5060ranch=z9hG4bKc</div>

<div>50f.b4825246.0&gt;</div><div>Nov 12 20:53:00 condor kamailio[7306]: ERROR: &lt;core&gt; [parser/parse_via.c:2629]: ERROR: parse_via on: &lt;SIP/2.0/UDP 192.168.0.3:5060ranch=z</div><div>9hG4bKc50f.b4825246.0;received=87.223.138.84#015#012Via: SIP/2.0/UDP 87.223.138.84:5060;rport=5060;branch=z9hG4bK1021772993#015#012From: </div>

<div>&lt;<a href="mailto:sip%3A1001@candamil.dyndns.org">sip:1001@candamil.dyndns.org</a>&gt;;tag=783852345#015#012To: &lt;<a href="mailto:sip%3A1002@candamil.dyndns.org">sip:1002@candamil.dyndns.org</a>&gt;#015#012Call-ID: 1644787160#015#012CSeq: 21 INVITE#</div>

<div>015#012User-Agent: Linphone/3.4.0 (eXosip2/unknown)#015#012Content-Length: 0#015#012#015#012&gt;</div></div><div>------------------------------------------------------------------------------------------------------------</div>

<div><br></div><div>Por el contrario, haciendo una llamada desde el externo al interno, ocurre lo mismo que antes.</div><div><br></div><div>Por último, esta es la configuración relevante de kamailio:</div><div><br></div>
<div>
-----------------------------------------kamailio.cfg----------------------------------------------------</div><div><div>#!define WITH_MYSQL</div><div>#!define WITH_AUTH</div><div>#!define WITH_NAT</div><div><br></div><div>

####### Defined Values #########</div><div><br></div><div># *** Value defines - IDs used later in config</div><div>#!ifdef WITH_MYSQL</div><div># - database URL - used to connect to database server by modules such</div><div>

#       as: auth_db, acc, usrloc, a.s.o.</div><div>#!define DBURL &quot;mysql://openser:openserrw@localhost/openser&quot;</div><div>#!endif</div><div>#!ifdef WITH_MULTIDOMAIN</div><div># - the value for &#39;use_domain&#39; parameters</div>

<div>#!define MULTIDOMAIN 1</div><div>#!else</div><div>#!define MULTIDOMAIN 0</div><div>#!endif</div><div><br></div><div># - flags</div><div>#   FLT_ - per transaction (message) flags</div><div>#<span class="Apple-tab-span" style="white-space:pre">        </span>FLB_ - per branch flags</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>/* uncomment the next line to disable the auto discovery of local aliases</div><div>   based on reverse DNS on IPs (default on) */</div><div>#auto_aliases=no</div><div><br>

</div><div>/* add local domain aliases */</div><div>alias=&quot;<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>&quot;</div><div><br></div><div>/* port to listen to</div><div> * - can be specified more than once if needed to listen on many ports */</div>

<div>port=5060</div><div><br></div><div>#!ifdef WITH_TLS</div><div>enable_tls=yes</div><div>#!endif</div><div><br></div><div># life time of TCP connection when there is no traffic</div><div># - a bit higher than registration expires to cope with UA behind NAT</div>

<div>tcp_connection_lifetime=3605</div><div><br></div><div>####### Custom Parameters #########</div><div><br></div><div>#!ifdef WITH_PSTN</div><div># PSTN GW Routing</div><div>#</div><div># - pstn.gw_ip: valid IP or hostname as string value, example:</div>

<div># pstn.gw_ip = &quot;10.0.0.101&quot; desc &quot;My PSTN GW Address&quot;</div><div>#</div><div># - by default is empty to avoid misrouting</div><div>pstn.gw_ip = &quot;&quot; desc &quot;PSTN GW Address&quot;</div><div>

#!endif</div><div><br></div><div>####### Modules Section ########</div><div><br></div><div>#!ifdef WITH_MYSQL</div><div>loadmodule &quot;db_mysql.so&quot;</div><div>#!endif</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><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># ----------------- setting module-specific parameters ---------------</div><div><br></div><div># ----- auth_db params -----</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><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:22222">127.0.0.1:22222</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>####### Routing Logic ########</div>

<div><br></div><div><br></div><div># Main SIP request routing logic</div><div># - processing of any incoming SIP request starts with this route</div><div># - note: this is the same as route { ... }</div><div>request_route {</div>

<div><br></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><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><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>### only initial requests (no To tag)</div><div><br>

</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># CANCEL processing</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><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>t_check_trans();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># authentication</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(AUTH);</div><div><br></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><br></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><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># dispatch requests to foreign domains</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(SIPOUT);</div><div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>### requests for my local domains</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># handle presence related requests</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(PRESENCE);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># handle registrations</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(REGISTRAR);</div>

<div><br></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># request with no Username in RURI</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><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># dispatch destinations to PSTN</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(PSTN);</div><div><br></div><div>

<span class="Apple-tab-span" style="white-space:pre">        </span># user location service</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(LOCATION);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(RELAY);</div>

<div>}</div><div><br></div><div><br></div><div>route[RELAY] {</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># enable additional event routes for forwarded requests</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - serial forking, RTP relaying handling, a.s.o.</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><br></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># Per SIP request initial checks</div><div>route[REQINIT] {</div><div>#!ifdef WITH_ANTIFLOOD</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># flood dection from same IP and traffic ban for a while</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span># be sure you exclude checking trusted peers, such as pstn gateways</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - local host excluded (e.g., loop to self)</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>if(src_ip!=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($sht(ipban=&gt;$si)!=$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># ip is already blocked</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>xdbg(&quot;request from blocked IP - $rm from $fu (IP:$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><span class="Apple-tab-span" style="white-space:pre">                </span>if (!pike_check_req())</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;ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n&quot;);</div>

<div><span class="Apple-tab-span" style="white-space:pre">                        </span>$sht(ipban=&gt;$si) = 1;</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>#!endif</div><div><br></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># sequential request withing a dialog should</div>

<div><span class="Apple-tab-span" style="white-space:pre">                </span># take the path determined by record-routing</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># no loose-route, but stateful ACK;</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span># must be an ACK after a 487</div><div>
<span class="Apple-tab-span" style="white-space:pre">                                        </span># or e.g. 404 from upstream server</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><br></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><br></div><div>#!ifdef WITH_SPEEDIAL</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># search for short dialing - 2-digit extension</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>if($rU=~&quot;^[0-9][0-9]$&quot;)</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(sd_lookup(&quot;speed_dial&quot;))</div><div>
<span class="Apple-tab-span" style="white-space:pre">                        </span>route(SIPOUT);</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_ALIASDB</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># search in DB-based aliases</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(alias_db_lookup(&quot;dbaliases&quot;))</div>

<div><span class="Apple-tab-span" style="white-space:pre">                </span>route(SIPOUT);</div><div>#!endif</div><div><br></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><br></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><br></div><div>#!ifdef WITH_PRESENCE</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!t_newtran())</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_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><br></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>handle_publish();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_release();</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( is_method(&quot;SUBSCRIBE&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>handle_subscribe();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_release();</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>#!endif</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>#!ifdef WITH_MULTIDOMAIN</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($fd!=$rd) {</div>

<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply(&quot;403&quot;,&quot;Forbidden R-URI domain&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><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># caller is not local subscriber, then check if it calls</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><br></div><div>

<span class="Apple-tab-span" style="white-space:pre">        </span>rtpproxy_manage();</div><div><br></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># PSTN GW routing</div><div>route[PSTN] {</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><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># route to PSTN dialed numbers starting with &#39;+&#39; or &#39;00&#39;</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>#     (international format)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - update the condition to match your dialing rules for PSTN routing</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!($rU=~&quot;^(\+|00)[1-9][0-9]{3,20}$&quot;))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><br></div><div>

<span class="Apple-tab-span" style="white-space:pre">        </span># only local users allowed to call</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><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$ru = &quot;sip:&quot; + $rU + &quot;@&quot; + $sel(cfg_get.pstn.gw_ip);</div>

<div><br></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><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div>

<div>}</div><div><br></div><div># XMLRPC routing</div><div>#!ifdef WITH_XMLRPC</div><div>route[XMLRPC] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># allow XMLRPC from localhost</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if ((method==&quot;POST&quot; || method==&quot;GET&quot;)</div>

<div><span class="Apple-tab-span" style="white-space:pre">                        </span>&amp;&amp; (src_ip==127.0.0.1)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span># close connection only for xmlrpclib user agents (there is a bug in</div>

<div><span class="Apple-tab-span" style="white-space:pre">                </span># xmlrpclib: it waits for EOF before interpreting the response).</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if ($hdr(User-Agent) =~ &quot;xmlrpclib&quot;)</div>

<div><span class="Apple-tab-span" style="white-space:pre">                        </span>set_reply_close();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>set_reply_no_connect();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>dispatch_rpc();</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>send_reply(&quot;403&quot;, &quot;Forbidden&quot;);</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div><div>}</div><div>#!endif</div><div><br></div><div># route to voicemail server</div><div>route[TOVOICEMAIL] {</div><div>#!ifdef WITH_VOICEMAIL</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>return;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># check if VoiceMail server IP is defined</div>

<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (strempty($sel(cfg_get.voicemail.srv_ip))) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog(&quot;SCRIPT: VoiceMail rotuing enabled but 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($avp(oexten)==$null)</div>

<div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$ru = &quot;sip:&quot; + $avp(oexten) + &quot;@&quot; + $sel(cfg_get.voicemail.srv_ip)</div>

<div><span class="Apple-tab-span" style="white-space:pre">                                </span>+ $sel(cfg_get.voicemail.srv_port);</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><br></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></div><div>--------------------------------------------------------------------------------------------------------------</div>

<div><br></div><div><br></div><div><br></div><div>Espero que alguien pueda echarme una mano. Gracias.</div>