<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi, <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>from your topology description I'm not sure why you are trying to use RTPproxy when all your equipments are on private segments. RTPproxy should have an public IP address<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>palo<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=SK style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span lang=SK style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> sr-users-bounces@lists.sip-router.org [mailto:sr-users-bounces@lists.sip-router.org] <b>On Behalf Of </b>David Candamil Santos<br><b>Sent:</b> Monday, November 14, 2011 6:50 PM<br><b>To:</b> sr-users@lists.sip-router.org<br><b>Subject:</b> [SR-Users] Problem with NAT and RTPProxy<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p>&nbsp;</o:p></p><div><p class=MsoNormal>Hi, I am using Kamailio&nbsp;3.2.0 (x86_64/linux) and since some days ago I am trying to call from a network with NAT to outside. This is the configuration:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Softphone (192.168.0.5) &lt;--&gt; Kamailio (192.168.0.3) &lt;--&gt; Router&nbsp;(192.168.0.1) &lt;--&gt; Softphone over smartphone<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>All the router ports are opened and redirected to 192.168.0.3. I have installed rtpproxy 1.2.1-1 with the following configuration:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>--------------------------/etc/defaults/rtpproxy--------------------------------<o:p></o:p></p></div><div><p class=MsoNormal># The control socket.<o:p></o:p></p></div><div><p class=MsoNormal>#CONTROL_SOCK=&quot;unix:/var/run/rtpproxy/rtpproxy.sock&quot;<o:p></o:p></p></div><div><p class=MsoNormal># To listen on an UDP socket, uncomment this line:<o:p></o:p></p></div><div><p class=MsoNormal>CONTROL_SOCK=udp:<a href="http://127.0.0.1:22222" target="_blank">127.0.0.1:22222</a><o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Additional options that are passed to the daemon.<o:p></o:p></p></div><div><p class=MsoNormal>EXTRA_OPTS=&quot;-l <a href="http://candamil.dyndns.org" target="_blank">candamil.dyndns.org</a>&quot;<o:p></o:p></p></div><div><p class=MsoNormal>----------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>and works properly. This is the log message:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>----------------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal>Nov 12 20:09:13 condor kamailio[7001]: INFO: rtpproxy [rtpproxy.c:1415]:<o:p></o:p></p></div><div><p class=MsoNormal>rtp proxy &lt;udp:<a href="http://127.0.0.1:22222" target="_blank">127.0.0.1:22222</a>&gt; found, support for it enabled<o:p></o:p></p></div><div><p class=MsoNormal>-----------------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>Both softphones are &quot;linphone&quot;. The configuration of the network softphone is the following:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>SIP identity: <a href="mailto:sip%3A1001@192.168.0.3" target="_blank">sip:1001@192.168.0.3</a><o:p></o:p></p></div><div><p class=MsoNormal>SIP proxy: sip:192.168.0.3<o:p></o:p></p></div><div><p class=MsoNormal>Direct connection to the Internet.<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>In the softphone of the smartphone I set as proxy and domain &quot;<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>&quot;, the DNS address of my router IP.<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>In this case, these are the symptoms:<o:p></o:p></p></div><div><p class=MsoNormal>Both softphones can autentify correctly. When calling, both softphones ring, but when I answer, the voice signal is not received. This is the log error:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>----------------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal>Nov 12 20:23:14 condor kamailio[6991]: ERROR: rtpproxy [rtpproxy.c:2260]:<o:p></o:p></p></div><div><p class=MsoNormal>incorrect port 0 in reply from rtp proxy<o:p></o:p></p></div><div><p class=MsoNormal>----------------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>The same happens if I set in the network softphone that it's behind NAT, and I set the router IP.<o:p></o:p></p></div><div><p class=MsoNormal>The same happens if I set in the network softphone that it's behind NAT and with a STUN server (<a href="http://stunserver.org">stunserver.org</a>). In the three cases, in the softphone over smartphone, the caller is <a href="mailto:1001@192.168.0.3">1001@192.168.0.3</a>, and in the network softphone, the caller is <a href="mailto:1002@candamil.dyndns.org">1002@candamil.dyndns.org</a>.<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>If I set in the network softphone the proxy as&nbsp;sip:<a href="http://candamil.dyndns.org/" target="_blank">candamil.dyndns.org</a>, the same happens.<o:p></o:p></p></div><div><p class=MsoNormal>If what I do is setting the SIP identity as&nbsp;&nbsp;<a href="mailto:sip%3A1001@candamil.dyndns.org" target="_blank">sip:1001@candamil.dyndns.org</a>, when calling form inside to ouside the network, the softphone doesn't know that the call was answered, and there is the following error in the log:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>----------------------------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal>Nov 12 20:53:00 condor kamailio[7306]: ERROR: &lt;core&gt;<o:p></o:p></p></div><div><p class=MsoNormal>[parser/parse_via.c:2600]: ERROR: parse_via: invalid port number<o:p></o:p></p></div><div><p class=MsoNormal>&lt;5060ranch=z9hG4bKc<o:p></o:p></p></div><div><p class=MsoNormal>50f.b4825246.0&gt;<o:p></o:p></p></div><div><p class=MsoNormal>Nov 12 20:53:00 condor kamailio[7306]: ERROR: &lt;core&gt;<o:p></o:p></p></div><div><p class=MsoNormal>[parser/parse_via.c:2629]: ERROR: parse_via on: &lt;SIP/2.0/UDP<o:p></o:p></p></div><div><p class=MsoNormal>192.168.0.3:5060ranch=z<o:p></o:p></p></div><div><p class=MsoNormal>9hG4bKc50f.b4825246.0;received=<a href="tel:87.223.138.84%23015%23" target="_blank">87.223.138.84#015#</a>012Via: SIP/2.0/UDP<o:p></o:p></p></div><div><p class=MsoNormal><a href="tel:87.223.138.84" target="_blank">87.223.138.84</a>:5060;rport=5060;branch=z9hG4bK1021772993#015#012From:<o:p></o:p></p></div><div><p class=MsoNormal>&lt;<a href="mailto:sip%3A1001@candamil.dyndns.org" target="_blank">sip:1001@candamil.dyndns.org</a>&gt;;tag=783852345#015#012To: &lt;<o:p></o:p></p></div><div><p class=MsoNormal><a href="mailto:sip%3A1002@candamil.dyndns.org" target="_blank">sip:1002@candamil.dyndns.org</a>&gt;#015#012Call-ID: 1644787160#015#012CSeq: 21<o:p></o:p></p></div><div><p class=MsoNormal>INVITE#<o:p></o:p></p></div><div><p class=MsoNormal>015#012User-Agent: Linphone/3.4.0 (eXosip2/unknown)#015#012Content-Length:<o:p></o:p></p></div><div><p class=MsoNormal>0#015#012#015#012&gt;<o:p></o:p></p></div><div><p class=MsoNormal>------------------------------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>If the call is from outside to inside the network, it happens the same than in the previous cases.<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>This is the relevant kamailio configuration:<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>-----------------------------------------kamailio.cfg----------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal>#!define WITH_MYSQL<o:p></o:p></p></div><div><p class=MsoNormal>#!define WITH_AUTH<o:p></o:p></p></div><div><p class=MsoNormal>#!define WITH_NAT<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>####### Defined Values #########<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># *** Value defines - IDs used later in config<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_MYSQL<o:p></o:p></p></div><div><p class=MsoNormal># - database URL - used to connect to database server by modules such<o:p></o:p></p></div><div><p class=MsoNormal># &nbsp; &nbsp; &nbsp; as: auth_db, acc, usrloc, a.s.o.<o:p></o:p></p></div><div><p class=MsoNormal>#!define DBURL &quot;mysql://openser:openserrw@localhost/openser&quot;<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_MULTIDOMAIN<o:p></o:p></p></div><div><p class=MsoNormal># - the value for 'use_domain' parameters<o:p></o:p></p></div><div><p class=MsoNormal>#!define MULTIDOMAIN 1<o:p></o:p></p></div><div><p class=MsoNormal>#!else<o:p></o:p></p></div><div><p class=MsoNormal>#!define MULTIDOMAIN 0<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># - flags<o:p></o:p></p></div><div><p class=MsoNormal># &nbsp; FLT_ - per transaction (message) flags<o:p></o:p></p></div><div><p class=MsoNormal># FLB_ - per branch flags<o:p></o:p></p></div><div><p class=MsoNormal>#!define FLT_ACC 1<o:p></o:p></p></div><div><p class=MsoNormal>#!define FLT_ACCMISSED 2<o:p></o:p></p></div><div><p class=MsoNormal>#!define FLT_ACCFAILED 3<o:p></o:p></p></div><div><p class=MsoNormal>#!define FLT_NATS 5<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!define FLB_NATB 6<o:p></o:p></p></div><div><p class=MsoNormal>#!define FLB_NATSIPPING 7<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>####### Global Parameters #########<o:p></o:p></p></div><div><p class=MsoNormal>/* uncomment the next line to disable the auto discovery of local aliases<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp; based on reverse DNS on IPs (default on) */<o:p></o:p></p></div><div><p class=MsoNormal>#auto_aliases=no<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>/* add local domain aliases */<o:p></o:p></p></div><div><p class=MsoNormal>alias=&quot;<a href="http://candamil.dyndns.org" target="_blank">candamil.dyndns.org</a>&quot;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>/* port to listen to<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;* - can be specified more than once if needed to listen on many ports */<o:p></o:p></p></div><div><p class=MsoNormal>port=5060<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_TLS<o:p></o:p></p></div><div><p class=MsoNormal>enable_tls=yes<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># life time of TCP connection when there is no traffic<o:p></o:p></p></div><div><p class=MsoNormal># - a bit higher than registration expires to cope with UA behind NAT<o:p></o:p></p></div><div><p class=MsoNormal>tcp_connection_lifetime=3605<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>####### Custom Parameters #########<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_PSTN<o:p></o:p></p></div><div><p class=MsoNormal># PSTN GW Routing<o:p></o:p></p></div><div><p class=MsoNormal>#<o:p></o:p></p></div><div><p class=MsoNormal># - pstn.gw_ip: valid IP or hostname as string value, example:<o:p></o:p></p></div><div><p class=MsoNormal># pstn.gw_ip = &quot;10.0.0.101&quot; desc &quot;My PSTN GW Address&quot;<o:p></o:p></p></div><div><p class=MsoNormal>#<o:p></o:p></p></div><div><p class=MsoNormal># - by default is empty to avoid misrouting<o:p></o:p></p></div><div><p class=MsoNormal>pstn.gw_ip = &quot;&quot; desc &quot;PSTN GW Address&quot;<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>####### Modules Section ########<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_MYSQL<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule &quot;db_mysql.so&quot;<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_AUTH<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule &quot;auth.so&quot;<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule &quot;auth_db.so&quot;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_NAT<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule &quot;nathelper.so&quot;<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule &quot;rtpproxy.so&quot;<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># ----------------- setting module-specific parameters ---------------<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># ----- auth_db params -----<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_AUTH<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;auth_db&quot;, &quot;db_url&quot;, DBURL)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;auth_db&quot;, &quot;calculate_ha1&quot;, yes)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;auth_db&quot;, &quot;password_column&quot;, &quot;password&quot;)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;auth_db&quot;, &quot;load_credentials&quot;, &quot;&quot;)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;auth_db&quot;, &quot;use_domain&quot;, MULTIDOMAIN)<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_NAT<o:p></o:p></p></div><div><p class=MsoNormal># ----- rtpproxy params -----<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;rtpproxy&quot;, &quot;rtpproxy_sock&quot;, &quot;udp:<a href="http://127.0.0.1:22222" target="_blank">127.0.0.1:22222</a>&quot;)<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># ----- nathelper params -----<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;nathelper&quot;, &quot;natping_interval&quot;, 30)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;nathelper&quot;, &quot;ping_nated_only&quot;, 1)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;nathelper&quot;, &quot;sipping_bflag&quot;, FLB_NATSIPPING)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;nathelper&quot;, &quot;sipping_from&quot;, &quot;<a href="mailto:sip%3Apinger@kamailio.org" target="_blank">sip:pinger@kamailio.org</a>&quot;)<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># params needed for NAT traversal in other modules<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;nathelper|registrar&quot;, &quot;received_avp&quot;, &quot;$avp(RECEIVED)&quot;)<o:p></o:p></p></div><div><p class=MsoNormal>modparam(&quot;usrloc&quot;, &quot;nat_bflag&quot;, FLB_NATB)<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>####### Routing Logic ########<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Main SIP request routing logic<o:p></o:p></p></div><div><p class=MsoNormal># - processing of any incoming SIP request starts with this route<o:p></o:p></p></div><div><p class=MsoNormal># - note: this is the same as route { ... }<o:p></o:p></p></div><div><p class=MsoNormal>request_route {<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># per request initial checks<o:p></o:p></p></div><div><p class=MsoNormal>route(REQINIT);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&nbsp;# NAT detection<o:p></o:p></p></div><div><p class=MsoNormal>route(NATDETECT);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># handle requests within SIP dialogs<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;route(WITHINDLG);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>### only initial requests (no To tag)<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&nbsp;# CANCEL processing<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;CANCEL&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (t_check_trans())<o:p></o:p></p></div><div><p class=MsoNormal>t_relay();<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>t_check_trans();<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># authentication<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;route(AUTH);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># record routing for dialog forming requests (in case they are routed)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# - remove preloaded route headers<o:p></o:p></p></div><div><p class=MsoNormal>remove_hf(&quot;Route&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;INVITE|SUBSCRIBE&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;record_route();<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># account only INVITEs<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;INVITE&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>setflag(FLT_ACC); # do accounting<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># dispatch requests to foreign domains<o:p></o:p></p></div><div><p class=MsoNormal>route(SIPOUT);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&nbsp;### requests for my local domains<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># handle presence related requests<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;route(PRESENCE);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># handle registrations<o:p></o:p></p></div><div><p class=MsoNormal>route(REGISTRAR);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if ($rU==$null)<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal># request with no Username in RURI<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;sl_send_reply(&quot;484&quot;,&quot;Address Incomplete&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># dispatch destinations to PSTN<o:p></o:p></p></div><div><p class=MsoNormal>route(PSTN);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&nbsp;# user location service<o:p></o:p></p></div><div><p class=MsoNormal>route(LOCATION);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>route(RELAY);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>route[RELAY] {<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># enable additional event routes for forwarded requests<o:p></o:p></p></div><div><p class=MsoNormal># - serial forking, RTP relaying handling, a.s.o.<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (is_method(&quot;INVITE|SUBSCRIBE&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>t_on_branch(&quot;MANAGE_BRANCH&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;t_on_reply(&quot;MANAGE_REPLY&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;INVITE&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;t_on_failure(&quot;MANAGE_FAILURE&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if (!t_relay()) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;sl_reply_error();<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Per SIP request initial checks<o:p></o:p></p></div><div><p class=MsoNormal>route[REQINIT] {<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_ANTIFLOOD<o:p></o:p></p></div><div><p class=MsoNormal># flood dection from same IP and traffic ban for a while<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# be sure you exclude checking trusted peers, such as pstn gateways<o:p></o:p></p></div><div><p class=MsoNormal># - local host excluded (e.g., loop to self)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if(src_ip!=myself)<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>if($sht(ipban=&gt;$si)!=$null)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal># ip is already blocked<o:p></o:p></p></div><div><p class=MsoNormal>xdbg(&quot;request from blocked IP - $rm from $fu (IP:$si:$sp)\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>if (!pike_check_req())<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>xlog(&quot;L_ALERT&quot;,&quot;ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;$sht(ipban=&gt;$si) = 1;<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if (!mf_process_maxfwd_header(&quot;10&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;sl_send_reply(&quot;483&quot;,&quot;Too Many Hops&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if(!sanity_check(&quot;1511&quot;, &quot;7&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>xlog(&quot;Malformed SIP message from $si:$sp\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Handle requests within SIP dialogs<o:p></o:p></p></div><div><p class=MsoNormal>route[WITHINDLG] {<o:p></o:p></p></div><div><p class=MsoNormal>if (has_totag()) {<o:p></o:p></p></div><div><p class=MsoNormal># sequential request withing a dialog should<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# take the path determined by record-routing<o:p></o:p></p></div><div><p class=MsoNormal>if (loose_route()) {<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;BYE&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;setflag(FLT_ACC); # do accounting ...<o:p></o:p></p></div><div><p class=MsoNormal>setflag(FLT_ACCFAILED); # ... even if the transaction fails<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>if ( is_method(&quot;ACK&quot;) ) {<o:p></o:p></p></div><div><p class=MsoNormal># ACK is forwarded statelessy<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;route(NATMANAGE);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>route(RELAY);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;} else {<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;SUBSCRIBE&quot;) &amp;&amp; uri == myself) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# in-dialog subscribe requests<o:p></o:p></p></div><div><p class=MsoNormal>route(PRESENCE);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>if ( is_method(&quot;ACK&quot;) ) {<o:p></o:p></p></div><div><p class=MsoNormal>if ( t_check_trans() ) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# no loose-route, but stateful ACK;<o:p></o:p></p></div><div><p class=MsoNormal># must be an ACK after a 487<o:p></o:p></p></div><div><p class=MsoNormal># or e.g. 404 from upstream server<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;t_relay();<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>} else {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# ACK without matching transaction ... ignore and discard<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply(&quot;404&quot;,&quot;Not here&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Handle SIP registrations<o:p></o:p></p></div><div><p class=MsoNormal>route[REGISTRAR] {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (is_method(&quot;REGISTER&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>if(isflagset(FLT_NATS))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>setbflag(FLB_NATB);<o:p></o:p></p></div><div><p class=MsoNormal># uncomment next line to do SIP NAT pinging<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;setbflag(FLB_NATSIPPING);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>if (!save(&quot;location&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;sl_reply_error();<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># USER location service<o:p></o:p></p></div><div><p class=MsoNormal>route[LOCATION] {<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_SPEEDIAL<o:p></o:p></p></div><div><p class=MsoNormal># search for short dialing - 2-digit extension<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if($rU=~&quot;^[0-9][0-9]$&quot;)<o:p></o:p></p></div><div><p class=MsoNormal>if(sd_lookup(&quot;speed_dial&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>route(SIPOUT);<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_ALIASDB<o:p></o:p></p></div><div><p class=MsoNormal># search in DB-based aliases<o:p></o:p></p></div><div><p class=MsoNormal>if(alias_db_lookup(&quot;dbaliases&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;route(SIPOUT);<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>$avp(oexten) = $rU;<o:p></o:p></p></div><div><p class=MsoNormal>if (!lookup(&quot;location&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;$var(rc) = $rc;<o:p></o:p></p></div><div><p class=MsoNormal>route(TOVOICEMAIL);<o:p></o:p></p></div><div><p class=MsoNormal>t_newtran();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;switch ($var(rc)) {<o:p></o:p></p></div><div><p class=MsoNormal>case -1:<o:p></o:p></p></div><div><p class=MsoNormal>case -3:<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;send_reply(&quot;404&quot;, &quot;Not Found&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>case -2:<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;send_reply(&quot;405&quot;, &quot;Method Not Allowed&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># when routing via usrloc, log the missed calls also<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;INVITE&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>setflag(FLT_ACCMISSED);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Presence server route<o:p></o:p></p></div><div><p class=MsoNormal>route[PRESENCE] {<o:p></o:p></p></div><div><p class=MsoNormal>if(!is_method(&quot;PUBLISH|SUBSCRIBE&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_PRESENCE<o:p></o:p></p></div><div><p class=MsoNormal>if (!t_newtran())<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>sl_reply_error();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>};<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if(is_method(&quot;PUBLISH&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>handle_publish();<o:p></o:p></p></div><div><p class=MsoNormal>t_release();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>else<o:p></o:p></p></div><div><p class=MsoNormal>if( is_method(&quot;SUBSCRIBE&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>handle_subscribe();<o:p></o:p></p></div><div><p class=MsoNormal>t_release();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# if presence enabled, this part will not be executed<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;PUBLISH&quot;) || $rU==$null)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply(&quot;404&quot;, &quot;Not here&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Authentication route<o:p></o:p></p></div><div><p class=MsoNormal>route[AUTH] {<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_AUTH<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;REGISTER&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal># authenticate the REGISTER requests (uncomment to enable auth)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (!www_authorize(&quot;$td&quot;, &quot;subscriber&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>www_challenge(&quot;$td&quot;, &quot;0&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if ($au!=$tU)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply(&quot;403&quot;,&quot;Forbidden auth ID&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>} else {<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_IPAUTH<o:p></o:p></p></div><div><p class=MsoNormal>if(allow_source_address())<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal># source IP allowed<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># authenticate if from local subscriber<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (from_uri==myself)<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>if (!proxy_authorize(&quot;$fd&quot;, &quot;subscriber&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;proxy_challenge(&quot;$fd&quot;, &quot;0&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (is_method(&quot;PUBLISH&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>if ($au!=$fU || $au!=$tU) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;sl_send_reply(&quot;403&quot;,&quot;Forbidden auth ID&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>if ($au!=$rU) {<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply(&quot;403&quot;,&quot;Forbidden R-URI&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_MULTIDOMAIN<o:p></o:p></p></div><div><p class=MsoNormal>if ($fd!=$rd) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;sl_send_reply(&quot;403&quot;,&quot;Forbidden R-URI domain&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal>} else {<o:p></o:p></p></div><div><p class=MsoNormal>if ($au!=$fU) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;sl_send_reply(&quot;403&quot;,&quot;Forbidden auth ID&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>consume_credentials();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# caller authenticated<o:p></o:p></p></div><div><p class=MsoNormal>} else {<o:p></o:p></p></div><div><p class=MsoNormal># caller is not local subscriber, then check if it calls<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# a local destination, otherwise deny, not an open relay here<o:p></o:p></p></div><div><p class=MsoNormal>if (!uri==myself)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;{<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply(&quot;403&quot;,&quot;Not relaying&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Caller NAT detection route<o:p></o:p></p></div><div><p class=MsoNormal>route[NATDETECT] {<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_NAT<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;force_rport();<o:p></o:p></p></div><div><p class=MsoNormal>if (nat_uac_test(&quot;19&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method(&quot;REGISTER&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;fix_nated_register();<o:p></o:p></p></div><div><p class=MsoNormal>} else {<o:p></o:p></p></div><div><p class=MsoNormal>fix_nated_contact();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>setflag(FLT_NATS);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># RTPProxy control<o:p></o:p></p></div><div><p class=MsoNormal>route[NATMANAGE] {<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_NAT<o:p></o:p></p></div><div><p class=MsoNormal>if (is_request()) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if(has_totag()) {<o:p></o:p></p></div><div><p class=MsoNormal>if(check_route_param(&quot;nat=yes&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>setbflag(FLB_NATB);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&nbsp;rtpproxy_manage();<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if (is_request()) {<o:p></o:p></p></div><div><p class=MsoNormal>if (!has_totag()) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;add_rr_param(&quot;;nat=yes&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (is_reply()) {<o:p></o:p></p></div><div><p class=MsoNormal>if(isbflagset(FLB_NATB)) {<o:p></o:p></p></div><div><p class=MsoNormal>fix_nated_contact();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># Routing to foreign domains<o:p></o:p></p></div><div><p class=MsoNormal>route[SIPOUT] {<o:p></o:p></p></div><div><p class=MsoNormal>if (!uri==myself)<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;append_hf(&quot;P-hint: outbound\r\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>route(RELAY);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># PSTN GW routing<o:p></o:p></p></div><div><p class=MsoNormal>route[PSTN] {<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_PSTN<o:p></o:p></p></div><div><p class=MsoNormal># check if PSTN GW IP is defined<o:p></o:p></p></div><div><p class=MsoNormal>if (strempty($sel(cfg_get.pstn.gw_ip))) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;xlog(&quot;SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># route to PSTN dialed numbers starting with '+' or '00'<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# &nbsp; &nbsp; (international format)<o:p></o:p></p></div><div><p class=MsoNormal># - update the condition to match your dialing rules for PSTN routing<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if(!($rU=~&quot;^(\+|00)[1-9][0-9]{3,20}$&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>&nbsp;# only local users allowed to call<o:p></o:p></p></div><div><p class=MsoNormal>if(from_uri!=myself) {<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply(&quot;403&quot;, &quot;Not Allowed&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>$ru = &quot;sip:&quot; + $rU + &quot;@&quot; + $sel(cfg_get.pstn.gw_ip);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>route(RELAY);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># XMLRPC routing<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_XMLRPC<o:p></o:p></p></div><div><p class=MsoNormal>route[XMLRPC] {<o:p></o:p></p></div><div><p class=MsoNormal># allow XMLRPC from localhost<o:p></o:p></p></div><div><p class=MsoNormal>if ((method==&quot;POST&quot; || method==&quot;GET&quot;)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;&amp;&amp; (src_ip==127.0.0.1)) {<o:p></o:p></p></div><div><p class=MsoNormal># close connection only for xmlrpclib user agents (there is a bug in<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;# xmlrpclib: it waits for EOF before interpreting the response).<o:p></o:p></p></div><div><p class=MsoNormal>if ($hdr(User-Agent) =~ &quot;xmlrpclib&quot;)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;set_reply_close();<o:p></o:p></p></div><div><p class=MsoNormal>set_reply_no_connect();<o:p></o:p></p></div><div><p class=MsoNormal>dispatch_rpc();<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>send_reply(&quot;403&quot;, &quot;Forbidden&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># route to voicemail server<o:p></o:p></p></div><div><p class=MsoNormal>route[TOVOICEMAIL] {<o:p></o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_VOICEMAIL<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if(!is_method(&quot;INVITE&quot;))<o:p></o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># check if VoiceMail server IP is defined<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (strempty($sel(cfg_get.voicemail.srv_ip))) {<o:p></o:p></p></div><div><p class=MsoNormal>xlog(&quot;SCRIPT: VoiceMail rotuing enabled but IP not defined\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;return;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>if($avp(oexten)==$null)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;return;<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>$ru = &quot;sip:&quot; + $avp(oexten) + &quot;@&quot; + $sel(cfg_get.voicemail.srv_ip)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;+ $sel(cfg_get.voicemail.srv_port);<o:p></o:p></p></div><div><p class=MsoNormal>route(RELAY);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>return;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># manage outgoing branches<o:p></o:p></p></div><div><p class=MsoNormal>branch_route[MANAGE_BRANCH] {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;xdbg(&quot;new branch [$T_branch_idx] to $ru\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>route(NATMANAGE);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># manage incoming replies<o:p></o:p></p></div><div><p class=MsoNormal>onreply_route[MANAGE_REPLY] {<o:p></o:p></p></div><div><p class=MsoNormal>xdbg(&quot;incoming reply\n&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>if(status=~&quot;[12][0-9][0-9]&quot;)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;route(NATMANAGE);<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal># manage failure routing cases<o:p></o:p></p></div><div><p class=MsoNormal>failure_route[MANAGE_FAILURE] {<o:p></o:p></p></div><div><p class=MsoNormal>route(NATMANAGE);<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>if (t_is_canceled()) {<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_BLOCK3XX<o:p></o:p></p></div><div><p class=MsoNormal># block call redirect based on 3xx replies.<o:p></o:p></p></div><div><p class=MsoNormal>if (t_check_status(&quot;3[0-9][0-9]&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;t_reply(&quot;404&quot;,&quot;Not found&quot;);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_VOICEMAIL<o:p></o:p></p></div><div><p class=MsoNormal># serial forking<o:p></o:p></p></div><div><p class=MsoNormal># - route to voicemail on busy or no answer (timeout)<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;if (t_check_status(&quot;486|408&quot;)) {<o:p></o:p></p></div><div><p class=MsoNormal>route(TOVOICEMAIL);<o:p></o:p></p></div><div><p class=MsoNormal>exit;<o:p></o:p></p></div><div><p class=MsoNormal>&nbsp;}<o:p></o:p></p></div><div><p class=MsoNormal>#!endif<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>--------------------------------------------------------------------------------------------------------------<o:p></o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=MsoNormal>I hope you can help me. Thanks for your time.<o:p></o:p></p></div></div></div></body></html>