Monero
Loading...
Searching...
No Matches
connection_context.h
Go to the documentation of this file.
1// Copyright (c) 2014-2022, The Monero Project
2//
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without modification, are
6// permitted provided that the following conditions are met:
7//
8// 1. Redistributions of source code must retain the above copyright notice, this list of
9// conditions and the following disclaimer.
10//
11// 2. Redistributions in binary form must reproduce the above copyright notice, this list
12// of conditions and the following disclaimer in the documentation and/or other
13// materials provided with the distribution.
14//
15// 3. Neither the name of the copyright holder nor the names of its contributors may be
16// used to endorse or promote products derived from this software without specific
17// prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28//
29// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
30// Parts of this file are originally copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
31
32#pragma once
33#include <unordered_set>
34#include <atomic>
35#include <algorithm>
36#include <boost/date_time/posix_time/posix_time.hpp>
37#include "net/net_utils_base.h"
38#include "crypto/hash.h"
39
40namespace cryptonote
41{
43 {
45 m_last_request_time(boost::date_time::not_a_date_time), m_callback_request_count(0),
48
49 enum state
50 {
51 state_before_handshake = 0, //default state
56 };
57
58 /*
59 This class was originally from the EPEE module. It is identical in function to std::atomic<uint32_t> except
60 that it has copy-construction and copy-assignment defined, which means that earliers devs didn't have to write
61 custom copy-contructors and copy-assingment operators for the outer class, cryptonote_connection_context.
62 cryptonote_connection_context should probably be refactored because it is both trying to be POD-like while
63 also (very loosely) controlling access to its atomic members.
64 */
65 class copyable_atomic: public std::atomic<uint32_t>
66 {
67 public:
69 {};
71 { store(value); }
72 copyable_atomic(const copyable_atomic& a):std::atomic<uint32_t>(a.load())
73 {}
75 {
76 store(a.load());
77 return *this;
78 }
80 {
81 return std::atomic<uint32_t>::operator++();
82 }
84 {
85 return std::atomic<uint32_t>::operator++(fake);
86 }
87 };
88
89 static constexpr int handshake_command() noexcept { return 1001; }
91
93 static size_t get_max_bytes(int command) noexcept;
94
96 std::vector<std::pair<crypto::hash, uint64_t>> m_needed_objects;
97 std::unordered_set<crypto::hash> m_requested_objects;
100 boost::posix_time::ptime m_last_request_time;
101 copyable_atomic m_callback_request_count; //in debug purpose: problem with double callback rise
113 };
114
116 {
117 switch (s)
118 {
120 return "before_handshake";
122 return "synchronizing";
124 return "standby";
126 return "idle";
128 return "normal";
129 default:
130 return "unknown";
131 }
132 }
133
135 {
136 switch (s)
137 {
139 return 'h';
141 return 's';
143 return 'w';
145 return 'i';
147 return 'n';
148 default:
149 return 'u';
150 }
151 }
152
153}
#define s(x, c)
Definition: aesb.c:47
uint32_t operator++(int fake)
Definition: connection_context.h:83
uint32_t operator++()
Definition: connection_context.h:79
copyable_atomic & operator=(const copyable_atomic &a)
Definition: connection_context.h:74
copyable_atomic()
Definition: connection_context.h:68
copyable_atomic(const copyable_atomic &a)
Definition: connection_context.h:72
copyable_atomic(uint32_t value)
Definition: connection_context.h:70
#define const
Definition: ipfrdr.c:80
Definition: portable_binary_archive.hpp:29
crypto namespace.
Definition: crypto.cpp:60
POD_CLASS hash
Definition: hash.h:48
Holds cryptonote related classes and helpers.
Definition: blockchain_db.cpp:45
std::string get_protocol_state_string(cryptonote_connection_context::state s)
Definition: connection_context.h:115
char get_protocol_state_char(cryptonote_connection_context::state s)
Definition: connection_context.h:134
Definition: enums.h:68
const GenericPointer< typename T::ValueType > T2 value
Definition: pointer.h:1225
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition: pointer.h:1124
#define false
Definition: stdbool.h:37
unsigned short uint16_t
Definition: stdint.h:125
unsigned int uint32_t
Definition: stdint.h:126
signed int int32_t
Definition: stdint.h:123
unsigned __int64 uint64_t
Definition: stdint.h:136
Definition: connection_context.h:43
copyable_atomic m_callback_request_count
Definition: connection_context.h:101
copyable_atomic m_idle_peer_notification
Definition: connection_context.h:112
uint64_t m_expect_height
Definition: connection_context.h:109
std::unordered_set< crypto::hash > m_requested_objects
Definition: connection_context.h:97
static size_t get_max_bytes(int command) noexcept
Definition: connection_context.cpp:37
state
Definition: connection_context.h:50
@ state_before_handshake
Definition: connection_context.h:51
@ state_normal
Definition: connection_context.h:55
@ state_standby
Definition: connection_context.h:53
@ state_synchronizing
Definition: connection_context.h:52
@ state_idle
Definition: connection_context.h:54
cryptonote_connection_context()
Definition: connection_context.h:44
int32_t m_score
Definition: connection_context.h:107
std::vector< std::pair< crypto::hash, uint64_t > > m_needed_objects
Definition: connection_context.h:96
uint64_t m_last_response_height
Definition: connection_context.h:99
static constexpr int handshake_command() noexcept
Definition: connection_context.h:89
crypto::hash m_last_known_hash
Definition: connection_context.h:102
uint32_t m_rpc_credits_per_hash
Definition: connection_context.h:105
size_t m_num_requested
Definition: connection_context.h:110
int m_expect_response
Definition: connection_context.h:108
uint16_t m_rpc_port
Definition: connection_context.h:104
uint64_t m_remote_blockchain_height
Definition: connection_context.h:98
uint32_t m_pruning_seed
Definition: connection_context.h:103
boost::posix_time::ptime m_last_request_time
Definition: connection_context.h:100
state m_state
Definition: connection_context.h:95
copyable_atomic m_new_stripe_notification
Definition: connection_context.h:111
bool m_anchor
Definition: connection_context.h:106
bool handshake_complete() const noexcept
Definition: connection_context.h:90
Definition: net_utils_base.h:365
Definition: blake256.h:36