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
use std::{ cmp::{Ordering}, net::{IpAddr}, time::{ Duration, Instant, }, }; #[derive(Clone, Debug)] pub enum UnreachableCodeV4 { CommunicationAdministrativelyProhibited, NetworkAdministrativelyProhibited, HostAdministrativelyProhibited, DestinationProtocolUnreachable, DestinationNetworkUnreachable, DestinationHostUnreachable, DestinationPortUnreachable, DestinationNetworkUnknown, HostPrecedenceViolation, DestinationHostUnknown, FragmentationRequired, SourceHostIsolated, NetworkUnreachable, SourceRouteFailed, PrecedenceCutoff, HostUnreachable, Unexpected(u8), } #[derive(Clone, Debug)] pub enum UnreachableCodeV6 { CommunicationWithDestinationAdministrativelyProhibited, SourceAddressFailedIngressEgressPolicy, ErrorInSourceRoutingHeader, BeyondScopeOfSourceAddress, RejectRouteToDestination, NoRouteToDestination, AddressUnreachable, PortUnreachable, Unexpected(u8), } #[derive(Clone, Debug)] pub enum Unreachable { V4(UnreachableCodeV4), V6(UnreachableCodeV6), } #[derive(Clone, Debug, Eq)] pub struct EkkoData{ pub timepoint: Instant, pub elapsed: Duration, pub address: Option<IpAddr>, pub hops: u8, } impl Ord for EkkoData { fn cmp(&self, other: &Self) -> Ordering { self.hops.cmp(&(other.hops)) } } impl PartialOrd for EkkoData { fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(self.cmp(other)) } } impl PartialEq for EkkoData { fn eq(&self, other: &Self) -> bool { self.address.eq(&(other.address)) && self.hops.eq(&(other.hops)) } } #[derive(Clone, Debug)] pub enum EkkoResponse { DestinationResponse(EkkoData), UnreachableResponse((EkkoData, Unreachable)), UnexpectedResponse((EkkoData, (u8, u8))), ExceededResponse(EkkoData), LackingResponse(EkkoData), }