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