[OpenSIPS-Users] OpenSIPS 3.2.7 tracer module for sip dialogs leads to an endless loop

Pavel Ekshin pavel.ekshine at gmail.com
Tue Aug 30 18:31:08 UTC 2022


Hi there,
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.
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 (https://opensips.org/docs/modules/devel/tracer.html), but
dialog examples from doc also lead to loops.
I also tried with transactions, but they are looped too. Trace for messages
works fine.  I think I miss some points.

MariaDB [opensips]> select method,COUNT(*) from sip_trace group by method;
+--------+----------+
| method | COUNT(*) |
+--------+----------+
| ACK    |     2625 |
| BYE    |     2270 |
| INVITE |      219 |
+--------+----------+

Below my config:

# This script was generated via "make menuconfig", from
#   the "Residential" scenario.


####### Global Parameters #########

/* uncomment the following lines to enable debugging */
#debug_mode=yes

log_level=4
xlog_level=4
log_stderror=no
log_facility=LOG_LOCAL0

udp_workers=4

/* uncomment the next line to enable the auto temporary blacklisting of
   not available destinations (default disabled) */
#disable_dns_blacklist=no

/* uncomment the next line to enable IPv6 lookup after IPv4 dns
   lookup failures (default disabled) */
#dns_try_ipv6=yes


socket=udp:172.16.34.91:5060   # CUSTOMIZE ME
socket=tcp:172.16.34.91:5060   # CUSTOMIZE ME


####### Modules Section ########

#set module path
mpath="/usr/lib64/opensips/modules"

#### AVPOPS module
loadmodule "avpops.so"
modparam("avpops", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
# CUSTOMIZE ME

#### HTTPD module
loadmodule "httpd.so"
modparam("httpd", "port", 8888)
modparam("httpd", "ip", "127.0.0.1")

####  MI_HTTP module
loadmodule "mi_http.so"
modparam("mi_http", "root", "mi")

#### JSON module
loadmodule "json.so"

#### SIGNALING module
loadmodule "signaling.so"

#### StateLess module
loadmodule "sl.so"

#### Transaction Module
loadmodule "tm.so"
modparam("tm", "fr_timeout", 5)
modparam("tm", "fr_inv_timeout", 30)
modparam("tm", "restart_fr_on_each_reply", 0)
modparam("tm", "onreply_avp_mode", 1)

#### Record Route Module
loadmodule "rr.so"
/* do not append from tag to the RR (no need for this script) */
modparam("rr", "append_fromtag", 0)
#modparam("rr", "append_fromtag", 1) # DL

#### MAX ForWarD module
loadmodule "maxfwd.so"

#### SIP MSG OPerationS module
loadmodule "sipmsgops.so"

#### FIFO Management Interface
loadmodule "mi_fifo.so"
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("mi_fifo", "fifo_mode", 0666)

#### MYSQL module
loadmodule "db_mysql.so"

#### PERMISSIONS module
loadmodule "permissions.so"
modparam("permissions", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips")
# CUSTOMIZE ME

#### USeR LOCation module
loadmodule "usrloc.so"
modparam("usrloc", "nat_bflag", "NAT")
modparam("usrloc", "working_mode_preset", "single-instance-sql-write-back")
modparam("usrloc", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME

#### REGISTRAR module
loadmodule "registrar.so"
modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")
/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam("registrar", "max_contacts", 10)

#### ACCounting module
loadmodule "acc.so"
/* what special events should be accounted ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_cancels", 0)
/* by default we do not adjust the direct of the sequential requests.
   if you enable this parameter, be sure to enable "append_fromtag"
   in "rr" module */
modparam("acc", "detect_direction", 0)
modparam("acc", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME

#### AUTHentication modules
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME
modparam("auth_db", "load_credentials", "")

#### ALIAS module
loadmodule "alias_db.so"
modparam("alias_db", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME

#### DOMAIN module
loadmodule "domain.so"
modparam("domain", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME
modparam("domain", "db_mode", 1)   # Use caching
modparam("auth_db|usrloc", "use_domain", 1)

#### DIALOG module
loadmodule "dialog.so"
modparam("dialog", "dlg_match_mode", 1)
modparam("dialog", "default_timeout", 21600)  # 6 hours timeout
modparam("dialog", "db_mode", 2)
modparam("dialog", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME

####  DIALPLAN module
loadmodule "dialplan.so"
modparam("dialplan", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME

####  DYNAMMIC ROUTING module
loadmodule "drouting.so"
modparam("drouting", "db_url",
"mysql://opensips:opensipsrw@localhost/opensips") # CUSTOMIZE ME
modparam("drouting", "use_partitions", 0)

#### TRACE module
loadmodule "tracer.so"
modparam("tracer", "trace_on", 1)
modparam("tracer",
"trace_id","[tid]uri=mysql://opensips:opensipsrw@localhost
/opensips;table=sip_trace;")
modparam("tracer", "trace_id","[tid]uri=sip:172.16.34.91:5060")
modparam("tracer", "trace_local_ip", "172.16.34.91")


#### TCP/UDP socket module

loadmodule "proto_udp.so"
loadmodule "proto_tcp.so"

####### Routing Logic ########

# main request routing logic

route{

  if (!has_totag()) {
  if(is_method("INVITE") ) {
      # We need to use the dialog module to have the outgoing ACK traced
      trace("tid", "d", "sip");
}
  }
  else {
    match_dialog();
  }
#  if (!is_method("INVITE,ACK,BYE,PRACK")) {
#    # Requests that are not part of an established dialog will be
transaction base traced
#    trace("tid", "t", "sip");
#xlog("Message not in dialog - $rm\n");
#  }
#  trace("tid", "t", "sip");


if (!mf_process_maxfwd_header(10)) {
send_reply(483,"Too Many Hops");
exit;
}



#if (has_totag()) {
#  loose_route();
#  if($DLG_status!=NULL)
#    if(!validate_dialog())
#      fix_route_dialog();
#}


if (has_totag()) {

# handle hop-by-hop ACK (no routing required)
if ( is_method("ACK") && t_check_trans() ) {
t_relay();
exit;
}

# sequential request within a dialog should
# take the path determined by record-routing
if ( !loose_route() ) {
# we do record-routing for all our traffic, so we should not
# receive any sequential requests without Route hdr.
send_reply(404,"Not here");
exit;
}

# validate the sequential request against dialog
if ( $DLG_status!=NULL && !validate_dialog() ) {
xlog("In-Dialog $rm from $si (callid=$ci) is not valid according to
dialog\n");
## exit;
}

if (is_method("BYE")) {
# do accounting even if the transaction fails
do_accounting("db","failed");
}

# route it out to whatever destination was set by loose_route()
# in $du (destination URI).
route(relay);
exit;

}



# CANCEL processing
if (is_method("CANCEL")) {
if (t_check_trans())
t_relay();
exit;
}

# absorb retransmissions, but do not create transaction
t_check_trans();

if ( !(is_method("REGISTER")  || is_from_gw() ) ) {

if (is_from_local()) {
# authenticate if from local subscriber
# authenticate all initial non-REGISTER request that pretend to be
# generated by local subscriber (domain from FROM URI is local)
if (!proxy_authorize("", "subscriber")) {
proxy_challenge("", "auth");
exit;
}
if ($au!=$fU) {
send_reply(403,"Forbidden auth ID");
exit;
}

consume_credentials();
# caller authenticated

} else {
# if caller is not local, then called number must be local

if (!is_uri_host_local()) {
send_reply(403,"Relay Forbidden");
exit;
}
}

}

# preloaded route checking
if (loose_route()) {
xlog("L_ERR",
"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
if (!is_method("ACK"))
send_reply(403,"Preload Route denied");
exit;
}

# record routing
if (!is_method("REGISTER|MESSAGE"))
record_route();

# account only INVITEs
if (is_method("INVITE")) {

# create dialog with timeout
if ( !create_dialog("B") ) {
send_reply(500,"Internal Server Error");
exit;
}

do_accounting("db");

}


if (!is_uri_host_local()) {
append_hf("P-hint: outbound\r\n");

route(relay);
}

# requests for my domain

if (is_method("PUBLISH|SUBSCRIBE")) {
send_reply(503, "Service Unavailable");
exit;
}

if (is_method("REGISTER")) {
# authenticate the REGISTER requests
if (!www_authorize("", "subscriber")) {
www_challenge("", "auth");
exit;
}

if ($au!=$tU) {
send_reply(403,"Forbidden auth ID");
exit;
}
if ($socket_in(proto) == "tcp")
setflag("TCP_PERSISTENT");

# store the registration and generate a SIP reply
if (!save("location"))
xlog("failed to register AoR $tu\n");

exit;
}

if ($rU==NULL) {
# request with no Username in RURI
send_reply(484,"Address Incomplete");
exit;
}


# apply DB based aliases
alias_db_lookup("dbaliases");


# apply transformations from dialplan table

$avp(src) = $rU;
dp_translate(10, "$rU", $rU, $var(attrs));
xlog("Successfully translate from $avp(src) to $rU attr = $var(attrs)\n");


if (dp_translate(10,"$rU/$rU") ) {

#strip(1);
if (!do_routing(0)) {
send_reply(500,"No PSTN Route found");
exit;
}

route(relay);
exit;
}


# do lookup with method filtering
if (!lookup("location","m")) {
if (!db_does_uri_exist("$ru","subscriber")) {
send_reply(420,"Bad Extension");
exit;
}

t_reply(404, "Not Found");
exit;
}



# when routing via usrloc, log the missed calls also
do_accounting("db","missed");

route(relay);
}


route[relay] {
# for INVITEs enable some additional helper routes
# check_source_address(0) - mean any sources in address table

if (is_method("INVITE") && check_source_address(0)) {


t_on_branch("per_branch_ops");
t_on_reply("handle_nat");
t_on_failure("missed_call");
}

if (is_method("INVITE") && !check_source_address(0)) {
send_reply(403,"Forbidden");
}



if (!t_relay()) {
send_reply(500,"Internal Error");
}
exit;
}

branch_route[per_branch_ops] {

xlog("new branch at $ru\n");
}


onreply_route[handle_nat] {

xlog("incoming reply\n");
}


failure_route[missed_call] {
if (t_was_cancelled()) {
exit;
}

# uncomment the following lines if you want to block client
# redirect based on 3xx replies.
##if (t_check_status("3[0-9][0-9]")) {
##t_reply(404,"Not found");
## exit;
##}
}


BR, Pavel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20220830/b992a315/attachment.html>


More information about the Users mailing list