aboutsummaryrefslogtreecommitdiffstats
path: root/ppp/ip-up.ipv6to4
blob: 79d99c031f78073c436aebe0a50b6da1011c3caf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#!/bin/sh
#
# ip-up.ipv6to4
#
#
# Taken from:
# (P) & (C) 2000-2002 by Peter Bieringer <pb@bieringer.de>
#  
#  You will find more information in the IPv6-HowTo for Linux at
#   http://www.bieringer.de/linux/IPv6/
#
# Version 2002-01-25
#
# Calling parameters:
#  $1: interface name
#
# Called (mostly) by /etc/ppp/ip-up.local
#  like: /etc/ppp/ip-up.ipv6to4 $1 >>/var/log/ppp-ipv6to4.log 2>&1
#
# Note: this script will *kill* older still existing 6to4 tunnels regardless
#        whether they were set before by another device
#
# Uses following information from /etc/sysconfig/network:
#  NETWORKING_IPV6=yes|no: controls IPv6 initialization (global setting)
#
# Uses following information from /etc/sysconfig/network-scripts/ifcfg-$1:
#  IPV6TO4INIT=yes|no: controls configuration
#  IPV6TO4_IPV4ADDR=<IPv4 address>: special local address for 6to4 tunneling (only needed behind a NAT gateway)
#  IPV6TO4_RELAY=<IPv4 address>: remote 6to4 relay router address [default: 192.88.99.1]
#  IPV6TO4_ROUTING="<device>-<suffix>/<prefix length> ...": information to setup local subnetting
#    Example: IPV6TO4_ROUTING="eth0-:f101::0/64 eth1-:f102::0/64"
#
#  IPV6_CONTROL_RADVD=yes|no: controls radvd triggering
#  IPV6_RADVD_PIDFILE=<file>: PID file of radvd for sending signals, default is "/var/run/radvd/radvd.pid"
#  IPV6_RADVD_TRIGGER_ACTION=startstop|reload|restart|SIGHUP: how to trigger radvd [optional, default is SIGHUP]
#
# Requirements
#  radvd-0.6.2p3 or newer supporting option "Base6to4Interface"
#


if [ -z "$1" ]; then
	echo $"Argument 1 is empty but should contain interface name - skip IPv6to4 initialization"
	exit 1
fi

# Get global network configuration
. /etc/sysconfig/network

# Source IPv4 helper functions
cd /etc/sysconfig/network-scripts
. network-functions

CONFIG=$1
[ -f "$CONFIG" ] || CONFIG=ifcfg-$CONFIG
source_config

# IPv6 don't need aliases anymore, config is skipped
REALDEVICE=`echo ${DEVICE} | sed 's/:.*//g'`
[ "$DEVICE" != "$REALDEVICE" ] && exit 0

# Test whether IPv6 should be configured, else stop
[ "$NETWORKING_IPV6" = "yes" ] || exit 0

if [ ! -f /etc/sysconfig/network-scripts/network-functions-ipv6 ]; then 
        exit 1 
fi 

. /etc/sysconfig/network-scripts/network-functions-ipv6


# Run basic IPv6 test (and make sure the ipv6 module will be loaded), if not ok, skip IPv6 initialization
ipv6_test || exit 1

# Setup of 6to4, if configured
valid6to4config="yes"
if [ "$IPV6TO4INIT" = "yes" ]; then
	if [ ! -z "$IPV6TO4_IPV4ADDR" ]; then
		# Take special configured from config file (precedence 1)
		ipv4addr="$IPV6TO4_IPV4ADDR"
        else
		# Get IPv4 address from interface first (has precedence 2)
		ipv4addr="`LC_ALL=C ifconfig $DEVICE |grep "inet addr:" | tr : " " | awk '{ print $3 }'`"
		if [ -z "$ipv4addr" ]; then
                	# Take configured from config file (precedence 3)
                	ipv4addr="$IPADDR"
            	fi
        fi
        if [ ! -z "$ipv4addr" ]; then
		# Test for non-global IPv4 address
		if ! ipv6_test_ipv4_addr_global_usable $ipv4addr; then
                	echo $"Given IPv4 address '$ipv4addr' is not globally usable, 6to4 configuration is not valid"
			valid6to4config="no"
		fi
	else
		echo $"IPv6to4 configuration needs an IPv4 address on related interface or otherwise specified, 6to4 configuration is not valid"
		valid6to4config="no"
	fi
	if [ -z "$IPV6TO4_RELAY" ]; then
		IPV6TO4_RELAY="192.88.99.1"
       	fi

	# Check/generate relay address
	ipv6to4_relay="`ipv6_create_6to4_relay_address $IPV6TO4_RELAY`"
	if [ $? -ne 0 ]; then
		valid6to4config="no"
	fi
 
	if [ "$valid6to4config" = "yes" ]; then
		# Beep 
		if [ -x /usr/bin/beep ]; then /usr/bin/beep -f 2000; else echo -en "\a" >/dev/console; fi

		# Delete routes to local networks
       		for devsuf in $IPV6TO4_ROUTING; do
			dev="`echo $devsuf | awk -F- '{ print $1 }'`"
			ipv6_cleanup_routes $dev ::
		done

		# Cleanup all old data (needed, if "ip-down.ipv6to4" wasn't executed), delete all configured 6to4 address
		ipv6_cleanup_6to4_tunnels tun6to4

		# Setup new data
		ipv6_add_6to4_tunnel tun6to4 $ipv4addr || exit 1

		# Add default route, if device matches
		if [ "$IPV6_DEFAULTDEV" = "tun6to4" ]; then
			if [ ! -z "$IPV6_DEFAULTGW" ]; then
				echo $"Warning: interface 'tun6to4' does not support 'IPV6_DEFAULTGW', ignored"
			fi
			ipv6_set_default_route $ipv6to4_relay tun6to4
		fi

		# Add static routes
		if [ -f /etc/sysconfig/static-routes-ipv6 ]; then
			LC_ALL=C grep -w "^tun6to4" /etc/sysconfig/static-routes-ipv6 | while read device network gateway; do
				if [ -z "$network" ]; then
					continue
				fi
				if [ -z "$gateway" ]; then
					gateway="$ipv6to4_relay"
				fi
				ipv6_add_route $network $gateway tun6to4
			done
		fi
		
		# Cleanup autmatically generated autotunnel (not needed for 6to4)
		ipv6_del_route "::/96" "::" tun6to4
		ipv6_del_addr_on_device tun6to4 "::$ipv4addr/128"

	        if [ "$IPV6_CONTROL_RADVD" = "yes" ]; then
                        # Control running radvd
			ipv6_trigger_radvd up "$IPV6_RADVD_TRIGGER_ACTION" $IPV6_RADVD_PIDFILE

		        if [ ! -z "$IPV6TO4_ROUTING" ]; then
				# Generate 6to4 address
				ipv6to4prefix="`ipv6_create_6to4_prefix $ipv4addr`"
				if [ ! -z "$ipv6to4prefix" ]; then
					# Add route to local networks
					for devsuf in $IPV6TO4_ROUTING; do
						dev="`echo $devsuf | awk -F- '{ print $1 }'`"
						suf="`echo $devsuf | awk -F- '{ print $2 }'`"
						ipv6_add_route ${ipv6to4prefix}$suf :: $dev
					done
				else
					echo $"Error occured while calculating the IPv6to4 prefix"
				fi
			else
				echo $"radvd control enabled, but config is not complete"
			fi
		fi

		# Beep 
		if [ -x /usr/bin/beep ]; then /usr/bin/beep -f 2666; else echo -en "\a" >/dev/console; fi
	fi
fi