diff --git a/bpf_queue.c b/bpf_queue.c index 05788c5..1ddc9f9 100644 --- a/bpf_queue.c +++ b/bpf_queue.c @@ -650,14 +650,17 @@ bpf_queue_open1(struct quark_queue *qq, int use_fentry) if (use_fentry) { bpf_program__set_autoload(p->progs.fexit__inet_csk_accept, 1); bpf_program__set_autoload(p->progs.fexit__tcp_v4_connect, 1); - bpf_program__set_autoload(p->progs.fexit__tcp_v6_connect, 1); + if (ipv6_supported()) + bpf_program__set_autoload(p->progs.fexit__tcp_v6_connect, 1); bpf_program__set_autoload(p->progs.fentry__tcp_close, 1); } else { bpf_program__set_autoload(p->progs.kretprobe__inet_csk_accept, 1); bpf_program__set_autoload(p->progs.kprobe__tcp_v4_connect, 1); bpf_program__set_autoload(p->progs.kretprobe__tcp_v4_connect, 1); - bpf_program__set_autoload(p->progs.kprobe__tcp_v6_connect, 1); - bpf_program__set_autoload(p->progs.kretprobe__tcp_v6_connect, 1); + if (ipv6_supported()) { + bpf_program__set_autoload(p->progs.kprobe__tcp_v6_connect, 1); + bpf_program__set_autoload(p->progs.kretprobe__tcp_v6_connect, 1); + } bpf_program__set_autoload(p->progs.kprobe__tcp_close, 1); } diff --git a/quark.c b/quark.c index 9de0407..20a4d8b 100644 --- a/quark.c +++ b/quark.c @@ -2094,9 +2094,11 @@ sproc_scrape(struct quark_queue *qq) r = sproc_net_tcp(qq, AF_INET, &socket_tmp_tree); if (r == -1) goto done; - r = sproc_net_tcp(qq, AF_INET6, &socket_tmp_tree); - if (r == -1) - goto done; + if (ipv6_supported()) { + r = sproc_net_tcp(qq, AF_INET6, &socket_tmp_tree); + if (r == -1) + goto done; + } by_inode = &socket_tmp_tree; } diff --git a/quark.h b/quark.h index 064553d..467392b 100644 --- a/quark.h +++ b/quark.h @@ -105,6 +105,7 @@ int strtou64(u64 *, const char *, int); char *find_line(FILE *, const char *); char *find_line_p(const char *, const char *); char *load_file_nostat(int, size_t *); +int ipv6_supported(void); enum quark_verbosity_levels { QUARK_VL_SILENT, diff --git a/qutil.c b/qutil.c index 960aa9a..338a55b 100644 --- a/qutil.c +++ b/qutil.c @@ -215,6 +215,20 @@ load_file_nostat(int fd, size_t *total) return (buf); } +int +ipv6_supported(void) +{ + int fd; + int enabled = 0; + + if ((fd = socket(AF_INET6, SOCK_STREAM, 0)) != -1) { + enabled = 1; + close(fd); + } + + return (enabled); +} + void qlog_func(int pri, int do_errno, const char *func, int lineno, const char *fmt, ...)