netstack3_filter/
lib.rs

1// Copyright 2024 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//! Packet filtering framework.
6
7#![no_std]
8#![warn(
9    missing_docs,
10    unreachable_patterns,
11    clippy::useless_conversion,
12    clippy::redundant_clone,
13    clippy::precedence
14)]
15
16extern crate alloc;
17
18mod actions;
19mod api;
20mod conntrack;
21mod context;
22mod logic;
23mod matchers;
24mod packets;
25mod state;
26
27use logic::nat::NatConfig;
28
29/// A connection as tracked by conntrack.
30pub type ConntrackConnection<I, A, BT> = conntrack::Connection<I, NatConfig<I, A>, BT>;
31
32pub use actions::MarkAction;
33pub use api::FilterApi;
34pub use conntrack::{
35    ConnectionDirection, Table, TransportProtocol, Tuple,
36    WeakConnection as WeakConntrackConnection, WeakConnectionError,
37};
38pub use context::{
39    FilterBindingsContext, FilterBindingsTypes, FilterContext, FilterIpContext, NatContext,
40    SocketEgressFilterResult, SocketIngressFilterResult, SocketOpsFilter,
41    SocketOpsFilterBindingContext,
42};
43pub use logic::{
44    FilterHandler, FilterImpl, FilterTimerId, IngressVerdict, ProofOfEgressCheck, Verdict,
45};
46pub use matchers::{
47    AddressMatcher, AddressMatcherType, InterfaceMatcher, InterfaceProperties, PacketMatcher,
48    PortMatcher, TransportProtocolMatcher,
49};
50pub use packets::{
51    DynTransportSerializer, DynamicTransportSerializer, FilterIpExt, ForwardedPacket, IcmpMessage,
52    IpPacket, MaybeTransportPacket, MaybeTransportPacketMut, RawIpBody, TransportPacketSerializer,
53    TxPacket,
54};
55pub use state::validation::{ValidRoutines, ValidationError};
56pub use state::{
57    Action, FilterIpMetadata, FilterMarkMetadata, Hook, IpRoutines, NatRoutines, Routine, Routines,
58    Rule, State, TransparentProxy, UninstalledRoutine,
59};
60
61/// Testing-related utilities for use by other crates.
62#[cfg(any(test, feature = "testutils"))]
63pub mod testutil {
64    pub use crate::logic::testutil::NoopImpl;
65    pub use crate::packets::testutil::new_filter_egress_ip_packet;
66    use net_types::ip::IpVersion;
67    use packet::FragmentedByteSlice;
68
69    use crate::{
70        FilterIpExt, IpPacket, SocketEgressFilterResult, SocketIngressFilterResult, SocketOpsFilter,
71    };
72    use netstack3_base::socket::SocketCookie;
73    use netstack3_base::{Marks, StrongDeviceIdentifier};
74
75    #[cfg(test)]
76    pub(crate) trait TestIpExt:
77        crate::context::testutil::TestIpExt + crate::packets::testutil::internal::TestIpExt
78    {
79    }
80
81    #[cfg(test)]
82    impl<I> TestIpExt for I where
83        I: crate::context::testutil::TestIpExt + crate::packets::testutil::internal::TestIpExt
84    {
85    }
86
87    /// No-op implementation of `SocketOpsFilter`.
88    pub struct NoOpSocketOpsFilter;
89
90    impl<D: StrongDeviceIdentifier> SocketOpsFilter<D> for NoOpSocketOpsFilter {
91        fn on_egress<I: FilterIpExt, P: IpPacket<I>>(
92            &self,
93            _packet: &P,
94            _device: &D,
95            _cookie: SocketCookie,
96            _marks: &Marks,
97        ) -> SocketEgressFilterResult {
98            SocketEgressFilterResult::Pass { congestion: false }
99        }
100
101        fn on_ingress(
102            &self,
103            _ip_version: IpVersion,
104            _packet: FragmentedByteSlice<'_, &[u8]>,
105            _device: &D,
106            _cookie: SocketCookie,
107            _marks: &Marks,
108        ) -> SocketIngressFilterResult {
109            SocketIngressFilterResult::Accept
110        }
111    }
112}