Repo of no-std crates for my personal embedded projects

mDNS client helpers, all the pub, feature flagging

Changed files
+249 -131
sachy-mdns
+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
··· 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
··· 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
··· 1 - pub(crate) mod flags; 2 - pub(crate) mod label; 3 - pub(crate) mod query; 4 - pub(crate) mod records; 5 - pub(crate) mod reqres; 1 + pub mod flags; 2 + pub mod label; 3 + pub mod query; 4 + pub mod records; 5 + pub mod reqres; 6 6 pub mod traits;
+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
··· 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
··· 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
··· 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 }