From f1f0123e88adadd09a074577a66eedcdcfa047bc Mon Sep 17 00:00:00 2001 From: dwmalone Date: Sun, 26 Jun 2005 18:11:11 +0000 Subject: Fix some long standing bugs in writing to the BPF device attached to a DLT_NULL interface. In particular: 1) Consistently use type u_int32_t for the header of a DLT_NULL device - it continues to represent the address family as always. 2) In the DLT_NULL case get bpf_movein to store the u_int32_t in a sockaddr rather than in the mbuf, to be consistent with all the DLT types. 3) Consequently fix a bug in bpf_movein/bpfwrite which only permitted packets up to 4 bytes less than the MTU to be written. 4) Fix all DLT_NULL devices to have the code required to allow writing to their bpf devices. 5) Move the code to allow writing to if_lo from if_simloop to looutput, because it only applies to DLT_NULL devices but was being applied to other devices that use if_simloop possibly incorrectly. PR: 82157 Submitted by: Matthew Luckie Approved by: re (scottl) --- sys/i4b/driver/i4b_ipr.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'sys/i4b') diff --git a/sys/i4b/driver/i4b_ipr.c b/sys/i4b/driver/i4b_ipr.c index 60d8a46..1309d73 100644 --- a/sys/i4b/driver/i4b_ipr.c +++ b/sys/i4b/driver/i4b_ipr.c @@ -272,7 +272,7 @@ i4biprattach(void *dummy) if_attach(sc->sc_ifp); - bpfattach(sc->sc_ifp, DLT_NULL, sizeof(u_int)); + bpfattach(sc->sc_ifp, DLT_NULL, sizeof(u_int32_t)); } } @@ -288,12 +288,20 @@ i4biproutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, int s; struct ifqueue *ifq; struct ip *ip; + u_int32_t af; s = SPLI4B(); sc = ifp->if_softc; unit = ifp->if_dunit; + /* BPF writes need to be handled specially. */ + if(dst->sa_family == AF_UNSPEC) + { + bcopy(dst->sa_data, &af, sizeof(af)); + dst->sa_family = af; + } + /* check for IP */ if(dst->sa_family != AF_INET) -- cgit v1.1