| #!/bin/bash |
| # |
| |
| # Copyright (C) 2011, 2012, 2013 Google Inc. |
| # |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 2 of the License, or |
| # (at your option) any later version. |
| # |
| # 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. |
| |
| @SHELL_ENV_INIT@ |
| |
| function check { |
| |
| if [ -z "$INTERFACE" ]; then |
| echo "No network interface specified" |
| exit 1 |
| fi |
| |
| if [ -z "$MODE" ]; then |
| echo "MODE not specified" |
| exit 1 |
| fi |
| |
| } |
| |
| function fix_mac { |
| |
| # Fix the autogenerated MAC to have the first octet set to "fe" |
| # to discourage the bridge from using the TAP dev's MAC |
| FIXED_MAC=$(ip link show $INTERFACE | \ |
| awk '{if ($1 == "link/ether") printf("fe%s",substr($2,3,15))}') |
| # in case of a vif (xen_netback device) this action is not allowed |
| ip link set $INTERFACE address $FIXED_MAC || true |
| |
| } |
| |
| function setup_bridge { |
| |
| if [ "$MODE" = "bridged" ]; then |
| fix_mac |
| ip link set $INTERFACE up |
| ip link set $INTERFACE mtu $(</sys/class/net/${LINK}/mtu) |
| |
| # Connect the interface to the bridge |
| brctl addif $LINK $INTERFACE |
| fi |
| |
| } |
| |
| function setup_ovs { |
| if [ "$MODE" = "openvswitch" ]; then |
| ovs-vsctl add-port ${LINK} $INTERFACE |
| fi |
| } |
| |
| function setup_route { |
| if [ "$MODE" = "routed" ]; then |
| ip link set $INTERFACE up |
| |
| if [ -z "$IP" ]; then |
| echo "Routed NIC but no IP address specified" |
| exit 1 |
| fi |
| |
| # Route traffic targeted at the IP to the interface |
| if [ -n "$LINK" ]; then |
| while ip rule del dev $INTERFACE; do :; done |
| ip rule add dev $INTERFACE table $LINK |
| ip route replace $IP table $LINK proto static dev $INTERFACE |
| |
| else |
| ip route replace $IP proto static dev $INTERFACE |
| fi |
| |
| # Allow routing and arp proxying, or ndp proxying (IPv6) |
| if [ -d "/proc/sys/net/ipv4/conf/$INTERFACE" ]; then |
| echo 1 > /proc/sys/net/ipv4/conf/$INTERFACE/proxy_arp |
| echo 1 > /proc/sys/net/ipv4/conf/$INTERFACE/forwarding |
| fi |
| |
| if [ -d "/proc/sys/net/ipv6/conf/$INTERFACE" ]; then |
| echo 1 > /proc/sys/net/ipv6/conf/$INTERFACE/proxy_ndp |
| echo 1 > /proc/sys/net/ipv6/conf/$INTERFACE/forwarding |
| fi |
| fi |
| } |