Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 13 Sep 2014 18:13:08 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r271538 - head/sys/net
Message-ID:  <201409131813.s8DID8vR061538@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Sat Sep 13 18:13:08 2014
New Revision: 271538
URL: http://svnweb.freebsd.org/changeset/base/271538

Log:
  Switch if_vlan(4) to use counter(9) using new
    if_get_counter api.

Modified:
  head/sys/net/if_vlan.c

Modified: head/sys/net/if_vlan.c
==============================================================================
--- head/sys/net/if_vlan.c	Sat Sep 13 17:58:34 2014	(r271537)
+++ head/sys/net/if_vlan.c	Sat Sep 13 18:13:08 2014	(r271538)
@@ -105,6 +105,11 @@ struct	ifvlan {
 	struct	ifvlantrunk *ifv_trunk;
 	struct	ifnet *ifv_ifp;
 	void	*ifv_cookie;
+	counter_u64_t	ifv_ipackets;
+	counter_u64_t	ifv_ibytes;
+	counter_u64_t	ifv_opackets;
+	counter_u64_t	ifv_obytes;
+	counter_u64_t	ifv_omcasts;
 #define	TRUNK(ifv)	((ifv)->ifv_trunk)
 #define	PARENT(ifv)	((ifv)->ifv_trunk->parent)
 	int	ifv_pflags;	/* special flags we have set on parent */
@@ -194,6 +199,7 @@ static	void vlan_init(void *foo);
 static	void vlan_input(struct ifnet *ifp, struct mbuf *m);
 static	int vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr);
 static	void vlan_qflush(struct ifnet *ifp);
+static uint64_t vlan_get_counter(struct ifnet *ifp, ifnet_counter cnt);
 static	int vlan_setflag(struct ifnet *ifp, int flag, int status,
     int (*func)(struct ifnet *, int));
 static	int vlan_setflags(struct ifnet *ifp, int status);
@@ -945,6 +951,12 @@ vlan_clone_create(struct if_clone *ifc, 
 		return (ENOSPC);
 	}
 	SLIST_INIT(&ifv->vlan_mc_listhead);
+	/* Prepare pcpu counters */
+	ifv->ifv_ipackets = counter_u64_alloc(M_WAITOK);
+	ifv->ifv_opackets = counter_u64_alloc(M_WAITOK);
+	ifv->ifv_ibytes = counter_u64_alloc(M_WAITOK);
+	ifv->ifv_obytes = counter_u64_alloc(M_WAITOK);
+	ifv->ifv_omcasts = counter_u64_alloc(M_WAITOK);
 
 	ifp->if_softc = ifv;
 	/*
@@ -964,6 +976,7 @@ vlan_clone_create(struct if_clone *ifc, 
 	ifp->if_qflush = vlan_qflush;
 	ifp->if_ioctl = vlan_ioctl;
 	ifp->if_flags = VLAN_IFFLAGS;
+	ifp->if_get_counter = vlan_get_counter;
 	ether_ifattach(ifp, eaddr);
 	/* Now undo some of the damage... */
 	ifp->if_baudrate = 0;
@@ -1006,6 +1019,11 @@ vlan_clone_destroy(struct if_clone *ifc,
 	ether_ifdetach(ifp);	/* first, remove it from system-wide lists */
 	vlan_unconfig(ifp);	/* now it can be unconfigured and freed */
 	if_free(ifp);
+	counter_u64_free(ifv->ifv_ipackets);
+	counter_u64_free(ifv->ifv_opackets);
+	counter_u64_free(ifv->ifv_ibytes);
+	counter_u64_free(ifv->ifv_obytes);
+	counter_u64_free(ifv->ifv_omcasts);
 	free(ifv, M_VLAN);
 	ifc_free_unit(ifc, unit);
 
@@ -1099,15 +1117,39 @@ vlan_transmit(struct ifnet *ifp, struct 
 	 * Send it, precisely as ether_output() would have.
 	 */
 	error = (p->if_transmit)(p, m);
-	if (!error) {
-		ifp->if_opackets++;
-		ifp->if_omcasts += mcast;
-		ifp->if_obytes += len;
+	if (error == 0) {
+		counter_u64_add(ifv->ifv_opackets, 1);
+		counter_u64_add(ifv->ifv_obytes, len);
+		counter_u64_add(ifv->ifv_omcasts, 1);
 	} else
 		ifp->if_oerrors++;
 	return (error);
 }
 
+static uint64_t
+vlan_get_counter(struct ifnet *ifp, ifnet_counter cnt)
+{
+	struct ifvlan *ifv;
+
+	ifv = ifp->if_softc;
+
+	switch (cnt) {
+		case IFCOUNTER_IPACKETS:
+			return (counter_u64_fetch(ifv->ifv_ipackets));
+		case IFCOUNTER_OPACKETS:
+			return (counter_u64_fetch(ifv->ifv_opackets));
+		case IFCOUNTER_IBYTES:
+			return (counter_u64_fetch(ifv->ifv_ibytes));
+		case IFCOUNTER_OBYTES:
+			return (counter_u64_fetch(ifv->ifv_obytes));
+		case IFCOUNTER_OMCASTS:
+			return (counter_u64_fetch(ifv->ifv_omcasts));
+		default:
+			return (if_get_counter_compat(ifp, cnt));
+	}
+	/* NOTREACHED */
+}
+
 /*
  * The ifp->if_qflush entry point for vlan(4) is a no-op.
  */
@@ -1181,7 +1223,8 @@ vlan_input(struct ifnet *ifp, struct mbu
 	TRUNK_RUNLOCK(trunk);
 
 	m->m_pkthdr.rcvif = ifv->ifv_ifp;
-	ifv->ifv_ifp->if_ipackets++;
+	counter_u64_add(ifv->ifv_ipackets, 1);
+	counter_u64_add(ifv->ifv_ibytes, m->m_pkthdr.len);
 
 	/* Pass it back through the parent's input routine. */
 	(*ifp->if_input)(ifv->ifv_ifp, m);



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