1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
use thiserror::Error; #[derive(Debug, Error, PartialEq)] pub enum Error { #[error("raw is too small for a SCTP chunk")] ErrChunkHeaderTooSmall, #[error("not enough data left in SCTP packet to satisfy requested length")] ErrChunkHeaderNotEnoughSpace, #[error("chunk PADDING is non-zero at offset")] ErrChunkHeaderPaddingNonZero, #[error("chunk has invalid length")] ErrChunkHeaderInvalidLength, #[error("ChunkType is not of type ABORT")] ErrChunkTypeNotAbort, #[error("failed build Abort Chunk")] ErrBuildAbortChunkFailed, #[error("ChunkType is not of type COOKIEACK")] ErrChunkTypeNotCookieAck, #[error("ChunkType is not of type COOKIEECHO")] ErrChunkTypeNotCookieEcho, #[error("ChunkType is not of type ctError")] ErrChunkTypeNotCtError, #[error("failed build Error Chunk")] ErrBuildErrorChunkFailed, #[error("failed to marshal stream")] ErrMarshalStreamFailed, #[error("chunk too short")] ErrChunkTooShort, #[error("ChunkType is not of type ForwardTsn")] ErrChunkTypeNotForwardTsn, #[error("ChunkType is not of type HEARTBEAT")] ErrChunkTypeNotHeartbeat, #[error("ChunkType is not of type HEARTBEATACK")] ErrChunkTypeNotHeartbeatAck, #[error("heartbeat is not long enough to contain Heartbeat Info")] ErrHeartbeatNotLongEnoughInfo, #[error("failed to parse param type")] ErrParseParamTypeFailed, #[error("heartbeat should only have HEARTBEAT param")] ErrHeartbeatParam, #[error("failed unmarshalling param in Heartbeat Chunk")] ErrHeartbeatChunkUnmarshal, #[error("unimplemented")] ErrUnimplemented, #[error("heartbeat Ack must have one param")] ErrHeartbeatAckParams, #[error("heartbeat Ack must have one param, and it should be a HeartbeatInfo")] ErrHeartbeatAckNotHeartbeatInfo, #[error("unable to marshal parameter for Heartbeat Ack")] ErrHeartbeatAckMarshalParam, #[error("raw is too small for error cause")] ErrErrorCauseTooSmall, #[error("unhandled ParamType")] ErrParamTypeUnhandled, #[error("unexpected ParamType")] ErrParamTypeUnexpected, #[error("param header too short")] ErrParamHeaderTooShort, #[error("param self reported length is shorter than header length")] ErrParamHeaderSelfReportedLengthShorter, #[error("param self reported length is longer than header length")] ErrParamHeaderSelfReportedLengthLonger, #[error("failed to parse param type")] ErrParamHeaderParseFailed, #[error("packet to short")] ErrParamPacketTooShort, #[error("outgoing SSN reset request parameter too short")] ErrSsnResetRequestParamTooShort, #[error("reconfig response parameter too short")] ErrReconfigRespParamTooShort, #[error("invalid algorithm type")] ErrInvalidAlgorithmType, #[error("failed to parse param type")] ErrInitChunkParseParamTypeFailed, #[error("failed unmarshalling param in Init Chunk")] ErrInitChunkUnmarshalParam, #[error("unable to marshal parameter for INIT/INITACK")] ErrInitAckMarshalParam, #[error("ChunkType is not of type INIT")] ErrChunkTypeNotTypeInit, #[error("chunk Value isn't long enough for mandatory parameters exp")] ErrChunkValueNotLongEnough, #[error("ChunkType of type INIT flags must be all 0")] ErrChunkTypeInitFlagZero, #[error("failed to unmarshal INIT body")] ErrChunkTypeInitUnmarshalFailed, #[error("failed marshaling INIT common data")] ErrChunkTypeInitMarshalFailed, #[error("ChunkType of type INIT ACK InitiateTag must not be 0")] ErrChunkTypeInitInitateTagZero, #[error("INIT ACK inbound stream request must be > 0")] ErrInitInboundStreamRequestZero, #[error("INIT ACK outbound stream request must be > 0")] ErrInitOutboundStreamRequestZero, #[error("INIT ACK Advertised Receiver Window Credit (a_rwnd) must be >= 1500")] ErrInitAdvertisedReceiver1500, #[error("packet is smaller than the header size")] ErrChunkPayloadSmall, #[error("ChunkType is not of type PayloadData")] ErrChunkTypeNotPayloadData, #[error("ChunkType is not of type Reconfig")] ErrChunkTypeNotReconfig, #[error("ChunkReconfig has invalid ParamA")] ErrChunkReconfigInvalidParamA, #[error("failed to parse param type")] ErrChunkParseParamTypeFailed, #[error("unable to marshal parameter A for reconfig")] ErrChunkMarshalParamAReconfigFailed, #[error("unable to marshal parameter B for reconfig")] ErrChunkMarshalParamBReconfigFailed, #[error("ChunkType is not of type SACK")] ErrChunkTypeNotSack, #[error("SACK Chunk size is not large enough to contain header")] ErrSackSizeNotLargeEnoughInfo, #[error("SACK Chunk size does not match predicted amount from header values")] ErrSackSizeNotMatchPredicted, #[error("invalid chunk size")] ErrInvalidChunkSize, #[error("ChunkType is not of type SHUTDOWN")] ErrChunkTypeNotShutdown, #[error("ChunkType is not of type SHUTDOWN-ACK")] ErrChunkTypeNotShutdownAck, #[error("ChunkType is not of type SHUTDOWN-COMPLETE")] ErrChunkTypeNotShutdownComplete, #[error("raw is smaller than the minimum length for a SCTP packet")] ErrPacketRawTooSmall, #[error("unable to parse SCTP chunk, not enough data for complete header")] ErrParseSctpChunkNotEnoughData, #[error("failed to unmarshal, contains unknown chunk type")] ErrUnmarshalUnknownChunkType, #[error("checksum mismatch theirs")] ErrChecksumMismatch, #[error("unexpected chunk popped (unordered)")] ErrUnexpectedChuckPoppedUnordered, #[error("unexpected chunk popped (ordered)")] ErrUnexpectedChuckPoppedOrdered, #[error("unexpected q state (should've been selected)")] ErrUnexpectedQState, #[error("try again")] ErrTryAgain, #[error("abort chunk, with following errors")] ErrChunk, #[error("shutdown called in non-Established state")] ErrShutdownNonEstablished, #[error("association closed before connecting")] ErrAssociationClosedBeforeConn, #[error("association init failed")] ErrAssociationInitFailed, #[error("association handshake closed")] ErrAssociationHandshakeClosed, #[error("silently discard")] ErrSilentlyDiscard, #[error("the init not stored to send")] ErrInitNotStoredToSend, #[error("cookieEcho not stored to send")] ErrCookieEchoNotStoredToSend, #[error("sctp packet must not have a source port of 0")] ErrSctpPacketSourcePortZero, #[error("sctp packet must not have a destination port of 0")] ErrSctpPacketDestinationPortZero, #[error("init chunk must not be bundled with any other chunk")] ErrInitChunkBundled, #[error("init chunk expects a verification tag of 0 on the packet when out-of-the-blue")] ErrInitChunkVerifyTagNotZero, #[error("todo: handle Init when in state")] ErrHandleInitState, #[error("no cookie in InitAck")] ErrInitAckNoCookie, #[error("there already exists a stream with identifier")] ErrStreamAlreadyExist, #[error("Failed to create a stream with identifier")] ErrStreamCreateFailed, #[error("unable to be popped from inflight queue TSN")] ErrInflightQueueTsnPop, #[error("requested non-existent TSN")] ErrTsnRequestNotExist, #[error("sending reset packet in non-Established state")] ErrResetPacketInStateNotExist, #[error("unexpected parameter type")] ErrParamterType, #[error("sending payload data in non-Established state")] ErrPayloadDataStateNotExist, #[error("unhandled chunk type")] ErrChunkTypeUnhandled, #[error("handshake failed (INIT ACK)")] ErrHandshakeInitAck, #[error("handshake failed (COOKIE ECHO)")] ErrHandshakeCookieEcho, #[error("outbound packet larger than maximum message size")] ErrOutboundPacketTooLarge, #[error("Stream closed")] ErrStreamClosed, #[error("Short buffer to be filled")] ErrShortBuffer, #[error("Io EOF")] ErrEof, #[error("Invalid SystemTime")] ErrInvalidSystemTime, #[error("Net Conn read error")] ErrNetConnReadError, #[allow(non_camel_case_types)] #[error("{0}")] new(String), } impl Error { pub fn equal(&self, err: &anyhow::Error) -> bool { err.downcast_ref::<Self>().map_or(false, |e| e == self) } }