MFC r1.181

Check for multicast destination on bpf injected packets.
This commit is contained in:
thompsa 2007-10-24 21:15:54 +00:00
parent 2965f0f818
commit b29909d99c

View File

@ -93,7 +93,7 @@ static void bpf_attachd(struct bpf_d *, struct bpf_if *);
static void bpf_detachd(struct bpf_d *);
static void bpf_freed(struct bpf_d *);
static void bpf_mcopy(const void *, void *, size_t);
static int bpf_movein(struct uio *, int, int,
static int bpf_movein(struct uio *, int, struct ifnet *,
struct mbuf **, struct sockaddr *, struct bpf_insn *);
static int bpf_setif(struct bpf_d *, struct ifreq *);
static void bpf_timed_out(void *);
@ -153,9 +153,10 @@ static struct filterops bpfread_filtops =
{ 1, NULL, filt_bpfdetach, filt_bpfread };
static int
bpf_movein(struct uio *uio, int linktype, int mtu, struct mbuf **mp,
bpf_movein(struct uio *uio, int linktype, struct ifnet *ifp, struct mbuf **mp,
struct sockaddr *sockp, struct bpf_insn *wfilter)
{
struct ether_header *eh;
struct mbuf *m;
int error;
int len;
@ -224,7 +225,7 @@ bpf_movein(struct uio *uio, int linktype, int mtu, struct mbuf **mp,
len = uio->uio_resid;
if (len - hlen > mtu)
if (len - hlen > ifp->if_mtu)
return (EMSGSIZE);
if ((unsigned)len > MCLBYTES)
@ -256,6 +257,20 @@ bpf_movein(struct uio *uio, int linktype, int mtu, struct mbuf **mp,
goto bad;
}
/* Check for multicast destination */
switch (linktype) {
case DLT_EN10MB:
eh = mtod(m, struct ether_header *);
if (ETHER_IS_MULTICAST(eh->ether_dhost)) {
if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost,
ETHER_ADDR_LEN) == 0)
m->m_flags |= M_BCAST;
else
m->m_flags |= M_MCAST;
}
break;
}
/*
* Make room for link header, and copy it to sockaddr
*/
@ -586,7 +601,7 @@ bpfwrite(struct cdev *dev, struct uio *uio, int ioflag)
return (0);
bzero(&dst, sizeof(dst));
error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, ifp->if_mtu,
error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, ifp,
&m, &dst, d->bd_wfilter);
if (error)
return (error);