aboutsummaryrefslogtreecommitdiffstats
path: root/network-scripts/ifup-tunnel
diff options
context:
space:
mode:
Diffstat (limited to 'network-scripts/ifup-tunnel')
-rwxr-xr-xnetwork-scripts/ifup-tunnel94
1 files changed, 94 insertions, 0 deletions
diff --git a/network-scripts/ifup-tunnel b/network-scripts/ifup-tunnel
new file mode 100755
index 00000000..afdfe928
--- /dev/null
+++ b/network-scripts/ifup-tunnel
@@ -0,0 +1,94 @@
+#!/bin/bash
+# Copyright (C) 1996-2009 Red Hat, Inc. all rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License, version 2,
+# as published by the Free Software Foundation.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Thanks to:
+# - Razvan Corneliu C.R. Vilt <razvan.vilt@linux360.ro>
+# - Aaron Hope <aaron.hope@unh.edu>
+# - Sean Millichamp <sean@enertronllc.com>
+# for providing the scripts this one is based on
+
+. /etc/init.d/functions
+
+cd /etc/sysconfig/network-scripts
+. ./network-functions
+
+CONFIG=$1
+need_config "$CONFIG"
+source_config
+
+if [ "$PEER_OUTER_IPADDR" = "$PEER_INNER_IPADDR" ]; then
+ # Specifying PEER_INNER_IPADDR would automatically add a route to the peer
+ # through the tunnel, redirecting tunnel packets back to the tunnel and
+ # creating a dead loop.
+ unset PEER_INNER_IPADDR
+fi
+
+case "$TYPE" in
+GRE)
+ MODE=gre
+ proto=-4
+ /sbin/modprobe ip_gre
+ ;;
+IPIP)
+ MODE=ipip
+ proto=-4
+ /sbin/modprobe ipip
+ ;;
+IPIP6|EXTERNAL)
+ MODE=ipip6
+ proto=-6
+ /sbin/modprobe ip6_tunnel
+ ;;
+*)
+ net_log $"Invalid tunnel type $TYPE"
+ exit 1
+ ;;
+esac
+
+# Generic tunnel devices are not supported here
+if [ "$DEVICE" = gre0 -o "$DEVICE" = tunl0 -o "$DEVICE" = ip6tnl0 ]; then
+ net_log $"Device '$DEVICE' isn't supported as a valid GRE device name."
+ exit 1
+fi
+
+# Create the tunnel
+# The outer addresses are those of the underlying (public) network.
+if [ "$TYPE" = 'EXTERNAL' ]; then
+ /sbin/ip link add "$DEVICE" type ip6tnl external
+else
+ /sbin/ip $proto tunnel add "$DEVICE" mode "$MODE" \
+ ${MY_OUTER_IPADDR:+local "$MY_OUTER_IPADDR"} \
+ ${PEER_OUTER_IPADDR:+remote "$PEER_OUTER_IPADDR"} \
+ ${KEY:+key "$KEY"} ${TTL:+ttl "$TTL"}
+fi
+
+if [ -n "$MTU" ]; then
+ /sbin/ip link set "$DEVICE" mtu "$MTU"
+fi
+
+# The inner address are used mainly for communication between a gateway
+# and a private network. When the peer is configured with an inner address
+# contained in the peer's private network or identical to it's public address,
+# it need not be specified.
+/sbin/ip addr add "$MY_INNER_IPADDR" dev "$DEVICE" \
+ ${PEER_INNER_IPADDR:+peer "$PEER_INNER_IPADDR"}
+
+/sbin/ip link set dev "$DEVICE" up
+
+# IPv6 initialisation?
+/etc/sysconfig/network-scripts/ifup-ipv6 ${CONFIG}
+
+exec /etc/sysconfig/network-scripts/ifup-post "$CONFIG" "$2"