in nfm-common/src/sock_ops_handler.rs [677:762]
fn test_ebpf_sock_op_retrans() {
let mock_ktime_us: u64 = 0;
let mut mock_ebpf_maps = MockEbpfMaps::new();
let cookie: u64 = 197;
// A connection is initiated, followed by retransmits.
run_sock_ops_test(
cookie,
BPF_SOCK_OPS_TCP_CONNECT_CB,
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
let mut num_retrans = 11;
let args: [u32; 2] = [0, num_retrans];
run_sock_ops_test_with_args(
cookie,
BPF_TCP_SYN_SENT,
BPF_SOCK_OPS_RETRANS_CB,
args,
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
// After entering established, more retransmits are seen. Notice that the new state is
// reflected in the args, and not the sock context.
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(()),
);
num_retrans = 22;
let args: [u32; 2] = [0, num_retrans];
run_sock_ops_test_with_args(
cookie,
BPF_TCP_ESTABLISHED,
BPF_SOCK_OPS_RETRANS_CB,
args,
&mut mock_ebpf_maps,
mock_ktime_us,
Ok(()),
);
// Finally, during close, more retransmits are seen.
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(()),
);
num_retrans = 33;
let args: [u32; 2] = [0, num_retrans];
run_sock_ops_test_with_args(
cookie,
BPF_TCP_FIN_WAIT1,
BPF_SOCK_OPS_RETRANS_CB,
args,
&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.retrans_syn, 11);
assert_eq!(sock_stats.retrans_est, 22);
assert_eq!(sock_stats.retrans_close, 33);
assert_eq!(mock_ebpf_maps.counters().retrans_events, 3);
}