Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Dec 2008 14:07:19 -0800
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        Max Laier <max@love2party.net>
Cc:        freebsd-net@freebsd.org, Harti Brandt <harti@freebsd.org>, Sergey Matveychuk <sem@freebsd.org>
Subject:   Re: bsnmpd & 64bits counters problem
Message-ID:  <20081216220719.GA19787@citylink.fud.org.nz>
In-Reply-To: <200812162008.00654.max@love2party.net>
References:  <4947D7A9.2050407@FreeBSD.org> <20081216190932.I74416@beagle.kn.op.dlr.de> <20081216182749.GE3082@citylink.fud.org.nz> <200812162008.00654.max@love2party.net>

next in thread | previous in thread | raw e-mail | index | archive | help

--OgqxwSJOaUobr8KG
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Tue, Dec 16, 2008 at 08:08:00PM +0100, Max Laier wrote:
> On Tuesday 16 December 2008 19:27:49 Andrew Thompson wrote:
> > On Tue, Dec 16, 2008 at 07:12:24PM +0100, Harti Brandt wrote:
> > > On Tue, 16 Dec 2008, Sergey Matveychuk wrote:
> > > SM>>
> > > SM>> The highspeed counters are only there if this is a high-speed
> > > interface. SM>> High speed means that the baudrate in the interface MIB
> > > (the one in the SM>> kernel) must be larger than 20Mbaud.
> > > SM>
> > > SM>Well, these is lagg interfaces:
> > > SM>lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu
> > > 9000 SM>       
> > > options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4> SM>  
> > >      ether 00:30:48:67:d4:68
> > > SM>        media: Ethernet autoselect
> > > SM>        status: active
> > > SM>        laggproto lacp
> > > SM>        laggport: em2 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
> > > SM>        laggport: em0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
> > > SM>
> > > SM>There is no baudrate on them. But they are really high-speed however.
> > >
> > > All interfaces have a baudrate. Its in net/if.h ifi_baudrate. We had the
> > > problem in the past with other interface types. 'virtual' interfaces must
> > > take care to somehow propagate the rate of the underlying physical
> > > interfaces up to the virtual one.
> >
> > This patch should fix it for the lacp case. What is the correct value to
> > use for a collection of interfaces with possibly different speeds?
> > highest/lowest?
> 
> If aggregation is used you should add the individual speeds (as this is the 
> highest rate at which the interface counter could be increased).  If it's in 
> failover you should propagate the speed of the active interface.  When in 
> doubt, always report the highest value - at least for the purpose discussed 
> here.

Patch updated, should work as you described.

Andrew

--OgqxwSJOaUobr8KG
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="lagg_baud.diff"

Index: if_lagg.c
===================================================================
--- if_lagg.c	(revision 186188)
+++ if_lagg.c	(working copy)
@@ -1206,6 +1206,7 @@ lagg_linkstate(struct lagg_softc *sc)
 {
 	struct lagg_port *lp;
 	int new_link = LINK_STATE_DOWN;
+	uint64_t speed = 0;
 
 	/* Our link is considered up if at least one of our ports is active */
 	SLIST_FOREACH(lp, &sc->sc_ports, lp_entries) {
@@ -1215,6 +1216,24 @@ lagg_linkstate(struct lagg_softc *sc)
 		}
 	}
 	if_link_state_change(sc->sc_ifp, new_link);
+
+	/* Update if_baudrate to reflect the max possible speed */
+	switch (sc->sc_proto) {
+		case LAGG_PROTO_FAILOVER:
+			sc->sc_ifp->if_baudrate =
+			    sc->sc_primary->lp_ifp->if_baudrate;
+			break;
+		case LAGG_PROTO_ROUNDROBIN:
+		case LAGG_PROTO_LOADBALANCE:
+		case LAGG_PROTO_ETHERCHANNEL:
+			SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
+				speed += lp->lp_ifp->if_baudrate;
+			sc->sc_ifp->if_baudrate = speed;
+			break;
+		case LAGG_PROTO_LACP:
+			/* LACP updates if_baudrate itself */
+			break;
+	}
 }
 
 static void
Index: ieee8023ad_lacp.c
===================================================================
--- ieee8023ad_lacp.c	(revision 186188)
+++ ieee8023ad_lacp.c	(working copy)
@@ -901,6 +901,7 @@ lacp_aggregator_bandwidth(struct lacp_aggregator *
 static void
 lacp_select_active_aggregator(struct lacp_softc *lsc)
 {
+	struct lagg_softc *sc = lsc->lsc_softc;
 	struct lacp_aggregator *la;
 	struct lacp_aggregator *best_la = NULL;
 	uint64_t best_speed = 0;
@@ -956,6 +957,7 @@ lacp_select_active_aggregator(struct lacp_softc *l
 #endif /* defined(LACP_DEBUG) */
 
 	if (lsc->lsc_active_aggregator != best_la) {
+		sc->sc_ifp->if_baudrate = best_speed;
 		lsc->lsc_active_aggregator = best_la;
 		lacp_update_portmap(lsc);
 		if (best_la) {

--OgqxwSJOaUobr8KG--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20081216220719.GA19787>