1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
From 257259dd79d103f23342b1f0a3d608571a0ad549 Mon Sep 17 00:00:00 2001
From: Roy Marples <roy@marples.name>
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 <errno.h>
#include <fcntl.h>
-#include <paths.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
@@ -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;
|