mdns-sd
mDNS Service Discovery library with no async runtime dependency
0.21.0
4.4M downloads/mo
#4804 most downloaded on crates.io
keepsimple1/mdns-sd
What this package is like to depend on
Last release 11 days ago
12 Aug 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 76 of 77 stable releases
2 versions withdrawn
withdrawn after publishing
5 years old
79 releases · first in 2021
18 releases in the last 12 months
see the full history below
Release timeline
79 releases · Oct 2021 to Aug 2026Releases
latest 60 of 79-
0.21.012 Aug 2026Release notes
Open source →Breaking changes
- The max outgoing packet size is now 1452 bytes (based on Ethernet MTU), down from 8972 bytes, per RFC 6762 section 17. A record too big for one packet is still sent alone, in a packet of up to the RFC's 9000-byte ceiling, so no record is dropped. Users that need to change the limit can call the new
ServiceDaemon::set_max_packet_size().
New features
- Add
ServiceDaemon::set_max_packet_size()to change the max byte size of outgoing packets on the interfaces matching a givenIfKind. (#487) - Re-export the receiver-side error types
RecvError,RecvTimeoutErrorandTryRecvErrorfromflume, so that a caller can name them without addingflumeas a direct dependency. (#488)
Bug fixes / improvements
- On the receive side, the IPv4 and IPv6 max packet sizes are now tracked separately (8972 and 8952 bytes) so that each stays within the RFC's 9000-byte limit including its own IP header. (#487)
What's Changed
- feat: limit generated packet size per RFC 6762 section 17 by @keepsimple1 in #487
- feat: re-export Receiver error types (#488) by @keepsimple1 in #489
- refactor: extract the code that does cache flush by @keepsimple1 in #490
- chores: prepare for a new release v0.21.0 by @keepsimple1 in #491
Full Changelog: v0.20.3...v0.21.0
Release notes
Open source →Breaking changes
- The max outgoing packet size is now 1452 bytes (Ethernet MTU), down from 8972 bytes,
per RFC 6762 section 17.
A record too big for one packet is still sent alone, in a packet of up to the RFC's
9000-byte ceiling, so no record is dropped. Users that need to change the limit
can call the new
ServiceDaemon::set_max_packet_size().
New features
- Add
ServiceDaemon::set_max_packet_size()to change the max byte size of outgoing packets on the interfaces matching a givenIfKind, and export the new default asMAX_PKT_DEFAULT. (#487, commit82711a8) - Re-export the receiver-side error types
RecvError,RecvTimeoutErrorandTryRecvErrorfromflume, so that a caller can name them without addingflumeas a direct dependency. (#488, commit20c0eac)
Bug fixes / improvements
- On the receive side, the IPv4 and IPv6 max packet sizes are now tracked separately
(8972 and 8952 bytes) so that each stays within the RFC's 9000-byte limit including
its own IP header. (#487, commit
82711a8)
All changes
6bf2bdb 2026-08-09refactor: extract the code that does cache flush (#490) (keepsimple1)20c0eac 2026-08-08feat: re-export Receiver error types (#488) (#489) (keepsimple1)82711a8 2026-08-07feat: limit generated packet size per RFC 6762 section 17 (#487) (keepsimple1)
- The max outgoing packet size is now 1452 bytes (based on Ethernet MTU), down from 8972 bytes, per RFC 6762 section 17. A record too big for one packet is still sent alone, in a packet of up to the RFC's 9000-byte ceiling, so no record is dropped. Users that need to change the limit can call the new
-
0.20.326 Jul 2026Release notes
Open source →This is a small bugfix release.
Bug fixes
- Fix a panic when encoding a name that contains a label longer than 63 bytes. The packet write path now reports an error and skips the offending question or record, instead of asserting. (#484, commit
08362e3)
What's Changed
- fix: Panic in write_utf8 (assert s.len() < 64) by @keepsimple1 in #484
- docs: add RFC 6762 compliance rows for v0.20.2 features by @keepsimple1 in #485
- prepare for release 0.20.3 by @keepsimple1 in #486
Full Changelog: v0.20.2...v0.20.3
Release notes
Open source →This is a small bugfix release.
Bug fixes / improvements
- Fix a panic when encoding a name that contains a label longer than 63 bytes. The packet write path now reports an error and skips the offending question or record, instead of asserting. (#484, commit
08362e3)
All changes
a574e93 2026-07-24docs: add RFC 6762 compliance rows for v0.20.2 features (keepsimple1)08362e3 2026-07-24fix: Panic in write_utf8 (assert s.len() < 64) (#484) (keepsimple1)
- Fix a panic when encoding a name that contains a label longer than 63 bytes. The packet write path now reports an error and skips the offending question or record, instead of asserting. (#484, commit
-
0.20.217 Jul 2026Release notes
Open source →This is a feature and bugfix release focused on improved RFC 6762 compliance.
New features
- Implement RFC 6762 section 6 multicast rate limiting: responses to the same record are rate-limited to no more than once per second on a given interface. (#476, commit
76f42bd) - Delay responses to PTR queries per RFC 6762 section 6, spreading responses over a random 10-50ms (instead of 20-120ms) window to reduce collisions. (#479, commit
a37e959) - Add a random jitter 10-50ms (instead of 20-120ms) before sending the initial query per RFC 6762 section 5.2. (#480, commit
7c55c75)
What's Changed
- feat: Implement RFC 6762 section 6 multicast rate limiting by @keepsimple1 in #476
- fix: space announcement retransmissions wider than the rate-limit window by @keepsimple1 in #477
- feat: delay PTR query responses per RFC 6762 section 6 by @keepsimple1 in #479
- feat: add a jitter for initial query per RFC 6762 section 5.2 by @keepsimple1 in #480
- fix: avoid leaking empty cache entries for records not for us by @keepsimple1 in #481
- prepare for a new release v0.20.2 by @keepsimple1 in #482
Full Changelog: v0.20.1...v0.20.2
Release notes
Open source →This is a feature and bugfix release focused on improved RFC 6762 compliance.
New features
- Implement RFC 6762 section 6 multicast rate limiting: responses to the same record are rate-limited to no more than once per second on a given interface. (#476, commit
76f42bd) - Delay responses to PTR queries per RFC 6762 section 6, spreading responses over a random 10-50ms (instead of 20-120ms) window to reduce collisions. (#479, commit
a37e959) - Add a random jitter 10-50ms (instead of 20-120ms) before sending the initial query per RFC 6762 section 5.2. (#480, commit
7c55c75)
Bug fixes / improvements
- Space announcement retransmissions wider than the rate-limit window so that repeated announcements are not dropped. (#477, commit
6f39a46) - Avoid leaking empty cache entries for records that are not for us. (#481, commit
5cfa13a)
All changes
5cfa13a 2026-07-15fix: avoid leaking empty cache entries for records not for us (#481) (keepsimple1)7c55c75 2026-07-14feat: add a jitter for initial query per RFC 6762 section 5.2 (#480) (keepsimple1)a37e959 2026-07-12feat: delay PTR query responses per RFC 6762 section 6 (#479) (keepsimple1)6f39a46 2026-07-08fix: space announcement retransmissions wider than the rate-limit window (#477) (keepsimple1)76f42bd 2026-07-07feat: Implement RFC 6762 section 6 multicast rate limiting (#476) (keepsimple1)
- Implement RFC 6762 section 6 multicast rate limiting: responses to the same record are rate-limited to no more than once per second on a given interface. (#476, commit
-
0.20.127 Jun 2026Release notes
Open source →This is a small feature and maintenance release.
New features
- Add
IfKind::Predicateand a newIfPredicatetype, allowing interfaces to be selected with a custom predicate function (e.g. matching by interface name pattern). (#474, commitfd72146)
What's Changed
- chore(deps): update by @CosminPerRam in #454
- Add
IfPredicatefor more flexible interface filtering by @MAlba124 in #474 - prepare for a new release 0.20.1 by @keepsimple1 in #475
New Contributors
Full Changelog: v0.20.0...v0.20.1
Release notes
Open source →This is a small feature and maintenance release.
New features
- Add
IfKind::Predicateand a newIfPredicatetype, allowing interfaces to be selected with a custom predicate function (e.g. matching by interface name pattern). (#474, commitfd72146)
Other changes
- chore(deps): update dependencies. (#454, commit
06bdad1)
All changes
fd72146 2026-06-22AddIfPredicatefor more flexible interface filtering (#474) (MAlba124)06bdad1 2026-06-16chore(deps): update (#454) (CosminPerRam)
Thanks and welcome our new contributor @MAlba124 !
- Add
-
0.20.025 May 2026Release notes
Open source →This release contains a small breaking change in the optional
serdefeature, hence the minor version bump.Breaking changes
- Remove
#[serde(untagged)]fromScopedIp. The serialized form ofScopedIpnow includes its enum variant tag (V4/V6), which improves compatibility with binary serde formats (e.g. MessagePack). Only affects users of the optionalserdefeature. (#472, commit5fa4b92)
What's Changed
- Fix ScopedIp serialization with MessagePack by @rabbit-time in #472
- tests: remove explicit random port assignment by @CosminPerRam in #455
- Prepare for a new release 0.20.0 by @keepsimple1 in #473
Full Changelog: v0.19.2...v0.20.0
Release notes
Open source →This release contains a small breaking change in the optional
serdefeature, hence the minor version bump.Breaking changes
- Remove
#[serde(untagged)]fromScopedIp. The serialized form ofScopedIpnow includes its enum variant tag (V4/V6), which improves compatibility with binary serde formats (e.g. MessagePack). Only affects users of the optionalserdefeature. (#472, commit5fa4b92)
Other changes
- tests: remove explicit random port assignments.
- chore: remove an unused dev-dependency.
All changes
fee8ab7 2026-05-24remove unused dev-dependency (keepsimple1)e745a2f 2026-05-23tests: remove explicit port random assignments (#455) (CosminPerRam)5fa4b92 2026-05-22Remove untagged attribute from ScopedIp (#472) (Rascal)
- Remove
-
0.19.217 May 2026Release notes
Open source →This is a bugfix and small-feature release.
New features
- Support RFC 6762 legacy unicast responses: when a query arrives from a source port other than
5353, the daemon now replies directly to the querier's address/port instead of multicasting. This enables interoperability with one-shot / legacy mDNS queriers. (#469, commit933bdbe) - Added a new
Error::DaemonShutdownvariant, returned byServiceDaemonmethods after the daemon thread has exited (previously surfaced as a genericError::Msg). TheErrorenum is#[non_exhaustive], so this is additive. (commita457193)
Bug fixes / improvements
- Optimize outgoing DNS serialization to reduce allocations on the send path. (#467, commit
fb26d7f) - Replace a stray
println!inDnsHostInfo::writewithdebug!, so the library no longer writes to stdout. (#465, commit96008a4) - Expanded
# Errorsdoc sections on the majorServiceDaemonAPIs (new,new_with_port,browse,stop_browse,resolve_hostname,stop_resolve_hostname,register,unregister), documenting whenError::Againvs.Error::DaemonShutdownis returned. (#464, commita457193)
What's Changed
- Replace println with debug log by @anti-social in #465
- docs: add doc comments for error handling on major APIs by @keepsimple1 in #464
- Optimize dns outgoing serialization by @anti-social in #467
- Add support for RFC 6762 legacy unicast responses by @luqs1 in #469
- prepare for a new release 0.19.2 by @keepsimple1 in #470
- doc: update README.md for 0.19.2 by @keepsimple1 in #471
New Contributors
- @anti-social made their first contribution in #465
- @luqs1 made their first contribution in #469
Thanks and welcome!
Full Changelog: v0.19.1...v0.19.2
Release notes
Open source →This is a bugfix and small-feature release.
New features
- Support RFC 6762 legacy unicast responses: when a query arrives from a source port other than
5353, the daemon now replies directly to the querier's address/port instead of multicasting. This enables interoperability with one-shot / legacy mDNS queriers. (#469, commit933bdbe) - Added a new
Error::DaemonShutdownvariant, returned byServiceDaemonmethods after the daemon thread has exited (previously surfaced as a genericError::Msg). TheErrorenum is#[non_exhaustive], so this is additive. (commita457193)
Bug fixes / improvements
- Optimize outgoing DNS serialization to reduce allocations on the send path. (#467, commit
fb26d7f) - Replace a stray
println!inDnsHostInfo::writewithdebug!, so the library no longer writes to stdout. (#465, commit96008a4) - Expanded
# Errorsdoc sections on the majorServiceDaemonAPIs (new,new_with_port,browse,stop_browse,resolve_hostname,stop_resolve_hostname,register,unregister), documenting whenError::Againvs.Error::DaemonShutdownis returned. (#464, commita457193)
All changes
933bdbe 2026-05-15Add support for RFC 6762 legacy unicast responses (#469) (Luqmaan)fb26d7f 2026-04-30Optimize dns outgoing serialization (#467) (Alexander)a457193 2026-04-28docs: add doc comments for error handling on major APIs (#464) (keepsimple1)96008a4 2026-04-28Replace println with debug log (#465) (Alexander)
Thanks and welcome our new contributors @luqs1 and @anti-social !
- Support RFC 6762 legacy unicast responses: when a query arrives from a source port other than
-
0.19.120 Apr 2026Release notes
Open source →Version 0.19.1 (2026-04-19)
This is a bugfix release.
Bug fixes
- When responding to a query, pick a source IP that matches the querier's subnet, so responses are reachable on multi-homed hosts. (#460, commit
d210372) - Validate TXT property length in the
ServiceInfoconstructor, catching oversized properties at registration time instead of at send time. (#458, commitcc81eec)
What's Changed
- fix: check TXT property length in ServiceInfo constructor by @keepsimple1 in #458
- fix: use a source IP matching the querier's subnet when responding by @keepsimple1 in #460
- prepare for release 0.19.1 by @keepsimple1 in #461
Full Changelog: v0.19.0...v0.19.1
Release notes
Open source →This is a bugfix release.
Bug fixes
- When responding to a query, pick a source IP that matches the querier's subnet, so responses are reachable on multi-homed hosts. (#460, commit
d210372) - Validate TXT property length in the
ServiceInfoconstructor, catching oversized properties at registration time instead of at send time. (#458, commitcc81eec)
All changes
d210372 2026-04-18fix: use a source IP matching the querier's subnet when responding (#460) (keepsimple1)cc81eec 2026-04-12fix: check TXT property length in ServiceInfo constructor (#458) (keepsimple1)
- When responding to a query, pick a source IP that matches the querier's subnet, so responses are reachable on multi-homed hosts. (#460, commit
-
0.19.004 Apr 2026Release notes
Open source →Breaking changes
ScopedIpV4now carriesinterface_idstracking which network interfaces discovered the address. The derivedEq/Hashnow includes interface_ids, so twoScopedIpV4values with the same IP but different interface lists are no longer equal. (commits 43bd8f3, 0661bf1, 247447b)
New features
- New optional
serdefeature: adds Serialize/Deserialize onInterfaceId,ScopedIpV4,ScopedIpV6,ScopedIp,TxtProperties,TxtProperty, andResolvedService. (commit c2c2f75) - New public APIs:
ScopedIpV4::new(),ScopedIpV4::interface_ids(),InterfaceId::get_addrs().
Bug fixes
- Avoid known-answer suppression when querying on a new interface, so address records are discovered promptly. (commit 468c5ee)
- Track modified instances when removing records from an interface, so ServiceResolved events reflect updated addresses. (commit 7daa1d4)
What's Changed
- add interface_id in ScopedIpV4 by @keepsimple1 in #439
- Serde Deserialize+Serialize implementation by @rabbit-time in #440
- refactoring: ScopedIpV4 to use multiple InterfaceIds by @keepsimple1 in #444
- fix: ScopedIp considered Eq when interface_ids change by @keepsimple1 in #446
- fix: track modified_instances when removing an interface by @keepsimple1 in #448
- fix: avoid known-answer suppression when querying on a new interface by @keepsimple1 in #450
- refactoring: move add_answer_with_additionals into struct DnsOutgoing by @keepsimple1 in #451
- refactoring: simplify handle_query by @keepsimple1 in #452
- Release: bump version to 0.19.0 by @keepsimple1 in #453
New Contributors
- @rabbit-time made their first contribution in #440 Thank you and welcome!
Full Changelog: v0.18.2...v0.19.0
Release notes
Open source →Breaking changes
ScopedIpV4now carriesinterface_idstracking which network interfaces discovered the address. The derivedEq/Hashnow includesinterface_ids, so twoScopedIpV4values with the same IP but different interface lists are no longer equal. (commits43bd8f3,0661bf1,247447b)
New features
- New optional
serdefeature: addsSerialize/DeserializeonInterfaceId,ScopedIpV4,ScopedIpV6,ScopedIp,TxtProperties,TxtProperty, andResolvedService. (commitc2c2f75) - New public APIs:
ScopedIpV4::new(),ScopedIpV4::interface_ids(),InterfaceId::get_addrs().
Bug fixes
- Avoid known-answer suppression when querying on a new interface, so address records are discovered promptly. (commit
468c5ee) - Track modified instances when removing records from an interface, so
ServiceResolvedevents reflect updated addresses. (commit7daa1d4)
All changes
3903f09 2026-04-04refactoring: simplify handle_query (#452) (keepsimple1)b6ddc18 2026-04-04refactoring: move add_answer_with_additionals into struct DnsOutgoing (#451) (keepsimple1)468c5ee 2026-04-03fix: avoid known-answer suppression when querying on a new interface (#450) (keepsimple1)7daa1d4 2026-04-01fix: track modified_instances when removing records from an interface (#448) (keepsimple1)247447b 2026-03-26fix: ScopedIp considered Eq when interface_ids change (#446) (keepsimple1)0661bf1 2026-03-24refactoring: ScopedIpV4 to use multiple InterfaceIds (#444) (keepsimple1)c2c2f75 2026-03-15Serde Deserialize+Serialize implementation (#440) (Rascal)43bd8f3 2026-03-13add interface_id in ScopedIpV4 (#439) (keepsimple1)
Thanks and welcome our new contributor @Rascal !
-
0.18.211 Mar 2026Release notes
Open source →What's Changed
A bugfix: refresh of address records didn't work when hostname is not lowercase.
All changes
- fix: Refresh of A and AAAA records by @hrzlgnm in #441
- bump up version to 0.18.2 by @keepsimple1 in #442
Full Changelog: v0.18.1...v0.18.2
Release notes
Open source →- A bugfix: refresh of address records didn't work when hostname is not lowercase.
All changes
ec1e733 2026-03-11fix: Refresh of A and AAAA records (#441) (hrzlgnm)
-
0.18.128 Feb 2026Release notes
Open source →What's Changed
- A bugfix for
disable_interfacewith an IPv4 address: clarified that the semantics is to disable IPv4 on the interface identified by the IPv4 address. - Added new variants for
IfKindenum:IndexIPV4(u32)andIndexIPV6(u32).
All changes
- fix(test): use all IPv4 interfaces in test_disable_interface_cache by @keepsimple1 in #435
- bump up version to 0.18.1 by @keepsimple1 in #436
Full Changelog: v0.18.0...v0.18.1
Release notes
Open source →- A bugfix for
disable_interfacewith an IPv4 address: clarified that the semantics is to disable IPv4 on the interface identified by the IPv4 address. - Added new variants for
IfKindenum:IndexIPV4(u32)andIndexIPV6(u32).
All changes
7e04122 2026-02-28fix(test): use all IPv4 interfaces in test_disable_interface_cache (#435) (keepsimple1)
- A bugfix for
-
0.18.015 Feb 2026Release notes
Open source →A few new features, documentation enhancements and breaking changes.
Breaking changes
- Removed one default feature:
reuseport. It is handled transparently now. (see commit58bc8c5) - New feature: support
.and\in instance names (see commit3481b94) - New internal fix: proper cleanup on daemon shutdown (see commit
8d24304) - New internal fix: exclude point-to-point interfaces by default (e.g. tunnel interface) (see commit
85b6cd9)
All changes
b694333 2026-02-12Added documentation about service name length (FelixSelter)85b6cd9 2026-02-10fix for macOS: exclude IFF_POINTTOPOINT interfaces and exclude Apple P2P interfaces by default (#425) (keepsimple1)58bc8c5 2026-02-09fix: invert reuseport feature (#430) (keepsimple1)8d24304 2026-02-07feat: add proper cleanup on daemon shutdown (#421) (Thibaut M.)69418d6 2026-02-05chore: update some comments (#429) (keepsimple1)3481b94 2026-02-06feat: implement RFC 6763 Section 4.3 escaping for instance names (#420) (Thibaut M.)58c15b4 2026-01-27fix: only add a scope in Display to unicast link local v6 addresses (#424) (hrzlgnm)3f34136 2026-01-24Return errors from send_dns_outgoing (#419) (keepsimple1)0e323f6 2026-01-21ci: update github action checkout (#422) (Thibaut M.)
Thanks and welcome new contributors: @thibaut-pascal, @FelixSelter
- Removed one default feature:
-
0.17.217 Jan 2026Release notes
Open source →New features (non-breaking)
A new 'feature' literally: a default feature
reuseportto control if SO_REUSEPORT should be used. Useful for old Linux kernels (before 3.9).All changes
466d373 2026-01-15feat: addreuseportfeature (#414) (Hanssen)1770d01 2025-12-31exmaples: add --verify option in the query example (#412) (keepsimple1)
Thanks and welcome our new contributor @Hanssen0 !
-
0.17.106 Dec 2025Release notes
Open source →New features (non-breaking)
ServiceDaemon::new_with_port(port: u16)allows using a custom port for mainly development / testing purposes.All changes
9088f8b 2025-12-04feat: use Self on impl return of itself for RRType (#409) (CosminPerRam)91b3e66 2025-12-02Add a custom port option (#408) (Kaido Kert)3e7a582 2025-11-30handle empty return from send_dns_outgoing (#407) (keepsimple1)
Thanks and welcome our new contributor @kaidokert !
-
0.17.007 Nov 2025Release notes
Open source →Breaking changes
Loopback interfaces are enabled by default now. The main reason is that some user reported a failure of publishing services locally. I think this change probably only impacts very few.
New features
A couple of new APIs are added for
ServiceInfo:set_interfacesandset_link_local_onlybased on some real world use cases.All changes
6752eaf 2025-11-04feat: service registration with granular iface/ip conditions (#398) (twizansk)7293e7c 2025-11-02Enable loopback interfaces by default (#397) (keepsimple1)505bd71 2025-11-02Fix clippy for tests and remove unnecessary tests (#403) (keepsimple1)
-
0.16.030 Oct 2025Release notes
Open source →A bugfix release. But we also bumped up rustc MSRV to 1.71.0, hence bumping our own minor version.
All changes
6c01cf6 2025-10-27Handle IPv6 disabled in kernel (#396) (keepsimple1)b15c4c3 2025-10-23log the interface name when joining multicast group (#394) (keepsimple1)382521c 2025-10-15refactoring only: make resolve_updated_instances easier to understand (#393) (keepsimple1)
-
0.15.227 Jan 2026Nothing published for this version
-
0.15.106 Sep 2025Release notes
Open source →New feature: cache only browsing. Check out the new methods
browse_cacheandaccept_unsolicited.All changes
3f6d6e9 2025-09-04feat: support cache only browsing (#388) (twizansk)
Thanks and welcome our new contributor @twizansk !
-
0.15.001 Sep 2025Release notes
Open source →Breaking changes
ServiceEvent::ServiceDatais merged back withServiceResolved(i.e. replacing it). The end result is: we have a singleServiceEvent::ServiceResolved(ResolvedService)going forward.
Hence, a service is respresented by
ResolvedServiceon the client side, and byServiceInfoon the server side.And
user_service_data()is no longer needed and removed.Sorry about the confusions but I think this helps for the long term. I think / hope the required code changes are minimal for most users.
All changes
221e0be 2025-08-29feat: impl AsIpAddrs for Box<dyn AsIpAddrs> (#387) (Jean-Gab)f88fae1 2025-08-27merge ServiceData with ServiceResolved (#386) (keepsimple1)
Thanks our new contributor @Jean-Gab, welcome!
-
0.14.121 Aug 2025Release notes
Open source →This is a bugfix release with only a doc comments change.
ec4fb9a 2025-08-18doc: add a missing line in doc code example (#384) (keepsimple1)
-
0.14.011 Aug 2025Release notes
Open source →Breaking changes
ServiceEvent::ServiceDatato support IPv6 with scope_id. It will deprecateServiceEvent::ServiceResolved.
Users must call
ServiceDaemon.use_service_datato useServiceDatainstead ofServiceResolvedevent.HostnameResolutionEvent::AddressesFounduses the newScopedIpinstead ofIpAddr.ServiceEventisnon_exhaustivenow.
Other hightlights
- Internal: define
MyUdpSocketthat uses PKTINFO. It also prepares for supporting unicast. - Internal: define
MyIntfto better handle multiple addresses on an interface. - A few bugfixes.
123ecba 2025-08-08rename HostIp to ScopedIp (#382) (keepsimple1)0c9395f 2025-08-07rename ServiceDetailed to ServiceData (#381) (keepsimple1)52cc67c 2025-08-06refactoring: define our own interface struct to allow multiple addresses (#380) (keepsimple1)1b194de 2025-08-01feat: Remove unneeded multicast send tracking (#377) (hrzlgnm)8cb1a59 2025-07-30refactoring only: move run into ZeroConf (#376) (keepsimple1)2eddad3 2025-07-30ServiceEvent: add non_exhaustive and fix clippy (#375) (keepsimple1)0d6ba35 2025-07-28bugfix: remove duplicated address record for IPv6 on a wrong interface (#373) (keepsimple1)45b3cdd 2025-07-16fix repetitive ServiceRemoved and Resolve again after interface up (#371) (keepsimple1)eb90591 2025-07-13Exclude interfaces that are operational down (#369) (keepsimple1)1103ab2 2025-07-08feat: new API to use ResolvedService instead of ServiceInfo for resolved service event (#362) (keepsimple1)
-
0.13.1108 Jul 2025Release notes
Open source →This is a small bugfix release before we add potential breaking changes.
8b221d2 2025-06-22deriveCloneforServiceEventandHostnameResolutionEvent(#366) (Shadowcat650)
Welcome our new contributor @Shadowcat650 !
-
0.13.1022 Jun 2025Release notes
Open source →This is a bugfix release.
14841ac 2025-06-21add comments for setting TTL (#364) (keepsimple1)3db5e1b 2025-06-17bugfix: set multicast TTL to 255 (#361) (Sameer Puri)22a2688 2025-05-20doc: add a section for Conflict resolution (#359) (keepsimple1)60888b7 2025-05-13Refactoring only: extract parts of probing_handler into functions (#357) (keepsimple1)db2f484 2025-05-11bugfix: not to resolve records that expires soon (#353) (keepsimple1)
Welcome our new contributor @sameer !
-
0.13.904 May 2025Release notes
Open source →This is a bugfix release.
a734dd2 2025-05-02bugfix: refresh TXT when needed (#354) (keepsimple1)51c03c3 2025-05-01bugfix: TXT records should use OTHER_TTL same as PTR (#355) (keepsimple1)07750cb 2025-04-25bugfix: only remove a service instance if all its SRV are gone (#350) (keepsimple1)
-
0.13.823 Apr 2025Release notes
Open source →This is a bugfix release that also prepares for adding InterfaceId in resolved service info.
2d49195 2025-04-22bugfix: should keep A records for hostname queriers (#348) (keepsimple1)fe08df1 2025-04-22bump up version to 0.13.8 (#347) (keepsimple1)f6c7e80 2025-04-22feat: extendDnsAddresswith anInterfaceId(#342) (hrzlgnm)513372d 2025-04-20remove address filter for multicast loopback (#346) (keepsimple1)
-
0.13.716 Apr 2025Release notes
Open source →This is a bugfix release that further reduces the memory footprint of DNS cache.
a6a0961 2025-04-15optimization: remove cache entries when stop_browse (#344) (keepsimple1)
-
0.13.608 Apr 2025Release notes
Open source →This is a bugfix release that reduces / limits the memory footprint of the cached records and timers.
5fa1b31 2025-04-07optimization: remove expired timers and skip DNS datagrams that are not for us (#338) (keepsimple1)3e3aec9 2025-03-29refactoring: make tiebreaking more modular (#336) (keepsimple1)
-
0.13.526 Mar 2025Release notes
Open source →This is a patch fix release as the previous release (0.13.4) was broken in service resolution.
e65757f 2025-03-26bugfix: makeget_addrmethod use lowercase hostname (#332) (Justus K)
Thanks @Stupremee for the fix and welcome!
-
0.13.425 Mar 2025 withdrawnRelease notes
Open source →Highlights
- New API for host IP check:
ServiceDaemon::set_ip_check_intervalandServiceDaemon::get_ip_check_interval. - Bugfixes.
All changes
e64c0d4 2025-03-24bugfix: hostname resolution should be case insensitive (#330) (keepsimple1)5e4df27 2025-03-19bugfix: when now equals next_ip_check (#328) (keepsimple1)9538120 2025-03-12examples: support logfile in the register example (#326) (keepsimple1)8422690 2025-03-13chore(deps): update fastrand and socket2 (#324) (CosminPerRam)dd2d868 2025-03-07feat: add boxed in DnsRecordExt to reduce Box::new usage (#323) (CosminPerRam)3ea6cf1 2025-03-05Detect IP changes: reduce the interval (#313) (keepsimple1)7feabc9 2025-03-04feat: handle DnsIncoming IPv4, 6 and String read parsing errors (#309) (CosminPerRam)
- New API for host IP check:
-
0.13.302 Mar 2025Release notes
Open source →Highlights
TxtProperties: Supportinto_property_map_str.- For querier: a new struct
ResolvedServicethat can be created fromServiceInfo. - Support a service to publish using loopback interfaces via
enable_interface. - Bugfixes.
All changes
3e6842f 2025-02-28enable_interface: support loopback interface (#317) (keepsimple1)7e77a5e 2025-02-26fix: remove related addresses in the cache when disabling an interface (#316) (keepsimple1)735fb22 2025-02-22refactoring: move handle_poller_events into Zeroconf impl (#315) (keepsimple1)e886787 2025-02-20ci: add doc check and fail if there are any warnings (#310) (CosminPerRam)9d92545 2025-02-18refactoring: make e_fmt! available within the crate (#311) (keepsimple1)4b671d4 2025-02-14ResolvedService: a new plain struct for attributes of a service (#302) (keepsimple1)349de66 2025-02-13fix: include loopback addresses in filtering criteria (#306) (Minetake)026a745 2025-02-09refactoring: property length check (#305) (keepsimple1)818f37c 2025-02-10TXT record: docs to remind users of the maximum length of the attribute. (#304) (Lazy Panda)fba8025 2025-02-09TxtProperties: new method to get a HashMap of properties (#303) (keepsimple1)
-
0.13.203 Feb 2025Release notes
Open source →This is a bugfix release.
All changes
- 4288190 check any match for address records in conflict handler (#294) (keepsimple1)
- b51f67d unit test: fix a timing issue (#292) (keepsimple1)
- 7afed98 bugfix: check data len for NSEC record (#291) (keepsimple1)
-
0.13.117 Dec 2024Release notes
Open source →This is a bugfix release. Fixed a bug where upper case service names failed to publish.
All changes
- 71647a1 test: cover upper case in service name (#288) (keepsimple1)
- 6ff9b52 fix: service keys must be lowercase (#286) (Jesper L. Nielsen)
-
0.13.016 Dec 2024Release notes
Open source →There are no breaking changes in API. Bump the minor version due to the change of rustc version to Rust 1.70.0.
Highlights
- Use
mioinstead ofpollingto poll sockets. - New API
set_multicast_loop_v4andset_multicast_loop_v6ofServiceDaemon. - All logging are updated to be
debugortracelevels only.
All changes
- 489ef5a test: fix a flaky test (#283) (keepsimple1)
- 1ddae63 feat: new API to set multicast loop for ServiceDaemon (#281) (keepsimple1)
- fcd31f3 dependency: use mio to replace polling (#280) (keepsimple1)
- 99483b7 reduce logging levels (#277) (keepsimple1)
- Use
-
0.12.024 Nov 2024Release notes
Open source →There are no breaking changes in API. Bump the minor version due to new features and the change of rustc version.
Highlights
- Support name probing and conflict resolution RFC 6762
- Support service liveness checking via
verifyAPI. RFC 6762 - rustc version changed to 1.65.0
- performance improvements and doc updates.
All changes
- 7f6c5e9 perf: avoid cloning in filtering ptr (#272) (CosminPerRam)
- e185d6f refactoring: define an enum for DNS resource record types (#274) (keepsimple1)
- d117f4f refactoring: move exec_command into Zeroconf (#273) (keepsimple1)
- 39acd80 feat: replace remaining Box<dyn DnsRecordExt> with type (#271) (CosminPerRam)
- b50fe8c perf: optimize u8_slice_to_hex by replacing Vec with String (#270) (CosminPerRam)
- db545b1 doc: some spelling fixes (#269) (CosminPerRam)
- 7328f45 doc: add a table of RFC compliance details (#268) (keepsimple1)
- 1ade666 feat: verify to support Cache Flush on Failure Indication (#267) (keepsimple1)
- 8b63fd7 feat: support name probing and conflict resolution (#265) (keepsimple1)
- 429ecde dev-test: enhance test case for ipv4 only auto addr (#263) (keepsimple1)
- f902cf2 register service: apply interface selection for auto IP addr (#262) (keepsimple1)
- 0381e30 dns_cache: address record should only flush on the same network (#261) (keepsimple1)
-
0.11.528 Sep 2024Release notes
Open source →This is a bugfix release.
All changes
- 2829d8e tests: fix remove addr test (#258) (keepsimple1)
- 4f58e2f dns_parser: check against potential name compression loop (#257) (keepsimple1)
-
0.11.412 Sep 2024Release notes
Open source →Bugfixes. Added checks for corrupted RR data to prevent unnecessary panics. Thanks for new contributor @rise0chen !
Sorry that this release has a few merged small commits as I didn't know how to properly merge in a PR that targets a fetaure branch used in another PR, instead of
mainbranch.All changes
- e54485e add --verbose in CI test run (#254) (keepsimple1)
- f0c4c27 remove fastrand dependency from dev-test (#252) (keepsimple1)
- dff1596 Merge pull request #250 from keepsimple1/rdata-check (keepsimple1)
- 659e684 fix cargo clippy warning (keepsimple1)
- 90a2f12 Merge pull request #251 from rise0chen/rdata-check (keepsimple1)
- 6d51f55 Merge branch 'rdata-check' into rdata-check (keepsimple1)
- 1b2cf40 add a check for rr data len (keepsimple1)
- a5de799 feat: test random data (rise0chen)
- 40698a3 add test case and simplify DnsTxt::new (keepsimple1)
- fc489bd refactoring error log (keepsimple1)
- a3fad8e add a check for rr data len (keepsimple1)
-
0.11.324 Aug 2024Release notes
Open source →A release of bugfixes and refactorings.
All changes
- 3292110 DnsTxt debug print: make its text field human-readable (#247) (keepsimple1) (2024-08-21)
- 5567c1f Send SearchStarted events with addrs as
ip (intf-name)(#245) (hrzlgnm) (2024-08-22) - 9a91a53 cache flush: add the missing timer for updated expires (#244) (keepsimple1) (2024-08-19)
- c1d7efa Change intf_socks to a map of (Interface, Socket) (#242) (keepsimple1) (2024-08-18)
- 404100d refactor out a common method for DnsRecordExt (#241) (keepsimple1) (2024-08-18)
- f055c78 Refresh A and AAAA records of active
.browsequeriers (#240) (hrzlgnm) (2024-08-17) - 0453030 Avoid redundant query, announcement and unregistration overhaul (#239) (hrzlgnm) (2024-08-16)
-
0.11.210 Aug 2024Release notes
Open source →Mostly a bugfix and refactoring release, with limited support added for:
- Known Answer Suppression (RFC 6762 section 7.1 and 7.2):
- single packet for querier and responder,
- multi-packet for querier.
All changes
- 92eae74 add support for Known Answer Suppression part 2: multi-packet: querier side (#232) (keepsimple1)
- ada3486 fix test integration_success: respond count or known answer suppression count (#237) (keepsimple1)
- 8106d07 Skip link local addresses while checking for redundant announcements or query packets (#235) (hrzlgnm)
- b1a173a check data length in read_u16 (#234) (keepsimple1)
- d1c9157 Add sanity check for service type domain suffix in browse (#231) (keepsimple1)
- 736bec6 enable DEBUG logging for a failed test in CI (#229) (keepsimple1)
- fd00210 add logs in test to debug CI failure (#228) (keepsimple1)
- 5e0f1d3 add support for Known Answer Suppression part 1 (#227) (keepsimple1)
- 5ae18a6 refactoring: remove Send for DnsRecordBox (#226) (keepsimple1)
- d7d4867 fix integration_success test (#223) (keepsimple1)
- 6f34f1c move DnsCache into its own module (#221) (keepsimple1)
- bcdc2f9 add welcome to our new contributor (#220) (keepsimple1)
- Known Answer Suppression (RFC 6762 section 7.1 and 7.2):
-
0.11.114 May 2024Release notes
Open source →Highlights
- Start to honor cache flush bit.
- Improved cache refresh logic.
- Code refactorings.
- And a few bugfixes.
All changes
- 098f2df move unit tests into integration test (#218)
- 80291ba refresh PTR records (#217)
- 5eb74b5 refactoring: extract details from exec_command into own functions (#215)
- 551ed4d Bugfix: AddressesRemoved missing actual addrs (#210)
- 3c924f4 Bugfix: cache flush properly (#211)
- ccdae2d Bugfix: logging feature cannot be disabled (#212)
- 626f9fa refresh SRV records and send out ServiceRemoved for expired SRV (#180)
- 06e2cf7 feat: merge match same arms (#209)
- bf5cea3 perf: in adding answers, use static dispatch instead of dynamic dispatch (#207)
- 19d2161 feat: extract match addr to type as a function (#205)
- 5bdcdd6 feat: remove clone derive from counter (#208)
- e7fc0e0 feat: replace box dns with declared type (#206)
- 5732665 feat: apply nursery lints (#202)
- 16cb5cd feat: honor cache flush (#201)
Welcome our new contributor: @lyager ! Thanks!
-
0.11.022 Apr 2024Release notes
Open source →Breaking changes
- Now
ServiceDaemon::register()requireshostnameto end with ".local."
New features
- Support resolving hostnames directly:
ServiceDaemon::resolve_hostname()
All changes
- example code: refactor the query output prints and the register hostname (#189)
- support multiple questions in send_query_vec (#194)
- CI: fix a test waiting for IPv6 addr (#195)
- Add support for resolving non-service hostnames (#192)
- zeroconf: use min heap for timers (#196)
- Fix flaky test (#198)
- enable logging for examples and add doc for logging (#199)
Welcome our new contributor: @oysteintveit-nordicsemi ! Thanks!
- Now
-
0.10.525 Mar 2024Release notes
Open source →Notes
- Port 0 is now considered valid in ServiceInfo (#181)
Changes
- reduce SearchStopped notification send error to warn (#178)
- refactoring: extract handle_poller_events() (#177)
- Do not consider port 0 as a missing info (#181)
- query TYPE_A and TYPE_AAAA via Command::Resolve (#185)
- bump socket2 version (#174)
- add NSEC record to debug resolve issue (#183)
Welcome our new contributors: @hrzlgnm and @irvingoujAtDevolution ! Thanks!
-
0.10.411 Feb 2024Release notes
Open source →This is a bug fix release.
Changes
- Add sanity checks in DNS message decoding (#169)
- fine-tune MAX_MSG_ABSOLUTE (#170)
-
0.10.314 Jan 2024Release notes
Open source →This is a bug fix release.
Changes
- netmask -> subnet (#164)
Welcome our new contributor @amfaber ! Thanks!
-
0.10.228 Dec 2023Release notes
Open source →This is a bug fix release.
Changes
- use human-readable address in error log of send_packet (#155)
- query for unresolved instances only when needed (#157)
- Fix panic due to range out of bounds in txt record parsing (#159)
- Sanity check for empty service type name (#160)
- Added comment for updating service info by re-registering.
Welcome our new contributor @Raphiiko ! Thanks!
Happy new year 2024!
-
0.10.103 Dec 2023Release notes
Open source →This is a bug fix release.
Changes
- update flume to 0.11 (#152)
- bugfix: signal event key is possible to overlap with socket poll ids (#153)
-
0.10.028 Nov 2023Release notes
Open source →Breaking changes
ServiceDaemon::shutdown()return type changed fromResult<()>toResult<Receiver<DaemonStatus>>(#149)
Other changes
- Related to the breaking change, a client can receive
DaemonStatusto be sure the daemon is shutdown. - A new enum
DaemonStatusand a new APIServiceDaemon::status()are introduced. - Updated CI in GitHub Actions: replace
actions-rswithdtolnay/rust-toolchain.
-
0.9.301 Nov 2023Release notes
Open source →This is a bugfix release.
- apply interface selections when IP addresses change (#142)
- Remove un-necessary panic (#144)
- Always include subtype info if exists (#146)
p.s. Happy Halloween!
-
0.9.224 Oct 2023Release notes
Open source →The release includes a bugfix, thanks to @Mornix !
- fix PTR expiration from preventing later service resolution (#140)
- updated doc comments for
DnsCache::add_or_update.
-
0.9.119 Oct 2023Release notes
Open source →There are no breaking changes.
- support interface selection (#137)
Added two new methods for
ServiceDaemon:enable_interfaceanddisable_interface, and some refactoring. -
0.9.015 Oct 2023Release notes
Open source →- Ssupports IPv6 (#130) (Thanks to @izissise)
- ServiceInfo: support get_addresses_v4 (#132)
- bugfix: set address type correctly (#134)
This is a breaking change, including:
- Trait
AsIpv4Addrschanges toAsIpAddrsto support both IPv4 and IPv6. ServiceInfo::new()uses the newAsIpAddrstrait.ServiceInfo::get_addresses()returns both IPv4 and IPv6 addresses, while a new convenience methodget_addresses_v4returns IPv4 only.
But in general, because the trait hides away details, the user code is likely keeping working without code changes.
Improvements:
- avoid redundant annoucement or query packets (#135)
-
0.8.104 Oct 2023 -
0.8.001 Oct 2023Release notes
Open source →No breaking changes in API. This release brings two potential user-visible changes:
- use UDP socket to signal the daemon for commands. (#125)
This change reduces CPU utilization of the daemon thread as well as its latency to the user commands. Internally it uses local UDP sockets to signal the daemon.
- Added the link-local feature to if_addrs in Cargo.toml to enable link-local interfaces in Windows. (#126)
This change makes link-local interfaces visible to users in Windows where they didn't show up previously.
-
0.7.521 Sep 2023Release notes
Open source →- Revert the changes in v0.7.4 and support link-local addrs alongside routable addrs. (#122)
-
0.7.405 Aug 2023 withdrawn -
0.7.329 Apr 2023Release notes
Open source →Highlights
-
Internal refactoring: always use DnsCache to resolve Servive Instances. When processing incoming packets, we used to update the cache one record at a time and also build separate service info structs to resolve. Now we finish the cache updates first, and then resolve instances from the cache.
-
Added env_logger for the examples code and enhanced the examples as well.
What's Changed
- Support updating instances after they are resolved by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/104
- add optional "unregister" in example code by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/107
- Returns an error with logging for read_name invalid offset by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/109
- register example should keep running by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/110
- Refactoring DnsCache and how to resolve Service Instance by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/108
- add sanity check in reading a record data RDATA by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/111
- Enable logging for the examples by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/112
- register example: a simpler input for the service type by @keepsimple1 in https://github.com/keepsimple1/mdns-sd/pull/113
-
-
0.7.227 Mar 2023Release notes
Open source →Highlights:
-
Implemented
Displaytrait forTxtProperty: print usingkey=valueformat, wherevalueis same as.get_property_val_str(). -
Implemented
Debugtrait forTxtProperty: print using a struct format, wherevalueprints as a string if it is UTF-8, or prints as hex if it is not UTF-8.
-
-
0.7.111 Mar 2023 -
0.7.010 Mar 2023Release notes
Open source →Breaking Changes:
-
Allow non-standard max length for a service name. The check for the length of a service name is moved to the daemon. If a service name is too long, there will be an error log and an error event sent to the monitors.
-
ServiceInfo.get_property_val()returnsOption<Option<&[u8]>>instead ofOption<&str>. Now a newServiceInfo.get_property_val_str()returnsOption<&str>.
In other words, migrate to
get_property_val_str()if you don't want to worry about non-UTF8 values.Highlights:
- Allow non-standard max length for a service name: A new method
ServiceDaemon.set_service_name_len_max()is added to support that. Only use it when you really need to. - Support non-UTF-8 value for TXT properties.
- Support
no valuefor a TXT property, i.e. boolean keys. - Added checks for ASCII keys in a TXT property.
-
-
0.6.126 Feb 2023 -
0.6.022 Feb 2023Release notes
Open source →Breaking Changes:
ServiceInfo::new()takesIntoTxtPropertiestrait instead of aHashMapof properties. It is also backward-compatiable: the trait is implemented forHashMapandOption<HashMap>.ServiceInfo::get_properties()returns&TxtPropertiesinstead of aHashMapof properties. It is also mostly backward-compatiable: supportiter(),get()methods.
Highlights:
- TXT properties' names are now case insensitive. And the original user input order is kept.
- A new method
ServiceInfo::enable_addr_auto(): automatically fill in IP addresses for published services. - Detect IP changes.
- A new
ServiceDaemon::monitor()method to return aReceiverhandle to monitor the daemon events, such as IP changes.
-
0.5.1027 Dec 2022