<div dir="ltr">Hi there,<br>I try very basic scenario with tracing sip dialogs in OpenSIPS 3.2.7, and this scenario leads in an endless loop inside Opensips for SIP messages.<br>Maybe someone is similarly affected or can point to the error on the route scenario? I use out of box residential configuration. I read the tracer module doc (<a href="https://opensips.org/docs/modules/devel/tracer.html">https://opensips.org/docs/modules/devel/tracer.html</a>), but dialog examples from doc also lead to loops.<br>I also tried with transactions, but they are looped too. Trace for messages works fine.  I think I miss some points.<br><br>MariaDB [opensips]> select method,COUNT(*) from sip_trace group by method;<br>+--------+----------+<br>| method | COUNT(*) |<br>+--------+----------+<br>| ACK    |     2625 |<br>| BYE    |     2270 |<br>| INVITE |      219 |<br>+--------+----------+<br><br>Below my config:<br><br># This script was generated via "make menuconfig", from<br>#   the "Residential" scenario.<br><br><br>####### Global Parameters #########<br><br>/* uncomment the following lines to enable debugging */<br>#debug_mode=yes<br><br>log_level=4<br>xlog_level=4<br>log_stderror=no<br>log_facility=LOG_LOCAL0<br><br>udp_workers=4<br><br>/* uncomment the next line to enable the auto temporary blacklisting of<br>   not available destinations (default disabled) */<br>#disable_dns_blacklist=no<br><br>/* uncomment the next line to enable IPv6 lookup after IPv4 dns<br>   lookup failures (default disabled) */<br>#dns_try_ipv6=yes<br><br><br>socket=udp:<a href="http://172.16.34.91:5060">172.16.34.91:5060</a>   # CUSTOMIZE ME<br>socket=tcp:<a href="http://172.16.34.91:5060">172.16.34.91:5060</a>   # CUSTOMIZE ME<br><br><br>####### Modules Section ########<br><br>#set module path<br>mpath="/usr/lib64/opensips/modules"<br><br>#### AVPOPS module<br>loadmodule "avpops.so"<br>modparam("avpops", "db_url", "mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br><br>#### HTTPD module<br>loadmodule "httpd.so"<br>modparam("httpd", "port", 8888)<br>modparam("httpd", "ip", "127.0.0.1")<br><br>####  MI_HTTP module<br>loadmodule "mi_http.so"<br>modparam("mi_http", "root", "mi")<br><br>#### JSON module<br>loadmodule "json.so"<br><br>#### SIGNALING module<br>loadmodule "signaling.so"<br><br>#### StateLess module<br>loadmodule "sl.so"<br><br>#### Transaction Module<br>loadmodule "tm.so"<br>modparam("tm", "fr_timeout", 5)<br>modparam("tm", "fr_inv_timeout", 30)<br>modparam("tm", "restart_fr_on_each_reply", 0)<br>modparam("tm", "onreply_avp_mode", 1)<br><br>#### Record Route Module<br>loadmodule "rr.so"<br>/* do not append from tag to the RR (no need for this script) */<br>modparam("rr", "append_fromtag", 0)<br>#modparam("rr", "append_fromtag", 1) # DL<br><br>#### MAX ForWarD module<br>loadmodule "maxfwd.so"<br><br>#### SIP MSG OPerationS module<br>loadmodule "sipmsgops.so"<br><br>#### FIFO Management Interface<br>loadmodule "mi_fifo.so"<br>modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")<br>modparam("mi_fifo", "fifo_mode", 0666)<br><br>#### MYSQL module<br>loadmodule "db_mysql.so"<br><br>#### PERMISSIONS module<br>loadmodule "permissions.so"<br>modparam("permissions", "db_url", "mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br><br>#### USeR LOCation module<br>loadmodule "usrloc.so"<br>modparam("usrloc", "nat_bflag", "NAT")<br>modparam("usrloc", "working_mode_preset", "single-instance-sql-write-back")<br>modparam("usrloc", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br><br>#### REGISTRAR module<br>loadmodule "registrar.so"<br>modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")<br>/* uncomment the next line not to allow more than 10 contacts per AOR */<br>#modparam("registrar", "max_contacts", 10)<br><br>#### ACCounting module<br>loadmodule "acc.so"<br>/* what special events should be accounted ? */<br>modparam("acc", "early_media", 0)<br>modparam("acc", "report_cancels", 0)<br>/* by default we do not adjust the direct of the sequential requests.<br>   if you enable this parameter, be sure to enable "append_fromtag"<br>   in "rr" module */<br>modparam("acc", "detect_direction", 0)<br>modparam("acc", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br><br>#### AUTHentication modules<br>loadmodule "auth.so"<br>loadmodule "auth_db.so"<br>modparam("auth_db", "calculate_ha1", yes)<br>modparam("auth_db", "password_column", "password")<br>modparam("auth_db", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br>modparam("auth_db", "load_credentials", "")<br><br>#### ALIAS module<br>loadmodule "alias_db.so"<br>modparam("alias_db", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br><br>#### DOMAIN module<br>loadmodule "domain.so"<br>modparam("domain", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br>modparam("domain", "db_mode", 1)   # Use caching<br>modparam("auth_db|usrloc", "use_domain", 1)<br><br>#### DIALOG module<br>loadmodule "dialog.so"<br>modparam("dialog", "dlg_match_mode", 1)<br>modparam("dialog", "default_timeout", 21600)  # 6 hours timeout<br>modparam("dialog", "db_mode", 2)<br>modparam("dialog", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br><br>####  DIALPLAN module<br>loadmodule "dialplan.so"<br>modparam("dialplan", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br><br>####  DYNAMMIC ROUTING module<br>loadmodule "drouting.so"<br>modparam("drouting", "db_url",<br>"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME<br>modparam("drouting", "use_partitions", 0)<br><br>#### TRACE module<br>loadmodule "tracer.so"<br>modparam("tracer", "trace_on", 1)<br>modparam("tracer", "trace_id","[tid]uri=mysql://opensips:opensipsrw@localhost/opensips;table=sip_trace;")<br>modparam("tracer", "trace_id","[tid]uri=sip:<a href="http://172.16.34.91:5060">172.16.34.91:5060</a>")<br>modparam("tracer", "trace_local_ip", "172.16.34.91")<br><br><br>#### TCP/UDP socket module<br><br>loadmodule "proto_udp.so"<br>loadmodule "proto_tcp.so"<br><br>####### Routing Logic ########<br><br># main request routing logic<br><br>route{<br><br>  if (!has_totag()) {<br>  if(is_method("INVITE") ) {<br>      # We need to use the dialog module to have the outgoing ACK traced<br>      trace("tid", "d", "sip");<br>}<br>  }<br>  else {<br>    match_dialog();<br>  }<br>#  if (!is_method("INVITE,ACK,BYE,PRACK")) {<br>#    # Requests that are not part of an established dialog will be transaction base traced<br>#    trace("tid", "t", "sip");<br>#xlog("Message not in dialog - $rm\n");<br>#  }<br>#  trace("tid", "t", "sip");<br><br><br>if (!mf_process_maxfwd_header(10)) {<br>send_reply(483,"Too Many Hops");<br>exit;<br>}<br><br><br><br>#if (has_totag()) {<br>#  loose_route();<br>#  if($DLG_status!=NULL)<br>#    if(!validate_dialog())<br>#      fix_route_dialog();<br>#}<br><br><br>if (has_totag()) {<br><br># handle hop-by-hop ACK (no routing required)<br>if ( is_method("ACK") && t_check_trans() ) {<br>t_relay();<br>exit;<br>}<br><br># sequential request within a dialog should<br># take the path determined by record-routing<br>if ( !loose_route() ) {<br># we do record-routing for all our traffic, so we should not<br># receive any sequential requests without Route hdr.<br>send_reply(404,"Not here");<br>exit;<br>}<br><br># validate the sequential request against dialog<br>if ( $DLG_status!=NULL && !validate_dialog() ) {<br>xlog("In-Dialog $rm from $si (callid=$ci) is not valid according to dialog\n");<br>## exit;<br>}<br><br>if (is_method("BYE")) {<br># do accounting even if the transaction fails<br>do_accounting("db","failed");<br>}<br><br># route it out to whatever destination was set by loose_route()<br># in $du (destination URI).<br>route(relay);<br>exit;<br><br>}<br><br><br><br># CANCEL processing<br>if (is_method("CANCEL")) {<br>if (t_check_trans())<br>t_relay();<br>exit;<br>}<br><br># absorb retransmissions, but do not create transaction<br>t_check_trans();<br><br>if ( !(is_method("REGISTER")  || is_from_gw() ) ) {<br><br>if (is_from_local()) {<br># authenticate if from local subscriber<br># authenticate all initial non-REGISTER request that pretend to be<br># generated by local subscriber (domain from FROM URI is local)<br>if (!proxy_authorize("", "subscriber")) {<br>proxy_challenge("", "auth");<br>exit;<br>}<br>if ($au!=$fU) {<br>send_reply(403,"Forbidden auth ID");<br>exit;<br>}<br><br>consume_credentials();<br># caller authenticated<br><br>} else {<br># if caller is not local, then called number must be local<br><br>if (!is_uri_host_local()) {<br>send_reply(403,"Relay Forbidden");<br>exit;<br>}<br>}<br><br>}<br><br># preloaded route checking<br>if (loose_route()) {<br>xlog("L_ERR",<br>"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");<br>if (!is_method("ACK"))<br>send_reply(403,"Preload Route denied");<br>exit;<br>}<br><br># record routing<br>if (!is_method("REGISTER|MESSAGE"))<br>record_route();<br><br># account only INVITEs<br>if (is_method("INVITE")) {<br><br># create dialog with timeout<br>if ( !create_dialog("B") ) {<br>send_reply(500,"Internal Server Error");<br>exit;<br>}<br><br>do_accounting("db");<br><br>}<br><br><br>if (!is_uri_host_local()) {<br>append_hf("P-hint: outbound\r\n");<br><br>route(relay);<br>}<br><br># requests for my domain<br><br>if (is_method("PUBLISH|SUBSCRIBE")) {<br>send_reply(503, "Service Unavailable");<br>exit;<br>}<br><br>if (is_method("REGISTER")) {<br># authenticate the REGISTER requests<br>if (!www_authorize("", "subscriber")) {<br>www_challenge("", "auth");<br>exit;<br>}<br><br>if ($au!=$tU) {<br>send_reply(403,"Forbidden auth ID");<br>exit;<br>}<br>if ($socket_in(proto) == "tcp")<br>setflag("TCP_PERSISTENT");<br><br># store the registration and generate a SIP reply<br>if (!save("location"))<br>xlog("failed to register AoR $tu\n");<br><br>exit;<br>}<br><br>if ($rU==NULL) {<br># request with no Username in RURI<br>send_reply(484,"Address Incomplete");<br>exit;<br>}<br><br><br># apply DB based aliases<br>alias_db_lookup("dbaliases");<br><br><br># apply transformations from dialplan table<br><br>$avp(src) = $rU;<br>dp_translate(10, "$rU", $rU, $var(attrs));<br>xlog("Successfully translate from $avp(src) to $rU attr = $var(attrs)\n");<br><br><br>if (dp_translate(10,"$rU/$rU") ) {<br><br>#strip(1);<br>if (!do_routing(0)) {<br>send_reply(500,"No PSTN Route found");<br>exit;<br>}<br><br>route(relay);<br>exit;<br>}<br><br><br># do lookup with method filtering<br>if (!lookup("location","m")) {<br>if (!db_does_uri_exist("$ru","subscriber")) {<br>send_reply(420,"Bad Extension");<br>exit;<br>}<br><br>t_reply(404, "Not Found");<br>exit;<br>}<br><br><br><br># when routing via usrloc, log the missed calls also<br>do_accounting("db","missed");<br><br>route(relay);<br>}<br><br><br>route[relay] {<br># for INVITEs enable some additional helper routes<br># check_source_address(0) - mean any sources in address table<br><br>if (is_method("INVITE") && check_source_address(0)) {<br><br><br>t_on_branch("per_branch_ops");<br>t_on_reply("handle_nat");<br>t_on_failure("missed_call");<br>}<br><br>if (is_method("INVITE") && !check_source_address(0)) {<br>send_reply(403,"Forbidden");<br>}<br><br><br><br>if (!t_relay()) {<br>send_reply(500,"Internal Error");<br>}<br>exit;<br>}<br><br>branch_route[per_branch_ops] {<br><br>xlog("new branch at $ru\n");<br>}<br><br><br>onreply_route[handle_nat] {<br><br>xlog("incoming reply\n");<br>}<br><br><br>failure_route[missed_call] {<br>if (t_was_cancelled()) {<br>exit;<br>}<br><br># uncomment the following lines if you want to block client<br># redirect based on 3xx replies.<br>##if (t_check_status("3[0-9][0-9]")) {<br>##t_reply(404,"Not found");<br>## exit;<br>##}<br><div>}</div><div><br></div><div><br></div><div>BR, Pavel<br></div></div>