+74
-52
Cargo.lock
+74
-52
Cargo.lock
···
106
106
107
107
[[package]]
108
108
name = "cc"
109
-
version = "1.2.48"
109
+
version = "1.2.51"
110
110
source = "registry+https://github.com/rust-lang/crates.io-index"
111
-
checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a"
111
+
checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203"
112
112
dependencies = [
113
113
"find-msvc-tools",
114
114
"shlex",
···
131
131
132
132
[[package]]
133
133
name = "core-foundation"
134
-
version = "0.10.0"
134
+
version = "0.10.1"
135
135
source = "registry+https://github.com/rust-lang/crates.io-index"
136
-
checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63"
136
+
checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
137
137
dependencies = [
138
138
"core-foundation-sys",
139
139
"libc",
···
347
347
dependencies = [
348
348
"cfg-if",
349
349
"critical-section",
350
+
"defmt 1.0.1",
350
351
"document-features",
351
352
"embassy-time-driver",
352
353
"embedded-hal 0.2.7",
···
580
581
581
582
[[package]]
582
583
name = "find-msvc-tools"
583
-
version = "0.1.5"
584
+
version = "0.1.6"
584
585
source = "registry+https://github.com/rust-lang/crates.io-index"
585
-
checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844"
586
+
checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff"
586
587
587
588
[[package]]
588
589
name = "fixedbitset"
···
649
650
650
651
[[package]]
651
652
name = "handlebars"
652
-
version = "6.3.2"
653
+
version = "6.4.0"
653
654
source = "registry+https://github.com/rust-lang/crates.io-index"
654
-
checksum = "759e2d5aea3287cb1190c8ec394f42866cb5bf74fcbf213f354e3c856ea26098"
655
+
checksum = "9b3f9296c208515b87bd915a2f5d1163d4b3f863ba83337d7713cf478055948e"
655
656
dependencies = [
656
657
"derive_builder",
657
658
"log",
···
775
776
776
777
[[package]]
777
778
name = "itoa"
778
-
version = "1.0.15"
779
+
version = "1.0.17"
779
780
source = "registry+https://github.com/rust-lang/crates.io-index"
780
-
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
781
+
checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
781
782
782
783
[[package]]
783
784
name = "kdl"
···
792
793
793
794
[[package]]
794
795
name = "libc"
795
-
version = "0.2.178"
796
+
version = "0.2.179"
796
797
source = "registry+https://github.com/rust-lang/crates.io-index"
797
-
checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
798
+
checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f"
798
799
799
800
[[package]]
800
801
name = "libm"
···
1108
1109
1109
1110
[[package]]
1110
1111
name = "pest"
1111
-
version = "2.8.4"
1112
+
version = "2.8.5"
1112
1113
source = "registry+https://github.com/rust-lang/crates.io-index"
1113
-
checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22"
1114
+
checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7"
1114
1115
dependencies = [
1115
1116
"memchr",
1116
1117
"ucd-trie",
···
1118
1119
1119
1120
[[package]]
1120
1121
name = "pest_derive"
1121
-
version = "2.8.4"
1122
+
version = "2.8.5"
1122
1123
source = "registry+https://github.com/rust-lang/crates.io-index"
1123
-
checksum = "51f72981ade67b1ca6adc26ec221be9f463f2b5839c7508998daa17c23d94d7f"
1124
+
checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed"
1124
1125
dependencies = [
1125
1126
"pest",
1126
1127
"pest_generator",
···
1128
1129
1129
1130
[[package]]
1130
1131
name = "pest_generator"
1131
-
version = "2.8.4"
1132
+
version = "2.8.5"
1132
1133
source = "registry+https://github.com/rust-lang/crates.io-index"
1133
-
checksum = "dee9efd8cdb50d719a80088b76f81aec7c41ed6d522ee750178f83883d271625"
1134
+
checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5"
1134
1135
dependencies = [
1135
1136
"pest",
1136
1137
"pest_meta",
···
1141
1142
1142
1143
[[package]]
1143
1144
name = "pest_meta"
1144
-
version = "2.8.4"
1145
+
version = "2.8.5"
1145
1146
source = "registry+https://github.com/rust-lang/crates.io-index"
1146
-
checksum = "bf1d70880e76bdc13ba52eafa6239ce793d85c8e43896507e43dd8984ff05b82"
1147
+
checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365"
1147
1148
dependencies = [
1148
1149
"pest",
1149
1150
"sha2",
···
1167
1168
1168
1169
[[package]]
1169
1170
name = "portable-atomic"
1170
-
version = "1.11.1"
1171
+
version = "1.13.0"
1171
1172
source = "registry+https://github.com/rust-lang/crates.io-index"
1172
-
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
1173
+
checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950"
1173
1174
1174
1175
[[package]]
1175
1176
name = "prettyplease"
···
1205
1206
1206
1207
[[package]]
1207
1208
name = "proc-macro2"
1208
-
version = "1.0.103"
1209
+
version = "1.0.105"
1209
1210
source = "registry+https://github.com/rust-lang/crates.io-index"
1210
-
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
1211
+
checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
1211
1212
dependencies = [
1212
1213
"unicode-ident",
1213
1214
]
···
1302
1303
1303
1304
[[package]]
1304
1305
name = "quote"
1305
-
version = "1.0.40"
1306
+
version = "1.0.43"
1306
1307
source = "registry+https://github.com/rust-lang/crates.io-index"
1307
-
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
1308
+
checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
1308
1309
dependencies = [
1309
1310
"proc-macro2",
1310
1311
]
···
1366
1367
"errno",
1367
1368
"libc",
1368
1369
"linux-raw-sys 0.4.15",
1369
-
"windows-sys 0.52.0",
1370
+
"windows-sys 0.59.0",
1370
1371
]
1371
1372
1372
1373
[[package]]
1373
1374
name = "rustix"
1374
-
version = "1.1.2"
1375
+
version = "1.1.3"
1375
1376
source = "registry+https://github.com/rust-lang/crates.io-index"
1376
-
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
1377
+
checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
1377
1378
dependencies = [
1378
1379
"bitflags 2.10.0",
1379
1380
"errno",
···
1383
1384
]
1384
1385
1385
1386
[[package]]
1386
-
name = "ryu"
1387
-
version = "1.0.20"
1388
-
source = "registry+https://github.com/rust-lang/crates.io-index"
1389
-
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
1390
-
1391
-
[[package]]
1392
1387
name = "sachy-battery"
1393
1388
version = "0.1.0"
1394
1389
···
1512
1507
1513
1508
[[package]]
1514
1509
name = "serde_json"
1515
-
version = "1.0.145"
1510
+
version = "1.0.149"
1516
1511
source = "registry+https://github.com/rust-lang/crates.io-index"
1517
-
checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
1512
+
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
1518
1513
dependencies = [
1519
1514
"itoa",
1520
1515
"memchr",
1521
-
"ryu",
1522
1516
"serde",
1523
1517
"serde_core",
1518
+
"zmij",
1524
1519
]
1525
1520
1526
1521
[[package]]
1527
1522
name = "serialport"
1528
-
version = "4.8.1"
1523
+
version = "4.7.3"
1529
1524
source = "registry+https://github.com/rust-lang/crates.io-index"
1530
-
checksum = "21f60a586160667241d7702c420fc223939fb3c0bb8d3fac84f78768e8970dee"
1525
+
checksum = "2acaf3f973e8616d7ceac415f53fc60e190b2a686fbcf8d27d0256c741c5007b"
1531
1526
dependencies = [
1532
1527
"bitflags 2.10.0",
1533
1528
"cfg-if",
···
1536
1531
"io-kit-sys",
1537
1532
"mach2",
1538
1533
"nix 0.26.4",
1539
-
"quote",
1540
1534
"scopeguard",
1541
1535
"unescaper",
1542
-
"windows-sys 0.52.0",
1536
+
"winapi",
1543
1537
]
1544
1538
1545
1539
[[package]]
···
1624
1618
1625
1619
[[package]]
1626
1620
name = "syn"
1627
-
version = "2.0.111"
1621
+
version = "2.0.114"
1628
1622
source = "registry+https://github.com/rust-lang/crates.io-index"
1629
-
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
1623
+
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
1630
1624
dependencies = [
1631
1625
"proc-macro2",
1632
1626
"quote",
···
1644
1638
1645
1639
[[package]]
1646
1640
name = "tempfile"
1647
-
version = "3.23.0"
1641
+
version = "3.24.0"
1648
1642
source = "registry+https://github.com/rust-lang/crates.io-index"
1649
-
checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
1643
+
checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
1650
1644
dependencies = [
1651
1645
"fastrand",
1652
1646
"getrandom",
1653
1647
"once_cell",
1654
-
"rustix 1.1.2",
1648
+
"rustix 1.1.3",
1655
1649
"windows-sys 0.61.2",
1656
1650
]
1657
1651
···
1661
1655
source = "registry+https://github.com/rust-lang/crates.io-index"
1662
1656
checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0"
1663
1657
dependencies = [
1664
-
"rustix 1.1.2",
1658
+
"rustix 1.1.3",
1665
1659
"windows-sys 0.60.2",
1666
1660
]
1667
1661
···
1729
1723
1730
1724
[[package]]
1731
1725
name = "unescaper"
1732
-
version = "0.1.6"
1726
+
version = "0.1.8"
1733
1727
source = "registry+https://github.com/rust-lang/crates.io-index"
1734
-
checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26"
1728
+
checksum = "4064ed685c487dbc25bd3f0e9548f2e34bab9d18cefc700f9ec2dba74ba1138e"
1735
1729
dependencies = [
1736
1730
"thiserror 2.0.17",
1737
1731
]
···
1805
1799
]
1806
1800
1807
1801
[[package]]
1802
+
name = "winapi"
1803
+
version = "0.3.9"
1804
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1805
+
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
1806
+
dependencies = [
1807
+
"winapi-i686-pc-windows-gnu",
1808
+
"winapi-x86_64-pc-windows-gnu",
1809
+
]
1810
+
1811
+
[[package]]
1812
+
name = "winapi-i686-pc-windows-gnu"
1813
+
version = "0.4.0"
1814
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1815
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
1816
+
1817
+
[[package]]
1818
+
name = "winapi-x86_64-pc-windows-gnu"
1819
+
version = "0.4.0"
1820
+
source = "registry+https://github.com/rust-lang/crates.io-index"
1821
+
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
1822
+
1823
+
[[package]]
1808
1824
name = "windows-link"
1809
1825
version = "0.2.1"
1810
1826
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1812
1828
1813
1829
[[package]]
1814
1830
name = "windows-sys"
1815
-
version = "0.52.0"
1831
+
version = "0.59.0"
1816
1832
source = "registry+https://github.com/rust-lang/crates.io-index"
1817
-
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
1833
+
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
1818
1834
dependencies = [
1819
1835
"windows-targets 0.52.6",
1820
1836
]
···
1986
2002
version = "0.46.0"
1987
2003
source = "registry+https://github.com/rust-lang/crates.io-index"
1988
2004
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
2005
+
2006
+
[[package]]
2007
+
name = "zmij"
2008
+
version = "1.0.12"
2009
+
source = "registry+https://github.com/rust-lang/crates.io-index"
2010
+
checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8"
+5
-4
sachy-mdns/Cargo.toml
+5
-4
sachy-mdns/Cargo.toml
···
8
8
rust-version.workspace = true
9
9
10
10
[dependencies]
11
-
defmt = { workspace = true, optional = true, features = ["alloc"] }
12
-
embassy-time = { workspace = true }
11
+
defmt = { workspace = true, optional = true, features = ["alloc", "ip_in_core"] }
12
+
embassy-time = { workspace = true, optional = true }
13
13
sachy-fmt = { path = "../sachy-fmt" }
14
14
winnow = { version = "0.7.12", default-features = false }
15
15
16
16
[features]
17
17
default = []
18
-
std = []
19
-
defmt = ["dep:defmt"]
18
+
server = ["dep:embassy-time"]
19
+
client = []
20
+
defmt = ["dep:defmt", "embassy-time?/defmt"]
20
21
21
22
[dev-dependencies]
22
23
winnow = { version = "0.7.12", default-features = false, features = ["alloc"] }
+63
sachy-mdns/src/client.rs
+63
sachy-mdns/src/client.rs
···
1
+
use alloc::{vec, vec::Vec};
2
+
3
+
use crate::{
4
+
dns::{
5
+
flags::Flags,
6
+
label::Label,
7
+
query::{QClass, Query},
8
+
records::QType,
9
+
reqres::Request,
10
+
},
11
+
encoder::{DnsError, Encoder},
12
+
};
13
+
14
+
pub fn query_domain<'a, 'b>(domain: &'a str, buf: &'b mut [u8]) -> Result<&'b [u8], DnsError> {
15
+
let encoder = Encoder::new(buf);
16
+
17
+
let query = Query {
18
+
name: Label::from(domain),
19
+
qtype: QType::A,
20
+
qclass: QClass::Multicast,
21
+
};
22
+
23
+
let request = Request {
24
+
id: 0,
25
+
flags: Flags::standard_request(),
26
+
queries: vec![query],
27
+
};
28
+
29
+
encoder.encode(request)
30
+
}
31
+
32
+
pub fn query_service<'a, 'b>(service: &'a str, buf: &'b mut [u8]) -> Result<&'b [u8], DnsError> {
33
+
let encoder = Encoder::new(buf);
34
+
35
+
let ptr = Query {
36
+
name: Label::from(service),
37
+
qtype: QType::PTR,
38
+
qclass: QClass::Multicast,
39
+
};
40
+
41
+
let request = Request {
42
+
id: 0,
43
+
flags: Flags::standard_request(),
44
+
queries: vec![ptr],
45
+
};
46
+
47
+
encoder.encode(request)
48
+
}
49
+
50
+
pub fn query_custom<'a, 'b>(
51
+
queries: Vec<Query<'a>>,
52
+
buf: &'b mut [u8],
53
+
) -> Result<&'b [u8], DnsError> {
54
+
let encoder = Encoder::new(buf);
55
+
56
+
let request = Request {
57
+
id: 0,
58
+
flags: Flags::standard_request(),
59
+
queries,
60
+
};
61
+
62
+
encoder.encode(request)
63
+
}
+5
-5
sachy-mdns/src/dns.rs
+5
-5
sachy-mdns/src/dns.rs
+15
-5
sachy-mdns/src/dns/reqres.rs
+15
-5
sachy-mdns/src/dns/reqres.rs
···
65
65
pub flags: Flags,
66
66
pub queries: Vec<Query<'a>>,
67
67
pub answers: Vec<Answer<'a>>,
68
+
pub additional: Vec<Answer<'a>>,
68
69
}
69
70
70
71
impl<'a> DnsParse<'a> for Response<'a> {
···
74
75
let qdcount = be_u16(input)?;
75
76
let ancount = be_u16(input)?;
76
77
let _nscount = be_u16(input)?;
77
-
let _arcount = be_u16(input)?;
78
+
let adcount = be_u16(input)?;
78
79
79
80
let queries = (0..qdcount)
80
81
.map(|_| Query::parse(input, context))
81
82
.collect::<Result<Vec<_>, _>>()?;
82
83
83
84
let answers = (0..ancount)
85
+
.map(|_| Answer::parse(input, context))
86
+
.collect::<Result<Vec<_>, _>>()?;
87
+
88
+
let additional = (0..adcount)
84
89
.map(|_| Answer::parse(input, context))
85
90
.collect::<Result<Vec<_>, _>>()?;
86
91
···
89
94
flags,
90
95
queries,
91
96
answers,
97
+
additional,
92
98
})
93
99
}
94
100
}
···
102
108
encoder.write(&(self.queries.len() as u16).to_be_bytes());
103
109
encoder.write(&(self.answers.len() as u16).to_be_bytes());
104
110
encoder.write(&ZERO_U16);
105
-
encoder.write(&ZERO_U16);
111
+
encoder.write(&(self.additional.len() as u16).to_be_bytes());
106
112
107
113
self.queries
108
114
.iter()
109
115
.try_for_each(|query| query.serialize(encoder))?;
110
116
self.answers
117
+
.iter()
118
+
.try_for_each(|answer| answer.serialize(encoder))?;
119
+
self.additional
111
120
.iter()
112
121
.try_for_each(|answer| answer.serialize(encoder))
113
122
}
···
414
423
flags: Flags::standard_response(),
415
424
queries: Vec::new(),
416
425
answers: Vec::new(),
426
+
additional: Vec::new(),
417
427
};
418
428
419
429
let query = Query {
···
446
456
target: Label::from("host.local"),
447
457
}),
448
458
};
449
-
response.answers.push(srv_answer);
459
+
response.additional.push(srv_answer);
450
460
451
461
let txt_answer = Answer {
452
462
name: Label::from("test-service._test._udp.local"),
···
457
467
text: vec!["path=/test"],
458
468
}),
459
469
};
460
-
response.answers.push(txt_answer);
470
+
response.additional.push(txt_answer);
461
471
462
472
let a_answer = Answer {
463
473
name: Label::from("host.local"),
···
468
478
address: Ipv4Addr::new(192, 168, 1, 100),
469
479
}),
470
480
};
471
-
response.answers.push(a_answer);
481
+
response.additional.push(a_answer);
472
482
473
483
let mut buffer = [0u8; 256];
474
484
let mut buffer = Encoder::new(&mut buffer);
+9
-46
sachy-mdns/src/lib.rs
+9
-46
sachy-mdns/src/lib.rs
···
1
1
#![no_std]
2
2
3
-
mod dns;
4
-
pub(crate) mod encoder;
3
+
#[cfg(feature = "client")]
4
+
pub mod client;
5
+
pub mod dns;
6
+
pub mod encoder;
7
+
#[cfg(feature = "server")]
5
8
pub mod server;
6
-
mod service;
7
-
mod state;
9
+
#[cfg(feature = "server")]
10
+
pub mod service;
11
+
#[cfg(feature = "server")]
12
+
pub mod state;
8
13
9
14
extern crate alloc;
10
15
11
16
use core::net::{Ipv4Addr, SocketAddrV4};
12
17
13
-
pub use crate::service::Service;
14
-
pub use crate::state::MdnsAction;
15
-
use crate::{dns::flags::Flags, server::Server, state::MdnsStateMachine};
16
-
17
18
/// Standard port for mDNS (5353).
18
19
pub const MDNS_PORT: u16 = 5353;
19
20
20
21
/// Standard IPv4 multicast address for mDNS (224.0.0.251).
21
22
pub const GROUP_ADDR_V4: Ipv4Addr = Ipv4Addr::new(224, 0, 0, 251);
22
23
pub const GROUP_SOCK_V4: SocketAddrV4 = SocketAddrV4::new(GROUP_ADDR_V4, MDNS_PORT);
23
-
24
-
#[derive(Debug)]
25
-
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
26
-
pub struct MdnsService {
27
-
server: Server,
28
-
state: MdnsStateMachine,
29
-
}
30
-
31
-
impl MdnsService {
32
-
pub fn new(service: Service) -> Self {
33
-
Self {
34
-
server: Server::new(service),
35
-
state: Default::default(),
36
-
}
37
-
}
38
-
39
-
pub fn next_action(&mut self) -> MdnsAction {
40
-
self.state.drive_next_action()
41
-
}
42
-
43
-
pub fn send_announcement<'buffer>(&self, outgoing: &'buffer mut [u8]) -> Option<&'buffer [u8]> {
44
-
self.server.broadcast(
45
-
server::ResponseKind::Announcement,
46
-
Flags::standard_response(),
47
-
1,
48
-
alloc::vec::Vec::new(),
49
-
outgoing,
50
-
)
51
-
}
52
-
53
-
pub fn listen_for_queries<'buffer>(
54
-
&mut self,
55
-
incoming: &[u8],
56
-
outgoing: &'buffer mut [u8],
57
-
) -> Option<&'buffer [u8]> {
58
-
self.server.respond(incoming, outgoing)
59
-
}
60
-
}
+24
-15
sachy-mdns/src/server.rs
+24
-15
sachy-mdns/src/server.rs
···
4
4
use crate::{
5
5
dns::{
6
6
flags::Flags,
7
-
query::{QClass, Query},
7
+
query::{Answer, QClass, Query},
8
8
records::QType,
9
9
reqres::{Request, Response},
10
10
traits::DnsParse,
···
51
51
.collect(),
52
52
};
53
53
54
-
if !answers.is_empty() {
55
-
let res = Response {
56
-
flags,
57
-
id,
58
-
queries,
59
-
answers,
60
-
};
54
+
let additional = match &answers[..] {
55
+
[] => return None,
56
+
[
57
+
Answer {
58
+
atype: QType::PTR,
59
+
aclass,
60
+
..
61
+
},
62
+
] => self.service.as_additional(*aclass).collect(),
63
+
_ => Vec::new(),
64
+
};
61
65
62
-
info!("MDNS RESPONSE: {}", res);
66
+
let res = Response {
67
+
flags,
68
+
id,
69
+
queries,
70
+
answers,
71
+
additional,
72
+
};
63
73
64
-
return Encoder::new(outgoing)
65
-
.encode(res)
66
-
.inspect_err(|err| error!("Encoder errored: {}", err))
67
-
.ok();
68
-
}
74
+
info!("MDNS RESPONSE: {}", res);
69
75
70
-
None
76
+
Encoder::new(outgoing)
77
+
.encode(res)
78
+
.inspect_err(|err| error!("Encoder errored: {}", err))
79
+
.ok()
71
80
}
72
81
73
82
pub(crate) fn respond<'a>(&self, incoming: &[u8], outgoing: &'a mut [u8]) -> Option<&'a [u8]> {
+54
-4
sachy-mdns/src/service.rs
+54
-4
sachy-mdns/src/service.rs
···
5
5
vec::Vec,
6
6
};
7
7
8
-
use crate::dns::{
9
-
label::Label,
10
-
query::{Answer, QClass},
11
-
records::{A, AAAA, PTR, QType, Record, SRV, TXT},
8
+
use crate::{
9
+
dns::{
10
+
flags::Flags,
11
+
label::Label,
12
+
query::{Answer, QClass},
13
+
records::{A, AAAA, PTR, QType, Record, SRV, TXT},
14
+
},
15
+
server::{ResponseKind, Server},
16
+
state::{MdnsAction, MdnsStateMachine},
12
17
};
18
+
19
+
#[derive(Debug)]
20
+
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
21
+
pub struct MdnsService {
22
+
server: Server,
23
+
state: MdnsStateMachine,
24
+
}
25
+
26
+
impl MdnsService {
27
+
pub fn new(service: Service) -> Self {
28
+
Self {
29
+
server: Server::new(service),
30
+
state: Default::default(),
31
+
}
32
+
}
33
+
34
+
pub fn next_action(&mut self) -> MdnsAction {
35
+
self.state.drive_next_action()
36
+
}
37
+
38
+
pub fn send_announcement<'buffer>(&self, outgoing: &'buffer mut [u8]) -> Option<&'buffer [u8]> {
39
+
self.server.broadcast(
40
+
ResponseKind::Announcement,
41
+
Flags::standard_response(),
42
+
1,
43
+
alloc::vec::Vec::new(),
44
+
outgoing,
45
+
)
46
+
}
47
+
48
+
pub fn listen_for_queries<'buffer>(
49
+
&mut self,
50
+
incoming: &[u8],
51
+
outgoing: &'buffer mut [u8],
52
+
) -> Option<&'buffer [u8]> {
53
+
self.server.respond(incoming, outgoing)
54
+
}
55
+
}
13
56
14
57
#[derive(Debug, Default)]
15
58
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
···
126
169
self.ptr_answer(aclass)
127
170
.into_iter()
128
171
.chain(self.srv_answer(aclass))
172
+
.chain(self.txt_answer(aclass))
173
+
.chain(self.ip_answer(aclass))
174
+
}
175
+
176
+
pub(crate) fn as_additional(&self, aclass: QClass) -> impl Iterator<Item = Answer<'_>> {
177
+
self.srv_answer(aclass)
178
+
.into_iter()
129
179
.chain(self.txt_answer(aclass))
130
180
.chain(self.ip_answer(aclass))
131
181
}