Use folly's async udp socket
authorDave Watson <davejwatson@fb.com>
Wed, 18 Feb 2015 16:12:06 +0000 (08:12 -0800)
committerAlecs King <int@fb.com>
Tue, 3 Mar 2015 03:22:48 +0000 (19:22 -0800)
Summary: They are functionaly equivalent, no need to have more than one

Test Plan: fbconfig -r realtime/voip; fbmake runtests

Reviewed By: naizhi@fb.com

Subscribers: trunkagent, doug, ps, bmatheny, folly-diffs@, yfeldblum

FB internal diff: D1828044

Tasks: 6154007

Signature: t1:1828044:1423165354:f71d2fd28ca76a8f67a597c747f8578d2909823c

folly/io/async/AsyncUDPSocket.cpp
folly/io/async/AsyncUDPSocket.h

index 979c2b75702eac9c939240a6726400b24d7e6a54..0337501f1ac6d3f876fc3b5fb22ff84309d4e478 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 
+// Due to the way kernel headers are included, this may or may not be defined.
+// Number pulled from 3.10 kernel headers.
+#ifndef SO_REUSEPORT
+#define SO_REUSEPORT 15
+#endif
+
 namespace folly {
 
 AsyncUDPSocket::AsyncUDPSocket(EventBase* evb)
@@ -68,6 +74,22 @@ void AsyncUDPSocket::bind(const folly::SocketAddress& address) {
                               errno);
   }
 
+  if (reusePort_) {
+    // put the socket in port reuse mode
+    int value = 1;
+    if (setsockopt(socket,
+                   SOL_SOCKET,
+                   SO_REUSEPORT,
+                   &value,
+                   sizeof(value)) != 0) {
+      ::close(socket);
+      throw AsyncSocketException(AsyncSocketException::NOT_OPEN,
+                                "failed to put socket in reuse_port mode",
+                                errno);
+
+    }
+  }
+
   // bind to the address
   sockaddr_storage addrStorage;
   address.getAddress(&addrStorage);
index 1c5d3f0af2e891ce785b2708d78b2fc61bd7bedd..39300105a76fc8638954c4528da47126aa9d29ce 100644 (file)
@@ -136,6 +136,13 @@ class AsyncUDPSocket : public EventHandler {
     CHECK_NE(-1, fd_) << "Need to bind before getting FD out";
     return fd_;
   }
+
+  /**
+   * Set reuse port mode to call bind() on the same address multiple times
+   */
+  void setReusePort(bool reusePort) {
+    reusePort_ = reusePort;
+  }
  private:
   AsyncUDPSocket(const AsyncUDPSocket&) = delete;
   AsyncUDPSocket& operator=(const AsyncUDPSocket&) = delete;
@@ -157,6 +164,8 @@ class AsyncUDPSocket : public EventHandler {
 
   // Non-null only when we are reading
   ReadCallback* readCallback_;
+
+  bool reusePort_{false};
 };
 
 } // Namespace