[Kamailio-Users] Having Problem routing an ACK

Stagg Shelton stagg at sheltonjohns.com
Mon Aug 25 15:30:47 CEST 2008


The auto_aliases default is "on" according to the core cookbook for  
1.3.x so I did not add that to my configuration.  I did add  
alias=8.17.32.184:5060 per your suggestion and the ACK still continues  
in the infinite loop until the max hops is reached.   I am using  
loose_route() if (has_totag() == true).  I am pasting a copy of my  
openser config below for additional information on my specific  
configuration.

Thank You
Stagg Shelton

#
# $Id: openser.cfg 3542 2008-01-16 15:00:34Z miconda $
#
# OpenSER basic configuration script
#     by Anca Vamanu <anca at voice-system.ro>
#
# Please refer to the Core CookBook at http://www.openser.org/dokuwiki/doku.php
# for a explanation of possible statements, functions and parameters.
#


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

debug=3
log_stderror=no
log_facility=LOG_LOCAL0

fork=yes
children=4

/* uncomment the following lines to enable debugging */
#debug=6
#fork=no
#log_stderror=yes

/* uncomment the next line to disable TCP (default on) */
disable_tcp=yes

port=5060

alias=8.17.32.184:5060

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

#set module path
mpath="//lib/openser/modules/"

loadmodule "mysql.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri_db.so"
loadmodule "uri.so"
loadmodule "xlog.so"
loadmodule "acc.so"
loadmodule "auth.so"
loadmodule "auth_db.so"
loadmodule "avpops.so"
loadmodule "alias_db.so"
loadmodule "permissions.so"
loadmodule "carrierroute.so"
loadmodule "snmpstats.so"
loadmodule "dialog.so"
loadmodule "group.so"
loadmodule "options.so"

/* uncomment next line for multi-domain support
    NOTE: a DB (like mysql) module must be also loaded
    NOTE: be sure and enable multi-domain support in all used modules
          (see "multi-module params" section ) */
#loadmodule "domain.so"


# ----------------- setting module-specific parameters ---------------


# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/openser_fifo")


# ----- rr params -----
# add value to ;lr param to cope with most of the UAs
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 0)


# ----- rr params -----
modparam("registrar", "method_filtering", 1)
/* uncomment the next line to disable parallel forking via location */
# modparam("registrar", "append_branches", 0)
/* uncomment the next line not to allow more than 10 contacts per AOR */
#modparam("registrar", "max_contacts", 10)


# ----- uri_db params -----
/* by default we disable the DB support in the module as we do not  
need it
    in this configuration */
modparam("uri_db", "use_uri_table", 0)
modparam("uri_db", "db_url", "")


# ----- acc params -----
/* what sepcial events should be accounted ? */
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
/* by default ww do not adjust the direct of the sequential requests.
    if you enable this parameter, be sure the enable "append_fromtag"
    in "rr" module */
modparam("acc", "detect_direction", 0)

/* account triggers (flags) */
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)
#modparam("acc","db_extra", "acc_extra=$var(accounting); acc_to= 
$var(numdialed)")
modparam("acc","db_extra", "acc_extra=$var(accounting); acc_to= 
$var(numdialed); acc_direction=$var(direction)")
#modparam("acc","db_extra", "acc_extra=$au; email=$avp(s:email)")
modparam("acc", "db_url", "mysql://openser:oserdbpass@localhost/ 
openser")

# ----- usrloc params -----
modparam("usrloc", "db_mode",   2)
modparam("usrloc", "db_url","mysql://openser:oserdbpass@localhost/ 
openser")


# ----- auth_db params -----
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "db_url","mysql://openser:oserdbpass@localhost/ 
openser")
modparam("auth_db", "load_credentials", "")


# ----- alias_db params -----
modparam("alias_db", "db_url","mysql://openser:oserdbpass@localhost/ 
openser")

# ----- permissions params -----
modparam("permissions", "db_url","mysql://openser:oserdbpass@localhost/ 
openser")

# ----- carrierroute params -----
modparam("carrierroute", "config_source", "db")
modparam("carrierroute", "db_url", "mysql:// 
openser:oserdbpass at localhost/openser")

# ----- smpstats params -----
modparam("snmpstats", "sipEntityType", "registrarServer")
modparam("snmpstats", "sipEntityType", "proxyServer")
modparam("snmpstats", "snmpCommunity", "snmppass")
modparam("snmpstats", "snmpgetPath", "/usr/bin/")

# ----- dialog params -----
modparam("dialog", "enable_stats", 1)
modparam("dialog", "dlg_flag", 4)
modparam("dialog", "db_mode", 1)
modparam("dialog", "db_url", "mysql://openser:oserdbpass@localhost/ 
openser")

# ----- group params -----
modparam("group", "db_url", "mysql://openser:oserdbpass@localhost/ 
openser")


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


# main request routing logic

route{
	$var(accounting) = "";
	$var(numdialed) = "";
	$var(direction) = "";


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

	# Options responder
	if (uri==myself) {
		if ((method==OPTIONS) && (! uri=~"sip:.*[@]+.*")) {
			options_reply();
		}
	}

	if (has_totag()) {
		# sequential request withing a dialog should
		# take the path determined by record-routing
		if (loose_route()) {
			if (is_method("BYE")) {
				setflag(1); # do accouting ...
				setflag(3); # ... even if the transaction fails
			}
			route(1);
		} else {
			if ( is_method("ACK") ) {
				if ( t_check_trans() ) {
					# non loose-route, but stateful ACK; must be an ACK after a 487  
or e.g. 404 from upstream server
					t_relay();
					exit;
				} else {
					# ACK without matching transaction ... ignore and discard.\n");
					exit;
				}
			}
			sl_send_reply("404","Not here");
		}
		exit;
	}

	#initial requests

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

	t_check_trans();

         if (!(method=="REGISTER"))
         {
	  if (!allow_trusted())
	  {
                 if (!proxy_authorize("", "subscriber")) {
	  	  $var(debug) = proxy_authorize("", "subscriber");
		  xlog("L_INFO", "Proxy authentication failed - M=$rm RURI=$ru F=$fu  
T=$tu IP=$si ID=$ci\n");
		  xlog("Not Proxy Authorize: $var(debug)");
                         proxy_challenge("", "0");
                         exit;
                 }

                 consume_credentials();
                 # caller authenticated
	  }
         }

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

	if (method=="INVITE"||method=="BYE"||method=="CANCEL") {
           setflag(4);
	}

	if (!uri==myself)
	{
		append_hf("P-hint: outbound\r\n");
		route(1);
	}

	# requests for my domain

	if (is_method("PUBLISH"))
	{
		sl_send_reply("503", "Service Unavailable");
		exit;
	}
	

	if (is_method("REGISTER"))
	{
		if (!www_authorize("", "subscriber"))
		{
			www_challenge("", "0");
			exit;
		}
		
		if (!check_to())
		{
			sl_send_reply("403","Forbidden auth ID");
			exit;
		}

		if (!save("location"))
			sl_reply_error();

		exit;
	}

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

	alias_db_lookup("dbaliases");
	$var(accounting) = $rU;
	xlog ("After alias db lookup: $rU");
	remove_hf("Diversion");
	if (!lookup("location")) {
		switch ($retcode) {
			case -1:
			case -3:
				if (uri=~"^sip:[0-9]{10}@")    # Domestic PSTN
				{
                         	  route(4);
                         	  exit;
                 		}
				else if (uri=~"^sip:1[0-9]{10}@")    # Domestic PSTN
				{
                         	  route(4);
                         	  exit;
                 		}
				else if (uri=~"^sip:011[0-9][0-9]+@")    # International PSTN
				{
                         	  route(3);
                         	  exit;
                 		};

                 		t_reply("404", "User Not Found");
                 		exit;
			case -2:
				sl_send_reply("405", "Method Not Allowed");
				exit;
		}
	}
	else
	{
	  $rU = $oU;
	  $var(numdialed) = $rU;
           $var(direction)="inbound";
	}
	# when routing via usrloc, log the missed calls also
	setflag(2);

	route(1);
}


route[1] {
	# for INVITEs enable some additional helper routes
	if (is_method("INVITE")) {
           	xlog("aubrey direction $var(direction)");
		setflag(1);
		setflag(4);
		t_on_branch("2");
		t_on_reply("2");
		t_on_failure("1");
	}
	
	if (!t_relay()) {
		sl_reply_error();
	};
	exit;
}

route[3] {

         #  
-----------------------------------------------------------------
         # PSTN International Handler
         #  
-----------------------------------------------------------------
	$var(accounting) = $au;
	$var(numdialed) = $rU;
         $var(direction)="outbound";

         if(!is_user_in("Credentials", "international")){
           sl_send_reply("403", "Forbidden: No Intl Service");
           exit;
         }

	cr_user_rewrite_uri("sip:$au at .*","mydomain.net");
         $avp(s:inv_timeout) = 45;

         route(1);
}


route[4] {

         #  
-----------------------------------------------------------------
         # PSTN Handler
         #  
-----------------------------------------------------------------
	$var(accounting) = $au;
	$var(numdialed) = $rU;
         $var(direction)="outbound";

	cr_user_rewrite_uri("sip:$au at .*","mydomain.net");
         $avp(s:inv_timeout) = 45;

         route(1);
}

branch_route[2] {
	xlog("new branch at $ru\n");
}


onreply_route[2] {
	xlog("incoming reply $rm\n");
	xlog("$rb\n");
}


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


On Aug 25, 2008, at 5:04 AM, Iñaki Baz Castillo wrote:

> El Saturday 23 August 2008 16:57:42 Stagg Shelton escribió:
>> Thanks again Iñaki.  I am attaching siptrace.txt file.  I can see  
>> that
>> there appears to be something odd with the ACKs in that they appear  
>> to
>> be sent from my openser back to my openser in a loop until the max
>> forwards is reached.
>
> Hi, just to clarify: is it your nre carrier an Asterisk? It's not  
> the problem
> anyway.
>
> The problem is in your OpenSer ACK handling. Note that:
>
> --------------------
> U +0.072541 phone:5060 -> OpenSer:5060
> ACK sip:+16783832765 at OpenSer SIP/2.0*
> Via: SIP/2.0/UDP phone:5060;branch=z9hG4bK-8922-48b022e5- 
> dcaa5757-3884948f*
> Contact: <sip:restricted at phone:5060;transport=udp>*
> Route: <sip:OpenSer;lr;did=952.4d684275>*
>
> #
> U +0.002367 OpenSer:5060 -> OpenSer:5060
> ACK sip:OpenSer;lr;did=952.4d684275 SIP/2.0*
> Via: SIP/2.0/UDP OpenSer;branch=z9hG4bKc29c.498b5a5.2*
> Via: SIP/2.0/UDP phone:5060;branch=z9hG4bK-8922-48b022e5- 
> dcaa5757-3884948f*
> Contact: <sip:restricted at phone:5060;transport=udp>*
>
> #
> U +0.000072 OpenSer:5060 -> OpenSer:5060
> ACK sip:OpenSer;lr;did=952.4d684275 SIP/2.0*
> Via: SIP/2.0/UDP OpenSer;branch=z9hG4bKc29c.498b5a5.2*
> Via: SIP/2.0/UDP OpenSer;branch=z9hG4bKc29c.498b5a5.2*
> Via: SIP/2.0/UDP phone:5060;branch=z9hG4bK-8922-48b022e5- 
> dcaa5757-3884948f*
> Contact: <sip:restricted at phone:5060;transport=udp>*
> --------------------
>
> The problem is that your OpenSer receives an ACK (a new request in- 
> dialog
> since it's an ACK for a 200 OK) with a "Route: sip:OpenSer". This is  
> correct
> of course.
> So your OpenSer should do loose_route() and detect "OpenSer" IP as  
> an own
> ip/domain so it would remove the Route and route the ACK to the RURI
> (Asterisk IP).
> But OpenSer doesn't realiza the OpenSer IP is itself so it doesn't  
> remove the
> Route and routes the ACK according to that Route, this is, doing  
> INFINITE
> loops to itself.
>
> So you must fix it by adding you OpenSer IP as an alias in the top  
> of your
> OpenSer script:
>
>  alias = OpenSer_IP:5060
>
> or maybe it's enough with:
>
>  auto_aliases=yes
>
> Hope you understood me. If not see me.
>
>
>
>
>
> -- 
> Iñaki Baz Castillo
> ibc at in.ilimit.es
>
> _______________________________________________
> Users mailing list
> Users at lists.kamailio.org
> http://lists.kamailio.org/cgi-bin/mailman/listinfo/users





More information about the sr-users mailing list