From e506fda3e4d60063541abb46973a0cea0bc8e8b0 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 9 Dec 2015 15:02:42 -0800 Subject: Only set SO_NO_CHECK on IPv4 UDP sockets for now due to broken V6 stacks that drop zero checksum UDP packets. --- osdep/Phy.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'osdep/Phy.hpp') diff --git a/osdep/Phy.hpp b/osdep/Phy.hpp index 84d154a3..2dcda982 100644 --- a/osdep/Phy.hpp +++ b/osdep/Phy.hpp @@ -244,14 +244,12 @@ public: */ static inline ZT_PHY_SOCKFD_TYPE getDescriptor(PhySocket *s) throw() { return reinterpret_cast(s)->sock; } - /** * @param s Socket object * @return Pointer to user object */ static inline void** getuptr(PhySocket *s) throw() { return &(reinterpret_cast(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 -- cgit v1.2.3