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

View File

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

View File

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

View File

@ -43,6 +43,15 @@ _is_wireless() {
grep -Eq "^[[:space:]]*${IFACE}:" /proc/net/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() { _get_mac_address() {
local mac=$(LC_ALL=C ip link show "${IFACE}" | sed -n \ local mac=$(LC_ALL=C ip link show "${IFACE}" | sed -n \
-e 'y/abcdef/ABCDEF/' \ -e 'y/abcdef/ABCDEF/' \
@ -181,7 +190,8 @@ iproute2_pre_start() {
} }
iproute2_post_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() { iproute2_post_stop() {

View File

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