mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-10-30 16:05:31 +00:00
* fix(hole-punch): repair symmetric UDP candidate and handshake flow Move punched sockets out of the candidate array before publishing them, and keep transaction registration and results in one map. This prevents receiver cleanup from racing with socket reuse or port rebinding and removes the unsafe reference-count assertion. Refill hard-symmetric candidates consumed before transport admission. Refresh easy-symmetric candidates before taking a new STUN baseline so prediction covers their new mappings. Keep probing a selected both-easy socket during session setup so a peer still receiving raw HolePunch packets can switch to its listener even after one-way probe loss. Keep predicted ports within 1..=65535, permit a single remaining port, and cover the full prediction interval for every advertised public IP. Preserve the existing random scan budgets, retry policy and wire format. Add regression coverage for candidate depletion, prediction retries, receiver handoff, continued probing, multiple IPs and port boundaries. Validate all 877 core tests, full workspace Clippy and NAT mapping probes that exchange payloads through the production UDP session code. Related to #2766; its field root cause remains unconfirmed. * fix(hole-punch): retain candidate reuse and prediction budgets Remove the unconditional easy-symmetric array reset so retries reuse the existing 84-socket pool. Keep refilling consumed slots to avoid permanent depletion after failed transport admission. Preserve the predictable scan budget for multiple public IPs instead of multiplying it by address count. Defer prediction freshness and coverage changes until they can be addressed within the existing pressure limits. Verify that two failed easy-symmetric attempts reuse all candidates, that consumed candidates still recover, and that a 50-target prediction budget with two public IPs retains the original 300-datagram total.