bpftool: Move out sections to separate functions
Remove all calls of print_end_then_start_section function and for loops out from the do_probe function. Instead, provide separate functions for each section (like i.e. section_helpers) which are called in do_probe. This change is motivated by better readability. Signed-off-by: Michal Rostecki <mrostecki@opensuse.org> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/bpf/20200226165941.6379-2-mrostecki@opensuse.org
This commit is contained in:
parent
3494bec0f6
commit
6b52ca44e8
|
@ -112,18 +112,12 @@ print_start_section(const char *json_title, const char *plain_title,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void print_end_section(void)
|
||||||
print_end_then_start_section(const char *json_title, const char *plain_title,
|
|
||||||
const char *define_comment,
|
|
||||||
const char *define_prefix)
|
|
||||||
{
|
{
|
||||||
if (json_output)
|
if (json_output)
|
||||||
jsonw_end_object(json_wtr);
|
jsonw_end_object(json_wtr);
|
||||||
else
|
else
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
print_start_section(json_title, plain_title, define_comment,
|
|
||||||
define_prefix);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Probing functions */
|
/* Probing functions */
|
||||||
|
@ -584,13 +578,130 @@ probe_large_insn_limit(const char *define_prefix, __u32 ifindex)
|
||||||
res, define_prefix);
|
res, define_prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
section_system_config(enum probe_component target, const char *define_prefix)
|
||||||
|
{
|
||||||
|
switch (target) {
|
||||||
|
case COMPONENT_KERNEL:
|
||||||
|
case COMPONENT_UNSPEC:
|
||||||
|
if (define_prefix)
|
||||||
|
break;
|
||||||
|
|
||||||
|
print_start_section("system_config",
|
||||||
|
"Scanning system configuration...",
|
||||||
|
NULL, /* define_comment never used here */
|
||||||
|
NULL); /* define_prefix always NULL here */
|
||||||
|
if (check_procfs()) {
|
||||||
|
probe_unprivileged_disabled();
|
||||||
|
probe_jit_enable();
|
||||||
|
probe_jit_harden();
|
||||||
|
probe_jit_kallsyms();
|
||||||
|
probe_jit_limit();
|
||||||
|
} else {
|
||||||
|
p_info("/* procfs not mounted, skipping related probes */");
|
||||||
|
}
|
||||||
|
probe_kernel_image_config();
|
||||||
|
print_end_section();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool section_syscall_config(const char *define_prefix)
|
||||||
|
{
|
||||||
|
bool res;
|
||||||
|
|
||||||
|
print_start_section("syscall_config",
|
||||||
|
"Scanning system call availability...",
|
||||||
|
"/*** System call availability ***/",
|
||||||
|
define_prefix);
|
||||||
|
res = probe_bpf_syscall(define_prefix);
|
||||||
|
print_end_section();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
section_program_types(bool *supported_types, const char *define_prefix,
|
||||||
|
__u32 ifindex)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
print_start_section("program_types",
|
||||||
|
"Scanning eBPF program types...",
|
||||||
|
"/*** eBPF program types ***/",
|
||||||
|
define_prefix);
|
||||||
|
|
||||||
|
for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++)
|
||||||
|
probe_prog_type(i, supported_types, define_prefix, ifindex);
|
||||||
|
|
||||||
|
print_end_section();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void section_map_types(const char *define_prefix, __u32 ifindex)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
print_start_section("map_types",
|
||||||
|
"Scanning eBPF map types...",
|
||||||
|
"/*** eBPF map types ***/",
|
||||||
|
define_prefix);
|
||||||
|
|
||||||
|
for (i = BPF_MAP_TYPE_UNSPEC + 1; i < map_type_name_size; i++)
|
||||||
|
probe_map_type(i, define_prefix, ifindex);
|
||||||
|
|
||||||
|
print_end_section();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
section_helpers(bool *supported_types, const char *define_prefix, __u32 ifindex)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
print_start_section("helpers",
|
||||||
|
"Scanning eBPF helper functions...",
|
||||||
|
"/*** eBPF helper functions ***/",
|
||||||
|
define_prefix);
|
||||||
|
|
||||||
|
if (define_prefix)
|
||||||
|
printf("/*\n"
|
||||||
|
" * Use %sHAVE_PROG_TYPE_HELPER(prog_type_name, helper_name)\n"
|
||||||
|
" * to determine if <helper_name> is available for <prog_type_name>,\n"
|
||||||
|
" * e.g.\n"
|
||||||
|
" * #if %sHAVE_PROG_TYPE_HELPER(xdp, bpf_redirect)\n"
|
||||||
|
" * // do stuff with this helper\n"
|
||||||
|
" * #elif\n"
|
||||||
|
" * // use a workaround\n"
|
||||||
|
" * #endif\n"
|
||||||
|
" */\n"
|
||||||
|
"#define %sHAVE_PROG_TYPE_HELPER(prog_type, helper) \\\n"
|
||||||
|
" %sBPF__PROG_TYPE_ ## prog_type ## __HELPER_ ## helper\n",
|
||||||
|
define_prefix, define_prefix, define_prefix,
|
||||||
|
define_prefix);
|
||||||
|
for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++)
|
||||||
|
probe_helpers_for_progtype(i, supported_types[i],
|
||||||
|
define_prefix, ifindex);
|
||||||
|
|
||||||
|
print_end_section();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void section_misc(const char *define_prefix, __u32 ifindex)
|
||||||
|
{
|
||||||
|
print_start_section("misc",
|
||||||
|
"Scanning miscellaneous eBPF features...",
|
||||||
|
"/*** eBPF misc features ***/",
|
||||||
|
define_prefix);
|
||||||
|
probe_large_insn_limit(define_prefix, ifindex);
|
||||||
|
print_end_section();
|
||||||
|
}
|
||||||
|
|
||||||
static int do_probe(int argc, char **argv)
|
static int do_probe(int argc, char **argv)
|
||||||
{
|
{
|
||||||
enum probe_component target = COMPONENT_UNSPEC;
|
enum probe_component target = COMPONENT_UNSPEC;
|
||||||
const char *define_prefix = NULL;
|
const char *define_prefix = NULL;
|
||||||
bool supported_types[128] = {};
|
bool supported_types[128] = {};
|
||||||
__u32 ifindex = 0;
|
__u32 ifindex = 0;
|
||||||
unsigned int i;
|
|
||||||
char *ifname;
|
char *ifname;
|
||||||
|
|
||||||
/* Detection assumes user has sufficient privileges (CAP_SYS_ADMIN).
|
/* Detection assumes user has sufficient privileges (CAP_SYS_ADMIN).
|
||||||
|
@ -658,97 +769,19 @@ static int do_probe(int argc, char **argv)
|
||||||
jsonw_start_object(json_wtr);
|
jsonw_start_object(json_wtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (target) {
|
section_system_config(target, define_prefix);
|
||||||
case COMPONENT_KERNEL:
|
if (!section_syscall_config(define_prefix))
|
||||||
case COMPONENT_UNSPEC:
|
|
||||||
if (define_prefix)
|
|
||||||
break;
|
|
||||||
|
|
||||||
print_start_section("system_config",
|
|
||||||
"Scanning system configuration...",
|
|
||||||
NULL, /* define_comment never used here */
|
|
||||||
NULL); /* define_prefix always NULL here */
|
|
||||||
if (check_procfs()) {
|
|
||||||
probe_unprivileged_disabled();
|
|
||||||
probe_jit_enable();
|
|
||||||
probe_jit_harden();
|
|
||||||
probe_jit_kallsyms();
|
|
||||||
probe_jit_limit();
|
|
||||||
} else {
|
|
||||||
p_info("/* procfs not mounted, skipping related probes */");
|
|
||||||
}
|
|
||||||
probe_kernel_image_config();
|
|
||||||
if (json_output)
|
|
||||||
jsonw_end_object(json_wtr);
|
|
||||||
else
|
|
||||||
printf("\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
print_start_section("syscall_config",
|
|
||||||
"Scanning system call availability...",
|
|
||||||
"/*** System call availability ***/",
|
|
||||||
define_prefix);
|
|
||||||
|
|
||||||
if (!probe_bpf_syscall(define_prefix))
|
|
||||||
/* bpf() syscall unavailable, don't probe other BPF features */
|
/* bpf() syscall unavailable, don't probe other BPF features */
|
||||||
goto exit_close_json;
|
goto exit_close_json;
|
||||||
|
section_program_types(supported_types, define_prefix, ifindex);
|
||||||
print_end_then_start_section("program_types",
|
section_map_types(define_prefix, ifindex);
|
||||||
"Scanning eBPF program types...",
|
section_helpers(supported_types, define_prefix, ifindex);
|
||||||
"/*** eBPF program types ***/",
|
section_misc(define_prefix, ifindex);
|
||||||
define_prefix);
|
|
||||||
|
|
||||||
for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++)
|
|
||||||
probe_prog_type(i, supported_types, define_prefix, ifindex);
|
|
||||||
|
|
||||||
print_end_then_start_section("map_types",
|
|
||||||
"Scanning eBPF map types...",
|
|
||||||
"/*** eBPF map types ***/",
|
|
||||||
define_prefix);
|
|
||||||
|
|
||||||
for (i = BPF_MAP_TYPE_UNSPEC + 1; i < map_type_name_size; i++)
|
|
||||||
probe_map_type(i, define_prefix, ifindex);
|
|
||||||
|
|
||||||
print_end_then_start_section("helpers",
|
|
||||||
"Scanning eBPF helper functions...",
|
|
||||||
"/*** eBPF helper functions ***/",
|
|
||||||
define_prefix);
|
|
||||||
|
|
||||||
if (define_prefix)
|
|
||||||
printf("/*\n"
|
|
||||||
" * Use %sHAVE_PROG_TYPE_HELPER(prog_type_name, helper_name)\n"
|
|
||||||
" * to determine if <helper_name> is available for <prog_type_name>,\n"
|
|
||||||
" * e.g.\n"
|
|
||||||
" * #if %sHAVE_PROG_TYPE_HELPER(xdp, bpf_redirect)\n"
|
|
||||||
" * // do stuff with this helper\n"
|
|
||||||
" * #elif\n"
|
|
||||||
" * // use a workaround\n"
|
|
||||||
" * #endif\n"
|
|
||||||
" */\n"
|
|
||||||
"#define %sHAVE_PROG_TYPE_HELPER(prog_type, helper) \\\n"
|
|
||||||
" %sBPF__PROG_TYPE_ ## prog_type ## __HELPER_ ## helper\n",
|
|
||||||
define_prefix, define_prefix, define_prefix,
|
|
||||||
define_prefix);
|
|
||||||
for (i = BPF_PROG_TYPE_UNSPEC + 1; i < ARRAY_SIZE(prog_type_name); i++)
|
|
||||||
probe_helpers_for_progtype(i, supported_types[i],
|
|
||||||
define_prefix, ifindex);
|
|
||||||
|
|
||||||
print_end_then_start_section("misc",
|
|
||||||
"Scanning miscellaneous eBPF features...",
|
|
||||||
"/*** eBPF misc features ***/",
|
|
||||||
define_prefix);
|
|
||||||
probe_large_insn_limit(define_prefix, ifindex);
|
|
||||||
|
|
||||||
exit_close_json:
|
exit_close_json:
|
||||||
if (json_output) {
|
if (json_output)
|
||||||
/* End current "section" of probes */
|
|
||||||
jsonw_end_object(json_wtr);
|
|
||||||
/* End root object */
|
/* End root object */
|
||||||
jsonw_end_object(json_wtr);
|
jsonw_end_object(json_wtr);
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue