summaryrefslogtreecommitdiff
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
parent429b4ca11b2757e0eb453f9f53bdb08cfe669f8e (diff)
downloadvyatta-cfg-system-8b49f93b06cfe494182c533dc00499abc8452660.tar.gz
vyatta-cfg-system-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).
-rwxr-xr-xscripts/vyatta-interfaces.pl39
-rw-r--r--templates/interfaces/ethernet/node.def11
2 files changed, 23 insertions, 27 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;
}
diff --git a/templates/interfaces/ethernet/node.def b/templates/interfaces/ethernet/node.def
index a9113e7a..426f8f87 100644
--- a/templates/interfaces/ethernet/node.def
+++ b/templates/interfaces/ethernet/node.def
@@ -14,15 +14,10 @@ syntax:expression: exec \
fi"
begin: rm -f /tmp/speed-duplex.$VAR(@)
- if [ -d "/sys/class/net/$VAR(@)" ]; then
- s_mac="$VAR(hw-id/@)"
- if [ -n "$VAR(mac/@)" ]; then
- s_mac="$VAR(mac/@)"
- fi
- if [ -n "$s_mac" ]; then
+ if [ -n "$VAR(mac/@)" ] &&
+ [ -d "/sys/class/net/$VAR(@)" ]; then
/opt/vyatta/sbin/vyatta-interfaces.pl --dev $VAR(@) \
- --set-mac $s_mac
- fi
+ --set-mac "$VAR(mac/@)"
fi
create: ip link set "$VAR(@)" up