<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
Hello,</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
I recognized opensips coredumping in the latest version when being under high load. The problem is an invalid pointer when iterating over the user location in memory table (DB mode is 0). Below the backtrace of where this happen. Note: we added an extra NULL
 check in the line to make sure that _r is not null. But as u can see the one is still crashing so we assume that the location table got corrupted – pointer not null but pointing to nirwana.&nbsp;</div>
<div><font face="Calibri,sans-serif">We are load testing only register cycles (register/401/register/200). After the trace the current config … The important part is the “route[register_request]”. Tests have shown that if we strip off the cache</font><span style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px; font-style: italic;">db
 calls or using&nbsp;</span><font face="Calibri,sans-serif"><i>cache local</i>&nbsp;instead of cache_mysql&nbsp;–&nbsp;this not happening. Could it be a conflict in the timer procedure used by both modules? The cache needs to be distributed&nbsp;–&nbsp;that’s why cache_mysql was&nbsp;chosen.</font></div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div><font face="Calibri,sans-serif">Any thoughts?</font></div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<div>Core was generated by `/opt/opensips/sbin/opensips -P /var/run/opensips.pid -w /opt/opensips -m 8192 -'.</div>
<div>Program terminated with signal SIGSEGV, Segmentation fault.</div>
<div>#0 &nbsp;nodb_timer (_r=0x7f8f00000000) at urecord.c:223</div>
<div>223 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!_r-&gt;contacts) return 0;</div>
<div>(gdb) #0 &nbsp;nodb_timer (_r=0x7f8f00000000) at urecord.c:223</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; ptr = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; t = &lt;optimized out&gt;</div>
<div>#1 &nbsp;timer_urecord (_r=_r@entry=0x7f8f00000000, ins_list=ins_list@entry=0x7f8fed2ec480) at urecord.c:367</div>
<div>No locals.</div>
<div>#2 &nbsp;0x00007f91eed428ac in mem_timer_udomain (_d=0x7f8fed2ec478) at udomain.c:791</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; ptr = 0x7f8f00000000</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; dest = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; i = 61</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; ret = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; flush = 0</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; it = {node = 0x7f8ff14136c8, map = 0x7f8fed2f0238}</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; __FUNCTION__ = &quot;mem_timer_udomain&quot;</div>
<div>#3 &nbsp;0x00007f91eed356fe in synchronize_all_udomains () at dlist.c:694</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; res = 0</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; ptr = 0x7f8fed2ec418</div>
<div>#4 &nbsp;0x00007f91eed47ca7 in timer (ticks=&lt;optimized out&gt;, param=&lt;optimized out&gt;) at ul_mod.c:439</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; __FUNCTION__ = &quot;timer&quot;</div>
<div>#5 &nbsp;0x00000000004df9c8 in timer_ticker (drift=&lt;synthetic pointer&gt;, timer_list=&lt;optimized out&gt;) at timer.c:384</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; t = 0x7f91f1186da0</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; j = 300</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; ij = 300050000</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; ij_marker = 300050000</div>
<div>#6 &nbsp;run_timer_process (tpl=0x7f91f11862e8, tpl=0x7f91f11862e8) at timer.c:506</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; multiple = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; cnt = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; o_tv = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; tv = {tv_sec = 0, tv_usec = 0}</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; drift = 0</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; uinterval = 100000</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; wait = &lt;optimized out&gt;</div>
<div>#7 &nbsp;start_timer_processes () at timer.c:616</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; tpl = 0x7f91f11862e8</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; pid = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; __FUNCTION__ = &quot;start_timer_processes&quot;</div>
<div>#8 &nbsp;0x00000000004170f9 in main_loop () at main.c:1016</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; i = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; pid = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; si = 0x0</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; startup_done = 0x0</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; chd_rank = 64</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; rc = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; load_p = 0x7f8fed2f67c8</div>
<div>#9 &nbsp;main (argc=&lt;optimized out&gt;, argv=&lt;optimized out&gt;) at main.c:1634</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; cfg_log_stderr = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; cfg_stream = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; c = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; r = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; tmp = 0x7fff9dd62f17 &quot;&quot;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; tmp_len = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; port = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; proto = &lt;optimized out&gt;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; options = 0x5c59a8 &quot;f:cCm:M:b:l:n:N:rRvdDFETSVhw:t:u:g:P:G:W:o:&quot;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; ret = -1</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; seed = 3178038181</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; __FUNCTION__ = &quot;main&quot;</div>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
Configuration:</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<div>####### Global Parameters #########</div>
<div><br>
</div>
<div>tcp_children=256</div>
<div>tcp_max_connections=500000</div>
<div>tcp_keepalive=1</div>
<div>tcp_keepcount=3</div>
<div>tcp_keepidle=300</div>
<div>tcp_keepinterval=300</div>
<div>tcp_connection_lifetime=1200</div>
<div>tcp_max_msg_chunks=20</div>
<div>tcp_max_msg_time=15</div>
<div>tcp_connect_timeout=1</div>
<div>tcp_send_timeout=1</div>
<div>#tcp_async=1</div>
<div><br>
</div>
<div>disable_tls=yes</div>
<div>tls_verify_server = 1</div>
<div># There won't be a client presenting a real valid cert. If a client would</div>
<div># presente a cert - even if not required (see below) this option would make&nbsp;</div>
<div># the client connecting fail (see opensips docu).</div>
<div>tls_verify_client = 0</div>
<div>tls_require_client_certificate = 0</div>
<div>tls_method = TLSv1</div>
<div><br>
</div>
<div>disable_core_dump=no</div>
<div><br>
</div>
<div>debug=0</div>
<div>server_header=&quot;Server: Jibe Mobile SIP Proxy 1.10.1&quot;</div>
<div>log_stderror=no</div>
<div>log_facility=LOG_LOCAL0</div>
<div><br>
</div>
<div>fork=yes</div>
<div>children=64</div>
<div><br>
</div>
<div>auto_aliases=no</div>
<div><br>
</div>
<div>listen=...&nbsp;</div>
<div><br>
</div>
<div>####### Modules Section ########</div>
<div><br>
</div>
<div>#set module path</div>
<div>mpath=&quot;/opt/opensips/lib64/opensips/modules/&quot;</div>
<div><br>
</div>
<div># helper and util modules&nbsp;</div>
<div>loadmodule &quot;maxfwd.so&quot;</div>
<div>loadmodule &quot;db_mysql.so&quot;</div>
<div>loadmodule &quot;textops.so&quot;</div>
<div>loadmodule &quot;sipmsgops.so&quot;</div>
<div><br>
</div>
<div># ----- Management interface -----</div>
<div>loadmodule &quot;mi_fifo.so&quot;</div>
<div>modparam(&quot;mi_fifo&quot;, &quot;fifo_name&quot;, &quot;/tmp/opensips_fifo&quot;)</div>
<div>modparam(&quot;mi_fifo&quot;, &quot;fifo_mode&quot;, 0666)</div>
<div><br>
</div>
<div># core modules for sip routing and checking</div>
<div><br>
</div>
<div># ----- Stateless signalling ----&nbsp;</div>
<div>loadmodule &quot;sl.so&quot;</div>
<div><br>
</div>
<div># ----- Transaction Management<span class="Apple-tab-span" style="white-space:pre">
</span>-----</div>
<div>loadmodule &quot;tm.so&quot;</div>
<div><br>
</div>
<div># NOTE: signaling.so requires sl/tm loaded before itself</div>
<div>loadmodule &quot;signaling.so&quot;</div>
<div><br>
</div>
<div># set final reply timer for SIP messages in seconds</div>
<div>modparam(&quot;tm&quot;, &quot;fr_timer&quot;, 32)</div>
<div>modparam(&quot;tm&quot;, &quot;fr_inv_timer&quot;, 150)</div>
<div><br>
</div>
<div># ----- Record Routing -----</div>
<div>loadmodule &quot;rr.so&quot;</div>
<div>modparam(&quot;rr&quot;, &quot;append_fromtag&quot;, 1)</div>
<div>modparam(&quot;rr&quot;, &quot;enable_double_rr&quot;, 1)</div>
<div><br>
</div>
<div># Dialog module to track RTP proxy in use for the RTP session</div>
<div>loadmodule &quot;dialog.so&quot;</div>
<div><br>
</div>
<div># ----- user location -----</div>
<div>loadmodule &quot;usrloc.so&quot;</div>
<div><br>
</div>
<div>modparam(&quot;usrloc&quot;, &quot;db_mode&quot;, 0) # In memory only</div>
<div>modparam(&quot;usrloc&quot;, &quot;timer_interval&quot;, 300)</div>
<div>modparam(&quot;usrloc&quot;, &quot;nat_bflag&quot;, &quot;nat_branch&quot;)</div>
<div><br>
</div>
<div># ----- Registrar ------</div>
<div>loadmodule &quot;registrar.so&quot;</div>
<div>modparam(&quot;registrar&quot;, &quot;max_contacts&quot;, 1)</div>
<div>modparam(&quot;registrar&quot;, &quot;default_expires&quot;, 3600)</div>
<div>modparam(&quot;registrar&quot;, &quot;min_expires&quot;, 20)</div>
<div>modparam(&quot;registrar&quot;, &quot;max_expires&quot;, 3600)</div>
<div>modparam(&quot;registrar&quot;, &quot;tcp_persistent_flag&quot;, &quot;tcp_persistent&quot;)</div>
<div>modparam(&quot;registrar&quot;, &quot;mcontact_avp&quot;, &quot;$avp(contact_info)&quot;)</div>
<div>modparam(&quot;registrar&quot;, &quot;received_avp&quot;, &quot;$avp(42)&quot;)</div>
<div><br>
</div>
<div>#GRUU support for SERV-2317: 1=disable is default, 0=enable</div>
<div>modparam(&quot;registrar&quot;, &quot;disable_gruu&quot;, 1)</div>
<div># ----- Authentication -----</div>
<div>loadmodule &quot;auth.so&quot;</div>
<div>loadmodule &quot;auth_db.so&quot;</div>
<div>modparam(&quot;auth_db&quot;, &quot;calculate_ha1&quot;, yes)</div>
<div>modparam(&quot;auth_db&quot;, &quot;password_column&quot;, &quot;password&quot;)</div>
<div>modparam(&quot;auth_db&quot;, &quot;db_url&quot;, &quot;mysql://....&quot;)</div>
<div>modparam(&quot;auth_db&quot;, &quot;load_credentials&quot;, &quot;&quot;)</div>
<div><br>
</div>
<div># ----- Database operations for AVP -----</div>
<div>loadmodule &quot;avpops.so&quot;</div>
<div>modparam(&quot;avpops&quot;, &quot;db_url&quot;, &quot;1 mysql://...&quot;)</div>
<div>modparam(&quot;avpops&quot;, &quot;db_url&quot;, &quot;2 mysql://...&quot;)</div>
<div>modparam(&quot;avpops&quot;, &quot;db_url&quot;, &quot;3 mysql://...&quot;)</div>
<div><br>
</div>
<div># ----------------- setting module-specific parameters ---------------</div>
<div># ----- mi_fifo params -----</div>
<div><br>
</div>
<div># ----- CacheDB binding for cache interface</div>
<div>loadmodule &quot;cachedb_sql.so&quot;</div>
<div>modparam(&quot;cachedb_sql&quot;, &quot;db_url&quot;,&quot;mysql://opensips:opensipsrw@69.194.8.32/opensips&quot;)</div>
<div>modparam(&quot;cachedb_sql&quot;, &quot;cache_clean_period&quot;,3600)</div>
<div><br>
</div>
<div># ----- URI -----</div>
<div>loadmodule &quot;uri.so&quot;</div>
<div>modparam(&quot;uri&quot;, &quot;use_uri_table&quot;, 0)</div>
<div>modparam(&quot;uri&quot;, &quot;db_url&quot;, &quot;mysql://opensips:opensipsrw@69.194.8.32/opensips&quot;)</div>
<div><br>
</div>
<div># ----- Accounting -----</div>
<div>loadmodule &quot;acc.so&quot;</div>
<div>modparam(&quot;acc&quot;, &quot;db_url&quot;, &quot;mysql://opensips:opensipsrw@69.194.8.32/opensips&quot;)</div>
<div>modparam(&quot;acc&quot;, &quot;db_flag&quot;, &quot;DB_FLAG&quot;)</div>
<div>modparam(&quot;acc&quot;, &quot;cdr_flag&quot;, &quot;CDR_FLAG&quot;)</div>
<div>modparam(&quot;acc&quot;, &quot;early_media&quot;, 1)</div>
<div>modparam(&quot;acc&quot;, &quot;report_cancels&quot;, 1)</div>
<div>modparam(&quot;acc&quot;, &quot;db_missed_flag&quot;, 2)</div>
<div>modparam(&quot;acc&quot;, &quot;failed_transaction_flag&quot;, 3)</div>
<div>modparam(&quot;acc&quot;, &quot;detect_direction&quot;, 0)</div>
<div><br>
</div>
<div># ----- NAT Helper -----</div>
<div>loadmodule &quot;nathelper.so&quot;</div>
<div>modparam(&quot;nathelper&quot;, &quot;natping_interval&quot;, 0)</div>
<div>modparam(&quot;nathelper&quot;, &quot;ping_nated_only&quot;, 1)<span class="Apple-tab-span" style="white-space:pre">
</span># Ping only clients behind NAT, set to 1</div>
<div>modparam(&quot;nathelper&quot;, &quot;sipping_bflag&quot;, 7)<span class="Apple-tab-span" style="white-space:pre">
</span># Changed from 8 to 7</div>
<div>modparam(&quot;nathelper&quot;, &quot;sipping_from&quot;, &quot;sip:pinger@rcs.jibemobile.com&quot;)</div>
<div>modparam(&quot;nathelper&quot;, &quot;received_avp&quot;, &quot;$avp(42)&quot;)</div>
<div><br>
</div>
<div># ----- STUN Binding based keep-alive - RFC 6223</div>
<div>loadmodule &quot;stun.so&quot;</div>
<div>modparam(&quot;stun&quot;, &quot;primary_ip&quot;, &quot;...&quot;)</div>
<div>modparam(&quot;stun&quot;, &quot;primary_port&quot;, &quot;5671&quot;)</div>
<div>modparam(&quot;stun&quot;, &quot;alternate_ip&quot;, &quot;127.0.0.1&quot;)</div>
<div>modparam(&quot;stun&quot;, &quot;alternate_port&quot;, &quot;6600&quot;)</div>
<div><br>
</div>
<div># ----- RTPProxy -----&nbsp;</div>
<div>loadmodule &quot;rtpproxy.so&quot;</div>
<div># Retry lost rtpproxy mgmt connections after 20 seconds</div>
<div>modparam(&quot;rtpproxy&quot;, &quot;rtpproxy_disable_tout&quot;, 20)</div>
<div># Wait 2 seconds after sending an rtp mgmt packet for a response (US is a long way away)</div>
<div>modparam(&quot;rtpproxy&quot;, &quot;rtpproxy_tout&quot;, 2)</div>
<div># Retry 10 times after a timeout</div>
<div>modparam(&quot;rtpproxy&quot;, &quot;rtpproxy_retr&quot;, 10)</div>
<div><br>
</div>
<div>&nbsp;</div>
<div>modparam(&quot;rtpproxy&quot;, &quot;rtpproxy_sock&quot;, &quot;0 == udp:69.194.11.206:7890 udp:69.194.11.207:7890 udp:69.194.11.208:7890 udp:69.194.11.209:7890&quot;)</div>
<div><br>
</div>
<div><br>
</div>
<div>####### Routing Logic ########</div>
<div><br>
</div>
<div>##############################</div>
<div># main request routing logic #</div>
<div>##############################</div>
<div>route {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(hub) = NULL;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(local_location) = &quot;sip:.,;transport=tcp&quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(imas) = &quot;sip:...;transport=udp&quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(rls) = &quot;sip:...;transport=udp&quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(mps) = &quot;sip:...;transport=udp&quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(otherCloud) = NULL;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(conference_factory) = &quot;sip:conference@jibemobile.com&quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(network_wifi) = &quot;...&quot;; # wifi</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(network_mobile) = &quot;...&quot;; # mobile</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#COM-97</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$var(blackBird) = &quot;true&quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;JIBE CN ($ci): Incoming request: $rm: $ruri from: $si:$sp on $pr (source=$hdr(P-Request-Source))\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(sanity_check);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(receive_lb_message);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># Not sure if this is the right place to trigger accounting</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># aba: !!! NO IT'S NOT !!!</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (is_method(&quot;INVITE&quot;)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(db_cdr_accounting);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ( has_totag() ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(in_dialog_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ( is_method(&quot;REGISTER&quot;) ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(register_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ( is_method(&quot;CANCEL&quot;) ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(cancel_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ( $hdr(P-Request-Source) == &quot;hub&quot; ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># check if we are on the right proxy - if not, send request to the right one&nbsp;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(check_hub_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp;# hit target proxy - route to client</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(terminating_hub_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ($hdr(P-Request-Source) == &quot;server&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(check_server_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(is_method(&quot;SUBSCRIBE&quot;) &amp;&amp; ($hdr(Event) =~ &quot;presence&quot; || $hdr(Event) =~ &quot;xcap&quot;) ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(presence_server);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># terminating hub routing - do media proxying and traffic shaping</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(originating_server_request);<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ( $hdr(P-Request-Source) == &quot;proxy&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># terminating proxy routing - do media proxying and traffic shaping</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(terminating_proxy_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else {&nbsp;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># Client requests</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># set avp to mark the transaction as client originated</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># avps are bound to the current transaction/message and will be available&nbsp;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># in onreply for this transaction/message</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$avp(client_originating_request) = &quot;yes&quot;;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ( is_method(&quot;OPTIONS&quot;) ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(options_request); &nbsp;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if (is_method(&quot;MESSAGE&quot;) &amp;&amp; $cT =~ &quot;system-request&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#originating system request SCA-5684</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(system_message_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else {&nbsp;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># originating client request - traffic shaping, lookup of target node and media proxying</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(originating_client_request);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div>}</div>
<div><br>
</div>
<div>##########################################################################################</div>
<div>#<span class="Apple-tab-span" style="white-space:pre"> </span>SANITY CHECK ON INCOMING MESSAGES<span class="Apple-tab-span" style="white-space:pre">
</span>#</div>
<div>##########################################################################################</div>
<div>route[sanity_check] {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;JIBE CN ($ci): Sanity check on incoming request\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ( !mf_process_maxfwd_header(&quot;10&quot;) ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>sl_send_reply(&quot;483&quot;,&quot;Too Many Hops&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div>}</div>
<div><br>
</div>
<div>#########################################################################################</div>
<div>#<span class="Apple-tab-span" style="white-space:pre"> </span>REGISTER request<span class="Apple-tab-span" style="white-space:pre">
</span>#</div>
<div>##########################################################################################</div>
<div>route[register_request] {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># authenticate the REGISTER requests</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (!www_authorize(&quot;rcs.jibemobile.com&quot;, &quot;subscriber&quot;)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;JIBE CN ($ci): Not authenticated - challenging user\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>www_challenge(&quot;rcs.jibemobile.com&quot;, &quot;0&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># USER authenticated - continue with setting keep alive values</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#For keep-alive negotiation RFC-6223</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$avp(1) = $(hdr(Via)[0]) ;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#If Keep header exists in via[0], initiate negotiation</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($avp(1) =~ &quot;keep&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#Different keep alive value if network access info. is provided</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($hdr(P-Access-Network-Info)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#Mobile Network</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($hdr(P-Access-Network-Info) =~ &quot;3GPP-GERAN&quot; ||</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$hdr(P-Access-Network-Info) =~ &quot;3GPP-UTRAN-TDD&quot; ||</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$hdr(P-Access-Network-Info) =~ &quot;3GPP-E-UTRAN-TDD&quot; ||</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$hdr(P-Access-Network-Info) =~ &quot;3GPP2-1X&quot; ||</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$hdr(P-Access-Network-Info) =~ &quot;3GPP2-1X-HRPD&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>avp_subst(&quot;$avp(1)/$avp(2)&quot;,&quot;/keep/keep=240/ig&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ($hdr(P-Access-Network-Info) =~ &quot;IEEE-802.16e&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#Wi-Max Network</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>avp_subst(&quot;$avp(1)/$avp(2)&quot;,&quot;/keep/keep=10/ig&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ($hdr(P-Access-Network-Info) =~ &quot;IEEE-802.11&quot; || $hdr(P-Access-Network-Info) =~ &quot;ethernet&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#Ethernet Network</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>avp_subst(&quot;$avp(1)/$avp(2)&quot;,&quot;/keep/keep=240/ig&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#Unknown</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>avp_subst(&quot;$avp(1)/$avp(2)&quot;,&quot;/keep/keep=0/ig&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if($var(network_mobile) != $var(network_wifi)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#No Access-Network-Info header, look at interface of which the request came in from</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(dst_ip == ...) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>avp_subst(&quot;$avp(1)/$avp(2)&quot;,&quot;/keep/keep=240/ig&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if(dst_ip == ...) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>avp_subst(&quot;$avp(1)/$avp(2)&quot;,&quot;/keep/keep=240/ig&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}&nbsp;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#Let client make the call since network is not identified</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>avp_subst(&quot;$avp(1)/$avp(2)&quot;,&quot;/keep/keep=240/ig&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#We can't trap REGISTER request's response object, so adding a new header instead</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; append_to_reply(&quot;J-Via: $avp(2)\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#SERV-1071: Add P-Associated-URI to successful REGISTER responses for Samsung</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>append_to_reply(&quot;P-Associated-URI: &lt;tel:$fU&gt;, &lt;sip:$fU@rcs.jibemobile.com&gt;\r\n&quot;);</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># IanB - ensure client TCP connections stay open</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (proto==TCP) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># Keep TCP/TLS connections open until the registration</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># expires, by setting the tcp_persistent_flag</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>setflag(tcp_persistent);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># TODO - check if this really required</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>force_rport();</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($hdr(User-Agent) !~ &quot;SRG&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;L_INFO&quot;, &quot;JIBE CN ($ci): NAT Fixing Register.\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>fix_nated_register();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#######################################################################</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># 200 OK or Error responses gets sent with save() action</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># Note: Any append_to_reply call will be too late after this point!</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#######################################################################</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># IanB - 'f' to force save as part of single registration configuration</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ( !save(&quot;location&quot;, &quot;f&quot;) ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>sl_reply_error();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (registered(&quot;location&quot;, &quot;$fu&quot;)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># store location for the user in the share location cache</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;JIBE CN ($ci): storing proxy: $var(local_location) for $tU\r\n&quot;);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; xlog(&quot;JIBE CN ($ci): contact expire=$ct.fields(expires) and hdr(Expires) = $hdr(Expires)\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># If expire header/contact param exists then specify cache timeout</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>$avp(expireValue) = $ct.fields(expires);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($avp(expireValue) == NULL) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp;if( is_present_hf(&quot;Expires&quot;) &amp;&amp; $(hdr(Expires){s.int}) != 0) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp; &nbsp; &nbsp;$avp(expireValue) = $(hdr(Expires){s.int});</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp;}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($avp(expireValue) != NULL) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp;#cache_store(&quot;sql&quot;,&quot;proxy_$tU&quot;,&quot;$var(local_location)&quot;, $(avp(expireValue){s.int}));</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp; &nbsp;#cache_store(&quot;sql&quot;,&quot;proxy_$tU&quot;,&quot;$var(local_location)&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># remove store location for the user in the share location cache</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;JIBE CN ($ci): removing proxy: $var(proxy_location) for $tU\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#cache_remove(&quot;sql&quot;, &quot;proxy_$tU&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span># SERV-783 MSRPS based on bearer</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;JIBE CN ($ci): Checking for bearer from P-Access-Network-Info header or network interface came through\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($hdr(P-Access-Network-Info)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#Mobile Network</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if ($hdr(P-Access-Network-Info) =~ &quot;3GPP&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;xlog(&quot;JIBE CN ($ci): P-Access-Network-Info header: 3GPP detected\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;append_hf(&quot;P-Network-Mode: Mobile\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if ($hdr(P-Access-Network-Info) =~ &quot;IEEE-802&quot; || $hdr(P-Access-Network-Info) =~ &quot;ethernet&quot;) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;xlog(&quot;JIBE CN ($ci): P-Access-Network-Info header: IEEE-802 or ethernet detected\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;append_hf(&quot;P-Network-Mode: Wifi\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;xlog(&quot;JIBE CN ($ci): P-Access-Network-Info header: unknown detected\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;#Unknown?</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if($var(network_mobile) != $var(network_wifi)) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>xlog(&quot;JIBE CN ($ci): No P-Access-Network-Info header found\nChecking interface received from...\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>#No Access-Network-Info header, look at interface of which the request came in from</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(dst_ip == 127.0.0.1) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;xlog(&quot;JIBE CN ($ci): message received on loopback interface\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if(dst_ip == ....) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;xlog(&quot;JIBE CN ($ci): message received on mobile interface\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;append_hf(&quot;P-Network-Mode: Mobile\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>} else if(dst_ip == ...) {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;xlog(&quot;JIBE CN ($ci): message received on wireless interface\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>&nbsp;append_hf(&quot;P-Network-Mode: Wifi\r\n&quot;);</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>route(third_party_register);<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>exit;</div>
<div>}</div>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
&nbsp;&nbsp;</div>
</body>
</html>