From leres@fun.ee.lbl.gov Tue Jul  6 20:39:48 1999
Return-Path: <leres@fun.ee.lbl.gov>
Received: from fun.ee.lbl.gov (fun.ee.lbl.gov [131.243.1.81])
	by hub.freebsd.org (Postfix) with ESMTP id 3EC0314E28
	for <FreeBSD-gnats-submit@freebsd.org>; Tue,  6 Jul 1999 20:39:47 -0700 (PDT)
	(envelope-from leres@fun.ee.lbl.gov)
Received: (from leres@localhost)
	by fun.ee.lbl.gov (8.9.3/8.9.3) id UAA53077;
	Tue, 6 Jul 1999 20:39:47 -0700 (PDT)
Message-Id: <199907070339.UAA53077@fun.ee.lbl.gov>
Date: Tue, 06 Jul 1999 20:39:47 PDT
From: Craig Leres <leres@ee.lbl.gov>
Sender: leres@fun.ee.lbl.gov
To: FreeBSD-gnats-submit@freebsd.org
Subject: [PATCH] cumulative error stats for fxp(4)
X-Send-Pr-Version: 3.2

>Number:         12543
>Category:       kern
>Synopsis:       [fxp] [patch] cumulative error counters for fxp(4)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    yongari
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jul  6 20:40:02 PDT 1999
>Closed-Date:    Sun Sep 19 23:17:53 UTC 2010
>Last-Modified:  Sun Sep 19 23:17:53 UTC 2010
>Originator:     Craig Leres
>Release:        FreeBSD 3.2-RELEASE i386
>Organization:
Lawrence Berkeley National Laboratory
>Environment:

>Description:

	It would be really sweet if one could look at the long term
	error counters for the intel 10/100 card. This information
	can be invaluable in debugging network problems.

>How-To-Repeat:

	The fxp driver only keeps around the last set of incremental
	changes to the error counters.

>Fix:
	
	Add a new fxp_stats struct and add in new amounts fxp_stats_update().

RCS file: RCS/if_fxpvar.h,v
retrieving revision 1.1
diff -c -r1.1 if_fxpvar.h
*** /tmp/,RCSt1X53005	Tue Jul  6 20:33:45 1999
- --- if_fxpvar.h	Tue Jul  6 20:33:36 1999
***************
*** 56,61 ****
- --- 56,62 ----
  	int need_mcsetup;		/* multicast filter needs programming */
  	struct fxp_cb_tx *cbl_last;	/* last active TxCB in list */
  	struct fxp_stats *fxp_stats;	/* Pointer to interface stats */
+ 	struct fxp_stats fxp_tstats;	/* interface stats totals */
  	int rx_idle_secs;		/* # of seconds RX has been idle */
  	struct callout_handle stat_ch;	/* Handle for canceling our stat timeout */
  	struct fxp_cb_tx *cbl_base;	/* base of TxCB list */
*** if_fxp.c.virgin	Tue Jul  6 20:34:12 1999
- --- if_fxp.c.new	Tue Jul  6 20:36:00 1999
***************
*** 1058,1069 ****
- --- 1058,1073 ----
  					    FXP_RFA_STATUS_IAMATCH) &&
  					    (eh->ether_dhost[0] & 1)
  					    == 0) {
+ #ifdef BRIDGE
  dropit:
+ #endif
  					    if (m)
  						m_freem(m);
  					    goto rcvloop;
  					}
+ #ifdef BRIDGE
  getit:
+ #endif
  					m->m_data +=
  					    sizeof(struct ether_header);
  					m->m_len -=
***************
*** 1105,1111 ****
  {
  	struct fxp_softc *sc = arg;
  	struct ifnet *ifp = &sc->sc_if;
! 	struct fxp_stats *sp = sc->fxp_stats;
  	struct fxp_cb_tx *txp;
  	int s;
  
- --- 1109,1115 ----
  {
  	struct fxp_softc *sc = arg;
  	struct ifnet *ifp = &sc->sc_if;
! 	struct fxp_stats *sp = sc->fxp_stats, *sp2 = &sc->fxp_tstats;
  	struct fxp_cb_tx *txp;
  	int s;
  
***************
*** 1134,1139 ****
- --- 1138,1162 ----
  		if (tx_threshold < 192)
  			tx_threshold += 64;
  	}
+ 
+ 	/* Update totals */
+ 	sp2->tx_good += sp->tx_good;
+ 	sp2->tx_maxcols += sp->tx_maxcols;
+ 	sp2->tx_latecols += sp->tx_latecols;
+ 	sp2->tx_underruns += sp->tx_underruns;
+ 	sp2->tx_lostcrs += sp->tx_lostcrs;
+ 	sp2->tx_deffered += sp->tx_deffered;
+ 	sp2->tx_single_collisions += sp->tx_single_collisions;
+ 	sp2->tx_multiple_collisions += sp->tx_multiple_collisions;
+ 	sp2->tx_total_collisions += sp->tx_total_collisions;
+ 	sp2->rx_good += sp->rx_good;
+ 	sp2->rx_crc_errors += sp->rx_crc_errors;
+ 	sp2->rx_alignment_errors += sp->rx_alignment_errors;
+ 	sp2->rx_rnr_errors += sp->rx_rnr_errors;
+ 	sp2->rx_overrun_errors += sp->rx_overrun_errors;
+ 	sp2->rx_cdt_errors += sp->rx_cdt_errors;
+ 	sp2->rx_shortframes += sp->rx_shortframes;
+ 
  	s = splimp();
  	/*
  	 * Release any xmit buffers that have completed DMA. This isn't

-----BEGIN PGP SIGNATURE-----
Version: 2.6.2

iQCVAwUBN4LL2L2JLbUEFcrxAQHcwQQAtENXZEtPG9GCEiCrkbOh6f0455BV4ujJ
Jh7G4iPN66uqhOs3NemfPSvbLm5gLrnAM5Rhto/TDfi2LTdDZcH7B9dYZEMvPm59
bgRY1AvMKdwvtpjcg6ucuA6vN9gq6lSy3kArx9q3oYSVvETCdWdw2KMlVjk2jBfE
f7cc5n2FjlA=
=RtNR
-----END PGP SIGNATURE-----

>Release-Note:
>Audit-Trail:

From: David Greenman <dg@root.com>
To: Craig Leres <leres@ee.lbl.gov>
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: kern/12543: [PATCH] cumulative error stats for fxp(4) 
Date: Wed, 07 Jul 1999 01:38:05 -0700

 >>Description:
 >
 >	It would be really sweet if one could look at the long term
 >	error counters for the intel 10/100 card. This information
 >	can be invaluable in debugging network problems.
 >
 >>How-To-Repeat:
 >
 >	The fxp driver only keeps around the last set of incremental
 >	changes to the error counters.
 >
 >>Fix:
 >	
 >	Add a new fxp_stats struct and add in new amounts fxp_stats_update().
 
    Hello, Craig. I actually had counters like that in an early version of the
 driver but decided to remove them for performance reasons. I wonder if these
 should be hidden behind a compile time option?
 
 -DG
 
 David Greenman
 Co-founder/Principal Architect, The FreeBSD Project - http://www.freebsd.org
 Creator of high-performance Internet servers - http://www.terasolutions.com
 

From: Craig Leres <leres@ee.lbl.gov>
To: dg@root.com
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: kern/12543: [PATCH] cumulative error stats for fxp(4)
Date: Wed, 07 Jul 1999 02:40:03 PDT

 > >>Description:
 > >
 > >	It would be really sweet if one could look at the long term
 > >	error counters for the intel 10/100 card. This information
 > >	can be invaluable in debugging network problems.
 > >
 > >>How-To-Repeat:
 > >
 > >	The fxp driver only keeps around the last set of incremental
 > >	changes to the error counters.
 > >
 > >>Fix:
 > >	
 > >	Add a new fxp_stats struct and add in new amounts fxp_stats_update().
 > 
 >    Hello, Craig. I actually had counters like that in an early version of the
 > driver but decided to remove them for performance reasons. I wonder if these
 > should be hidden behind a compile time option?
 
 That would be fine with me.
 
 It would be nice if there was some way to tell at run time that the
 stats were available so that a C program or gdb script could tell if
 the stats are available.
 
 		Craig
 

From: David Greenman <dg@root.com>
To: Craig Leres <leres@ee.lbl.gov>
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: kern/12543: [PATCH] cumulative error stats for fxp(4) 
Date: Wed, 07 Jul 1999 03:10:19 -0700

 >>    Hello, Craig. I actually had counters like that in an early version of the
 >> driver but decided to remove them for performance reasons. I wonder if these
 >> should be hidden behind a compile time option?
 >
 >That would be fine with me.
 >
 >It would be nice if there was some way to tell at run time that the
 >stats were available so that a C program or gdb script could tell if
 >the stats are available.
 
    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.
 The struct for that looks like this:
 
 struct ifmib_iso_8802_3 {
         u_int32_t       dot3StatsAlignmentErrors;
         u_int32_t       dot3StatsFCSErrors;
         u_int32_t       dot3StatsSingleCollisionFrames;
         u_int32_t       dot3StatsMultipleCollisionFrames;
         u_int32_t       dot3StatsSQETestErrors;
         u_int32_t       dot3StatsDeferredTransmissions;
         u_int32_t       dot3StatsLateCollisions;
         u_int32_t       dot3StatsExcessiveCollisions;
         u_int32_t       dot3StatsInternalMacTransmitErrors;
         u_int32_t       dot3StatsCarrierSenseErrors;
         u_int32_t       dot3StatsFrameTooLongs;
         u_int32_t       dot3StatsInternalMacReceiveErrors;
         u_int32_t       dot3StatsEtherChipSet;
         /* Matt Thomas wants this one, not included in RFC 1650: */
         u_int32_t       dot3StatsMissedFrames;
 
         u_int32_t       dot3StatsCollFrequencies[16]; /* NB: index origin */
 
         u_int32_t       dot3Compliance;
 #define DOT3COMPLIANCE_STATS    1
 #define DOT3COMPLIANCE_COLLS    2
 };
 
    ...Garrett may be able to add more to this thought since he was the one
 who implemented the above.
 
 -DG
 
 David Greenman
 Co-founder/Principal Architect, The FreeBSD Project - http://www.freebsd.org
 Creator of high-performance Internet servers - http://www.terasolutions.com
 

From: Craig Leres <leres@ee.lbl.gov>
To: dg@root.com
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: kern/12543: [PATCH] cumulative error stats for fxp(4)
Date: Wed, 07 Jul 1999 13:02:53 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.
 > The struct for that looks like this:
 
 Ok, let me hack something up and send you a copy...
 
 		Craig
 

From: "Gary Palmer" <gpalmer@freebsd.org>
To: freebsd-gnats-submit@freebsd.org
Cc:  
Subject: Re: kern/12543: [PATCH] cumulative error stats for fxp(4) 
Date: Thu, 08 Jul 1999 10:58:12 -0400

 David Greenman wrote in message ID
 <199907071020.DAA13817@freefall.freebsd.org>:
 >     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.
 >  The struct for that looks like this:
 
 An excellent idea, and the dot3stats structure from the MIB should
 probably be made the standard for statistics collection in all our
 ethernet drivers...
 

From: Craig Leres <leres@ee.lbl.gov>
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 <net/if.h>
   #include <net/if_dl.h>
 + #include <net/if_mib.h>
   #include <net/if_media.h>
   
   #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
   
   /*
 
Responsible-Changed-From-To: freebsd-bugs->dg  
Responsible-Changed-By: cpiazza 
Responsible-Changed-When: Thu Jan 13 22:37:32 PST 2000 
Responsible-Changed-Why:  
DG was looking at this PR and it's his driver 
Responsible-Changed-From-To: dg->freebsd-bugs 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Oct 24 05:01:06 GMT 2005 
Responsible-Changed-Why:  
With bugmeister hat on, reassign from inactive committer. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=12543 
State-Changed-From-To: open->closed 
State-Changed-By: yongari 
State-Changed-When: Sun Sep 19 23:16:54 UTC 2010 
State-Changed-Why:  
Close. 
fxp(4) implemented all MAC counters supported by controller with 
sysctl(8) and these counters are not cleared unless you unload 
driver. Having a common interface for MAC counters would be great 
in theory but it's really hard to do that because there are too 
many controllers that provides more/less counters than that of 
RFC 1650. Personally I think it's better to leave it to driver to 
expose controller specific MAC counters. 


Responsible-Changed-From-To: freebsd-bugs->yongari 
Responsible-Changed-By: yongari 
Responsible-Changed-When: Sun Sep 19 23:16:54 UTC 2010 
Responsible-Changed-Why:  
Track. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=12543 
>Unformatted:
