1*03d4d13fSAlexei Starovoitov // SPDX-License-Identifier: GPL-2.0 2*03d4d13fSAlexei Starovoitov /* Copyright (c) 2020 Facebook */ 3*03d4d13fSAlexei Starovoitov #pragma once 4*03d4d13fSAlexei Starovoitov 5*03d4d13fSAlexei Starovoitov #define TASK_COMM_LEN 16 6*03d4d13fSAlexei Starovoitov #define MAX_ANCESTORS 4 7*03d4d13fSAlexei Starovoitov #define MAX_PATH 256 8*03d4d13fSAlexei Starovoitov #define KILL_TARGET_LEN 64 9*03d4d13fSAlexei Starovoitov #define CTL_MAXNAME 10 10*03d4d13fSAlexei Starovoitov #define MAX_ARGS_LEN 4096 11*03d4d13fSAlexei Starovoitov #define MAX_FILENAME_LEN 512 12*03d4d13fSAlexei Starovoitov #define MAX_ENVIRON_LEN 8192 13*03d4d13fSAlexei Starovoitov #define MAX_PATH_DEPTH 32 14*03d4d13fSAlexei Starovoitov #define MAX_FILEPATH_LENGTH (MAX_PATH_DEPTH * MAX_PATH) 15*03d4d13fSAlexei Starovoitov #define MAX_CGROUPS_PATH_DEPTH 8 16*03d4d13fSAlexei Starovoitov 17*03d4d13fSAlexei Starovoitov #define MAX_METADATA_PAYLOAD_LEN TASK_COMM_LEN 18*03d4d13fSAlexei Starovoitov 19*03d4d13fSAlexei Starovoitov #define MAX_CGROUP_PAYLOAD_LEN \ 20*03d4d13fSAlexei Starovoitov (MAX_PATH * 2 + (MAX_PATH * MAX_CGROUPS_PATH_DEPTH)) 21*03d4d13fSAlexei Starovoitov 22*03d4d13fSAlexei Starovoitov #define MAX_CAP_PAYLOAD_LEN (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN) 23*03d4d13fSAlexei Starovoitov 24*03d4d13fSAlexei Starovoitov #define MAX_SYSCTL_PAYLOAD_LEN \ 25*03d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + CTL_MAXNAME + MAX_PATH) 26*03d4d13fSAlexei Starovoitov 27*03d4d13fSAlexei Starovoitov #define MAX_KILL_PAYLOAD_LEN \ 28*03d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + TASK_COMM_LEN + \ 29*03d4d13fSAlexei Starovoitov KILL_TARGET_LEN) 30*03d4d13fSAlexei Starovoitov 31*03d4d13fSAlexei Starovoitov #define MAX_EXEC_PAYLOAD_LEN \ 32*03d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + MAX_FILENAME_LEN + \ 33*03d4d13fSAlexei Starovoitov MAX_ARGS_LEN + MAX_ENVIRON_LEN) 34*03d4d13fSAlexei Starovoitov 35*03d4d13fSAlexei Starovoitov #define MAX_FILEMOD_PAYLOAD_LEN \ 36*03d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + MAX_FILEPATH_LENGTH + \ 37*03d4d13fSAlexei Starovoitov MAX_FILEPATH_LENGTH) 38*03d4d13fSAlexei Starovoitov 39*03d4d13fSAlexei Starovoitov enum data_type { 40*03d4d13fSAlexei Starovoitov INVALID_EVENT, 41*03d4d13fSAlexei Starovoitov EXEC_EVENT, 42*03d4d13fSAlexei Starovoitov FORK_EVENT, 43*03d4d13fSAlexei Starovoitov KILL_EVENT, 44*03d4d13fSAlexei Starovoitov SYSCTL_EVENT, 45*03d4d13fSAlexei Starovoitov FILEMOD_EVENT, 46*03d4d13fSAlexei Starovoitov MAX_DATA_TYPE_EVENT 47*03d4d13fSAlexei Starovoitov }; 48*03d4d13fSAlexei Starovoitov 49*03d4d13fSAlexei Starovoitov enum filemod_type { 50*03d4d13fSAlexei Starovoitov FMOD_OPEN, 51*03d4d13fSAlexei Starovoitov FMOD_LINK, 52*03d4d13fSAlexei Starovoitov FMOD_SYMLINK, 53*03d4d13fSAlexei Starovoitov }; 54*03d4d13fSAlexei Starovoitov 55*03d4d13fSAlexei Starovoitov struct ancestors_data_t { 56*03d4d13fSAlexei Starovoitov pid_t ancestor_pids[MAX_ANCESTORS]; 57*03d4d13fSAlexei Starovoitov uint32_t ancestor_exec_ids[MAX_ANCESTORS]; 58*03d4d13fSAlexei Starovoitov uint64_t ancestor_start_times[MAX_ANCESTORS]; 59*03d4d13fSAlexei Starovoitov uint32_t num_ancestors; 60*03d4d13fSAlexei Starovoitov }; 61*03d4d13fSAlexei Starovoitov 62*03d4d13fSAlexei Starovoitov struct var_metadata_t { 63*03d4d13fSAlexei Starovoitov enum data_type type; 64*03d4d13fSAlexei Starovoitov pid_t pid; 65*03d4d13fSAlexei Starovoitov uint32_t exec_id; 66*03d4d13fSAlexei Starovoitov uid_t uid; 67*03d4d13fSAlexei Starovoitov gid_t gid; 68*03d4d13fSAlexei Starovoitov uint64_t start_time; 69*03d4d13fSAlexei Starovoitov uint32_t cpu_id; 70*03d4d13fSAlexei Starovoitov uint64_t bpf_stats_num_perf_events; 71*03d4d13fSAlexei Starovoitov uint64_t bpf_stats_start_ktime_ns; 72*03d4d13fSAlexei Starovoitov uint8_t comm_length; 73*03d4d13fSAlexei Starovoitov }; 74*03d4d13fSAlexei Starovoitov 75*03d4d13fSAlexei Starovoitov struct cgroup_data_t { 76*03d4d13fSAlexei Starovoitov ino_t cgroup_root_inode; 77*03d4d13fSAlexei Starovoitov ino_t cgroup_proc_inode; 78*03d4d13fSAlexei Starovoitov uint64_t cgroup_root_mtime; 79*03d4d13fSAlexei Starovoitov uint64_t cgroup_proc_mtime; 80*03d4d13fSAlexei Starovoitov uint16_t cgroup_root_length; 81*03d4d13fSAlexei Starovoitov uint16_t cgroup_proc_length; 82*03d4d13fSAlexei Starovoitov uint16_t cgroup_full_length; 83*03d4d13fSAlexei Starovoitov int cgroup_full_path_root_pos; 84*03d4d13fSAlexei Starovoitov }; 85*03d4d13fSAlexei Starovoitov 86*03d4d13fSAlexei Starovoitov struct var_sysctl_data_t { 87*03d4d13fSAlexei Starovoitov struct var_metadata_t meta; 88*03d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 89*03d4d13fSAlexei Starovoitov struct ancestors_data_t ancestors_info; 90*03d4d13fSAlexei Starovoitov uint8_t sysctl_val_length; 91*03d4d13fSAlexei Starovoitov uint16_t sysctl_path_length; 92*03d4d13fSAlexei Starovoitov char payload[MAX_SYSCTL_PAYLOAD_LEN]; 93*03d4d13fSAlexei Starovoitov }; 94*03d4d13fSAlexei Starovoitov 95*03d4d13fSAlexei Starovoitov struct var_kill_data_t { 96*03d4d13fSAlexei Starovoitov struct var_metadata_t meta; 97*03d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 98*03d4d13fSAlexei Starovoitov struct ancestors_data_t ancestors_info; 99*03d4d13fSAlexei Starovoitov pid_t kill_target_pid; 100*03d4d13fSAlexei Starovoitov int kill_sig; 101*03d4d13fSAlexei Starovoitov uint32_t kill_count; 102*03d4d13fSAlexei Starovoitov uint64_t last_kill_time; 103*03d4d13fSAlexei Starovoitov uint8_t kill_target_name_length; 104*03d4d13fSAlexei Starovoitov uint8_t kill_target_cgroup_proc_length; 105*03d4d13fSAlexei Starovoitov char payload[MAX_KILL_PAYLOAD_LEN]; 106*03d4d13fSAlexei Starovoitov size_t payload_length; 107*03d4d13fSAlexei Starovoitov }; 108*03d4d13fSAlexei Starovoitov 109*03d4d13fSAlexei Starovoitov struct var_exec_data_t { 110*03d4d13fSAlexei Starovoitov struct var_metadata_t meta; 111*03d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 112*03d4d13fSAlexei Starovoitov pid_t parent_pid; 113*03d4d13fSAlexei Starovoitov uint32_t parent_exec_id; 114*03d4d13fSAlexei Starovoitov uid_t parent_uid; 115*03d4d13fSAlexei Starovoitov uint64_t parent_start_time; 116*03d4d13fSAlexei Starovoitov uint16_t bin_path_length; 117*03d4d13fSAlexei Starovoitov uint16_t cmdline_length; 118*03d4d13fSAlexei Starovoitov uint16_t environment_length; 119*03d4d13fSAlexei Starovoitov char payload[MAX_EXEC_PAYLOAD_LEN]; 120*03d4d13fSAlexei Starovoitov }; 121*03d4d13fSAlexei Starovoitov 122*03d4d13fSAlexei Starovoitov struct var_fork_data_t { 123*03d4d13fSAlexei Starovoitov struct var_metadata_t meta; 124*03d4d13fSAlexei Starovoitov pid_t parent_pid; 125*03d4d13fSAlexei Starovoitov uint32_t parent_exec_id; 126*03d4d13fSAlexei Starovoitov uint64_t parent_start_time; 127*03d4d13fSAlexei Starovoitov char payload[MAX_METADATA_PAYLOAD_LEN]; 128*03d4d13fSAlexei Starovoitov }; 129*03d4d13fSAlexei Starovoitov 130*03d4d13fSAlexei Starovoitov struct var_filemod_data_t { 131*03d4d13fSAlexei Starovoitov struct var_metadata_t meta; 132*03d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 133*03d4d13fSAlexei Starovoitov enum filemod_type fmod_type; 134*03d4d13fSAlexei Starovoitov unsigned int dst_flags; 135*03d4d13fSAlexei Starovoitov uint32_t src_device_id; 136*03d4d13fSAlexei Starovoitov uint32_t dst_device_id; 137*03d4d13fSAlexei Starovoitov ino_t src_inode; 138*03d4d13fSAlexei Starovoitov ino_t dst_inode; 139*03d4d13fSAlexei Starovoitov uint16_t src_filepath_length; 140*03d4d13fSAlexei Starovoitov uint16_t dst_filepath_length; 141*03d4d13fSAlexei Starovoitov char payload[MAX_FILEMOD_PAYLOAD_LEN]; 142*03d4d13fSAlexei Starovoitov }; 143*03d4d13fSAlexei Starovoitov 144*03d4d13fSAlexei Starovoitov struct profiler_config_struct { 145*03d4d13fSAlexei Starovoitov bool fetch_cgroups_from_bpf; 146*03d4d13fSAlexei Starovoitov ino_t cgroup_fs_inode; 147*03d4d13fSAlexei Starovoitov ino_t cgroup_login_session_inode; 148*03d4d13fSAlexei Starovoitov uint64_t kill_signals_mask; 149*03d4d13fSAlexei Starovoitov ino_t inode_filter; 150*03d4d13fSAlexei Starovoitov uint32_t stale_info_secs; 151*03d4d13fSAlexei Starovoitov bool use_variable_buffers; 152*03d4d13fSAlexei Starovoitov bool read_environ_from_exec; 153*03d4d13fSAlexei Starovoitov bool enable_cgroup_v1_resolver; 154*03d4d13fSAlexei Starovoitov }; 155*03d4d13fSAlexei Starovoitov 156*03d4d13fSAlexei Starovoitov struct bpf_func_stats_data { 157*03d4d13fSAlexei Starovoitov uint64_t time_elapsed_ns; 158*03d4d13fSAlexei Starovoitov uint64_t num_executions; 159*03d4d13fSAlexei Starovoitov uint64_t num_perf_events; 160*03d4d13fSAlexei Starovoitov }; 161*03d4d13fSAlexei Starovoitov 162*03d4d13fSAlexei Starovoitov struct bpf_func_stats_ctx { 163*03d4d13fSAlexei Starovoitov uint64_t start_time_ns; 164*03d4d13fSAlexei Starovoitov struct bpf_func_stats_data* bpf_func_stats_data_val; 165*03d4d13fSAlexei Starovoitov }; 166*03d4d13fSAlexei Starovoitov 167*03d4d13fSAlexei Starovoitov enum bpf_function_id { 168*03d4d13fSAlexei Starovoitov profiler_bpf_proc_sys_write, 169*03d4d13fSAlexei Starovoitov profiler_bpf_sched_process_exec, 170*03d4d13fSAlexei Starovoitov profiler_bpf_sched_process_exit, 171*03d4d13fSAlexei Starovoitov profiler_bpf_sys_enter_kill, 172*03d4d13fSAlexei Starovoitov profiler_bpf_do_filp_open_ret, 173*03d4d13fSAlexei Starovoitov profiler_bpf_sched_process_fork, 174*03d4d13fSAlexei Starovoitov profiler_bpf_vfs_link, 175*03d4d13fSAlexei Starovoitov profiler_bpf_vfs_symlink, 176*03d4d13fSAlexei Starovoitov profiler_bpf_max_function_id 177*03d4d13fSAlexei Starovoitov }; 178