commit 2b4563d544a07d9ef1a94223d3ca57f6a82c4a3a
parent 9a7ac15017b1e2d139ad1ebbb984cd2ef89fbfb2
Author: Daniel Barlow <dan@telent.net>
Date: Mon, 29 Dec 2025 11:50:28 +0000
extract MdnsResponder struct
Diffstat:
1 file changed, 53 insertions(+), 19 deletions(-)
diff --git a/ecu-esp32/src/wifi.rs b/ecu-esp32/src/wifi.rs
@@ -14,7 +14,8 @@ use embassy_net::{
StackResources,
udp::{PacketMetadata, UdpSocket, UdpMetadata},
IpAddress,
- IpEndpoint
+ IpEndpoint,
+ Stack
};
use embassy_time::{Duration, Timer};
@@ -65,6 +66,45 @@ const MDNS_ENDPOINT: IpEndpoint = IpEndpoint::new(MDNS_IP, MDNS_PORT);
const CACHE_FLUSH : u16 = 1<<15;
+struct MdnsResponder<'a> {
+ sock : UdpSocket<'a>,
+ database : DnsDatabase,
+}
+
+impl<'a> MdnsResponder<'a> {
+ fn new(stack : Stack<'a>,
+ rx_meta : &'a mut [PacketMetadata],
+ rx_buffer : &'a mut [u8],
+ tx_meta : &'a mut [PacketMetadata],
+ tx_buffer : &'a mut [u8],
+ my_address: [u8;4]) -> MdnsResponder<'a> {
+
+
+ let mut sock = UdpSocket::new(
+ stack,
+ rx_meta,
+ rx_buffer,
+ tx_meta,
+ tx_buffer,
+ );
+ sock.set_hop_limit(Some(255));
+ log::info!("sock.bind(5353) res: {:?}", sock.bind(MDNS_PORT));
+ log::info!(
+ "multicast_res: {:?}",
+ stack.join_multicast_group(MDNS_IP)
+ );
+
+ Self {
+ sock,
+ database: DnsDatabase::create(&my_address),
+ }
+ }
+ fn sock(&self) -> &UdpSocket<'a> {
+ &self.sock
+ }
+}
+
+
// dns_protocol's ResourceRecord doesn't make a good representation for
// our needs because it doesn't own its "data" attribute - it's just a
// reference. So we need structures that can own the data
@@ -374,8 +414,6 @@ pub async fn start_wifi(spawner: &Spawner,
spawner.spawn(connection(controller)).ok();
spawner.spawn(net_task(runner)).ok();
- let mut rx_buffer = [0; 4096];
- let mut tx_buffer = [0; 4096];
let my_address;
loop {
@@ -395,29 +433,25 @@ pub async fn start_wifi(spawner: &Spawner,
Timer::after(Duration::from_millis(500)).await;
}
+ let mut rx_buffer = [0u8; 4096];
+ let mut tx_buffer = [0u8; 4096];
let mut rx_meta = [PacketMetadata::EMPTY; 512];
let mut tx_meta = [PacketMetadata::EMPTY; 512];
- let mut sock = UdpSocket::new(
- stack,
- &mut rx_meta,
- &mut rx_buffer,
- &mut tx_meta,
- &mut tx_buffer,
- );
- sock.set_hop_limit(Some(255));
-
- log::info!("sock.bind(5353) res: {:?}", sock.bind(MDNS_PORT));
- log::info!(
- "multicast_res: {:?}",
- stack.join_multicast_group(MDNS_IP)
- );
+ let mdns_responder = MdnsResponder::new(
+ stack,
+ &mut rx_meta,
+ &mut rx_buffer,
+ &mut tx_meta,
+ &mut tx_buffer,
+ my_address);
let mut data_buf = [0; 4096];
- let dns_db = DnsDatabase::create(&my_address);
+ let dns_db = &mdns_responder.database;
+ let sock = mdns_responder.sock();
- send_response(&sock, 0, MDNS_ENDPOINT, &dns_db, None, dns_db.advertised()).await;
+ send_response(&sock, 0, MDNS_ENDPOINT, dns_db, None, dns_db.advertised()).await;
loop {
if sock.may_recv() {