fix(client): clear TAP media before relay connect
If the Windows client is killed hard, the TAP adapter can be left in a connected media state. A retry should not resolve or connect to the relay while stale TAP state might still influence Windows routing. Select and open the intended TAP adapter before relay endpoint resolution, force its media state to disconnected, then proceed with the existing relay connect, route pin, TAP route protection, and bridge startup flow. This also makes missing or ambiguous TAP adapters fail before the client joins the relay room. The README and MVP test guide now show the new startup line and the early TAP preflight troubleshooting checks. Test Plan: All cargo commands used these environment variables: RUSTUP_HOME=/tmp/softlan-vpn-rustup CARGO_HOME=/tmp/softlan-vpn-cargo - cargo fmt --check - cargo test --workspace - cargo clippy --workspace --all-targets -- -D warnings - cargo check -p lanparty-client-tap --tests --target x86_64-pc-windows-gnu - cargo check -p lanparty-client-tap --tests --target x86_64-pc-windows-msvc - cargo check -p lanparty-client-route --tests --target x86_64-pc-windows-gnu - cargo check -p lanparty-client-route --tests --target x86_64-pc-windows-msvc - git diff --check Known limitation: full lanparty-client-win Windows cross-check is still blocked on this Linux host by the external ring toolchain setup. The default GNU target lacks x86_64-w64-mingw32-gcc, the default MSVC target lacks lib.exe, and the LLVM MSVC attempt gets as far as ring C compilation but lacks Windows CRT headers such as assert.h. Refs: PLAN.md route-protection startup requirement
This commit is contained in:
@@ -145,6 +145,9 @@ async fn main() -> Result<()> {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
prepare_tap_before_relay_connect(args.tap_instance_id.as_deref())?;
|
||||
|
||||
let config = args.into_config()?;
|
||||
println!(
|
||||
"lanparty-client-win connecting virtual MAC {} to relay {} room {}",
|
||||
@@ -197,6 +200,21 @@ fn print_available_tap_adapters() -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
fn prepare_tap_before_relay_connect(tap_instance_id: Option<&str>) -> Result<()> {
|
||||
let adapters = lanparty_client_tap::available_adapters()
|
||||
.context("failed to list TAP-Windows6 adapters before relay connect")?;
|
||||
let info = select_tap_adapter(adapters, tap_instance_id)?;
|
||||
let device_path = info.device_path();
|
||||
let tap = TapAdapter::open(info)?;
|
||||
tap.set_media_connected(false)
|
||||
.with_context(|| format!("failed to mark TAP media disconnected for {device_path}"))?;
|
||||
|
||||
println!("prepared TAP adapter {device_path}: media disconnected before relay connect");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
async fn run_client(
|
||||
session: &ClientSession,
|
||||
|
||||
Reference in New Issue
Block a user