i2pd/RouterInfo.h

197 lines
6.2 KiB
C
Raw Normal View History

2013-10-27 15:28:23 +00:00
#ifndef ROUTER_INFO_H__
#define ROUTER_INFO_H__
#include <inttypes.h>
#include <string>
#include <map>
#include <vector>
#include <iostream>
#include <boost/asio.hpp>
2014-01-10 03:26:30 +00:00
#include "Identity.h"
2015-03-24 16:47:57 +00:00
#include "Profiling.h"
2013-10-27 15:28:23 +00:00
namespace i2p
{
namespace data
2014-09-02 20:11:31 +00:00
{
const char CAPS_FLAG_FLOODFILL = 'f';
const char CAPS_FLAG_HIDDEN = 'H';
const char CAPS_FLAG_REACHABLE = 'R';
const char CAPS_FLAG_UNREACHABLE = 'U';
const char CAPS_FLAG_LOW_BANDWIDTH1 = 'K';
const char CAPS_FLAG_LOW_BANDWIDTH2 = 'L';
const char CAPS_FLAG_HIGH_BANDWIDTH1 = 'M';
const char CAPS_FLAG_HIGH_BANDWIDTH2 = 'N';
const char CAPS_FLAG_HIGH_BANDWIDTH3 = 'O';
2016-01-03 03:17:04 +00:00
const char CAPS_FLAG_EXTRA_BANDWIDTH1 = 'P';
const char CAPS_FLAG_EXTRA_BANDWIDTH2 = 'X';
2014-09-02 20:11:31 +00:00
const char CAPS_FLAG_SSU_TESTING = 'B';
const char CAPS_FLAG_SSU_INTRODUCER = 'C';
2014-07-10 19:33:42 +00:00
const int MAX_RI_BUFFER_SIZE = 2048;
2013-11-24 23:10:27 +00:00
class RouterInfo: public RoutingDestination
2013-10-27 15:28:23 +00:00
{
public:
enum SupportedTranports
{
eNTCPV4 = 0x01,
2014-03-19 16:02:51 +00:00
eNTCPV6 = 0x02,
eSSUV4 = 0x04,
eSSUV6 = 0x08
};
2014-03-19 16:02:51 +00:00
enum Caps
{
eFloodfill = 0x01,
2014-03-19 19:58:57 +00:00
eHighBandwidth = 0x02,
2016-01-03 03:17:04 +00:00
eExtraBandwidth = 0x04,
eReachable = 0x08,
eSSUTesting = 0x10,
eSSUIntroducer = 0x20,
eHidden = 0x40,
eUnreachable = 0x80
2014-03-19 16:02:51 +00:00
};
2013-10-27 15:28:23 +00:00
enum TransportStyle
{
eTransportUnknown = 0,
eTransportNTCP,
eTransportSSU
};
2015-11-03 14:15:49 +00:00
typedef Tag<32> IntroKey; // should be castable to MacKey and AESKey
2014-02-20 21:15:12 +00:00
struct Introducer
{
boost::asio::ip::address iHost;
int iPort;
2015-11-03 14:15:49 +00:00
IntroKey iKey;
2014-02-20 21:15:12 +00:00
uint32_t iTag;
};
2013-10-27 15:28:23 +00:00
struct Address
{
TransportStyle transportStyle;
2014-01-21 21:07:16 +00:00
boost::asio::ip::address host;
2015-01-17 04:01:40 +00:00
std::string addressString;
2014-09-14 21:57:47 +00:00
int port, mtu;
2013-10-27 15:28:23 +00:00
uint64_t date;
uint8_t cost;
2014-02-20 21:15:12 +00:00
// SSU only
2015-11-03 14:15:49 +00:00
IntroKey key; // intro key for SSU
2014-02-20 21:15:12 +00:00
std::vector<Introducer> introducers;
bool IsCompatible (const boost::asio::ip::address& other) const
{
return (host.is_v4 () && other.is_v4 ()) ||
(host.is_v6 () && other.is_v6 ());
}
2015-11-03 14:15:49 +00:00
bool operator==(const Address& other) const
{
return transportStyle == other.transportStyle && host == other.host && port == other.port;
}
bool operator!=(const Address& other) const
{
return !(*this == other);
}
2013-10-27 15:28:23 +00:00
};
2014-07-23 14:56:41 +00:00
RouterInfo (const std::string& fullPath);
2014-10-26 02:23:28 +00:00
RouterInfo (): m_Buffer (nullptr) { };
2013-10-27 15:28:23 +00:00
RouterInfo (const RouterInfo& ) = default;
2013-12-29 15:48:57 +00:00
RouterInfo& operator=(const RouterInfo& ) = default;
2013-10-27 15:28:23 +00:00
RouterInfo (const uint8_t * buf, int len);
~RouterInfo ();
2013-10-27 15:28:23 +00:00
2015-11-03 14:15:49 +00:00
std::shared_ptr<const IdentityEx> GetRouterIdentity () const { return m_RouterIdentity; };
void SetRouterIdentity (std::shared_ptr<const IdentityEx> identity);
2014-11-20 17:21:27 +00:00
std::string GetIdentHashBase64 () const { return GetIdentHash ().ToBase64 (); };
2013-11-29 12:52:09 +00:00
uint64_t GetTimestamp () const { return m_Timestamp; };
2014-02-09 02:06:40 +00:00
std::vector<Address>& GetAddresses () { return m_Addresses; };
2014-02-09 13:52:56 +00:00
const Address * GetNTCPAddress (bool v4only = true) const;
const Address * GetSSUAddress (bool v4only = true) const;
const Address * GetSSUV6Address () const;
2013-10-27 15:28:23 +00:00
void AddNTCPAddress (const char * host, int port);
2014-10-30 14:07:39 +00:00
void AddSSUAddress (const char * host, int port, const uint8_t * key, int mtu = 0);
2015-11-03 14:15:49 +00:00
bool AddIntroducer (const Introducer& introducer);
2014-09-07 00:43:20 +00:00
bool RemoveIntroducer (const boost::asio::ip::udp::endpoint& e);
void SetProperty (const std::string& key, const std::string& value); // called from RouterContext only
void DeleteProperty (const std::string& key); // called from RouterContext only
2015-03-12 20:26:08 +00:00
void ClearProperties () { m_Properties.clear (); };
2013-10-27 15:28:23 +00:00
bool IsFloodfill () const;
2014-01-22 00:14:30 +00:00
bool IsNTCP (bool v4only = true) const;
2014-02-09 02:06:40 +00:00
bool IsSSU (bool v4only = true) const;
bool IsV6 () const;
void EnableV6 ();
void DisableV6 ();
bool IsCompatible (const RouterInfo& other) const { return m_SupportedTransports & other.m_SupportedTransports; };
2014-02-21 21:13:36 +00:00
bool UsesIntroducer () const;
2014-04-09 01:56:34 +00:00
bool IsIntroducer () const { return m_Caps & eSSUIntroducer; };
bool IsPeerTesting () const { return m_Caps & eSSUTesting; };
2014-06-18 14:41:59 +00:00
bool IsHidden () const { return m_Caps & eHidden; };
bool IsHighBandwidth () const { return m_Caps & RouterInfo::eHighBandwidth; };
2016-01-03 03:17:04 +00:00
bool IsExtraBandwidth () const { return m_Caps & RouterInfo::eExtraBandwidth; };
2014-09-01 21:34:20 +00:00
uint8_t GetCaps () const { return m_Caps; };
2014-09-02 20:11:31 +00:00
void SetCaps (uint8_t caps);
2014-09-01 21:34:20 +00:00
void SetCaps (const char * caps);
2014-03-19 19:58:57 +00:00
2013-12-10 13:10:49 +00:00
void SetUnreachable (bool unreachable) { m_IsUnreachable = unreachable; };
bool IsUnreachable () const { return m_IsUnreachable; };
2014-07-10 19:33:42 +00:00
const uint8_t * GetBuffer () const { return m_Buffer; };
const uint8_t * LoadBuffer (); // load if necessary
2014-07-23 14:56:41 +00:00
int GetBufferLen () const { return m_BufferLen; };
2014-08-26 02:47:12 +00:00
void CreateBuffer (const PrivateKeys& privateKeys);
2013-11-20 12:46:09 +00:00
bool IsUpdated () const { return m_IsUpdated; };
void SetUpdated (bool updated) { m_IsUpdated = updated; };
2014-07-10 19:33:42 +00:00
void SaveToFile (const std::string& fullPath);
2013-11-24 23:10:27 +00:00
std::shared_ptr<RouterProfile> GetProfile () const;
void SaveProfile () { if (m_Profile) m_Profile->Save (); };
void Update (const uint8_t * buf, int len);
2015-04-07 20:26:35 +00:00
void DeleteBuffer () { delete[] m_Buffer; m_Buffer = nullptr; };
2013-11-24 23:10:27 +00:00
// implements RoutingDestination
2015-11-03 14:15:49 +00:00
const IdentHash& GetIdentHash () const { return m_RouterIdentity->GetIdentHash (); };
const uint8_t * GetEncryptionPublicKey () const { return m_RouterIdentity->GetStandardIdentity ().publicKey; };
bool IsDestination () const { return false; };
2013-10-27 15:28:23 +00:00
private:
2014-07-23 14:56:41 +00:00
bool LoadFile ();
void ReadFromFile ();
2013-10-27 15:28:23 +00:00
void ReadFromStream (std::istream& s);
void ReadFromBuffer (bool verifySignature);
2013-10-27 15:28:23 +00:00
void WriteToStream (std::ostream& s);
size_t ReadString (char * str, std::istream& s);
void WriteString (const std::string& str, std::ostream& s);
2014-03-19 16:02:51 +00:00
void ExtractCaps (const char * value);
const Address * GetAddress (TransportStyle s, bool v4only, bool v6only = false) const;
2014-09-02 20:11:31 +00:00
void UpdateCapsProperty ();
2013-10-27 15:28:23 +00:00
private:
2014-07-23 14:56:41 +00:00
std::string m_FullPath;
2015-11-03 14:15:49 +00:00
std::shared_ptr<const IdentityEx> m_RouterIdentity;
uint8_t * m_Buffer;
2016-02-02 16:55:38 +00:00
size_t m_BufferLen;
2013-10-27 15:28:23 +00:00
uint64_t m_Timestamp;
std::vector<Address> m_Addresses;
std::map<std::string, std::string> m_Properties;
2013-12-10 13:10:49 +00:00
bool m_IsUpdated, m_IsUnreachable;
2014-03-19 16:02:51 +00:00
uint8_t m_SupportedTransports, m_Caps;
mutable std::shared_ptr<RouterProfile> m_Profile;
2013-10-27 15:28:23 +00:00
};
}
}
#endif