Context
Whole-branch review of milestone 2c (decentralized discovery, branch feat/discovery-2c). Non-blocking; convergence holds via direct/root gossip paths (which the netns tests exercise).
Problem
A PacketType::Gossip payload that arrives via the relay (on_relayed → relayed_data → DataPlane::on_udp_datagram) hits the DataPlane's default arm and returns Outcome::None — so a relay-reached peer never actually ingests gossip. No crash, and the mesh still converges for peers reachable directly or via the seed root, but a member reachable ONLY through the relay would not participate in gossip.
Fix direction
Route a relayed PacketType::Gossip payload to Membership::on_gossip (like the direct on_udp gossip demux does), and relay-wrap the reply back through the relay to the originating member. Mirror the direct gossip demux's source-restriction (the relayed peer must be Established).
Scope
Out of scope for 2c v1 (tested paths use direct/root gossip). Belongs with relay-path polish alongside the 2b relay follow-ups.
Context
Whole-branch review of milestone 2c (decentralized discovery, branch feat/discovery-2c). Non-blocking; convergence holds via direct/root gossip paths (which the netns tests exercise).
Problem
A
PacketType::Gossippayload that arrives via the relay (on_relayed→relayed_data→DataPlane::on_udp_datagram) hits the DataPlane's default arm and returnsOutcome::None— so a relay-reached peer never actually ingests gossip. No crash, and the mesh still converges for peers reachable directly or via the seed root, but a member reachable ONLY through the relay would not participate in gossip.Fix direction
Route a relayed
PacketType::Gossippayload toMembership::on_gossip(like the directon_udpgossip demux does), and relay-wrap the reply back through the relay to the originating member. Mirror the direct gossip demux's source-restriction (the relayed peer must be Established).Scope
Out of scope for 2c v1 (tested paths use direct/root gossip). Belongs with relay-path polish alongside the 2b relay follow-ups.