snarkos_node_router_messages/helpers/
disconnect.rs1use snarkvm::prelude::{FromBytes, ToBytes, error};
17
18use std::io;
19
20#[derive(Copy, Clone, Debug, PartialEq, Eq)]
22pub enum DisconnectReason {
23 ExceededForkRange,
25 InvalidChallengeResponse,
27 InvalidForkDepth,
29 INeedToSyncFirst,
31 NoReasonGiven,
33 ProtocolViolation,
35 OutdatedClientVersion,
37 PeerHasDisconnected,
39 PeerRefresh,
41 ShuttingDown,
43 SyncComplete,
45 TooManyFailures,
47 TooManyPeers,
49 YouNeedToSyncFirst,
51 YourPortIsClosed(u16),
53}
54
55impl ToBytes for DisconnectReason {
56 fn write_le<W: io::Write>(&self, mut writer: W) -> io::Result<()> {
57 match self {
58 Self::ExceededForkRange => 0u8.write_le(writer),
59 Self::InvalidChallengeResponse => 1u8.write_le(writer),
60 Self::InvalidForkDepth => 2u8.write_le(writer),
61 Self::INeedToSyncFirst => 3u8.write_le(writer),
62 Self::NoReasonGiven => 4u8.write_le(writer),
63 Self::ProtocolViolation => 5u8.write_le(writer),
64 Self::OutdatedClientVersion => 6u8.write_le(writer),
65 Self::PeerHasDisconnected => 7u8.write_le(writer),
66 Self::PeerRefresh => 8u8.write_le(writer),
67 Self::ShuttingDown => 9u8.write_le(writer),
68 Self::SyncComplete => 10u8.write_le(writer),
69 Self::TooManyFailures => 11u8.write_le(writer),
70 Self::TooManyPeers => 12u8.write_le(writer),
71 Self::YouNeedToSyncFirst => 13u8.write_le(writer),
72 Self::YourPortIsClosed(port) => {
73 14u8.write_le(&mut writer)?;
74 port.write_le(writer)
75 }
76 }
77 }
78}
79
80impl FromBytes for DisconnectReason {
81 fn read_le<R: io::Read>(mut reader: R) -> io::Result<Self> {
82 match u8::read_le(&mut reader)? {
83 0 => Ok(Self::ExceededForkRange),
84 1 => Ok(Self::InvalidChallengeResponse),
85 2 => Ok(Self::InvalidForkDepth),
86 3 => Ok(Self::INeedToSyncFirst),
87 4 => Ok(Self::NoReasonGiven),
88 5 => Ok(Self::ProtocolViolation),
89 6 => Ok(Self::OutdatedClientVersion),
90 7 => Ok(Self::PeerHasDisconnected),
91 8 => Ok(Self::PeerRefresh),
92 9 => Ok(Self::ShuttingDown),
93 10 => Ok(Self::SyncComplete),
94 11 => Ok(Self::TooManyFailures),
95 12 => Ok(Self::TooManyPeers),
96 13 => Ok(Self::YouNeedToSyncFirst),
97 14 => {
98 let port = u16::read_le(reader)?;
99 Ok(Self::YourPortIsClosed(port))
100 }
101 _ => Err(error("Invalid disconnect reason")),
102 }
103 }
104}