From 67ffa12de0848703b3b86d9c3b578a2edc79bc3b Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Fri, 31 Jul 2009 21:59:46 -0700 Subject: BONDING: handle change of bond-group Use similar action to new bridge-group Bug 4768 --- scripts/vyatta-bonding.pl | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'scripts') diff --git a/scripts/vyatta-bonding.pl b/scripts/vyatta-bonding.pl index 66417f9f..b9ea0bcf 100755 --- a/scripts/vyatta-bonding.pl +++ b/scripts/vyatta-bonding.pl @@ -30,6 +30,7 @@ use lib "/opt/vyatta/share/perl5/"; use Vyatta::Interface; +use Vyatta::Config; use Getopt::Long; use strict; @@ -136,13 +137,9 @@ sub change_mode { my @slaves = get_slaves($intf); foreach my $slave (@slaves) { - if_down($slave); remove_slave( $intf, $slave ) unless ( $primary && $slave eq $primary ); } - if ($primary) { - if_down($primary); - remove_slave( $intf, $primary ); - } + remove_slave( $intf, $primary ) if ($primary); my $bond_up = $interface->up(); if_down($intf) if $bond_up; @@ -154,6 +151,23 @@ sub change_mode { } } +# bonding requires interface to be down before enslaving +# but enslaving automatically brings interface up! +sub add_port { + my ( $intf, $slave ) = @_; + my $slaveif = new Vyatta::Interface($slave); + + if ($slaveif->up()) { + if_down($slave); + } else { + my $cfg = new Vyatta::Config; + $cfg->setLevel($slaveif->path()); + die "Can not add disabled interface $slave to bond-group $intf\n" + if $cfg->exists('disable'); + } + add_slave ($intf, $slave); +} + sub usage { print "Usage: $0 --dev=bondX --mode={mode}\n"; print " $0 --dev=bondX --add-port=ethX\n"; @@ -175,5 +189,5 @@ GetOptions( die "$0: device not specified\n" unless $dev; change_mode( $dev, $mode ) if $mode; -add_slave( $dev, $add_port ) if $add_port; +add_port( $dev, $add_port ) if $add_port; remove_slave( $dev, $rem_port ) if $rem_port; -- cgit v1.2.3