mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
Now builds on OpenBSD, but segfaults. So not yet but close. GitHub issue #439
This commit is contained in:
parent
13263b8401
commit
7b231b38b0
4 changed files with 31 additions and 11 deletions
4
Makefile
4
Makefile
|
@ -11,8 +11,12 @@ ifeq ($(OSTYPE),Linux)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(OSTYPE),FreeBSD)
|
ifeq ($(OSTYPE),FreeBSD)
|
||||||
|
CC=gcc
|
||||||
|
CXX=g++
|
||||||
include make-freebsd.mk
|
include make-freebsd.mk
|
||||||
endif
|
endif
|
||||||
ifeq ($(OSTYPE),OpenBSD)
|
ifeq ($(OSTYPE),OpenBSD)
|
||||||
|
CC=egcc
|
||||||
|
CXX=eg++
|
||||||
include make-freebsd.mk
|
include make-freebsd.mk
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
CC=cc
|
|
||||||
CXX=c++
|
|
||||||
INCLUDES=
|
INCLUDES=
|
||||||
DEFS=
|
DEFS=
|
||||||
LIBS=
|
LIBS=
|
||||||
|
|
|
@ -85,8 +85,14 @@ BSDEthernetTap::BSDEthernetTap(
|
||||||
char devpath[64],ethaddr[64],mtustr[32],metstr[32],tmpdevname[32];
|
char devpath[64],ethaddr[64],mtustr[32],metstr[32],tmpdevname[32];
|
||||||
struct stat stattmp;
|
struct stat stattmp;
|
||||||
|
|
||||||
// On FreeBSD at least we can rename, so use nwid to generate a deterministic unique zt#### name using base32
|
Mutex::Lock _gl(globalTapCreateLock);
|
||||||
// As a result we don't use desiredDevice
|
|
||||||
|
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 = "zt";
|
||||||
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)((nwid >> 60) & 0x1f)]);
|
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)((nwid >> 60) & 0x1f)]);
|
||||||
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)((nwid >> 55) & 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 >> 5) & 0x1f)]);
|
||||||
_dev.push_back(ZT_BASE32_CHARS[(unsigned long)(nwid & 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"));
|
std::vector<std::string> devFiles(OSUtils::listDirectory("/dev"));
|
||||||
for(int i=9993;i<(9993+128);++i) {
|
for(int i=9993;i<(9993+128);++i) {
|
||||||
Utils::snprintf(tmpdevname,sizeof(tmpdevname),"tap%d",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)
|
if (_fd <= 0)
|
||||||
throw std::runtime_error("unable to open TAP device or no more devices available");
|
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;
|
std::vector<MulticastGroup> newGroups;
|
||||||
|
|
||||||
|
#ifndef __OpenBSD__
|
||||||
struct ifmaddrs *ifmap = (struct ifmaddrs *)0;
|
struct ifmaddrs *ifmap = (struct ifmaddrs *)0;
|
||||||
if (!getifmaddrs(&ifmap)) {
|
if (!getifmaddrs(&ifmap)) {
|
||||||
struct ifmaddrs *p = ifmap;
|
struct ifmaddrs *p = ifmap;
|
||||||
|
@ -339,6 +352,7 @@ void BSDEthernetTap::scanMulticastGroups(std::vector<MulticastGroup> &added,std:
|
||||||
}
|
}
|
||||||
freeifmaddrs(ifmap);
|
freeifmaddrs(ifmap);
|
||||||
}
|
}
|
||||||
|
#endif // __OpenBSD__
|
||||||
|
|
||||||
std::vector<InetAddress> allIps(ips());
|
std::vector<InetAddress> allIps(ips());
|
||||||
for(std::vector<InetAddress>::iterator ip(allIps.begin());ip!=allIps.end();++ip)
|
for(std::vector<InetAddress>::iterator ip(allIps.begin());ip!=allIps.end();++ip)
|
||||||
|
|
|
@ -115,6 +115,10 @@ namespace ZeroTier { typedef WindowsEthernetTap EthernetTap; }
|
||||||
#include "../osdep/BSDEthernetTap.hpp"
|
#include "../osdep/BSDEthernetTap.hpp"
|
||||||
namespace ZeroTier { typedef BSDEthernetTap EthernetTap; }
|
namespace ZeroTier { typedef BSDEthernetTap EthernetTap; }
|
||||||
#endif // __FreeBSD__
|
#endif // __FreeBSD__
|
||||||
|
#ifdef __OpenBSD__
|
||||||
|
#include "../osdep/BSDEthernetTap.hpp"
|
||||||
|
namespace ZeroTier { typedef BSDEthernetTap EthernetTap; }
|
||||||
|
#endif // __OpenBSD__
|
||||||
|
|
||||||
#endif // ZT_SERVICE_NETCON
|
#endif // ZT_SERVICE_NETCON
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue