aboutsummaryrefslogtreecommitdiff
path: root/sys/net/bpf.c
diff options
context:
space:
mode:
authorAndrey V. Elsukov <ae@FreeBSD.org>2019-03-19 10:29:32 +0000
committerAndrey V. Elsukov <ae@FreeBSD.org>2019-03-19 10:29:32 +0000
commitc5be49da01dc36e7e681026bd1a9b271929d2bd7 (patch)
tree4af65c9f0b4ce54d1e5e977371b88945c020898b /sys/net/bpf.c
parent07302582b69d9c084a146d2ddddf93eec8efa62e (diff)
downloadsrc-c5be49da01dc36e7e681026bd1a9b271929d2bd7.tar.gz
src-c5be49da01dc36e7e681026bd1a9b271929d2bd7.zip
Convert allocation of bpf_if in bpfattach2 from M_NOWAIT to M_WAITOK
and remove possible panic condition. It is already allowed to sleep in bpfattach[2], since BPF_LOCK was converted to SX lock in r332388. Also move KASSERT() to the top of function and make full initialization before bpf_if will be linked to BPF's list of interfaces. MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=345292
Diffstat (limited to 'sys/net/bpf.c')
-rw-r--r--sys/net/bpf.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index 32785f19668d..699679369c2d 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -2592,16 +2592,16 @@ bpfattach2(struct ifnet *ifp, u_int dlt, u_int hdrlen, struct bpf_if **driverp)
{
struct bpf_if *bp;
- bp = malloc(sizeof(*bp), M_BPF, M_NOWAIT | M_ZERO);
- if (bp == NULL)
- panic("bpfattach");
+ KASSERT(*driverp == NULL, ("bpfattach2: driverp already initialized"));
+
+ bp = malloc(sizeof(*bp), M_BPF, M_WAITOK | M_ZERO);
+ rw_init(&bp->bif_lock, "bpf interface lock");
LIST_INIT(&bp->bif_dlist);
LIST_INIT(&bp->bif_wlist);
bp->bif_ifp = ifp;
bp->bif_dlt = dlt;
- rw_init(&bp->bif_lock, "bpf interface lock");
- KASSERT(*driverp == NULL, ("bpfattach2: driverp already initialized"));
+ bp->bif_hdrlen = hdrlen;
bp->bif_bpf = driverp;
*driverp = bp;
@@ -2609,8 +2609,6 @@ bpfattach2(struct ifnet *ifp, u_int dlt, u_int hdrlen, struct bpf_if **driverp)
LIST_INSERT_HEAD(&bpf_iflist, bp, bif_next);
BPF_UNLOCK();
- bp->bif_hdrlen = hdrlen;
-
if (bootverbose && IS_DEFAULT_VNET(curvnet))
if_printf(ifp, "bpf attached\n");
}