From 257259dd79d103f23342b1f0a3d608571a0ad549 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Thu, 13 Apr 2023 17:43:11 +0100 Subject: [PATCH] bpf: Always open /dev/bpf directly Ignore _PATH_BPF as that's really a NetBSDism. If /dev/bpf throws a wobbly then try /dev/bpfN for older kernels. This allows cloning BPF on more BSD systems. --- src/bpf.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/bpf.c b/src/bpf.c index e4b56f3d..b75bfb04 100644 --- a/src/bpf.c +++ b/src/bpf.c @@ -45,7 +45,6 @@ #include #include -#include #include #include #include @@ -155,6 +154,11 @@ bpf_open(const struct interface *ifp, struct bpf_version pv = { .bv_major = 0, .bv_minor = 0 }; struct ifreq ifr = { .ifr_flags = 0 }; int ibuf_len = 0; +#ifdef O_CLOEXEC +#define BPF_OPEN_FLAGS O_RDWR | O_NONBLOCK | O_CLOEXEC +#else +#define BPF_OPEN_FLAGS O_RDWR | O_NONBLOCK +#endif #ifdef BIOCIMMEDIATE unsigned int flags; #endif @@ -167,25 +171,19 @@ bpf_open(const struct interface *ifp, return NULL; bpf->bpf_ifp = ifp; -#ifdef _PATH_BPF - bpf->bpf_fd = open(_PATH_BPF, O_RDWR | O_NONBLOCK -#ifdef O_CLOEXEC - | O_CLOEXEC -#endif - ); -#else - char device[32]; - int n = 0; + /* /dev/bpf is a cloner on modern kernels */ + bpf->bpf_fd = open("/dev/bpf", BPF_OPEN_FLAGS); - do { - snprintf(device, sizeof(device), "/dev/bpf%d", n++); - bpf->bpf_fd = open(device, O_RDWR | O_NONBLOCK -#ifdef O_CLOEXEC - | O_CLOEXEC -#endif - ); - } while (bpf->bpf_fd == -1 && errno == EBUSY); -#endif + /* Support older kernels where /dev/bpf is not a cloner */ + if (bpf->bpf_fd == -1) { + char device[32]; + int n = 0; + + do { + snprintf(device, sizeof(device), "/dev/bpf%d", n++); + bpf->bpf_fd = open(device, BPF_OPEN_FLAGS); + } while (bpf->bpf_fd == -1 && errno == EBUSY); + } if (bpf->bpf_fd == -1) goto eexit;