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
use std::{ time::{ Duration, Instant, }, net::{IpAddr}, }; #[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)] pub struct EkkoData{ pub timepoint: Instant, pub elapsed: Duration, pub address: Option<IpAddr>, pub domain: Option<String>, pub hops: u32, } #[derive(Clone, Debug)] pub enum EkkoResponse { DestinationResponse(EkkoData), ExceededResponse(EkkoData), UnreachableResponse((EkkoData, Unreachable)), UnexpectedResponse((EkkoData, (u8, u8))), LackingResponse(EkkoData), }