[Serusers] Help: mediaproxy error? or domain issue?

Charles Wang lazy.charles at gmail.com
Mon Mar 14 16:51:16 CET 2005


Dear ALL:

I install my SER on two machines, one named "SER_A" and the other named "SER_B".
Two UACs register to each server. One named "UAC_A" the other named "UAC_B".

Server     Domain      Prefix    UAC          UAC's ID           
-------------------------------------------------------------------------
SER_A    A.com       852       UAC_A      1011
SER_B    B.com       886       UAC_B      2022
-------------------------------------------------------------------------

Prefix_Domain table:
---------------------------------
domain     |     prefix
----------------|-----------------
A.com      |     852
B.com      |     886
----------------|-----------------


My senario is below:

UAC_A ======> SER_A ====> SER_B ====> UAC_B
1011                        ||                    ||                    2022
(dial a number           ||                    ||                   (Ringing)
8862022)                  ||           Accept 2022 at B.com
                               ||           and forward to UAC_B       
            change 8862022 at A.com
                     to 2022 at B.com 

I install SER+MediaProxy on my systems and using pdt modules to 
do the prefix convert.

I find these error behaviors on my SER_A's log file. And the call from
1011 to 2022.
The call seems be process twice. You can find "Prefix To Domain
Checking" twice at the beginning. Can anybody give me some tips to
solve it?


----------------------  My log file 
-----------------------------------------------
ser /usr/local/sbin/ser[23458]: SER: Prefix To Domain Checking... 
ser /usr/local/sbin/ser[23458]: SER: SIP Call On-Net section route(2) 
ser /usr/local/sbin/ser[23456]: SER: Prefix To Domain Checking... 
ser /usr/local/sbin/ser[23456]: SER: SIP Call On-Net section route(2) 
ser proxydispatcher[23541]: command request
D24BF98F-101E-43F4-9765-4DBB863A999D at 192.168.11.5
192.168.11.5:8000:audio xxx.xxx.133.108 A.com local B.com remote
X-PRO=20build=201082
info=from:1011 at A.com,to:8862022 at A.com,fromtag:3667188260,totag:
ser /usr/local/sbin/ser[23463]: SER: Prefix To Domain Checking... 
ser /usr/local/sbin/ser[23463]: SER: SIP Call On-Net section route(2) 
ser proxydispatcher[23542]: command request
D24BF98F-101E-43F4-9765-4DBB863A999D at 192.168.11.5
192.168.11.5:8000:audio xxx.xxx.133.108 A.com local B.com remote
X-PRO=20build=201082
info=from:1011 at A.com,to:8862022 at A.com,fromtag:3667188260,totag:
ser proxydispatcher[23541]: domain A.com doesn't define any mediaproxy.
ser proxydispatcher[23541]: will use default mediaproxy for this call.
ser mediaproxy[18756]: command request
D24BF98F-101E-43F4-9765-4DBB863A999D at 192.168.11.5
192.168.11.5:8000:audio xxx.xxx.133.108 A.com local B.com remote
X-PRO=20build=201082
info=from:1011 at A.com,to:8862022 at A.com,fromtag:3667188260,totag:,dispatcher
ser mediaproxy[18756]: session
D24BF98F-101E-43F4-9765-4DBB863A999D at 192.168.11.5: started. listening
on xxx.xxx.190.248:35020
ser mediaproxy[18756]: command execution time: 10.30 ms
ser proxydispatcher[23541]: forwarding to mediaproxy on
/var/run/mediaproxy.sock: got: 'xxx.xxx.190.248 35020'
ser proxydispatcher[23541]: command execution time: 3365.77 ms
ser proxydispatcher[23542]: domain A.com doesn't define any mediaproxy.
ser proxydispatcher[23542]: will use default mediaproxy for this call.
ser mediaproxy[18756]: command request
D24BF98F-101E-43F4-9765-4DBB863A999D at 192.168.11.5
192.168.11.5:8000:audio xxx.xxx.133.108 A.com local B.com remote
X-PRO=20build=201082
info=from:1011 at A.com,to:8862022 at A.com,fromtag:3667188260,totag:,dispatcher
ser mediaproxy[18756]: command execution time:  0.39 ms
ser proxydispatcher[23542]: forwarding to mediaproxy on
/var/run/mediaproxy.sock: got: 'xxx.xxx.190.248 35020'
ser proxydispatcher[23542]: command execution time: 4101.53 ms
ser /usr/local/sbin/ser[23463]: SER: Failure Route section failure_route(1) 
ser /usr/local/sbin/ser[23456]: SER: Prefix To Domain Checking... 
ser /usr/local/sbin/ser[23456]: SER: SIP Call On-Net section route(2) 


---------------------  My ser.cfg
-----------------------------------------------------------
# ----------- global configuration parameters ------------------------

debug=10         # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no	# (cmd line: -E)

/* Uncomment these lines to enter debugging mode 
fork=no
log_stderror=yes
*/

alias=A.com
alias=xxx.xxx.190.248

check_via=no		# (cmd. line: -v)
dns=no					# (cmd. line: -r)
rev_dns=no			# (cmd. line: -R)
port=5060
children=4
fifo_mode=0666
fifo="/tmp/ser_fifo"
fifo_db_url="mysql://ser:heslo@localhost/ser"

# ------------------ module loading ----------------------------------

# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/ser/modules/mysql.so"
loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"
loadmodule "/usr/local/lib/ser/modules/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/lib/ser/modules/exec.so"
loadmodule "/usr/local/lib/ser/modules/avpops.so"
loadmodule "/usr/local/lib/ser/modules/domain.so"
loadmodule "/usr/local/lib/ser/modules/group.so"
loadmodule "/usr/local/lib/ser/modules/uri.so"
loadmodule "/usr/local/lib/ser/modules/uri_db.so"
loadmodule "/usr/local/lib/ser/modules/permissions.so"
loadmodule "/usr/local/lib/ser/modules/speeddial.so"
loadmodule "/usr/local/lib/ser/modules/acc.so"
loadmodule "/usr/local/lib/ser/modules/pdt.so"
loadmodule "/usr/local/lib/ser/modules/options.so"
loadmodule "/usr/local/lib/ser/modules/mediaproxy.so"
loadmodule "/usr/local/lib/ser/modules/xlog.so"

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

# -- mediaproxy params --
modparam("mediaproxy", "natping_interval", 30)
modparam("mediaproxy", "sip_asymmetrics",
"/usr/local/etc/ser/sip-asymmetric-clients")
modparam("mediaproxy", "rtp_asymmetrics",
"/usr/local/etc/ser/rtp-asymmetric-clients")

# -- usrloc params --
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "timer_interval", 60)
modparam("usrloc", "desc_time_order", 1)

# -- auth params --
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")

# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)

# -- db_url params --
modparam("acc|auth_db|domain|group|permissions|speeddial|uri_db|usrloc|pdt",
"db_url", "mysql://ser:heslo@localhost/ser")

# -- use_domain params --
modparam("auth_db|group|registrar|speeddial|uri_db|usrloc", "use_domain", 0)

# -- permissions params --
modparam("permissions", "db_mode", 1)
modparam("permissions", "trusted_table", "trusted")

# -- accounting params --
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 1)
modparam("acc", "log_fmt", "cdfimorstup")
modparam("acc", "log_level", 1)
modparam("acc", "failed_transactions", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "report_ack", 0)

# -- domain params --
modparam("domain", "db_mode", 1)

# ------------- exec parameters
modparam("exec", "setvars", 1)
modparam("exec", "time_to_kill", 10)

# -- registration params --
modparam("registrar", "nat_flag", 2)
modparam("registrar", "min_expires", 60)
modparam("registrar", "max_expires", 86400)
modparam("registrar", "default_expires", 3600)
modparam("registrar", "append_branches", 1)

# -- avp params --
modparam("avpops", "avp_url", "mysql://ser:heslo@localhost/ser")
modparam("avpops", "avp_table", "usr_preferences")
#modparam("avpops", "use_domain", "1")
modparam("avpops", "uuid_column", "uuid")
modparam("avpops", "username_column", "username")
modparam("avpops", "domain_column", "domain")
modparam("avpops", "attribute_column", "attribute")
modparam("avpops", "value_column", "value")
modparam("avpops", "type_column", "type")
modparam("avpops", "avp_aliases",
"voicemail=i:500;calltype=i:700;fwd_no_answer_type=i:701;fwd_busy_type=i:702")
# To use more than one tables example
#modparam("avpops", "db_scheme",
"scheme1:table=subscriber;uuid_column=uuid;value_column=first_name")

# -- tm params --
modparam("tm", "fr_timer", 30)
modparam("tm", "fr_inv_timer", 30)
modparam("tm", "wt_timer", 5)
modparam("tm", "fr_inv_timer_avp", "inv_timeout")

# -- pdt params --
modparam("pdt", "db_table", "prefix_domain")
modparam("pdt", "prefix", "")
modparam("pdt", "hsize_2pow", 2)
modparam("pdt", "sync_time", 300)
modparam("pdt", "clean_time", 600)

# -- logging params
modparam("xlog", "buf_size", 8192)

# -- group params --
modparam("group", "table", "grp") 
modparam("group", "user_column", "username") 
modparam("group", "domain_column", "domain") 
modparam("group", "group_column", "grp") 

# -------------------------  request routing logic -------------------

# main routing logic

route {

	# ------------------------------------------------------------------------
	# Sanity Check Section
	# ------------------------------------------------------------------------
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483", "Too Many Hops");
		break;
	};

	if (msg:len > max_len) {
		sl_send_reply("513", "Message Overflow");
		break;
	};

	# ------------------------------------------------------------------------
	# NOTIFY Keep-Alive Section
	# ------------------------------------------------------------------------
	if (method=="NOTIFY") {
		sl_send_reply("200", "OK");
		break;
	};

	# ------------------------------------------------------------------------
	# NAT Test Section #1
	# ------------------------------------------------------------------------
	if (method=="REGISTER" && client_nat_test("3")) {
		fix_contact();
		force_rport();
		setflag(2);
	};

	# ------------------------------------------------------------------------
	# Registration Section
	# ------------------------------------------------------------------------
	if (method=="REGISTER") {

		# allow all requests from user 700 - the Click2Dial controller
		if (!isflagset(14)) {
			if (!is_from_local()) {
				sl_send_reply("403", "Unknown Domain");
				break;
			};
			if (!www_authorize("", "subscriber")) {
				www_challenge("", "0");
				break;
			};
			if (!check_to()) {
				sl_send_reply("401", "Unauthorized");
				break;
			};
			
			# To - Use To username and (optionally) domain to check
			if (is_user_in("To", "demo-disabled")) {
				sl_send_reply("403", "Your evaluation period has expired");
				break;
			};
			
			# To - Use To username and (optionally) domain to check
			if (is_user_in("To", "disabled")) {
				sl_send_reply("403", "Your account has been disabled");
				break;
			};
		};

		# snom sip phones use this header to start their 
		# keep-alive mechanism for NAT bindings
		append_to_reply("P-NAT-Refresh: 15\r\n");

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

	# ------------------------------------------------------------------------
	# Accounting Section # 1
	# ------------------------------------------------------------------------
	if ((method=="INVITE" || method=="BYE") && !isflagset(14)) {
		setflag(1);
	};

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

	# ------------------------------------------------------------------------
	# Record Route Section
	# ------------------------------------------------------------------------
	if (!method=="REGISTER") {
		record_route();
	};

	# ------------------------------------------------------------------------
	# Loose Route Section
	# ------------------------------------------------------------------------
	if (loose_route()) {
		route(2);
		break;
	};

	# ------------------------------------------------------------------------
	# Prefix To Domain Section
	# ------------------------------------------------------------------------
	log(1, "SER: Prefix To Domain Checking...\n");
	prefix2domain();

	# ------------------------------------------------------------------------
	# NAT Test Section #1
	# ------------------------------------------------------------------------
	if (client_nat_test("3") && !search("^Record-Route:")) {
		force_rport();
		fix_contact();
	};

	# ------------------------------------------------------------------------
	# PSTN Section
	# ------------------------------------------------------------------------
	if (method=="INVITE") {  ## Deny PSTN to 0204 and 095 on Tawan
		if ((uri=~"^sip:0204[0-9]*@") || (uri=~"^sip:095[0-9]*@")) {
			sl_send_reply("503", "Service Unavailable");
			break;
		};
	};

	# ------------------------------------------------------------------------
	# Alias Routing Section
	# ------------------------------------------------------------------------
	lookup("aliases");
	if (!uri==myself) {
		route(2);
		break;
	};

	# ------------------------------------------------------------------------
	# Load ACL Section
	# ------------------------------------------------------------------------
	if (method=="INVITE" && !isflagset(14)) {
		xlog("L_ERR", "Time:[%Tf] Method:<%rm> r-uri:<%ru>\n");
		xlog("L_ERR", "IP:<%is> From:<%fu> To:<%tu> %ct\n");
		if (is_from_local() || is_uri_host_local()) {
			# Check user from grp table
			if (is_user_in("From", "int")) {
			  log(1, "SER: a INT user\n");
				setflag(29);
			};
			if (is_user_in("From", "free-pstn")) {
			  log(1, "SER: a FREE-PSTN user\n");
				setflag(28);
			};
			if (avp_db_load("$from/username", "s:callidblock")) {
				if (avp_check("s:callidblock", "eq/y/i")) {
					setflag(25);
				};
			};
		};
		if (avp_db_load("$ruri/username", "s:anoncallrej")) {
			if (avp_check("s:anoncallrej", "eq/y/i")) {
			  log(1, "SER: a ANON-CALL-REJ user\n");
				setflag(24);
			};
		};
	};

	# ------------------------------------------------------------------------
	# Anonymous Call Rejection Section # 24
	# ------------------------------------------------------------------------
	if (isflagset(24) && (method=="INVITE") &&
search("^(f|F)rom:.*(a|A)nonymous")) {
		route(8);
		break;
	};

	# ------------------------------------------------------------------------
	# 002 International Call Section # 29
	# ------------------------------------------------------------------------
	if (method=="INVITE" && uri=~"^sip:002[0-9]*@") {
		if (isflagset(29)) {
			log(1, "SER: an International Call route(6)\n");
			route(6);
		} else {
			sl_send_reply("503", "Service Unavailable");
		};
		break;
	};

	# ------------------------------------------------------------------------
	# 0XXXXXXXXX Domestic Call Section # 29
	# ------------------------------------------------------------------------
	if (method=="INVITE" && uri=~"^sip:0[0-9]{9}@") {
		if (isflagset(29)) {
		  log(1, "SER: a Domestic Call route(6)\n");
			route(6);
		} else {
			sl_send_reply("503", "Service Unavailable");
		};
		break;
	};

	# ------------------------------------------------------------------------
	# Blind Call Forwarding Section
	# ------------------------------------------------------------------------
	if (method=="INVITE") {
	  log(1, "SER: BLIND CALL FORWARDING\n");
		# here we must store the current (aka original) R-URI because if
		# we set call forwarding and the forwarded number is busy then we
		# need to use this original R-URI to determine which voicemail
		# box we should go to
		if (isflagset(31)) {
			avp_write("$ruri", "$voicemail");
		};
		if (avp_db_load("$ruri/username", "s:callfwd")) {
			avp_pushto("$ruri", "s:callfwd");
	
			# lookup the call fowarding number to see if it is a served
			# sip number or a PSTN number
	
			# check forwarding number rules
			log(1, "SER: Check Forwarding Number Rules\n");
			route(1);
	
			# test for domestic PSTN gateway
			if (uri=~"^sip:0[1-9]{9}@") {
			#if (avp_check("$calltype", "eq/dom/i")) {
			  log(1, "SER: Start a domestic PSTN call route(3)\n");
				route(3);
				break;
			};
	
			# test for international PSTN gateway
			if (uri=~"^sip:002[1-9]*@") {
			# if (avp_check("$calltype", "eq/int/i")) {
				log(1, "SER: Start an international PSTN call route(6)\n");
				route(6);
				break;
			};

			# test for H323 gatekeeper 
			if (uri=~"^sip:888251[0-9]*@") {
				# if (avp_check("$calltype", "eq/int/i")) {
				log(1, "SER: Start a H323 call route(9)\n");
				route(9);
				break;
			};

		};
	};

	# ------------------------------------------------------------------------
	# Call Routing Section
	# ------------------------------------------------------------------------
	if (!lookup("location")) {
	
		# if flag 31 (ie voicemail) is set and we made it here this means
		# the user's phone is not registered anywhere. We'll forward to
		# voicemail after this block because we need to check the call
		# forward settings first
		if (isflagset(31)) {
			# flag 19 means the user has voicemail but is not online
			# so we need to remember to send to voicemail if call
			# forwarding is not enabled
			setflag(19);
		};
	
		if (method=="INVITE") {
			if (does_uri_exist()) {
				# subscriber record found, but they're offline
				log(1, "SER: Temporarily Unavailable\n");
				sl_send_reply("480", "Temporarily Unavailable");
				break;
			};
	
			if (uri=~"^sip:0[0-9]{9}@") {
				# Send to PSTN Gateway
				if (isflagset(28) || (is_user_in("From", "int")) ||
(is_user_in("From", "free-pstn"))) {
				  log(1, "SER: Start a PSTN call\n");
					route(3);
				} else {
					log(1, "SER: 503 Service Unavailable 2\n");
					sl_send_reply("503", "Service Unavailable");
				};
				break;
			};

			if (uri=~"^sip:888251[0-9]*@") {
			# Send to H323 Gatekeeper
				if (isflagset(28) || (is_user_in("From", "int")) ||
(is_user_in("From", "free-pstn"))) {
					log(1, "SER: Start a H323 call\n");
					route(9);
				} else {
					log(1, "SER: 503 Service Unavailable 2\n");
					sl_send_reply("503", "Service Unavailable");
				};
				break;
			};

			sl_send_reply("404", "User Not Found");
			break;
		};
	};

	# ------------------------------------------------------------------------
	# Call Forwarding Section
	# ------------------------------------------------------------------------
	if (method=="INVITE") {
	
		# save R-URI in a temp AVP for later use
		avp_write("$ruri", "i:99");
	
		# only load the forward no answer option if voice mail is not enabled
		if (!isflagset(31)) {
			if (avp_db_load("$ruri/username", "s:fwdnoanswer")) {
				route(1);
				setflag(27);
			};
		};
		if (avp_db_load("$ruri/username", "s:fwdbusy")) {
			route(1);
			setflag(26);
		};
		avp_pushto("$ruri", "i:99");
	};
	if (isflagset(19)) {
		# send to voicemail
		route(5);
	} else {
		route(2);
	};
}

route[1] {
----skip here------
}

route[2] {
	log(1, "SER: SIP Call On-Net section route(2)\n");
	if ((method=="INVITE") && !allow_trusted()) {
		if (!proxy_authorize("", "subscriber")) {
			proxy_challenge("", "0");
		  break;
		} else if (!check_from()) {
			log(1, "Spoofed SIP call attempt");
			sl_send_reply("403", "Use From=ID");
			break;
		} else if (!(is_from_local() || is_uri_host_local())) {
			sl_send_reply("403", "Please register to use our service");
			break;
		};
	};
	if (uri=~"[@:](192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)" &&
!search("^Route:")){
		sl_send_reply("479", "We don't forward to private IP addresses");
		break;
	};
	if (isflagset(25)) {
		replace("^From:(.*)>" , "From: \"Anonymous\"
<sip:someone at anonymous.invalid>");
	};
	if (method=="INVITE" || method=="ACK") {
		use_media_proxy();
	};
	t_on_failure("1");
	t_on_reply("1");
	if (!t_relay()) {
		if (method=="INVITE" || method=="ACK") {
			end_media_session();
		};
		sl_reply_error();
	};
   
}

route[3] {
----skip here------
}

route[4] {
----skip here------
}

route[5] {
----skip here------
}

route[6] {
----skip here------
}

route[7] {
----skip here------
}

route[8] {
----skip here------
}

route[9] {
----skip here------
}

onreply_route[1] {
	# Not all 2xx messages have a content body so here we
	# make sure our Content-Length > 0 to avoid a parse error
	if (status=~"(180)|(183)|2[0-9][0-9]") {
		if (!search("^Content-Length:\ 0")) {
			use_media_proxy();
		};
	};
	if (client_nat_test("1")) {
		fix_contact();
	};
} 

failure_route[1] {
	log(1, "SER: Failure Route section failure_route(1)\n");

	# if caller hung up then don't sent to voicemail
	if (t_check_status("487")) {
		break;
	};
	if (isflagset(26) && t_check_status("486")) {
		# forward busy is flag 26
		
		if (avp_pushto("$ruri", "s:fwdbusy")) {
			log(1, "SER: fork to fwdbusy\n");
			avp_delete("s:fwdbusy");
			append_branch();
			resetflag(26);
			
			# test for domestic PSTN gateway
			if (uri=~"^sip:0[0-9]{9}@") {
			# if (avp_check("$fwd_busy_type", "eq/dom/i")) {
				# test for domestic PSTN gateway
				log(1, "SER: Busy Failure and Jump to route(6)\n");
				route(6);
			} else if (uri=~"^sip:002[1-9][0-9]*@") {
			# } else if (avp_check("$fwd_busy_type", "eq/int/i")) {
				# test for international PSTN gateway
				log(1, "SER: Busy Failure and Jump to route(3)\n");
				route(3);
			} else {
				# default to sip call
				log(1, "SER: Busy Failure and Jump to route(2)\n");
				route(2);
			};
			break;
		};
	};

	# here we can have either voicemail __OR__ forward no answer
	if (isflagset(27) && t_check_status("408")) {
		# forward no answer is flag 27
		
		if (avp_db_load("$ruri/username", "s:fwdnoanswer")) {
			avp_pushto("$ruri", "s:fwdnoanswer");
			log(1, "SER: fork to fwdnoanswer\n");
			avp_delete("s:fwdnoanswer");
			append_branch();
			resetflag(27);
			
			if (uri=~"^sip:0[0-9]{9}@") {
			# if (avp_check("$fwd_no_answer_type", "eq/dom/i")) {
				# test for domestic PSTN gateway
				log(1, "SER: No Answer Failure and Jump to route(3)\n");
				route(3);
		  } else if (uri=~"^sip:002[1-9][0-9]*@") {
			# } else if (avp_check("$fwd_no_answer_type", "eq/int/i")) {
				# test for international PSTN gateway
				log(1, "SER: No Answer Failure and Jump to route(6)\n");
				route(6);
			} else {
				# default to sip call
				log(1, "SER: No Answer Failure and Jump to route(2)\n");				
				route(2);
			};
			break;
		};
	} else if (isflagset(31) && avp_pushto("$ruri", "$voicemail")) {
		avp_delete("$voicemail");
		log(1, "SER: No Answer Failure and Jump to route(4)\n");
		route(4);
		break;
	};
}




More information about the sr-users mailing list