commit: 6befe06a7e72b5b7f17c7f1118fc16000a0cce13
Author: Doug Freed <dwfreed <AT> mtu <DOT> edu>
AuthorDate: Sat Mar 14 23:55:06 2015 +0000
Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sat Mar 14 23:55:06 2015 +0000
URL: https://gitweb.gentoo.org/proj/netifrc.git/commit/?id=6befe06a
bridge: use/prefer iproute2/sysfs where possible
Use and prefer iproute2 and sysfs over bridge-utils where possible.
Most users already have iproute2 installed, so this reduces the number
of external programs they need to use all of netifrc's functionality.
net/bridge.sh | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 83 insertions(+), 6 deletions(-)
diff --git a/net/bridge.sh b/net/bridge.sh
index 60d3eeb..87e4055 100644
--- a/net/bridge.sh
+++ b/net/bridge.sh
@@ -4,7 +4,7 @@
bridge_depend()
{
before interface macnet
- program brctl
+ program ip brctl
}
_config_vars="$_config_vars bridge bridge_add brctl"
@@ -29,6 +29,83 @@ _bridge_ports()
done
}
+_brctl()
+{
+ if [ -z "${_bridge_use_ip}" ]; then
+ if ip -V >/dev/null 2>&1 && [ "$(ip -V | cut -c 24-29)" -ge
130430 ]; then
+ _bridge_use_ip=1
+ else
+ _bridge_use_ip=0
+ fi
+ fi
+ if [ "${_bridge_use_ip}" -eq 1 ]; then
+ case "$1" in
+ addbr)
+ ip link add "$2" type bridge
+ ;;
+ delbr)
+ ip link del "$2"
+ ;;
+ addif)
+ ip link set "$3" master "$2"
+ ;;
+ delif)
+ ip link set "$3" nomaster
+ ;;
+ setageing)
+ echo "$3" >
/sys/class/net/"$2"/bridge/ageing_time
+ ;;
+ setgcint)
+ # appears to have been dropped in Debian, and I
don't see a sysfs file for it
+ eerror "brctl setgcint is not supported!"
+ return 1
+ ;;
+ stp)
+ if [ "$3" = "on" -o "$3" = "yes" -o "$3" = "1"
]; then
+ _stp_state=1
+ elif [ "$3" = "off" -o "$3" = "no" -o "$3" =
"0" ]; then
+ _stp_state=0
+ else
+ eerror "Invalid STP state for brctl
stp!"
+ return 1
+ fi
+ echo ${_stp_state} >
/sys/class/net/"$2"/bridge/stp_state
+ ;;
+ setbridgeprio)
+ echo "$3" > /sys/class/net/"$2"/bridge/priority
+ ;;
+ setfd)
+ echo "$3" >
/sys/class/net/"$2"/bridge/forward_delay
+ ;;
+ sethello)
+ echo "$3" >
/sys/class/net/"$2"/bridge/hello_time
+ ;;
+ setmaxage)
+ echo "$3" > /sys/class/net/"$2"/bridge/max_age
+ ;;
+ setpathcost)
+ echo "$4" >
/sys/class/net/"$2"/brif/"$3"/path_cost
+ ;;
+ setportprio)
+ echo "$4" >
/sys/class/net/"$2"/brif/"$3"/priority
+ ;;
+ hairpin)
+ if [ "$4" -eq "on" -o "$4" -eq "yes" -o "$4"
-eq "1" ]; then
+ _hairpin_mode=1
+ elif [ "$4" -eq "off" -o "$4" -eq "no" -o "$4"
-eq "0" ]; then
+ _hairpin_mode=0
+ else
+ eerror "Invalid hairpin mode for brctl
hairpin!"
+ return 1
+ fi
+ echo ${_hairpin_mode} >
/sys/class/net/"$2"/brif/"$3"/hairpin_mode
+ ;;
+ esac
+ else
+ brctl "$@"
+ fi
+}
+
bridge_pre_start()
{
local brif= oiface="${IFACE}" e= x=
@@ -70,7 +147,7 @@ bridge_pre_start()
if ! _is_bridge ; then
ebegin "Creating bridge ${IFACE}"
- if ! brctl addbr "${IFACE}"; then
+ if ! _brctl addbr "${IFACE}"; then
eend 1
return 1
fi
@@ -89,7 +166,7 @@ bridge_pre_start()
x=$1
shift
set -- "${x}" "${IFACE}" "$@"
- brctl "$@"
+ _brctl "$@"
done
unset IFS
@@ -120,7 +197,7 @@ bridge_pre_start()
fi
# The interface is known to exist now
_up
- if ! brctl addif "${BR_IFACE}" "${x}"; then
+ if ! _brctl addif "${BR_IFACE}" "${x}"; then
eend 1
return 1
fi
@@ -176,13 +253,13 @@ bridge_post_stop()
ebegin "Removing port ${port}${extra}"
local IFACE="${port}"
_set_flag -promisc
- brctl delif "${iface}" "${port}"
+ _brctl delif "${iface}" "${port}"
eend $?
done
if ${delete}; then
eoutdent
- brctl delbr "${iface}"
+ _brctl delbr "${iface}"
eend $?
fi