aboutsummaryrefslogtreecommitdiffstats
path: root/sysconfig/network-scripts
diff options
context:
space:
mode:
Diffstat (limited to 'sysconfig/network-scripts')
-rwxr-xr-xsysconfig/network-scripts/ifdown-ipv656
-rwxr-xr-xsysconfig/network-scripts/ifdown-sit42
-rwxr-xr-xsysconfig/network-scripts/ifup-ipv644
-rwxr-xr-xsysconfig/network-scripts/ifup-sit41
-rw-r--r--sysconfig/network-scripts/network-functions-ipv6476
5 files changed, 424 insertions, 235 deletions
diff --git a/sysconfig/network-scripts/ifdown-ipv6 b/sysconfig/network-scripts/ifdown-ipv6
index fcef285b..a4396aa7 100755
--- a/sysconfig/network-scripts/ifdown-ipv6
+++ b/sysconfig/network-scripts/ifdown-ipv6
@@ -1,11 +1,13 @@
-#!/bin/bash
+#!/bin/sh
#
# ifdown-ipv6
#
-# Taken from scripts from:
#
-# (P) & (C) 2000 Peter Bieringer <pb@bieringer.de>
-# some hints taken from RedHat scripts
+# Taken from:
+# (P) & (C) 2000-2001 by Peter Bieringer <pb@bieringer.de>
+#
+# Version 2001-02-02
+#
. /etc/sysconfig/network
@@ -14,44 +16,44 @@ cd /etc/sysconfig/network-scripts
CONFIG=$1
[ -f "$CONFIG" ] || CONFIG=ifcfg-$CONFIG
-source_config
+source_config
-# Test if IPv6 configuration is enabled for this interface
+# Test if IPv6 configuration is enabled
if [ ! "$IPV6INIT" = "yes" ]; then
- # not enabled, stop here
- exit 0
+ # not enabled, stop here
+ exit 0
fi
# Test if IPv6 is up
if [ "${NETWORKING_IPV6}" = "yes" ]; then
+
. /etc/sysconfig/network-scripts/network-functions-ipv6
# Delete additional static IPv6 routes on specified interface
- if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
+ if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
grep "^$DEVICE" /etc/sysconfig/static-routes-ipv6 | while read device args; do
- if [ "$device" = "$DEVICE" ]; then
- ifdown_ipv6_route $args $DEVICE
- fi
+ if [ "$device" = "$DEVICE" ]; then
+ ifdown_ipv6_route $args $DEVICE
+ fi
done
fi
- # Delete tunnel
- if ! [ -z "$IPV6TUNNELIPV4" -o -z "$IPV6TUNNELROUTE" ]; then
- ifdown_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $IPV6TUNNELROUTE
- fi
+ # Switch off forwarding per device (packets received on this
+ # interface aren't forwarded
+ forwarding_ipv6 no $DEVICE
- # Shutdown additional (1) IPv6 address on specified interface
- if ! [ -z "$IPV6ADDR_0" -o -z "$IPV6PREFIXLENGTH_0" ]; then
- ifdown_ipv6_real $DEVICE $IPV6ADDR_0 $IPV6PREFIXLENGTH_0
- fi
-
- # Shutdown additional (2) IPv6 address on specified interface
- if ! [ -z "$IPV6ADDR_1" -o -z "$IPV6PREFIXLENGTH_1" ]; then
- ifdown_ipv6_real $DEVICE $IPV6ADDR_1 $IPV6PREFIXLENGTH_1
+ # Delete additional IPv6 addresses from list
+ if [ ! -z "$IPV6ADDR_SECONDARIES" ]; then
+ for ipv6addr in $IPV6ADDR_SECONDARIES; do
+ ifdown_ipv6_real $DEVICE $ipv6addr $IPV6PREFIXLENGTH
+ done
fi
-
- # Shutdown IPv6 address on specified interface
- if ! [ -z "$IPV6ADDR" -o -z "$IPV6PREFIXLENGTH" ]; then
+
+ # Shutdown basic configured IPv6 address on specified interface
+ if ! [ -z "$IPV6ADDR" ]; then
ifdown_ipv6_real $DEVICE $IPV6ADDR $IPV6PREFIXLENGTH
fi
+
+ # Cleanup all IPv6 configuration on specified interface (prevents from kernel crashing)
+ ifdown_ipv6_real_all $DEVICE
fi
diff --git a/sysconfig/network-scripts/ifdown-sit b/sysconfig/network-scripts/ifdown-sit
index 3eba5d79..c2323362 100755
--- a/sysconfig/network-scripts/ifdown-sit
+++ b/sysconfig/network-scripts/ifdown-sit
@@ -2,10 +2,14 @@
#
# ifdown-sit
#
+#
# Taken from:
+# (P) & (C) 2000-2001 by Peter Bieringer <pb@bieringer.de>
+#
+# Version 2001-02-03
#
-# (P) & (C) 2000 Peter Bieringer <pb@bieringer.de>
-# some hints taken from RedHat scripts
+
+# Filter tags (for stripping, empty lines following if all is stripped)
. /etc/sysconfig/network
@@ -14,29 +18,35 @@ cd /etc/sysconfig/network-scripts
CONFIG=$1
[ -f "$CONFIG" ] || CONFIG=ifcfg-$CONFIG
-source_config
+source_config
# Test if IPv6 configuration is enabled for this interface
if [ ! "$IPV6INIT" = "yes" ]; then
- # not enabled, stop here
- exit 0
+ # not enabled, stop here
+ exit 0
fi
# Test if IPv6 is up
if [ "${NETWORKING_IPV6}" = "yes" ]; then
+
. /etc/sysconfig/network-scripts/network-functions-ipv6
- # Delete additional static IPv6 routes on specified interface
- if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
- grep "^$DEVICE" /etc/sysconfig/static-routes-ipv6 | while read device ipv6route args; do
- if [ "$device" = "$DEVICE" ]; then
- ifdown_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $ipv6route
- fi
- done
- fi
+ # Delete IPv6-in-IPv4 tunnel(s)
+ if [ "$DEVICE" = "sit0" ]; then
+ ifdown_ipv6_autotunnel
+ elif [ ! -z "$IPV6TUNNELIPV4" ]; then
+ # Delete static IPv6 tunnel routes on specified virtual interface
+ if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
+ grep "^$DEVICE" /etc/sysconfig/static-routes-ipv6 | while read device ipv6route args; do
+ if [ "$device" = "$DEVICE" ]; then
+ ifdown_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $ipv6route
+ fi
+ done
+ fi
- # Delete tunnel
- if ! [ -z "$IPV6TUNNELIPV4" -o -z "$IPV6TUNNELROUTE" ]; then
- ifdown_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $IPV6TUNNELROUTE
+ if [ ! -z "$IPV6ADDR" ]; then
+ # Numbered tunnel
+ ifdown_ipv6_real sit0 $IPV6ADDR $IPV6PREFIXLENGTH
+ fi
fi
fi
diff --git a/sysconfig/network-scripts/ifup-ipv6 b/sysconfig/network-scripts/ifup-ipv6
index e69262c8..4ef124ae 100755
--- a/sysconfig/network-scripts/ifup-ipv6
+++ b/sysconfig/network-scripts/ifup-ipv6
@@ -2,9 +2,14 @@
#
# ifup-ipv6
#
+#
# Taken from:
+# (P) & (C) 2000-2001 by Peter Bieringer <pb@bieringer.de>
+#
+# Version 2001-02-02
#
-# (P) & (C) 2000 Peter Bieringer <pb@bieringer.de>
+
+# Filter tags (for stripping, empty lines following if all is stripped)
. /etc/sysconfig/network
@@ -15,7 +20,7 @@ CONFIG=$1
[ -f "$CONFIG" ] || CONFIG=ifcfg-$CONFIG
source_config
-# Test if IPv6 configuration is enabled for this interface
+# Test if IPv6 configuration is enabled
if [ ! "$IPV6INIT" = "yes" ]; then
# not enabled, stop here
exit 0
@@ -23,34 +28,39 @@ fi
# Test if IPv6 is up
if [ "${NETWORKING_IPV6}" = "yes" ]; then
+
. /etc/sysconfig/network-scripts/network-functions-ipv6
# Setup IPv6 address on specified interface
- if ! [ -z "$IPV6ADDR" -o -z "$IPV6PREFIXLENGTH" ]; then
+ if ! [ -z "$IPV6ADDR" ]; then
ifup_ipv6_real $DEVICE $IPV6ADDR $IPV6PREFIXLENGTH
fi
-
- # Setup additional (1) IPv6 address on specified interface
- if ! [ -z "$IPV6ADDR_0" -o -z "$IPV6PREFIXLENGTH_0" ]; then
- ifup_ipv6_real $DEVICE $IPV6ADDR_0 $IPV6PREFIXLENGTH_0
+
+ # Switch forwarding per device like defined
+ # Packets received on selected interface are forwarded
+ if ! [ -z "$IPV6FORWARDING" ]; then
+ if [ "$IPV6FORWARDING" = "yes" ]; then
+ forwarding_ipv6 yes $DEVICE
+ # also for all (otherwise, nothing is forwarded)
+ forwarding_ipv6 yes
+ else
+ forwarding_ipv6 no $DEVICE
+ fi
fi
-
- # Setup additional (2) IPv6 address on specified interface
- if ! [ -z "$IPV6ADDR_1" -o -z "$IPV6PREFIXLENGTH_1" ]; then
- ifup_ipv6_real $DEVICE $IPV6ADDR_1 $IPV6PREFIXLENGTH_1
+
+ # Setup additional IPv6 addresses from list
+ if [ ! -z "$IPV6ADDR_SECONDARIES" ]; then
+ for ipv6addr in $IPV6ADDR_SECONDARIES; do
+ ifup_ipv6_real $DEVICE $ipv6addr $IPV6PREFIXLENGTH
+ done
fi
# Setup additional static IPv6 routes on specified interface
- if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
+ if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
grep "^$DEVICE" /etc/sysconfig/static-routes-ipv6 | while read device args; do
if [ "$device" = "$DEVICE" ]; then
ifup_ipv6_route $args $DEVICE
fi
done
fi
-
- # Setup tunnel
- if ! [ -z "$IPV6TUNNELIPV4" -o -z "$IPV6TUNNELROUTE" ]; then
- ifup_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $IPV6TUNNELROUTE
- fi
fi
diff --git a/sysconfig/network-scripts/ifup-sit b/sysconfig/network-scripts/ifup-sit
index ef703943..8a1daa56 100755
--- a/sysconfig/network-scripts/ifup-sit
+++ b/sysconfig/network-scripts/ifup-sit
@@ -2,9 +2,14 @@
#
# ifup-sit
#
+#
# Taken from:
-# (P) & (C) 2000 Peter Bieringer <pb@bieringer.de>
-# some hints taken from RedHat scripts
+# (P) & (C) 2000-2001 by Peter Bieringer <pb@bieringer.de>
+#
+# Version 2001-02-06
+#
+
+# Filter tags (for stripping, empty lines following if all is stripped)
. /etc/sysconfig/network
@@ -23,19 +28,25 @@ fi
# Test if IPv6 is up
if [ "${NETWORKING_IPV6}" = "yes" ]; then
- . /etc/sysconfig/network-scripts/network-functions-ipv6
+
+ . /etc/sysconfig/network-scripts/network-functions-ipv6
- # Setup tunnel
- if ! [ -z "$IPV6TUNNELIPV4" -o -z "$IPV6TUNNELROUTE" ]; then
- ifup_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $IPV6TUNNELROUTE
- fi
+ # Setup IPv6-in-IPv4 tunnel(s)
+ if [ "$DEVICE" = "sit0" ]; then
+ ifup_ipv6_autotunnel
+ elif [ ! -z "$IPV6TUNNELIPV4" ]; then
+ if [ ! -z "$IPV6ADDR" ]; then
+ # Numbered tunnel
+ ifup_ipv6_real sit0 $IPV6ADDR $IPV6PREFIXLENGTH
+ fi
- # Add additional static IPv6 routes on specified interface
- if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
- grep "^$DEVICE" /etc/sysconfig/static-routes-ipv6 | while read device ipv6route args; do
- if [ "$device" = "$DEVICE" ]; then
- ifup_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $ipv6route
- fi
- done
- fi
+ # Add static IPv6 tunnel routes on specified virtual interface
+ if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
+ grep "^$DEVICE" /etc/sysconfig/static-routes-ipv6 | while read device ipv6route args; do
+ if [ "$device" = "$DEVICE" ]; then
+ ifup_ipv6_tunnel $DEVICE $IPV6TUNNELIPV4 $ipv6route
+ fi
+ done
+ fi
+ fi
fi
diff --git a/sysconfig/network-scripts/network-functions-ipv6 b/sysconfig/network-scripts/network-functions-ipv6
index c8c61cc4..2c0e7846 100644
--- a/sysconfig/network-scripts/network-functions-ipv6
+++ b/sysconfig/network-scripts/network-functions-ipv6
@@ -3,86 +3,127 @@
# network-functions-ipv6
#
# Taken from:
-# (P) & (C) 1997-2000 Peter Bieringer <pb@bieringer.de>
+# (P) & (C) 1997-2001 by Peter Bieringer <pb@bieringer.de>
+#
+# Version: 2001-02-05
+#
+
+
+# Filter tags (for stripping, empty lines following if all is stripped)
+
+
-# DEBUG_IPV6 & 1 "set -x" mode
-# DEBUG_IPV6 & 2 prevents from executing any network configuration
-# DEBUG_IPV6 & 4 shows messages in the test section
-#DEBUG_IPV6=$[ 65535 - 1 -2 -4]
-DEBUG_IPV6=0
# Return values
# 0 = ok
# 1 = error occurs
# 2 = not enabled, i.e. no IPv6 kernel support or switched off by configuration
+
##### Test for IPv6 capabilites
function test_ipv6()
{
- if [ -z $DEBUG_IPV6 ] ; then DEBUG_IPV6=0; fi
- if ! [ $[ $DEBUG_IPV6 & 4 ] = 0 ] ; then
- echo " Tests for IPv6"
- fi
+ # Test for IPv6 enabled kernel
+
+ if ! [ -f /proc/net/if_inet6 ]; then
+ echo "Did not find IPv6 in kernel, trying to load module"
+ modprobe ipv6
+
+ if ! [ -f /proc/net/if_inet6 ]; then
+ echo "Kernel not compiled for IPv6 - stop!"
+ return 2
+ fi
+ fi
+
+ # Test for IPv6 enabled needed binaries
+
+ if ! ifconfig -? 2>&1 | grep -q "(IPv6)"; then
+ echo "'`which ifconfig`' (net-tools) not compiled for IPv6 - stop!"
+ return 2
+ fi
+
+ if ! route -? 2>&1 | grep -q "(IPv6)"; then
+ echo "'`which route`' (net-tools) not compiled for IPv6 - stop!"
+ return 2
+ fi
+
+
+ return 0
+}
+
+##### Control IPv6 forwarding
+# Display usage
+function forwarding_ipv6_usage() {
+ echo "Usage: $0 yes|no [device]"
+}
+
+
+# Control IPv6 forwarding
+# $1: control [yes|no|on|off]
+# $2: network device (if not given, global IPv6 forwarding is set)
+function forwarding_ipv6() {
+ control=$1
+ device=$2 # maybe empty
+
+ if [ -z $control ]; then
+ echo "Missing option forwarding control'"
+ forwarding_ipv6_usage
+ return 1
+ fi
+
+ if ! [ "$control" = "yes" -o "$control" = "no" -o "$control" = "on" -o "$control" = "off" ]; then
+ echo "Don't understand forwarding control option '$control'"
+ forwarding_ipv6_usage
+ return 1
+ fi
+
+ # Device "lo" need no IPv6 configuration
+ if [ "$device" = "lo" ]; then
+ return 0;
+ fi
+
+ # Run IPv6 test
+ test_ipv6 || return
- # Test for IPv6 kernel
- if ! [ $[ $DEBUG_IPV6 & 4 ] = 0 ] ; then
- echo -n " Test kernel for IPv6..."
- fi
- if ! [ -f /proc/net/if_inet6 ]; then
- echo "Did not find IPv6 in kernel, trying to load module"
- modprobe ipv6
+ if [ "$control" = "yes" -o "$control" = "on" ]; then
+ status=1
+ else
+ status=0
+ fi
+
+ # Global control? (if no device is given)
+ if [ -z $device ]; then
+ if [ -f /proc/sys/net/ipv6/conf/all/forwarding ]; then
+ echo "$status" > /proc/sys/net/ipv6/conf/all/forwarding
+ fi
+ fi
- if ! [ -f /proc/net/if_inet6 ]; then
- if ! [ $[ $DEBUG_IPV6 & 4 ] = 0 ] ; then
- echo "Not compiled for IPv6 - stop!"
- else
- echo "Kernel not compiled for IPv6 - stop!"
- fi
- return 2
- fi
- else
- if ! [ $[ $DEBUG_IPV6 & 4 ] = 0 ] ; then
- echo " Ok!"
- fi
- fi
-
- # Test for IPv6 enabled needed binaries
- if ! [ $[ $DEBUG_IPV6 & 4 ] = 0 ] ; then
- echo n " Test binaries for IPv6 capability..."
- fi
-
- if ! ifconfig -? 2>&1 | grep -q "(IPv6)"; then
- echo "'`which ifconfig`' (net-tools) not compiled for IPv6 - stop!"
- return 2
- fi
+ # Per device control
+ if [ ! -z $device ]; then
+ if [ -f /proc/sys/net/ipv6/conf/$device/forwarding ]; then
+ echo "$string IPv6 forwarding for device '$device'"
+ echo "$status" > /proc/sys/net/ipv6/conf/$device/forwarding
+ fi
+ fi
- if ! route -? 2>&1 | grep -q "(IPv6)"; then
- echo "'`which route`' (net-tools) not compiled for IPv6 - stop!"
- return 2
- fi
-
- if ! [ $[ $DEBUG_IPV6 & 4 ] = 0 ] ; then
- echo " Ok!"
- fi
-
- # Info about executing
- if [ $[ $DEBUG_IPV6 > 0 ] = 1 ]; then
- echo " Executing in DEBUG_IPV6 mode: $DEBUG_IPV6"
- fi
}
-##### Static route configuration
+
+##### Static IPv6 route configuration
# Display usage
-function ifup_ipv6_route_usage() {
+function ifupdown_ipv6_route_usage() {
echo $"Usage: $0 IPv6-network IPv6-gateway [device]"
}
-# set route
+# Set static IPv6 route
+# $1: IPv6 network to route
+# $2: IPv6 gateway over which $1 should be routed
+# $3: Interface (optional)
function ifup_ipv6_route() {
networkipv6=$1
gatewayipv6=$2
@@ -90,31 +131,37 @@ function ifup_ipv6_route() {
if [ -z $networkipv6 ]; then
echo $"Missing option 'IPv6-network'"
- ifup_ipv6_route_usage
+ ifupdown_ipv6_route_usage
return 1
fi
if [ -z $gatewayipv6 ]; then
- echo $"Missing option 'IPv6-gateway'"
- ifup_ipv6_route_usage
+ echo "Missing option 'IPv6-gateway'"
+ ifupdown_ipv6_route_usage
return 1
fi
- # Run IPv6 test
+ # Device "lo" need no IPv6 configuration
+ if [ "$device" = "lo" ]; then
+ return 0;
+ fi
+
+ # Run IPv6 test
test_ipv6 || return
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set -x
if [ -z $device ]; then
- route -A inet6 add $networkipv6 gw $gatewayipv6
+ route -A inet6 add $networkipv6 gw $gatewayipv6
else
- route -A inet6 add $networkipv6 gw $gatewayipv6 dev $device
+ route -A inet6 add $networkipv6 gw $gatewayipv6 dev $device
fi
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set +x
}
-# delete route
+# Delete static IPv6 route
+# $1: IPv6 network to route
+# $2: IPv6 gateway over which $1 should be routed
+# $3: Interface (optional)
function ifdown_ipv6_route() {
networkipv6=$1
gatewayipv6=$2
@@ -132,210 +179,319 @@ function ifdown_ipv6_route() {
return 1
fi
- # Run IPv6 test
+ # Device "lo" need no IPv6 configuration
+ if [ "$device" = "lo" ]; then
+ return 0;
+ fi
+
+ # Run IPv6 test
test_ipv6 || return
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set -x
if [ -z $device ]; then
- route -A inet6 del $networkipv6 gw $gatewayipv6
+ echo "Delete IPv6 route '$networkipv6' gateway '$gatewayipv6'"
+ route -A inet6 del $networkipv6 gw $gatewayipv6
else
- route -A inet6 del $networkipv6 gw $gatewayipv6 dev $device
+ route -A inet6 del $networkipv6 gw $gatewayipv6 dev $device
fi
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set +x
}
-##### tunnel configuration
+##### automatic tunneling configuration
-# Display usage
-function ifup_ipv6_tunnel_usage() {
- echo $"Usage: $0 interfacename IPv4-tunneladdress IPv6-route"
+## Configure automatic tunneling up
+function ifup_ipv6_autotunnel() {
+
+ # Run IPv6 test
+ test_ipv6 || return
+
+
+ # enable IPv6-over-IPv4 tunnels
+ if ifconfig sit0 | grep -q "UP "; then
+ # already up, do nothing
+ true
+ else
+ # basic tunnel device to up
+ ifconfig sit0 up
+
+ # Switch on forwarding
+ forwarding_ipv6 on sit0
+ fi
+
+}
+
+
+## Configure automatic tunneling down
+function ifdown_ipv6_autotunnel() {
+
+ # Run IPv6 test
+ test_ipv6 || return
+
+
+ # disable IPv6-over-IPv4 tunnels (if a tunnel is no longer up)
+ if route -A inet6 -n | grep sit0 | grep -v -q "^::"; then
+ # existing routes, do nothing
+ true
+ else
+ # basic tunnel device to down
+ echo "Bring down basic tunnel device 'sit0'"
+ # Switch off forwarding
+ forwarding_ipv6 off sit0
+
+ ifconfig sit0 down
+ fi
+
+}
+
+
+##### static tunneling configuration
+
+function ifupdown_ipv6_tunnel_usage() {
+ echo "Usage: $0 interfacename IPv4-tunneladdress IPv6-route"
}
-## Configure tunnels up
+
+## Configure static tunnels up
+# $1: Interface (not needed - dummy)
+# $2: IPv4 address of foreign tunnel
+# $3: IPv6 route through this tunnel
function ifup_ipv6_tunnel() {
device=$1
addressipv4tunnel=$2
routeipv6=$3
if [ -z $device ]; then
- echo $"Missing option 'device'"
- ifup_ipv6_tunnel_usage
+ echo "Missing option 'device'"
+ ifupdown_ipv6_tunnel_usage
return 1
fi
if [ -z $addressipv4tunnel ]; then
- echo $"Missing option 'IPv4-tunneladdress'"
- ifup_ipv6_tunnel_usage
+ echo "Missing option 'IPv4-tunneladdress'"
+ ifupdown_ipv6_tunnel_usage
return 1
fi
if [ -z $routeipv6 ]; then
- echo $"Missing option 'IPv6-route'"
- ifup_ipv6_tunnel_usage
+ echo "Missing option 'IPv6-route'"
+ ifupdown_ipv6_tunnel_usage
return 1
fi
- # Run IPv6 test
+ # Run IPv6 test
test_ipv6 || return
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set -x
- # enable IPv6-over-IPv4 tunnels
- if ifconfig sit0 | grep -q "UP "; then
- # already up, do nothing
- true
- else
- # basic tunnel device to up
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ] ; then
- ifconfig sit0 up
- fi
- fi
-
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ]; then
- # Set up a tunnel
+ # enable general IPv6-over-IPv4 tunneling
+ ifup_ipv6_autotunnel
+
+ # Set up a tunnel
route -A inet6 add $routeipv6 gw ::$addressipv4tunnel dev sit0
- fi
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set +x
}
-## Configure tunnels down
+## Configure static tunnels down
+# $1: Interface (not used - dummy)
+# $2: IPv4 address of foreign tunnel
+# $3: IPv6 route through this tunnel
function ifdown_ipv6_tunnel() {
device=$1
addressipv4tunnel=$2
routeipv6=$3
if [ -z $device ]; then
- echo $"Missing option 'device'"
- ifup_ipv6_tunnel_usage
+ echo "Missing option 'device'"
+ ifupdown_ipv6_tunnel_usage
return 1
fi
if [ -z $addressipv4tunnel ]; then
- echo $"Missing option 'IPv4-tunneladdress'"
- ifup_ipv6_tunnel_usage
+ echo "Missing option 'IPv4-tunneladdress'"
+ ifupdown_ipv6_tunnel_usage
return 1
fi
if [ -z $routeipv6 ]; then
- echo $"Missing option 'IPv6-route'"
- ifup_ipv6_tunnel_usage
+ echo "Missing option 'IPv6-route'"
+ ifupdown_ipv6_tunnel_usage
return 1
fi
- # Run IPv6 test
+ # Run IPv6 test
test_ipv6 || return
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set -x
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ]; then
- # Set up a tunnel
+ # Set up a tunnel
route -A inet6 del $routeipv6 gw ::$addressipv4tunnel dev sit0
- fi
- # disable IPv6-over-IPv4 tunnels (if tunnel is no longer up)
- if route -A inet6 -n | grep sit0 | grep -v -q "^::"; then
- # existing routes, do nothing
- true
- else
- # basic tunnel device to down
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ] ; then
- ifconfig sit0 down
- fi
- fi
+ # disable IPv6-over-IPv4 tunneling (if no longer a tunnel is up)
+ ifdown_ipv6_autotunnel
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set +x
}
-
-##### Interface configuration
-# Display usage
-function ifup_ipv6_usage() {
- echo $"Usage: $0 interfacename IPv6-address IPv6-prefixlength"
+##### Interface configuration
+function ifupdown_ipv6_usage() {
+ echo "Usage: $0 interfacename IPv6-address [IPv6-prefixlength]"
}
-## Configure interfaces up
+## Add an IPv6 address for given interface
+# $1: Interface
+# $2: IPv6 address
+# $3: IPv6 prefix length (optional)
function ifup_ipv6_real() {
device=$1
address=$2
prefixlength=$3
if [ -z $device ]; then
- echo $"Missing option 'device'"
- ifup_ipv6_usage
+ echo "Missing option 'device'"
+ ifupdown_ipv6_usage
return 1
fi
+ # Device "lo" need no IPv6 configuration
+ if [ "$device" = "lo" ]; then
+ return 0;
+ fi
+
if [ -z $address ]; then
- echo $"Missing option 'IPv6-address'"
- ifup_ipv6_usage
+ echo "Missing option 'IPv6-address'"
+ ifupdown_ipv6_usage
return 1
fi
- if [ -z $prefixlength ]; then
- echo $"Missing option 'Prefixlength'"
- ifup_ipv6_usage
- return 1
+ # Test status of interface
+ if ifconfig $device | grep -q "UP "; then
+ # Interface is up
+ true
+ else
+ # no IPv4 for this interface, interface is still down, do up ...
+ ifconfig $device up
fi
- # Run IPv6 test
+ # Extract address parts
+ prefixlength_implicit="`echo $address | awk -F/ '{ print $2 }'`"
+ address_implicit="`echo $address | awk -F/ '{ print $1 }'`"
+
+ # Overwrite optional given one
+ if [ ! -z $prefixlength_implicit ]; then
+ prefixlength=$prefixlength_implicit
+ elif [ -z $prefixlength ]; then
+ prefixlength=128
+ fi
+
+ # Build IPv6 address
+ address="$address_implicit/$prefixlength"
+
+ # Run IPv6 test
test_ipv6 || return
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set -x
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ]; then
- ifconfig $device add $address/$length || return 2
+ # Only add, if address do not already exist
+ address_configured="`ifconfig $device | grep "inet6 addr:" | grep "$address" | awk '{ print $3 }'`"
+ address_configured_type="`ifconfig $device | grep "inet6 addr:" | grep "$address" | awk '{ print $4 }'`"
+
+ if [ "$address_configured" = "$address" ]; then
+ true
+ else
+ ifconfig $device add $address || return 2
fi
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ]; then
- route -A inet6 add $address/$prefixlength dev $device || return 2
- fi
+# route -A inet6 add $address/$prefixlength dev $device || return 2
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set +x
}
-## Configure interfaces down
+## Remove all IPv6 routes and addresses for given interface
+# cleanup to prevent kernel crashes
+# $1: Interface
+function ifdown_ipv6_real_all() {
+ device=$1
+
+ if [ -z $device ]; then
+ echo "Missing option 'device'"
+ echo "Usage: ifdown_ipv6_real_all interfacename"
+ return 1
+ fi
+
+ # Get all IPv6 routes through given interface and remove them
+ route -A inet6 | grep $device | while read ipv6net nexthop flags metric ref use iface args; do
+ if [ "$device" = "$iface" ]; then
+ if echo $flags | grep -v -q "A"; then
+ # Only non addrconf (automatic installed) routes should be removed
+ ifdown_ipv6_route $ipv6net $nexthop $iface
+ fi
+ fi
+ done
+
+ # Get all IPv6 addresses assigned to given interface and remove them
+ ifconfig $device | grep "inet6 addr:" | awk '{ print $3 }' | while read ipv6addr args; do
+ ifdown_ipv6_real $device $ipv6addr
+ done
+}
+
+## Remove an IPv6 address on given interface
+# $1: Interface
+# $2: IPv6 address
+# $3: IPv6 prefix length (optional)
function ifdown_ipv6_real() {
device=$1
address=$2
prefixlength=$3
if [ -z $device ]; then
- echo $"Missing option 'device'"
- ifup_ipv6_usage
+ echo "Missing option 'device'"
+ ifupdown_ipv6_usage
return 1
fi
+ # Device "lo" need no IPv6 configuration
+ if [ "$device" = "lo" ]; then
+ return 0;
+ fi
+
if [ -z $address ]; then
- echo $"Missing option 'IPv6-address'"
- ifup_ipv6_usage
+ echo "Missing option 'IPv6-address'"
+ ifupdown_ipv6_usage
return 1
fi
- if [ -z $prefixlength ]; then
- echo $"Missing option 'Prefixlength'"
- ifup_ipv6_usage
- return 1
+ # Extract address parts
+ prefixlength_implicit="`echo $address | awk -F/ '{ print $2 }'`"
+ address_implicit="`echo $address | awk -F/ '{ print $1 }'`"
+
+ # Overwrite optional given one
+ if [ ! -z $prefixlength_implicit ]; then
+ prefixlength=$prefixlength_implicit
+ elif [ -z $prefixlength ]; then
+ prefixlength=128
fi
- # Run IPv6 test
+ # Build IPv6 address
+ address="$address_implicit/$prefixlength"
+
+ # Run IPv6 test
test_ipv6 || return
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set -x
+#
+# route -A inet6 del $address/$prefixlength dev $device || return 2
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ]; then
- route -A inet6 del $address/$prefixlength dev $device || return 2
- fi
- if [ $[ $DEBUG_IPV6 & 2 ] = 0 ]; then
- ifconfig $device del $address/$length || return 2
+ # Only remove, if address exists and is not link-local (prevents from kernel crashing)
+ address_configured="`ifconfig $device | grep "inet6 addr:" | grep "$address" | awk '{ print $3 }'`"
+ address_configured_type="`ifconfig $device | grep "inet6 addr:" | grep "$address" | awk '{ print $4 }'`"
+ if [ ! -z "$address_configured" ]; then
+ if [ "$address_configured_type" = "Scope:Link" ]; then
+ true
+ else
+ ifconfig $device del $address || return 2
+ fi
+ else
+ true
fi
- [ $[ $DEBUG_IPV6 & 1 ] = 0 ] || set +x
}
+