Shorter implementation of random_ether_addr().
authorPhilipp Marek <philipp.marek@linbit.com>
Wed, 7 Oct 2015 09:09:00 +0000 (11:09 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Fri, 9 Oct 2015 09:46:50 +0000 (11:46 +0200)
src/PVE/Tools.pm

index 3f3958e..cda0797 100644 (file)
@@ -940,21 +940,13 @@ sub random_ether_addr {
 
     my $rand = Digest::SHA::sha1_hex($$, rand(), $seconds, $microseconds);
 
-    my $mac = '';
-    for (my $i = 0; $i < 6; $i++) {
-       my $ss = hex(substr($rand, $i*2, 2));
-       if (!$i) {
-           $ss &= 0xfe; # clear multicast
-           $ss |= 2; # set local id
-       }
-       $ss = sprintf("%02X", $ss);
+# clear multicast, set local id
+    vec($rand, 0, 8) = (vec($rand, 0, 8) & 0xfe) | 2;
 
-       if (!$i) {
-           $mac .= "$ss";
-       } else {
-           $mac .= ":$ss";
-       }
-    }
+    my $mac = sprintf("%02X:" x 6, unpack("C6", $rand));
+
+# remove superfluous ":" at end
+    chop($mac);
 
     return $mac;
 }