diff options
-rw-r--r-- | doc/net.example.Linux.in | 12 | ||||
-rw-r--r-- | net/Makefile | 2 | ||||
-rw-r--r-- | net/macvlan.sh | 69 |
3 files changed, 82 insertions, 1 deletions
diff --git a/doc/net.example.Linux.in b/doc/net.example.Linux.in index 952f8eb7..b841613e 100644 --- a/doc/net.example.Linux.in +++ b/doc/net.example.Linux.in @@ -581,6 +581,18 @@ # NOTE: depend functions only work in /etc/conf.d/net # and not in profile configs such as /etc/conf.d/net.foo +# MAC-VLAN support +# The following configuration can be used to create a new interface 'macvlan0' +# linked to 'eth0' +#macvlan_macvlan0="eth0" + +# MAC-VLAN mode (private, vepa, bridge, passtru) +#mode_macvlan0="private" + +# IP address, MAC address, ... are configured as a normal interface +#config_macvlan0="192.168.20.20/24" +#mac_macvlan0="00:50:06:20:20:20" + #----------------------------------------------------------------------------- # Bonding # For link bonding/trunking on 2.4 kernels, or kernels without sysfs diff --git a/net/Makefile b/net/Makefile index 664800df..e87d3ddd 100644 --- a/net/Makefile +++ b/net/Makefile @@ -13,7 +13,7 @@ SRCS-Linux= iwconfig.sh.in INC-Linux= adsl.sh apipa.sh arping.sh bonding.sh br2684ctl.sh bridge.sh \ ccwgroup.sh clip.sh ethtool.sh iproute2.sh ifplugd.sh ip6to4.sh \ ipppd.sh iwconfig.sh netplugd.sh pppd.sh pump.sh tuntap.sh udhcpc.sh \ - vlan.sh + vlan.sh macvlan.sh SRCS-NetBSD= INC-NetBSD= ifwatchd.sh diff --git a/net/macvlan.sh b/net/macvlan.sh new file mode 100644 index 00000000..92bcf1f8 --- /dev/null +++ b/net/macvlan.sh @@ -0,0 +1,69 @@ +# 2011-09-22 Stef Simoens <stef@bgs.org> +# based on vlan.sh & tuntap.sh +# Copyright (c) 2007-2008 Roy Marples <roy@marples.name> +# All rights reserved. Released under the 2-clause BSD license. + +_ip() +{ + if [ -x /bin/ip ]; then + echo /bin/ip + else + echo /sbin/ip + fi +} + +macvlan_depend() +{ + program $(_ip) + after interface + before dhcp macchanger +} + +_is_macvlan() +{ + [ -n "$(export RC_SVCNAME="net.${IFACE}"; service_get_value macvlan)" ] +} + +_check_macvlan() +{ + if [ ! -d /sys/module/macvlan ]; then + modprobe macvlan + if [ ! -d /sys/module/macvlan ]; then + eerror "MAC-VLAN support is not present in this kernel" + return 1 + fi + fi +} + +macvlan_pre_start() +{ + # MAC-VLAN needs an existing interface to link to + local macvlan= + eval macvlan=\$macvlan_${IFVAR} + [ -z "${macvlan}" ] && return 0 + + _check_macvlan || return 1 + + # optional mode, default to "private" + local mode= + eval mode=\$mode_${IFVAR} + [ -z "${mode}" ] && mode="private" + + ebegin "Creating MAC-VLAN ${IFACE} to ${macvlan}" + e="$(ip link add link "${macvlan}" name "${IFACE}" type macvlan mode "${mode}" 2>&1 1>/dev/null)" + if [ -n "${e}" ]; then + eend 1 "${e}" + else + eend 0 && service_set_value macvlan "${macvlan}" + fi +} + + +macvlan_post_stop() +{ + _is_macvlan || return 0 + + ebegin "Removing MAC-VLAN ${IFACE}" + ip link delete "${IFACE}" type macvlan >/dev/null + eend $? +} |