diff --git a/fdbrpc/sim2.actor.cpp b/fdbrpc/sim2.actor.cpp index b386ed8db70..9325ace1088 100644 --- a/fdbrpc/sim2.actor.cpp +++ b/fdbrpc/sim2.actor.cpp @@ -2864,6 +2864,13 @@ class UDPSimSocket : public IUDPSocket, ReferenceCounted { _localAddress = addr; g_sim2.addressMap.emplace(_localAddress, process); } + // Ignore those options + void setOptionReuseAddress(bool reuse) override { (void)reuse; } + void setOptionEnableLoopback(bool enable) override { (void)enable; } + void setOptionMulticastGroup(NetworkAddress const& ifaddr, NetworkAddress const& mcaddr) override { + (void)ifaddr; + (void)mcaddr; + } NetworkAddress localAddress() const override { return _localAddress; } diff --git a/flow/Net2.actor.cpp b/flow/Net2.actor.cpp index 1101fcf9b33..25231b05fa8 100644 --- a/flow/Net2.actor.cpp +++ b/flow/Net2.actor.cpp @@ -697,6 +697,41 @@ class UDPSocket : public IUDPSocket, ReferenceCounted { return res; } + void setOptionReuseAddress(bool reuse) override { + boost::system::error_code ec; + socket.set_option(boost::asio::ip::udp::socket::reuse_address(reuse), ec); + if (ec) { + Error x = invalid_option_value(); + TraceEvent(SevWarnAlways, "Net2UDPSetOptReuseAddressError").error(x); + throw x; + } + } + + void setOptionMulticastGroup(NetworkAddress const& ifaddr, NetworkAddress const& mcaddr) override { + boost::system::error_code ec; + boost::asio::ip::address i; + boost::asio::ip::address m; + i = boost::asio::ip::address::from_string(ifaddr.ip.toString()); + m = boost::asio::ip::address::from_string(mcaddr.ip.toString()); + + socket.set_option(boost::asio::ip::multicast::join_group(m.to_v4(), i.to_v4()), ec); + if (ec) { + Error x = invalid_option_value(); + TraceEvent(SevWarnAlways, "Net2UDPSetOptMulticastGroupError").error(x); + throw x; + } + } + + void setOptionEnableLoopback(bool enable) override { + boost::system::error_code ec; + socket.set_option(boost::asio::ip::multicast::enable_loopback(enable), ec); + if (ec) { + Error x = invalid_option_value(); + TraceEvent(SevWarnAlways, "Net2UDPSetOptEnableLoopbackError").error(x); + throw x; + } + } + void bind(NetworkAddress const& addr) override { boost::system::error_code ec; socket.bind(udpEndpoint(addr), ec); diff --git a/flow/include/flow/IUDPSocket.h b/flow/include/flow/IUDPSocket.h index 1e3e077ad96..8a30a626b0d 100644 --- a/flow/include/flow/IUDPSocket.h +++ b/flow/include/flow/IUDPSocket.h @@ -40,6 +40,9 @@ class IUDPSocket { virtual Future receive(uint8_t* begin, uint8_t* end) = 0; virtual Future receiveFrom(uint8_t* begin, uint8_t* end, NetworkAddress* sender) = 0; virtual void bind(NetworkAddress const& addr) = 0; + virtual void setOptionReuseAddress(bool reuse) = 0; + virtual void setOptionMulticastGroup(NetworkAddress const& ifaddr, NetworkAddress const& mcaddr) = 0; + virtual void setOptionEnableLoopback(bool reuse) = 0; virtual UID getDebugID() const = 0; virtual NetworkAddress localAddress() const = 0;