Skip to content

Commit

Permalink
More platform-related build fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
joseph-henry committed Aug 21, 2024
1 parent b7d9290 commit e734019
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 34 deletions.
10 changes: 6 additions & 4 deletions osdep/EthernetTap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ namespace ZeroTier {

std::shared_ptr<EthernetTap> EthernetTap::newInstance(
const char *tapDeviceType, // OS-specific, NULL for default
unsigned int concurrency,
bool pinning,
const char *homePath,
const MAC &mac,
unsigned int mtu,
Expand Down Expand Up @@ -92,7 +94,7 @@ std::shared_ptr<EthernetTap> EthernetTap::newInstance(
#endif // __APPLE__

#ifdef __LINUX__
return std::shared_ptr<EthernetTap>(new LinuxEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg));
return std::shared_ptr<EthernetTap>(new LinuxEthernetTap(homePath,concurrency,pinning,mac,mtu,metric,nwid,friendlyName,handler,arg));
#endif // __LINUX__

#ifdef __WINDOWS__
Expand Down Expand Up @@ -126,15 +128,15 @@ std::shared_ptr<EthernetTap> EthernetTap::newInstance(
_comInit = true;
}
}
return std::shared_ptr<EthernetTap>(new WindowsEthernetTap(homePath,concurrency,mac,mtu,metric,nwid,friendlyName,handler,arg));
return std::shared_ptr<EthernetTap>(new WindowsEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg));
#endif // __WINDOWS__

#ifdef __FreeBSD__
return std::shared_ptr<EthernetTap>(new BSDEthernetTap(homePath,concurrency,mac,mtu,metric,nwid,friendlyName,handler,arg));
return std::shared_ptr<EthernetTap>(new BSDEthernetTap(homePath,concurrency,pinning,mac,mtu,metric,nwid,friendlyName,handler,arg));
#endif // __FreeBSD__

#ifdef __NetBSD__
return std::shared_ptr<EthernetTap>(new NetBSDEthernetTap(homePath,concurrency,mac,mtu,metric,nwid,friendlyName,handler,arg));
return std::shared_ptr<EthernetTap>(new NetBSDEthernetTap(homePath,mac,mtu,metric,nwid,friendlyName,handler,arg));
#endif // __NetBSD__

#ifdef __OpenBSD__
Expand Down
2 changes: 2 additions & 0 deletions osdep/EthernetTap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ class EthernetTap
public:
static std::shared_ptr<EthernetTap> newInstance(
const char *tapDeviceType, // OS-specific, NULL for default
unsigned int concurrency,
bool pinning,
const char *homePath,
const MAC &mac,
unsigned int mtu,
Expand Down
38 changes: 8 additions & 30 deletions osdep/LinuxEthernetTap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ static void _base32_5_to_8(const uint8_t *in,char *out)

LinuxEthernetTap::LinuxEthernetTap(
const char *homePath,
unsigned int concurrency,
bool pinning,
const MAC &mac,
unsigned int mtu,
unsigned int metric,
Expand Down Expand Up @@ -220,44 +222,20 @@ LinuxEthernetTap::LinuxEthernetTap(

(void)::pipe(_shutdownSignalPipe);

bool _enablePinning = false;
char* envvar = std::getenv("ZT_CORE_PINNING");
if (envvar) {
int tmp = atoi(envvar);
if (tmp > 0) {
_enablePinning = true;
}
}

int _concurrency = 1;
char* concurrencyVar = std::getenv("ZT_PACKET_PROCESSING_CONCURRENCY");
if (concurrencyVar) {
int tmp = atoi(concurrencyVar);
if (tmp > 0) {
_concurrency = tmp;
}
else {
_concurrency = std::max((unsigned int)1,std::thread::hardware_concurrency() / 2);
}
}
else {
_concurrency = std::max((unsigned int)1,std::thread::hardware_concurrency() / 2);
}

for (unsigned int i = 0; i < _concurrency; ++i) {
_rxThreads.push_back(std::thread([this, i, _concurrency, _enablePinning] {
for (unsigned int i = 0; i < concurrency; ++i) {
_rxThreads.push_back(std::thread([this, i, concurrency, pinning] {

if (_enablePinning) {
int pinCore = i % _concurrency;
fprintf(stderr, "pinning tap thread %d to core %d\n", i, pinCore);
if (pinning) {
int pinCore = i % concurrency;
fprintf(stderr, "Pinning tap thread %d to core %d\n", i, pinCore);
pthread_t self = pthread_self();
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(pinCore, &cpuset);
int rc = pthread_setaffinity_np(self, sizeof(cpu_set_t), &cpuset);
if (rc != 0)
{
fprintf(stderr, "failed to pin tap thread %d to core %d: %s\n", i, pinCore, strerror(errno));
fprintf(stderr, "Failed to pin tap thread %d to core %d: %s\n", i, pinCore, strerror(errno));
exit(1);
}
}
Expand Down
2 changes: 2 additions & 0 deletions osdep/LinuxEthernetTap.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ class LinuxEthernetTap : public EthernetTap
public:
LinuxEthernetTap(
const char *homePath,
unsigned int concurrency,
bool pinning,
const MAC &mac,
unsigned int mtu,
unsigned int metric,
Expand Down
2 changes: 2 additions & 0 deletions service/OneService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3239,6 +3239,8 @@ class OneServiceImpl : public OneService

n.setTap(EthernetTap::newInstance(
nullptr,
_concurrency,
_cpuPinningEnabled,
_homePath.c_str(),
MAC(nwc->mac),
nwc->mtu,
Expand Down

0 comments on commit e734019

Please sign in to comment.