diff options
author | wpaul <wpaul@FreeBSD.org> | 2000-01-13 20:13:58 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 2000-01-13 20:13:58 +0000 |
commit | 499ef83f97171db96e76e3da1c46fc6950ab90d9 (patch) | |
tree | 097e5fbfde43d66cb433ca9c42ec2cc1866f3ada /sys/dev/usb/usb_ethersubr.c | |
parent | 7eac0e762afc8308262687ae9f51e41336831d8d (diff) | |
download | FreeBSD-src-499ef83f97171db96e76e3da1c46fc6950ab90d9.zip FreeBSD-src-499ef83f97171db96e76e3da1c46fc6950ab90d9.tar.gz |
Bunch of updates:
- Add vendor/device ID for Corega USB-T ethernet adapter to necessary
places so that it will work with the kue driver.
- Add vendor/device ID for CATC Netmate devices for driver to be added
soon.
- Get really crazy about netisr stuff: avoid doing any mbuf allocations
or deallocations at splbio/splusb.
- Fix if_aue driver so that it works with LinkSys USB100TX: you need
to flip the GPIO bits just the right way to put the PHY in the right
mode.
Diffstat (limited to 'sys/dev/usb/usb_ethersubr.c')
-rw-r--r-- | sys/dev/usb/usb_ethersubr.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/sys/dev/usb/usb_ethersubr.c b/sys/dev/usb/usb_ethersubr.c index ffe8a7d..332be18 100644 --- a/sys/dev/usb/usb_ethersubr.c +++ b/sys/dev/usb/usb_ethersubr.c @@ -63,6 +63,7 @@ #include <net/if_arp.h> #include <net/ethernet.h> #include <net/netisr.h> +#include <net/bpf.h> #include <dev/usb/usb.h> #include <dev/usb/usb_ethersubr.h> @@ -86,6 +87,7 @@ static void usbintr() { struct ether_header *eh; struct mbuf *m; + struct usb_qdat *q; struct ifnet *ifp; struct usb_ifent *e; int s; @@ -98,9 +100,32 @@ static void usbintr() if (m == NULL) break; eh = mtod(m, struct ether_header *); + q = (struct usb_qdat *)m->m_pkthdr.rcvif; + ifp = q->ifp; + m->m_pkthdr.rcvif = ifp; + /* + * Handle BPF listeners. Let the BPF user see the packet, but + * don't pass it up to the ether_input() layer unless it's + * a broadcast packet, multicast packet, matches our ethernet + * address or the interface is in promiscuous mode. + */ + if (ifp->if_bpf) { + bpf_mtap(ifp, m); + if (ifp->if_flags & IFF_PROMISC && + (bcmp(eh->ether_dhost, + ((struct arpcom *)ifp->if_softc)->ac_enaddr, + ETHER_ADDR_LEN) && !(eh->ether_dhost[0] & 1))) { + m_freem(m); + goto done; + } + } + m_adj(m, sizeof(struct ether_header)); - ifp = m->m_pkthdr.rcvif; ether_input(ifp, eh, m); +done: + + /* Re-arm the receiver */ + (*q->if_rxstart)(ifp); if (ifp->if_snd.ifq_head != NULL) (*ifp->if_start)(ifp); } |