]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth,rec: Refactor the setSocket*Buffer functions
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 18 Nov 2021 16:01:32 +0000 (17:01 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 18 Nov 2021 16:01:32 +0000 (17:01 +0100)
pdns/calidns.cc
pdns/dnsreplay.cc
pdns/iputils.cc
pdns/iputils.hh
pdns/pdns_recursor.cc

index 973e5309538ef27c5245da88b91b5ba0f5c655eb..89886e3a704929968e6b5687dc165e4bde2bb4f2 100644 (file)
@@ -117,36 +117,6 @@ static void* recvThread(const vector<std::unique_ptr<Socket>>* sockets)
   return 0;
 }
 
-static void setSocketBuffer(int fd, int optname, uint32_t size)
-{
-  uint32_t psize=0;
-  socklen_t len=sizeof(psize);
-  
-  if(!getsockopt(fd, SOL_SOCKET, optname, (char*)&psize, &len) && psize > size) {
-    if (!g_quiet) {
-      cerr<<"Not decreasing socket buffer size from "<<psize<<" to "<<size<<endl;
-    }
-    return; 
-  }
-
-  if (setsockopt(fd, SOL_SOCKET, optname, (char*)&size, sizeof(size)) < 0 ) {
-    if (!g_quiet) {
-      cerr<<"Warning: unable to raise socket buffer size to "<<size<<": "<<stringerror()<<endl;
-    }
-  }
-}
-
-
-static void setSocketReceiveBuffer(int fd, uint32_t size)
-{
-  setSocketBuffer(fd, SO_RCVBUF, size);
-}
-
-static void setSocketSendBuffer(int fd, uint32_t size)
-{
-  setSocketBuffer(fd, SO_SNDBUF, size);
-}
-
 static ComboAddress getRandomAddressFromRange(const Netmask& ecsRange)
 {
   ComboAddress result = ecsRange.getMaskedNetwork();
@@ -426,8 +396,23 @@ try
   for(int i=0; i < 24; ++i) {
     auto sock = make_unique<Socket>(dest.sin4.sin_family, SOCK_DGRAM);
     //    sock->connect(dest);
-    setSocketSendBuffer(sock->getHandle(), 2000000);
-    setSocketReceiveBuffer(sock->getHandle(), 2000000);
+    try {
+      setSocketSendBuffer(sock->getHandle(), 2000000);
+    }
+    catch (const std::exception& e) {
+      if (!g_quiet) {
+        cerr<<e.what()<<endl;
+      }
+    }
+    try {
+      setSocketReceiveBuffer(sock->getHandle(), 2000000);
+    }
+    catch (const std::exception& e) {
+      if (!g_quiet) {
+        cerr<<e.what()<<endl;
+      }
+    }
+
     sockets.push_back(std::move(sock));
   }
   new thread(recvThread, &sockets);
index 78226d919bd96e17d7e29924996ed769855c2b4c..0d4b8d10014f7bb6bb05ac8c33002057d289e5e4 100644 (file)
@@ -163,32 +163,6 @@ private:
   
 } s_idmanager;
 
-
-static void setSocketBuffer(int fd, int optname, uint32_t size)
-{
-  uint32_t psize=0;
-  socklen_t len=sizeof(psize);
-  
-  if(!getsockopt(fd, SOL_SOCKET, optname, (char*)&psize, &len) && psize > size) {
-    cerr<<"Not decreasing socket buffer size from "<<psize<<" to "<<size<<endl;
-    return; 
-  }
-
-  if (setsockopt(fd, SOL_SOCKET, optname, (char*)&size, sizeof(size)) < 0 )
-    cerr<<"Warning: unable to raise socket buffer size to "<<size<<": "<<stringerror()<<endl;
-}
-
-static void setSocketReceiveBuffer(int fd, uint32_t size)
-{
-  setSocketBuffer(fd, SO_RCVBUF, size);
-}
-
-static void setSocketSendBuffer(int fd, uint32_t size)
-{
-  setSocketBuffer(fd, SO_SNDBUF, size);
-}
-
-
 struct AssignedIDTag{};
 struct QuestionTag{};
 
@@ -779,8 +753,18 @@ try
   if(g_vm.count("source-ip") && !g_vm["source-ip"].as<string>().empty())
     s_socket->bind(ComboAddress(g_vm["source-ip"].as<string>(), g_vm["source-port"].as<uint16_t>()));
 
-  setSocketReceiveBuffer(s_socket->getHandle(), 2000000);
-  setSocketSendBuffer(s_socket->getHandle(), 2000000);
+  try {
+    setSocketReceiveBuffer(s_socket->getHandle(), 2000000);
+  }
+  catch (const std::exception& e) {
+    cerr<<e.what()<<endl;
+  }
+  try {
+    setSocketSendBuffer(s_socket->getHandle(), 2000000);
+  }
+  catch (const std::exception& e) {
+    cerr<<e.what()<<endl;
+  }
 
   ComboAddress remote(g_vm["target-ip"].as<string>(), 
                     g_vm["target-port"].as<uint16_t>());
index 05eed1245ba48ab19be26e08391d8f5cbe637c21..1c042289a9e909c4ed7e95ef752ff33e015b1769 100644 (file)
@@ -519,3 +519,27 @@ ComboAddress parseIPAndPort(const std::string& input, uint16_t port)
     return ComboAddress(input, port);
   }
 }
+
+void setSocketBuffer(int fd, int optname, uint32_t size)
+{
+  uint32_t psize = 0;
+  socklen_t len = sizeof(psize);
+
+  if (!getsockopt(fd, SOL_SOCKET, optname, &psize, &len) && psize > size) {
+    throw std::runtime_error("Not decreasing socket buffer size from " + std::to_string(psize) + " to " + std::to_string(size));
+  }
+
+  if (setsockopt(fd, SOL_SOCKET, optname, &size, sizeof(size)) < 0) {
+    throw std::runtime_error("Unable to raise socket buffer size to " + std::to_string(size) + ": " + stringerror());
+  }
+}
+
+void setSocketReceiveBuffer(int fd, uint32_t size)
+{
+  setSocketBuffer(fd, SO_RCVBUF, size);
+}
+
+void setSocketSendBuffer(int fd, uint32_t size)
+{
+  setSocketBuffer(fd, SO_SNDBUF, size);
+}
index b36f0e27723607d1bd252f22da547fa8d0611b77..23b200b1a5375fa69f6f7f609d2614f155176190 100644 (file)
@@ -1649,3 +1649,9 @@ bool isTCPSocketUsable(int sock);
 
 extern template class NetmaskTree<bool>;
 ComboAddress parseIPAndPort(const std::string& input, uint16_t port);
+
+/* These functions throw if the value was already set to a higher value,
+   or on error */
+void setSocketBuffer(int fd, int optname, uint32_t size);
+void setSocketReceiveBuffer(int fd, uint32_t size);
+void setSocketSendBuffer(int fd, uint32_t size);
index f3ac0a08dc84491c69d44b327d21136b62dc1f3e..362be3973bb9eb2a0f9401d70de44457b78730b1 100644 (file)
@@ -597,34 +597,6 @@ PacketBuffer GenUDPQueryResponse(const ComboAddress& dest, const string& query)
 
 static void handleUDPServerResponse(int fd, FDMultiplexer::funcparam_t&);
 
-static void setSocketBuffer(int fd, int optname, uint32_t size)
-{
-  uint32_t psize=0;
-  socklen_t len=sizeof(psize);
-
-  if(!getsockopt(fd, SOL_SOCKET, optname, (char*)&psize, &len) && psize > size) {
-    g_log<<Logger::Error<<"Not decreasing socket buffer size from "<<psize<<" to "<<size<<endl;
-    return;
-  }
-
-  if (setsockopt(fd, SOL_SOCKET, optname, (char*)&size, sizeof(size)) < 0) {
-    int err = errno;
-    g_log << Logger::Error << "Unable to raise socket buffer size to " << size << ": " << stringerror(err) << endl;
-  }
-}
-
-
-static void setSocketReceiveBuffer(int fd, uint32_t size)
-{
-  setSocketBuffer(fd, SO_RCVBUF, size);
-}
-
-static void setSocketSendBuffer(int fd, uint32_t size)
-{
-  setSocketBuffer(fd, SO_SNDBUF, size);
-}
-
-
 // you can ask this class for a UDP socket to send a query from
 // this socket is not yours, don't even think about deleting it
 // but after you call 'returnSocket' on it, don't assume anything anymore
@@ -3680,7 +3652,13 @@ static void makeTCPServerSockets(deferredAdd_t& deferredAdds, std::set<int>& tcp
       throw PDNSException("Binding TCP server socket for "+ st.host +": "+stringerror());
 
     setNonBlocking(fd);
-    setSocketSendBuffer(fd, 65000);
+    try {
+      setSocketSendBuffer(fd, 65000);
+    }
+    catch (const std::exception& e) {
+      g_log<<Logger::Error<<e.what()<<endl;
+    }
+
     listen(fd, 128);
     deferredAdds.emplace_back(fd, handleNewTCPQuestion);
     tcpSockets.insert(fd);
@@ -3744,7 +3722,12 @@ static void makeUDPServerSockets(deferredAdd_t& deferredAdds)
 
     setCloseOnExec(fd);
 
-    setSocketReceiveBuffer(fd, 250000);
+    try {
+      setSocketReceiveBuffer(fd, 25000);
+    }
+    catch (const std::exception& e) {
+      g_log<<Logger::Error<<e.what()<<endl;
+    }
     sin.sin4.sin_port = htons(st.port);