1#![no_std]
11#![warn(
12 missing_docs,
13 unreachable_patterns,
14 clippy::useless_conversion,
15 clippy::redundant_clone,
16 clippy::precedence
17)]
18
19extern crate alloc;
20
21mod context;
22mod convert;
23mod counters;
24mod data_structures;
25mod device;
26mod error;
27mod event;
28mod frame;
29mod inspect;
30mod ip;
31mod map_deref;
32mod matchers;
33mod num;
34mod packet;
35mod port_alloc;
36mod resource_references;
37mod rng;
38mod settings;
39mod tcp;
40mod test_only;
41mod time;
42mod uninstantiable;
43mod work_queue;
44
45pub use context::{BuildableCoreContext, ContextPair, ContextProvider, CtxPair};
46pub use convert::{BidirectionalConverter, OwnedOrRefsBidirectionalConverter};
47pub use counters::{
48 Counter, CounterCollection, CounterCollectionSpec, CounterContext, CounterRepr,
49 ResourceCounterContext,
50};
51pub use data_structures::token_bucket::TokenBucket;
52pub use device::address::{
53 AssignedAddrIpExt, IpAddressId, IpDeviceAddr, IpDeviceAddressIdContext, Ipv4DeviceAddr,
54 Ipv6DeviceAddr, WeakIpAddressId,
55};
56pub use device::link::{LinkAddress, LinkDevice, LinkDeviceAddress};
57pub use device::{
58 AnyDevice, Device, DeviceIdAnyCompatContext, DeviceIdContext, DeviceIdentifier, EitherDeviceId,
59 StrongDeviceIdentifier, WeakDeviceIdentifier,
60};
61pub use error::{
62 AddressResolutionFailed, ErrorAndSerializer, ExistsError, LocalAddressError, NotFoundError,
63 NotSupportedError, RemoteAddressError, SocketError, ZonedAddressError,
64};
65pub use event::EventContext;
66pub use frame::{
67 CoreTxMetadataContext, FrameDestination, GsoInfo, Ipv4IdMode, LocalFrameDestination,
68 NeverBuffer, ReceivableFrameMeta, RecvFrameContext, RecvIpFrameMeta, SendFrameContext,
69 SendFrameError, SendFrameErrorReason, SendableFrameMeta, TxMetadata, TxMetadataBindingsTypes,
70};
71pub use inspect::{Inspectable, InspectableValue, Inspector, InspectorDeviceExt, InspectorExt};
72pub use ip::{
73 BroadcastIpExt, IcmpErrorCode, IcmpIpExt, Icmpv4ErrorCode, Icmpv6ErrorCode, IpExt,
74 IpTypesIpExt, Mark, MarkDomain, MarkStorage, Marks, Mms, WrapBroadcastMarker,
75};
76pub use map_deref::{MapDeref, MapDerefExt};
77pub use matchers::{
78 AddressMatcher, AddressMatcherEither, AddressMatcherType, BoundAddressMatcherEither,
79 BoundInterfaceMatcher, BoundPortMatcher, InterfaceMatcher, InterfaceProperties,
80 IpSocketMatcher, IpSocketProperties, IpSocketPropertiesMatcher, MarkInDomainMatcher,
81 MarkMatcher, MarkMatchers, Matcher, MatcherBindingsTypes, MaybeSocketTransportProperties,
82 PortMatcher, SocketCookieMatcher, SocketTransportProtocolMatcher, SubnetMatcher,
83 TcpSocketMatcher, TcpSocketProperties, TcpSocketState, TcpStateMatcher, UdpSocketMatcher,
84 UdpSocketProperties, UdpSocketState, UdpStateMatcher,
85};
86pub use num::PositiveIsize;
87pub use packet::{
88 ChecksumOffloadResult, ChecksumOffloadSpec, ChecksumRxOffloading,
89 DynamicNetworkPartialSerializer, DynamicNetworkSerializer, NetworkParsingContext,
90 NetworkPartialSerializer, NetworkSerializationContext, NetworkSerializer,
91 ProtocolSpecificOffloadSpec,
92};
93pub use port_alloc::{EphemeralPort, PortAllocImpl, simple_randomized_port_alloc};
94pub use resource_references::{
95 DeferredResourceRemovalContext, ReferenceNotifiers, ReferenceNotifiersExt,
96 RemoveResourceResult, RemoveResourceResultWithContext,
97};
98
99pub use rng::RngContext;
100pub use settings::{BufferSizeSettings, SettingsContext};
101pub use socket::SocketDiagnosticsSeed;
102pub use tcp::base::{Control, EffectiveMss, FragmentedPayload, Mss, MssSizeLimiters};
103pub use tcp::segment::{
104 HandshakeOptions, MalformedFlags, Options, Payload, PayloadLen, ResetOptions, SackBlock,
105 SackBlocks, Segment, SegmentHeader, SegmentOptions, VerifiedTcpSegment,
106};
107pub use tcp::seqnum::{SeqNum, UnscaledWindowSize, WindowScale, WindowSize};
108pub use tcp::timestamp::{
109 Milliseconds, RxTimestampOption, Timestamp, TimestampOption, TxTimestampOption, Unitless,
110};
111pub use test_only::TestOnlyPartialEq;
112pub use time::local_timer_heap::LocalTimerHeap;
113pub use time::{
114 AtomicInstant, CoreTimerContext, HandleableTimer, Instant, InstantBindingsTypes,
115 InstantContext, IntoCoreTimerCtx, NestedIntoCoreTimerCtx, TimerBindingsTypes, TimerContext,
116 TimerHandler,
117};
118pub use uninstantiable::{Uninstantiable, UninstantiableWrapper};
119pub use work_queue::WorkQueueReport;
120
121pub mod ref_counted_hash_map {
123 pub use crate::data_structures::ref_counted_hash_map::{
124 InsertResult, RefCountedHashMap, RefCountedHashSet, RemoveResult,
125 };
126}
127
128pub mod socket {
130 mod address;
131 mod base;
132 mod cookie;
133 pub(crate) mod sndbuf;
134
135 pub use address::{
136 AddrIsMappedError, AddrVecIter, ConnAddr, ConnInfoAddr, ConnIpAddr, DualStackConnIpAddr,
137 DualStackListenerIpAddr, DualStackLocalIp, DualStackRemoteIp, IpAddrVec, ListenerAddr,
138 ListenerIpAddr, SocketIpAddr, StrictlyZonedAddr,
139 };
140 pub use base::{
141 AddrEntry, AddrVec, Bound, BoundSocketMap, DualStackIpExt, DualStackTuple, EitherIpProto,
142 EitherStack, FoundSockets, IncompatibleError, InsertError, Inserter, Listener,
143 ListenerAddrInfo, MaybeDualStack, NotDualStackCapableError, RemoveResult, ReusePortOption,
144 SetDualStackEnabledError, SharingDomain, Shutdown, ShutdownType, SocketAddrType,
145 SocketDeviceUpdate, SocketDeviceUpdateNotAllowedError, SocketDiagnosticsSeed, SocketInfo,
146 SocketIpAddrExt, SocketIpExt, SocketMapAddrSpec, SocketMapAddrStateSpec,
147 SocketMapAddrStateUpdateSharingSpec, SocketMapConflictPolicy, SocketMapStateSpec,
148 SocketMapUpdateSharingPolicy, SocketStateEntry, SocketZonedAddrExt, UpdateSharingError,
149 };
150 pub use cookie::SocketCookie;
151 pub use sndbuf::{
152 SendBufferFullError, SendBufferSpace, SendBufferTracking, SocketWritableListener,
153 };
154}
155
156pub mod socketmap {
159 pub use crate::data_structures::socketmap::{
160 Entry, IterShadows, OccupiedEntry, SocketMap, Tagged, VacantEntry,
161 };
162}
163
164pub mod sync {
166 pub use netstack3_sync::rc::{
171 DebugReferences, DynDebugReferences, MapNotifier as MapRcNotifier, Notifier as RcNotifier,
172 Primary as PrimaryRc, ResourceToken, ResourceTokenValue, Strong as StrongRc,
173 Weak as WeakRc,
174 };
175 pub use netstack3_sync::{LockGuard, Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard};
176}
177
178#[cfg(any(test, feature = "testutils"))]
180pub mod testutil {
181 mod addr;
182 mod benchmarks;
183 mod fake_bindings;
184 mod fake_core;
185 mod fake_network;
186 mod misc;
187 mod monotonic_id;
188 mod send_token;
189
190 pub use crate::device::address::testutil::FakeWeakAddressId;
191 pub use crate::device::link::testutil::{FakeLinkAddress, FakeLinkDevice, FakeLinkDeviceId};
192 pub use crate::device::testutil::{
193 FakeDeviceClass, FakeDeviceId, FakeReferencyDeviceId, FakeStrongDeviceId, FakeWeakDeviceId,
194 MultipleDevicesId, MultipleDevicesIdState,
195 };
196 pub use crate::event::testutil::FakeEventCtx;
197 pub use crate::frame::testutil::{FakeFrameCtx, FakeTxMetadata, WithFakeFrameContext};
198 pub use crate::matchers::testutil::FakeMatcherDeviceId;
199 pub use crate::rng::testutil::{FakeCryptoRng, new_rng, run_with_many_seeds};
200 pub use crate::settings::testutil::AlwaysDefaultsSettingsContext;
201 pub use crate::socket::sndbuf::testutil::FakeSocketWritableListener;
202 pub use crate::time::testutil::{
203 FakeAtomicInstant, FakeInstant, FakeInstantCtx, FakeTimerCtx, FakeTimerCtxExt, FakeTimerId,
204 InstantAndData, WithFakeTimerContext,
205 };
206 pub use addr::{TEST_ADDRS_V4, TEST_ADDRS_V6, TestAddrs, TestDualStackIpExt, TestIpExt};
207 pub use benchmarks::{Bencher, RealBencher, TestBencher};
208 pub use fake_bindings::FakeBindingsCtx;
209 pub use fake_core::FakeCoreCtx;
210 pub use fake_network::{
211 FakeNetwork, FakeNetworkLinks, FakeNetworkSpec, PendingFrame, PendingFrameData, StepResult,
212 };
213 pub use misc::{assert_empty, set_logger_for_test};
214 pub use monotonic_id::MonotonicIdentifier;
215 pub use send_token::{FakeSendToken, FakeSendTokenTracker};
216}
217
218#[cfg(benchmark)]
220pub mod benchmarks {
221 pub fn add_benches(
223 group: &mut criterion::BenchmarkGroup<'_, criterion::measurement::WallTime>,
224 ) {
225 crate::data_structures::token_bucket::benchmarks::add_benches(group)
226 }
227}