[Kamailio-Users] SDP IP address not rewritten

Vikram Ragukumar vragukumar at signalogic.com
Tue Feb 9 01:25:13 CET 2010


Hello,

I am running Kamailio version 1.5 and rtpproxy version 1.2. I have 
enabled NAT support in Kamailio.cfg. I have a UA behind NAT (UA 
IP:192.168.2.101), and the UA registers with an Asterisk server (Public 
IP) through an outbound proxy running Kamailio and rtpproxy with Public IP.

Registration succeeds, however when making an outbound call from the UA 
to a cellphone, there is only one sided voice. This is happening because 
Asterisk is addressing rtp streams to the UA's local IP address instead 
of its PublicIP:port.

Why is the IP address not being rewritten in the SDP ? Is there an 
alternate way of invoking rtpproxy (with flags) such that the IP address 
in the SDP is rewritten ?

Thanks and Regards,
Vikram.

PS : Below is the main routing section of my kamailio.cfg

route{
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}
	# NAT detection
	route(4);
	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
			}
			route(1);
		} else {
			if (is_method("SUBSCRIBE") && uri == myself) {
				# in-dialog subscribe requests
				route(2);
				exit;
			}
			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;
	}
	# CANCEL processing
	if (is_method("CANCEL"))
	{
		if (t_check_trans())
			t_relay();
		exit;
	}
	t_check_trans();
         # record routing
	if (!is_method("REGISTER|MESSAGE"))
		record_route();
	# account only INVITEs
	if (is_method("INVITE")) {
		setflag(1); # do accounting
	}
	if (!uri==myself)
	{
		append_hf("P-hint: outbound\r\n");
		route(1);
	}
	# requests for my domain
	if( is_method("PUBLISH|SUBSCRIBE"))
		route(2);
	if (is_method("REGISTER"))
	{
		if (isflagset(5)) {
			setbflag(6);
#			setbflag(7);
		}
		if (!save("location"))
			sl_reply_error();
		exit;
        }
	if ($rU==NULL) {
		# request with no Username in RURI
		sl_send_reply("484","Address Incomplete");
		exit;
	}
	# apply DB based aliases (uncomment to enable)
	##alias_db_lookup("dbaliases");
	if (!lookup("location")) {
		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 (check_route_param("nat=yes")) {
		setbflag(6);
	}
	if (isflagset(5) || isbflagset(6)) {
		route(5);
	}
	/* example how to enable some additional event routes */
	if (is_method("INVITE")) {
		#t_on_branch("1");
		t_on_reply("1");
		t_on_failure("1");
	}
	if (!t_relay()) {
		sl_reply_error();
	}
	exit;
}
# Presence route
/* uncomment the whole following route for enabling presence server */
route[2]
{

	# if presence enabled, this part will not be executed
	if (is_method("PUBLISH") || $rU==null)
	{
		sl_send_reply("404", "Not here");
		exit;
	}
	return;
}
# Caller NAT detection route
/* uncomment the whole following route for enabling Caller NAT Detection */
route[4]{
	force_rport();
	if (nat_uac_test("19")) {
		if (method=="REGISTER") {
			fix_nated_register();
		} else {
			fix_nated_contact();
			setflag(6);#VR
		}
		setflag(5);
	}
	return;
}
# RTPProxy control
/* uncomment the whole following route for enabling RTPProxy Control */
route[5] {
	if (is_method("BYE")) {
		unforce_rtp_proxy();
	} else if (is_method("INVITE")){
		force_rtp_proxy();
	}
	if (!has_totag()) add_rr_param(";nat=yes");
	return;
}
branch_route[1] {
	xdbg("new branch at $ru\n");
}
onreply_route[1] {
	xdbg("incoming reply\n");

	if ((isflagset(5) || isbflagset(6)) && status=~"(183)|(2[0-9][0-9])") {
		force_rtp_proxy();
	}
	if (isbflagset(6)) {
		fix_nated_contact();
	}
}
failure_route[1] {
	if (is_method("INVITE")
			&& (isbflagset(6) || isflagset(5))) {
		unforce_rtp_proxy();
	}

	if (t_was_cancelled()) {
		exit;
	}
}



More information about the Users mailing list