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 EitherIpProto, FilterBindingsContext, FilterBindingsTypes, FilterContext, FilterIpContext,
40 Marks, NatContext, SocketEgressFilterResult, SocketInfo, SocketIngressFilterResult,
41 SocketOpsFilter, SocketOpsFilterBindingContext,
42};
43pub use logic::{
44 Accept, DropOrReject, DropPacket, FilterHandler, FilterImpl, FilterTimerId, IngressStopReason,
45 IngressVerdict, Interfaces, ProofOfEgressCheck, Verdict,
46};
47pub use matchers::{BindingsPacketMatcher, PacketMatcher, TransportProtocolMatcher};
48pub use packets::{
49 DynTransportSerializer, DynamicTransportSerializer, FilterIpExt, FilterIpPacket,
50 ForwardedPacket, IcmpMessage, IpPacket, MaybeTransportPacket, MaybeTransportPacketMut,
51 RawIpBody, TransportPacketSerializer, TxPacket,
52};
53pub use state::validation::{ValidRoutines, ValidationError};
54pub use state::{
55 Action, FilterIpMetadata, FilterPacketMetadata, Hook, IpRoutines, NatRoutines, RejectType,
56 Routine, Routines, Rule, State, TransparentProxy, UninstalledRoutine,
57};
58
59#[cfg(any(test, feature = "testutils"))]
61pub mod testutil {
62 pub use crate::logic::testutil::NoopImpl;
63 pub use crate::packets::testutil::new_filter_egress_ip_packet;
64 pub use crate::state::FakePacketMetadata;
65 use net_types::ip::IpVersion;
66 use packet::FragmentedByteSlice;
67
68 use crate::{
69 FilterIpExt, IpPacket, Marks, SocketEgressFilterResult, SocketInfo,
70 SocketIngressFilterResult, SocketOpsFilter,
71 };
72
73 #[cfg(test)]
74 pub(crate) trait TestIpExt:
75 crate::context::testutil::TestIpExt + crate::packets::testutil::internal::TestIpExt
76 {
77 }
78
79 #[cfg(test)]
80 impl<I> TestIpExt for I where
81 I: crate::context::testutil::TestIpExt + crate::packets::testutil::internal::TestIpExt
82 {
83 }
84
85 pub struct NoOpSocketOpsFilter;
87
88 impl<D> SocketOpsFilter<D> for NoOpSocketOpsFilter {
89 fn on_egress<I: FilterIpExt, P: IpPacket<I>>(
90 &self,
91 _packet: &P,
92 _device: &D,
93 _socket_info: SocketInfo,
94 _marks: &Marks,
95 ) -> SocketEgressFilterResult {
96 SocketEgressFilterResult::Pass { congestion: false }
97 }
98
99 fn on_ingress(
100 &self,
101 _ip_version: IpVersion,
102 _packet: FragmentedByteSlice<'_, &[u8]>,
103 _device: &D,
104 _socket_info: SocketInfo,
105 _marks: &Marks,
106 ) -> SocketIngressFilterResult {
107 SocketIngressFilterResult::Accept
108 }
109 }
110}