<div dir="ltr">Hi,<br>Yes, we are using PRTG to get call and registration stats using SNMP.<br>Thanks for the tip anyway as we haven&#39;t set SNMP monitoring yet in all of our servers.<br><br><div class="gmail_quote">On Tue, Sep 23, 2008 at 11:44 PM, Jeffrey Magder <span dir="ltr">&lt;<a href="mailto:jmagder@somanetworks.com">jmagder@somanetworks.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I noticed that you have loaded the snmpstats module in your<br>
configuration file. &nbsp;Are you polling SNMPStats with SNMP at all? &nbsp;If<br>
not, it is possible that its interprocess buffer is filling up. &nbsp;The<br>
solution in this case would be to either periodically poll the module,<br>
or disable the module if you aren&#39;t using it.<br>
<div><div></div><div class="Wj3C7c"><br>
On Tue, 2008-09-23 at 16:31 +0900, mayamatakeshi wrote:<br>
&gt; Hello,<br>
&gt; we have openser 1.3.3 running in production (current rev.: 4943).<br>
&gt; For 3 times in 50 days we had to restart openser to correct pkg memory<br>
&gt; problem.<br>
&gt; After some time logging messages like this:<br>
&gt; /openser.log:Aug 19 10:39:18 ipx022 /usr/local/sbin/openser[16991]:<br>
&gt; ERROR:core:new_credentials: no pkg memory left,<br>
&gt; openser will eventually run out of pkg memory and refuse all<br>
&gt; subsequent requests.<br>
&gt;<br>
&gt; We are trying to recreate this in our lab so that we can follow memory<br>
&gt; troubleshooting instructions at<br>
&gt; <a href="http://kamailio.net/dokuwiki/doku.php/troubleshooting:memory" target="_blank">http://kamailio.net/dokuwiki/doku.php/troubleshooting:memory</a>, but so<br>
&gt; far we were unable to do it even when generating millions of calls and<br>
&gt; registration transactions (we are using SIPp to generate normal call<br>
&gt; flows and even abnormal call flows detected when reading openser.log,<br>
&gt; like &#39;invalid cseq for aor&#39;, malformed SIP messages etc).<br>
&gt; And this is much more than in our production environment, with just<br>
&gt; 600 subscribers and about 2000 calls a day.<br>
&gt;<br>
&gt; The frequency the problem happens is increasing with the number of<br>
&gt; subscribers, so we are performing periodic restart of openser<br>
&gt; (actually, what we do is to switch over to the standby server). We<br>
&gt; already recompiled openser with pkg memory &nbsp;pool size set to 4MB so<br>
&gt; that this will not have to be done frequently.<br>
&gt;<br>
&gt; Since we cannot recreate this in our lab, we suspect there is a<br>
&gt; situation happening in production that might not be having been<br>
&gt; properly handled by openser.cfg. So my question is: would it be<br>
&gt; possible to an overlooked detail in openser.cfg to cause pkg memory<br>
&gt; problem?<br>
&gt;<br>
&gt;<br>
&gt; In case someone could take a look at it, here&#39;s our cfg file:<br>
&gt;<br>
&gt; ####### Global Parameters #########<br>
&gt;<br>
&gt; debug=0<br>
&gt; log_stderror=no<br>
&gt; log_facility=LOG_LOCAL0<br>
&gt;<br>
&gt; fork=yes<br>
&gt; children=4<br>
&gt;<br>
&gt; /* uncomment the following lines to enable debugging */<br>
&gt; #debug=6<br>
&gt; #fork=no<br>
&gt; #log_stderror=yes<br>
&gt;<br>
&gt; /* uncomment the next line to disable TCP (default on) */<br>
&gt; disable_tcp=yes<br>
&gt;<br>
&gt; /* uncomment the next line to enable the auto temporary blacklisting<br>
&gt; of<br>
&gt; &nbsp; &nbsp;not available destinations (default disabled) */<br>
&gt; #disable_dns_blacklist=no<br>
&gt;<br>
&gt; /* uncomment the next line to enable IPv6 lookup after IPv4 dns<br>
&gt; &nbsp; &nbsp;lookup failures (default disabled) */<br>
&gt; #dns_try_ipv6=yes<br>
&gt;<br>
&gt; /* uncomment the next line to disable the auto discovery of local<br>
&gt; aliases<br>
&gt; &nbsp; &nbsp;based on revers DNS on IPs (default on) */<br>
&gt; #auto_aliases=no<br>
&gt;<br>
&gt; /* uncomment the following lines to enable TLS support &nbsp;(default off)<br>
&gt; */<br>
&gt; #disable_tls = no<br>
&gt; #listen = tls:your_IP:5061<br>
&gt; #tls_verify_server = 1<br>
&gt; #tls_verify_client = 1<br>
&gt; #tls_require_client_certificate = 0<br>
&gt; #tls_method = TLSv1<br>
&gt; #tls_certificate = &quot;/usr/local/etc/openser/tls/user/user-cert.pem&quot;<br>
&gt; #tls_private_key = &quot;/usr/local/etc/openser/tls/user/user-privkey.pem&quot;<br>
&gt; #tls_ca_list = &quot;/usr/local/etc/openser/tls/user/user-calist.pem&quot;<br>
&gt;<br>
&gt;<br>
&gt; port=5060<br>
&gt;<br>
&gt; /* uncomment and configure the following line if you want openser to<br>
&gt; &nbsp; &nbsp;bind on a specific interface/port/proto (default bind on all<br>
&gt; available) */<br>
&gt; #listen=udp:<a href="http://202.173.5.181:5060" target="_blank">202.173.5.181:5060</a><br>
&gt;<br>
&gt;<br>
&gt; ####### Modules Section ########<br>
&gt;<br>
&gt; #set module path<br>
&gt; mpath=&quot;/usr/local/lib/openser/modules/&quot;<br>
&gt;<br>
&gt; /* uncomment next line for MySQL DB support */<br>
&gt; loadmodule &quot;mysql.so&quot;<br>
&gt; loadmodule &quot;sl.so&quot;<br>
&gt; loadmodule &quot;tm.so&quot;<br>
&gt; loadmodule &quot;rr.so&quot;<br>
&gt; loadmodule &quot;maxfwd.so&quot;<br>
&gt; loadmodule &quot;usrloc.so&quot;<br>
&gt; loadmodule &quot;registrar.so&quot;<br>
&gt; loadmodule &quot;textops.so&quot;<br>
&gt; loadmodule &quot;mi_fifo.so&quot;<br>
&gt; loadmodule &quot;uri_db.so&quot;<br>
&gt; loadmodule &quot;uri.so&quot;<br>
&gt; loadmodule &quot;xlog.so&quot;<br>
&gt; loadmodule &quot;acc.so&quot;<br>
&gt; loadmodule &quot;carrierroute.so&quot;<br>
&gt; loadmodule &quot;nathelper.so&quot;<br>
&gt; loadmodule &quot;dialog.so&quot;<br>
&gt; loadmodule &quot;snmpstats.so&quot;<br>
&gt; /* uncomment next lines for MySQL based authentication support<br>
&gt; &nbsp; &nbsp;NOTE: a DB (like mysql) module must be also loaded */<br>
&gt; loadmodule &quot;auth.so&quot;<br>
&gt; loadmodule &quot;auth_db.so&quot;<br>
&gt; loadmodule &quot;lcr.so&quot;<br>
&gt; /* uncomment next line for aliases support<br>
&gt; &nbsp; &nbsp;NOTE: a DB (like mysql) module must be also loaded */<br>
&gt; loadmodule &quot;alias_db.so&quot;<br>
&gt; /* uncomment next line for multi-domain support<br>
&gt; &nbsp; &nbsp;NOTE: a DB (like mysql) module must be also loaded<br>
&gt; &nbsp; &nbsp;NOTE: be sure and enable multi-domain support in all used modules<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(see &quot;multi-module params&quot; section ) */<br>
&gt; loadmodule &quot;domain.so&quot;<br>
&gt; /* uncomment the next two lines for presence server support<br>
&gt; &nbsp; &nbsp;NOTE: a DB (like mysql) module must be also loaded */<br>
&gt; #loadmodule &quot;presence.so&quot;<br>
&gt; #loadmodule &quot;presence_xml.so&quot;<br>
&gt; loadmodule &quot;uac.so&quot;<br>
&gt; loadmodule &quot;avpops.so&quot;<br>
&gt; # ----------------- setting module-specific parameters ---------------<br>
&gt;<br>
&gt;<br>
&gt; # ----- mi_fifo params -----<br>
&gt; modparam(&quot;mi_fifo&quot;, &quot;fifo_name&quot;, &quot;/tmp/openser_fifo&quot;)<br>
&gt;<br>
&gt;<br>
&gt; # ----- rr params -----<br>
&gt; # add value to ;lr param to cope with most of the UAs<br>
&gt; modparam(&quot;rr&quot;, &quot;enable_full_lr&quot;, 1)<br>
&gt; # do not append from tag to the RR (no need for this script)<br>
&gt; modparam(&quot;rr&quot;, &quot;append_fromtag&quot;, 1)<br>
&gt;<br>
&gt;<br>
&gt; # ----- rr params -----<br>
&gt; modparam(&quot;registrar&quot;, &quot;method_filtering&quot;, 1)<br>
&gt; /* uncomment the next line to disable parallel forking via location */<br>
&gt; # modparam(&quot;registrar&quot;, &quot;append_branches&quot;, 0)<br>
&gt; /* uncomment the next line not to allow more than 10 contacts per AOR<br>
&gt; */<br>
&gt; modparam(&quot;registrar&quot;, &quot;max_contacts&quot;, 10)<br>
&gt; modparam(&quot;registrar&quot;, &quot;min_expires&quot;, 30)<br>
&gt; modparam(&quot;registrar&quot;, &quot;max_expires&quot;, 40)<br>
&gt; modparam(&quot;registrar&quot;, &quot;default_expires&quot;, 35)<br>
&gt; # ----- uri_db params -----<br>
&gt; /* by default we disable the DB support in the module as we do not<br>
&gt; need it<br>
&gt; &nbsp; &nbsp;in this configuration */<br>
&gt; modparam(&quot;uri_db&quot;, &quot;use_uri_table&quot;, 0)<br>
&gt; modparam(&quot;uri_db&quot;, &quot;db_url&quot;,<br>
&gt; &quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; modparam(&quot;uri_db&quot;, &quot;use_domain&quot;, 1)<br>
&gt;<br>
&gt; # ----- acc params -----<br>
&gt; /* what sepcial events should be accounted ? */<br>
&gt; modparam(&quot;acc&quot;, &quot;early_media&quot;, 1)<br>
&gt; modparam(&quot;acc&quot;, &quot;report_ack&quot;, 1)<br>
&gt; modparam(&quot;acc&quot;, &quot;report_cancels&quot;, 1)<br>
&gt; /* by default ww do not adjust the direct of the sequential requests.<br>
&gt; &nbsp; &nbsp;if you enable this parameter, be sure the enable &quot;append_fromtag&quot;<br>
&gt; &nbsp; &nbsp;in &quot;rr&quot; module */<br>
&gt; modparam(&quot;acc&quot;, &quot;detect_direction&quot;, 0)<br>
&gt; /* account triggers (flags) */<br>
&gt; modparam(&quot;acc&quot;, &quot;failed_transaction_flag&quot;, 3)<br>
&gt; modparam(&quot;acc&quot;, &quot;log_flag&quot;, 1)<br>
&gt; modparam(&quot;acc&quot;, &quot;log_missed_flag&quot;, 2)<br>
&gt; /* uncomment the following lines to enable DB accounting also */<br>
&gt; modparam(&quot;acc&quot;, &quot;db_flag&quot;, 1)<br>
&gt; modparam(&quot;acc&quot;, &quot;db_missed_flag&quot;, 2)<br>
&gt;<br>
&gt;<br>
&gt; # ----- usrloc params -----<br>
&gt; #modparam(&quot;usrloc&quot;, &quot;db_mode&quot;, &nbsp; 0)<br>
&gt; /* uncomment the following lines if you want to enable DB persistency<br>
&gt; &nbsp; &nbsp;for location entries */<br>
&gt; modparam(&quot;usrloc&quot;, &quot;db_mode&quot;, &nbsp; 2)<br>
&gt; modparam(&quot;usrloc&quot;, &quot;db_url&quot;,<br>
&gt; &quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; modparam(&quot;usrloc&quot;, &quot;use_domain&quot;, 1)<br>
&gt;<br>
&gt; # ----- auth_db params -----<br>
&gt; /* uncomment the following lines if you want to enable the DB based<br>
&gt; &nbsp; &nbsp;authentication */<br>
&gt; modparam(&quot;auth_db&quot;, &quot;calculate_ha1&quot;, yes)<br>
&gt; modparam(&quot;auth_db&quot;, &quot;password_column&quot;, &quot;password&quot;)<br>
&gt; modparam(&quot;auth_db&quot;, &quot;db_url&quot;,<br>
&gt; &quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; modparam(&quot;auth_db&quot;, &quot;load_credentials&quot;, &quot;$avp(s:rpid)=rpid;<br>
&gt; $avp(s:blocked)=subscriber_status&quot;)<br>
&gt;<br>
&gt;<br>
&gt; # ----- alias_db params -----<br>
&gt; /* uncomment the following lines if you want to enable the DB based<br>
&gt; &nbsp; &nbsp;aliases */<br>
&gt; modparam(&quot;alias_db&quot;, &quot;db_url&quot;,<br>
&gt; &nbsp; &nbsp; &quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; modparam(&quot;alias_db&quot;, &quot;use_domain&quot;, 0)<br>
&gt;<br>
&gt; # ----- domain params -----<br>
&gt; /* uncomment the following lines to enable multi-domain detection<br>
&gt; &nbsp; &nbsp;support */<br>
&gt; modparam(&quot;domain&quot;, &quot;db_url&quot;,<br>
&gt; &quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; modparam(&quot;domain&quot;, &quot;db_mode&quot;, 1) &nbsp; # Use caching<br>
&gt;<br>
&gt;<br>
&gt; # ----- multi-module params -----<br>
&gt; /* uncomment the following line if you want to enable multi-domain<br>
&gt; support<br>
&gt; &nbsp; &nbsp;in the modules (dafault off) */<br>
&gt; #modparam(&quot;alias_db|auth_db|usrloc|uri_db&quot;, &quot;use_domain&quot;, 1)<br>
&gt;<br>
&gt;<br>
&gt; # ----- presence params -----<br>
&gt; /* uncomment the following lines if you want to enable presence */<br>
&gt; #modparam(&quot;presence|presence_xml&quot;, &quot;db_url&quot;,<br>
&gt; # &nbsp; &nbsp;&quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; #modparam(&quot;presence_xml&quot;, &quot;force_active&quot;, 1)<br>
&gt; #modparam(&quot;presence&quot;, &quot;server_address&quot;, &quot;sip:<a href="http://192.168.1.2:5060" target="_blank">192.168.1.2:5060</a>&quot;)<br>
&gt;<br>
&gt; # ----- carrieroute params -----<br>
&gt; modparam(&quot;carrierroute&quot;, &quot;db_url&quot;,<br>
&gt; &quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; modparam(&quot;carrierroute&quot;, &quot;config_source&quot;, &quot;db&quot;)<br>
&gt; modparam(&quot;carrierroute&quot;, &quot;use_domain&quot;, 1)<br>
&gt; # ----- NatHelper -----<br>
&gt; #para versao a partir da versao 1.2 eh necessario esse paramtro para<br>
&gt; nao dar erro qdo usa a funcao &quot;fix_nated_register();&quot;<br>
&gt; modparam(&quot;nathelper|registrar&quot;, &quot;received_avp&quot;, &quot;$avp(i:42)&quot;)<br>
&gt; modparam(&quot;nathelper&quot;, &quot;rtpproxy_sock&quot;, &quot;udp:<a href="http://127.0.0.1:22222" target="_blank">127.0.0.1:22222</a>&quot;)<br>
&gt;<br>
&gt;<br>
&gt; # ----- LCR -----<br>
&gt; modparam(&quot;lcr&quot;, &quot;db_url&quot;,<br>
&gt; &quot;mysql://openser:openserrw@localhost/openser&quot;)<br>
&gt; modparam(&quot;lcr|tm&quot;, &quot;fr_inv_timer_avp&quot;, &quot;$avp(i:704)&quot;)<br>
&gt; modparam(&quot;lcr&quot;, &quot;gw_uri_avp&quot;, &quot;$avp(i:709)&quot;)<br>
&gt; modparam(&quot;^auth$|lcr&quot;, &quot;rpid_avp&quot;, &quot;$avp(i:302)&quot;)<br>
&gt; modparam(&quot;lcr&quot;, &quot;contact_avp&quot;, &quot;$avp(i:711)&quot;)<br>
&gt; modparam(&quot;lcr&quot;, &quot;ruri_user_avp&quot;, &quot;$avp(i:500)&quot;)<br>
&gt; modparam(&quot;lcr&quot;, &quot;dm_flag&quot;, 25)<br>
&gt;<br>
&gt; # ----- Dialog ----<br>
&gt; modparam(&quot;dialog&quot;, &quot;dlg_flag&quot;, 4)<br>
&gt;<br>
&gt; # ----- SnmpStat -----<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;sipEntityType&quot;, &quot;registrarServer&quot;)<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;sipEntityType&quot;, &quot;proxyServer&quot;)<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;MsgQueueMinorThreshold&quot;, 2000)<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;MsgQueueMajorThreshold&quot;, 5000)<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;dlg_minor_threshold&quot;, 500)<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;dlg_major_threshold&quot;, 750)<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;snmpgetPath&quot;,&quot;/usr/bin/&quot;)<br>
&gt; modparam(&quot;snmpstats&quot;, &quot;snmpCommunity&quot;,&quot;public&quot;)<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; ####### Routing Logic ########<br>
&gt;<br>
&gt;<br>
&gt; # main request routing logic<br>
&gt;<br>
&gt; route{<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (!mf_process_maxfwd_header(&quot;10&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;483&quot;,&quot;Too Many Hops&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; ##nat<br>
&gt; &nbsp; &nbsp; route(2);<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (has_totag()) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; # sequential request withing a dialog should<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; # take the path determined by record-routing<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (loose_route()) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (is_method(&quot;BYE&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setflag(1); # do accouting ...<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setflag(3); # ... even if the transaction fails<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; route(1);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; } else {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* uncomment the following lines if you want to enable<br>
&gt; presence */<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ##if (is_method(&quot;SUBSCRIBE&quot;) &amp;&amp; $rd ==<br>
&gt; &quot;your.server.ip.address&quot;) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ## &nbsp; &nbsp;# in-dialog subscribe requests<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ## &nbsp; &nbsp;route(2);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ## &nbsp; &nbsp;exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ##}<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( is_method(&quot;ACK&quot;) ) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( t_check_trans() ) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # non loose-route, but stateful ACK; must be an<br>
&gt; ACK after a 487 or e.g. 404 from upstream server<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #t_relay();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; route(1);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # ACK without matching transaction ... ignore and<br>
&gt; discard.\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;404&quot;,&quot;Not here&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; #initial requests<br>
&gt; &nbsp; &nbsp; setflag(4); #for &nbsp;dialog statistics<br>
&gt;<br>
&gt;<br>
&gt; &nbsp; &nbsp; # CANCEL processing<br>
&gt; &nbsp; &nbsp; if (is_method(&quot;CANCEL&quot;))<br>
&gt; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (t_check_trans()) route(1);<br>
&gt; &nbsp; &nbsp; # &nbsp; &nbsp; &nbsp; &nbsp;t_relay();<br>
&gt; &nbsp; &nbsp; # &nbsp; &nbsp;exit;<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; #t_check_trans();<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (is_method(&quot;PUBLISH|SUBSCRIBE|REFER|OPTIONS|MESSAGE&quot;))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;405&quot;, &quot;Method not allowed&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; # authenticate if from local subscriber (uncomment to enable auth)<br>
&gt; &nbsp; &nbsp; if (!(method==&quot;REGISTER&quot;) &amp;&amp; (!from_gw()))<br>
&gt; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (!proxy_authorize(&quot;&quot;, &quot;subscriber&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_challenge(&quot;&quot;, &quot;0&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (!check_from()) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;403&quot;,&quot;Forbidden auth ID&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }else if (avp_check(&quot;$avp(s:blocked)&quot;, &quot;eq/0&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;603&quot;,&quot;Subscriber disabled&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }else if (avp_check(&quot;$avp(s:blocked)&quot;, &quot;eq/1&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;603&quot;,&quot;Subscriber with outgoing<br>
&gt; blocked&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; consume_credentials();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; # caller authenticated<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; # record routing<br>
&gt; &nbsp; &nbsp; if (!is_method(&quot;REGISTER|MESSAGE&quot;))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; record_route();<br>
&gt;<br>
&gt; &nbsp; &nbsp; # account only INVITEs<br>
&gt; &nbsp; &nbsp; if (is_method(&quot;INVITE&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; setflag(1); # do accouting<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (is_method(&quot;REGISTER&quot;))<br>
&gt; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; # authenticate the REGISTER requests (uncomment to enable<br>
&gt; auth)<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (!proxy_authorize(&quot;&quot;, &quot;subscriber&quot;))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_challenge(&quot;&quot;, &quot;0&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (!check_to())<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;403&quot;,&quot;Forbidden auth ID&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }else if (avp_check(&quot;$avp(s:blocked)&quot;, &quot;eq/0&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;403&quot;,&quot;Subscriber disabled&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (!save(&quot;location&quot;))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_reply_error();<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; if ($rU==NULL) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; # request with no Username in RURI<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;484&quot;,&quot;Address Incomplete&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; # apply DB based aliases (uncomment to enable)<br>
&gt; &nbsp; &nbsp; ##alias_db_lookup(&quot;dbaliases&quot;);<br>
&gt; &nbsp; &nbsp; #if the call came from a known gateway it is not authenticated and<br>
&gt; we cannot use the function check_from()<br>
&gt; &nbsp; &nbsp; if (from_gw()) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; route(4);<br>
&gt; &nbsp; &nbsp; }else if (!check_from()) {#if the check_from() returns false the<br>
&gt; call is not from a subscriber<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; route(4);<br>
&gt; &nbsp; &nbsp; } else {#it is a subscriber, route using flip domain<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;routing using carrierroute $rm to $ru\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (!cr_user_rewrite_uri(&quot;$fu&quot;, &quot;flip&quot;))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t_newtran();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t_reply(&quot;404&quot;, &quot;No Route&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; #replaces from by it&#39;s default DID<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uac_replace_from(&quot;sip:$avp(s:rpid)@$fd&quot;);<br>
&gt; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; # when routing via usrloc, log the missed calls also<br>
&gt; &nbsp; &nbsp; setflag(2);<br>
&gt;<br>
&gt; &nbsp; &nbsp; route(1);<br>
&gt; }<br>
&gt;<br>
&gt; route[1] {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;ROUTE_1 $rm to $ru\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp;if (subst_uri(&#39;/(sip:.*);nat=yes/\1/&#39;))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setflag(6);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; };<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (isflagset(5)||isflagset(6)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; route(3);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt;<br>
&gt; &nbsp; &nbsp; if (!t_relay()) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sl_reply_error();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exit;<br>
&gt; }<br>
&gt;<br>
&gt; route[2] {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;ROUTE_2 $rm to $ru\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (method==&quot;REGISTER&quot;) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fix_nated_register();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; } else if (!from_gw()){<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fix_nated_contact();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; };<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; setflag(5);<br>
&gt; }<br>
&gt; route[3] {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;ROUTE_3 $rm to $ru\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (is_method(&quot;BYE|CANCEL&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unforce_rtp_proxy();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; } else if (is_method(&quot;INVITE&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;FORCE RTP w/ parameter.\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; force_rtp_proxy(&quot;r&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t_on_failure(&quot;1&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; };<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (isflagset(5))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; search_append(&#39;Contact:.*sip:[^&gt;[:cntrl:]]*&#39;,<br>
&gt; &#39;;nat=yes&#39;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; t_on_reply(&quot;1&quot;);<br>
&gt; }<br>
&gt;<br>
&gt; route[4] {<br>
&gt;<br>
&gt; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;uri does exist $rm to $ru \n&quot;);<br>
&gt; &nbsp; &nbsp; if (alias_db_lookup(&quot;dbaliases&quot;)){<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!lookup(&quot;location&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch ($retcode) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case -1:<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t_newtran();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t_reply(&quot;404&quot;, &quot;Subscriber not<br>
&gt; online&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case -2:<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;405&quot;, &quot;Method Not<br>
&gt; Allowed&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; }else{#check if did is blocked<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; $rU = &quot;(BLK)&quot; + $rU;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (alias_db_lookup(&quot;dbaliases&quot;)){<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sl_send_reply(&quot;403&quot;, &quot;DID blocked&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }else{# if it is not a valid DID nor a blocked DID tries to<br>
&gt; route it using peering domain<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!cr_rewrite_uri(&quot;peering&quot;, &quot;call_id&quot;))<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t_newtran();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t_reply(&quot;404&quot;, &quot;Peering Not Found&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; }<br>
&gt; }<br>
&gt;<br>
&gt; failure_route[1] {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;FAILURE $rm to $ru\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (isflagset(6)||isflagset(5)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unforce_rtp_proxy();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; }<br>
&gt;<br>
&gt; onreply_route[1] {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;ONREPLY_1 - Status $rs from $si $rm .\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; if (is_method(&quot;INVITE&quot;)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((isflagset(5)||isflagset(6)) &amp;&amp;<br>
&gt; status=~&quot;(183)|(2[0-9][0-9])&quot;) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; force_rtp_proxy();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; search_append(&#39;Contact:.*sip:[^&gt;[:cntrl:]]*&#39;,<br>
&gt; &#39;;nat=yes&#39;);<br>
&gt;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!from_gw()){ #if (isflagset(6)) {<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;L_INFO&quot;, &quot;ONREPLY_1 - ! from gw.\n&quot;);<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fix_nated_contact();<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; exit;<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
&gt; }<br>
&gt;<br>
&gt; Regards,<br>
&gt; takeshi<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Users mailing list<br>
&gt; <a href="mailto:Users@lists.kamailio.org">Users@lists.kamailio.org</a><br>
&gt; <a href="http://lists.kamailio.org/cgi-bin/mailman/listinfo/users" target="_blank">http://lists.kamailio.org/cgi-bin/mailman/listinfo/users</a><br>
<br>
</blockquote></div><br></div>