[OpenSIPS-Users] opensips+asterisk: signalling not working?

Vallimamod ABDULLAH vallimamod.abdullah at imtelecom.fr
Wed Oct 6 11:59:11 CEST 2010


Hi Stefano,

The 20s timeout is typically an ACK timeout (as someone reminded it on the list some time ago.) The asterisk log you pasted confirm it: the final ACK never reaches back Opensips so the dialog is cut down after the timeout.

Make a sip trace on your asterisk box to see where the ACK is sent. Maybe you need to enable nat on asterisk to force it to send the ACK to the originating IP and not the IP of the contact field. Have a look at http://www.voip-info.org/wiki/view/Asterisk+sip+nat

Regards,
- vma
.


On Oct 6, 2010, at 11:11 AM, Stefano Sasso wrote:

> Hello folks,
> here I am again :)
> 
>  I have a setup where I use opensips as registration+proxy and
> asterisk as media gateway.
> When I place a call I can correctly hear the call audio (so RTP flow
> is ok), and the callee can hear my voice too, but after 20 seconds the
> call hangs up.
> In the asterisk logs I found the following lines:
> [Oct  6 10:29:54] WARNING[25602]: chan_sip.c:3778 retrans_pkt: Maximum
> retries exceeded on transmission
> NjZjMmI2MWRlYmY0YWYwMGVhYTAyNmE0NzU4OWU5YTk. for seqno 2 (Critical
> Response) -- See doc/sip-retransmit.txt.
> [Oct  6 10:29:54] WARNING[25602]: chan_sip.c:3805 retrans_pkt: Hanging
> up call NjZjMmI2MWRlYmY0YWYwMGVhYTAyNmE0NzU4OWU5YTk. - no reply to our
> critical packet (see doc/sip-retransmit.txt).
> 
> it seems that the signalling that pass through opensips does not work
> correctly...
> this is a part of my asterisk configuration:
> 
> rtpstart=10001
> rtpend=15000
> 
> externip = 77.238.xx.yy
> localnet=192.168.6.131/255.255.255.255
> localnet=192.168.6.132/255.255.255.255
> 
> [ser_phones]
> type=friend
> context=from_inbound_ser
> host=192.168.6.130
> insecure=very
> disallow=all
> allow=gsm
> 
> 
> opensips.cfg (relevant parts, not modules config.)
> route{
> 
> 	if (!mf_process_maxfwd_header("10")) {
> 		sl_send_reply("483","Too Many Hops");
> 		exit;
> 	}
> 
> 	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 accounting ...
> 				setflag(3); # ... even if the transaction fails
> 			} else if (is_method("INVITE")) {
> 				# even if in most of the cases is useless, do RR for
> 				# re-INVITEs alos, as some buggy clients do change route set
> 				# during the dialog.
> 				record_route();
> 			}
> 			# route it out to whatever destination was set by loose_route()
> 			# in $du (destination URI).
> 			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
> 					exit;
> 				}
> 			}
> 			sl_send_reply("404","Not here");
> 		}
> 		exit;
> 	}
> 
> 	#initial requests
> 
> 	# CANCEL processing
> 	if (is_method("CANCEL"))
> 	{
> 		if (t_check_trans())
> 			t_relay();
> 		exit;
> 	}
> 
> 	t_check_trans();
> 
> 	# authenticate if from local subscriber
> 	if (!(method=="REGISTER") && is_from_local())  /*multidomain version*/
> 	{
> 		if (!proxy_authorize("", "subscriber")) {
> 			proxy_challenge("", "0");
> 			exit;
> 		}
> 		if (!db_check_from()) {
> 			sl_send_reply("403","Forbidden auth ID");
> 			exit;
> 		}
> 	
> 		consume_credentials();
> 		# caller authenticated
> 		xlog("[AUTH] PROXY for $fu ($si:$sp) OK");
> 	}
> 
> 	# preloaded route checking
> 	if (loose_route()) {
> 		xlog("L_ERR",
> 		"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
> 		if (!is_method("ACK"))
> 			sl_send_reply("403","Preload Route denied");
> 		exit;
> 	}
> 
> 	# record routing
> 	if (!is_method("REGISTER|MESSAGE"))
> 		record_route();
> 
> 	# account only INVITEs
> 	if (is_method("INVITE")) {
> 		setflag(1); # do accounting
> 		setflag(2); # for success or missed call
> 		xlog("[SIP_INVITE] sip_from=$fu sip_to=$ru c_from=$fU c_to=$rU
> client=$si:$sp call_id=$ci c_seq=$cs");
> 	}
> 	
> 	if (!is_uri_host_local())
> 	{
> 		append_hf("P-hint: outbound\r\n");
> 		xlog("[OUTBOUND_NL] Routing message from $si");
> 		route(1);
> 	}
> 
> 	# requests for my domain
> 
> 
> 	if (is_method("REGISTER"))
> 	{
> 		xlog("Enter REGISTER from $si:$sp");
> 		# authenticate the REGISTER requests (uncomment to enable auth)
> 		$var(auth_code) = www_authorize("", "subscriber");
> 		if ( $var(auth_code) == -1 || $var(auth_code) == -2) {
> 			xlog("[AUTH] ERROR for $fU@$fd from $si cause $var(auth_code)");
> 		}
> 		else
> 		{
> 			xlog("[AUTH] OK for $fU@$fd from $si port $sp auth_code=$var(auth_code)");
> 		}
> 		if ( $var(auth_code) < 0 )
> 		{
> 			www_challenge("", "0");
> 			exit;
> 		}
> 		
> 		if (!db_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;
> 	}
> 	
> 	xlog("Checking for ASTERISK HOOKS, rU=$rU");
> 	### ASTERISK HOOK for demo 101 (echo test)
> 	if ($rU=~"^101$") {
> 		xlog("Entered Asterisk HOOK for 101");
> 		
> 		if (!is_from_local()) {
> 			send_reply("403", "Forbidden access to media service");
> 			exit;
> 		}
> 		
> 		#rewritehostport("192.168.6.131:5060");
> 		if (!load_balance("1", "vc")) {
> 			xlog("LOAD_BALANCE Service is FULL");
> 			sl_send_reply("500", "Service FULL");
> 			exit;
> 		}
> 		else {
> 			xlog("LOAD_BALANCE Sending CALL to $du\n");
> 		}
> 		t_relay();
> 		exit;
> 	
> 	}
> 	
> 	### ASTERISK HOOK for external calling
> 	if ($rU=~"^0[0-9]+") {
> 		xlog("Entered Asterisk HOOK for 0*");
> 		
> 		if (!is_from_local()) {
> 			send_reply("403", "Forbidden access to media service");
> 			exit;
> 		}
> 		
> 		#rewritehostport("192.168.6.131:5060");
> 		if (!load_balance("1", "vc")) {
>                        xlog("LOAD_BALANCE Service is FULL");
>                       	sl_send_reply("500", "Service FULL");
>                       	exit;
>               	}
>                else {
>                       	xlog("LOAD_BALANCE Sending CALL to $du\n");
>                }
> 
> 		t_relay();
> 		exit;
> 	
> 	}
> 	
> 	
> 	### ASTERISK HOOK end
> 	
> 	
> 	# do lookup with method filtering
> 	if (!lookup("location","m")) {
> 		switch ($retcode) {
> 			case -1:
> 			case -3:
> 				t_newtran();
> 				t_reply("404", "Not Found");
> 				exit;
> 			case -2:
> 				sl_send_reply("405", "Method Not Allowed");
> 				exit;
> 		}
> 	}
> 
> 	# when routing via usrloc, log the missed calls also
> 	setflag(2);
> 
> 	route(1);
> }
> 
> 
> route[1] {
> 	if (!t_relay()) {
> 		sl_reply_error();
> 	};
> 	exit;
> }
> 
> 
> 
> 
> 
> the network configuration is the following (yes, there is a lot of nat
> here, but I don't have other chances...)
> opensips ip: 192.168.6.130
> asterisk ip (2 boxes): 192.168.6.131, 192.168.6.132
> 77.238.xx.yy port 5060 DNAT to 192.168.6.130 port 5060
> 77.238.xx.yy port 10000-15000 DNAT to 192.168.6.131 port 10000-15000
> 77.238.xx.yy port 15001-20000 DNAT to 192.168.6.132 port 15001-20000
> 
> 
> where am I wrong? :(
> sorry for stupid questions, but it's the first time I have to create a
> multi-box scenario...
> 
> could I resolve inserting in asterisk config.
> externip = 77.238.xx.yy:5071
> and having DNAT 77.238.xx.yy:5071 to 192.168.6.131:5060?
> (different ports for box #1 and #2, obviously :) )
> 
> thanks!
> 
> PS sorry for my english
> 
> -- 
> Stefano Sasso
> http://stefano.dscnet.org/
> 
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users




More information about the Users mailing list