aboutsummaryrefslogtreecommitdiff
path: root/src/p2p/p2p_protocol_defs.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/p2p/p2p_protocol_defs.h')
-rw-r--r--src/p2p/p2p_protocol_defs.h121
1 files changed, 98 insertions, 23 deletions
diff --git a/src/p2p/p2p_protocol_defs.h b/src/p2p/p2p_protocol_defs.h
index 5ec012714..d60990f8a 100644
--- a/src/p2p/p2p_protocol_defs.h
+++ b/src/p2p/p2p_protocol_defs.h
@@ -32,6 +32,7 @@
#include <boost/uuid/uuid.hpp>
#include "serialization/keyvalue_serialization.h"
+#include "net/net_utils_base.h"
#include "misc_language.h"
#include "cryptonote_config.h"
#include "crypto/crypto.h"
@@ -43,46 +44,64 @@ namespace nodetool
#pragma pack (push, 1)
- struct net_address
+ struct network_address_old
{
uint32_t ip;
uint32_t port;
+
+ BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(ip)
+ KV_SERIALIZE(port)
+ END_KV_SERIALIZE_MAP()
};
- struct peerlist_entry
+ template<typename AddressType>
+ struct peerlist_entry_base
{
- net_address adr;
+ AddressType adr;
peerid_type id;
int64_t last_seen;
+
+ BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(adr)
+ KV_SERIALIZE(id)
+ KV_SERIALIZE(last_seen)
+ END_KV_SERIALIZE_MAP()
};
+ typedef peerlist_entry_base<epee::net_utils::network_address> peerlist_entry;
- struct anchor_peerlist_entry
+ template<typename AddressType>
+ struct anchor_peerlist_entry_base
{
- net_address adr;
+ AddressType adr;
peerid_type id;
int64_t first_seen;
+
+ BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(adr)
+ KV_SERIALIZE(id)
+ KV_SERIALIZE(first_seen)
+ END_KV_SERIALIZE_MAP()
};
+ typedef anchor_peerlist_entry_base<epee::net_utils::network_address> anchor_peerlist_entry;
- struct connection_entry
+ template<typename AddressType>
+ struct connection_entry_base
{
- net_address adr;
+ AddressType adr;
peerid_type id;
bool is_income;
+
+ BEGIN_KV_SERIALIZE_MAP()
+ KV_SERIALIZE(adr)
+ KV_SERIALIZE(id)
+ KV_SERIALIZE(is_income)
+ END_KV_SERIALIZE_MAP()
};
+ typedef connection_entry_base<epee::net_utils::network_address> connection_entry;
#pragma pack(pop)
- inline
- bool operator < (const net_address& a, const net_address& b)
- {
- return epee::misc_utils::is_less_as_pod(a, b);
- }
-
- inline
- bool operator == (const net_address& a, const net_address& b)
- {
- return memcmp(&a, &b, sizeof(a)) == 0;
- }
inline
std::string print_peerlist_to_string(const std::list<peerlist_entry>& pl)
{
@@ -92,7 +111,7 @@ namespace nodetool
ss << std::setfill ('0') << std::setw (8) << std::hex << std::noshowbase;
for(const peerlist_entry& pe: pl)
{
- ss << pe.id << "\t" << epee::string_tools::get_ip_string_from_int32(pe.adr.ip) << ":" << boost::lexical_cast<std::string>(pe.adr.port) << " \tlast_seen: " << epee::misc_utils::get_time_interval_string(now_time - pe.last_seen) << std::endl;
+ ss << pe.id << "\t" << pe.adr->str() << " \tlast_seen: " << epee::misc_utils::get_time_interval_string(now_time - pe.last_seen) << std::endl;
}
return ss.str();
}
@@ -157,12 +176,40 @@ namespace nodetool
{
basic_node_data node_data;
t_playload_type payload_data;
- std::list<peerlist_entry> local_peerlist;
+ std::list<peerlist_entry> local_peerlist_new;
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(node_data)
KV_SERIALIZE(payload_data)
- KV_SERIALIZE_CONTAINER_POD_AS_BLOB(local_peerlist)
+ if (is_store)
+ {
+ // saving: save both, so old and new peers can understand it
+ KV_SERIALIZE(local_peerlist_new)
+ std::list<peerlist_entry_base<network_address_old>> local_peerlist;
+ for (const auto &p: this_ref.local_peerlist_new)
+ {
+ if (p.adr.type() == typeid(epee::net_utils::ipv4_network_address))
+ {
+ const epee::net_utils::network_address &na = p.adr;
+ const epee::net_utils::ipv4_network_address &ipv4 = na.as<const epee::net_utils::ipv4_network_address>();
+ local_peerlist.push_back(peerlist_entry_base<network_address_old>({{ipv4.ip(), ipv4.port()}, p.id, p.last_seen}));
+ }
+ else
+ MDEBUG("Not including in legacy peer list: " << p.adr.str());
+ }
+ epee::serialization::selector<is_store>::serialize_stl_container_pod_val_as_blob(local_peerlist, stg, hparent_section, "local_peerlist");
+ }
+ else
+ {
+ // loading: load old list only if there is no new one
+ if (!epee::serialization::selector<is_store>::serialize(this_ref.local_peerlist_new, stg, hparent_section, "local_peerlist_new"))
+ {
+ std::list<peerlist_entry_base<network_address_old>> local_peerlist;
+ epee::serialization::selector<is_store>::serialize_stl_container_pod_val_as_blob(local_peerlist, stg, hparent_section, "local_peerlist");
+ for (const auto &p: local_peerlist)
+ ((response&)this_ref).local_peerlist_new.push_back(peerlist_entry({new epee::net_utils::ipv4_network_address(p.adr.ip, p.adr.port), p.id, p.last_seen}));
+ }
+ }
END_KV_SERIALIZE_MAP()
};
};
@@ -188,12 +235,40 @@ namespace nodetool
{
uint64_t local_time;
t_playload_type payload_data;
- std::list<peerlist_entry> local_peerlist;
+ std::list<peerlist_entry> local_peerlist_new;
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(local_time)
KV_SERIALIZE(payload_data)
- KV_SERIALIZE_CONTAINER_POD_AS_BLOB(local_peerlist)
+ if (is_store)
+ {
+ // saving: save both, so old and new peers can understand it
+ KV_SERIALIZE(local_peerlist_new)
+ std::list<peerlist_entry_base<network_address_old>> local_peerlist;
+ for (const auto &p: this_ref.local_peerlist_new)
+ {
+ if (p.adr.type() == typeid(epee::net_utils::ipv4_network_address))
+ {
+ const epee::net_utils::network_address &na = p.adr;
+ const epee::net_utils::ipv4_network_address &ipv4 = na.as<const epee::net_utils::ipv4_network_address>();
+ local_peerlist.push_back(peerlist_entry_base<network_address_old>({{ipv4.ip(), ipv4.port()}, p.id, p.last_seen}));
+ }
+ else
+ MDEBUG("Not including in legacy peer list: " << p.adr.str());
+ }
+ epee::serialization::selector<is_store>::serialize_stl_container_pod_val_as_blob(local_peerlist, stg, hparent_section, "local_peerlist");
+ }
+ else
+ {
+ // loading: load old list only if there is no new one
+ if (!epee::serialization::selector<is_store>::serialize(this_ref.local_peerlist_new, stg, hparent_section, "local_peerlist_new"))
+ {
+ std::list<peerlist_entry_base<network_address_old>> local_peerlist;
+ epee::serialization::selector<is_store>::serialize_stl_container_pod_val_as_blob(local_peerlist, stg, hparent_section, "local_peerlist");
+ for (const auto &p: local_peerlist)
+ ((response&)this_ref).local_peerlist_new.push_back(peerlist_entry({new epee::net_utils::ipv4_network_address(p.adr.ip, p.adr.port), p.id, p.last_seen}));
+ }
+ }
END_KV_SERIALIZE_MAP()
};
};