[Users] call forward

unplug maillisting at gmail.com
Wed Jan 18 18:17:45 CET 2006


I am using the sample configuration file called
"features-callfwd.5.0.cfg" with some modification.  UA dials a 8
digits number and if it is not in the location table, prefix('9') will
be appended in the number and route to the PSTN gateway.  According to
the configuration below, route 6 is responsible for call forward. 
With appropriate records in usr_preferences, openser can perform
direct forward and forward on busy.  However, in foward on no answer,
one of the party can't hear any voice from the other party.  I think
the flow is something like this.

UA1		openser		UA5	UA6
------INVITE---->
		--------INVITE------------>
		...
		<-------time out/no answer-
                            ------------------INVITE------------------>
	...
<--------------RTP established---------------------------------->

result: UA6 can hear UA1, but UA1 can't get any sound from UA6

Anyone can help if there is any mistable in my configuration file to
fix the above problem.  Thanks!

------------start configuration-------------
# $Id: features-callfwd.cfg 15 2005-09-15 17:37:10Z /CN=Greger V.
Teigre/emailAddress=greger at onsip.org $
debug=3
fork=yes
log_stderror=no

listen=203.193.16.226		# INSERT YOUR IP ADDRESS HERE
port=5060
children=4

dns=yes
rev_dns=no
fifo="/tmp/openser_fifo"
fifo_db_url="mysql://openser:openserrw@localhost/openser"
#fifo_mode=0666  #fifo permissions can be changed here
log_facility=LOG_LOCAL0
alias=01.ol.com

loadmodule "/usr/local/lib/openser/modules/mysql.so"
loadmodule "/usr/local/lib/openser/modules/sl.so"
loadmodule "/usr/local/lib/openser/modules/tm.so"
loadmodule "/usr/local/lib/openser/modules/rr.so"
loadmodule "/usr/local/lib/openser/modules/maxfwd.so"
loadmodule "/usr/local/lib/openser/modules/usrloc.so"
loadmodule "/usr/local/lib/openser/modules/registrar.so"
loadmodule "/usr/local/lib/openser/modules/auth.so"
loadmodule "/usr/local/lib/openser/modules/auth_db.so"
loadmodule "/usr/local/lib/openser/modules/uri.so"
loadmodule "/usr/local/lib/openser/modules/uri_db.so"
loadmodule "/usr/local/lib/openser/modules/mediaproxy.so"
loadmodule "/usr/local/lib/openser/modules/nathelper.so"
loadmodule "/usr/local/lib/openser/modules/textops.so"
loadmodule "/usr/local/lib/openser/modules/avpops.so"
loadmodule "/usr/local/lib/openser/modules/domain.so"
loadmodule "/usr/local/lib/openser/modules/permissions.so"
loadmodule "/usr/local/lib/openser/modules/acc.so"
loadmodule "/usr/local/lib/openser/modules/xlog.so"
loadmodule "/usr/local/lib/openser/modules/uac.so"
loadmodule "/usr/local/lib/openser/modules/group.so"

modparam("auth_db|permissions|uri_db|usrloc|acc|group",
	"db_url", "mysql://openser:openserrw@localhost/openser")
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")

modparam("nathelper", "rtpproxy_disable", 1)
modparam("nathelper", "natping_interval", 0)

modparam("mediaproxy","natping_interval", 30)
modparam("mediaproxy","mediaproxy_socket", "/var/run/mediaproxy.sock")
modparam("mediaproxy","sip_asymmetrics","/usr/local/etc/ser/sip-clients")
modparam("mediaproxy","rtp_asymmetrics","/usr/local/etc/ser/rtp-clients")

modparam("usrloc", "db_mode", 2)
#minimize write back window - default is 60 seconds
modparam("usrloc", "timer_interval", 10)
#use deomain information for user
#modparam("usrloc", "use_domain", 1)

modparam("registrar", "nat_flag", 6)
#The maximum expires value of a Contact
modparam("registrar", "max_expires", 120)
#all contacts will be ordered in descending modification time order
modparam("registrar", "desc_time_order", 1)
#modparam("registrar", "use_domain", 1)

modparam("rr", "enable_full_lr", 1)

#Timer which hits if no final reply for an INVITE
modparam("tm", "fr_inv_timer", 27)
modparam("tm", "fr_inv_timer_avp", "inv_timeout")

modparam("permissions", "db_mode", 1)
modparam("permissions", "trusted_table", "trusted")

modparam("avpops", "avp_url", "mysql://openser:openserrw@localhost/openser")
modparam("avpops", "avp_table", "usr_preferences")

modparam("acc", "log_level", 1)
modparam("acc", "log_flag", 1)
modparam("acc", "db_flag", 1)

modparam("uac", "from_restore_mode", "auto")

route {

        xlog("L_INFO","---[$fU-MR]---\n");
	# -----------------------------------------------------------------
	# Sanity Check Section
	# -----------------------------------------------------------------
	if (!mf_process_maxfwd_header("10")) {
                xlog("L_INFO","---[$fU-main(91)]: 483 Too Many Hops---\n");
		sl_send_reply("483", "Too Many Hops");
		return;
	};

	if (msg:len > max_len) {
                xlog("L_INFO","---[$fU-main(97)]: 483 Message Overflow---\n");
		sl_send_reply("513", "Message Overflow");
		return;
	};

	#-----------------------------------------------------------------
	# detect the anonymous incoming call and add anonymous to the uri
	#-----------------------------------------------------------------
	if (!has_totag() &&
(method=="INVITE"||method=="ACK"||method=="CANCEL"||method=="BYE")) {
	  route(7);
	}
		
	#------------------------------------------------------------------
	# Accoutnng Section
	#------------------------------------------------------------------
	setflag(1);
	#t_relay();

	# -----------------------------------------------------------------
	# Record Route Section
	# -----------------------------------------------------------------
	if (method=="INVITE" && client_nat_test("3")) {
		# INSERT YOUR IP ADDRESS HERE
		record_route_preset("203.193.16.226:5060;nat=yes");
	} else if (method!="REGISTER") {	
		record_route();	
	};

	# -----------------------------------------------------------------
	# Call Tear Down Section
	# -----------------------------------------------------------------
	if (method=="BYE" || method=="CANCEL") {
		end_media_session();
	};

	# -----------------------------------------------------------------
	# Loose Route Section
	# -----------------------------------------------------------------
	if (loose_route()) {

                xlog("L_INFO","---[$fU-main(137)]: loose_route()---\n");
		if (has_totag() && (method=="INVITE" || method=="ACK")) {

			if (client_nat_test("3")||search("^Route:.*;nat=yes")){
				setflag(6);
				use_media_proxy();
			};
		};

		route(1);
		return;
	};

	# -----------------------------------------------------------------
	# Call Type Processing Section
	# -----------------------------------------------------------------
	#domian module
	if (!is_uri_host_local()) {
		if (is_from_local() || allow_trusted()) {
			route(4);
			route(1);
		} else {
                	xlog("L_INFO","---[$fU-main(159)]: 403 Forbidden---\n");
			sl_send_reply("403", "Forbidden");
		};
		return;
	};

	if (method=="CANCEL") {
		route(1);
		return;
	} else if (method=="INVITE") {
		route(3);
		return;
	} else 	if (method=="REGISTER") {
		route(2);
		return;
	} else if (method=="ACK") {
		route(1);
		return;
	};

	lookup("aliases");
        #xlog("L_INFO","SIP line 191: [$fu] to [$tu]\n");
	if (uri!=myself) {
		route(4);
		route(1);
		return;
	};

	if (!lookup("location")) {
                xlog("L_INFO","---[$fU-main(188)]: 404 User Not Found---\n");
		sl_send_reply("404", "User Not Found");
		return;
	};

	route(1);
}

route[1] {

        xlog("L_INFO","---[$fU-R1]---\n");
	# -----------------------------------------------------------------
	# Default Message Handler
	# -----------------------------------------------------------------

	t_on_reply("1");

	if (!t_relay()) {

		if (method=="INVITE" || method=="ACK") {
			end_media_session();
		};

		sl_reply_error();
	};
        #xlog("L_INFO","SIP Request line 220: [$rm] from [$fu] to [$tu]\n");
}

route[2] {
        xlog("L_INFO","---[$fU-R2]---\n");

	# -----------------------------------------------------------------
	# REGISTER Message Handler
	# -----------------------------------------------------------------

	sl_send_reply("100", "Trying");

	if (!search("^Contact:[ ]*\*") && client_nat_test("7")) {
		setflag(6);
		fix_nated_register();
		force_rport();
	};

	if (!www_authorize("","subscriber")) {
		www_challenge("","0");
		return;
	};

	if (!check_to()) {
                xlog("L_INFO","---[$fU-route2(237)]: 401 Unauthorized---\n");
		sl_send_reply("401", "Unauthorized");
		return;
	};

        #------------check if the account is activated ----------
        if (!is_user_in("From", "active")) {
                xlog("L_INFO","---[$fU-route2(244)]: 402 Payment
Required---\n");
                sl_send_reply("402", "Payment Required");
                #append_hf("P-hint: PAYMANT REQUIRED\r\n");
                return;
        };

	consume_credentials();

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

route[3] {
        xlog("L_INFO","---[$fU-R3]---\n");

	# -----------------------------------------------------------------
	# INVITE Message Handler
	# -----------------------------------------------------------------

	#if (!allow_trusted()) {

		#if (!proxy_authorize("","subscriber")) {
			#proxy_challenge("","0");
			#return;
		#} else if (!check_from()) {
			#sl_send_reply("403", "Use From=ID");
			#return;
		#};

		#consume_credentials();
	#};

	if (client_nat_test("3")) {
		setflag(7);
		force_rport();
		fix_nated_contact();
	};

	#if (uri=~"^sip:1[0-9]{10}@") {
		#strip(1);
	#};

	lookup("aliases");
        #xlog("L_INFO","SIP line 292: [$fu] to [$tu]\n");
	if (uri!=myself) {
		route(4);
		route(1);
		return;
	};

	#if (uri=~"^sip:011[0-9]*@") {
		#route(4);
		#route(5);
		#return;
	#};

	if (avp_db_load("$ruri/username", "s:callfwd")) {
                xlog("L_INFO","---[$fU-route3(305)]: destination uri:
[$ru]---\n");
		setflag(22);
		avp_pushto("$ruri", "s:callfwd");
                xlog("L_INFO","---[$fU-route3(308)]: destination uri:
[$ru]---\n");
		route(6);
		return;
	};

	if (!lookup("location")) {

       		xlog("L_INFO","---[$fU]-(route3:315) destination uri: [$du]---\n");
		if (uri=~"^sip:[0-9]*@") {
                	xlog("L_INFO","---[$fU-route3(317)]: sip:(0-9*@)---\n");
			prefix("9");
			route(4);
			route(5);
			return;
		};

                xlog("L_INFO","---[$fU-route3(324)]: 404 User Not Found---\n");
		sl_send_reply("404", "User Not Found");
		return;
	};

	if (avp_db_load("$ruri/username", "s:fwdbusy")) {
		if (!avp_check("s:fwdbusy", "eq/$ruri/i")) {
                	xlog("L_INFO","---[$fU-route3(331)]: setflag(26)---\n");
			setflag(26);
		};
	};

	if (avp_db_load("$ruri/username", "s:fwdnoanswer")) {
		if (!avp_check("s:fwdnoanswer", "eq/$ruri/i")) {
                	xlog("L_INFO","---[$fU-route3(338)]: setflag(27)---\n");
			setflag(27);
		};
	};

	t_on_failure("1");

	route(4);
	route(1);
}

route[4] {
        xlog("L_INFO","---[$fU-R4]---\n");

	# -----------------------------------------------------------------
	# NAT Traversal Section
	# -----------------------------------------------------------------

	if (isflagset(6) || isflagset(7)) {
        	xlog("L_INFO","---[$fU-route4(357)]: $ru---\n");
		if (!isflagset(8)) {
        		xlog("L_INFO","---[$fU-route4(359)]: $ru---\n");
			setflag(8);
			use_media_proxy();
		};
	};
}

route[5] {
        xlog("L_INFO","---[$fU-R5]---\n");

	# -----------------------------------------------------------------
	# PSTN Handler
	# -----------------------------------------------------------------

	rewritehost("203.193.16.242"); # INSERT YOUR PSTN GATEWAY IP ADDRESS

	avp_write("i:45", "inv_timeout");

	t_on_failure("1");

	route(4);
	route(1);
}

route[6] {
        xlog("L_INFO","---[$fU-R6]---\n");

	# ------------------------------------------------------------------------
	# Call Forwarding Reply Route Handler
	#
	# This must be done as a route block because sl_send_reply() cannot be
	# called from the failure_route block
	# ------------------------------------------------------------------------

	#if (uri=~"^sip:1[0-9]{10}@") {
		#strip(1);
	#};

	lookup("aliases");

	if (!isflagset(22)) {
		append_branch();
	};
			
	if (uri!=myself) {
        	xlog("L_INFO","---[$fU-route6(405)]: (uri!=myyself)---\n");

		route(4);
		route(1);
		return;
	};

	#if (uri=~"^sip:011[0-9]*@") { }
	#if (uri=~"^sip:[0-9]*@") {
        	#xlog("L_INFO","---[$fU-route6(415)]: (app prefix(9))---\n");
		#prefix("9");
		#route(4);
		#route(5);
		#return;
	#};

	if (!lookup("location")) {

		if (uri=~"^sip:[0-9]*@") {
        		xlog("L_INFO","---[$fU-route6(425)]: (sip:(0-9*@)---\n");
			route(4);
			route(1);
			return;
		};

        	xlog("L_INFO","---[$fU-route6(432)]: 404 User Not Found---\n");
		sl_send_reply("404", "User Not Found");
	};

	route(4);
	route(1);
}

route[7] {
        xlog("L_INFO","---[$fU-R7]---\n");
	#if (method=="INVITE"||method=="ACK"||method=="CANCEL"||method=="BYE") {
		#if (is_user_in("from","")) {
        	  #xlog("L_INFO","SIP is_user_in=true\n");
		  #uac_replace_from("anonymous","sip:anonymous at s01.ol.com");
		#}
	#}
        if (avp_db_load("$from/username","s:alias")) {
                xlog("L_INFO","---[$fU-route7(450)]: have alias from
aliases- [$avp(s:alias)]---\n");
                #uac_replace_from("$avp(s:alias)","sip:$avp(s:alias)@$si");
                #uac_replace_from("$avp(s:alias) " ,"");
        } else {
                xlog("L_INFO","---[$fU-route7(454)]: no alias from
aliases---\n");
        };

}

onreply_route[1] {
        xlog("L_INFO","---[$fU-OR1]---\n");

	if ((isflagset(6) || isflagset(7)) &&
	    (status=~"(180)|(183)|2[0-9][0-9]")) {

		if (!search("^Content-Length:[ ]*0")) {
			use_media_proxy();
		};
	};

	if (client_nat_test("1")) {
		fix_nated_contact();
	};
}

failure_route[1] {
        xlog("L_INFO","---[$fU-FR1]---\n");

	if (t_check_status("487")) {
		return;
	};

	if (isflagset(26) && t_check_status("486")) {
		if (avp_pushto("$ruri", "s:fwdbusy")) {
        		xlog("L_INFO","---[$fU-failure_route1(505)]: fwdbusy---\n");
			avp_delete("s:fwdbusy");
			resetflag(26);
			route(6);
			return;
		};
	};

	if (isflagset(27) && t_check_status("408")) {
		if (avp_pushto("$ruri", "s:fwdnoanswer")) {
        		xlog("L_INFO","---[$fU-failure_route1(515)]: fwdnoanswer---\n");
			avp_delete("s:fwdnoanswer");
			resetflag(27);
			route(6);
			return;
		};
	};

	end_media_session();
}
-----------end of configuration----------------




More information about the Users mailing list