Browse Source

Merge pull request #1390 from jonathonf/linux-tap-link-ordering

Set MAC address before bringing up Linux TAP link
Grant Limberg 4 years ago
parent
commit
c69d2df0a2
1 changed files with 12 additions and 12 deletions
  1. 12 12
      osdep/LinuxEthernetTap.cpp

+ 12 - 12
osdep/LinuxEthernetTap.cpp

@@ -208,12 +208,6 @@ LinuxEthernetTap::LinuxEthernetTap(
 					return;
 				}
 
-				// Some kernel versions seem to require you to yield while the device comes up
-				// before they will accept MTU and MAC. For others it doesn't matter, but is
-				// harmless. This was moved to the worker thread though so as not to block the
-				// main ZeroTier loop.
-				usleep(500000);
-
 				ifr.ifr_ifru.ifru_hwaddr.sa_family = ARPHRD_ETHER;
 				_mac.copyTo(ifr.ifr_ifru.ifru_hwaddr.sa_data,6);
 				if (ioctl(sock,SIOCSIFHWADDR,(void *)&ifr) < 0) {
@@ -222,17 +216,23 @@ LinuxEthernetTap::LinuxEthernetTap(
 					return;
 				}
 
-				ifr.ifr_ifru.ifru_mtu = (int)_mtu;
-				if (ioctl(sock,SIOCSIFMTU,(void *)&ifr) < 0) {
+				ifr.ifr_flags |= IFF_UP;
+				if (ioctl(sock,SIOCSIFFLAGS,(void *)&ifr) < 0) {
 					::close(sock);
-					printf("WARNING: ioctl() failed setting up Linux tap device (set MTU)\n");
+					printf("WARNING: ioctl() failed setting up Linux tap device (bring interface up)\n");
 					return;
 				}
 
-				ifr.ifr_flags |= IFF_UP;
-				if (ioctl(sock,SIOCSIFFLAGS,(void *)&ifr) < 0) {
+				// Some kernel versions seem to require you to yield while the device comes up
+				// before they will accept MTU and MAC. For others it doesn't matter, but is
+				// harmless. This was moved to the worker thread though so as not to block the
+				// main ZeroTier loop.
+				usleep(500000);
+
+				ifr.ifr_ifru.ifru_mtu = (int)_mtu;
+				if (ioctl(sock,SIOCSIFMTU,(void *)&ifr) < 0) {
 					::close(sock);
-					printf("WARNING: ioctl() failed setting up Linux tap device (bring interface up)\n");
+					printf("WARNING: ioctl() failed setting up Linux tap device (set MTU)\n");
 					return;
 				}