]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Start supporting fastopen for outgoing TCP connections.
authorOtto <otto.moerbeek@open-xchange.com>
Tue, 19 Jan 2021 15:48:43 +0000 (16:48 +0100)
committerOtto <otto.moerbeek@open-xchange.com>
Wed, 24 Mar 2021 10:14:23 +0000 (11:14 +0100)
pdns/lwres.cc
pdns/pdns_recursor.cc
pdns/sstuff.hh
pdns/syncres.cc
pdns/syncres.hh

index 9b09b4dafd2dc46cfa4c1fa515cf0021e71047d3..4ff3809f11fa3d0905c43aeded70a4d5e3343ac1 100644 (file)
@@ -328,11 +328,14 @@ LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int
 
       s.setNonBlocking();
       ComboAddress local = pdns::getQueryLocalAddress(ip.sin4.sin_family, 0);
+      if (SyncRes::s_tcp_fast_open > 0) {
+        s.setFastOpen(SyncRes::s_tcp_fast_open);
+      }
 
       s.bind(local);
-        
+
       s.connect(ip);
-      
+
       uint16_t tlen=htons(vpacket.size());
       char *lenP=(char*)&tlen;
       const char *msgP=(const char*)&*vpacket.begin();
@@ -341,7 +344,7 @@ LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int
       if (ret != LWResult::Result::Success) {
         return ret;
       }
-      
+
       packet.clear();
       ret = arecvtcp(packet, 2, &s, false);
       if (ret != LWResult::Result::Success) {
index d293c73d307128aab38b6c24a5c7dcad52aefe92..d9ec1ad2292e9f17c048c4ef0a2af84b4bb0e63d 100644 (file)
@@ -3290,10 +3290,9 @@ static void makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tcp
 #endif
     }
 
-    if (::arg().asNum("tcp-fast-open") > 0) {
+    if (SyncRes::s_tcp_fast_open > 0) {
 #ifdef TCP_FASTOPEN
-      int fastOpenQueueSize = ::arg().asNum("tcp-fast-open");
-      if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &fastOpenQueueSize, sizeof fastOpenQueueSize) < 0) {
+      if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &SyncRes::tcp_fast_open, sizeof SyncRes::tcp_fast_open) < 0) {
         int err = errno;
         g_log<<Logger::Error<<"Failed to enable TCP Fast Open for listening socket: "<<strerror(err)<<endl;
       }
@@ -4013,11 +4012,11 @@ static void handleTCPClientReadable(int fd, FDMultiplexer::funcparam_t& var)
 
 static void handleTCPClientWritable(int fd, FDMultiplexer::funcparam_t& var)
 {
-  PacketID* pid=boost::any_cast<PacketID>(&var);
-  ssize_t ret=send(fd, pid->outMSG.c_str() + pid->outPos, pid->outMSG.size() - pid->outPos,0);
-  if(ret > 0) {
-    pid->outPos+=(ssize_t)ret;
-    if(pid->outPos==pid->outMSG.size()) {
+  PacketID* pid = boost::any_cast<PacketID>(&var);
+  ssize_t ret = send(fd, pid->outMSG.c_str() + pid->outPos, pid->outMSG.size() - pid->outPos,0);
+  if (ret > 0) {
+    pid->outPos += (ssize_t)ret;
+    if (pid->outPos == pid->outMSG.size()) {
       PacketID tmp=*pid;
       t_fdm->removeWriteFD(fd);
       MT->sendEvent(tmp, &tmp.outMSG);  // send back what we sent to convey everything is ok
@@ -4671,6 +4670,7 @@ static int serviceMain(int argc, char*argv[])
   SyncRes::s_maxdepth=::arg().asNum("max-recursion-depth");
   SyncRes::s_rootNXTrust = ::arg().mustDo( "root-nx-trust");
   SyncRes::s_refresh_ttlperc = ::arg().asNum("refresh-on-ttl-perc");
+  SyncRes::s_tcp_fast_open = ::arg().asNum("tcp-fast-open");
   RecursorPacketCache::s_refresh_ttlperc = SyncRes::s_refresh_ttlperc;
 
   if(SyncRes::s_serverID.empty()) {
index 38d57c85e733bc78d80b521c73e26cb00d834a72..548e0d0729b9d0ba8c0ef33cd700e160ef6a7726 100644 (file)
@@ -127,6 +127,13 @@ public:
     }
   }
 
+  void setFastOpen(int fastOpenQueueSize)
+  {
+#ifdef TCP_FASTOPEN_CONNECT
+    setsockopt(d_socket, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, &fastOpenQueueSize, sizeof fastOpenQueueSize);
+#endif
+  }
+
   //! Bind the socket to a specified endpoint
   void bind(const ComboAddress &local, bool reuseaddr=true)
   {
index 71bb60ff5c717f30798138434c5c6bd37404f550..08619eed24845d8153ed8baec8bd5283c8f44f92 100644 (file)
@@ -98,6 +98,7 @@ bool SyncRes::s_noEDNS;
 bool SyncRes::s_qnameminimization;
 SyncRes::HardenNXD SyncRes::s_hardenNXD;
 unsigned int SyncRes::s_refresh_ttlperc;
+int SyncRes::s_tcp_fast_open;
 
 #define LOG(x) if(d_lm == Log) { g_log <<Logger::Warning << x; } else if(d_lm == Store) { d_trace << x; }
 
index 786ad31d0a74156edf635695cd132b92bfa7d34c..74c1a8f7449873ff599bfeecc4bff8aa7e0fd3a8 100644 (file)
@@ -791,6 +791,7 @@ public:
   static bool s_qnameminimization;
   static HardenNXD s_hardenNXD;
   static unsigned int s_refresh_ttlperc;
+  static int s_tcp_fast_open;
 
   std::unordered_map<std::string,bool> d_discardedPolicies;
   DNSFilterEngine::Policy d_appliedPolicy;