On Thu, Feb 23, 2023 at 2:05 PM Aditi Ghag <aditi.ghag@xxxxxxxxxxxxx> wrote: > > The test cases for TCP and UDP iterators mirror the intended usages of the > helper. > > The destroy helpers set `ECONNABORTED` error code that we can validate in the > test code with client sockets. But UDP sockets have an overriding error code > from the disconnect called during abort, so the error code the validation is > only done for TCP sockets. > > The `struct sock` is redefined as vmlinux.h forward declares the struct, and the > loader fails to load the program as it finds the BTF FWD type for the struct > incompatible with the BTF STRUCT type. > > Here are the snippets of the verifier error, and corresponding BTF output: > > ``` > verifier error: extern (func ksym) ...: func_proto ... incompatible with kernel > > BTF for selftest prog binary: > > [104] FWD 'sock' fwd_kind=struct > [70] PTR '(anon)' type_id=104 > [84] FUNC_PROTO '(anon)' ret_type_id=2 vlen=1 > '(anon)' type_id=70 > [85] FUNC 'bpf_sock_destroy' type_id=84 linkage=extern > -- > [96] DATASEC '.ksyms' size=0 vlen=1 > type_id=85 offset=0 size=0 (FUNC 'bpf_sock_destroy') > > BTF for selftest vmlinux: > > [74923] FUNC 'bpf_sock_destroy' type_id=48965 linkage=static > [48965] FUNC_PROTO '(anon)' ret_type_id=9 vlen=1 > 'sk' type_id=1340 > [1340] PTR '(anon)' type_id=2363 > [2363] STRUCT 'sock' size=1280 vlen=93 > ``` > > Signed-off-by: Aditi Ghag <aditi.ghag@xxxxxxxxxxxxx> > --- > .../selftests/bpf/prog_tests/sock_destroy.c | 125 ++++++++++++++++++ > .../selftests/bpf/progs/sock_destroy_prog.c | 110 +++++++++++++++ > 2 files changed, 235 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/sock_destroy.c > create mode 100644 tools/testing/selftests/bpf/progs/sock_destroy_prog.c > [...] > + n = send(clien, "t", 1, 0); > + if (CHECK(n < 0, "client_send", "client failed to send on socket\n")) > + goto cleanup; > + > + start_iter_sockets(skel->progs.iter_tcp6); > + > + n = send(clien, "t", 1, 0); > + if (CHECK(n > 0, "client_send after destroy", "succeeded on destroyed socket\n")) > + goto cleanup; > + CHECK(errno != ECONNABORTED, "client_send", "unexpected error code on destroyed socket\n"); > + please don't use CHECK() macros, prefere ASSERT_xxx() ones > + > +cleanup: > + close(clien); > +cleanup_serv: > + close(serv); > +} > + > + > +void test_udp(struct sock_destroy_prog *skel) are these meant to be subtests? If yes, model them as such? and in either case, make these funcs static > +{ > + int serv = -1, clien = -1, n = 0; > + > + serv = start_server(AF_INET6, SOCK_DGRAM, NULL, 6161, 0); > + if (CHECK(serv < 0, "start_server", "failed to start server\n")) > + goto cleanup_serv; > + [...]