dncurrency/nano/node/transport/channel.hpp

143 lines
3.8 KiB
C++

#pragma once
#include <nano/lib/locks.hpp>
#include <nano/lib/object_stream.hpp>
#include <nano/lib/stats.hpp>
#include <nano/node/bandwidth_limiter.hpp>
#include <nano/node/endpoint.hpp>
#include <nano/node/messages.hpp>
#include <nano/node/transport/tcp_socket.hpp>
#include <boost/asio/ip/network_v6.hpp>
namespace nano::transport
{
enum class transport_type : uint8_t
{
undefined = 0,
tcp = 1,
loopback = 2,
fake = 3
};
class channel
{
public:
explicit channel (nano::node &);
virtual ~channel () = default;
void send (nano::message & message_a,
std::function<void (boost::system::error_code const &, std::size_t)> const & callback_a = nullptr,
nano::transport::buffer_drop_policy policy_a = nano::transport::buffer_drop_policy::limiter,
nano::transport::traffic_type = nano::transport::traffic_type::generic);
// TODO: investigate clang-tidy warning about default parameters on virtual/override functions
virtual void send_buffer (nano::shared_const_buffer const &,
std::function<void (boost::system::error_code const &, std::size_t)> const & = nullptr,
nano::transport::buffer_drop_policy = nano::transport::buffer_drop_policy::limiter,
nano::transport::traffic_type = nano::transport::traffic_type::generic)
= 0;
virtual void close () = 0;
virtual nano::endpoint get_remote_endpoint () const = 0;
virtual nano::endpoint get_local_endpoint () const = 0;
virtual std::string to_string () const = 0;
virtual nano::transport::transport_type get_type () const = 0;
virtual bool max (nano::transport::traffic_type = nano::transport::traffic_type::generic)
{
return false;
}
virtual bool alive () const
{
return true;
}
std::chrono::steady_clock::time_point get_last_bootstrap_attempt () const
{
nano::lock_guard<nano::mutex> lock{ mutex };
return last_bootstrap_attempt;
}
void set_last_bootstrap_attempt (std::chrono::steady_clock::time_point const time_a)
{
nano::lock_guard<nano::mutex> lock{ mutex };
last_bootstrap_attempt = time_a;
}
std::chrono::steady_clock::time_point get_last_packet_received () const
{
nano::lock_guard<nano::mutex> lock{ mutex };
return last_packet_received;
}
void set_last_packet_received (std::chrono::steady_clock::time_point const time_a)
{
nano::lock_guard<nano::mutex> lock{ mutex };
last_packet_received = time_a;
}
std::chrono::steady_clock::time_point get_last_packet_sent () const
{
nano::lock_guard<nano::mutex> lock{ mutex };
return last_packet_sent;
}
void set_last_packet_sent (std::chrono::steady_clock::time_point const time_a)
{
nano::lock_guard<nano::mutex> lock{ mutex };
last_packet_sent = time_a;
}
std::optional<nano::account> get_node_id_optional () const
{
nano::lock_guard<nano::mutex> lock{ mutex };
return node_id;
}
nano::account get_node_id () const
{
nano::lock_guard<nano::mutex> lock{ mutex };
return node_id.value_or (0);
}
void set_node_id (nano::account node_id_a)
{
nano::lock_guard<nano::mutex> lock{ mutex };
node_id = node_id_a;
}
uint8_t get_network_version () const
{
return network_version;
}
void set_network_version (uint8_t network_version_a)
{
network_version = network_version_a;
}
nano::endpoint get_peering_endpoint () const;
void set_peering_endpoint (nano::endpoint endpoint);
std::shared_ptr<nano::node> owner () const;
protected:
nano::node & node;
mutable nano::mutex mutex;
private:
std::chrono::steady_clock::time_point last_bootstrap_attempt{ std::chrono::steady_clock::time_point () };
std::chrono::steady_clock::time_point last_packet_received{ std::chrono::steady_clock::now () };
std::chrono::steady_clock::time_point last_packet_sent{ std::chrono::steady_clock::now () };
std::optional<nano::account> node_id{};
std::atomic<uint8_t> network_version{ 0 };
std::optional<nano::endpoint> peering_endpoint{};
public: // Logging
virtual void operator() (nano::object_stream &) const;
};
}