fix(core): split WIRE_VERSION from ABI_VERSION — new clients locked out of every deployed host
ABI_VERSION was doing double duty: the embeddable C surface AND the punktfunk/1
Hello/Welcome version that hosts equality-check. The WoL feature's v3 bump added
a client-local FFI function without changing a single wire byte — and every new
client started refusing against every deployed host ("ABI mismatch: client 3
host 2", observed live Deck → Bazzite). The wire now carries its own
WIRE_VERSION (still 2); ABI_VERSION stays 3 for the C header and the mgmt API's
informational field. Bump WIRE_VERSION only when the handshake/planes actually
change incompatibly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -412,7 +412,7 @@ async fn session(args: Args) -> Result<()> {
|
|||||||
io::write_msg(
|
io::write_msg(
|
||||||
&mut send,
|
&mut send,
|
||||||
&Hello {
|
&Hello {
|
||||||
abi_version: punktfunk_core::ABI_VERSION,
|
abi_version: punktfunk_core::WIRE_VERSION,
|
||||||
mode: args.mode,
|
mode: args.mode,
|
||||||
compositor: args.compositor,
|
compositor: args.compositor,
|
||||||
gamepad: args.gamepad,
|
gamepad: args.gamepad,
|
||||||
|
|||||||
@@ -876,7 +876,7 @@ async fn worker_main(args: WorkerArgs) {
|
|||||||
io::write_msg(
|
io::write_msg(
|
||||||
&mut send,
|
&mut send,
|
||||||
&Hello {
|
&Hello {
|
||||||
abi_version: crate::ABI_VERSION,
|
abi_version: crate::WIRE_VERSION,
|
||||||
mode,
|
mode,
|
||||||
compositor,
|
compositor,
|
||||||
gamepad,
|
gamepad,
|
||||||
|
|||||||
@@ -54,3 +54,11 @@ pub use stats::Stats;
|
|||||||
/// v3: added `punktfunk_wake_on_lan` (Wake-on-LAN magic packet; the host's wake MAC(s) reach
|
/// v3: added `punktfunk_wake_on_lan` (Wake-on-LAN magic packet; the host's wake MAC(s) reach
|
||||||
/// clients out-of-band via the mDNS `mac` TXT record, so no connection is required to wake).
|
/// clients out-of-band via the mDNS `mac` TXT record, so no connection is required to wake).
|
||||||
pub const ABI_VERSION: u32 = 3;
|
pub const ABI_VERSION: u32 = 3;
|
||||||
|
|
||||||
|
/// The punktfunk/1 **wire** version — what `Hello`/`Welcome` carry and hosts equality-check.
|
||||||
|
/// Deliberately its own constant: [`ABI_VERSION`] tracks the embeddable **C surface**
|
||||||
|
/// (functions a client links), which can grow without changing a single wire byte — v3's
|
||||||
|
/// `punktfunk_wake_on_lan` is client-local, and riding the C-ABI bump onto the wire locked
|
||||||
|
/// every new client out of every deployed host ("ABI mismatch: client 3 host 2", observed
|
||||||
|
/// live). Bump this ONLY when the handshake/planes actually change incompatibly.
|
||||||
|
pub const WIRE_VERSION: u32 = 2;
|
||||||
|
|||||||
@@ -585,10 +585,10 @@ async fn serve_session(
|
|||||||
// the `handshake` future re-decodes for the real session — a few dozen bytes, negligible.
|
// the `handshake` future re-decodes for the real session — a few dozen bytes, negligible.
|
||||||
let gate_hello = Hello::decode(&first).map_err(|e| anyhow!("Hello decode: {e:?}"))?;
|
let gate_hello = Hello::decode(&first).map_err(|e| anyhow!("Hello decode: {e:?}"))?;
|
||||||
anyhow::ensure!(
|
anyhow::ensure!(
|
||||||
gate_hello.abi_version == punktfunk_core::ABI_VERSION,
|
gate_hello.abi_version == punktfunk_core::WIRE_VERSION,
|
||||||
"ABI mismatch: client {} host {}",
|
"wire version mismatch: client {} host {}",
|
||||||
gate_hello.abi_version,
|
gate_hello.abi_version,
|
||||||
punktfunk_core::ABI_VERSION
|
punktfunk_core::WIRE_VERSION
|
||||||
);
|
);
|
||||||
let fp = endpoint::peer_fingerprint(&conn);
|
let fp = endpoint::peer_fingerprint(&conn);
|
||||||
let known = fp
|
let known = fp
|
||||||
@@ -654,10 +654,10 @@ async fn serve_session(
|
|||||||
let handshake = async {
|
let handshake = async {
|
||||||
let hello = Hello::decode(&first).map_err(|e| anyhow!("Hello decode: {e:?}"))?;
|
let hello = Hello::decode(&first).map_err(|e| anyhow!("Hello decode: {e:?}"))?;
|
||||||
anyhow::ensure!(
|
anyhow::ensure!(
|
||||||
hello.abi_version == punktfunk_core::ABI_VERSION,
|
hello.abi_version == punktfunk_core::WIRE_VERSION,
|
||||||
"ABI mismatch: client {} host {}",
|
"wire version mismatch: client {} host {}",
|
||||||
hello.abi_version,
|
hello.abi_version,
|
||||||
punktfunk_core::ABI_VERSION
|
punktfunk_core::WIRE_VERSION
|
||||||
);
|
);
|
||||||
// The pairing gate (require_pairing → paired? else park for delegated approval) ran above,
|
// The pairing gate (require_pairing → paired? else park for delegated approval) ran above,
|
||||||
// before this future, so a client reaching here is paired (or the host is `--open`).
|
// before this future, so a client reaching here is paired (or the host is `--open`).
|
||||||
@@ -805,7 +805,7 @@ async fn serve_session(
|
|||||||
let mut key = [0u8; 16];
|
let mut key = [0u8; 16];
|
||||||
rand::thread_rng().fill_bytes(&mut key);
|
rand::thread_rng().fill_bytes(&mut key);
|
||||||
let welcome = Welcome {
|
let welcome = Welcome {
|
||||||
abi_version: punktfunk_core::ABI_VERSION,
|
abi_version: punktfunk_core::WIRE_VERSION,
|
||||||
udp_port,
|
udp_port,
|
||||||
mode: hello.mode,
|
mode: hello.mode,
|
||||||
// The post-GameStream point of punktfunk/1: Leopard GF(2¹⁶) FEC + real encryption.
|
// The post-GameStream point of punktfunk/1: Leopard GF(2¹⁶) FEC + real encryption.
|
||||||
|
|||||||
@@ -21,6 +21,14 @@
|
|||||||
// clients out-of-band via the mDNS `mac` TXT record, so no connection is required to wake).
|
// clients out-of-band via the mDNS `mac` TXT record, so no connection is required to wake).
|
||||||
#define ABI_VERSION 3
|
#define ABI_VERSION 3
|
||||||
|
|
||||||
|
// The punktfunk/1 **wire** version — what `Hello`/`Welcome` carry and hosts equality-check.
|
||||||
|
// Deliberately its own constant: [`ABI_VERSION`] tracks the embeddable **C surface**
|
||||||
|
// (functions a client links), which can grow without changing a single wire byte — v3's
|
||||||
|
// `punktfunk_wake_on_lan` is client-local, and riding the C-ABI bump onto the wire locked
|
||||||
|
// every new client out of every deployed host ("ABI mismatch: client 3 host 2", observed
|
||||||
|
// live). Bump this ONLY when the handshake/planes actually change incompatibly.
|
||||||
|
#define WIRE_VERSION 2
|
||||||
|
|
||||||
// `PunktfunkHidOutput::kind` — lightbar RGB (`r`/`g`/`b` valid).
|
// `PunktfunkHidOutput::kind` — lightbar RGB (`r`/`g`/`b` valid).
|
||||||
#define PUNKTFUNK_HIDOUT_LED 1
|
#define PUNKTFUNK_HIDOUT_LED 1
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user