summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@vyatta.com>2011-08-05 20:51:06 -0700
committerStephen Hemminger <shemminger@vyatta.com>2011-08-05 20:52:46 -0700
commit8b49f93b06cfe494182c533dc00499abc8452660 (patch)
tree9934153ca41927463924c006a8b5a73a94c32695 /scripts
parent429b4ca11b2757e0eb453f9f53bdb08cfe669f8e (diff)
downloadvyatta-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')
-rwxr-xr-xscripts/vyatta-interfaces.pl39
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;
}