Work cleanly with bridges on kernels without TCP, #197791.

This commit is contained in:
Roy Marples 2007-11-01 22:25:53 +00:00
parent a1f80bc7a7
commit 80124a050c
5 changed files with 36 additions and 15 deletions

View File

@ -3,6 +3,7 @@
01 Nov 2007; Roy Marples <uberlord@gentoo.org>:
Work cleanly with bridges on kernels without TCP, #197791.
Fix fallback, #197788.
* baselayout-2.0.0_rc6 (31 Oct 2007)

View File

@ -33,7 +33,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
@ -50,15 +50,18 @@ bridge_pre_start() {
done
unset IFS
if [ -n "${ports}" ] ; then
if [ -n "${ports}" ]; then
einfo "Adding ports to ${IFACE}"
eindent
local OIFACE="${IFACE}"
for x in ${ports}; do
ebegin "${x}"
ifconfig "${x}" promisc up
if ! brctl addif "${IFACE}" "${x}" ; then
ifconfig "${x}" -promisc 2>/dev/null
local IFACE="${x}"
_set_flag promisc
_up
if ! brctl addif "${OIFACE}" "${x}"; then
_set_flag -promisc
eend 1
return 1
fi
@ -78,7 +81,7 @@ bridge_post_stop() {
if _is_bridge ; then
ebegin "Destroying bridge ${IFACE}"
_down
ports="$( brctl show 2>/dev/null | \
ports="$(brctl show 2>/dev/null | \
sed -n -e '/^'"${IFACE}"'[[:space:]]/,/^\S/ { /^\('"${IFACE}"'[[:space:]]\|\t\)/s/^.*\t//p }')"
delete=true
iface=${IFACE}
@ -87,9 +90,9 @@ bridge_post_stop() {
# Work out if we're added to a bridge for removal or not
eval set -- $(brctl show 2>/dev/null | sed -e "s/'/'\\\\''/g" -e "s/$/'/g" -e "s/^/'/g")
local line=
for line in "$@" ; do
for line in "$@"; do
set -- ${line}
if [ "$3" = "${IFACE}" ] ; then
if [ "$3" = "${IFACE}" ]; then
iface=$1
break
fi
@ -98,14 +101,15 @@ bridge_post_stop() {
extra=" from ${iface}"
fi
for port in ${ports} ; do
for port in ${ports}; do
ebegin "Removing port ${port}${extra}"
ifconfig "${port}" -promisc
local IFACE="${port}"
_set_flag -promisc
brctl delif "${iface}" "${port}"
eend $?
done
if ${delete} ; then
if ${delete}; then
eoutdent
brctl delbr "${iface}"
eend $?

View File

@ -42,6 +42,10 @@ _is_wireless() {
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/wireless
}
_set_flag() {
ifconfig "${IFACE}" "$1"
}
_get_mac_address() {
local mac=$(LC_ALL=C ifconfig "${IFACE}" | \
sed -n -e 's/.* HWaddr \(..:..:..:..:..:..\).*/\1/p')

View File

@ -43,6 +43,15 @@ _is_wireless() {
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/wireless
}
_set_flag() {
local flag=$1 opt="on"
if [ "${flag#-}" != "${flag}" ]; then
flag=${flag#-}
opt="off"
fi
ip link set "${IFACE}" "${flag}" "${opt}"
}
_get_mac_address() {
local mac=$(LC_ALL=C ip link show "${IFACE}" | sed -n \
-e 'y/abcdef/ABCDEF/' \
@ -181,7 +190,8 @@ iproute2_pre_start() {
}
iproute2_post_start() {
ip route flush table cache dev "${IFACE}"
# Kernel may not have tcp built in
[ -e /proc/net/route ] && ip route flush table cache dev "${IFACE}"
}
iproute2_post_stop() {

View File

@ -349,7 +349,7 @@ _load_config() {
local fallback="$(_get_array fallback_${IFVAR})"
if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then
config="127.0.0.1/8
[ "${config}" != "null" ] && config="127.0.0.1/8
${config}"
else
if [ -z "${config}" ] ; then
@ -495,9 +495,11 @@ start() {
local hidefirstroute=false first=true
local routes="$(_get_array "routes_${IFVAR}")"
if [ "${IFACE}" = "lo" -o "${IFACE}" = "lo0" ] ; then
routes="127.0.0.0/8 via 127.0.0.1
if [ "${config_0}" != "null" ]; then
routes="127.0.0.0/8 via 127.0.0.1
${routes}"
hidefirstroute=true
hidefirstroute=true
fi
fi
local IFS="$__IFS"
for cmd in ${routes}; do