2019-06-26 21:39:29 +00:00
|
|
|
#ifndef LLARP_ROUTER_OUTBOUND_MESSAGE_HANDLER_HPP
|
|
|
|
#define LLARP_ROUTER_OUTBOUND_MESSAGE_HANDLER_HPP
|
|
|
|
|
|
|
|
#include <router/i_outbound_message_handler.hpp>
|
|
|
|
|
2019-09-01 13:26:16 +00:00
|
|
|
#include <util/thread/logic.hpp>
|
|
|
|
#include <util/thread/threading.hpp>
|
2019-06-26 21:39:29 +00:00
|
|
|
#include <router_id.hpp>
|
|
|
|
|
|
|
|
#include <list>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
struct llarp_buffer_t;
|
|
|
|
|
|
|
|
namespace llarp
|
|
|
|
{
|
|
|
|
struct ILinkManager;
|
2019-07-28 12:35:07 +00:00
|
|
|
class Logic;
|
2019-06-26 21:39:29 +00:00
|
|
|
enum class SessionResult;
|
|
|
|
|
|
|
|
struct OutboundMessageHandler final : public IOutboundMessageHandler
|
|
|
|
{
|
|
|
|
public:
|
2019-07-30 23:42:13 +00:00
|
|
|
~OutboundMessageHandler() override = default;
|
2019-06-26 21:39:29 +00:00
|
|
|
|
|
|
|
bool
|
|
|
|
QueueMessage(const RouterID &remote, const ILinkMessage *msg,
|
2019-08-07 23:18:56 +00:00
|
|
|
SendStatusHandler callback) override LOCKS_EXCLUDED(_mutex);
|
2019-06-26 21:39:29 +00:00
|
|
|
|
|
|
|
util::StatusObject
|
|
|
|
ExtractStatus() const override;
|
|
|
|
|
|
|
|
void
|
|
|
|
Init(ILinkManager *linkManager, std::shared_ptr< Logic > logic);
|
|
|
|
|
|
|
|
private:
|
|
|
|
using Message = std::pair< std::vector< byte_t >, SendStatusHandler >;
|
|
|
|
using MessageQueue = std::list< Message >;
|
|
|
|
|
|
|
|
void
|
|
|
|
OnSessionEstablished(const RouterID &router);
|
|
|
|
|
|
|
|
void
|
|
|
|
OnConnectTimeout(const RouterID &router);
|
|
|
|
|
|
|
|
void
|
|
|
|
OnRouterNotFound(const RouterID &router);
|
|
|
|
|
|
|
|
void
|
|
|
|
OnInvalidRouter(const RouterID &router);
|
|
|
|
|
|
|
|
void
|
|
|
|
OnNoLink(const RouterID &router);
|
|
|
|
|
|
|
|
void
|
|
|
|
OnSessionResult(const RouterID &router, const SessionResult result);
|
|
|
|
|
|
|
|
void
|
|
|
|
DoCallback(SendStatusHandler callback, SendStatus status);
|
|
|
|
|
|
|
|
void
|
|
|
|
QueueSessionCreation(const RouterID &remote);
|
|
|
|
|
|
|
|
bool
|
|
|
|
EncodeBuffer(const ILinkMessage *msg, llarp_buffer_t &buf);
|
|
|
|
|
|
|
|
bool
|
|
|
|
Send(const RouterID &remote, const Message &msg);
|
|
|
|
|
|
|
|
bool
|
|
|
|
SendIfSession(const RouterID &remote, const Message &msg);
|
|
|
|
|
|
|
|
void
|
2019-08-07 23:18:56 +00:00
|
|
|
FinalizeRequest(const RouterID &router, SendStatus status)
|
|
|
|
LOCKS_EXCLUDED(_mutex);
|
2019-06-26 21:39:29 +00:00
|
|
|
|
|
|
|
mutable util::Mutex _mutex; // protects outboundMessageQueue
|
|
|
|
|
|
|
|
std::unordered_map< RouterID, MessageQueue, RouterID::Hash >
|
|
|
|
outboundMessageQueue GUARDED_BY(_mutex);
|
|
|
|
|
|
|
|
ILinkManager *_linkManager;
|
|
|
|
std::shared_ptr< Logic > _logic;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace llarp
|
|
|
|
|
|
|
|
#endif // LLARP_ROUTER_OUTBOUND_MESSAGE_HANDLER_HPP
|