From owner-freebsd-bugs Sat Jul 10 14:30: 7 1999 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id C231A14D5B for ; Sat, 10 Jul 1999 14:30:03 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id OAA69532; Sat, 10 Jul 1999 14:30:03 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Date: Sat, 10 Jul 1999 14:30:03 -0700 (PDT) Message-Id: <199907102130.OAA69532@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Craig Leres Subject: Re: kern/12543: [PATCH] cumulative error stats for fxp(4) Reply-To: Craig Leres Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR kern/12543; it has been noted by GNATS. From: Craig Leres To: dg@root.com Cc: FreeBSD-gnats-submit@FreeBSD.ORG, vern@ee.lbl.gov (Vern Paxson) Subject: Re: kern/12543: [PATCH] cumulative error stats for fxp(4) Date: Sat, 10 Jul 1999 14:27:45 PDT > Perhaps it would also be better if the stats were stored as a ISO 8802.3 > MIB and made available via sysctl like what is done inside the if_ed driver. Ok, here's a version (diff'ed against 3.2-RELEASE) that does this. It also adds a new bpf hook that allows packet capture interfaces to report missed packets. If you want to ifdef the stats collection, it's ok with me but the expense of adding up a few counters is minor compared to fetching the stat struct over the bus (which you have to do anyway for collision stats). Plus, this is only done once a second. One question I had is do you know what the dot3Compliance field means? It's not in RFC 1650 but I think it's an indication of what stats are collected and I'm not sure just setting it to DOT3COMPLIANCE_COLLS is %100 correct. Please take a look at let me know what you think. Craig ------ *** if_fxp.c.virgin Tue Jul 6 20:34:12 1999 --- if_fxp.c.new Sat Jul 10 14:04:17 1999 *************** *** 32,37 **** --- 32,41 ---- /* * Intel EtherExpress Pro/100B PCI Fast Ethernet driver + * as described on: + * + * http://developer.intel.com/design/network/mature/82557.htm + * */ #include "bpfilter.h" *************** *** 45,50 **** --- 49,55 ---- #include #include + #include #include #ifdef NS *************** *** 585,590 **** --- 590,600 ---- ifp->if_ioctl = fxp_ioctl; ifp->if_start = fxp_start; ifp->if_watchdog = fxp_watchdog; + ifp->if_linkmib = &sc->mibdata; + ifp->if_linkmiblen = sizeof(sc->mibdata); + sc->mibdata.dot3StatsEtherChipSet = + DOT3CHIPSET(dot3VendorIntel, dot3ChipSetIntel82557); + sc->mibdata.dot3Compliance = DOT3COMPLIANCE_COLLS; /* * Attach the interface. *************** *** 1058,1069 **** --- 1068,1083 ---- FXP_RFA_STATUS_IAMATCH) && (eh->ether_dhost[0] & 1) == 0) { + #ifde BRIDGE dropit: + #endif if (m) m_freem(m); goto rcvloop; } + #ifdef BRIDGE getit: + #endif m->m_data += sizeof(struct ether_header); m->m_len -= *************** *** 1107,1113 **** struct ifnet *ifp = &sc->sc_if; struct fxp_stats *sp = sc->fxp_stats; struct fxp_cb_tx *txp; ! int s; ifp->if_opackets += sp->tx_good; ifp->if_collisions += sp->tx_total_collisions; --- 1121,1128 ---- struct ifnet *ifp = &sc->sc_if; struct fxp_stats *sp = sc->fxp_stats; struct fxp_cb_tx *txp; ! struct ifmib_iso_8802_3 *mib = &sc->mibdata; ! int s, missed; ifp->if_opackets += sp->tx_good; ifp->if_collisions += sp->tx_total_collisions; *************** *** 1134,1140 **** --- 1149,1188 ---- if (tx_threshold < 192) tx_threshold += 64; } + + /* Update RFC1650 totals */ + mib->dot3StatsAlignmentErrors += sp->rx_alignment_errors; + mib->dot3StatsFCSErrors += sp->rx_crc_errors; + mib->dot3StatsSingleCollisionFrames += sp->tx_single_collisions; + mib->dot3StatsCollFrequencies[0] += sp->tx_single_collisions; + mib->dot3StatsMultipleCollisionFrames += sp->tx_multiple_collisions; + mib->dot3StatsDeferredTransmissions += sp->tx_deffered; + mib->dot3StatsLateCollisions += sp->tx_latecols; + mib->dot3StatsExcessiveCollisions += sp->tx_maxcols; + mib->dot3StatsCollFrequencies[15] += sp->tx_maxcols; + mib->dot3StatsInternalMacTransmitErrors += sp->tx_underruns; + mib->dot3StatsCarrierSenseErrors += sp->tx_lostcrs; + mib->dot3StatsInternalMacReceiveErrors += sp->rx_overrun_errors; + missed = sp->rx_overrun_errors + sp->rx_rnr_errors; + mib->dot3StatsMissedFrames += missed; + #ifdef notdef + mib->dot3StatsFrameTooLongs += ???; + /* Doesn't apply to non-aui ethernet */ + mib->dot3StatsSQETestErrors += 0; + #endif + + #ifdef notdef + /* Things the 82557 tells us about we can't report */ + sp->rx_cdt_errors; /* collisions during frame reception */ + sp->rx_shortframes; /* frame shorter than minimum */ + #endif + s = splimp(); + #if NBPFILTER > 0 + /* Call bpf_dropcnt() at elevated ipl */ + if (ifp->if_bpf != NULL && missed != 0) + bpf_dropcnt(ifp, missed); + #endif /* * Release any xmit buffers that have completed DMA. This isn't * strictly necessary to do here, but it's advantagous for mbufs RCS file: RCS/if_fxpvar.h,v retrieving revision 1.1 diff -c -r1.1 if_fxpvar.h *** /tmp/,RCSt1D84823 Sat Jul 10 14:08:50 1999 --- if_fxpvar.h Wed Jul 7 12:52:32 1999 *************** *** 65,70 **** --- 65,71 ---- int phy_primary_addr; /* address of primary PHY */ int phy_primary_device; /* device type of primary PHY */ int phy_10Mbps_only; /* PHY is 10Mbps-only device */ + struct ifmib_iso_8802_3 mibdata; /* stuff for network mgmt */ }; /* Macros to ease CSR access. */ *** bpf.c.virgin Sat Jul 10 14:09:23 1999 --- bpf.c.new Sat Jul 10 14:10:44 1999 *************** *** 1107,1112 **** --- 1107,1127 ---- } /* + * Hook for drivers to report dropped packets + */ + void + bpf_dropcnt(ifp, drop) + struct ifnet *ifp; + u_int drop; + { + struct bpf_if *bp = ifp->if_bpf; + struct bpf_d *d; + + for (d = bp->bif_dlist; d != NULL; d = d->bd_next) + d->bd_dcount += drop; + } + + /* * Move the packet data from interface memory (pkt) into the * store buffer. Return 1 if it's time to wakeup a listener (buffer full), * otherwise 0. "copy" is the routine called to do the actual data *** bpf.h.virgin Sat Jul 10 14:12:34 1999 --- bpf.h.new Sat Jul 10 14:13:01 1999 *************** *** 230,235 **** --- 230,236 ---- void bpfattach __P((struct ifnet *, u_int, u_int)); void bpfilterattach __P((int)); u_int bpf_filter __P((struct bpf_insn *, u_char *, u_int, u_int)); + void bpf_dropcnt __P((struct ifnet *, u_int)); #endif /* To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message