1#![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
29pub 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#[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 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}