|
|
|
|
@ -85,8 +85,14 @@ BSDEthernetTap::BSDEthernetTap(
|
|
|
|
|
char devpath[64],ethaddr[64],mtustr[32],metstr[32],tmpdevname[32]; |
|
|
|
|
struct stat stattmp; |
|
|
|
|
|
|
|
|
|
// On FreeBSD at least we can rename, so use nwid to generate a deterministic unique zt#### name using base32
|
|
|
|
|
// As a result we don't use desiredDevice
|
|
|
|
|
Mutex::Lock _gl(globalTapCreateLock); |
|
|
|
|
|
|
|
|
|
if (mtu > 2800) |
|
|
|
|
throw std::runtime_error("max tap MTU is 2800"); |
|
|
|
|
|
|
|
|
|
#ifdef __FreeBSD__ |
|
|
|
|
/* FreeBSD allows long interface names and interface renaming */ |
|
|
|
|
|
|
|
|
|
_dev = "zt"; |
|
|
|
|
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)((nwid >> 60) & 0x1f)]); |
|
|
|
|
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)((nwid >> 55) & 0x1f)]); |
|
|
|
|
@ -102,13 +108,6 @@ BSDEthernetTap::BSDEthernetTap(
|
|
|
|
|
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)((nwid >> 5) & 0x1f)]); |
|
|
|
|
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)(nwid & 0x1f)]); |
|
|
|
|
|
|
|
|
|
Mutex::Lock _gl(globalTapCreateLock); |
|
|
|
|
|
|
|
|
|
if (mtu > 2800) |
|
|
|
|
throw std::runtime_error("max tap MTU is 2800"); |
|
|
|
|
|
|
|
|
|
// On BSD we create taps and they can have high numbers, so use ones starting
|
|
|
|
|
// at 9993 to not conflict with other stuff. Then we rename it to zt<base32 of nwid>
|
|
|
|
|
std::vector<std::string> devFiles(OSUtils::listDirectory("/dev")); |
|
|
|
|
for(int i=9993;i<(9993+128);++i) { |
|
|
|
|
Utils::snprintf(tmpdevname,sizeof(tmpdevname),"tap%d",i); |
|
|
|
|
@ -144,6 +143,19 @@ BSDEthernetTap::BSDEthernetTap(
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
/* Other BSDs like OpenBSD only have a limited number of tap devices that cannot be renamed */ |
|
|
|
|
|
|
|
|
|
for(int i=0;i<64;++i) { |
|
|
|
|
Utils::snprintf(tmpdevname,sizeof(tmpdevname),"tap%d",i); |
|
|
|
|
Utils::snprintf(devpath,sizeof(devpath),"/dev/%s",tmpdevname); |
|
|
|
|
_fd = ::open(devpath,O_RDWR); |
|
|
|
|
if (_fd > 0) { |
|
|
|
|
_dev = tmpdevname; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (_fd <= 0) |
|
|
|
|
throw std::runtime_error("unable to open TAP device or no more devices available"); |
|
|
|
|
@ -325,6 +337,7 @@ void BSDEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,std:
|
|
|
|
|
{ |
|
|
|
|
std::vector<MulticastGroup> newGroups; |
|
|
|
|
|
|
|
|
|
#ifndef __OpenBSD__ |
|
|
|
|
struct ifmaddrs *ifmap = (struct ifmaddrs *)0; |
|
|
|
|
if (!getifmaddrs(&ifmap)) { |
|
|
|
|
struct ifmaddrs *p = ifmap; |
|
|
|
|
@ -339,6 +352,7 @@ void BSDEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,std:
|
|
|
|
|
} |
|
|
|
|
freeifmaddrs(ifmap); |
|
|
|
|
} |
|
|
|
|
#endif // __OpenBSD__
|
|
|
|
|
|
|
|
|
|
std::vector<InetAddress> allIps(ips()); |
|
|
|
|
for(std::vector<InetAddress>::iterator ip(allIps.begin());ip!=allIps.end();++ip) |
|
|
|
|
|