Files
lanspread/vendor/mdns-sd/CHANGELOG.md
T
ddidderr 4d5881d6b0 fix(mdns): retain origin and bound daemon state
Vendor the pinned mdns-sd 0.21.1 source so response records retain their observed source IP. Bound unauthenticated cache records to 1024 globally and 128 per source, deduplicate and cap timers at 4096, and poll at least once per second for expiry cleanup.

Expose packet provenance through lanspread-mdns, drop originless resolutions, and add a dedicated vendor test recipe while keeping third-party sources outside workspace formatting and Clippy.

Test Plan:
- just mdns-vendor-test (106 tests passed with socket access)
- just test
- just fmt
- just clippy
- cache/per-source, exact-refresh, timer-cap, and serde tests
- git diff --check
2026-09-12 13:08:26 +02:00

950 lines
37 KiB
Markdown

# Version 0.21.1 (2026-08-30)
This is a bugfix release.
## Bug fixes / improvements
- Send goodbye (TTL=0) packets under conflict-resolved names. When probing renames a
record due to a name conflict (RFC 6762 section 9), now the goodbye carries the updated
names peers actually observed. (#495, commit `fe525a6`)
- Harden DNS name parsing (`read_name`) and name compression handling: skip only the
malformed record instead of the whole packet. (#492, commit `5bf6b7c`)
## All changes
* `5bf6b7c 2026-08-30` refactoring: read_name and name compression (#492) (keepsimple1)
* `fe525a6 2026-08-26` fix: send goodbye packets under conflict-resolved names (#495) (dhavli)
Thanks and welcome our new contributor @dhavli !
# Version 0.21.0 (2026-08-10)
## Breaking changes
- The max outgoing packet size is now 1452 bytes (Ethernet MTU), down from 8972 bytes,
per [RFC 6762 section 17](https://datatracker.ietf.org/doc/html/rfc6762#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 given `IfKind`, and export the new default as
`MAX_PKT_DEFAULT`. (#487, commit `82711a8`)
- Re-export the receiver-side error types `RecvError`, `RecvTimeoutError` and
`TryRecvError` from `flume`, so that a caller can name them without adding `flume`
as a direct dependency. (#488, commit `20c0eac`)
## 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-09` refactor: extract the code that does cache flush (#490) (keepsimple1)
* `20c0eac 2026-08-08` feat: re-export Receiver error types (#488) (#489) (keepsimple1)
* `82711a8 2026-08-07` feat: limit generated packet size per RFC 6762 section 17 (#487) (keepsimple1)
# Version 0.20.3 (2026-07-26)
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-24` docs: add RFC 6762 compliance rows for v0.20.2 features (keepsimple1)
* `08362e3 2026-07-24` fix: Panic in write_utf8 (assert s.len() < 64) (#484) (keepsimple1)
# Version 0.20.2 (2026-07-16)
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-15` fix: avoid leaking empty cache entries for records not for us (#481) (keepsimple1)
* `7c55c75 2026-07-14` feat: add a jitter for initial query per RFC 6762 section 5.2 (#480) (keepsimple1)
* `a37e959 2026-07-12` feat: delay PTR query responses per RFC 6762 section 6 (#479) (keepsimple1)
* `6f39a46 2026-07-08` fix: space announcement retransmissions wider than the rate-limit window (#477) (keepsimple1)
* `76f42bd 2026-07-07` feat: Implement RFC 6762 section 6 multicast rate limiting (#476) (keepsimple1)
# Version 0.20.1 (2026-06-28)
This is a small feature and maintenance release.
## New features
- Add `IfKind::Predicate` and a new `IfPredicate` type, allowing interfaces to be selected with a custom predicate function (e.g. matching by interface name pattern). (#474, commit `fd72146`)
## Other changes
- chore(deps): update dependencies. (#454, commit `06bdad1`)
## All changes
* `fd72146 2026-06-22` Add `IfPredicate` for more flexible interface filtering (#474) (MAlba124)
* `06bdad1 2026-06-16` chore(deps): update (#454) (CosminPerRam)
Thanks and welcome our new contributor @MAlba124 !
# Version 0.20.0 (2026-05-24)
This release contains a small breaking change in the optional `serde` feature, hence the minor version bump.
## Breaking changes
- Remove `#[serde(untagged)]` from `ScopedIp`. The serialized form of `ScopedIp` now includes its enum variant tag (`V4` / `V6`), which improves compatibility with binary serde formats (e.g. MessagePack). Only affects users of the optional `serde` feature. (#472, commit `5fa4b92`)
## Other changes
- tests: remove explicit random port assignments.
- chore: remove an unused dev-dependency.
## All changes
* `fee8ab7 2026-05-24` remove unused dev-dependency (keepsimple1)
* `e745a2f 2026-05-23` tests: remove explicit port random assignments (#455) (CosminPerRam)
* `5fa4b92 2026-05-22` Remove untagged attribute from ScopedIp (#472) (Rascal)
# Version 0.19.2 (2026-05-17)
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, commit `933bdbe`)
- Added a new `Error::DaemonShutdown` variant, returned by `ServiceDaemon` methods after the daemon thread has exited (previously surfaced as a generic `Error::Msg`). The `Error` enum is `#[non_exhaustive]`, so this is additive. (commit `a457193`)
## Bug fixes / improvements
- Optimize outgoing DNS serialization to reduce allocations on the send path. (#467, commit `fb26d7f`)
- Replace a stray `println!` in `DnsHostInfo::write` with `debug!`, so the library no longer writes to stdout. (#465, commit `96008a4`)
- Expanded `# Errors` doc sections on the major `ServiceDaemon` APIs (`new`, `new_with_port`, `browse`, `stop_browse`, `resolve_hostname`, `stop_resolve_hostname`, `register`, `unregister`), documenting when `Error::Again` vs. `Error::DaemonShutdown` is returned. (#464, commit `a457193`)
## All changes
* `933bdbe 2026-05-15` Add support for RFC 6762 legacy unicast responses (#469) (Luqmaan)
* `fb26d7f 2026-04-30` Optimize dns outgoing serialization (#467) (Alexander)
* `a457193 2026-04-28` docs: add doc comments for error handling on major APIs (#464) (keepsimple1)
* `96008a4 2026-04-28` Replace println with debug log (#465) (Alexander)
Thanks and welcome our new contributors @luqs1 and @anti-social !
# 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 `ServiceInfo` constructor, catching oversized properties at registration time instead of at send time. (#458, commit `cc81eec`)
## All changes
* `d210372 2026-04-18` fix: use a source IP matching the querier's subnet when responding (#460) (keepsimple1)
* `cc81eec 2026-04-12` fix: check TXT property length in ServiceInfo constructor (#458) (keepsimple1)
# Version 0.19.0 (2026-04-04)
## Breaking changes
- `ScopedIpV4` now carries `interface_ids` tracking which network interfaces discovered the address. The derived `Eq`/`Hash` now includes `interface_ids`, so two `ScopedIpV4` values with the same IP but different interface lists are no longer equal. (commits `43bd8f3`, `0661bf1`, `247447b`)
## New features
- New optional `serde` feature: adds `Serialize`/`Deserialize` on `InterfaceId`, `ScopedIpV4`, `ScopedIpV6`, `ScopedIp`, `TxtProperties`, `TxtProperty`, and `ResolvedService`. (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`)
## All changes
* `3903f09 2026-04-04` refactoring: simplify handle_query (#452) (keepsimple1)
* `b6ddc18 2026-04-04` refactoring: move add_answer_with_additionals into struct DnsOutgoing (#451) (keepsimple1)
* `468c5ee 2026-04-03` fix: avoid known-answer suppression when querying on a new interface (#450) (keepsimple1)
* `7daa1d4 2026-04-01` fix: track modified_instances when removing records from an interface (#448) (keepsimple1)
* `247447b 2026-03-26` fix: ScopedIp considered Eq when interface_ids change (#446) (keepsimple1)
* `0661bf1 2026-03-24` refactoring: ScopedIpV4 to use multiple InterfaceIds (#444) (keepsimple1)
* `c2c2f75 2026-03-15` Serde Deserialize+Serialize implementation (#440) (Rascal)
* `43bd8f3 2026-03-13` add interface_id in ScopedIpV4 (#439) (keepsimple1)
Thanks and welcome our new contributor @Rascal !
# Verison 0.18.2 (2026-03-10)
- A bugfix: refresh of address records didn't work when hostname is not lowercase.
## All changes
* `ec1e733 2026-03-11` fix: Refresh of A and AAAA records (#441) (hrzlgnm)
# Version 0.18.1 (2026-02-28)
- A bugfix for `disable_interface` with an IPv4 address: clarified that the semantics is to disable IPv4 on the interface identified by the IPv4 address.
- Added new variants for `IfKind` enum: `IndexIPV4(u32)` and `IndexIPV6(u32)`.
## All changes
* `7e04122 2026-02-28` fix(test): use all IPv4 interfaces in test_disable_interface_cache (#435) (keepsimple1)
# Version 0.18.0 (2026-02-15)
A few new features, documentation enhancements and breaking changes.
## Breaking changes
- Removed one default feature: `reuseport`. It is handled transparently now. (see commit `58bc8c5`)
- New feature: support `.` and `\` in instance names (see commit `3481b94`)
- 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-12` Added documentation about service name length (FelixSelter)
* `85b6cd9 2026-02-10` fix for macOS: exclude IFF_POINTTOPOINT interfaces and exclude Apple P2P interfaces by default (#425) (keepsimple1)
* `58bc8c5 2026-02-09` fix: invert reuseport feature (#430) (keepsimple1)
* `8d24304 2026-02-07` feat: add proper cleanup on daemon shutdown (#421) (Thibaut M.)
* `69418d6 2026-02-05` chore: update some comments (#429) (keepsimple1)
* `3481b94 2026-02-06` feat: implement RFC 6763 Section 4.3 escaping for instance names (#420) (Thibaut M.)
* `58c15b4 2026-01-27` fix: only add a scope in Display to unicast link local v6 addresses (#424) (hrzlgnm)
* `3f34136 2026-01-24` Return errors from send_dns_outgoing (#419) (keepsimple1)
* `0e323f6 2026-01-21` ci: update github action checkout (#422) (Thibaut M.)
Thanks and welcome new contributors: @thibaut-pascal, @FelixSelter
# Version 0.17.2 (2026-01-16)
## New features (non-breaking)
A new 'feature' literally: a default feature `reuseport` to control if SO_REUSEPORT should be used. Useful for old Linux kernels (before 3.9).
## All changes
* `466d373 2026-01-15` feat: add `reuseport` feature (#414) (Hanssen)
* `1770d01 2025-12-31` exmaples: add --verify option in the query example (#412) (keepsimple1)
Thanks and welcome our new contributor @Hanssen0 !
# Version 0.17.1 (2025-12-05)
## 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-04` feat: use Self on impl return of itself for RRType (#409) (CosminPerRam)
* `91b3e66 2025-12-02` Add a custom port option (#408) (Kaido Kert)
* `3e7a582 2025-11-30` handle empty return from send_dns_outgoing (#407) (keepsimple1)
Thanks and welcome our new contributor @kaidokert !
# Version 0.17.0 (2025-11-06)
## 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_interfaces` and `set_link_local_only` based on some real world use cases.
## All changes
* `6752eaf 2025-11-04` feat: service registration with granular iface/ip conditions (#398) (twizansk)
* `7293e7c 2025-11-02` Enable loopback interfaces by default (#397) (keepsimple1)
* `505bd71 2025-11-02` Fix clippy for tests and remove unnecessary tests (#403) (keepsimple1)
# Version 0.16.0 (2025-10-29)
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-27` Handle IPv6 disabled in kernel (#396) (keepsimple1)
* `b15c4c3 2025-10-23` log the interface name when joining multicast group (#394) (keepsimple1)
* `382521c 2025-10-15` refactoring only: make resolve_updated_instances easier to understand (#393) (keepsimple1)
# Version 0.15.1 (2025-09-06)
New feature: cache only browsing. Check out the new methods `browse_cache` and `accept_unsolicited`.
## All changes
* `3f6d6e9 2025-09-04` feat: support cache only browsing (#388) (twizansk)
Thanks and welcome our new contributor @twizansk !
# Version 0.15.0 (2025-08-31)
## Breaking changes
- `ServiceEvent::ServiceData` is merged back with `ServiceResolved` (i.e. replacing it). The end result is: we have a single `ServiceEvent::ServiceResolved(ResolvedService)` going forward.
Hence, a service is respresented by `ResolvedService` on the client side, and by `ServiceInfo` on 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-29` feat: impl AsIpAddrs for Box<dyn AsIpAddrs> (#387) (Jean-Gab)
* `f88fae1 2025-08-27` merge ServiceData with ServiceResolved (#386) (keepsimple1)
Thanks our new contributor @Jean-Gab, welcome!
# Version 0.14.1 (2025-8-19)
This is a bugfix release with only a doc comments change.
* `ec4fb9a 2025-08-18` doc: add a missing line in doc code example (#384) (keepsimple1)
# Version 0.14.0 (2025-8-10)
## Breaking changes
- `ServiceEvent::ServiceData` to support IPv6 with scope_id. It will deprecate `ServiceEvent::ServiceResolved`.
Users must call `ServiceDaemon.use_service_data` to use `ServiceData` instead of `ServiceResolved` event.
- `HostnameResolutionEvent::AddressesFound` uses the new `ScopedIp` instead of `IpAddr`.
- `ServiceEvent` is `non_exhaustive` now.
## Other hightlights
- Internal: define `MyUdpSocket` that uses PKTINFO. It also prepares for supporting unicast.
- Internal: define `MyIntf` to better handle multiple addresses on an interface.
- A few bugfixes.
* `123ecba 2025-08-08` rename HostIp to ScopedIp (#382) (keepsimple1)
* `0c9395f 2025-08-07` rename ServiceDetailed to ServiceData (#381) (keepsimple1)
* `52cc67c 2025-08-06` refactoring: define our own interface struct to allow multiple addresses (#380) (keepsimple1)
* `1b194de 2025-08-01` feat: Remove unneeded multicast send tracking (#377) (hrzlgnm)
* `8cb1a59 2025-07-30` refactoring only: move run into ZeroConf (#376) (keepsimple1)
* `2eddad3 2025-07-30` ServiceEvent: add non_exhaustive and fix clippy (#375) (keepsimple1)
* `0d6ba35 2025-07-28` bugfix: remove duplicated address record for IPv6 on a wrong interface (#373) (keepsimple1)
* `45b3cdd 2025-07-16` fix repetitive ServiceRemoved and Resolve again after interface up (#371) (keepsimple1)
* `eb90591 2025-07-13` Exclude interfaces that are operational down (#369) (keepsimple1)
* `1103ab2 2025-07-08` feat: new API to use ResolvedService instead of ServiceInfo for resolved service event (#362) (keepsimple1)
# Version 0.13.11 (2025-7-7)
This is a small bugfix release before we add potential breaking changes.
* `8b221d2 2025-06-22` derive `Clone` for `ServiceEvent` and `HostnameResolutionEvent` (#366) (Shadowcat650)
Welcome our new contributor @Shadowcat650 !
# Version 0.13.10 (2025-6-21)
This is a bugfix release.
* `14841ac 2025-06-21` add comments for setting TTL (#364) (keepsimple1)
* `3db5e1b 2025-06-17` bugfix: set multicast TTL to 255 (#361) (Sameer Puri)
* `22a2688 2025-05-20` doc: add a section for Conflict resolution (#359) (keepsimple1)
* `60888b7 2025-05-13` Refactoring only: extract parts of probing_handler into functions (#357) (keepsimple1)
* `db2f484 2025-05-11` bugfix: not to resolve records that expires soon (#353) (keepsimple1)
Welcome our new contributor @sameer !
# Version 0.13.9 (2025-04-22)
This is a bugfix release.
* `a734dd2 2025-05-02` bugfix: refresh TXT when needed (#354) (keepsimple1)
* `51c03c3 2025-05-01` bugfix: TXT records should use OTHER_TTL same as PTR (#355) (keepsimple1)
* `07750cb 2025-04-25` bugfix: only remove a service instance if all its SRV are gone (#350) (keepsimple1)
# Version 0.13.8 (2025-04-22)
This is a bugfix release that also prepares for adding InterfaceId in resolved service info.
* `2d49195 2025-04-22` bugfix: should keep A records for hostname queriers (#348) (keepsimple1)
* `fe08df1 2025-04-22` bump up version to 0.13.8 (#347) (keepsimple1)
* `f6c7e80 2025-04-22` feat: extend `DnsAddress` with an `InterfaceId` (#342) (hrzlgnm)
* `513372d 2025-04-20` remove address filter for multicast loopback (#346) (keepsimple1)
# Version 0.13.7 (2025-04-15)
This is a bugfix release that further reduces the memory footprint of DNS cache.
* `a6a0961 2025-04-15` optimization: remove cache entries when stop_browse (#344) (keepsimple1)
# Version 0.13.6 (2025-04-07)
This is a bugfix release that reduces / limits the memory footprint of the cached records and timers.
* `5fa1b31 2025-04-07` optimization: remove expired timers and skip DNS datagrams that are not for us (#338) (keepsimple1)
* `3e3aec9 2025-03-29` refactoring: make tiebreaking more modular (#336) (keepsimple1)
# Version 0.13.5 (2025-03-25)
This is a patch fix release as the previous release (0.13.4) was broken in service resolution.
* `e65757f 2025-03-26` bugfix: make `get_addr` method use lowercase hostname (#332) (Justus K)
Thanks @Stupremee for the fix and welcome!
# Version 0.13.4 (2025-03-24)
## Highlights
- New API for host IP check: `ServiceDaemon::set_ip_check_interval` and `ServiceDaemon::get_ip_check_interval`.
- Bugfixes.
## All changes
* `e64c0d4 2025-03-24` bugfix: hostname resolution should be case insensitive (#330) (keepsimple1)
* `5e4df27 2025-03-19` bugfix: when now equals next_ip_check (#328) (keepsimple1)
* `9538120 2025-03-12` examples: support logfile in the register example (#326) (keepsimple1)
* `8422690 2025-03-13` chore(deps): update fastrand and socket2 (#324) (CosminPerRam)
* `dd2d868 2025-03-07` feat: add boxed in DnsRecordExt to reduce Box::new usage (#323) (CosminPerRam)
* `3ea6cf1 2025-03-05` Detect IP changes: reduce the interval (#313) (keepsimple1)
* `7feabc9 2025-03-04` feat: handle DnsIncoming IPv4, 6 and String read parsing errors (#309) (CosminPerRam)
# Version 0.13.3 (2025-03-01)
## Highlights
* `TxtProperties`: Support `into_property_map_str`.
* For querier: a new struct `ResolvedService` that can be created from `ServiceInfo`.
* Support a service to publish using loopback interfaces via `enable_interface`.
* Bugfixes.
## All changes
* `3e6842f 2025-02-28` enable_interface: support loopback interface (#317) (keepsimple1)
* `7e77a5e 2025-02-26` fix: remove related addresses in the cache when disabling an interface (#316) (keepsimple1)
* `735fb22 2025-02-22` refactoring: move handle_poller_events into Zeroconf impl (#315) (keepsimple1)
* `e886787 2025-02-20` ci: add doc check and fail if there are any warnings (#310) (CosminPerRam)
* `9d92545 2025-02-18` refactoring: make e_fmt! available within the crate (#311) (keepsimple1)
* `4b671d4 2025-02-14` ResolvedService: a new plain struct for attributes of a service (#302) (keepsimple1)
* `349de66 2025-02-13` fix: include loopback addresses in filtering criteria (#306) (Minetake)
* `026a745 2025-02-09` refactoring: property length check (#305) (keepsimple1)
* `818f37c 2025-02-10` TXT record: docs to remind users of the maximum length of the attribute. (#304) (Lazy Panda)
* `fba8025 2025-02-09` TxtProperties: new method to get a HashMap of properties (#303) (keepsimple1)
# Version 0.13.2 (2025-02-02)
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)
# Version 0.13.1 (2024-12-16)
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)
# Version 0.13.0 (2024-12-15)
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 `mio` instead of `polling` to poll sockets.
* New API `set_multicast_loop_v4` and `set_multicast_loop_v6` of `ServiceDaemon`.
* All logging are updated to be `debug` or `trace` levels 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)
# Version 0.12.0 (2024-11-24)
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](https://datatracker.ietf.org/doc/html/rfc6762#section-8)
* Support service liveness checking via `verify` API. [RFC 6762](https://datatracker.ietf.org/doc/html/rfc6762#section-10.4)
* 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)
# Version 0.11.5 (2024-09-28)
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)
# Version 0.11.4 (2024-09-10)
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 `main` branch.
## 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)
# Version 0.11.3 (2024-08-23)
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 `.browse` queriers (#240) (hrzlgnm) (2024-08-17)
* 0453030 Avoid redundant query, announcement and unregistration overhaul (#239) (hrzlgnm) (2024-08-16)
# Version 0.11.2 (2024-08-06)
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)
# Version 0.11.1 (2024-05-13)
## 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!
# Version 0.11.0 (2024-04-21)
## Breaking changes
* Now `ServiceDaemon::register()` requires `hostname` to 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!
# Version 0.10.5 (2024-03-24)
## 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!
# Version 0.10.4 (2024-02-10)
This is a bug fix release.
## Changes
* Add sanity checks in DNS message decoding (#169)
* fine-tune MAX_MSG_ABSOLUTE (#170)
# Version 0.10.3 (2024-01-14)
This is a bug fix release.
## Changes
* netmask -> subnet (#164)
Welcome our new contributor @amfaber ! Thanks!
# Version 0.10.2 (2023-12-28)
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!
# Version 0.10.1 (2023-12-2)
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)
# Version 0.10.0 (2023-11-28)
## Breaking changes
* `ServiceDaemon::shutdown()` return type changed from `Result<()>` to `Result<Receiver<DaemonStatus>>` (#149)
## Other changes
* Related to the breaking change, a client can receive `DaemonStatus` to be sure the daemon is shutdown.
* A new enum `DaemonStatus` and a new API `ServiceDaemon::status()` are introduced.
* Updated CI in GitHub Actions: replace `actions-rs` with `dtolnay/rust-toolchain`.
# Version 0.9.3
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!
# Version 0.9.2
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`.
# Version 0.9.1
There are no breaking changes.
* support interface selection (#137)
Added two new methods for `ServiceDaemon`: `enable_interface` and `disable_interface`, and some refactoring.
# Version 0.9.0
* 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 `AsIpv4Addrs` changes to `AsIpAddrs` to support both IPv4 and IPv6.
- `ServiceInfo::new()` uses the new `AsIpAddrs` trait.
- `ServiceInfo::get_addresses()` returns both IPv4 and IPv6 addresses, while a new convenience method `get_addresses_v4` returns 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)
# Version 0.8.1
* Remove env_logger in dev-dependencies and lower MSRV to 1.60.0. (#128)
# Version 0.8.0
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.
# Version 0.7.5
* Revert the changes in v0.7.4 and support link-local addrs alongside routable addrs. (#122)
# Version 0.7.4 (deprecated)
* Not to use link-local addrs if routable addrs exist (#117)
# Version 0.7.3
## 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
# Version 0.7.2
Highlights:
- Implemented `Display` trait for `TxtProperty`: print using
`key=value` format, where `value` is same as `.get_property_val_str()`.
- Implemented `Debug` trait for `TxtProperty`: print using
a struct format, where `value` prints as a string if it is UTF-8, or
prints as hex if it is not UTF-8.
# Version 0.7.1
Highlights:
- A bug fix: remove duplicated keys in TXT records received.
# Version 0.7.0
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()` returns `Option<Option<&[u8]>>`
instead of `Option<&str>`. Now a new `ServiceInfo.get_property_val_str()`
returns `Option<&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 value` for a TXT property, i.e. boolean keys.
- Added checks for ASCII keys in a TXT property.
# Version 0.6.1
Highlights:
- Fixs a bug: missing TXT records in received responses.
# Version 0.6.0
Breaking Changes:
- `ServiceInfo::new()` takes `IntoTxtProperties` trait instead of a
`HashMap` of properties. It is also backward-compatiable: the trait
is implemented for `HashMap` and `Option<HashMap>`.
- `ServiceInfo::get_properties()` returns `&TxtProperties` instead of
a `HashMap` of properties. It is also mostly backward-compatiable:
support `iter()`, `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 a `Receiver` handle to
monitor the daemon events, such as IP changes.
# Version 0.5.10
- skip interfaces that failed to bind (#79) (re-apply fix in v0.5.6)
# Version 0.5.9
- Ignore duplicate keys (#74)
- update error msg for send_packet (#69)
# Version 0.5.8
- call check_service_name before sending the cmd to the daemon. (#60)
- Changed dependency on 'log' crate to be optional (#64)
- configure mDNS daemon thread a name (#66)
- log an error if socket read returns 0 and reset the socket (#67)
# Version 0.5.7
- Allow service names with trailing '.' (#56)
- query unresolved instances (#58)
# Verison 0.5.6
- handle join_multicast_v4 error gracefully (#53)
# Version 0.5.5
- track IPv4 interfaces with sockets to support multiple LANs (#48)
# Version 0.5.4
- Fix a bug in resolving multiple IPs for a host.
- Code reorg: separate modules out of lib.rs.
- Listening socket joins multicast on all interfaces.
# Version 0.5.3
- Support subtypes.
- Bind every valid IPv4 interface for outgoing sockets.
- Include Windows and macOS in GitHub Actions.
# Version 0.5.2
- Add support for Windows platform.
# Version 0.5.1
- Fix missing info in the license files.
- Add docs.rs badge.
- Make Error implement std::error::Error.
# Version 0.5.0
- Allow multiple formats for host_ipv4 to create ServiceInfo.
- A breaking change: change `ServiceInfo::new()` to return a `Result<>`.
- Update `nix` dependency to version 0.24.1.
# Version 0.4.3
- Fix a bug in stop-browse
# Version 0.4.2
- New feature: support meta-query `_services._dns-sd._udp` per RFC 6763.
# Version 0.4.1
- Update docs.
# Version 0.4.0
- Replace `crossbeam-channel` with `flume`.
# Version 0.3.0
- Add "get_metrics" in API.
- Fixed a bug in cache refresh.
- Fixed a bug in retransmission.
# Version 0.2.2
- Add the first example code. Thanks @lu-zero! (#5)
# Version 0.2.1
- mDNS daemon respond socket to be blocking for simpler send.
# Version 0.2.0
- Public API internally to use the unblocking try_send() to replace send().
- Add `Again` in Error type to support retry.
# Version 0.1.0
- Initial version