summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/usb_ethersubr.c
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>2000-01-13 20:13:58 +0000
committerwpaul <wpaul@FreeBSD.org>2000-01-13 20:13:58 +0000
commit499ef83f97171db96e76e3da1c46fc6950ab90d9 (patch)
tree097e5fbfde43d66cb433ca9c42ec2cc1866f3ada /sys/dev/usb/usb_ethersubr.c
parent7eac0e762afc8308262687ae9f51e41336831d8d (diff)
downloadFreeBSD-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.c27
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);
}
OpenPOWER on IntegriCloud