From: Roy Marples Date: Thu, 13 Apr 2023 16:43:11 +0000 (+0100) Subject: bpf: Always open /dev/bpf directly X-Git-Tag: v10.0.1~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=257259dd79d103f23342b1f0a3d608571a0ad549;p=thirdparty%2Fdhcpcd.git 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. --- 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;