fix: report a client version in Hostinfo.IPNVersion - #39
Conversation
|
Thanks for verifying this both ways and for being this explicit about what the change does — that transparency made the decision easy to reason about. Decision: let's make it an opt-in YAML option, default off (report nothing, as today). Reasoning:
Concretely, please make it a string option rather than a bool with a baked-in constant, e.g.: tailscale:
ipn_version: "1.98.9" # optional; omitted = report nothing (default)The string form has a second benefit you already ran into: when control eventually considers I'll add a Troubleshooting entry ("Device is too old" in the admin console → set |
Reports a client version in Hostinfo.IPNVersion when set, to clear the admin
console's "Device is too old" gate that blocks device operations (e.g.
reassigning a node's address). Default off: the field is omitted, so a public
component does not claim a version it is not.
- New `ipn_version:` YAML string option, plumbed through the component into
microlink_config_t.ipn_version. Empty/NULL => IPNVersion omitted at both
hostinfo sites (register + map exchange).
- A bare semver ("1.98.9") gets synthetic version.Long hashes appended so the
console displays it; a full "x.y.z-t..-g.." string passes through as-is.
- Drops the baked-in ML_IPN_VERSION constant.
- README: "Device is too old" troubleshooting entry.
Compile-verified on esp32-s3-devkitc-1 / esp-idf (esphome 2026.6.5).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
caadb46 to
6cafb4e
Compare
|
Respun per your decision:
One judgment call to flag: your example was a bare |
|
Merged as Verified on the wire against Headscale before merging, both directions:
Thanks for respinning it to opt-in without being asked twice — and for flagging the |
Rebased onto current
main. Finding #5 from #33 — the smallest of the six.What it does
Reports a client version string in
Hostinfo.IPNVersion, which the component previously left empty.Why it matters, and the awkward part
The Tailscale admin console gates device operations on this string. With it empty (or with our honest
0.5.4) the console refuses with "Device is too old" — that is what blocked reassigning a node's address on 2026-07-31.⚠ I verified this both ways: the same operation failed with our real version and succeeded, unchanged, while the board reported a current release number. Nothing else differed.
Being explicit about what this is
It reports a version number that is not ours. I do not love it and I would rather it were unnecessary. The reasoning:
CapabilityVersionregardless, so nothing about actual compatibility depends on this string — it is used for the console's own gating, not for negotiation.1.98.9specifically because control appears to reject a version it does not recognise and store empty, which puts us back where we started. An unreleased-looking number (1.103.0) did not stick either.If you would rather this were configurable than hardcoded, or would prefer a different value, say so and I will change it — I have no attachment to the number, only to the board not being locked out of its own admin console. It is a
cv.Optionalin our fork, so exposing it as a YAML option instead is a small change.Testing
Builds clean against current main on ESP32-S3 (ESPHome 2026.6.5, ESP-IDF). Verified on two boards on an ~85-node Tailscale SaaS tailnet.