summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2012-03-09 21:42:40 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2012-03-09 21:42:40 +0000
commit2c34657f36490d3ba93c8b973bf5924f991a4889 (patch)
treef2acab750d15e27cb9025ceb954b908c533fafab
parentcfefa14ecd6c0124d89d0534c6b9514ec15a9001 (diff)
downloadaports-2c34657f36490d3ba93c8b973bf5924f991a4889.tar.bz2
aports-2c34657f36490d3ba93c8b973bf5924f991a4889.tar.xz
testing/bridge: new aport
Scripts for configuring network bridge interfaces http://wiki.alpinelinux.org/wiki/Bridge
-rw-r--r--testing/bridge/APKBUILD39
-rwxr-xr-xtesting/bridge/bridge.pre-up139
2 files changed, 178 insertions, 0 deletions
diff --git a/testing/bridge/APKBUILD b/testing/bridge/APKBUILD
new file mode 100644
index 000000000..72b901e63
--- /dev/null
+++ b/testing/bridge/APKBUILD
@@ -0,0 +1,39 @@
+# Contributor: Natanael Copa <ncopa@alpinelinux.org>
+# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
+pkgname=bridge
+pkgver=1.5
+pkgrel=0
+pkgdesc="Scripts for configuring network bridge interfaces"
+url="http://wiki.alpinelinux.org/wiki/Bridge"
+arch="noarch"
+license="GPL"
+depends=""
+makedepends=""
+install=""
+subpackages=""
+source="bridge.pre-up"
+
+_builddir=
+prepare() {
+ local i
+ cd "$_builddir"
+ for i in $source; do
+ case $i in
+ *.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;;
+ esac
+ done
+}
+
+build() {
+ return 0
+}
+
+package() {
+ cd "$_builddir"
+ install -Dm755 "$srcdir"/bridge.pre-up \
+ "$pkgdir"/etc/network/if-pre-up.d/bridge
+ install -d "$pkgdir"/etc/network/if-post-down.d
+ ln -s ../if-pre-up.d/bridge "$pkgdir"/etc/network/if-post-down.d/bridge
+}
+
+md5sums="ba87e0186cd37bcf6e3515207141bc4e bridge.pre-up"
diff --git a/testing/bridge/bridge.pre-up b/testing/bridge/bridge.pre-up
new file mode 100755
index 000000000..7cb4160f5
--- /dev/null
+++ b/testing/bridge/bridge.pre-up
@@ -0,0 +1,139 @@
+#!/bin/sh
+
+# Copyright (C) 2012 Natanael Copa <ncopa@alpinelinux.org>
+#
+# 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. See http://www.gnu.org/ for details.
+
+all_ports_exist() {
+ local i=
+ for i in "$@"; do
+ [ -d /sys/class/net/$i ] || return 1
+ done
+ return 0
+}
+
+wait_ports() {
+ local timeout= waitports=
+ [ -z "$IF_BRIDGE_WAITPORT" ] && return 0
+ set -- $IF_BRIDGE_WAITPORT
+ timeout="$1"
+ shift
+ waitports="$@"
+ [ -z "$waitports" ] && waitports="$PORTS"
+ while ! all_ports_exist $waitports; do
+ [ "$timeout" -eq 0 ] && return 0
+ timeout=$(($timeout - 1))
+ sleep 1
+ done
+}
+
+all_ports() {
+ local i=
+ for i in /sys/class/net/*/ifindex; do
+ i=${i%/*}
+ i=${i##*/}
+ case "$i" in
+ lo|$IFACE) continue;;
+ *) echo $i;;
+ esac
+ done
+}
+
+add_ports() {
+ local port=
+ for port in $PORTS; do
+ if [ -x /etc/network/ip-pre-up.d/vlan ]; then
+ env IFACE=$port /etc/network/if-pre-up.d/vlan
+ fi
+ if [ -n "$IF_BRIDGE_HW" ]; then
+ ip link set dev $port addr $IF_BRIDGE_HW
+ fi
+ brctl addif $IFACE $port && ip link set dev $port up
+ done
+}
+
+del_ports() {
+ local port=
+ for port in $PORTS; do
+ ip link set dev $port down
+ brctl delif $IFACE $port
+ if [ -x /etc/network/ip-post-down.d/vlan ]; then
+ env IFACE=$port /etc/network/if-post-down.d/vlan
+ fi
+ done
+}
+
+set_bridge_opts() {
+ [ -n "$IF_BRIDGE_AGEING" ] \
+ && brctl setageing $IFACE $IF_BRIDGE_AGEING
+ [ -n "$IF_BRIDGE_BRIDGEPRIO" ] \
+ && brctl setbridgeprio $IFACE $IF_BRIDGE_BRIDGEPRIO
+ [ -n "$IF_BRIDGE_FD" ] \
+ && brctl setfd $IFACE $IF_BRIDGE_FD
+ [ -n "$IF_BRIDGE_GCINT" ] \
+ && brctl setgcint $IFACE $IF_BRIDGE_GCINT
+ [ -n "$IF_BRIDGE_HELLO" ] \
+ && brctl sethello $IFACE $IF_BRIDGE_HELLO
+ [ -n "$IF_BRIDGE_MAXAGE" ] \
+ && brctl setmaxage $IFACE $IF_BRIDGE_MAXAGE
+ [ -n "$IF_BRIDGE_PATHCOST" ] \
+ && brctl setpathcost $IFACE $IF_BRIDGE_PATHCOST
+ [ -n "$IF_BRIDGE_PORTPRIO" ] \
+ && brctl setportprio $IFACE $IF_BRIDGE_PORTPRIO
+ [ -n "$IF_BRIDGE_STP" ] \
+ && brctl stp $IFACE $IF_BRIDGE_STP
+}
+
+all_ports_ready() {
+ local port=
+ for port in $PORTS; do
+ case $(cat /sys/class/net/$IFACE/brif/$port/state) in
+ ""|0|3) ;; # 0 = disabled, 3 = forwarding
+ [12]) return 1;;
+ esac
+ done
+ return 0
+}
+
+find_maxwait() {
+ awk '{printf("%.f\n", 2 * $0 / 100); }' \
+ /sys/class/net/$IFACE/bridge/forward_delay
+}
+
+wait_bridge() {
+ local timeout=$IF_BRIDGE_MAXWAIT
+ if [ -z "$timeout" ]; then
+ timeout=$(find_maxwait)
+ fi
+ ip link set dev $IFACE up
+ while ! all_ports_ready; do
+ [ $timeout -eq 0 ] && break
+ timeout=$(($timeout - 1))
+ sleep 1
+ done
+}
+
+case "$IF_BRIDGE_PORTS" in
+"") ;;
+none) PORTS="";;
+all) PORTS=$(all_ports);;
+*) PORTS="$IF_BRIDGE_PORTS";;
+esac
+
+[ -z "$PORTS" ] && exit
+
+case "$MODE" in
+start)
+ brctl addbr $IFACE || exit 1
+ wait_ports
+ set_bridge_opts
+ add_ports
+ wait_bridge
+ ;;
+stop) del_ports
+ brctl delbr $IFACE || exit 1
+ ;;
+esac
+