Browse Source

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

Set MAC address before bringing up Linux TAP link
pull/2/head
Grant Limberg 5 years ago committed by GitHub
parent
commit
c69d2df0a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 24
      osdep/LinuxEthernetTap.cpp

24
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;
}

Loading…
Cancel
Save