- commit
- b35298a0f2302e82e73610b3734e74e92271357a
- parent
- 17980ad67610543ec48227ad0528c899083ab783
- author
- Dami <dami.etoile@gmail.com>
| M | crates/ | 60 | +++++++++++++++++++++++++++---- |
| M | scripts/ | 27 | ++++++++++++-- |
| M | scripts/ | 15 | ++++++-- |
@@ -43,6 +43,10 @@ struct Args {
4343 /// Owner-only 32-byte Iroh identity. Omit for the existing ephemeral probe.4444 4545 identity: Option<PathBuf>,46+ /// Remove all direct IP transports from the probe endpoint so control,47+ /// media, and input are forced through Iroh relay paths.48+ 49+ relay_only: bool,4650 /// Owner-only one-time Sigil invitation file. Sent only on the first media4751 /// handshake and requires a persistent identity bound to that invitation.4852 @@ -1010,8 +1014,11 @@ async fn main() -> Result<()> {
10101014 .transpose()?;10111015 let mut nonce = [0_u8; 16];10121016 getrandom::fill(&mut nonce).context("generating handshake nonce")?;1013- let endpoint = Endpoint::builder(presets::N0)1014- .secret_key(secret)1017+ let mut endpoint_builder = Endpoint::builder(presets::N0).secret_key(secret);1018+ if args.relay_only {1019+ endpoint_builder = endpoint_builder.clear_ip_transports();1020+ }1021+ let endpoint = endpoint_builder10151022 .bind()10161023 .await10171024 .context("binding probe endpoint")?;@@ -1377,7 +1384,7 @@ async fn main() -> Result<()> {
13771384 payload_len: frame.payload.len(),13781385 v3_group_id: Some(group_sequence),13791386 },1380- requested_keyframe_recovery || slow_consumer_recovery,1387+ recovery,13811388 );13821389 }13831390 }@@ -1654,10 +1661,26 @@ async fn main() -> Result<()> {
16541661 "probe sustained only {accepted_fps:.3} accepted fps; required at least {minimum_fps:.3} fps"16551662 );16561663 }1657- let diagnostics_connection = moq_receiver1664+ let media_diagnostics_connection = moq_receiver16581665 .as_ref()16591666 .map_or(&media_connection, MoqProbeReceiver::connection);1660- let (path_mode, path_rtt_ms) = selected_path_diagnostics(diagnostics_connection);1667+ let (media_path_mode, media_path_rtt_ms) =1668+ selected_path_diagnostics(media_diagnostics_connection);1669+ let (control_path_mode, control_path_rtt_ms) = if media_transport == MediaTransport::UpstreamMoq1670+ {1671+ selected_path_diagnostics(&media_connection)1672+ } else {1673+ ("not-used", None)1674+ };1675+ let (input_path_mode, input_path_rtt_ms) = selected_path_diagnostics(&input_connection);1676+ if args.relay_only {1677+ ensure!(1678+ control_path_mode == "relay"1679+ && media_path_mode == "relay"1680+ && input_path_mode == "relay",1681+ "relay-only probe did not keep every transport on relay: control={control_path_mode}, media={media_path_mode}, input={input_path_mode}"1682+ );1683+ }16611684 let (16621685 moq_cancelled_groups,16631686 moq_group_gaps,@@ -1846,11 +1869,34 @@ async fn main() -> Result<()> {
18461869 "not-requested"18471870 }18481871 );1849- println!("path_mode={path_mode}");1850- match path_rtt_ms {1872+ println!("path_mode={media_path_mode}");1873+ match media_path_rtt_ms {18511874 Some(rtt) => println!("path_rtt_ms={rtt:.3}"),18521875 None => println!("path_rtt_ms=unknown"),18531876 }1877+ println!("control_path_mode={control_path_mode}");1878+ match control_path_rtt_ms {1879+ Some(rtt) => println!("control_path_rtt_ms={rtt:.3}"),1880+ None => println!("control_path_rtt_ms=unknown"),1881+ }1882+ println!("media_path_mode={media_path_mode}");1883+ match media_path_rtt_ms {1884+ Some(rtt) => println!("media_path_rtt_ms={rtt:.3}"),1885+ None => println!("media_path_rtt_ms=unknown"),1886+ }1887+ println!("input_path_mode={input_path_mode}");1888+ match input_path_rtt_ms {1889+ Some(rtt) => println!("input_path_rtt_ms={rtt:.3}"),1890+ None => println!("input_path_rtt_ms=unknown"),1891+ }1892+ println!(1893+ "forced_relay={}",1894+ if args.relay_only {1895+ "ok"1896+ } else {1897+ "not-requested"1898+ }1899+ );18541900 println!("encoded_bytes={bytes}");18551901 println!("elapsed_ms={}", started.elapsed().as_millis());18561902 Ok(())@@ -23,6 +23,8 @@ keyframe_recovery="ok"
2323 media_v3=false2424 media_v2=false2525 media_v1=false26+relay_only=false27+expected_path_mode=direct2628 2729 usage() {2830 cat <<'EOF'@@ -45,6 +47,8 @@ Options:
4547 instead of upstream MoQ4648 --media-v1 Exercise ordered media v1 compatibility4749 instead of upstream MoQ50+ --relay-only Remove direct probe transports and require the51+ control, media, and input paths to stay relayed4852 --help Show this help4953 EOF5054 }@@ -104,6 +108,11 @@ while [[ $# -gt 0 ]]; do
104108 media_v1=true105109 shift106110 ;;111+ --relay-only)112+ relay_only=true113+ expected_path_mode=relay114+ shift115+ ;;107116 --media-v2)108117 [[ "$media_v1" == false && "$media_v3" == false ]] \109118 || die "media compatibility flags cannot be combined"@@ -430,8 +439,11 @@ validate_probe_log() {
430439 "$log_path" || return 1431440 awk -F= '$1 == "input_ack_micros" && $2 ~ /^[0-9]+$/ { found=1 } END { exit !found }' \432441 "$log_path" || return 1433- grep -Fxq 'path_mode=direct' "$log_path" || return 1442+ grep -Fxq "path_mode=${expected_path_mode}" "$log_path" || return 1443+ grep -Fxq "media_path_mode=${expected_path_mode}" "$log_path" || return 1444+ grep -Fxq "input_path_mode=${expected_path_mode}" "$log_path" || return 1434445 if [[ "$media_transport" == "iroh-moq" ]]; then446+ grep -Fxq "control_path_mode=${expected_path_mode}" "$log_path" || return 1435447 grep -Fxq 'control_alpn=sigil/control/1' "$log_path" || return 1436448 grep -Fxq 'group_sequence=monotonic' "$log_path" || return 1437449 grep -Fxq 'moq_group_capacity=1' "$log_path" || return 1@@ -468,9 +480,14 @@ validate_probe_log() {
468480 else469481 grep -Fxq 'slow_consumer=not-requested' "$log_path" || return 1470482 fi483+ grep -Fxq "forced_relay=$([[ "$relay_only" == true ]] && printf ok || printf not-requested)" \484+ "$log_path" || return 1471485 }472486 473487 run_probe() {488+ if [[ "$relay_only" == true ]]; then489+ set -- --relay-only "$@"490+ fi474491 if [[ "$media_v1" == true ]]; then475492 "$probe_bin" --media-v1 "$@"476493 elif [[ "$media_v2" == true ]]; then@@ -546,8 +563,10 @@ primary_pid=$!
546563 start_watchdog "$primary_pid" "$command_timeout_seconds" "$tmp_root/primary.timeout"547564 primary_watchdog_pid="$watchdog_pid"548565 549-wait_for_log_count "$host_log" "$media_accept_log" 1 "$primary_pid" 'primary probe' \550- || die "primary session did not become active"566+if ! wait_for_log_count "$host_log" "$media_accept_log" 1 "$primary_pid" 'primary probe'; then567+ sed -n '1,240p' "$primary_log" >&2 || true568+ die "primary session did not become active"569+fi551570 if ! kill -0 "$primary_pid" 2>/dev/null; then552571 die "primary probe ended before the concurrent rejection check"553572 fi@@ -652,7 +671,7 @@ printf 'probe_binary=%s\n' "$probe_bin"
652671 printf 'probe_sha256=%s\n' "$(sha256_file "$probe_bin")"653672 printf 'node_id=%s\n' "$node_id"654673 printf 'primary_frames=%s\n' "$primary_frames"655-grep -E '^(transport|control_alpn|transport_alpn|first_configured_idr|frame_sequence|group_sequence|keyframe_recovery|keyframe_recovery_micros|keyframe_request_id|keyframes|sequence_gaps|media_objects_dropped|media_objects_late|moq_catalog|moq_group_capacity|moq_cancelled_groups|moq_group_gaps|moq_unrecovered_group_gaps|moq_maximum_group_objects|moq_maximum_group_bytes|moq_historical_suffix_frames|recovery_barrier|slow_consumer|slow_consumer_stall_ms|slow_consumer_first_post_stall|slow_consumer_historical_suffix_frames|slow_consumer_recovery_micros|slow_consumer_cancellation_delta|slow_consumer_group_advance|slow_consumer_sequence_advance|slow_consumer_capture_advance_micros|slow_consumer_input_ack_micros|input_ack_micros|path_mode|path_rtt_ms)=' "$primary_log"674+grep -E '^(transport|control_alpn|transport_alpn|first_configured_idr|frame_sequence|group_sequence|keyframe_recovery|keyframe_recovery_micros|keyframe_request_id|keyframes|sequence_gaps|media_objects_dropped|media_objects_late|moq_catalog|moq_group_capacity|moq_cancelled_groups|moq_group_gaps|moq_unrecovered_group_gaps|moq_maximum_group_objects|moq_maximum_group_bytes|moq_historical_suffix_frames|recovery_barrier|slow_consumer|slow_consumer_stall_ms|slow_consumer_first_post_stall|slow_consumer_historical_suffix_frames|slow_consumer_recovery_micros|slow_consumer_cancellation_delta|slow_consumer_group_advance|slow_consumer_sequence_advance|slow_consumer_capture_advance_micros|slow_consumer_input_ack_micros|input_ack_micros|path_mode|path_rtt_ms|control_path_mode|control_path_rtt_ms|media_path_mode|media_path_rtt_ms|input_path_mode|input_path_rtt_ms|forced_relay)=' "$primary_log"656675 printf 'keyframe_request_correlation=%s\n' \657676 "$([[ "$media_v1" == false && "$media_v2" == false ]] && printf unique || printf not-requested)"658677 printf 'active_client_rejection=ok\n'@@ -405,6 +405,7 @@ validate_probe() {
405405 local size="$3"406406 local request_id="$4"407407 local slow_consumer_ms="${5:-}"408+ local expected_path_mode="${6:-direct}"408409 grep -Fxq probe=ok "$log"409410 grep -Fxq "dimensions=$size" "$log"410411 grep -Fxq "transport=$transport" "$log"@@ -414,10 +415,14 @@ validate_probe() {
414415 grep -Fxq recovery_barrier=configured-idr "$log"415416 grep -Fxq keyframe_recovery=ok "$log"416417 grep -Fxq "keyframe_request_id=$request_id" "$log"417- grep -Fxq path_mode=direct "$log"418+ grep -Fxq "path_mode=$expected_path_mode" "$log"419+ grep -Fxq "media_path_mode=$expected_path_mode" "$log"420+ grep -Fxq "input_path_mode=$expected_path_mode" "$log"421+ grep -Fxq "forced_relay=$([[ "$expected_path_mode" == relay ]] && printf ok || printf not-requested)" "$log"418422 awk -F= '$1 == "keyframe_recovery_micros" && $2 ~ /^[0-9]+$/ && $2 <= 2000000 { ok=1 } END { exit !ok }' "$log"419423 awk -F= '$1 == "input_ack_micros" && $2 ~ /^[0-9]+$/ { ok=1 } END { exit !ok }' "$log"420424 if [[ "$transport" == iroh-moq ]]; then425+ grep -Fxq "control_path_mode=$expected_path_mode" "$log"421426 grep -Fxq control_alpn=sigil/control/1 "$log"422427 grep -Fxq moq_group_capacity=1 "$log"423428 grep -Fxq moq_unrecovered_group_gaps=0 "$log"@@ -463,6 +468,7 @@ run_probe_cycle() {
463468 local request_id="$4"464469 local invitation_path="${5:-}"465470 local slow_consumer_ms="${6:-}"471+ local expected_path_mode="${7:-direct}"466472 local log="$raw/$mode-$transport-$request_id.log"467473 local command=(468474 "$probe"@@ -477,8 +483,9 @@ run_probe_cycle() {
477483 [[ "$transport" == grouped-v3 ]] && command+=(--media-v3)478484 [[ -n "$invitation_path" ]] && command+=(--invitation "$invitation_path")479485 [[ -n "$slow_consumer_ms" ]] && command+=(--slow-consumer-ms "$slow_consumer_ms")486+ [[ "$expected_path_mode" != relay ]] || command+=(--relay-only)480487 timeout --signal=TERM --kill-after=5s 45s "${command[@]}" >"$log" 2>&1481- validate_probe "$log" "$transport" "$size" "$request_id" "$slow_consumer_ms"488+ validate_probe "$log" "$transport" "$size" "$request_id" "$slow_consumer_ms" "$expected_path_mode"482489 }483490 484491 validate_host_recovery() {@@ -516,7 +523,7 @@ grep -Fxq probe=ok "$evidence/fixed-capture.log"
516523 grep -Fxq dropped_after_encode_before_probe_consumer=0 "$evidence/fixed-capture.log"517524 518525 start_candidate fixed "$fixed_config"519-run_probe_cycle fixed iroh-moq 1280x800 1001 "$invitation" 1500526+run_probe_cycle fixed iroh-moq 1280x800 1001 "$invitation" 1500 relay520527 wait_for_count "$raw/fixed-host.log" 'MoQ control client released' 1521528 wait_for_count "$raw/fixed-host.log" 'input client released' 1522529 enrollment="$("$sigil" enrollment show --config "$fixed_config")"@@ -644,6 +651,8 @@ fi
644651 echo "total_sessions=$total_sessions"645652 echo slow_media_consumer=pass646653 echo slow_media_consumer_resolutions=1280x800,"$native_size"654+ echo forced_relay=pass655+ echo forced_relay_scope=probe-control-media-input647656 summarize_group fixed-iroh-moq648657 summarize_group fixed-grouped-v3649658 summarize_group native-iroh-moq