Try pipelining tap reads on Linux for a little more speed.

This commit is contained in:
Adam Ierymenko 2020-11-16 18:56:00 -05:00
parent 31d8758ad9
commit dc806dd718
No known key found for this signature in database
GPG key ID: C8877CF2D7A5D7F3
2 changed files with 22 additions and 22 deletions

View file

@ -40,7 +40,7 @@ namespace ZeroTier {
namespace { namespace {
// Returns true if packet appears valid; pos and proto will be set // Returns true if packet appears valid; pos and proto will be set
static bool _ipv6GetPayload(const uint8_t *frameData,unsigned int frameLen,unsigned int &pos,unsigned int &proto) static inline bool _ipv6GetPayload(const uint8_t *frameData,unsigned int frameLen,unsigned int &pos,unsigned int &proto)
{ {
if (frameLen < 40) if (frameLen < 40)
return false; return false;

View file

@ -173,9 +173,8 @@ LinuxEthernetTap::LinuxEthernetTap(
::ioctl(_fd,TUNSETPERSIST,0); // valgrind may generate a false alarm here ::ioctl(_fd,TUNSETPERSIST,0); // valgrind may generate a false alarm here
_dev = ifr.ifr_name; _dev = ifr.ifr_name;
// Set close-on-exec so that devices cannot persist if we fork/exec for update
::fcntl(_fd,F_SETFD,fcntl(_fd,F_GETFD) | FD_CLOEXEC); ::fcntl(_fd,F_SETFD,fcntl(_fd,F_GETFD) | FD_CLOEXEC);
::fcntl(_fd,F_SETFL,O_NONBLOCK);
(void)::pipe(_shutdownSignalPipe); (void)::pipe(_shutdownSignalPipe);
@ -474,9 +473,9 @@ void LinuxEthernetTap::threadMain()
break; break;
if (FD_ISSET(_fd,&readfds)) { if (FD_ISSET(_fd,&readfds)) {
for(int x=0;x<64;++x) {
n = (int)::read(_fd,getBuf + r,sizeof(getBuf) - r); n = (int)::read(_fd,getBuf + r,sizeof(getBuf) - r);
if (n < 0) { if (n < 0) {
if ((errno != EINTR)&&(errno != ETIMEDOUT))
break; break;
} else { } else {
// Some tap drivers like to send the ethernet frame and the // Some tap drivers like to send the ethernet frame and the
@ -500,6 +499,7 @@ void LinuxEthernetTap::threadMain()
} }
} }
} }
}
} }
} // namespace ZeroTier } // namespace ZeroTier