From eeb6a51c7065797ea1c1e2c318b600491fa0d524 Mon Sep 17 00:00:00 2001 From: wangha Date: Wed, 4 Dec 2024 22:15:46 +0800 Subject: [PATCH] Support to set options for IUDPSocket. Signed-off-by: wangha --- fdbrpc/sim2.actor.cpp | 7 +++++++ flow/Net2.actor.cpp | 35 ++++++++++++++++++++++++++++++++++ flow/include/flow/IUDPSocket.h | 3 +++ 3 files changed, 45 insertions(+) diff --git a/fdbrpc/sim2.actor.cpp b/fdbrpc/sim2.actor.cpp index 47d1891dc6a..20cd27ecdad 100644 --- a/fdbrpc/sim2.actor.cpp +++ b/fdbrpc/sim2.actor.cpp @@ -2862,6 +2862,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 fe073dc9f40..38bc2d3c9f7 100644 --- a/flow/Net2.actor.cpp +++ b/flow/Net2.actor.cpp @@ -696,6 +696,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;