#![no_std]
#![allow(stable_features)]
#![deny(missing_docs, unreachable_patterns, clippy::useless_conversion, clippy::redundant_clone)]
#![cfg_attr(benchmark, allow(dead_code, unused_imports, unused_macros))]
extern crate fakealloc as alloc;
extern crate fakestd as std;
#[macro_use]
mod macros;
mod algorithm;
mod api;
mod context;
mod convert;
mod counters;
mod data_structures;
mod lock_ordering;
mod marker;
mod state;
mod time;
mod trace;
mod transport;
mod uninstantiable;
mod work_queue;
#[cfg(test)]
pub mod benchmarks;
#[cfg(any(test, feature = "testutils"))]
pub mod testutil;
pub mod device {
pub(crate) mod api;
pub(crate) mod arp;
pub(crate) mod base;
pub(crate) mod config;
pub(crate) mod ethernet;
pub(crate) mod id;
pub(crate) mod integration;
pub(crate) mod link;
pub(crate) mod loopback;
pub(crate) mod ndp;
pub(crate) mod pure_ip;
pub(crate) mod queue;
pub(crate) mod socket;
mod state;
pub(crate) use base::*;
pub(crate) use id::*;
pub use base::{
DeviceClassMatcher, DeviceIdAndNameMatcher, DeviceLayerEventDispatcher,
DeviceLayerStateTypes, DeviceSendFrameError,
};
pub use config::{
ArpConfiguration, ArpConfigurationUpdate, DeviceConfiguration, DeviceConfigurationUpdate,
DeviceConfigurationUpdateError, NdpConfiguration, NdpConfigurationUpdate,
};
pub use ethernet::{
EthernetCreationProperties, EthernetLinkDevice, MaxEthernetFrameSize, RecvEthernetFrameMeta,
};
pub use id::{DeviceId, DeviceProvider, EthernetDeviceId, EthernetWeakDeviceId, WeakDeviceId};
pub use loopback::{LoopbackCreationProperties, LoopbackDevice, LoopbackDeviceId};
pub use pure_ip::{
PureIpDevice, PureIpDeviceCreationProperties, PureIpDeviceId,
PureIpDeviceReceiveFrameMetadata, PureIpWeakDeviceId,
};
pub use queue::tx::TransmitQueueConfiguration;
}
pub mod device_socket {
pub use crate::device::{
base::FrameDestination,
socket::{
DeviceSocketBindingsContext, DeviceSocketTypes, EthernetFrame, Frame, Protocol,
ReceivedFrame, SendDatagramError, SendDatagramParams, SendFrameError, SendFrameParams,
SentFrame, SocketId, SocketInfo, TargetDevice,
},
};
}
pub mod error;
pub mod filter {
pub(crate) mod integration;
pub(crate) use integration::FilterHandlerProvider;
#[cfg(test)]
pub(crate) use netstack3_filter::testutil::NoopImpl;
pub use netstack3_filter::{
Action, AddressMatcher, AddressMatcherType, FilterApi, FilterBindingsContext,
FilterBindingsTypes, Hook, InterfaceMatcher, InterfaceProperties, IpRoutines, NatRoutines,
PacketMatcher, PortMatcher, ProofOfEgressCheck, Routine, Routines, Rule,
TransportProtocolMatcher, UninstalledRoutine, ValidationError,
};
pub(crate) use netstack3_filter::{
ConntrackConnection, FilterContext, FilterHandler, FilterImpl, FilterIpContext,
FilterIpMetadata, ForwardedPacket, IpPacket, MaybeTransportPacket, NestedWithInnerIpPacket,
RxPacket, State, TransportPacketSerializer, TxPacket, Verdict,
};
}
pub mod inspect {
pub use netstack3_base::{Inspectable, InspectableValue, Inspector, InspectorDeviceExt};
}
pub mod icmp {
pub use crate::ip::icmp::socket::{
IcmpEchoBindingsContext, IcmpEchoBindingsTypes, IcmpSocketId,
};
}
pub mod ip {
#[macro_use]
pub(crate) mod path_mtu;
pub(crate) mod api;
pub(crate) mod base;
pub(crate) mod device;
pub(crate) mod forwarding;
pub(crate) mod gmp;
pub(crate) mod icmp;
pub(crate) mod reassembly;
pub(crate) mod socket;
pub(crate) mod types;
mod integration;
mod ipv6;
pub(crate) use base::*;
pub use crate::algorithm::STABLE_IID_SECRET_KEY_BYTES;
pub use base::{IpLayerEvent, ResolveRouteError};
pub use device::{
api::{AddIpAddrSubnetError, AddrSubnetAndManualConfigEither, SetIpAddressPropertiesError},
config::{
IpDeviceConfigurationUpdate, Ipv4DeviceConfigurationUpdate,
Ipv6DeviceConfigurationUpdate, UpdateIpConfigurationError,
},
slaac::{SlaacConfiguration, TemporarySlaacAddressConfiguration},
state::{
IpDeviceConfiguration, Ipv4AddrConfig, Ipv4DeviceConfigurationAndFlags,
Ipv6AddrManualConfig, Ipv6DeviceConfiguration, Ipv6DeviceConfigurationAndFlags,
Lifetime,
},
AddressRemovedReason, IpAddressState, IpDeviceEvent,
};
pub use socket::{IpSockCreateAndSendError, IpSockCreationError, IpSockSendError};
}
pub mod neighbor {
pub use crate::ip::device::nud::{
api::{NeighborRemovalError, StaticNeighborInsertionError},
Event, EventDynamicState, EventKind, EventState, LinkResolutionContext,
LinkResolutionNotifier, LinkResolutionResult, NudUserConfig, NudUserConfigUpdate,
MAX_ENTRIES,
};
}
pub mod routes {
pub use crate::ip::forwarding::AddRouteError;
pub use crate::ip::types::{
AddableEntry, AddableEntryEither, AddableMetric, Entry, EntryEither, Generation, Metric,
NextHop, RawMetric, ResolvedRoute, RoutableIpAddr, WrapBroadcastMarker,
};
}
pub mod socket {
pub(crate) mod address;
mod base;
pub(crate) mod datagram;
pub(crate) use base::*;
pub use address::{AddrIsMappedError, StrictlyZonedAddr};
pub use base::{NotDualStackCapableError, SetDualStackEnabledError, ShutdownType};
pub use datagram::{
ConnInfo, ConnectError, ExpectedConnError, ExpectedUnboundError, ListenerInfo,
MulticastInterfaceSelector, MulticastMembershipInterfaceSelector, SendError, SendToError,
SetMulticastMembershipError, SocketInfo,
};
}
pub mod sync {
pub(crate) mod types;
pub use netstack3_sync::{
rc::{
DebugReferences, MapNotifier as MapRcNotifier, Notifier as RcNotifier,
Primary as PrimaryRc, Strong as StrongRc, Weak as WeakRc,
},
LockGuard, Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard,
};
pub use types::{RemoveResourceResult, RemoveResourceResultWithContext};
}
pub mod tcp {
pub use crate::transport::tcp::{
buffer::{
Buffer, BufferLimits, IntoBuffers, ReceiveBuffer, RingBuffer, SendBuffer, SendPayload,
},
segment::Payload,
socket::{
AcceptError, BindError, BoundInfo, ConnectError, ConnectionInfo, ListenError,
ListenerNotifier, NoConnection, SetDeviceError, SetReuseAddrError, SocketAddr,
SocketInfo, TcpBindingsTypes, TcpSocketId, UnboundInfo,
},
state::Takeable,
BufferSizes, ConnectionError, SocketOptions, DEFAULT_FIN_WAIT2_TIMEOUT,
};
}
pub mod types {
pub use crate::work_queue::WorkQueueReport;
}
pub mod udp {
pub use crate::transport::udp::{
SendError, SendToError, UdpBindingsTypes, UdpReceiveBindingsContext, UdpRemotePort,
UdpSocketId,
};
}
pub use api::CoreApi;
pub use context::{
CoreCtx, EventContext, InstantBindingsTypes, InstantContext, ReferenceNotifiers, RngContext,
TimerBindingsTypes, TimerContext, TimerContext2, TracingContext, UnlockedCoreCtx,
};
pub use inspect::Inspector;
pub use marker::{BindingsContext, BindingsTypes, CoreContext, IpBindingsContext, IpExt};
pub use state::StackState;
pub use time::{Instant, TimerId};
pub use netstack3_macros::context_ip_bounds;
pub(crate) use trace::trace_duration;