xref: /freebsd/libexec/rc/rc.d/stf (revision f99f0ee14e3af81c23150a6a340259ca8a33d01a)
10696600cSBjoern A. Zeeb#!/bin/sh
20696600cSBjoern A. Zeeb#
30696600cSBjoern A. Zeeb
40696600cSBjoern A. Zeeb# PROVIDE: stf
50696600cSBjoern A. Zeeb# REQUIRE: netif
60696600cSBjoern A. Zeeb# KEYWORD: nojail
70696600cSBjoern A. Zeeb
80696600cSBjoern A. Zeeb. /etc/rc.subr
90696600cSBjoern A. Zeeb. /etc/network.subr
100696600cSBjoern A. Zeeb
110696600cSBjoern A. Zeebname="stf"
120696600cSBjoern A. Zeebdesc="6to4 tunnel interface"
130696600cSBjoern A. Zeebstart_cmd="stf_up"
140696600cSBjoern A. Zeebstop_cmd="stf_down"
150696600cSBjoern A. Zeeb
160696600cSBjoern A. Zeebstf_up()
170696600cSBjoern A. Zeeb{
180696600cSBjoern A. Zeeb	case ${stf_interface_ipv4addr} in
190696600cSBjoern A. Zeeb	[Nn][Oo] | '')
200696600cSBjoern A. Zeeb		;;
210696600cSBjoern A. Zeeb	*)
220696600cSBjoern A. Zeeb		# assign IPv6 addr and interface route for 6to4 interface
230696600cSBjoern A. Zeeb		stf_prefixlen=$((16+${stf_interface_ipv4plen:-0}))
240696600cSBjoern A. Zeeb		OIFS="$IFS"
250696600cSBjoern A. Zeeb		IFS=".$IFS"
260696600cSBjoern A. Zeeb		set ${stf_interface_ipv4addr}
270696600cSBjoern A. Zeeb		IFS="$OIFS"
280696600cSBjoern A. Zeeb		hexfrag1=`hexprint $(($1*256 + $2))`
290696600cSBjoern A. Zeeb		hexfrag2=`hexprint $(($3*256 + $4))`
300696600cSBjoern A. Zeeb		ipv4_in_hexformat="${hexfrag1}:${hexfrag2}"
310696600cSBjoern A. Zeeb		case ${stf_interface_ipv6_ifid} in
320696600cSBjoern A. Zeeb		[Aa][Uu][Tt][Oo] | '')
330696600cSBjoern A. Zeeb			for i in ${ipv6_network_interfaces}; do
340696600cSBjoern A. Zeeb				laddr=`network6_getladdr ${i}`
350696600cSBjoern A. Zeeb				case ${laddr} in
360696600cSBjoern A. Zeeb				'')
370696600cSBjoern A. Zeeb					;;
380696600cSBjoern A. Zeeb				*)
390696600cSBjoern A. Zeeb					break
400696600cSBjoern A. Zeeb					;;
410696600cSBjoern A. Zeeb				esac
420696600cSBjoern A. Zeeb			done
430696600cSBjoern A. Zeeb			stf_interface_ipv6_ifid=`expr "${laddr}" : \
440696600cSBjoern A. Zeeb						      'fe80::\(.*\)%\(.*\)'`
450696600cSBjoern A. Zeeb			case ${stf_interface_ipv6_ifid} in
460696600cSBjoern A. Zeeb			'')
470696600cSBjoern A. Zeeb				stf_interface_ipv6_ifid=0:0:0:1
480696600cSBjoern A. Zeeb				;;
490696600cSBjoern A. Zeeb			esac
500696600cSBjoern A. Zeeb			;;
510696600cSBjoern A. Zeeb		esac
520696600cSBjoern A. Zeeb		echo "Configuring 6to4 tunnel interface: stf0."
530696600cSBjoern A. Zeeb		ifconfig stf0 create >/dev/null 2>&1
540696600cSBjoern A. Zeeb		ifconfig stf0 inet6 2002:${ipv4_in_hexformat}:${stf_interface_ipv6_slaid:-0}:${stf_interface_ipv6_ifid} \
550696600cSBjoern A. Zeeb			prefixlen ${stf_prefixlen}
560696600cSBjoern A. Zeeb		check_startmsgs && /sbin/ifconfig stf0
570696600cSBjoern A. Zeeb
580696600cSBjoern A. Zeeb		# disallow packets to malicious 6to4 prefix
590696600cSBjoern A. Zeeb		route add -inet6 2002:e000:: -prefixlen 20 ::1 -reject
600696600cSBjoern A. Zeeb		route add -inet6 2002:7f00:: -prefixlen 24 ::1 -reject
610696600cSBjoern A. Zeeb		route add -inet6 2002:0000:: -prefixlen 24 ::1 -reject
620696600cSBjoern A. Zeeb		route add -inet6 2002:ff00:: -prefixlen 24 ::1 -reject
630696600cSBjoern A. Zeeb		;;
640696600cSBjoern A. Zeeb	esac
650696600cSBjoern A. Zeeb}
660696600cSBjoern A. Zeeb
670696600cSBjoern A. Zeebstf_down()
680696600cSBjoern A. Zeeb{
690696600cSBjoern A. Zeeb	echo "Removing 6to4 tunnel interface: stf0."
700696600cSBjoern A. Zeeb	ifconfig stf0 destroy
710696600cSBjoern A. Zeeb	route delete -inet6 2002:e000:: -prefixlen 20 ::1
720696600cSBjoern A. Zeeb	route delete -inet6 2002:7f00:: -prefixlen 24 ::1
730696600cSBjoern A. Zeeb	route delete -inet6 2002:0000:: -prefixlen 24 ::1
740696600cSBjoern A. Zeeb	route delete -inet6 2002:ff00:: -prefixlen 24 ::1
750696600cSBjoern A. Zeeb}
760696600cSBjoern A. Zeeb
770696600cSBjoern A. Zeebload_rc_config $name
78*f99f0ee1SAlexander Leidinger
79*f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: config setting
80*f99f0ee1SAlexander Leidingerstf_svcj="NO"
81*f99f0ee1SAlexander Leidinger
820696600cSBjoern A. Zeebrun_rc_command "$1"
83