Repo of no-std crates for my personal embedded projects

mDNS client helpers, all the pub, feature flagging

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