diff options
author | dwmalone <dwmalone@FreeBSD.org> | 2005-06-26 18:11:11 +0000 |
---|---|---|
committer | dwmalone <dwmalone@FreeBSD.org> | 2005-06-26 18:11:11 +0000 |
commit | f1f0123e88adadd09a074577a66eedcdcfa047bc (patch) | |
tree | 5510fdb16b02fe3d6d31530943a20683c2479916 /sys/net/if_faith.c | |
parent | 573c1a10201fed9f95880691f90de7ade6ee0d48 (diff) | |
download | FreeBSD-src-f1f0123e88adadd09a074577a66eedcdcfa047bc.zip FreeBSD-src-f1f0123e88adadd09a074577a66eedcdcfa047bc.tar.gz |
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 <mjl@luckie.org.nz>
Approved by: re (scottl)
Diffstat (limited to 'sys/net/if_faith.c')
-rw-r--r-- | sys/net/if_faith.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/sys/net/if_faith.c b/sys/net/if_faith.c index 5835811..36bc0cd 100644 --- a/sys/net/if_faith.c +++ b/sys/net/if_faith.c @@ -187,7 +187,7 @@ faith_clone_create(ifc, unit) ifp->if_addrlen = 0; ifp->if_snd.ifq_maxlen = ifqmaxlen; if_attach(ifp); - bpfattach(ifp, DLT_NULL, sizeof(u_int)); + bpfattach(ifp, DLT_NULL, sizeof(u_int32_t)); mtx_lock(&faith_mtx); LIST_INSERT_HEAD(&faith_softc_list, sc, sc_list); mtx_unlock(&faith_mtx); @@ -225,19 +225,18 @@ faithoutput(ifp, m, dst, rt) struct rtentry *rt; { int isr; + u_int32_t af; M_ASSERTPKTHDR(m); - /* BPF write needs to be handled specially */ + /* BPF writes need to be handled specially. */ if (dst->sa_family == AF_UNSPEC) { - dst->sa_family = *(mtod(m, int *)); - m->m_len -= sizeof(int); - m->m_pkthdr.len -= sizeof(int); - m->m_data += sizeof(int); + bcopy(dst->sa_data, &af, sizeof(af)); + dst->sa_family = af; } if (ifp->if_bpf) { - u_int32_t af = dst->sa_family; + af = dst->sa_family; bpf_mtap2(ifp->if_bpf, &af, sizeof(af), m); } |