<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> </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> </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> </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> </o:p></p><div><p class=MsoNormal>Hi, I am using Kamailio 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> </o:p></p></div><div><p class=MsoNormal>Softphone (192.168.0.5) <--> Kamailio (192.168.0.3) <--> Router (192.168.0.1) <--> Softphone over smartphone<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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> </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="unix:/var/run/rtpproxy/rtpproxy.sock"<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> </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="-l <a href="http://candamil.dyndns.org" target="_blank">candamil.dyndns.org</a>"<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>and works properly. This is the log message:<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>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 <udp:<a href="http://127.0.0.1:22222" target="_blank">127.0.0.1:22222</a>> 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> </o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Both softphones are "linphone". The configuration of the network softphone is the following:<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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> </o:p></p></div><div><p class=MsoNormal>In the softphone of the smartphone I set as proxy and domain "<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>", the DNS address of my router IP.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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> </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> </o:p></p></div><div><p class=MsoNormal><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 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> </o:p></p></div><div><p class=MsoNormal>If I set in the network softphone the proxy as 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 <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> </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: <core><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><5060ranch=z9hG4bKc<o:p></o:p></p></div><div><p class=MsoNormal>50f.b4825246.0><o:p></o:p></p></div><div><p class=MsoNormal>Nov 12 20:53:00 condor kamailio[7306]: ERROR: <core><o:p></o:p></p></div><div><p class=MsoNormal>[parser/parse_via.c:2629]: ERROR: parse_via on: <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><<a href="mailto:sip%3A1001@candamil.dyndns.org" target="_blank">sip:1001@candamil.dyndns.org</a>>;tag=783852345#015#012To: <<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>>#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><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>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> </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> </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> </o:p></p></div><div><p class=MsoNormal>####### Defined Values #########<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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># as: auth_db, acc, usrloc, a.s.o.<o:p></o:p></p></div><div><p class=MsoNormal>#!define DBURL "mysql://openser:openserrw@localhost/openser"<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> </o:p></p></div><div><p class=MsoNormal># - flags<o:p></o:p></p></div><div><p class=MsoNormal># 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> </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> </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> 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> </o:p></p></div><div><p class=MsoNormal>/* add local domain aliases */<o:p></o:p></p></div><div><p class=MsoNormal>alias="<a href="http://candamil.dyndns.org" target="_blank">candamil.dyndns.org</a>"<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>/* port to listen to<o:p></o:p></p></div><div><p class=MsoNormal> * - 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> </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> </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> </o:p></p></div><div><p class=MsoNormal>####### Custom Parameters #########<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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 = "10.0.0.101" desc "My PSTN GW Address"<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 = "" desc "PSTN GW Address"<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>####### Modules Section ########<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_MYSQL<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule "db_mysql.so"<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>#!ifdef WITH_AUTH<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule "auth.so"<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule "auth_db.so"<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>#!ifdef WITH_NAT<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule "nathelper.so"<o:p></o:p></p></div><div><p class=MsoNormal>loadmodule "rtpproxy.so"<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># ----------------- setting module-specific parameters ---------------<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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("auth_db", "db_url", DBURL)<o:p></o:p></p></div><div><p class=MsoNormal>modparam("auth_db", "calculate_ha1", yes)<o:p></o:p></p></div><div><p class=MsoNormal>modparam("auth_db", "password_column", "password")<o:p></o:p></p></div><div><p class=MsoNormal>modparam("auth_db", "load_credentials", "")<o:p></o:p></p></div><div><p class=MsoNormal>modparam("auth_db", "use_domain", MULTIDOMAIN)<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>#!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("rtpproxy", "rtpproxy_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> </o:p></p></div><div><p class=MsoNormal># ----- nathelper params -----<o:p></o:p></p></div><div><p class=MsoNormal>modparam("nathelper", "natping_interval", 30)<o:p></o:p></p></div><div><p class=MsoNormal>modparam("nathelper", "ping_nated_only", 1)<o:p></o:p></p></div><div><p class=MsoNormal>modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)<o:p></o:p></p></div><div><p class=MsoNormal>modparam("nathelper", "sipping_from", "<a href="mailto:sip%3Apinger@kamailio.org" target="_blank">sip:pinger@kamailio.org</a>")<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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("nathelper|registrar", "received_avp", "$avp(RECEIVED)")<o:p></o:p></p></div><div><p class=MsoNormal>modparam("usrloc", "nat_bflag", 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> </o:p></p></div><div><p class=MsoNormal>####### Routing Logic ########<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># 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> </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> </o:p></p></div><div><p class=MsoNormal> # 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> </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><o:p> </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> </o:p></p></div><div><p class=MsoNormal> # CANCEL processing<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method("CANCEL"))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal> 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> }<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>t_check_trans();<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal># authentication<o:p></o:p></p></div><div><p class=MsoNormal> route(AUTH);<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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> # - remove preloaded route headers<o:p></o:p></p></div><div><p class=MsoNormal>remove_hf("Route");<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method("INVITE|SUBSCRIBE"))<o:p></o:p></p></div><div><p class=MsoNormal> record_route();<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal># account only INVITEs<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method("INVITE"))<o:p></o:p></p></div><div><p class=MsoNormal> {<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> </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> </o:p></p></div><div><p class=MsoNormal> ### requests for my local domains<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal># handle presence related requests<o:p></o:p></p></div><div><p class=MsoNormal> route(PRESENCE);<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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> </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> sl_send_reply("484","Address Incomplete");<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> </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> </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> </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> </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># 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> if (is_method("INVITE|SUBSCRIBE")) {<o:p></o:p></p></div><div><p class=MsoNormal>t_on_branch("MANAGE_BRANCH");<o:p></o:p></p></div><div><p class=MsoNormal> t_on_reply("MANAGE_REPLY");<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method("INVITE")) {<o:p></o:p></p></div><div><p class=MsoNormal> t_on_failure("MANAGE_FAILURE");<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>if (!t_relay()) {<o:p></o:p></p></div><div><p class=MsoNormal> 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> </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> # 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> 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=>$si)!=$null)<o:p></o:p></p></div><div><p class=MsoNormal> {<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("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");<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>if (!pike_check_req())<o:p></o:p></p></div><div><p class=MsoNormal> {<o:p></o:p></p></div><div><p class=MsoNormal>xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");<o:p></o:p></p></div><div><p class=MsoNormal> $sht(ipban=>$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> }<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>if (!mf_process_maxfwd_header("10")) {<o:p></o:p></p></div><div><p class=MsoNormal> sl_send_reply("483","Too Many Hops");<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> </o:p></p></div><div><p class=MsoNormal>if(!sanity_check("1511", "7"))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>xlog("Malformed SIP message from $si:$sp\n");<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></o:p></p></div><div><p class=MsoNormal><o:p> </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> # 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("BYE")) {<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>setflag(FLT_ACCFAILED); # ... even if the transaction fails<o:p></o:p></p></div><div><p class=MsoNormal> }<o:p></o:p></p></div><div><p class=MsoNormal>if ( is_method("ACK") ) {<o:p></o:p></p></div><div><p class=MsoNormal># ACK is forwarded statelessy<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>route(RELAY);<o:p></o:p></p></div><div><p class=MsoNormal> } else {<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method("SUBSCRIBE") && uri == myself) {<o:p></o:p></p></div><div><p class=MsoNormal> # 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> }<o:p></o:p></p></div><div><p class=MsoNormal>if ( is_method("ACK") ) {<o:p></o:p></p></div><div><p class=MsoNormal>if ( t_check_trans() ) {<o:p></o:p></p></div><div><p class=MsoNormal> # 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> 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> # 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> }<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply("404","Not here");<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></o:p></p></div><div><p class=MsoNormal><o:p> </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> if (is_method("REGISTER"))<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> {<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> 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("location"))<o:p></o:p></p></div><div><p class=MsoNormal> 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></o:p></p></div><div><p class=MsoNormal><o:p> </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> </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> if($rU=~"^[0-9][0-9]$")<o:p></o:p></p></div><div><p class=MsoNormal>if(sd_lookup("speed_dial"))<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> </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("dbaliases"))<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> </o:p></p></div><div><p class=MsoNormal>$avp(oexten) = $rU;<o:p></o:p></p></div><div><p class=MsoNormal>if (!lookup("location")) {<o:p></o:p></p></div><div><p class=MsoNormal> $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> 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> send_reply("404", "Not Found");<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> send_reply("405", "Method Not Allowed");<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></o:p></p></div><div><p class=MsoNormal><o:p> </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("INVITE"))<o:p></o:p></p></div><div><p class=MsoNormal> {<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> </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("PUBLISH|SUBSCRIBE"))<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>#!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> 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>if(is_method("PUBLISH"))<o:p></o:p></p></div><div><p class=MsoNormal> {<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> }<o:p></o:p></p></div><div><p class=MsoNormal>else<o:p></o:p></p></div><div><p class=MsoNormal>if( is_method("SUBSCRIBE"))<o:p></o:p></p></div><div><p class=MsoNormal> {<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> }<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> # if presence enabled, this part will not be executed<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method("PUBLISH") || $rU==$null)<o:p></o:p></p></div><div><p class=MsoNormal> {<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply("404", "Not here");<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>return;<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># 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("REGISTER"))<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> if (!www_authorize("$td", "subscriber"))<o:p></o:p></p></div><div><p class=MsoNormal>{<o:p></o:p></p></div><div><p class=MsoNormal>www_challenge("$td", "0");<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> </o:p></p></div><div><p class=MsoNormal>if ($au!=$tU)<o:p></o:p></p></div><div><p class=MsoNormal> {<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply("403","Forbidden auth ID");<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>} else {<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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> {<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> }<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># authenticate if from local subscriber<o:p></o:p></p></div><div><p class=MsoNormal> 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("$fd", "subscriber")) {<o:p></o:p></p></div><div><p class=MsoNormal> proxy_challenge("$fd", "0");<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> if (is_method("PUBLISH"))<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> sl_send_reply("403","Forbidden auth ID");<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>if ($au!=$rU) {<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply("403","Forbidden R-URI");<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>#!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> sl_send_reply("403","Forbidden R-URI domain");<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>} else {<o:p></o:p></p></div><div><p class=MsoNormal>if ($au!=$fU) {<o:p></o:p></p></div><div><p class=MsoNormal> sl_send_reply("403","Forbidden auth ID");<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></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>consume_credentials();<o:p></o:p></p></div><div><p class=MsoNormal> # 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> # 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> {<o:p></o:p></p></div><div><p class=MsoNormal>sl_send_reply("403","Not relaying");<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></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> </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> force_rport();<o:p></o:p></p></div><div><p class=MsoNormal>if (nat_uac_test("19")) {<o:p></o:p></p></div><div><p class=MsoNormal>if (is_method("REGISTER")) {<o:p></o:p></p></div><div><p class=MsoNormal> 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> }<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> </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> if(has_totag()) {<o:p></o:p></p></div><div><p class=MsoNormal>if(check_route_param("nat=yes")) {<o:p></o:p></p></div><div><p class=MsoNormal>setbflag(FLB_NATB);<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></o:p></p></div><div><p class=MsoNormal> 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> </o:p></p></div><div><p class=MsoNormal> rtpproxy_manage();<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </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> add_rr_param(";nat=yes");<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> 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> }<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> </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> append_hf("P-hint: outbound\r\n");<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> </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> xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");<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> </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> # (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> if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))<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> # 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("403", "Not Allowed");<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> </o:p></p></div><div><p class=MsoNormal>$ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);<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>exit;<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>return;<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># 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=="POST" || method=="GET")<o:p></o:p></p></div><div><p class=MsoNormal> && (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> # xmlrpclib: it waits for EOF before interpreting the response).<o:p></o:p></p></div><div><p class=MsoNormal>if ($hdr(User-Agent) =~ "xmlrpclib")<o:p></o:p></p></div><div><p class=MsoNormal> 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> exit;<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal>send_reply("403", "Forbidden");<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> </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> if(!is_method("INVITE"))<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># check if VoiceMail server IP is defined<o:p></o:p></p></div><div><p class=MsoNormal> if (strempty($sel(cfg_get.voicemail.srv_ip))) {<o:p></o:p></p></div><div><p class=MsoNormal>xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");<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>if($avp(oexten)==$null)<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>$ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)<o:p></o:p></p></div><div><p class=MsoNormal> + $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> </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> </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> xdbg("new branch [$T_branch_idx] to $ru\n");<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> </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("incoming reply\n");<o:p></o:p></p></div><div><p class=MsoNormal>if(status=~"[12][0-9][0-9]")<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> </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> </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> </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("3[0-9][0-9]")) {<o:p></o:p></p></div><div><p class=MsoNormal> t_reply("404","Not found");<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> </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> if (t_check_status("486|408")) {<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> }<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> </o:p></p></div><div><p class=MsoNormal><o:p> </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>