]> granicus.if.org Git - pdns/commitdiff
make dnsreplay set the right socket size buffers for its abusive use of them
authorbert hubert <bert.hubert@netherlabs.nl>
Mon, 17 Mar 2014 15:24:46 +0000 (16:24 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Mon, 17 Mar 2014 15:24:46 +0000 (16:24 +0100)
pdns/dnsreplay.cc

index 3c2daa57cf93a0680fe8bb2af43e7b44b9a18e2e..30c1713c1505c0b07d4bfcb134aa6a78f0c939e0 100644 (file)
@@ -137,6 +137,31 @@ private:
 } s_idmanager;
 
 
+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<<": "<<strerror(errno)<<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{};
 
@@ -539,6 +564,7 @@ bool sendPacketFromPR(PcapPacketReader& pr, const ComboAddress& remote)
   {
     s_origdnserrors++;
   }
+
   return sent;
 }
 
@@ -598,7 +624,9 @@ try
   s_socket= new Socket(InterNetwork, Datagram);
 
   s_socket->setNonBlocking();
-  
+  setSocketReceiveBuffer(s_socket->getHandle(), 2000000);
+  setSocketSendBuffer(s_socket->getHandle(), 2000000);
+
   ComboAddress remote(g_vm["target-ip"].as<string>(), 
                     g_vm["target-port"].as<uint16_t>());