diff options
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/Arp.cpp | 11 | ||||
-rw-r--r-- | osdep/Arp.hpp | 5 | ||||
-rw-r--r-- | osdep/OSUtils.cpp | 2 | ||||
-rw-r--r-- | osdep/OSUtils.hpp | 1 | ||||
-rw-r--r-- | osdep/Phy.hpp | 57 | ||||
-rw-r--r-- | osdep/UPNPClient.cpp | 8 | ||||
-rw-r--r-- | osdep/UPNPClient.hpp | 5 | ||||
-rw-r--r-- | osdep/WindowsEthernetTap.cpp | 20 |
8 files changed, 81 insertions, 28 deletions
diff --git a/osdep/Arp.cpp b/osdep/Arp.cpp index 2ca00f0d..d1023b4d 100644 --- a/osdep/Arp.cpp +++ b/osdep/Arp.cpp @@ -104,11 +104,11 @@ uint32_t Arp::processIncomingArp(const void *arp,unsigned int len,void *response return ip; } -MAC Arp::query(const MAC &localMac,uint32_t ip,void *query,unsigned int &queryLen,MAC &queryDest) +MAC Arp::query(const MAC &localMac,uint32_t localIp,uint32_t targetIp,void *query,unsigned int &queryLen,MAC &queryDest) { const uint64_t now = OSUtils::now(); - _ArpEntry &e = _cache[ip]; + _ArpEntry &e = _cache[targetIp]; if ( ((e.mac)&&((now - e.lastResponseReceived) >= (ZT_ARP_EXPIRE / 3))) || ((!e.mac)&&((now - e.lastQuerySent) >= ZT_ARP_QUERY_INTERVAL)) ) { @@ -116,9 +116,10 @@ MAC Arp::query(const MAC &localMac,uint32_t ip,void *query,unsigned int &queryLe uint8_t *q = reinterpret_cast<uint8_t *>(query); memcpy(q,ARP_REQUEST_HEADER,8); q += 8; // ARP request header information, always the same - localMac.copyTo(q,6); q += 6; // sending host address - memset(q,0,10); q += 10; // sending IP and target media address are ignored in requests - memcpy(q,&ip,4); // target IP address for resolution (IP already in big-endian byte order) + localMac.copyTo(q,6); q += 6; // sending host MAC address + memcpy(q,&localIp,4); q += 4; // sending host IP (IP already in big-endian byte order) + memset(q,0,6); q += 6; // sending zeros for target MAC address as thats what we want to find + memcpy(q,&targetIp,4); // target IP address for resolution (IP already in big-endian byte order) queryLen = 28; if (e.mac) queryDest = e.mac; // confirmation query, send directly to address holder diff --git a/osdep/Arp.hpp b/osdep/Arp.hpp index b747cf85..129935cf 100644 --- a/osdep/Arp.hpp +++ b/osdep/Arp.hpp @@ -129,13 +129,14 @@ public: * MAC returned is non-null. * * @param localMac Local MAC address of host interface - * @param ip IP to look up + * @param localIp Local IP address of host interface + * @param targetIp IP to look up * @param query Buffer for generated query -- MUST be a minimum of ZT_ARP_BUF_LENGTH in size * @param queryLen Length of generated query, or set to 0 if no query generated * @param queryDest Destination of query, or set to null if no query generated * @return MAC or 0 if no cached entry for this IP */ - MAC query(const MAC &localMac,uint32_t ip,void *query,unsigned int &queryLen,MAC &queryDest); + MAC query(const MAC &localMac,uint32_t localIp,uint32_t targetIp,void *query,unsigned int &queryLen,MAC &queryDest); private: struct _ArpEntry diff --git a/osdep/OSUtils.cpp b/osdep/OSUtils.cpp index 45fbf100..728704e5 100644 --- a/osdep/OSUtils.cpp +++ b/osdep/OSUtils.cpp @@ -206,7 +206,7 @@ skip_add_inetaddr: bool OSUtils::readFile(const char *path,std::string &buf) { - char tmp[4096]; + char tmp[1024]; FILE *f = fopen(path,"rb"); if (f) { for(;;) { diff --git a/osdep/OSUtils.hpp b/osdep/OSUtils.hpp index 5de35eba..43fd2813 100644 --- a/osdep/OSUtils.hpp +++ b/osdep/OSUtils.hpp @@ -95,7 +95,6 @@ public: static inline bool rm(const std::string &path) throw() { return rm(path.c_str()); } static inline bool mkdir(const char *path) - throw() { #ifdef __WINDOWS__ if (::PathIsDirectoryA(path)) diff --git a/osdep/Phy.hpp b/osdep/Phy.hpp index c7b2a340..84d154a3 100644 --- a/osdep/Phy.hpp +++ b/osdep/Phy.hpp @@ -64,6 +64,12 @@ #include <netinet/in.h> #include <netinet/tcp.h> +#if defined(__linux__) || defined(linux) || defined(__LINUX__) || defined(__linux) +#ifndef IPV6_DONTFRAG +#define IPV6_DONTFRAG 62 +#endif +#endif + #define ZT_PHY_SOCKFD_TYPE int #define ZT_PHY_SOCKFD_NULL (-1) #define ZT_PHY_SOCKFD_VALID(s) ((s) > -1) @@ -365,6 +371,9 @@ public: #ifdef IPV6_MTU_DISCOVER f = 0; setsockopt(s,IPPROTO_IPV6,IPV6_MTU_DISCOVER,&f,sizeof(f)); #endif +#ifdef IPV6_DONTFRAG + f = 0; setsockopt(s,IPPROTO_IPV6,IPV6_DONTFRAG,&f,sizeof(f)); +#endif } f = 0; setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(void *)&f,sizeof(f)); f = 1; setsockopt(s,SOL_SOCKET,SO_BROADCAST,(void *)&f,sizeof(f)); @@ -414,6 +423,24 @@ public: } /** + * Set the IP TTL for the next outgoing packet (for IPv4 UDP sockets only) + * + * @param ttl New TTL (0 or >255 will set it to 255) + * @return True on success + */ + inline bool setIp4UdpTtl(PhySocket *sock,unsigned int ttl) + { + PhySocketImpl &sws = *(reinterpret_cast<PhySocketImpl *>(sock)); +#if defined(_WIN32) || defined(_WIN64) + DWORD tmp = ((ttl == 0)||(ttl > 255)) ? 255 : (DWORD)ttl; + return (::setsockopt(sws.sock,IPPROTO_IP,IP_TTL,(const char *)&tmp,sizeof(tmp)) == 0); +#else + int tmp = ((ttl == 0)||(ttl > 255)) ? 255 : (int)ttl; + return (::setsockopt(sws.sock,IPPROTO_IP,IP_TTL,(void *)&tmp,sizeof(tmp)) == 0); +#endif + } + + /** * Send a UDP packet * * @param sock UDP socket @@ -655,6 +682,36 @@ public: } /** + * Try to set buffer sizes as close to the given value as possible + * + * This will try the specified value and then lower values in 16K increments + * until one works. + * + * @param sock Socket + * @param bufferSize Desired buffer sizes + */ + inline void setBufferSizes(const PhySocket *sock,int bufferSize) + { + PhySocketImpl &sws = *(reinterpret_cast<PhySocketImpl *>(sock)); + if (bufferSize > 0) { + int bs = bufferSize; + while (bs >= 65536) { + int tmpbs = bs; + if (::setsockopt(sws.sock,SOL_SOCKET,SO_RCVBUF,(const char *)&tmpbs,sizeof(tmpbs)) == 0) + break; + bs -= 16384; + } + bs = bufferSize; + while (bs >= 65536) { + int tmpbs = bs; + if (::setsockopt(sws.sock,SOL_SOCKET,SO_SNDBUF,(const char *)&tmpbs,sizeof(tmpbs)) == 0) + break; + bs -= 16384; + } + } + } + + /** * Attempt to send data to a stream socket (non-blocking) * * If -1 is returned, the socket should no longer be used as it is now diff --git a/osdep/UPNPClient.cpp b/osdep/UPNPClient.cpp index ceecb3a3..b7c7e768 100644 --- a/osdep/UPNPClient.cpp +++ b/osdep/UPNPClient.cpp @@ -46,8 +46,8 @@ #endif #endif -#include "../ext/bin/miniupnpc/include/miniupnpc/miniupnpc.h" -#include "../ext/bin/miniupnpc/include/miniupnpc/upnpcommands.h" +#include "../ext/miniupnpc/miniupnpc.h" +#include "../ext/miniupnpc/upnpcommands.h" namespace ZeroTier { @@ -81,7 +81,7 @@ public: while (run) { { int upnpError = 0; - UPNPDev *devlist = upnpDiscover(2000,(const char *)0,(const char *)0,0,0,&upnpError); + UPNPDev *devlist = upnpDiscover(2000,(const char *)0,(const char *)0,0,0,0,&upnpError); if (devlist) { #ifdef ZT_UPNP_TRACE { @@ -115,7 +115,7 @@ public: Utils::snprintf(outport,sizeof(outport),"%u",tryPort); int mapResult = 0; - if ((mapResult = UPNP_AddPortMapping(urls.controlURL,data.first.servicetype,outport,inport,lanaddr,"ZeroTier","UDP",(const char *)0,ZT_UPNP_LEASE_DURATION)) == UPNPCOMMAND_SUCCESS) { + if ((mapResult = UPNP_AddPortMapping(urls.controlURL,data.first.servicetype,outport,inport,lanaddr,"ZeroTier","UDP",(const char *)0,"0")) == UPNPCOMMAND_SUCCESS) { #ifdef ZT_UPNP_TRACE fprintf(stderr,"UPNPClient: reserved external port: %s"ZT_EOL_S,outport); #endif diff --git a/osdep/UPNPClient.hpp b/osdep/UPNPClient.hpp index 28b9979d..a6b05b5f 100644 --- a/osdep/UPNPClient.hpp +++ b/osdep/UPNPClient.hpp @@ -42,11 +42,6 @@ */ #define ZT_UPNP_CLIENT_REFRESH_DELAY 600000 -/** - * UPNP lease duration in seconds (as string) - */ -#define ZT_UPNP_LEASE_DURATION "3600" - namespace ZeroTier { class UPNPClientImpl; diff --git a/osdep/WindowsEthernetTap.cpp b/osdep/WindowsEthernetTap.cpp index f327009d..5b2bc154 100644 --- a/osdep/WindowsEthernetTap.cpp +++ b/osdep/WindowsEthernetTap.cpp @@ -213,7 +213,7 @@ std::string WindowsEthernetTap::addNewPersistentTapDevice(const char *pathToInf, Mutex::Lock _l(_systemDeviceManagementLock); GUID classGuid; - char className[4096]; + char className[1024]; if (!WINENV.SetupDiGetINFClassA(pathToInf,&classGuid,className,sizeof(className),(PDWORD)0)) { return std::string("SetupDiGetINFClassA() failed -- unable to read zttap driver INF file"); } @@ -269,9 +269,9 @@ std::string WindowsEthernetTap::addNewPersistentTapDevice(const char *pathToInf, std::string WindowsEthernetTap::destroyAllLegacyPersistentTapDevices() { - char subkeyName[4096]; - char subkeyClass[4096]; - char data[4096]; + char subkeyName[1024]; + char subkeyClass[1024]; + char data[1024]; std::set<std::string> instanceIdPathsToRemove; { @@ -321,9 +321,9 @@ std::string WindowsEthernetTap::destroyAllLegacyPersistentTapDevices() std::string WindowsEthernetTap::destroyAllPersistentTapDevices() { - char subkeyName[4096]; - char subkeyClass[4096]; - char data[4096]; + char subkeyName[1024]; + char subkeyClass[1024]; + char data[1024]; std::set<std::string> instanceIdPathsToRemove; { @@ -479,9 +479,9 @@ WindowsEthernetTap::WindowsEthernetTap( _initialized(false), _enabled(true) { - char subkeyName[4096]; - char subkeyClass[4096]; - char data[4096]; + char subkeyName[1024]; + char subkeyClass[1024]; + char data[1024]; char tag[24]; std::string mySubkeyName; |