Program Listing for File Helpers.cpp
↰ Return to documentation for file (BackendLibfabric/Helpers.cpp
)
#include "Helpers.hpp"
#include <string>
#include <tracy/Tracy.hpp>
#include <ers/ers.h>
#include <rdma/fi_cm.h>
#include "Issues.hpp"
std::string netio3::libfabric::get_provider(NetworkMode mode)
{
switch (mode) {
case NetworkMode::TCP:
return "sockets";
case NetworkMode::RDMA:
return "verbs";
default:
throw LibFabricError(ERS_HERE, "Unknown network mode");
}
}
netio3::EndPointAddress netio3::libfabric::peer_address(fid_ep* ep)
{
ZoneScoped;
std::array<char, BUFSIZ> address{};
auto addrlen = address.size();
const auto ret = fi_getpeer(ep, address.data(), &addrlen);
ERS_DEBUG(2, std::format("ret={} Peer address length={}", ret, addrlen));
for (size_t ch = 0; ch < addrlen; ++ch) {
ERS_DEBUG(3, std::format("Peer address val={:#x}", address.at(ch)));
}
if (ret != 0) {
ers::error(LibFabricError(ERS_HERE, std::format("fi_getpeer failed: {}", fi_strerror(-ret))));
}
static std::array<char, BUFSIZ> namebuf;
static std::array<char, BUFSIZ> servbuf;
const int errcode = getnameinfo(reinterpret_cast<const sockaddr*>(address.data()),
addrlen,
namebuf.data(),
BUFSIZ,
servbuf.data(),
BUFSIZ,
NI_NUMERICHOST | NI_NUMERICSERV);
if (errcode != 0) {
if (errcode != EAI_SYSTEM) {
ers::error(LibFabricError(
ERS_HERE,
std::format("getnameinfo for {} failed: {}", address.data(), gai_strerror(errcode))));
} else {
ers::error(LibFabricError(ERS_HERE,
std::format("getnameinfo for {} failed: {}",
address.data(),
utility::error_message(errno))));
}
}
return {std::string(namebuf.data()), static_cast<unsigned short>(atoi(servbuf.data()))};
}