Project: IPFire
Code Location: git://git.ipfire.org/network.gitmaster
Browse
/
Download File
functions.radvd
#!/bin/bash
###############################################################################
#                                                                             #
# IPFire.org - A linux based firewall                                         #
# Copyright (C) 2010  Michael Tremer & Christian Schmidt                      #
#                                                                             #
# This program is free software: you can redistribute it and/or modify        #
# it under the terms of the GNU General Public License as published by        #
# the Free Software Foundation, either version 3 of the License, or           #
# (at your option) any later version.                                         #
#                                                                             #
# This program is distributed in the hope that it will be useful,             #
# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
# GNU General Public License for more details.                                #
#                                                                             #
# You should have received a copy of the GNU General Public License           #
# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
#                                                                             #
###############################################################################

RADVD_CONFIGFILE="/etc/radvd.conf"

function radvd_update() {
	# (Re-)write the configuration file
	radvd_write_config

	# Reload the radvd service.
	service_reload radvd
}

function radvd_write_config() {
	config_header "radv daemon configuration file" > ${RADVD_CONFIGFILE}

	# Write the configuration for all zones.
	local zone
	for zone in $(zones_get_local); do
		__radvd_config_interface ${zone}

	done >> ${RADVD_CONFIGFILE}

	return ${EXIT_OK}
}

function __radvd_config_interface() {
	local zone=${1}
	assert isset zone

	log DEBUG "Writing radvd configuration for ${zone}."

	# If the interface does not provide any routing information,
	# we can skip this whole stuff.
	if ! routing_db_exists ${zone} ipv6; then
		return ${EXIT_OK}
	fi

	# Skip if zone is not active.
	local active=$(routing_db_get ${zone} ipv6 active)
	[ "${active}" = "0" ] && return ${EXIT_OK}

	# Skip if there is no prefix or prefix is link-local.
	local addr=$(routing_db_get ${zone} ipv6 local-ip-address)
	if [ -z "${addr}" ] || [ "${addr:0:5}" = "fe80:" ]; then
		return ${EXIT_OK}
	fi
	local prefix=$(ipv6_get_network ${addr})

	# Check if the subnet is configured by the DHCP server.
	local dhcpd="false"
	if dhcpd_subnet_match ipv6 "${prefix}"; then
		dhcpd="true"
	fi

	print "interface ${zone} {"
	print "	AdvSendAdvert on;"
	print "	MinRtrAdvInterval 3;"
	print "	MaxRtrAdvInterval 10;"
	print "	IgnoreIfMissing on;"

	if enabled dhcpd; then
		print "	AdvManagedFlag on;"
		print "	AdvOtherConfigFlag on;"
	fi

	print
	print "	prefix ${prefix} {"
	print "		AdvOnLink on;"

	if enabled dhcpd; then
		print "		AdvRouterAddr off;"
		print "		AdvAutonomous off;"
	else
		print "		AdvRouterAddr on;"
		print "		AdvAutonomous on;"
	fi

	print "	};"
	print

	# Add the DNS configuration.
	__radvd_config_dns ${zone}

	print "};"
	print
}

function __radvd_config_dns() {
	local zone=${1}

	# Do nothing, when this option is not enabled.
	enabled DNS_ADVERTISE_SERVERS || return ${EXIT_OK}

	# XXX it is kind of difficult to announce our local
	# resolver.

	local server servers
	for server in $(dns_server_list_sorted); do
		# Filter out non IPv6 addresses.
		ipv6_is_valid ${server} || continue

		servers="${servers} ${server}"
	done

	# Remove whitespaces.
	servers=$(echo ${servers})

	# If there are no servers to announce, we stop right here.
	if ! isset servers; then
		log DEBUG "No servers to announce."
		return ${EXIT_OK}
	fi

	print "	RDNSS ${servers} {"
	print "		# Use the defaults here."
	print "	};"
	print
}