Set MAC address twice, once before and once after bringing interface up, since different kernels behave differently (Linux).

This commit is contained in:
Adam Ierymenko 2021-11-09 13:28:15 -05:00
parent 357e1aca54
commit c16b03c8b8
No known key found for this signature in database
GPG Key ID: C8877CF2D7A5D7F3

View File

@ -205,6 +205,16 @@ LinuxEthernetTap::LinuxEthernetTap(
return;
}
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) {
::close(sock);
printf("WARNING: ioctl() failed setting up Linux tap device (set MAC)\n");
return;
}
usleep(100000);
ifr.ifr_flags |= IFF_MULTICAST;
ifr.ifr_flags |= IFF_UP;
if (ioctl(sock,SIOCSIFFLAGS,(void *)&ifr) < 0) {
@ -213,11 +223,7 @@ 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(200000);
usleep(100000);
ifr.ifr_ifru.ifru_hwaddr.sa_family = ARPHRD_ETHER;
_mac.copyTo(ifr.ifr_ifru.ifru_hwaddr.sa_data,6);