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 <boost/optional/optional_fwd.hpp>
38#include "net/net_utils_base.h"
39#include "crypto/hash.h"
40
41namespace cryptonote
42{
44 {
49
58
59 /*
60 This class was originally from the EPEE module. It is identical in function to std::atomic<uint32_t> except
61 that it has copy-construction and copy-assignment defined, which means that earliers devs didn't have to write
62 custom copy-contructors and copy-assingment operators for the outer class, cryptonote_connection_context.
63 cryptonote_connection_context should probably be refactored because it is both trying to be POD-like while
64 also (very loosely) controlling access to its atomic members.
65 */
66 class copyable_atomic: public std::atomic<uint32_t>
67 {
68 public:
73 copyable_atomic(const copyable_atomic& a):std::atomic<uint32_t>(a.load())
74 {}
76 {
77 store(a.load());
78 return *this;
79 }
81 {
82 return std::atomic<uint32_t>::operator++();
83 }
85 {
86 return std::atomic<uint32_t>::operator++(fake);
87 }
88 };
89
90 static constexpr int handshake_command() noexcept { return 1001; }
92
94 static size_t get_max_bytes(int command) noexcept;
95
97 void set_state_normal();
98
99 boost::optional<crypto::hash> get_expected_hash(uint64_t height) const;
100
102 std::vector<std::pair<crypto::hash, uint64_t>> m_needed_objects;
103 std::vector<crypto::hash> m_expected_heights;
104 std::unordered_set<crypto::hash> m_requested_objects;
108 boost::posix_time::ptime m_last_request_time;
109 copyable_atomic m_callback_request_count; //in debug purpose: problem with double callback rise
121 };
122
124 {
125 switch (s)
126 {
128 return "before_handshake";
130 return "synchronizing";
132 return "standby";
134 return "idle";
136 return "normal";
137 default:
138 return "unknown";
139 }
140 }
141
143 {
144 switch (s)
145 {
147 return 'h';
149 return 's';
151 return 'w';
153 return 'i';
155 return 'n';
156 default:
157 return 'u';
158 }
159 }
160
161}
#define s(x, c)
Definition aesb.c:47
uint32_t operator++(int fake)
Definition connection_context.h:84
uint32_t operator++()
Definition connection_context.h:80
copyable_atomic & operator=(const copyable_atomic &a)
Definition connection_context.h:75
copyable_atomic()
Definition connection_context.h:69
copyable_atomic(const copyable_atomic &a)
Definition connection_context.h:73
copyable_atomic(uint32_t value)
Definition connection_context.h:71
#define false
#define const
Definition ipfrdr.c:80
Definition portable_binary_archive.hpp:29
crypto namespace.
Definition crypto.cpp:60
POD_CLASS hash
Definition hash.h:49
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:123
char get_protocol_state_char(cryptonote_connection_context::state s)
Definition connection_context.h:142
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
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
uint64_t m_expected_heights_start
Definition connection_context.h:107
copyable_atomic m_callback_request_count
Definition connection_context.h:109
copyable_atomic m_idle_peer_notification
Definition connection_context.h:120
boost::optional< crypto::hash > get_expected_hash(uint64_t height) const
Definition connection_context.cpp:85
uint64_t m_expect_height
Definition connection_context.h:117
std::unordered_set< crypto::hash > m_requested_objects
Definition connection_context.h:104
static size_t get_max_bytes(int command) noexcept
Definition connection_context.cpp:38
state
Definition connection_context.h:51
@ state_before_handshake
Definition connection_context.h:52
@ state_normal
Definition connection_context.h:56
@ state_standby
Definition connection_context.h:54
@ state_synchronizing
Definition connection_context.h:53
@ state_idle
Definition connection_context.h:55
cryptonote_connection_context()
Definition connection_context.h:45
int32_t m_score
Definition connection_context.h:115
std::vector< std::pair< crypto::hash, uint64_t > > m_needed_objects
Definition connection_context.h:102
uint64_t m_last_response_height
Definition connection_context.h:106
static constexpr int handshake_command() noexcept
Definition connection_context.h:90
std::vector< crypto::hash > m_expected_heights
Definition connection_context.h:103
crypto::hash m_last_known_hash
Definition connection_context.h:110
uint32_t m_rpc_credits_per_hash
Definition connection_context.h:113
size_t m_num_requested
Definition connection_context.h:118
void set_state_normal()
Use this instead of m_state = state_normal.
Definition connection_context.cpp:74
int m_expect_response
Definition connection_context.h:116
uint16_t m_rpc_port
Definition connection_context.h:112
uint64_t m_remote_blockchain_height
Definition connection_context.h:105
uint32_t m_pruning_seed
Definition connection_context.h:111
boost::posix_time::ptime m_last_request_time
Definition connection_context.h:108
state m_state
Definition connection_context.h:101
copyable_atomic m_new_stripe_notification
Definition connection_context.h:119
bool m_anchor
Definition connection_context.h:114
bool handshake_complete() const noexcept
Definition connection_context.h:91
Definition net_utils_base.h:367