From 07539b3e060d72b69d4c5fef8db61a10dc20541d Mon Sep 17 00:00:00 2001 From: Sachymetsu Date: Wed, 7 Jan 2026 12:03:47 +0100 Subject: [PATCH] mDNS client helpers, all the pub, feature flagging --- Cargo.lock | 126 ++++++++++++++++++++--------------- sachy-mdns/Cargo.toml | 9 +-- sachy-mdns/src/client.rs | 63 ++++++++++++++++++ sachy-mdns/src/dns.rs | 10 +-- sachy-mdns/src/dns/reqres.rs | 20 ++++-- sachy-mdns/src/lib.rs | 55 +++------------ sachy-mdns/src/server.rs | 39 ++++++----- sachy-mdns/src/service.rs | 58 ++++++++++++++-- 8 files changed, 249 insertions(+), 131 deletions(-) create mode 100644 sachy-mdns/src/client.rs diff --git a/Cargo.lock b/Cargo.lock index 38aed4a..034eae0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -106,9 +106,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.48" +version = "1.2.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" +checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203" dependencies = [ "find-msvc-tools", "shlex", @@ -131,9 +131,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -347,6 +347,7 @@ checksum = "f4fa65b9284d974dad7a23bb72835c4ec85c0b540d86af7fc4098c88cff51d65" dependencies = [ "cfg-if", "critical-section", + "defmt 1.0.1", "document-features", "embassy-time-driver", "embedded-hal 0.2.7", @@ -580,9 +581,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff" [[package]] name = "fixedbitset" @@ -649,9 +650,9 @@ dependencies = [ [[package]] name = "handlebars" -version = "6.3.2" +version = "6.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759e2d5aea3287cb1190c8ec394f42866cb5bf74fcbf213f354e3c856ea26098" +checksum = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e" dependencies = [ "derive_builder", "log", @@ -775,9 +776,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "kdl" @@ -792,9 +793,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.178" +version = "0.2.179" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" +checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f" [[package]] name = "libm" @@ -1108,9 +1109,9 @@ checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52" [[package]] name = "pest" -version = "2.8.4" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" dependencies = [ "memchr", "ucd-trie", @@ -1118,9 +1119,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.4" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f" +checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" dependencies = [ "pest", "pest_generator", @@ -1128,9 +1129,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.4" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625" +checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" dependencies = [ "pest", "pest_meta", @@ -1141,9 +1142,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.8.4" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82" +checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" dependencies = [ "pest", "sha2", @@ -1167,9 +1168,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" [[package]] name = "prettyplease" @@ -1205,9 +1206,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ "unicode-ident", ] @@ -1302,9 +1303,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" dependencies = [ "proc-macro2", ] @@ -1366,14 +1367,14 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ "bitflags 2.10.0", "errno", @@ -1382,12 +1383,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - [[package]] name = "sachy-battery" version = "0.1.0" @@ -1512,22 +1507,22 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] name = "serialport" -version = "4.8.1" +version = "4.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21f60a586160667241d7702c420fc223939fb3c0bb8d3fac84f78768e8970dee" +checksum = "2acaf3f973e8616d7ceac415f53fc60e190b2a686fbcf8d27d0256c741c5007b" dependencies = [ "bitflags 2.10.0", "cfg-if", @@ -1536,10 +1531,9 @@ dependencies = [ "io-kit-sys", "mach2", "nix 0.26.4", - "quote", "scopeguard", "unescaper", - "windows-sys 0.52.0", + "winapi", ] [[package]] @@ -1624,9 +1618,9 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.111" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -1644,14 +1638,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ "fastrand", "getrandom", "once_cell", - "rustix 1.1.2", + "rustix 1.1.3", "windows-sys 0.61.2", ] @@ -1661,7 +1655,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.1.2", + "rustix 1.1.3", "windows-sys 0.60.2", ] @@ -1729,9 +1723,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unescaper" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26" +checksum = "4064ed685c487dbc25bd3f0e9548f2e34bab9d18cefc700f9ec2dba74ba1138e" dependencies = [ "thiserror 2.0.17", ] @@ -1804,6 +1798,28 @@ dependencies = [ "rustix 0.38.44", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "windows-link" version = "0.2.1" @@ -1812,9 +1828,9 @@ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] @@ -1986,3 +2002,9 @@ name = "wit-bindgen" version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zmij" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8" diff --git a/sachy-mdns/Cargo.toml b/sachy-mdns/Cargo.toml index f0ee517..d7fefaa 100644 --- a/sachy-mdns/Cargo.toml +++ b/sachy-mdns/Cargo.toml @@ -8,15 +8,16 @@ version.workspace = true rust-version.workspace = true [dependencies] -defmt = { workspace = true, optional = true, features = ["alloc"] } -embassy-time = { workspace = true } +defmt = { workspace = true, optional = true, features = ["alloc", "ip_in_core"] } +embassy-time = { workspace = true, optional = true } sachy-fmt = { path = "../sachy-fmt" } winnow = { version = "0.7.12", default-features = false } [features] default = [] -std = [] -defmt = ["dep:defmt"] +server = ["dep:embassy-time"] +client = [] +defmt = ["dep:defmt", "embassy-time?/defmt"] [dev-dependencies] winnow = { version = "0.7.12", default-features = false, features = ["alloc"] } diff --git a/sachy-mdns/src/client.rs b/sachy-mdns/src/client.rs new file mode 100644 index 0000000..235ee0a --- /dev/null +++ b/sachy-mdns/src/client.rs @@ -0,0 +1,63 @@ +use alloc::{vec, vec::Vec}; + +use crate::{ + dns::{ + flags::Flags, + label::Label, + query::{QClass, Query}, + records::QType, + reqres::Request, + }, + encoder::{DnsError, Encoder}, +}; + +pub fn query_domain<'a, 'b>(domain: &'a str, buf: &'b mut [u8]) -> Result<&'b [u8], DnsError> { + let encoder = Encoder::new(buf); + + let query = Query { + name: Label::from(domain), + qtype: QType::A, + qclass: QClass::Multicast, + }; + + let request = Request { + id: 0, + flags: Flags::standard_request(), + queries: vec![query], + }; + + encoder.encode(request) +} + +pub fn query_service<'a, 'b>(service: &'a str, buf: &'b mut [u8]) -> Result<&'b [u8], DnsError> { + let encoder = Encoder::new(buf); + + let ptr = Query { + name: Label::from(service), + qtype: QType::PTR, + qclass: QClass::Multicast, + }; + + let request = Request { + id: 0, + flags: Flags::standard_request(), + queries: vec![ptr], + }; + + encoder.encode(request) +} + +pub fn query_custom<'a, 'b>( + queries: Vec>, + buf: &'b mut [u8], +) -> Result<&'b [u8], DnsError> { + let encoder = Encoder::new(buf); + + let request = Request { + id: 0, + flags: Flags::standard_request(), + queries, + }; + + encoder.encode(request) +} diff --git a/sachy-mdns/src/dns.rs b/sachy-mdns/src/dns.rs index 089dc8a..450172d 100644 --- a/sachy-mdns/src/dns.rs +++ b/sachy-mdns/src/dns.rs @@ -1,6 +1,6 @@ -pub(crate) mod flags; -pub(crate) mod label; -pub(crate) mod query; -pub(crate) mod records; -pub(crate) mod reqres; +pub mod flags; +pub mod label; +pub mod query; +pub mod records; +pub mod reqres; pub mod traits; diff --git a/sachy-mdns/src/dns/reqres.rs b/sachy-mdns/src/dns/reqres.rs index cf3ee00..a10cb10 100644 --- a/sachy-mdns/src/dns/reqres.rs +++ b/sachy-mdns/src/dns/reqres.rs @@ -65,6 +65,7 @@ pub struct Response<'a> { pub flags: Flags, pub queries: Vec>, pub answers: Vec>, + pub additional: Vec>, } impl<'a> DnsParse<'a> for Response<'a> { @@ -74,7 +75,7 @@ impl<'a> DnsParse<'a> for Response<'a> { let qdcount = be_u16(input)?; let ancount = be_u16(input)?; let _nscount = be_u16(input)?; - let _arcount = be_u16(input)?; + let adcount = be_u16(input)?; let queries = (0..qdcount) .map(|_| Query::parse(input, context)) @@ -84,11 +85,16 @@ impl<'a> DnsParse<'a> for Response<'a> { .map(|_| Answer::parse(input, context)) .collect::, _>>()?; + let additional = (0..adcount) + .map(|_| Answer::parse(input, context)) + .collect::, _>>()?; + Ok(Response { id, flags, queries, answers, + additional, }) } } @@ -102,12 +108,15 @@ impl<'a> DnsSerialize<'a> for Response<'a> { encoder.write(&(self.queries.len() as u16).to_be_bytes()); encoder.write(&(self.answers.len() as u16).to_be_bytes()); encoder.write(&ZERO_U16); - encoder.write(&ZERO_U16); + encoder.write(&(self.additional.len() as u16).to_be_bytes()); self.queries .iter() .try_for_each(|query| query.serialize(encoder))?; self.answers + .iter() + .try_for_each(|answer| answer.serialize(encoder))?; + self.additional .iter() .try_for_each(|answer| answer.serialize(encoder)) } @@ -414,6 +423,7 @@ mod tests { flags: Flags::standard_response(), queries: Vec::new(), answers: Vec::new(), + additional: Vec::new(), }; let query = Query { @@ -446,7 +456,7 @@ mod tests { target: Label::from("host.local"), }), }; - response.answers.push(srv_answer); + response.additional.push(srv_answer); let txt_answer = Answer { name: Label::from("test-service._test._udp.local"), @@ -457,7 +467,7 @@ mod tests { text: vec!["path=/test"], }), }; - response.answers.push(txt_answer); + response.additional.push(txt_answer); let a_answer = Answer { name: Label::from("host.local"), @@ -468,7 +478,7 @@ mod tests { address: Ipv4Addr::new(192, 168, 1, 100), }), }; - response.answers.push(a_answer); + response.additional.push(a_answer); let mut buffer = [0u8; 256]; let mut buffer = Encoder::new(&mut buffer); diff --git a/sachy-mdns/src/lib.rs b/sachy-mdns/src/lib.rs index 39775ef..415223d 100644 --- a/sachy-mdns/src/lib.rs +++ b/sachy-mdns/src/lib.rs @@ -1,60 +1,23 @@ #![no_std] -mod dns; -pub(crate) mod encoder; +#[cfg(feature = "client")] +pub mod client; +pub mod dns; +pub mod encoder; +#[cfg(feature = "server")] pub mod server; -mod service; -mod state; +#[cfg(feature = "server")] +pub mod service; +#[cfg(feature = "server")] +pub mod state; extern crate alloc; use core::net::{Ipv4Addr, SocketAddrV4}; -pub use crate::service::Service; -pub use crate::state::MdnsAction; -use crate::{dns::flags::Flags, server::Server, state::MdnsStateMachine}; - /// Standard port for mDNS (5353). pub const MDNS_PORT: u16 = 5353; /// Standard IPv4 multicast address for mDNS (224.0.0.251). pub const GROUP_ADDR_V4: Ipv4Addr = Ipv4Addr::new(224, 0, 0, 251); pub const GROUP_SOCK_V4: SocketAddrV4 = SocketAddrV4::new(GROUP_ADDR_V4, MDNS_PORT); - -#[derive(Debug)] -#[cfg_attr(feature = "defmt", derive(defmt::Format))] -pub struct MdnsService { - server: Server, - state: MdnsStateMachine, -} - -impl MdnsService { - pub fn new(service: Service) -> Self { - Self { - server: Server::new(service), - state: Default::default(), - } - } - - pub fn next_action(&mut self) -> MdnsAction { - self.state.drive_next_action() - } - - pub fn send_announcement<'buffer>(&self, outgoing: &'buffer mut [u8]) -> Option<&'buffer [u8]> { - self.server.broadcast( - server::ResponseKind::Announcement, - Flags::standard_response(), - 1, - alloc::vec::Vec::new(), - outgoing, - ) - } - - pub fn listen_for_queries<'buffer>( - &mut self, - incoming: &[u8], - outgoing: &'buffer mut [u8], - ) -> Option<&'buffer [u8]> { - self.server.respond(incoming, outgoing) - } -} diff --git a/sachy-mdns/src/server.rs b/sachy-mdns/src/server.rs index a4bbcc4..fef8f74 100644 --- a/sachy-mdns/src/server.rs +++ b/sachy-mdns/src/server.rs @@ -4,7 +4,7 @@ use sachy_fmt::{error, info}; use crate::{ dns::{ flags::Flags, - query::{QClass, Query}, + query::{Answer, QClass, Query}, records::QType, reqres::{Request, Response}, traits::DnsParse, @@ -51,23 +51,32 @@ impl Server { .collect(), }; - if !answers.is_empty() { - let res = Response { - flags, - id, - queries, - answers, - }; + let additional = match &answers[..] { + [] => return None, + [ + Answer { + atype: QType::PTR, + aclass, + .. + }, + ] => self.service.as_additional(*aclass).collect(), + _ => Vec::new(), + }; - info!("MDNS RESPONSE: {}", res); + let res = Response { + flags, + id, + queries, + answers, + additional, + }; - return Encoder::new(outgoing) - .encode(res) - .inspect_err(|err| error!("Encoder errored: {}", err)) - .ok(); - } + info!("MDNS RESPONSE: {}", res); - None + Encoder::new(outgoing) + .encode(res) + .inspect_err(|err| error!("Encoder errored: {}", err)) + .ok() } pub(crate) fn respond<'a>(&self, incoming: &[u8], outgoing: &'a mut [u8]) -> Option<&'a [u8]> { diff --git a/sachy-mdns/src/service.rs b/sachy-mdns/src/service.rs index 3943b36..014c4a6 100644 --- a/sachy-mdns/src/service.rs +++ b/sachy-mdns/src/service.rs @@ -5,12 +5,55 @@ use alloc::{ vec::Vec, }; -use crate::dns::{ - label::Label, - query::{Answer, QClass}, - records::{A, AAAA, PTR, QType, Record, SRV, TXT}, +use crate::{ + dns::{ + flags::Flags, + label::Label, + query::{Answer, QClass}, + records::{A, AAAA, PTR, QType, Record, SRV, TXT}, + }, + server::{ResponseKind, Server}, + state::{MdnsAction, MdnsStateMachine}, }; +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] +pub struct MdnsService { + server: Server, + state: MdnsStateMachine, +} + +impl MdnsService { + pub fn new(service: Service) -> Self { + Self { + server: Server::new(service), + state: Default::default(), + } + } + + pub fn next_action(&mut self) -> MdnsAction { + self.state.drive_next_action() + } + + pub fn send_announcement<'buffer>(&self, outgoing: &'buffer mut [u8]) -> Option<&'buffer [u8]> { + self.server.broadcast( + ResponseKind::Announcement, + Flags::standard_response(), + 1, + alloc::vec::Vec::new(), + outgoing, + ) + } + + pub fn listen_for_queries<'buffer>( + &mut self, + incoming: &[u8], + outgoing: &'buffer mut [u8], + ) -> Option<&'buffer [u8]> { + self.server.respond(incoming, outgoing) + } +} + #[derive(Debug, Default)] #[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct Service { @@ -130,6 +173,13 @@ impl Service { .chain(self.ip_answer(aclass)) } + pub(crate) fn as_additional(&self, aclass: QClass) -> impl Iterator> { + self.srv_answer(aclass) + .into_iter() + .chain(self.txt_answer(aclass)) + .chain(self.ip_answer(aclass)) + } + #[allow(dead_code)] pub(crate) fn from_answers(answers: &[Answer<'_>]) -> Vec { let mut output = Vec::new(); -- 2.51.2