blob: c0354368f4508ae3ba2eff43314c9c2498d25f95 [file]
#pragma once
#include "libnsm/base.h"
#include "common/coroutine.hpp"
#include "common/types.hpp"
#include "nsmMsghandler.hpp"
#include "requester/request.hpp"
#include "requester/retry_backoff_utils.hpp"
#include <functional>
#include <map>
#include <memory>
#include <optional>
namespace requester
{
class MctpEndpointProber
{
public:
using SendRecvFn = std::function<requester::Coroutine(
eid_t, ::Request&, std::shared_ptr<const nsm_msg>&, size_t*)>;
explicit MctpEndpointProber(std::shared_ptr<nsm::NsmMessageHandler> handler,
requester::retry::LinearBackoffConfig cfg = {},
SendRecvFn sendRecvFn = nullptr) :
nsmMsgHandler(std::move(handler)), cfg(cfg),
sendRecvFn(std::move(sendRecvFn))
{}
requester::Coroutine ping(eid_t eid);
requester::Coroutine
getQueryDeviceIdentification(eid_t eid, uint8_t& deviceIdentification,
uint8_t& deviceInstance);
std::optional<requester::retry::OperationSummary>
getLastPingSummary(eid_t eid) const
{
auto it = lastPingSummaryByEid.find(eid);
if (it == lastPingSummaryByEid.end())
{
return std::nullopt;
}
return it->second;
}
std::optional<requester::retry::OperationSummary>
getLastQueryDeviceIdentificationSummary(eid_t eid) const
{
auto it = lastQuerySummaryByEid.find(eid);
if (it == lastQuerySummaryByEid.end())
{
return std::nullopt;
}
return it->second;
}
void logAllSummaries() const;
private:
requester::Coroutine pingOnce(eid_t eid, uint8_t& cc, uint16_t& reason);
requester::Coroutine queryDeviceIdentificationOnce(eid_t eid, uint8_t& cc,
uint16_t& reason,
uint8_t& devId,
uint8_t& devInst);
std::shared_ptr<nsm::NsmMessageHandler> nsmMsgHandler;
requester::retry::LinearBackoffConfig cfg;
SendRecvFn sendRecvFn;
std::map<eid_t, requester::retry::OperationSummary> lastPingSummaryByEid;
std::map<eid_t, requester::retry::OperationSummary> lastQuerySummaryByEid;
};
} // namespace requester