diff options
author | Roy Marples <roy@marples.name> | 2008-03-26 14:18:01 +0000 |
---|---|---|
committer | Roy Marples <roy@marples.name> | 2008-03-26 14:18:01 +0000 |
commit | ccf238f852fd0463e68d33b91f0dd55000c325e3 (patch) | |
tree | e104640ae7b25be54520c22712b34385b1c030c4 /net/ip6to4.sh | |
parent | 55858eca2ec678fce14b21df33d08f5aaac94bcf (diff) |
Merge net.OS into net
Diffstat (limited to 'net/ip6to4.sh')
-rw-r--r-- | net/ip6to4.sh | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/net/ip6to4.sh b/net/ip6to4.sh new file mode 100644 index 00000000..d58eb31f --- /dev/null +++ b/net/ip6to4.sh @@ -0,0 +1,99 @@ +# Copyright 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +_config_vars="$_config_vars link suffix relay" + +ip6to4_depend() +{ + after interface +} + +ip6to4_start() +{ + case " ${MODULES} " in + *" ifconfig "*) + if [ "${IFACE}" != "sit0" ]; then + eerror "ip6to4 can only work on the sit0 interface using ifconfig" + eerror "emerge sys-apps/iproute2 to use other interfaces" + return 1 + fi + esac + + local host= suffix= relay= addr= iface=${IFACE} new= localip= + eval host=\$link_${IFVAR} + if [ -z "${host}" ]; then + eerror "link_${IFVAR} not set" + return 1 + fi + + eval suffix=\${suffix_${IFVAR}:-1} + eval relay=\${relay_${IFVAR}:-192.88.99.1} + + IFACE=${host} + addrs=$(_get_inet_addresses) + IFACE=${iface} + if [ -z "${addrs}" ]; then + eerror "${host} is not configured with an IPv4 address" + return 1 + fi + + for addr in ${addrs}; do + # Strip the subnet + local ip="${addr%/*}" subnet="${addr#*/}" + # We don't work on private IPv4 addresses + case "${ip}" in + 127.*) continue;; + 10.*) continue;; + 192.168.*) continue;; + 172.*) + local i=16 + while [ ${i} -lt 32 ]; do + case "${ip}" in + 172.${i}.*) break;; + esac + i=$((${i} + 1)) + done + [ ${i} -lt 32 ] && continue + ;; + esac + + veinfo "IPv4 address on ${host}: ${ip}/${subnet}" + local ipa= ip6= IFS="${IFS}." + for i in ${ip}; do + ipa="${ipa} ${i}" + done + unset IFS + eval ip6="$(printf "2002:%02x%02x:%02x%02x::%s" ${ipa} ${suffix})" + veinfo "Derived IPv6 address: ${ip6}" + + # Now apply our IPv6 address to our config + new="${new}${new:+ }${ip6}/16" + + if [ -n "${localip}" ]; then + localip="any" + else + localip="${ip}" + fi + done + + if [ -z "${new}" ]; then + eerror "No global IPv4 addresses found on interface ${host}" + return 1 + fi + + if [ "${IFACE}" != "sit0" ]; then + ebegin "Creating 6to4 tunnel on ${IFACE}" + _tunnel add "${IFACE}" mode sit ttl 255 remote any local "${localip}" + eend $? || return 1 + _up + fi + + # Now apply our config + eval config_${config_index}=\'"${new}"\' + config_index=$((${config_index} - 1)) + + # Add a route for us, ensuring we don't delete anything else + local routes="$(_get_array "routes_${IFVAR}") +2003::/3 via ::${relay} metric 2147483647" + eval routes_${IFVAR}=\$routes +} |