/* * Pass a packet to the higher levels. */ void elread(struct el_softc *sc, int len) { struct ifnet *ifp = &sc->sc_ethercom.ec_if; struct mbuf *m; if (len <= sizeof(struct ether_header) || len > ETHER_MAX_LEN) { printf("%s: invalid packet size %d; dropping\n", device_xname(sc->sc_dev), len); ifp->if_ierrors++; return; } /* Pull packet off interface. */ m = elget(sc, len); if (m == 0) { ifp->if_ierrors++; return; } ifp->if_ipackets++; /* * Check if there's a BPF listener on this interface. * If so, hand off the raw packet to BPF. */ bpf_mtap(ifp, m); if_percpuq_enqueue(ifp->if_percpuq, m); }
/* * Pass a packet to the higher levels. */ inline void qe_read(struct qe_softc *sc, int idx, int len) { struct ifnet *ifp = &sc->sc_ethercom.ec_if; struct mbuf *m; if (len <= sizeof(struct ether_header) || len > ETHERMTU + sizeof(struct ether_header)) { printf("%s: invalid packet size %d; dropping\n", ifp->if_xname, len); ifp->if_ierrors++; return; } /* * Pull packet off interface. */ m = qe_get(sc, idx, len); if (m == NULL) { ifp->if_ierrors++; return; } ifp->if_ipackets++; /* * Check if there's a BPF listener on this interface. * If so, hand off the raw packet to BPF. */ bpf_mtap(ifp, m); /* Pass the packet up. */ if_percpuq_enqueue(ifp->if_percpuq, m); }