Set MAC address before bringing up Linux TAP link

This corrects the flow for bringing up a TAP device under Linux by
setting the device MAC address prior to bringing up the device.

Closes #1314
This commit is contained in:
Jonathon Fernyhough 2021-04-21 20:46:13 +01:00
parent b8b1f64959
commit bac57e355d
No known key found for this signature in database
GPG Key ID: 9C08A255442FAFF0

View File

@ -207,6 +207,15 @@ LinuxEthernetTap::LinuxEthernetTap(
printf("WARNING: ioctl() failed setting up Linux tap device (bring interface up)\n");
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;
}
ifr.ifr_flags |= IFF_UP;
if (ioctl(sock,SIOCSIFFLAGS,(void *)&ifr) < 0) {
::close(sock);
@ -220,14 +229,6 @@ LinuxEthernetTap::LinuxEthernetTap(
// 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) {
::close(sock);
printf("WARNING: ioctl() failed setting up Linux tap device (set MAC)\n");
return;
}
ifr.ifr_ifru.ifru_mtu = (int)_mtu;
if (ioctl(sock,SIOCSIFMTU,(void *)&ifr) < 0) {
::close(sock);