lokinet/llarp/link/session.hpp

138 lines
2.9 KiB
C++
Raw Normal View History

#ifndef LLARP_LINK_SESSION_HPP
#define LLARP_LINK_SESSION_HPP
#include <crypto/types.hpp>
#include <net/net.hpp>
2019-10-02 13:06:14 +00:00
#include <ev/ev.hpp>
2018-12-12 01:55:30 +00:00
#include <router_contact.hpp>
#include <util/types.hpp>
2018-12-12 01:55:30 +00:00
2018-09-06 11:46:19 +00:00
#include <functional>
namespace llarp
{
struct LinkIntroMessage;
struct ILinkMessage;
2018-09-04 19:15:06 +00:00
struct ILinkLayer;
2019-07-26 16:19:31 +00:00
2020-06-04 16:00:30 +00:00
struct SessionStats
{
// rate
uint64_t currentRateRX = 0;
uint64_t currentRateTX = 0;
uint64_t totalPacketsRX = 0;
uint64_t totalAckedTX = 0;
uint64_t totalDroppedTX = 0;
uint64_t totalInFlightTX = 0;
};
2019-04-19 15:10:26 +00:00
struct ILinkSession
{
2019-08-29 11:45:58 +00:00
virtual ~ILinkSession() = default;
2019-07-26 16:19:31 +00:00
/// delivery status of a message
enum class DeliveryStatus
{
eDeliverySuccess = 0,
eDeliveryDropped = 1
};
2019-04-02 09:03:53 +00:00
/// hook for utp for when we have established a connection
virtual void
OnLinkEstablished(ILinkLayer*){};
2019-04-02 09:03:53 +00:00
/// called every event loop tick
2019-04-02 09:03:53 +00:00
virtual void
Pump() = 0;
/// called every timer tick
2019-04-02 09:03:53 +00:00
virtual void Tick(llarp_time_t) = 0;
2019-07-26 16:19:31 +00:00
/// message delivery result hook function
using CompletionHandler = std::function<void(DeliveryStatus)>;
2019-07-26 16:19:31 +00:00
using Packet_t = std::vector<byte_t>;
using Message_t = std::vector<byte_t>;
2019-09-12 14:34:27 +00:00
/// send a message buffer to the remote endpoint
2019-04-02 09:03:53 +00:00
virtual bool
2019-09-12 14:34:27 +00:00
SendMessageBuffer(Message_t, CompletionHandler handler) = 0;
/// start the connection
2019-04-02 09:03:53 +00:00
virtual void
Start() = 0;
2019-04-02 09:03:53 +00:00
virtual void
Close() = 0;
2019-08-29 11:45:58 +00:00
/// recv packet on low layer
/// not used by utp
virtual bool Recv_LL(Packet_t)
2019-08-29 11:45:58 +00:00
{
return true;
2019-08-29 11:45:58 +00:00
}
2019-04-02 09:03:53 +00:00
/// send a keepalive to the remote endpoint
virtual bool
SendKeepAlive() = 0;
/// return true if we are established
2019-04-02 09:03:53 +00:00
virtual bool
2019-05-07 13:04:43 +00:00
IsEstablished() const = 0;
/// return true if this session has timed out
2019-04-02 09:03:53 +00:00
virtual bool
TimedOut(llarp_time_t now) const = 0;
/// get remote public identity key
2019-04-02 09:03:53 +00:00
virtual PubKey
GetPubKey() const = 0;
2020-01-21 17:31:48 +00:00
/// is an inbound session or not
virtual bool
IsInbound() const = 0;
2018-09-07 17:41:49 +00:00
/// get remote address
2020-05-06 20:38:44 +00:00
virtual IpAddress
2019-04-02 09:03:53 +00:00
GetRemoteEndpoint() const = 0;
// get remote rc
2019-04-02 09:03:53 +00:00
virtual RouterContact
GetRemoteRC() const = 0;
/// is this session a session to a relay?
bool
IsRelay() const;
/// handle a valid LIM
std::function<bool(const LinkIntroMessage* msg)> GotLIM;
/// send queue current blacklog
2019-04-02 09:03:53 +00:00
virtual size_t
SendQueueBacklog() const = 0;
/// get parent link layer
virtual ILinkLayer*
2019-04-02 09:03:53 +00:00
GetLinkLayer() const = 0;
/// renegotiate session when we have a new RC locally
2019-04-02 09:03:53 +00:00
virtual bool
RenegotiateSession() = 0;
2019-03-18 12:25:32 +00:00
/// return true if we should send an explicit keepalive message
2019-04-02 09:03:53 +00:00
virtual bool
ShouldPing() const = 0;
2019-04-19 15:10:26 +00:00
2020-06-04 16:00:30 +00:00
/// return the current stats for this session
virtual SessionStats
GetSessionStats() const = 0;
2019-04-19 15:10:26 +00:00
virtual util::StatusObject
ExtractStatus() const = 0;
};
} // namespace llarp
#endif