#
# $Id$
#
# iptel.org real world configuration
#

# ----------- global configuration parameters ------------------------

# we're debugging now

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

#fork=yes
#children=16
#log_stderror=no	# (cmd line: -E)

check_via=yes     # (cmd. line: -v)
dns=on           # (cmd. line: -r)
rev_dns=yes      # (cmd. line: -R)

# experimental usage at port 5060
#port=9060
#port=8060
port=5060
# advertise IP address in Via (as opposed to advertising DNS name
# which is annoying for downstream servers and some phones can
# not handle DNS at all)
#listen=195.37.77.101
#listen=193.175.135.170
# ------------------ module loading ----------------------------------

loadmodule "../sip_router/modules/sl/sl.so"
loadmodule "../sip_router/modules/print/print.so"
loadmodule "../sip_router/modules/tm/tm_mod.so"
#loadmodule "../sip_router/modules/acc/acc.so"
loadmodule "../sip_router/modules/rr/rr.so"
loadmodule "../sip_router/modules/maxfwd/maxfwd.so"
#loadmodule "../sip_router/modules/mysql/mysql.so"
loadmodule "../sip_router/modules/usrloc/usrloc.so"
#loadmodule "../sip_router/modules/auth/auth.so"
#loadmodule "../sip_router/modules/cpl/cpl.so"
loadmodule "../sip_router/modules/radius_acc/radius_acc.so"
loadmodule "../sip_router/modules/registrar/registrar.so"


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

# -- usrloc params --

# use in-RAM usrloc
#modparam("usrloc", "use_db", 0)

# -- acc params --
# report ACKs too for sake of completeness -- as we account PSTN
# destinations which are RR, ACKs should show up
#modparam("acc", "report_ack", 1)
# don't bother me with early media reports (I don't like 183 
# too much anyway...ever thought of timer C hitting after
# listening to music-on-hold for five minutes?)
#modparam("acc", "early_media", 0)
#modparam("acc", "log_level", 1)
# that is the flag for which we will account -- don't forget to
# set the same one :-)
#modparam("acc", "acc_flag", 1 )
# we are interested only in succesful transactions
#modparam("acc", "failed_transactions", 0 )


# -- acc params --
# report ACKs too for sake of completeness -- as we account PSTN
# destinations which are RR, ACKs should show up
modparam("radius_acc", "report_ack", 1)
# don't bother me with early media reports (I don't like 183
# too much anyway...ever thought of timer C hitting after
# listening to music-on-hold for five minutes?)
modparam("radius_acc", "early_media", 0)
modparam("radius_acc", "log_level", 1)
# that is the flag for which we will account -- don't forget to
# set the same one :-)
modparam("radius_acc", "acc_flag", 1 )
# we are interested only in succesful transactions
modparam("radius_acc", "failed_transactions", 0 )

# -- tm params --
modparam("tm", "fr_timer", 30 )
modparam("tm", "fr_inv_timer", 60 )

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

# main routing logic

route{

	# filter local stateless ACK generated by authentication of mf replies
	sl_filter_ACK();

	# filter too old messages
	log("LOG: Checking maxfwd\n");
	if (!mf_process_maxfwd_header("10")) {
		log("LOG: Too many hops\n");
		sl_send_reply("483","Too Many Hops");
		break;
	};

	# len_gt *after* max_fwd, otherwise an "INVITE sip:sos@0.0.0.0"
	# will cause "message too big" for a short message

	if (len_gt( max_len )) {
		sl_send_reply("513", "Riesengross -- Message too large");
		break;
	};

	# Do strict routing if route headers present
	if (method=="INVITE") {
		addRecordRoute();
	} else {
		rewriteFromRoute();
	};


	# that is outbound request...

	if (!(uri=~"fox\.iptel\.org([;:].*)*" 
		| uri=~"[@:\.]195\.37\.77\.101([;:].*)*"  )) {
		route(2);
		# break from route (2) return -- stop then !
		break;
	};
	# here we continue with requests for our domain...

	if (method=="REGISTER") {
		# update Contact database
       	log("LOG: REGISTER is authorized, saving location\n");
		save("location");
		break;
	};

	# native SIP destinations are handled using our USRLOC DB
	if (!lookup("location")) {
		if (method=="ACK") {
			log("Ooops -- an ACK made it here -- probably UAC screwed up to-tags\n");
			break;
		};
		log("LOG: Unable to lookup contact, sending 404\n");
		sl_send_reply("404", "Not Found");
		break;
	};

	# label for accounting
	setflag(1);
	# we now know we may, we know where, let it go out now!
	if (!t_relay()) {
		sl_reply_error();
		break;
	};
}
#---------------------------------------------------------------------

# routing logic for outbound requests targeted out of our domain
# -- use outbound proxy iptel.org (note that except to FOKUS/PBX,
# or itpel.org users, requests will be challenged)
route[2] {
		log("LOG: that's a request to outside");
		# label for accounting
		setflag(1);
		if (!t_relay_to("fox.iptel.org", "5060")) {
			sl_reply_error();
			break;
		};
}
