From dcd0c7cc2fddbd13b5745fe46722dc0ac69239b9 Mon Sep 17 00:00:00 2001 From: Luna Yao <40349250+ZnqbuZ@users.noreply.github.com> Date: Wed, 1 Apr 2026 00:56:01 +0200 Subject: [PATCH] utils: move ResponseHandle --- easytier/src/dns/server.rs | 55 ++-------------------------- easytier/src/dns/utils/mod.rs | 1 + easytier/src/dns/utils/response.rs | 58 ++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 53 deletions(-) create mode 100644 easytier/src/dns/utils/response.rs diff --git a/easytier/src/dns/server.rs b/easytier/src/dns/server.rs index 6073e533..b45478d8 100644 --- a/easytier/src/dns/server.rs +++ b/easytier/src/dns/server.rs @@ -3,6 +3,7 @@ use crate::common::global_ctx::ArcGlobalCtx; use crate::dns::node_mgr::DnsNodeMgr; use crate::dns::system; use crate::dns::utils::addr::NameServerAddr; +use crate::dns::utils::response::ResponseHandle; use crate::instance::instance::{ArcNicCtx, NicCtx}; use crate::peer_center::instance::PeerCenterPeerManagerTrait; use crate::peers::peer_manager::PeerManager; @@ -37,7 +38,7 @@ use tokio_util::sync::CancellationToken; use tracing::{instrument, Instrument}; #[derive(Clone)] -pub struct DynamicCatalog { +struct DynamicCatalog { inner: Arc>, } @@ -68,56 +69,6 @@ impl RequestHandler for DynamicCatalog { } } -// ResponseWrapper for serializing DNS responses into a byte buffer. -// Used by the address hijacking NIC packet filter to produce DNS replies in-place. -#[derive(Debug, Clone)] -struct ResponseHandle { - inner: Arc>>, -} - -impl ResponseHandle { - pub fn new(capacity: usize) -> Self { - Self { - inner: Arc::new(Mutex::new(Vec::with_capacity(capacity))), - } - } - - pub fn into_inner(self) -> Option> { - Arc::into_inner(self.inner).map(Mutex::into_inner) - } -} - -trait RecordIter<'r>: Iterator + Send + 'r {} -impl<'r, T> RecordIter<'r> for T where T: Iterator + Send + 'r {} - -#[async_trait::async_trait] -impl ResponseHandler for ResponseHandle { - async fn send_response<'r>( - &mut self, - response: MessageResponse< - '_, - 'r, - impl RecordIter<'r>, - impl RecordIter<'r>, - impl RecordIter<'r>, - impl RecordIter<'r>, - >, - ) -> io::Result { - let max_size = if let Some(edns) = response.get_edns() { - edns.max_payload() - } else { - hickory_proto::udp::MAX_RECEIVE_BUFFER_SIZE as u16 - }; - - let mut inner = self.inner.lock(); - let mut encoder = BinEncoder::new(inner.as_mut()); - encoder.set_max_size(max_size); - response - .destructive_emit(&mut encoder) - .map_err(io::Error::other) - } -} - #[derive(Derivative)] #[derivative(Debug)] pub struct DnsServer { @@ -437,8 +388,6 @@ impl DnsServer { return None; } - tracing::warn!("HIJACKING PACKET"); - let response_payload = { let response = ResponseHandle::new(512); diff --git a/easytier/src/dns/utils/mod.rs b/easytier/src/dns/utils/mod.rs index 4d54b157..44e13980 100644 --- a/easytier/src/dns/utils/mod.rs +++ b/easytier/src/dns/utils/mod.rs @@ -5,6 +5,7 @@ use itertools::Itertools; pub mod addr; pub mod authority; pub mod dirty; +pub mod response; pub fn sanitize(name: &str) -> String { let dot = name.ends_with('.'); diff --git a/easytier/src/dns/utils/response.rs b/easytier/src/dns/utils/response.rs new file mode 100644 index 00000000..29076225 --- /dev/null +++ b/easytier/src/dns/utils/response.rs @@ -0,0 +1,58 @@ +use std::io; +use std::sync::Arc; +use hickory_proto::rr::Record; +use parking_lot::Mutex; +use hickory_server::server::{ResponseHandler, ResponseInfo}; +use hickory_server::authority::MessageResponse; +use hickory_proto::serialize::binary::BinEncoder; + +// ResponseWrapper for serializing DNS responses into a byte buffer. +// Used by the address hijacking NIC packet filter to produce DNS replies in-place. +#[derive(Debug, Clone)] +pub struct ResponseHandle { + inner: Arc>>, +} + +impl ResponseHandle { + pub fn new(capacity: usize) -> Self { + Self { + inner: Arc::new(Mutex::new(Vec::with_capacity(capacity))), + } + } + + pub fn into_inner(self) -> Option> { + Arc::into_inner(self.inner).map(Mutex::into_inner) + } +} + +trait RecordIter<'r>: Iterator + Send + 'r {} + +impl<'r, T> RecordIter<'r> for T where T: Iterator + Send + 'r {} + +#[async_trait::async_trait] +impl ResponseHandler for ResponseHandle { + async fn send_response<'r>( + &mut self, + response: MessageResponse< + '_, + 'r, + impl RecordIter<'r>, + impl RecordIter<'r>, + impl RecordIter<'r>, + impl RecordIter<'r>, + >, + ) -> io::Result { + let max_size = if let Some(edns) = response.get_edns() { + edns.max_payload() + } else { + hickory_proto::udp::MAX_RECEIVE_BUFFER_SIZE as u16 + }; + + let mut inner = self.inner.lock(); + let mut encoder = BinEncoder::new(inner.as_mut()); + encoder.set_max_size(max_size); + response + .destructive_emit(&mut encoder) + .map_err(io::Error::other) + } +} \ No newline at end of file