# $Id$
#
# Simple application level gateway config script.
#
# Assumes that SER/rtpproxy run on a machine, which connected to
# both IPv4 and IPv6 networks.
#
# Correspondingly, this machine has two IP addresses: one IPv4
# and the second one IPv6
#
# For example:
#
# 192.168.0.1 - "internal" IPv4 address
# 2002:1234:5678::1 - "external" IPv6 address
#
# rtpproxy started with `-l 192.168.0.1 -6 /2002:1234:5678::1' option.
# ser started with `-l 192.168.0.1 -l [2002:1234:5678::1] option.
#

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

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/nathelper.so"
loadmodule "/usr/local/lib/ser/modules/rtpproxy.so"

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

# -- nathelper params --

modparam("nathelper", "natping_interval", 15)

# ------------------ main fun below ----------------------------------

route {
	# initial sanity checks -- messages with
	# max_forwars == 0, or excessively long requests,
	# or those that don't addressed to us
	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483", "Too Many Hops");
		break;
	};
	if (msg:len > max_len) {
		sl_send_reply("513", "Message too big");
		break;
	};
	if (!(uri == myself) && method == "INVITE") {
		sl_send_reply("403", "Call cannot be served here");
		break;
	};

	if (method == "REGISTER") {
		if (af == inet) {
			save("location-inet4");
		} else if (af == inet6) {
			save("location-inet6");
		} else {
			sl_send_reply("403", "Call cannot be served here");
		};
		break;
	};

	if (method == "INVITE") {
		if (lookup("location-inet4")) {
			# Comment out three lines below if you want
			# RTP for IPv4->IPv4 calls to go directly
			# between UAs
			if (af == inet)
				if (force_rtp_proxy("FAII"))
					t_on_reply("1");
			if (af == inet6)
				if (force_rtp_proxy("FAEI"))
					t_on_reply("1");
		} else if (lookup("location-inet6")) {
			if (af == inet)
				if (force_rtp_proxy("FAIE"))
					t_on_reply("1");
			# Comment out three lines below if you want
			# RTP for IPv6->IPv6 calls to go directly
			# between UAs
			if (af == inet6)
				if (force_rtp_proxy("FAEE"))
					t_on_reply("1");
		} else {
			sl_send_reply("403", "Call cannot be served here");
			break;
		};
	}

	if (method == "BYE" || method == "CANCEL")
		unforce_rtp_proxy();

	# Do strict routing if pre-loaded route headers present
	if (loose_route()) {
		t_relay();
		break;
	};

	if (method == "INVITE")
		record_route();

        if (!t_relay())
        	sl_reply_error();
}

onreply_route[1] {
	if (!(status=~"183" || status=~"200"))
		break;
	force_rtp_proxy("FA");
}
