Skip to content

Commit 1c13046

Browse files
committed
[245] Creating single ctor to handle both ipv4 and ipv6.
1 parent f47055c commit 1c13046

File tree

2 files changed

+18
-33
lines changed

2 files changed

+18
-33
lines changed

core/include/userver/engine/io/sockaddr.hpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,10 @@ static_assert(
4848
/// Native ip multicast request wrapper
4949
class IpMreq final {
5050
public:
51-
/// @brief Creates IPv4 multicast request.
52-
/// @param imr_multiaddr IPv4 multicast group address (e.g., "239.255.0.1")
53-
/// @param imr_interface IPv4 interface address (nullptr for INADDR_ANY)
54-
IpMreq(const char* imr_multiaddr, const char* imr_interface = nullptr);
55-
56-
/// @brief Creates IPv6 multicast request.
57-
/// @param ipv6mr_multiaddr IPv6 multicast group address (e.g., "ff02::1")
58-
/// @param ipv6mr_interface Interface index (0 for default)
59-
IpMreq(const char* ipv6mr_multiaddr, unsigned int ipv6mr_interface = 0);
51+
/// @brief Creates multicast request. IP version is chosen automatically from ip_multiaddr value.
52+
/// @param ip_multiaddr IP multicast group address (e.g. 239.255.0.1" or "ff02::1")
53+
/// @param interface_index Interface index (0 for default);
54+
IpMreq(const char* ip_multiaddr, unsigned int interface_index);
6055

6156
/// @brief Native multicast request structure pointer.
6257
void* Data() { return &data_; }
@@ -75,11 +70,11 @@ class IpMreq final {
7570

7671
/// Returns appropriate size for setsockopt based on address family.
7772
/// @param domain Socket domain (AF_INET or AF_INET6)
78-
size_t Size() const noexcept { return (family_ == AF_INET ? sizeof(struct ip_mreq) : sizeof(struct ipv6_mreq)); }
73+
size_t Size() const noexcept { return (family_ == AF_INET ? sizeof(struct ip_mreqn) : sizeof(struct ipv6_mreq)); }
7974

8075
private:
8176
union Storage {
82-
struct ip_mreq ip_req;
77+
struct ip_mreqn ip_req;
8378
struct ipv6_mreq ipv6_req;
8479
} data_;
8580
int family_;

core/src/engine/io/sockaddr.cpp

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,26 @@ USERVER_NAMESPACE_BEGIN
1818

1919
namespace engine::io {
2020

21-
IpMreq::IpMreq(const char* imr_multiaddr, const char* imr_interface) : family_{AF_INET} {
21+
IpMreq::IpMreq(const char* ip_multiaddr, unsigned int interface_index) {
2222
data_.ip_req = {};
23-
struct ip_mreq* imr_ptr = &data_.ip_req;
24-
if (::inet_pton(AF_INET, imr_multiaddr, &imr_ptr->imr_multiaddr) != 1) {
25-
throw IpMulticastRequestException(
26-
fmt::format("Invalid IPv4 multicast address: {}", imr_multiaddr)
27-
);
23+
if (inet_pton(AF_INET, ip_multiaddr, &data_.ip_req.imr_multiaddr) == 1) {
24+
// imr_address field is not set since it's not used if imr_ifindex presents
25+
family_ = AF_INET;
26+
data_.ip_req.imr_ifindex = interface_index;
2827
}
29-
if (imr_interface != nullptr) {
30-
if (::inet_pton(AF_INET, imr_interface, &imr_ptr->imr_interface) != 1) {
28+
else {
29+
data_.ipv6_req = {};
30+
if (inet_pton(AF_INET6, ip_multiaddr, &data_.ipv6_req.ipv6mr_multiaddr) == 1) {
31+
family_ = AF_INET6;
32+
data_.ipv6_req.ipv6mr_interface = interface_index;
33+
} else {
3134
throw IpMulticastRequestException(
32-
fmt::format("Invalid IPv4 interface address: {}", imr_interface)
35+
fmt::format("Invalid IP address: {}", ip_multiaddr)
3336
);
3437
}
35-
} else {
36-
imr_ptr->imr_interface.s_addr = htonl(INADDR_ANY);
3738
}
3839
}
3940

40-
IpMreq::IpMreq(const char* ipv6mr_multiaddr, unsigned int ipv6mr_interface) : family_{AF_INET6} {
41-
data_.ipv6_req = {};
42-
struct ipv6_mreq* req = &data_.ipv6_req;
43-
if (inet_pton(AF_INET6, ipv6mr_multiaddr, &req->ipv6mr_multiaddr) != 1) {
44-
throw IpMulticastRequestException(
45-
fmt::format("Invalid IPv6 address: {}", ipv6mr_multiaddr)
46-
);
47-
}
48-
req->ipv6mr_interface = ipv6mr_interface;
49-
}
50-
5141
Sockaddr Sockaddr::MakeUnixSocketAddress(std::string_view path) {
5242
Sockaddr addr;
5343
auto* sa = addr.As<struct sockaddr_un>();

0 commit comments

Comments
 (0)