selftests: mptcp: explicitly tests aggregate counters
authorPaolo Abeni <pabeni@redhat.com>
Tue, 20 Jun 2023 16:30:16 +0000 (18:30 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 22 Jun 2023 05:45:57 +0000 (22:45 -0700)
Update the existing sockopt test-case to do some basic checks
on the newly added counters.

Link: https://github.com/multipath-tcp/mptcp_net-next/issues/385
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/mptcp/mptcp_sockopt.c

index b35148e..5ee710b 100644 (file)
@@ -51,6 +51,11 @@ struct mptcp_info {
        __u8    mptcpi_local_addr_used;
        __u8    mptcpi_local_addr_max;
        __u8    mptcpi_csum_enabled;
+       __u32   mptcpi_retransmits;
+       __u64   mptcpi_bytes_retrans;
+       __u64   mptcpi_bytes_sent;
+       __u64   mptcpi_bytes_received;
+       __u64   mptcpi_bytes_acked;
 };
 
 struct mptcp_subflow_data {
@@ -83,8 +88,10 @@ struct mptcp_subflow_addrs {
 
 struct so_state {
        struct mptcp_info mi;
+       struct mptcp_info last_sample;
        uint64_t mptcpi_rcv_delta;
        uint64_t tcpi_rcv_delta;
+       bool pkt_stats_avail;
 };
 
 #ifndef MIN
@@ -322,8 +329,9 @@ static void do_getsockopt_mptcp_info(struct so_state *s, int fd, size_t w)
        if (ret < 0)
                die_perror("getsockopt MPTCP_INFO");
 
-       assert(olen == sizeof(i));
+       s->pkt_stats_avail = olen >= sizeof(i);
 
+       s->last_sample = i;
        if (s->mi.mptcpi_write_seq == 0)
                s->mi = i;
 
@@ -562,6 +570,23 @@ static void process_one_client(int fd, int pipefd)
        do_getsockopts(&s, fd, ret, ret2);
        if (s.mptcpi_rcv_delta != (uint64_t)ret + 1)
                xerror("mptcpi_rcv_delta %" PRIu64 ", expect %" PRIu64, s.mptcpi_rcv_delta, ret + 1, s.mptcpi_rcv_delta - ret);
+
+       /* be nice when running on top of older kernel */
+       if (s.pkt_stats_avail) {
+               if (s.last_sample.mptcpi_bytes_sent != ret2)
+                       xerror("mptcpi_bytes_sent %" PRIu64 ", expect %" PRIu64,
+                              s.last_sample.mptcpi_bytes_sent, ret2,
+                              s.last_sample.mptcpi_bytes_sent - ret2);
+               if (s.last_sample.mptcpi_bytes_received != ret)
+                       xerror("mptcpi_bytes_received %" PRIu64 ", expect %" PRIu64,
+                              s.last_sample.mptcpi_bytes_received, ret,
+                              s.last_sample.mptcpi_bytes_received - ret);
+               if (s.last_sample.mptcpi_bytes_acked != ret)
+                       xerror("mptcpi_bytes_acked %" PRIu64 ", expect %" PRIu64,
+                              s.last_sample.mptcpi_bytes_acked, ret2,
+                              s.last_sample.mptcpi_bytes_acked - ret2);
+       }
+
        close(fd);
 }