srt_protocol/protocol/pending_connection/
mod.rs1pub mod connect;
2mod hsv5;
3pub mod listen;
4pub mod rendezvous;
5
6pub(crate) mod cookie;
7
8use std::{error::Error, fmt, io, net::SocketAddr};
9
10use crate::options::KeySize;
11use crate::{connection::Connection, options::StreamId, packet::*, settings::KeySettings};
12
13#[non_exhaustive]
14#[derive(Debug)]
15#[allow(clippy::large_enum_variant)]
16pub enum ConnectError {
17 ControlExpected(DataPacket),
18 HandshakeExpected(ControlTypes),
19 InductionExpected(HandshakeControlInfo),
20 WavehandExpected(HandshakeControlInfo),
21 AgreementExpected(HandshakeControlInfo),
22 UnexpectedHost(SocketAddr, SocketAddr),
23 ConclusionExpected(HandshakeControlInfo),
24 UnsupportedProtocolVersion(u32),
25 InvalidHandshakeCookie(i32, i32),
26 RendezvousExpected(HandshakeControlInfo),
27 CookiesMatched(i32),
28 ExpectedHsReq,
29 ExpectedHsResp,
30 ExpectedExtFlags,
31 ExpectedNoExtFlags,
32 ExpectedAccessControlResponse,
33 ParseFailed(PacketParseError),
34}
35
36#[derive(Debug, Eq, PartialEq)]
37pub struct AccessControlRequest {
38 pub local_socket_id: SocketId,
39 pub remote: SocketAddr,
40 pub remote_socket_id: SocketId,
41 pub stream_id: Option<StreamId>,
42 pub key_size: KeySize,
43}
44
45#[derive(Debug, Eq, PartialEq)]
46pub enum AccessControlResponse {
47 Accepted(Option<KeySettings>),
48 Rejected(RejectReason),
49 Dropped,
50}
51
52#[derive(Debug, Eq, PartialEq)]
53pub enum ConnectionReject {
54 Rejecting(RejectReason),
56
57 Rejected(RejectReason),
59}
60
61#[derive(Debug)]
62#[allow(clippy::large_enum_variant)]
63pub enum ConnectionResult {
64 NotHandled(ConnectError),
65 Reject(Option<(Packet, SocketAddr)>, ConnectionReject),
66 SendPacket((Packet, SocketAddr)),
67 Connected(Option<(Packet, SocketAddr)>, Connection),
68 NoAction,
69 RequestAccess(AccessControlRequest),
70 Failure(io::Error),
71}
72
73impl fmt::Display for ConnectError {
74 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
75 use ConnectError::*;
76 match self {
77 ControlExpected(pack) => write!(f, "Expected Control packet, found {pack:?}"),
78 HandshakeExpected(got) => write!(f, "Expected Handshake packet, found: {got:?}"),
79 InductionExpected(got) => write!(f, "Expected Induction (1) packet, found: {got:?}"),
80 WavehandExpected(got) => write!(f, "Expected Waveahand (0) packet, found: {got:?}"),
81 AgreementExpected(got) => write!(f, "Expected Agreement (-2) packet, found: {got:?}"),
82 UnexpectedHost(host, got) => write!(
83 f,
84 "Expected packets from different host, expected: {host} found: {got}"
85 ),
86 ConclusionExpected(got) => {
87 write!(f, "Expected Conclusion (-1) packet, found: {got:?}")
88 }
89 UnsupportedProtocolVersion(got) => {
90 write!(f, "Unsupported protocol version, expected: v5 found v{got}")
91 }
92 InvalidHandshakeCookie(expected, got) => {
93 write!(f, "Received invalid cookie, expected {expected}, got {got}")
94 }
95 RendezvousExpected(got) => write!(f, "Expected rendezvous packet, got {got:?}"),
96 CookiesMatched(cookie) => write!(
97 f,
98 "Cookies matched, waiting for a new cookie to resolve contest. Cookie: {cookie}"
99 ),
100 ExpectedHsReq => write!(
101 f,
102 "Responder got handshake flags, but expected request, not response"
103 ),
104 ExpectedHsResp => write!(
105 f,
106 "Initiator got handshake flags, but expected response, not request"
107 ),
108 ExpectedExtFlags => write!(f, "Responder expected handshake flags, but got none"),
109 ExpectedNoExtFlags => {
110 write!(f, "Initiator did not expect handshake flags, but got some")
111 }
112 ParseFailed(e) => write!(f, "Failed to parse packet: {e}"),
113 ExpectedAccessControlResponse => write!(
114 f,
115 "Expected an access control response but instead received a packet from the peer"
116 ),
117 }
118 }
119}
120
121impl Error for ConnectError {}
122
123impl fmt::Display for ConnectionReject {
124 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
125 use ConnectionReject::*;
126 match self {
127 Rejecting(rr) => write!(f, "Local server rejected remote: {rr}"),
128 Rejected(rr) => write!(f, "Remote rejected connection: {rr}"),
129 }
130 }
131}
132
133impl ConnectionReject {
134 fn reason(&self) -> RejectReason {
135 match self {
136 ConnectionReject::Rejecting(r) | ConnectionReject::Rejected(r) => *r,
137 }
138 }
139}
140
141impl Error for ConnectionReject {}