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()))};
}