11e38abefSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0 21e38abefSAndrii Nakryiko /* Copyright (c) 2020 Facebook */ 31e38abefSAndrii Nakryiko 41e38abefSAndrii Nakryiko #include <test_progs.h> 51e38abefSAndrii Nakryiko #include "test_module_attach.skel.h" 61e38abefSAndrii Nakryiko 71e38abefSAndrii Nakryiko static int duration; 81e38abefSAndrii Nakryiko 91e38abefSAndrii Nakryiko static int trigger_module_test_read(int read_sz) 101e38abefSAndrii Nakryiko { 111e38abefSAndrii Nakryiko int fd, err; 121e38abefSAndrii Nakryiko 131e38abefSAndrii Nakryiko fd = open("/sys/kernel/bpf_testmod", O_RDONLY); 141e38abefSAndrii Nakryiko err = -errno; 151e38abefSAndrii Nakryiko if (CHECK(fd < 0, "testmod_file_open", "failed: %d\n", err)) 161e38abefSAndrii Nakryiko return err; 171e38abefSAndrii Nakryiko 181e38abefSAndrii Nakryiko read(fd, NULL, read_sz); 191e38abefSAndrii Nakryiko close(fd); 201e38abefSAndrii Nakryiko 211e38abefSAndrii Nakryiko return 0; 221e38abefSAndrii Nakryiko } 231e38abefSAndrii Nakryiko 24407be922SQais Yousef static int trigger_module_test_write(int write_sz) 25407be922SQais Yousef { 26407be922SQais Yousef int fd, err; 27407be922SQais Yousef char *buf = malloc(write_sz); 28407be922SQais Yousef 29407be922SQais Yousef if (!buf) 30407be922SQais Yousef return -ENOMEM; 31407be922SQais Yousef 32407be922SQais Yousef memset(buf, 'a', write_sz); 33407be922SQais Yousef buf[write_sz-1] = '\0'; 34407be922SQais Yousef 35407be922SQais Yousef fd = open("/sys/kernel/bpf_testmod", O_WRONLY); 36407be922SQais Yousef err = -errno; 37407be922SQais Yousef if (CHECK(fd < 0, "testmod_file_open", "failed: %d\n", err)) { 38407be922SQais Yousef free(buf); 39407be922SQais Yousef return err; 40407be922SQais Yousef } 41407be922SQais Yousef 42407be922SQais Yousef write(fd, buf, write_sz); 43407be922SQais Yousef close(fd); 44407be922SQais Yousef free(buf); 45407be922SQais Yousef return 0; 46407be922SQais Yousef } 47407be922SQais Yousef 48*a1c05c3bSJiri Olsa static int delete_module(const char *name, int flags) 49*a1c05c3bSJiri Olsa { 50*a1c05c3bSJiri Olsa return syscall(__NR_delete_module, name, flags); 51*a1c05c3bSJiri Olsa } 52*a1c05c3bSJiri Olsa 531e38abefSAndrii Nakryiko void test_module_attach(void) 541e38abefSAndrii Nakryiko { 551e38abefSAndrii Nakryiko const int READ_SZ = 456; 56407be922SQais Yousef const int WRITE_SZ = 457; 571e38abefSAndrii Nakryiko struct test_module_attach* skel; 581e38abefSAndrii Nakryiko struct test_module_attach__bss *bss; 59*a1c05c3bSJiri Olsa struct bpf_link *link; 601e38abefSAndrii Nakryiko int err; 611e38abefSAndrii Nakryiko 622e33f831SAndrii Nakryiko skel = test_module_attach__open(); 631e38abefSAndrii Nakryiko if (CHECK(!skel, "skel_open", "failed to open skeleton\n")) 641e38abefSAndrii Nakryiko return; 651e38abefSAndrii Nakryiko 662e33f831SAndrii Nakryiko err = bpf_program__set_attach_target(skel->progs.handle_fentry_manual, 672e33f831SAndrii Nakryiko 0, "bpf_testmod_test_read"); 682e33f831SAndrii Nakryiko ASSERT_OK(err, "set_attach_target"); 692e33f831SAndrii Nakryiko 702e33f831SAndrii Nakryiko err = test_module_attach__load(skel); 712e33f831SAndrii Nakryiko if (CHECK(err, "skel_load", "failed to load skeleton\n")) 722e33f831SAndrii Nakryiko return; 732e33f831SAndrii Nakryiko 741e38abefSAndrii Nakryiko bss = skel->bss; 751e38abefSAndrii Nakryiko 761e38abefSAndrii Nakryiko err = test_module_attach__attach(skel); 771e38abefSAndrii Nakryiko if (CHECK(err, "skel_attach", "skeleton attach failed: %d\n", err)) 781e38abefSAndrii Nakryiko goto cleanup; 791e38abefSAndrii Nakryiko 801e38abefSAndrii Nakryiko /* trigger tracepoint */ 811e38abefSAndrii Nakryiko ASSERT_OK(trigger_module_test_read(READ_SZ), "trigger_read"); 82407be922SQais Yousef ASSERT_OK(trigger_module_test_write(WRITE_SZ), "trigger_write"); 831e38abefSAndrii Nakryiko 841e38abefSAndrii Nakryiko ASSERT_EQ(bss->raw_tp_read_sz, READ_SZ, "raw_tp"); 85407be922SQais Yousef ASSERT_EQ(bss->raw_tp_bare_write_sz, WRITE_SZ, "raw_tp_bare"); 861e38abefSAndrii Nakryiko ASSERT_EQ(bss->tp_btf_read_sz, READ_SZ, "tp_btf"); 871e38abefSAndrii Nakryiko ASSERT_EQ(bss->fentry_read_sz, READ_SZ, "fentry"); 882e33f831SAndrii Nakryiko ASSERT_EQ(bss->fentry_manual_read_sz, READ_SZ, "fentry_manual"); 891e38abefSAndrii Nakryiko ASSERT_EQ(bss->fexit_read_sz, READ_SZ, "fexit"); 901e38abefSAndrii Nakryiko ASSERT_EQ(bss->fexit_ret, -EIO, "fexit_tet"); 911e38abefSAndrii Nakryiko ASSERT_EQ(bss->fmod_ret_read_sz, READ_SZ, "fmod_ret"); 921e38abefSAndrii Nakryiko 93*a1c05c3bSJiri Olsa test_module_attach__detach(skel); 94*a1c05c3bSJiri Olsa 95*a1c05c3bSJiri Olsa /* attach fentry/fexit and make sure it get's module reference */ 96*a1c05c3bSJiri Olsa link = bpf_program__attach(skel->progs.handle_fentry); 97*a1c05c3bSJiri Olsa if (!ASSERT_OK_PTR(link, "attach_fentry")) 98*a1c05c3bSJiri Olsa goto cleanup; 99*a1c05c3bSJiri Olsa 100*a1c05c3bSJiri Olsa ASSERT_ERR(delete_module("bpf_testmod", 0), "delete_module"); 101*a1c05c3bSJiri Olsa bpf_link__destroy(link); 102*a1c05c3bSJiri Olsa 103*a1c05c3bSJiri Olsa link = bpf_program__attach(skel->progs.handle_fexit); 104*a1c05c3bSJiri Olsa if (!ASSERT_OK_PTR(link, "attach_fexit")) 105*a1c05c3bSJiri Olsa goto cleanup; 106*a1c05c3bSJiri Olsa 107*a1c05c3bSJiri Olsa ASSERT_ERR(delete_module("bpf_testmod", 0), "delete_module"); 108*a1c05c3bSJiri Olsa bpf_link__destroy(link); 109*a1c05c3bSJiri Olsa 1101e38abefSAndrii Nakryiko cleanup: 1111e38abefSAndrii Nakryiko test_module_attach__destroy(skel); 1121e38abefSAndrii Nakryiko } 113