netstack3_core/
lib.rs

1// Copyright 2018 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5//! A networking stack.
6
7#![no_std]
8// TODO(https://fxbug.dev/339502691): Return to the default limit once lock
9// ordering no longer causes overflows.
10#![recursion_limit = "256"]
11// In case we roll the toolchain and something we're using as a feature has been
12// stabilized.
13#![allow(stable_features)]
14#![warn(
15    missing_docs,
16    unreachable_patterns,
17    clippy::useless_conversion,
18    clippy::redundant_clone,
19    clippy::precedence
20)]
21extern crate alloc;
22
23mod api;
24mod context;
25mod counters;
26mod lock_ordering;
27mod marker;
28mod state;
29mod time;
30mod transport;
31
32#[cfg(any(test, feature = "testutils"))]
33pub mod testutil;
34
35/// Data structures.
36pub mod data_structures {
37    /// Read-copy-update data structures.
38    pub mod rcu {
39        pub use netstack3_base::rcu::{ReadGuard, SynchronizedWriterRcu, WriteGuard};
40    }
41}
42/// The device layer.
43pub mod device {
44    #[path = "."]
45    pub(crate) mod integration {
46        mod base;
47        mod blackhole;
48        mod ethernet;
49        mod loopback;
50        mod pure_ip;
51        mod socket;
52
53        pub(crate) use base::{
54            device_state, device_state_and_core_ctx, get_mtu, ip_device_state,
55            ip_device_state_and_core_ctx,
56        };
57    }
58
59    // Re-exported types.
60    pub use netstack3_base::{
61        BoundInterfaceMatcher, InterfaceMatcher, InterfaceProperties, StrongDeviceIdentifier,
62    };
63    pub use netstack3_device::blackhole::{BlackholeDevice, BlackholeDeviceId};
64    pub use netstack3_device::ethernet::{
65        EthernetCreationProperties, EthernetDeviceEvent, EthernetDeviceId, EthernetLinkDevice,
66        EthernetWeakDeviceId, MaxEthernetFrameSize, RecvEthernetFrameMeta,
67    };
68    pub use netstack3_device::loopback::{
69        LoopbackCreationProperties, LoopbackDevice, LoopbackDeviceId, LoopbackWeakDeviceId,
70    };
71    pub use netstack3_device::pure_ip::{
72        PureIpDevice, PureIpDeviceCreationProperties, PureIpDeviceId,
73        PureIpDeviceReceiveFrameMetadata, PureIpHeaderParams, PureIpWeakDeviceId,
74    };
75    pub use netstack3_device::queue::{
76        BatchSize, ReceiveQueueBindingsContext, TransmitQueueBindingsContext,
77        TransmitQueueConfiguration,
78    };
79    pub use netstack3_device::{
80        ArpConfiguration, ArpConfigurationUpdate, DeviceClassMatcher, DeviceConfiguration,
81        DeviceConfigurationUpdate, DeviceConfigurationUpdateError, DeviceCounters, DeviceId,
82        DeviceIdAndNameMatcher, DeviceLayerEventDispatcher, DeviceLayerStateTypes, DeviceProvider,
83        DeviceSendFrameError, NdpConfiguration, NdpConfigurationUpdate, WeakDeviceId,
84    };
85}
86
87/// Device socket API.
88pub mod device_socket {
89    pub use netstack3_base::{FrameDestination, SendFrameErrorReason};
90    pub use netstack3_device::socket::{
91        DeviceSocketBindingsContext, DeviceSocketMetadata, DeviceSocketTypes, EthernetFrame,
92        EthernetHeaderParams, Frame, IpFrame, Protocol, ReceiveFrameError, ReceivedFrame,
93        SentFrame, SocketId, SocketInfo, TargetDevice, WeakDeviceSocketId,
94    };
95}
96
97/// Generic netstack errors.
98pub mod error {
99    pub use netstack3_base::{
100        AddressResolutionFailed, ExistsError, LocalAddressError, NotFoundError, NotSupportedError,
101        RemoteAddressError, SocketError, ZonedAddressError,
102    };
103}
104
105/// Framework for packet filtering.
106pub mod filter {
107    mod integration;
108
109    pub use netstack3_filter::{
110        Action, BindingsPacketMatcher, FilterApi, FilterBindingsContext, FilterBindingsTypes,
111        FilterIpExt, FilterIpPacket, FilterPacketMetadata, Hook, Interfaces, IpPacket, IpRoutines,
112        MarkAction, NatRoutines, PacketMatcher, ProofOfEgressCheck, Routine, Routines, Rule,
113        SocketEgressFilterResult, SocketIngressFilterResult, SocketOpsFilter,
114        SocketOpsFilterBindingContext, TransparentProxy, TransportProtocolMatcher, Tuple,
115        UninstalledRoutine, ValidationError,
116    };
117}
118
119/// Facilities for inspecting stack state for debugging.
120pub mod inspect {
121    pub use netstack3_base::{
122        Inspectable, InspectableValue, Inspector, InspectorDeviceExt, InspectorExt,
123    };
124}
125
126/// Methods for dealing with ICMP sockets.
127pub mod icmp {
128    pub use netstack3_icmp_echo::{
129        IcmpEchoBindingsContext, IcmpEchoBindingsTypes, IcmpEchoSettings, IcmpSocketId,
130        ReceiveIcmpEchoError,
131    };
132}
133
134/// The Internet Protocol, versions 4 and 6.
135pub mod ip {
136    #[path = "."]
137    pub(crate) mod integration {
138        mod base;
139        mod device;
140        mod multicast_forwarding;
141        mod raw;
142
143        pub(crate) use device::CoreCtxWithIpDeviceConfiguration;
144    }
145
146    // Re-exported types.
147    pub use netstack3_base::{
148        AddressMatcher, AddressMatcherEither, AddressMatcherType, BoundAddressMatcherEither,
149        BoundPortMatcher, Mark, MarkDomain, MarkInDomainMatcher, MarkMatcher, MarkMatchers, Marks,
150        PortMatcher, SubnetMatcher, WrapBroadcastMarker,
151    };
152    pub use netstack3_ip::device::{
153        AddIpAddrSubnetError, AddrSubnetAndManualConfigEither, AddressRemovedReason,
154        CommonAddressConfig, CommonAddressProperties, IidGenerationConfiguration, IidSecret,
155        IpAddressState, IpDeviceConfiguration, IpDeviceConfigurationAndFlags,
156        IpDeviceConfigurationUpdate, IpDeviceEvent, IpDeviceIpExt, Ipv4AddrConfig,
157        Ipv4DeviceConfiguration, Ipv4DeviceConfigurationUpdate, Ipv6AddrManualConfig,
158        Ipv6DeviceConfiguration, Ipv6DeviceConfigurationUpdate, Lifetime,
159        PendingIpDeviceConfigurationUpdate, PreferredLifetime, RouteDiscoveryConfiguration,
160        RouteDiscoveryConfigurationUpdate, SetIpAddressPropertiesError, SlaacConfiguration,
161        SlaacConfigurationUpdate, StableSlaacAddressConfiguration,
162        TemporarySlaacAddressConfiguration, UpdateIpConfigurationError,
163    };
164    pub use netstack3_ip::gmp::{IgmpConfigMode, MldConfigMode};
165    pub use netstack3_ip::multicast_forwarding::{
166        ForwardMulticastRouteError, MulticastForwardingDisabledError, MulticastForwardingEvent,
167        MulticastRoute, MulticastRouteKey, MulticastRouteStats, MulticastRouteTarget,
168    };
169    pub use netstack3_ip::raw::{
170        RawIpSocketIcmpFilter, RawIpSocketIcmpFilterError, RawIpSocketId, RawIpSocketProtocol,
171        RawIpSocketSendToError, RawIpSocketsBindingsContext, RawIpSocketsBindingsTypes,
172        ReceivePacketError, WeakRawIpSocketId,
173    };
174    pub use netstack3_ip::socket::{
175        IpSockCreateAndSendError, IpSockCreationError, IpSockSendError,
176    };
177    pub use netstack3_ip::{
178        IpLayerEvent, IpRoutingBindingsTypes, MarksBindingsContext, ResolveRouteError,
179        RouterAdvertisementEvent, SocketMetadata,
180    };
181}
182
183/// Types and utilities for dealing with neighbors.
184pub mod neighbor {
185    // Re-exported types.
186    pub use netstack3_ip::nud::{
187        Event, EventDynamicState, EventKind, EventState, LinkResolutionContext,
188        LinkResolutionNotifier, LinkResolutionResult, MAX_ENTRIES, NeighborRemovalError,
189        NudUserConfig, NudUserConfigUpdate, StaticNeighborInsertionError,
190    };
191}
192
193/// Types and utilities for dealing with routes.
194pub mod routes {
195    // Re-exported types.
196    pub use netstack3_base::{Marks, WrapBroadcastMarker};
197    pub use netstack3_ip::{
198        AddRouteError, AddableEntry, AddableEntryEither, AddableMetric, Entry, EntryEither,
199        Generation, Metric, NextHop, RawMetric, ResolvedRoute, RoutableIpAddr, RouteResolveOptions,
200        RoutingTableCookie, RoutingTableId, Rule, RuleAction, RuleMatcher, TrafficOriginMatcher,
201    };
202}
203
204/// Common types for dealing with sockets.
205pub mod socket {
206    pub use netstack3_datagram::{
207        ConnInfo, ConnectError, ExpectedConnError, ExpectedUnboundError, ListenerInfo,
208        MulticastInterfaceSelector, MulticastMembershipInterfaceSelector, SendError, SendToError,
209        SetMulticastMembershipError, SocketInfo,
210    };
211
212    pub use netstack3_base::socket::{
213        AddrIsMappedError, NotDualStackCapableError, ReusePortOption, SetDualStackEnabledError,
214        SharingDomain, ShutdownType, SocketCookie, SocketWritableListener, StrictlyZonedAddr,
215    };
216
217    pub use netstack3_base::{
218        IpSocketMatcher, SocketCookieMatcher, SocketTransportProtocolMatcher, TcpSocketMatcher,
219        TcpStateMatcher, UdpSocketMatcher, UdpStateMatcher,
220    };
221}
222
223/// Useful synchronization primitives.
224pub mod sync {
225    // We take all of our dependencies directly from base for symmetry with the
226    // other crates. However, we want to explicitly have all the dependencies in
227    // GN so we can assert the dependencies on the crate variants. This defeats
228    // rustc's unused dependency check.
229    use netstack3_sync as _;
230
231    pub use netstack3_base::sync::{
232        DebugReferences, DynDebugReferences, LockGuard, MapRcNotifier, Mutex, PrimaryRc,
233        RcNotifier, ResourceToken, ResourceTokenValue, RwLock, RwLockReadGuard, RwLockWriteGuard,
234        StrongRc, WeakRc,
235    };
236    pub use netstack3_base::{RemoveResourceResult, RemoveResourceResultWithContext};
237}
238
239/// Methods for dealing with TCP sockets.
240pub mod tcp {
241    pub use netstack3_base::{FragmentedPayload, Payload, PayloadLen, TcpSocketState};
242    pub use netstack3_tcp::{
243        AcceptError, BindError, BoundInfo, Buffer, BufferLimits, BufferSizes,
244        CongestionControlState, ConnectError, ConnectionError, ConnectionInfo,
245        DEFAULT_FIN_WAIT2_TIMEOUT, IntoBuffers, ListenError, ListenerNotifier, NoConnection,
246        OriginalDestinationError, ReceiveBuffer, SendBuffer, SetDeviceError, SetReuseAddrError,
247        SocketAddr, SocketInfo, SocketOptions, TcpBindingsTypes, TcpSettings,
248        TcpSocketDiagnosticTuple, TcpSocketDiagnostics, TcpSocketId, TcpSocketInfo, UnboundInfo,
249    };
250}
251
252/// Tracing utilities.
253pub mod trace {
254    // Re-export all of the trace crate to match how the rest of core works.
255    pub use netstack3_trace::*;
256}
257
258/// Miscellaneous and common types.
259pub mod types {
260    pub use netstack3_base::{BufferSizeSettings, Counter, PositiveIsize, WorkQueueReport};
261}
262
263/// Methods for dealing with UDP sockets.
264pub mod udp {
265    pub use netstack3_udp::{
266        ReceiveUdpError, SendError, SendToError, UdpBindingsTypes, UdpPacketMeta,
267        UdpReceiveBindingsContext, UdpRemotePort, UdpSettings, UdpSocketDiagnosticTuple,
268        UdpSocketDiagnostics, UdpSocketId,
269    };
270}
271
272pub use api::CoreApi;
273pub use context::{CoreCtx, UnlockedCoreCtx};
274pub use inspect::Inspector;
275pub use marker::{BindingsContext, BindingsTypes, CoreContext, IpBindingsContext, IpExt};
276pub use netstack3_base::{
277    CtxPair, DeferredResourceRemovalContext, EventContext, InstantBindingsTypes, InstantContext,
278    MapDerefExt, MatcherBindingsTypes, ReferenceNotifiers, RngContext, SettingsContext,
279    TimerBindingsTypes, TimerContext, TxMetadata, TxMetadataBindingsTypes,
280};
281pub use state::{StackState, StackStateBuilder};
282pub use time::{AtomicInstant, Instant, TimerId};
283pub use transport::CoreTxMetadata;
284
285// Re-export useful macros.
286pub use netstack3_device::for_any_device_id;
287pub use netstack3_macros::context_ip_bounds;
288
289// Rust compiler spinning workaround (https://fxbug.dev/395694598):
290//
291// If you find yourself with a spinning rustc because you're changing traits
292// that need to be implemented by bindings, uncomment the lines below and give
293// it a go. See attached bug for details.
294//
295// unsafe impl<BT: BindingsTypes> Send for TimerId<BT> {}
296// unsafe impl<BT: BindingsTypes> Sync for TimerId<BT> {}
297// unsafe impl<BT: BindingsTypes> Send for TxMetadata<BT> {}
298// unsafe impl<BT: BindingsTypes> Sync for TxMetadata<BT> {}