diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2011-08-05 20:51:06 -0700 |
---|---|---|
committer | Stephen Hemminger <shemminger@vyatta.com> | 2011-08-05 20:52:46 -0700 |
commit | 8b49f93b06cfe494182c533dc00499abc8452660 (patch) | |
tree | 9934153ca41927463924c006a8b5a73a94c32695 /scripts/vyatta-interfaces.pl | |
parent | 429b4ca11b2757e0eb453f9f53bdb08cfe669f8e (diff) | |
download | vyatta-cfg-quagga-8b49f93b06cfe494182c533dc00499abc8452660.tar.gz vyatta-cfg-quagga-8b49f93b06cfe494182c533dc00499abc8452660.zip |
ethernet: avoid needlessly setting mac address
Bug 7408
Only set mac address if it is different, and try first with
link up (many drivers allow it).
Don't use hw-id as mac address, hw-id is meant for corelating
names with addresses (in udev).
Diffstat (limited to 'scripts/vyatta-interfaces.pl')
-rwxr-xr-x | scripts/vyatta-interfaces.pl | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl index a5bb2553..0365266c 100755 --- a/scripts/vyatta-interfaces.pl +++ b/scripts/vyatta-interfaces.pl @@ -39,7 +39,6 @@ use Vyatta::File qw(touch); use Vyatta::Interface; use Getopt::Long; -use POSIX; use strict; use warnings; @@ -225,27 +224,29 @@ sub stop_dhclient { } sub update_mac { - my ($mac, $intf) = @_; + my ($mac, $name) = @_; + my $intf = new Vyatta::Interface($name); + $intf or die "Unknown interface name/type: $name\n"; - open my $fh, "<", "/sys/class/net/$intf/flags" - or die "Error: $intf is not a network device\n"; - - my $flags = <$fh>; - chomp $flags; - close $fh or die "Error: can't read state\n"; - - if (POSIX::strtoul($flags) & 1) { - # NB: Perl 5 system return value is bass-ackwards - system "ip link set $intf down" - and die "Could not set $intf down ($!)\n"; - system "ip link set $intf address $mac" - and die "Could not set $intf address ($!)\n"; - system "ip link set $intf up" - and die "Could not set $intf up ($!)\n"; + # maybe nothing needs to change + my $oldmac = $intf->hw_address(); + exit 0 if (lc($oldmac) eq lc($mac)); + + # try the direct approach + if (system "ip link set $name address $mac" == 0) { + exit 0; + } elsif ($intf->up()) { + # some hardware can not change MAC address if up + system "ip link set $name down" + and die "Could not set $name down\n"; + system "ip link set $name address $mac" + and die "Could not set $name address\n"; + system "ip link set $name up" + and die "Could not set $name up\n"; } else { - system "ip link set $intf address $mac" - and die "Could not set $intf address ($!)\n"; + die "Could not set mac address for $name\n"; } + exit 0; } |