Skip to main content

typhoon/flow/decoy/
simple.rs

1/// Simple mode: no-op decoy provider that passes packets through without generating any decoy traffic.
2use std::sync::atomic::AtomicU32;
3use std::sync::{Arc, Weak};
4
5use async_trait::async_trait;
6
7use crate::bytes::DynamicByteBuffer;
8use crate::cache::DerivedValue;
9use crate::flow::decoy::common::{DecoyCommunicationMode, DecoyFlowSender, DecoyProvider};
10use crate::settings::Settings;
11use crate::tailer::IdentityType;
12use crate::utils::sync::AsyncExecutor;
13
14/// Simple mode does not spawn any coroutines and does not send any packets.
15pub struct SimpleDecoyProvider;
16
17#[async_trait]
18impl DecoyProvider for SimpleDecoyProvider {
19    #[inline]
20    fn name(&self) -> &'static str {
21        "SimpleDecoyProvider"
22    }
23
24    async fn start(&self) {}
25
26    async fn feed_input(&self, packet: DynamicByteBuffer, _tailer_buf: DynamicByteBuffer) -> Option<DynamicByteBuffer> {
27        Some(packet)
28    }
29
30    async fn feed_output(&self, body: DynamicByteBuffer, _tailer_buf: DynamicByteBuffer) -> Option<DynamicByteBuffer> {
31        Some(body)
32    }
33}
34
35impl<T: IdentityType + Clone, AE: AsyncExecutor> DecoyCommunicationMode<T, AE> for SimpleDecoyProvider {
36    fn new(_manager: Weak<dyn DecoyFlowSender>, _settings: Arc<Settings<AE>>, _identity: DerivedValue<T>, _counter: Arc<AtomicU32>, _fallthrough_probability: Option<f64>) -> Self {
37        Self
38    }
39}