ソースを参照

Enable SO_NO_CHECK if available to skip UDP checksum on packet send for slight performance improvement. We do our own cryptographically secure authentication so UDP checksum is worthless.

Adam Ierymenko 10 年 前
コミット
40d5c79b62
5 ファイル変更14 行追加6 行削除
  1. 1 1
      osdep/Http.cpp
  2. 10 2
      osdep/Phy.hpp
  3. 1 1
      selftest.cpp
  4. 1 1
      service/OneService.cpp
  5. 1 1
      tcp-proxy/tcp-proxy.cpp

+ 1 - 1
osdep/Http.cpp

@@ -232,7 +232,7 @@ unsigned int Http::_do(
 		handler.error = false;
 		handler.done = false;
 
-		Phy<HttpPhyHandler *> phy(&handler,true);
+		Phy<HttpPhyHandler *> phy(&handler,true,true);
 
 		bool instantConnect = false;
 		handler.phy = &phy;

+ 10 - 2
osdep/Phy.hpp

@@ -144,7 +144,7 @@ private:
 	fd_set _readfds;
 	fd_set _writefds;
 #if defined(_WIN32) || defined(_WIN64)
-	fd_set _exceptfds;	
+	fd_set _exceptfds;
 #endif
 	long _nfds;
 
@@ -152,13 +152,15 @@ private:
 	ZT_PHY_SOCKFD_TYPE _whackSendSocket;
 
 	bool _noDelay;
+	bool _noCheck;
 
 public:
 	/**
 	 * @param handler Pointer of type HANDLER_PTR_TYPE to handler
 	 * @param noDelay If true, disable TCP NAGLE algorithm on TCP sockets
+	 * @param noCheck If true, attempt to set UDP SO_NO_CHECK option to disable sending checksums
 	 */
-	Phy(HANDLER_PTR_TYPE handler,bool noDelay) :
+	Phy(HANDLER_PTR_TYPE handler,bool noDelay,bool noCheck) :
 		_handler(handler)
 	{
 		FD_ZERO(&_readfds);
@@ -202,6 +204,7 @@ public:
 		_whackReceiveSocket = pipes[0];
 		_whackSendSocket = pipes[1];
 		_noDelay = noDelay;
+		_noCheck = noCheck;
 	}
 
 	~Phy()
@@ -296,6 +299,11 @@ public:
 #endif
 #ifdef IP_MTU_DISCOVER
 			f = 0; setsockopt(s,IPPROTO_IP,IP_MTU_DISCOVER,&f,sizeof(f));
+#endif
+#ifdef SO_NO_CHECK
+			if (_noCheck) {
+				f = 1; setsockopt(s,SOL_SOCKET,SO_NO_CHECK,(void *)&f,sizeof(f));
+			}
 #endif
 		}
 #endif // Windows or not

+ 1 - 1
selftest.cpp

@@ -696,7 +696,7 @@ static int testPhy()
 
 	std::cout << "[phy] Creating phy endpoint..." << std::endl;
 	TestPhyHandlers testPhyHandlers;
-	testPhyInstance = new Phy<TestPhyHandlers *>(&testPhyHandlers,false);
+	testPhyInstance = new Phy<TestPhyHandlers *>(&testPhyHandlers,false,true);
 
 	std::cout << "[phy] Binding UDP listen socket to 127.0.0.1/60002... ";
 	PhySocket *udpListenSock = testPhyInstance->udpBind((const struct sockaddr *)&bindaddr);

+ 1 - 1
service/OneService.cpp

@@ -404,7 +404,7 @@ public:
 #ifdef ZT_ENABLE_NETWORK_CONTROLLER
 		_controller((_homePath + ZT_PATH_SEPARATOR_S + ZT1_CONTROLLER_DB_PATH).c_str()),
 #endif
-		_phy(this,false),
+		_phy(this,false,true),
 		_overrideRootTopology((overrideRootTopology) ? overrideRootTopology : ""),
 		_node((Node *)0),
 		_controlPlane((ControlPlane *)0),

+ 1 - 1
tcp-proxy/tcp-proxy.cpp

@@ -297,7 +297,7 @@ int main(int argc,char **argv)
 	srand(time((time_t *)0));
 
 	TcpProxyService svc;
-	Phy<TcpProxyService *> phy(&svc,false);
+	Phy<TcpProxyService *> phy(&svc,false,true);
 	svc.phy = &phy;
 	svc.udpPortCounter = 1023;