From 7469b84d1e7ffde6f48bf19b999c005249df5dae Mon Sep 17 00:00:00 2001 From: Marcin Krol Date: Tue, 14 Jul 2015 13:35:08 +0000 Subject: [PATCH] - merged inteface bonding fixes (use sysfs instead of deprecated ifenslave) --- lib/Makefile.am | 2 ++ lib/ifdown | 5 ---- lib/ifdown-bond | 54 +++++++++++++++++++++++++++++++++++ lib/ifup | 11 ++++---- lib/ifup-bond | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 137 insertions(+), 10 deletions(-) create mode 100755 lib/ifdown-bond create mode 100755 lib/ifup-bond diff --git a/lib/Makefile.am b/lib/Makefile.am index 22d17fb..85e5d92 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -10,6 +10,7 @@ sbin_SCRIPTS = \ scriptsdir = @exec_prefix@/lib/$(PACKAGE) scripts_SCRIPTS = \ + ifdown-bond \ ifdown-br \ ifdown-irda \ ifdown-ppp \ @@ -17,6 +18,7 @@ scripts_SCRIPTS = \ ifdown-sl \ ifdown-vlan \ ifup-aliases \ + ifup-bond \ ifup-br \ ifup-ipx \ ifup-irda \ diff --git a/lib/ifdown b/lib/ifdown index 73df490..f7d5fab 100755 --- a/lib/ifdown +++ b/lib/ifdown @@ -118,11 +118,6 @@ if [ -n "${SUBDEVICE}" ]; then ip addr del ${IP4ADDR} label ${SUBDEVICE} dev ${DEVICE} else LC_ALL=C ip addr flush dev ${DEVICE} 2>&1 | grep -v "Nothing to flush" - - if is_yes "$SLAVE"; then - ip link set ${DEVICE} nomaster - fi - ip link set ${DEVICE} down fi diff --git a/lib/ifdown-bond b/lib/ifdown-bond new file mode 100755 index 0000000..1d81ecb --- /dev/null +++ b/lib/ifdown-bond @@ -0,0 +1,54 @@ +#!/bin/sh +# +# ifdown-bond - bonding configuration script +# Copyright (C) 2014 Marcin Krol +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +PATH=/sbin:/usr/sbin:/bin:/usr/bin + +. /etc/sysconfig/network +. /etc/rc.d/init.d/functions +. /lib/rc-scripts/functions.network + +CONFIG=$1 +source_config + +if [ "x${2}" = "xboot" ] && is_no "${ONBOOT}"; then + exit +fi + +# set all major variables +setup_ip_param + +# forget all addresses +LC_ALL=C ip addr flush dev ${DEVICE} 2>&1 | grep -v "Nothing to flush" + +# release slave devices +for SLAVE_DEV in $(cat /sys/class/net/${DEVICE}/bonding/slaves); do + echo "-${SLAVE_DEV}" > /sys/class/net/${DEVICE}/bonding/slaves +done + +# bring bonding master down +ip link set ${DEVICE} down + +# remove bonding master +if grep -wq "${DEVICE}" /sys/class/net/bonding_masters; then + echo "-${DEVICE}" > /sys/class/net/bonding_masters + if [ $? -ne 0 ]; then + exit 1 + fi +fi diff --git a/lib/ifup b/lib/ifup index c534442..4f5d2e7 100755 --- a/lib/ifup +++ b/lib/ifup @@ -120,11 +120,12 @@ if [ -n "$ETHTOOL_OPTS" ] ; then fi if is_yes "$SLAVE" && [ -n "$MASTER" ] ; then - nls "Enslaving %s to %s" "$DEVICE" "$MASTER" - ip link set "$DEVICE" master "$MASTER" - ip link set "$DEVICE" up - - exit 0 + if ! grep -wq "${DEVICE}" /sys/class/net/${MASTER}/bonding/slaves 2>/dev/null; then + nls "Enslaving %s to %s" "$DEVICE" "$MASTER" + ip link set dev ${DEVICE} down + echo "+${DEVICE}" > /sys/class/net/${MASTER}/bonding/slaves 2>/dev/null + fi + exit 0 fi if [ "$HANDLING" = "2" ]; then diff --git a/lib/ifup-bond b/lib/ifup-bond new file mode 100755 index 0000000..5651839 --- /dev/null +++ b/lib/ifup-bond @@ -0,0 +1,75 @@ +#!/bin/sh +# +# ifup-bond - bonding configuration script +# Copyright (C) 2014 Marcin Krol +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# +PATH=/sbin:/usr/sbin:/bin:/usr/bin + +. /etc/sysconfig/network +. /etc/rc.d/init.d/functions +. /lib/rc-scripts/functions.network + +CONFIG=$1 +source_config + +if [ "x${2}" = "xboot" ] && is_no "${ONBOOT}"; then + exit +fi + +# check for bonding support +if [ ! -f /sys/class/net/bonding_masters ]; then + modprobe -s bonding || exit 1 + # delete default bond0 + echo "-bond0" > /sys/class/net/bonding_masters +fi + +# set all major variables +setup_ip_param + +# create bonding master +if ! grep -wq "${DEVICE}" /sys/class/net/bonding_masters; then + echo "+${DEVICE}" > /sys/class/net/bonding_masters + if [ $? -eq 0 ]; then + ip link set dev ${DEVICE} multicast ${MULTICAST} ${ARP} + else + exit 1 + fi +fi + +# add the bits to setup driver parameters here +# taken from Fedora initscripts +for arg in ${BONDING_OPTS} ; do + key=${arg%%=*}; + value=${arg##*=}; + if [ "${key}" = "arp_ip_target" -a "${value:0:1}" != "+" ]; then + OLDIFS=$IFS; + IFS=','; + for arp_ip in $value; do + if ! grep -q $arp_ip /sys/class/net/${DEVICE}/bonding/$key; then + echo +$arp_ip > /sys/class/net/${DEVICE}/bonding/$key + fi + done + IFS=$OLDIFS; + elif [ "${key}" = "arp_ip_target" ]; then + if ! grep -q ${value#+} /sys/class/net/${DEVICE}/bonding/$key; then + echo "$value" > /sys/class/net/${DEVICE}/bonding/$key + fi + elif [ "${key}" != "primary" ]; then + echo $value > /sys/class/net/${DEVICE}/bonding/$key + fi +done -- 2.44.0