fn test_ebpf_sock_op_retrans()

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);
    }