diff --git a/ydb/library/actors/interconnect/interconnect_address.cpp b/ydb/library/actors/interconnect/interconnect_address.cpp index 3bf66ab87d27..76c1ba616cb9 100644 --- a/ydb/library/actors/interconnect/interconnect_address.cpp +++ b/ydb/library/actors/interconnect/interconnect_address.cpp @@ -8,6 +8,16 @@ #include #endif +#if defined(__APPLE__) || defined(_darwin_) +/* OSX seems not to define these. */ +#ifndef s6_addr16 +#define s6_addr16 __u6_addr.__u6_addr16 +#endif +#ifndef s6_addr32 +#define s6_addr32 __u6_addr.__u6_addr32 +#endif +#endif + namespace NInterconnect { TAddress::TAddress() { memset(&Addr, 0, sizeof(Addr)); @@ -104,10 +114,11 @@ namespace NInterconnect { return p ? TString(p) : TString(); } - TAddress::TV6Addr TAddress::GetV6CompatAddr() const { - switch (GetFamily()) { +#if not defined(_win32_) + TAddress::TV6Addr GetV6CompatAddr(const NInterconnect::TAddress& a) noexcept { + switch (a.GetFamily()) { case AF_INET: { - TV6Addr addr; + TAddress::TV6Addr addr; addr.s6_addr16[0] = 0; addr.s6_addr16[1] = 0; addr.s6_addr16[2] = 0; @@ -115,17 +126,18 @@ namespace NInterconnect { addr.s6_addr16[4] = 0; addr.s6_addr16[5] = Max(); addr.s6_addr16[6] = Max(); - addr.s6_addr32[3] = Addr.Ipv4.sin_addr.s_addr; + addr.s6_addr32[3] = a.Addr.Ipv4.sin_addr.s_addr; return addr; } case AF_INET6: - return Addr.Ipv6.sin6_addr; + return a.Addr.Ipv6.sin6_addr; default: { - TV6Addr addr; + TAddress::TV6Addr addr; memset(&addr, 0, sizeof(addr)); return addr; } break; } } +#endif } diff --git a/ydb/library/actors/interconnect/interconnect_address.h b/ydb/library/actors/interconnect/interconnect_address.h index 3cf28b30f377..dd765c90ffd3 100644 --- a/ydb/library/actors/interconnect/interconnect_address.h +++ b/ydb/library/actors/interconnect/interconnect_address.h @@ -7,13 +7,13 @@ namespace NInterconnect { class TAddress { + public: union { sockaddr Generic; sockaddr_in Ipv4; sockaddr_in6 Ipv6; } Addr; - public: using TV6Addr = in6_addr; TAddress(); TAddress(const char* addr, ui16 port); @@ -44,7 +44,9 @@ namespace NInterconnect { res.Addr.Ipv6.sin6_addr = in6addr_any; return res; } - - TV6Addr GetV6CompatAddr() const; }; + +#if not defined(_win32_) + TAddress::TV6Addr GetV6CompatAddr(const TAddress& a) noexcept; +#endif } diff --git a/ydb/library/actors/interconnect/rdma/ut/utils.cpp b/ydb/library/actors/interconnect/rdma/ut/utils.cpp index e0a5f255f7ff..747ad9c75b18 100644 --- a/ydb/library/actors/interconnect/rdma/ut/utils.cpp +++ b/ydb/library/actors/interconnect/rdma/ut/utils.cpp @@ -48,7 +48,7 @@ std::tuple, TRdmaCtx*> PrepareTestRuntim TString ip = env ?: defIp; NInterconnect::TAddress address(ip, 7777); - auto ctx = NInterconnect::NRdma::NLinkMgr::GetCtx(address.GetV6CompatAddr()); + auto ctx = NInterconnect::NRdma::NLinkMgr::GetCtx(GetV6CompatAddr(address)); RDMA_UT_EXPECT_TRUE(ctx); Cerr << "Using verbs context: " << *ctx << ", on addr: " << ip << Endl;