Cover new TCP-BPF callback in test_tcpbpf: when listen() is called on
socket, set BPF_SOCK_OPS_STATE_CB_FLAG so that BPF_SOCK_OPS_STATE_CB
callback can be called on future state transition, and when such a
transition happens (TCP_LISTEN -> TCP_CLOSE), track it in the map and
verify it in user space later.

Signed-off-by: Andrey Ignatov <r...@fb.com>
Acked-by: Alexei Starovoitov <a...@kernel.org>
---
 tools/testing/selftests/bpf/test_tcpbpf.h      |  1 +
 tools/testing/selftests/bpf/test_tcpbpf_kern.c | 17 ++++++++++++-----
 tools/testing/selftests/bpf/test_tcpbpf_user.c |  4 +++-
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_tcpbpf.h 
b/tools/testing/selftests/bpf/test_tcpbpf.h
index 2fe43289943c..7bcfa6207005 100644
--- a/tools/testing/selftests/bpf/test_tcpbpf.h
+++ b/tools/testing/selftests/bpf/test_tcpbpf.h
@@ -12,5 +12,6 @@ struct tcpbpf_globals {
        __u32 good_cb_test_rv;
        __u64 bytes_received;
        __u64 bytes_acked;
+       __u32 num_listen;
 };
 #endif
diff --git a/tools/testing/selftests/bpf/test_tcpbpf_kern.c 
b/tools/testing/selftests/bpf/test_tcpbpf_kern.c
index 3e645ee41ed5..4b7fd540cea9 100644
--- a/tools/testing/selftests/bpf/test_tcpbpf_kern.c
+++ b/tools/testing/selftests/bpf/test_tcpbpf_kern.c
@@ -96,15 +96,22 @@ int bpf_testcb(struct bpf_sock_ops *skops)
                        if (!gp)
                                break;
                        g = *gp;
-                       g.total_retrans = skops->total_retrans;
-                       g.data_segs_in = skops->data_segs_in;
-                       g.data_segs_out = skops->data_segs_out;
-                       g.bytes_received = skops->bytes_received;
-                       g.bytes_acked = skops->bytes_acked;
+                       if (skops->args[0] == BPF_TCP_LISTEN) {
+                               g.num_listen++;
+                       } else {
+                               g.total_retrans = skops->total_retrans;
+                               g.data_segs_in = skops->data_segs_in;
+                               g.data_segs_out = skops->data_segs_out;
+                               g.bytes_received = skops->bytes_received;
+                               g.bytes_acked = skops->bytes_acked;
+                       }
                        bpf_map_update_elem(&global_map, &key, &g,
                                            BPF_ANY);
                }
                break;
+       case BPF_SOCK_OPS_TCP_LISTEN_CB:
+               bpf_sock_ops_cb_flags_set(skops, BPF_SOCK_OPS_STATE_CB_FLAG);
+               break;
        default:
                rv = -1;
        }
diff --git a/tools/testing/selftests/bpf/test_tcpbpf_user.c 
b/tools/testing/selftests/bpf/test_tcpbpf_user.c
index 971f1644b9c7..a275c2971376 100644
--- a/tools/testing/selftests/bpf/test_tcpbpf_user.c
+++ b/tools/testing/selftests/bpf/test_tcpbpf_user.c
@@ -37,7 +37,8 @@ int verify_result(const struct tcpbpf_globals *result)
                           (1 << BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB) |
                           (1 << BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB) |
                           (1 << BPF_SOCK_OPS_NEEDS_ECN) |
-                          (1 << BPF_SOCK_OPS_STATE_CB));
+                          (1 << BPF_SOCK_OPS_STATE_CB) |
+                          (1 << BPF_SOCK_OPS_TCP_LISTEN_CB));
 
        EXPECT_EQ(expected_events, result->event_map, "#" PRIx32);
        EXPECT_EQ(501ULL, result->bytes_received, "llu");
@@ -46,6 +47,7 @@ int verify_result(const struct tcpbpf_globals *result)
        EXPECT_EQ(1, result->data_segs_out, PRIu32);
        EXPECT_EQ(0x80, result->bad_cb_test_rv, PRIu32);
        EXPECT_EQ(0, result->good_cb_test_rv, PRIu32);
+       EXPECT_EQ(1, result->num_listen, PRIu32);
 
        return 0;
 err:
-- 
2.17.1

Reply via email to