commit 3938a28c7664b83e81f64f47a2cc8ed6f586f9f7
parent 1cbb935e51269ee6d864af59046cefa82419b4c8
Author: Daniel Barlow <dan@telent.net>
Date: Sat, 27 Dec 2025 21:28:38 +0000
send multiple answer RRs in same response
instead of one response per answer
Diffstat:
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/ecu-esp32/src/wifi.rs b/ecu-esp32/src/wifi.rs
@@ -211,7 +211,7 @@ async fn send_response(sock: &UdpSocket<'_>,
id: u16,
endpoint: IpEndpoint,
question: Option<&Question<'_>>,
- answer: ResourceRecord<'_>) {
+ answers: Vec<&DnsResource>) {
let questions = match question {
Some(q) =>&mut [*q][..],
@@ -219,10 +219,18 @@ async fn send_response(sock: &UdpSocket<'_>,
};
let mut flags = Flags::new();
- let mut answers = [answer];
+
flags.set_qr(MessageType::Reply);
flags.set_authoritative(true);
+ let mut answers : Vec<ResourceRecord> = {
+ let mut rrs = Vec::new();
+ for a in answers {
+ rrs.push(a.to_resource_record());
+ }
+ rrs
+ };
+
let message = Message::new(
id,
flags,
@@ -261,17 +269,14 @@ async fn send_responses(sock: &UdpSocket<'_>,
// it's ok to do this for legacy queries but they probably
// don't have multiple questions anyway
for q in message.questions() {
- let relevant = db.find(q.name(), q.ty());
- for r in relevant {
+ let relevant = db.find(q.name().to_string(), q.ty());
+ if relevant.len() > 0 {
log::info!("question {:?} {:?} {:?} flags {:?} from {:?}",
q.name(), q.ty(), q.class(),
message.flags().raw(),
meta.endpoint);
- log::info!("can send {:?} {:?}",
- r.name, r.ty);
- send_response(&sock, q_id, MDNS_ENDPOINT, None,
- r.to_resource_record()).await
+ send_response(&sock, q_id, MDNS_ENDPOINT, None, relevant).await
}