Browse Source

Only set SO_NO_CHECK on IPv4 UDP sockets for now due to broken V6 stacks that drop zero checksum UDP packets.

Adam Ierymenko 9 years ago
parent
commit
e506fda3e4
1 changed files with 4 additions and 3 deletions
  1. 4 3
      osdep/Phy.hpp

+ 4 - 3
osdep/Phy.hpp

@@ -244,14 +244,12 @@ public:
 	 */
 	static inline ZT_PHY_SOCKFD_TYPE getDescriptor(PhySocket *s) throw() { return reinterpret_cast<PhySocketImpl *>(s)->sock; }
 
-
 	/**
 	 * @param s Socket object
 	 * @return Pointer to user object
 	 */
 	static inline void** getuptr(PhySocket *s) throw() { return &(reinterpret_cast<PhySocketImpl *>(s)->uptr); }
 
-
 	/**
 	 * Cause poll() to stop waiting immediately
 	 *
@@ -384,7 +382,10 @@ public:
 			f = 0; setsockopt(s,IPPROTO_IP,IP_MTU_DISCOVER,&f,sizeof(f));
 #endif
 #ifdef SO_NO_CHECK
-			if (_noCheck) {
+			// For now at least we only set SO_NO_CHECK on IPv4 sockets since some
+			// IPv6 stacks incorrectly discard zero checksum packets. May remove
+			// this restriction later once broken stuff dies more.
+			if ((localAddress->sa_family == AF_INET)&&(_noCheck)) {
 				f = 1; setsockopt(s,SOL_SOCKET,SO_NO_CHECK,(void *)&f,sizeof(f));
 			}
 #endif