Index: sys/dev/age/if_age.c =================================================================== --- sys/dev/age/if_age.c (revision 219079) +++ sys/dev/age/if_age.c (working copy) @@ -2259,7 +2259,7 @@ struct ifnet *ifp; struct mbuf *mp, *m; uint32_t status, index, vtag; - int count, nsegs, pktlen; + int count, csum_ignore, nsegs, pktlen; int rx_cons; AGE_LOCK_ASSERT(sc); @@ -2271,21 +2271,24 @@ nsegs = AGE_RX_NSEGS(index); sc->age_cdata.age_rxlen = AGE_RX_BYTES(le32toh(rxrd->len)); - if ((status & AGE_RRD_ERROR) != 0 && - (status & (AGE_RRD_CRC | AGE_RRD_CODE | AGE_RRD_DRIBBLE | - AGE_RRD_RUNT | AGE_RRD_OFLOW | AGE_RRD_TRUNC)) != 0) { - /* - * We want to pass the following frames to upper - * layer regardless of error status of Rx return - * ring. - * - * o IP/TCP/UDP checksum is bad. - * o frame length and protocol specific length - * does not match. - */ - sc->age_cdata.age_rx_cons += nsegs; - sc->age_cdata.age_rx_cons %= AGE_RX_RING_CNT; - return; + csum_ignore = 0; + if ((status & AGE_RRD_ERROR) != 0) { + if ((status & (AGE_RRD_CRC | AGE_RRD_CODE | AGE_RRD_DRIBBLE | + AGE_RRD_RUNT | AGE_RRD_OFLOW | AGE_RRD_TRUNC)) != 0) { + /* + * We want to pass the following frames to upper + * layer regardless of error status of Rx return + * ring. + * + * o IP/TCP/UDP checksum is bad. + * o frame length and protocol specific length + * does not match. + */ + sc->age_cdata.age_rx_cons += nsegs; + sc->age_cdata.age_rx_cons %= AGE_RX_RING_CNT; + return; + } + csum_ignore++; } pktlen = 0; @@ -2364,7 +2367,7 @@ * proven to work on L1 I'll enable it. */ if ((ifp->if_capenable & IFCAP_RXCSUM) != 0 && - (status & AGE_RRD_IPV4) != 0) { + csum_ignore == 0 && (status & AGE_RRD_IPV4) != 0) { m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; if ((status & AGE_RRD_IPCSUM_NOK) == 0) m->m_pkthdr.csum_flags |= CSUM_IP_VALID;