pub fn next_ephemeral_port(
start: u16,
is_in_use: impl Fn(u16) -> bool,
) -> Option<u16>Expand description
エフェメラルポートカウンタの次の値を、既存の生きたソケットと衝突しない ところまで進めて返す(純粋ロジック)。
【2026-08-31】カウンタは 40000 起点で単調増加し、65535 到達で
40000 へラップアラウンドする。ラップアラウンド後、テーブルに残っている
生きたソケットと同じローカルポートを再び払い出すと、tcp_find_socket
は local_port + remote_ip + remote_port の一致だけで判定するため、
別の生きた接続と誤って混線するリスクがある
(TCP_SOCKET_TABLE_SIZE が小さくポート範囲が広いため実害の可能性は
低いが、理論上は起こりうる。spec/TODO.md 参照)。
is_in_use が真を返す間は候補を進め続ける。全ポートが使用中
(テーブルが空いているのにこれが起きることは無いはずだが、
呼び出し側の不整合に備えて)なら None を返し、
呼び出し側は従来どおり衝突未確認のまま払い出すか、エラーにする。
計算量: 最悪 O(ポート範囲) だが、通常は 0〜数回で衝突なしと判定できる。