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