///|
fn pcap_baseline_action_clock(
scenario : String,
parsed : RtClockCliArgs,
) -> RtClockPlan {
if scenario == "io-write-highres" && parsed.clock_explicit == false {
rt_clock_highres(period_us=parsed.clock.period_us)
} else {
parsed.clock
}
}
///|
fn is_pcap_baseline_scenario(scenario : String) -> Bool {
scenario == "dcp-identify" ||
scenario == "snmp" ||
scenario == "lldp" ||
scenario == "ar-connect" ||
scenario == "ar-release" ||
scenario == "record-read" ||
scenario == "io-cyclic" ||
scenario == "io-write-highres" ||
scenario == "alarm"
}
///|
fn run_pcap_baseline(args : Array[String]) -> Unit {
let parsed = match parse_rt_clock_cli_args(args) {
Some(value) => value
None => return
}
let args = parsed.args
guard args.length() >= 4 && args[0] == "--iface" else {
println(
"pcap-baseline --iface [timeout-ms] [device-ip] [station-name] [cycle-count] [--clock highres|monotonic-ms|receive-paced(deprecated)] [--period-us ] [--rt-period-us ] [--data-hold-factor <3..0x1E00>] [--data-hold-ms ] [--rt-output-vlan-pcp <0..7>|--rt-output-vlan-tci <0..0xFFFF>] [--win-rt ...]",
)
println(
" Scenarios: dcp-identify, ar-release, record-read, io-cyclic, io-write-highres, snmp, lldp, alarm",
)
return
}
let interface_name = args[1]
let scenario = args[2]
if is_pcap_baseline_scenario(scenario) == false {
println("Invalid scenario: " + scenario)
println(
"Scenarios: dcp-identify, ar-release, record-read, io-cyclic, io-write-highres, snmp, lldp, alarm",
)
return
}
let path = args[3]
let timeout_ms = match parse_timeout_arg(args, 4, 5000) {
Some(value) => value
None => return
}
let device_ip = if args.length() >= 6 {
@frame.IPv4Address::from_text(args[5][:]) catch {
err => {
println("Invalid device IP: \{to_repr(err)}")
return
}
}
} else {
@frame.IPv4Address::from_text("192.168.3.10") catch {
err => {
println("Invalid default device IP: \{to_repr(err)}")
return
}
}
}
let station_name = if args.length() >= 7 { args[6] } else { "controller" }
let cycle_count = if args.length() >= 8 {
match parse_number_arg(args[7], "cycle count") {
Some(value) => value
None => return
}
} else if scenario == "io-cyclic" ||
scenario == "io-write-highres" ||
scenario == "alarm" {
10000
} else {
0
}
let clock = pcap_baseline_action_clock(scenario, parsed)
let iocr_period = iocr_period_for_clock(clock, parsed.iocr_period)
emit_windows_realtime_plan(parsed.windows_realtime)
let fields : Array[String] = [
"interface=" + interface_name,
"pcap_scenario=" + scenario,
"pcap_path=" + path,
"timeout_ms=" + timeout_ms.to_string(),
"device_ip=" + device_ip.to_text(),
"station_name=" + station_name,
"cycle_count=" + cycle_count.to_string(),
"required_artifact=lockwire_native_pcap_writer",
"pcap_writer_owner=lockwire",
"pcap_written=false",
]
append_rt_plan_fields(
fields,
clock,
iocr_period,
parsed.data_hold,
parsed.output_vlan,
parsed.windows_realtime,
)
println(
provider_harness_rt_pcap_handoff_text(
"pcap-baseline", "recording artifact", "@rawnet.RawSocket::open + @pcapdump.PcapWriter",
fields,
),
)
}