in nfm-common/src/sock_ops_handler.rs [765:838]
fn test_ebpf_sock_op_rto() {
let mock_ktime_us: u64 = 0;
let mut mock_ebpf_maps = MockEbpfMaps::new();
let cookie: u64 = 197;
// A connection is initiated, followed by an RTO.
run_sock_ops_test(
cookie,
BPF_SOCK_OPS_TCP_CONNECT_CB,
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
run_sock_ops_test(
cookie,
BPF_SOCK_OPS_RTO_CB,
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
// After entering established, we see another RTO.
let args: [u32; 2] = [BPF_TCP_SYN_SENT, BPF_TCP_ESTABLISHED];
run_sock_ops_test_with_args(
cookie,
BPF_TCP_SYN_SENT,
BPF_SOCK_OPS_STATE_CB,
args,
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
run_sock_ops_test_with_args(
cookie,
BPF_TCP_ESTABLISHED,
BPF_SOCK_OPS_RTO_CB,
[0, 0],
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
// Finally, during close, another RTO.
let args: [u32; 2] = [BPF_TCP_ESTABLISHED, BPF_TCP_FIN_WAIT1];
run_sock_ops_test_with_args(
cookie,
BPF_TCP_ESTABLISHED,
BPF_SOCK_OPS_STATE_CB,
args,
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
run_sock_ops_test_with_args(
cookie,
BPF_TCP_FIN_WAIT1,
BPF_SOCK_OPS_RTO_CB,
[0, 0],
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
// Validate results.
let composite_key = CpuSockKey {
sock_key: cookie,
cpu_id: MOCK_CPU_ID,
};
let sock_stats = mock_ebpf_maps.sock_stats(&composite_key);
assert_eq!(sock_stats.rtos_syn, 1);
assert_eq!(sock_stats.rtos_est, 1);
assert_eq!(sock_stats.rtos_close, 1);
assert_eq!(mock_ebpf_maps.counters().rto_events, 3);
}