xref: /webrtc/turn/src/error.rs (revision ffe74184)
1*ffe74184SMartin Algesten use thiserror::Error;
2*ffe74184SMartin Algesten 
3*ffe74184SMartin Algesten use std::io;
4*ffe74184SMartin Algesten use std::net;
5*ffe74184SMartin Algesten use std::num::ParseIntError;
6*ffe74184SMartin Algesten use std::time::SystemTimeError;
7*ffe74184SMartin Algesten 
8*ffe74184SMartin Algesten pub type Result<T> = std::result::Result<T, Error>;
9*ffe74184SMartin Algesten 
10*ffe74184SMartin Algesten #[derive(Debug, Error, PartialEq)]
11*ffe74184SMartin Algesten #[non_exhaustive]
12*ffe74184SMartin Algesten pub enum Error {
13*ffe74184SMartin Algesten     #[error("turn: RelayAddress must be valid IP to use RelayAddressGeneratorStatic")]
14*ffe74184SMartin Algesten     ErrRelayAddressInvalid,
15*ffe74184SMartin Algesten     #[error("turn: PacketConnConfigs and ConnConfigs are empty, unable to proceed")]
16*ffe74184SMartin Algesten     ErrNoAvailableConns,
17*ffe74184SMartin Algesten     #[error("turn: PacketConnConfig must have a non-nil Conn")]
18*ffe74184SMartin Algesten     ErrConnUnset,
19*ffe74184SMartin Algesten     #[error("turn: ListenerConfig must have a non-nil Listener")]
20*ffe74184SMartin Algesten     ErrListenerUnset,
21*ffe74184SMartin Algesten     #[error("turn: RelayAddressGenerator has invalid ListeningAddress")]
22*ffe74184SMartin Algesten     ErrListeningAddressInvalid,
23*ffe74184SMartin Algesten     #[error("turn: RelayAddressGenerator in RelayConfig is unset")]
24*ffe74184SMartin Algesten     ErrRelayAddressGeneratorUnset,
25*ffe74184SMartin Algesten     #[error("turn: max retries exceeded")]
26*ffe74184SMartin Algesten     ErrMaxRetriesExceeded,
27*ffe74184SMartin Algesten     #[error("turn: MaxPort must be not 0")]
28*ffe74184SMartin Algesten     ErrMaxPortNotZero,
29*ffe74184SMartin Algesten     #[error("turn: MaxPort must be not 0")]
30*ffe74184SMartin Algesten     ErrMinPortNotZero,
31*ffe74184SMartin Algesten     #[error("turn: MaxPort less than MinPort")]
32*ffe74184SMartin Algesten     ErrMaxPortLessThanMinPort,
33*ffe74184SMartin Algesten     #[error("turn: relay_conn cannot not be nil")]
34*ffe74184SMartin Algesten     ErrNilConn,
35*ffe74184SMartin Algesten     #[error("turn: TODO")]
36*ffe74184SMartin Algesten     ErrTodo,
37*ffe74184SMartin Algesten     #[error("turn: already listening")]
38*ffe74184SMartin Algesten     ErrAlreadyListening,
39*ffe74184SMartin Algesten     #[error("turn: Server failed to close")]
40*ffe74184SMartin Algesten     ErrFailedToClose,
41*ffe74184SMartin Algesten     #[error("turn: failed to retransmit transaction")]
42*ffe74184SMartin Algesten     ErrFailedToRetransmitTransaction,
43*ffe74184SMartin Algesten     #[error("all retransmissions failed")]
44*ffe74184SMartin Algesten     ErrAllRetransmissionsFailed,
45*ffe74184SMartin Algesten     #[error("no binding found for channel")]
46*ffe74184SMartin Algesten     ErrChannelBindNotFound,
47*ffe74184SMartin Algesten     #[error("STUN server address is not set for the client")]
48*ffe74184SMartin Algesten     ErrStunserverAddressNotSet,
49*ffe74184SMartin Algesten     #[error("only one Allocate() caller is allowed")]
50*ffe74184SMartin Algesten     ErrOneAllocateOnly,
51*ffe74184SMartin Algesten     #[error("already allocated")]
52*ffe74184SMartin Algesten     ErrAlreadyAllocated,
53*ffe74184SMartin Algesten     #[error("non-STUN message from STUN server")]
54*ffe74184SMartin Algesten     ErrNonStunmessage,
55*ffe74184SMartin Algesten     #[error("failed to decode STUN message")]
56*ffe74184SMartin Algesten     ErrFailedToDecodeStun,
57*ffe74184SMartin Algesten     #[error("unexpected STUN request message")]
58*ffe74184SMartin Algesten     ErrUnexpectedStunrequestMessage,
59*ffe74184SMartin Algesten     #[error("channel number not in [0x4000, 0x7FFF]")]
60*ffe74184SMartin Algesten     ErrInvalidChannelNumber,
61*ffe74184SMartin Algesten     #[error("channelData length != len(Data)")]
62*ffe74184SMartin Algesten     ErrBadChannelDataLength,
63*ffe74184SMartin Algesten     #[error("unexpected EOF")]
64*ffe74184SMartin Algesten     ErrUnexpectedEof,
65*ffe74184SMartin Algesten     #[error("invalid value for requested family attribute")]
66*ffe74184SMartin Algesten     ErrInvalidRequestedFamilyValue,
67*ffe74184SMartin Algesten     #[error("fake error")]
68*ffe74184SMartin Algesten     ErrFakeErr,
69*ffe74184SMartin Algesten     #[error("try again")]
70*ffe74184SMartin Algesten     ErrTryAgain,
71*ffe74184SMartin Algesten     #[error("use of closed network connection")]
72*ffe74184SMartin Algesten     ErrClosed,
73*ffe74184SMartin Algesten     #[error("addr is not a net.UDPAddr")]
74*ffe74184SMartin Algesten     ErrUdpaddrCast,
75*ffe74184SMartin Algesten     #[error("already closed")]
76*ffe74184SMartin Algesten     ErrAlreadyClosed,
77*ffe74184SMartin Algesten     #[error("try-lock is already locked")]
78*ffe74184SMartin Algesten     ErrDoubleLock,
79*ffe74184SMartin Algesten     #[error("transaction closed")]
80*ffe74184SMartin Algesten     ErrTransactionClosed,
81*ffe74184SMartin Algesten     #[error("wait_for_result called on non-result transaction")]
82*ffe74184SMartin Algesten     ErrWaitForResultOnNonResultTransaction,
83*ffe74184SMartin Algesten     #[error("failed to build refresh request")]
84*ffe74184SMartin Algesten     ErrFailedToBuildRefreshRequest,
85*ffe74184SMartin Algesten     #[error("failed to refresh allocation")]
86*ffe74184SMartin Algesten     ErrFailedToRefreshAllocation,
87*ffe74184SMartin Algesten     #[error("failed to get lifetime from refresh response")]
88*ffe74184SMartin Algesten     ErrFailedToGetLifetime,
89*ffe74184SMartin Algesten     #[error("too short buffer")]
90*ffe74184SMartin Algesten     ErrShortBuffer,
91*ffe74184SMartin Algesten     #[error("unexpected response type")]
92*ffe74184SMartin Algesten     ErrUnexpectedResponse,
93*ffe74184SMartin Algesten     #[error("AllocatePacketConn must be set")]
94*ffe74184SMartin Algesten     ErrAllocatePacketConnMustBeSet,
95*ffe74184SMartin Algesten     #[error("AllocateConn must be set")]
96*ffe74184SMartin Algesten     ErrAllocateConnMustBeSet,
97*ffe74184SMartin Algesten     #[error("LeveledLogger must be set")]
98*ffe74184SMartin Algesten     ErrLeveledLoggerMustBeSet,
99*ffe74184SMartin Algesten     #[error("you cannot use the same channel number with different peer")]
100*ffe74184SMartin Algesten     ErrSameChannelDifferentPeer,
101*ffe74184SMartin Algesten     #[error("allocations must not be created with nil FivTuple")]
102*ffe74184SMartin Algesten     ErrNilFiveTuple,
103*ffe74184SMartin Algesten     #[error("allocations must not be created with nil FiveTuple.src_addr")]
104*ffe74184SMartin Algesten     ErrNilFiveTupleSrcAddr,
105*ffe74184SMartin Algesten     #[error("allocations must not be created with nil FiveTuple.dst_addr")]
106*ffe74184SMartin Algesten     ErrNilFiveTupleDstAddr,
107*ffe74184SMartin Algesten     #[error("allocations must not be created with nil turnSocket")]
108*ffe74184SMartin Algesten     ErrNilTurnSocket,
109*ffe74184SMartin Algesten     #[error("allocations must not be created with a lifetime of 0")]
110*ffe74184SMartin Algesten     ErrLifetimeZero,
111*ffe74184SMartin Algesten     #[error("allocation attempt created with duplicate FiveTuple")]
112*ffe74184SMartin Algesten     ErrDupeFiveTuple,
113*ffe74184SMartin Algesten     #[error("failed to cast net.Addr to *net.UDPAddr")]
114*ffe74184SMartin Algesten     ErrFailedToCastUdpaddr,
115*ffe74184SMartin Algesten     #[error("failed to generate nonce")]
116*ffe74184SMartin Algesten     ErrFailedToGenerateNonce,
117*ffe74184SMartin Algesten     #[error("failed to send error message")]
118*ffe74184SMartin Algesten     ErrFailedToSendError,
119*ffe74184SMartin Algesten     #[error("duplicated Nonce generated, discarding request")]
120*ffe74184SMartin Algesten     ErrDuplicatedNonce,
121*ffe74184SMartin Algesten     #[error("no such user exists")]
122*ffe74184SMartin Algesten     ErrNoSuchUser,
123*ffe74184SMartin Algesten     #[error("unexpected class")]
124*ffe74184SMartin Algesten     ErrUnexpectedClass,
125*ffe74184SMartin Algesten     #[error("unexpected method")]
126*ffe74184SMartin Algesten     ErrUnexpectedMethod,
127*ffe74184SMartin Algesten     #[error("failed to handle")]
128*ffe74184SMartin Algesten     ErrFailedToHandle,
129*ffe74184SMartin Algesten     #[error("unhandled STUN packet")]
130*ffe74184SMartin Algesten     ErrUnhandledStunpacket,
131*ffe74184SMartin Algesten     #[error("unable to handle ChannelData")]
132*ffe74184SMartin Algesten     ErrUnableToHandleChannelData,
133*ffe74184SMartin Algesten     #[error("failed to create stun message from packet")]
134*ffe74184SMartin Algesten     ErrFailedToCreateStunpacket,
135*ffe74184SMartin Algesten     #[error("failed to create channel data from packet")]
136*ffe74184SMartin Algesten     ErrFailedToCreateChannelData,
137*ffe74184SMartin Algesten     #[error("relay already allocated for 5-TUPLE")]
138*ffe74184SMartin Algesten     ErrRelayAlreadyAllocatedForFiveTuple,
139*ffe74184SMartin Algesten     #[error("RequestedTransport must be UDP")]
140*ffe74184SMartin Algesten     ErrRequestedTransportMustBeUdp,
141*ffe74184SMartin Algesten     #[error("no support for DONT-FRAGMENT")]
142*ffe74184SMartin Algesten     ErrNoDontFragmentSupport,
143*ffe74184SMartin Algesten     #[error("Request must not contain RESERVATION-TOKEN and EVEN-PORT")]
144*ffe74184SMartin Algesten     ErrRequestWithReservationTokenAndEvenPort,
145*ffe74184SMartin Algesten     #[error("no allocation found")]
146*ffe74184SMartin Algesten     ErrNoAllocationFound,
147*ffe74184SMartin Algesten     #[error("unable to handle send-indication, no permission added")]
148*ffe74184SMartin Algesten     ErrNoPermission,
149*ffe74184SMartin Algesten     #[error("packet write smaller than packet")]
150*ffe74184SMartin Algesten     ErrShortWrite,
151*ffe74184SMartin Algesten     #[error("no such channel bind")]
152*ffe74184SMartin Algesten     ErrNoSuchChannelBind,
153*ffe74184SMartin Algesten     #[error("failed writing to socket")]
154*ffe74184SMartin Algesten     ErrFailedWriteSocket,
155*ffe74184SMartin Algesten     #[error("parse int: {0}")]
156*ffe74184SMartin Algesten     ParseInt(#[from] ParseIntError),
157*ffe74184SMartin Algesten     #[error("parse addr: {0}")]
158*ffe74184SMartin Algesten     ParseIp(#[from] net::AddrParseError),
159*ffe74184SMartin Algesten     #[error("{0}")]
160*ffe74184SMartin Algesten     Io(#[source] IoError),
161*ffe74184SMartin Algesten     #[error("{0}")]
162*ffe74184SMartin Algesten     Util(#[from] util::Error),
163*ffe74184SMartin Algesten     #[error("{0}")]
164*ffe74184SMartin Algesten     Stun(#[from] stun::Error),
165*ffe74184SMartin Algesten     #[error("{0}")]
166*ffe74184SMartin Algesten     Other(String),
167*ffe74184SMartin Algesten }
168*ffe74184SMartin Algesten 
169*ffe74184SMartin Algesten #[derive(Debug, Error)]
170*ffe74184SMartin Algesten #[error("io error: {0}")]
171*ffe74184SMartin Algesten pub struct IoError(#[from] pub io::Error);
172*ffe74184SMartin Algesten 
173*ffe74184SMartin Algesten // Workaround for wanting PartialEq for io::Error.
174*ffe74184SMartin Algesten impl PartialEq for IoError {
eq(&self, other: &Self) -> bool175*ffe74184SMartin Algesten     fn eq(&self, other: &Self) -> bool {
176*ffe74184SMartin Algesten         self.0.kind() == other.0.kind()
177*ffe74184SMartin Algesten     }
178*ffe74184SMartin Algesten }
179*ffe74184SMartin Algesten 
180*ffe74184SMartin Algesten impl From<io::Error> for Error {
from(e: io::Error) -> Self181*ffe74184SMartin Algesten     fn from(e: io::Error) -> Self {
182*ffe74184SMartin Algesten         Error::Io(IoError(e))
183*ffe74184SMartin Algesten     }
184*ffe74184SMartin Algesten }
185*ffe74184SMartin Algesten 
186*ffe74184SMartin Algesten impl From<SystemTimeError> for Error {
from(e: SystemTimeError) -> Self187*ffe74184SMartin Algesten     fn from(e: SystemTimeError) -> Self {
188*ffe74184SMartin Algesten         Error::Other(e.to_string())
189*ffe74184SMartin Algesten     }
190*ffe74184SMartin Algesten }
191