From nobody@FreeBSD.org  Fri Jan 27 09:32:44 2006
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 90FAE16A420
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 27 Jan 2006 09:32:44 +0000 (GMT)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [216.136.204.117])
	by mx1.FreeBSD.org (Postfix) with ESMTP id E030343D75
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 27 Jan 2006 09:32:39 +0000 (GMT)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.13.1/8.13.1) with ESMTP id k0R9WdVP090786
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 27 Jan 2006 09:32:39 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.13.1/8.13.1/Submit) id k0R9WdAI090784;
	Fri, 27 Jan 2006 09:32:39 GMT
	(envelope-from nobody)
Message-Id: <200601270932.k0R9WdAI090784@www.freebsd.org>
Date: Fri, 27 Jan 2006 09:32:39 GMT
From: Bruce Becker <hostmaster@whois.gts.net>
To: freebsd-gnats-submit@FreeBSD.org
Subject: rcp.rstatd reports bogus packets/per/second info
X-Send-Pr-Version: www-2.3

>Number:         92412
>Category:       kern
>Synopsis:       [libexec] [patch] rpc.rstatd reports bogus packets/per/second info
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jan 27 09:40:03 GMT 2006
>Closed-Date:    
>Last-Modified:  Sun Apr 14 15:40:00 UTC 2013
>Originator:     Bruce Becker
>Release:        6.0
>Organization:
G.T.S.
>Environment:
FreeBSD tarantula.web.ca 6.0-STABLE FreeBSD 6.0-STABLE #0: Sun Jan 22 23:25:49 EST 2006     root@tarantula:/usr/obj/usr/src/sys/TARANTULA  amd64

>Description:
packets/second value reported by rpc.rstatd to remote monitor hovers around
8000 or so with odd downward spikes approx every 90 seconds (it's not at all related to actual interface traffic)

>How-To-Repeat:
keep displaying rpc.rstatd data from 6.0 system

>Fix:

>Release-Note:
>Audit-Trail:

From: Kris Kennaway <kris@obsecurity.org>
To: Bruce Becker <hostmaster@whois.gts.net>
Cc: freebsd-gnats-submit@FreeBSD.org
Subject: Re: amd64/92412: rcp.rstatd reports bogus packets/per/second info
Date: Fri, 27 Jan 2006 05:01:58 -0500

 How are you using rpc.rstatd and rup?  I don't see a way to make rup
 display "packets/second", it only gives uptime and load average:
 
 # rup
 fbsd-amd64.isc.  10:02am  up   4 days,  14:00,  load average: 2.00 2.00 2.00
 
 Kris
 
From: hotlips Internet admin <hostmaster@GTS.NET>
To: kris@obsecurity.org (Kris Kennaway)
Cc:  
Subject: Re: amd64/92412: rcp.rstatd reports bogus packets/per/second info
Date: Fri, 27 Jan 2006 11:59:15 -0500 (EST)

 	Solaris perfmeter, actually.
 
 -- 
 Bruce Becker			+1 416 410 0879
 GTS Network Administration	Toronto, Ont.
 Email:	hostmaster@gts.net
 

From: hotlips Internet admin <hostmaster@GTS.NET>
To: kris@obsecurity.org (Kris Kennaway)
Cc: bug-followup@FreeBSD.org
Subject: Re: amd64/92412: rcp.rstatd reports bogus packets/per/second info
Date: Fri, 27 Jan 2006 17:02:33 -0500 (EST)

 Thus saith Kris Kennaway:
 | Do you know how I can query this on FreeBSD?
 
 
 	It's easy to do on any BSD system - in /usr/src/usr.bin/rup,
 	make a copy rupx.c with this diff:
 
 
 *** rup.c       Sat May 21 05:55:07 2005
 --- rupx.c      Fri Jan 27 16:17:25 2006
 ***************
 *** 153,158 ****
 --- 153,159 ----
                 (double)host_stat->avenrun[0]/FSCALE,
                 (double)host_stat->avenrun[1]/FSCALE,
                 (double)host_stat->avenrun[2]/FSCALE);
 +       printf("ipackets: %d opackets %d\n", host_stat->if_ipackets, host_stat->if_opackets);
   
         remember_host(raddrp->sin_addr);
         return(0);
 
 
 	All other FreeBSD systems seem to return 0 for if_opackets
 	(which is wrong), whereas 6.0 returns junk.  NetBSD, Solaris,
 	SunOS 4.x, & Irix 6.x all seem to do the right thing.
 
 
 	I also note that the RPC/XDR code seems to be quite ancient -
 	even SunOS 4.1.1 1990 code has declarations for an additional
 	version 4 of the rstats protocol: RSTATVERS_VAR, with variable
 	args for RSTAT_CPUSTATES & RSTAT_DK_NDRIVE.  All the code
 	appears to have version 3 (RSTATVERS_TIME), which rup uses.
 
 
 Cheers,
 Bruce Becker			+1 416 410 0879
 GTS Network Administration	Toronto, Ont.
 Email:	hostmaster@gts.net


From: hotlips Internet admin <hostmaster@GTS.NET>
To: kris@obsecurity.org (Kris Kennaway)
Cc: bug-followup@FreeBSD.org
Subject: Re: amd64/92412: rcp.rstatd reports bogus packets/per/second info
Date: Sat, 28 Jan 2006 23:28:25 -0500 (EST)

 Thus saith Kris Kennaway:
 | Do you know how I can query this on FreeBSD?
 
 	here's a tester kluge: in /usr/src/usr.bin/rup, make a copy
 	rupx.c with this diff:
 
 147a148
 > 	printf("ipackets: %d opackets %d\n", host_stat->if_ipackets, host_stat->if_opackets);
 
 
 	... but I'll do better - it's fixed.  Below are diffs for
 	FreeBSD 6.x to fix 2 basic issues:
 
 	1. the code was filling in values to the most restrictive
 	   members of the union rather than the least, so values
 	   got overlaid;
 
 	2. the last gettimeofday call was clobbering the structure
 	   because it has 64-bit values in amd64.
 
 
 	This fix should work for all 6.x FreeBSD (and probably 5.x too) -
 	4.x & 3.x seem to have issues with opackets systcl mib (always
 	returns 0), so I made a version for them which uses the kmem
 	interface as well as the other fixes shown below....
 
 	BTW, the sysutils/xsysstats package works fine for X users...
 	So how does this get tested & into the distro?
 	(I also backported these & other fixes to 4.x)
 
 
 Cheers,
 Bruce Becker			+1 416 410 0879
 GTS Network Administration	Toronto, Ont.
 Email:	hostmaster@gts.net
 
 [bugmaster note: older diffs deleted for clarity]

  --------- 8< --------- 8< --------- 8< --------- 8< --------- 8< ---------
 
 --- rstat_proc.c.orig	Sun Jun  1 22:34:36 2003
 +++ rstat_proc.c	Sun Jan 29 02:17:10 2006
 @@ -138,6 +138,7 @@
      if (! stat_is_init)
          stat_init();
      sincelastreq = 0;
 +    stats_all.s2.if_opackets = stats_all.s3.if_opackets;
      return(&stats_all.s2);
  }
  
 @@ -147,6 +148,7 @@
      if (! stat_is_init)
          stat_init();
      sincelastreq = 0;
 +    stats_all.s1.if_opackets = stats_all.s3.if_opackets;
      return(&stats_all.s1);
  }
  
 @@ -219,13 +221,13 @@
  		exit(1);
  	}
  	for(i = 0; i < RSTAT_CPUSTATES ; i++)
 -		stats_all.s1.cp_time[i] = bsd_cp_time[cp_time_xlat[i]];
 +		stats_all.s3.cp_time[i] = bsd_cp_time[cp_time_xlat[i]];
  
          (void)getloadavg(avrun, sizeof(avrun) / sizeof(avrun[0]));
  
 -	stats_all.s2.avenrun[0] = avrun[0] * FSCALE;
 -	stats_all.s2.avenrun[1] = avrun[1] * FSCALE;
 -	stats_all.s2.avenrun[2] = avrun[2] * FSCALE;
 +	stats_all.s3.avenrun[0] = avrun[0] * FSCALE;
 +	stats_all.s3.avenrun[1] = avrun[1] * FSCALE;
 +	stats_all.s3.avenrun[2] = avrun[2] * FSCALE;
  
  	mib[0] = CTL_KERN;
  	mib[1] = KERN_BOOTTIME;
 @@ -234,14 +236,13 @@
  		syslog(LOG_ERR, "sysctl(kern.boottime): %m");
  		exit(1);
  	}
 -
 -	stats_all.s2.boottime.tv_sec = btm.tv_sec;
 -	stats_all.s2.boottime.tv_usec = btm.tv_usec;
 +	stats_all.s3.boottime.tv_sec = btm.tv_sec;
 +	stats_all.s3.boottime.tv_usec = btm.tv_usec;
  
  
  #ifdef DEBUG
 -	fprintf(stderr, "%d %d %d %d\n", stats_all.s1.cp_time[0],
 -	    stats_all.s1.cp_time[1], stats_all.s1.cp_time[2], stats_all.s1.cp_time[3]);
 +	fprintf(stderr, "%d %d %d %d\n", stats_all.s3.cp_time[0],
 +	    stats_all.s3.cp_time[1], stats_all.s3.cp_time[2], stats_all.s3.cp_time[3]);
  #endif
  
  	/* XXX - should use sysctl */
 @@ -249,18 +250,18 @@
  		syslog(LOG_ERR, "rstat: can't read cnt from kmem");
  		exit(1);
  	}
 -	stats_all.s1.v_pgpgin = cnt.v_vnodepgsin;
 -	stats_all.s1.v_pgpgout = cnt.v_vnodepgsout;
 -	stats_all.s1.v_pswpin = cnt.v_swappgsin;
 -	stats_all.s1.v_pswpout = cnt.v_swappgsout;
 -	stats_all.s1.v_intr = cnt.v_intr;
 +	stats_all.s3.v_pgpgin = cnt.v_vnodepgsin;
 +	stats_all.s3.v_pgpgout = cnt.v_vnodepgsout;
 +	stats_all.s3.v_pswpin = cnt.v_swappgsin;
 +	stats_all.s3.v_pswpout = cnt.v_swappgsout;
 +	stats_all.s3.v_intr = cnt.v_intr;
  	gettimeofday(&tm, (struct timezone *) 0);
 -	stats_all.s1.v_intr -= hz*(tm.tv_sec - btm.tv_sec) +
 +	stats_all.s3.v_intr -= hz*(tm.tv_sec - btm.tv_sec) +
  	    hz*(tm.tv_usec - btm.tv_usec)/1000000;
 -	stats_all.s2.v_swtch = cnt.v_swtch;
 +	stats_all.s3.v_swtch = cnt.v_swtch;
  
  	/* update disk transfers */
 -	updatexfers(RSTAT_DK_NDRIVE, stats_all.s1.dk_xfer);
 +	updatexfers(RSTAT_DK_NDRIVE, stats_all.s3.dk_xfer);
  
  	mib[0] = CTL_NET;
  	mib[1] = PF_LINK;
 @@ -272,12 +273,11 @@
  		syslog(LOG_ERR, "sysctl(net.link.generic.system.ifcount): %m");
  		exit(1);
  	}
 -
 -	stats_all.s1.if_ipackets = 0;
 -	stats_all.s1.if_opackets = 0;
 -	stats_all.s1.if_ierrors = 0;
 -	stats_all.s1.if_oerrors = 0;
 -	stats_all.s1.if_collisions = 0;
 +	stats_all.s3.if_ipackets = 0;
 +	stats_all.s3.if_opackets = 0;
 +	stats_all.s3.if_ierrors = 0;
 +	stats_all.s3.if_oerrors = 0;
 +	stats_all.s3.if_collisions = 0;
  	for (i = 1; i <= ifcount; i++) {
  		len = sizeof ifmd;
  		mib[3] = IFMIB_IFDATA;
 @@ -287,19 +287,19 @@
  			if (errno == ENOENT)
  				continue;
  
 -			syslog(LOG_ERR, "sysctl(net.link.ifdata.%d.general)"
 -			       ": %m", i);
 +			syslog(LOG_ERR, "sysctl(net.link.ifdata.%d.general): %m", i);
  			exit(1);
  		}
 -
 -		stats_all.s1.if_ipackets += ifmd.ifmd_data.ifi_ipackets;
 -		stats_all.s1.if_opackets += ifmd.ifmd_data.ifi_opackets;
 -		stats_all.s1.if_ierrors += ifmd.ifmd_data.ifi_ierrors;
 -		stats_all.s1.if_oerrors += ifmd.ifmd_data.ifi_oerrors;
 -		stats_all.s1.if_collisions += ifmd.ifmd_data.ifi_collisions;
 +		stats_all.s3.if_ipackets += ifmd.ifmd_data.ifi_ipackets;
 +		stats_all.s3.if_opackets += ifmd.ifmd_data.ifi_opackets;
 +		stats_all.s3.if_ierrors += ifmd.ifmd_data.ifi_ierrors;
 +		stats_all.s3.if_oerrors += ifmd.ifmd_data.ifi_oerrors;
 +		stats_all.s3.if_collisions += ifmd.ifmd_data.ifi_collisions;
  	}
 -	gettimeofday((struct timeval *)&stats_all.s3.curtime,
 -		(struct timezone *) 0);
 +
 +	gettimeofday(&tm, (struct timezone *) 0);
 +	stats_all.s3.curtime.tv_sec = tm.tv_sec;
 +	stats_all.s3.curtime.tv_usec = tm.tv_usec;
  	alarm(1);
  }
  
 @@ -307,12 +307,21 @@
  setup()
  {
  	char errbuf[_POSIX2_LINE_MAX];
 -
  	int en;
 +	static int is_kd_setup = 0;
  
 -	if ((kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL) {
 -		syslog(LOG_ERR, "rpc.rstatd, %s", errbuf);
 -		exit(1);
 +	/*  setup() is called after each dormant->active
 +	 *  transition.  Since we never close the kvm files
 +	 *  (there's no reason), make sure we don't open them
 +	 *  each time, as that can lead to exhaustion of all open
 +	 *  files!  */
 +	if (!is_kd_setup) {
 +		kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
 +		if (kd == NULL) {
 +			syslog(LOG_ERR, "%s", errbuf);
 +			exit (1);
 +		}
 +		is_kd_setup = 1;
  	}
  
  	if ((en = kvm_nlist(kd, nl)) != 0) {
 

From: hotlips Internet admin <hostmaster@GTS.NET>
To: sean@mcneil.com (Sean McNeil)
Cc: freebsd-amd64@FreeBSD.org, bug-followup@FreeBSD.org
Subject: Re: amd64/92412: rcp.rstatd reports bogus packets/per/second info
Date: Mon, 30 Jan 2006 14:02:14 -0500 (EST)

 	rup is also broken, sigh - patches below to account for
 	8-btye timevals
 
 
 -- 
 Bruce Becker			+1 416 410 0879
 GTS Network Administration	Toronto, Ont.
 Email:	hostmaster@gts.net
 
  --------- 8< --------- 8< --------- 8< --------- 8< --------- 8< ---------
 
 --- rup.c.orig	Sat May 21 05:55:07 2005
 +++ rup.c	Mon Jan 30 13:55:34 2006
 @@ -93,6 +93,7 @@
  static bool_t
  rstat_reply(caddr_t replyp, struct sockaddr_in *raddrp)
  {
 +	long longtime;
  	struct tm *tmp_time;
  	struct tm host_time;
  	struct tm host_uptime;
 @@ -118,12 +119,14 @@
  
  	printf("%-*s\t", HOST_WIDTH, host);
  
 -	tmp_time = localtime((time_t *)&host_stat->curtime.tv_sec);
 +	longtime = host_stat->curtime.tv_sec;
 +	tmp_time = localtime((time_t *)&longtime);
  	host_time = *tmp_time;
  
  	host_stat->curtime.tv_sec -= host_stat->boottime.tv_sec;
  
 -	tmp_time = gmtime((time_t *)&host_stat->curtime.tv_sec);
 +	longtime = host_stat->curtime.tv_sec;
 +	tmp_time = gmtime((time_t *)&longtime);
  	host_uptime = *tmp_time;
  
  	#define updays (host_stat->curtime.tv_sec  / 86400)
 

From: Sean McNeil <sean@mcneil.com>
To: hotlips Internet admin <hostmaster@GTS.NET>
Cc: freebsd-amd64@FreeBSD.org,
 bug-followup@FreeBSD.org
Subject: Re: amd64/92412: rcp.rstatd reports bogus packets/per/second info
Date: Mon, 30 Jan 2006 11:07:55 -0800

 On Jan 30, 2006, at 11:02 AM, hotlips Internet admin wrote:
 
 > --- rup.c.orig	Sat May 21 05:55:07 2005
 > +++ rup.c	Mon Jan 30 13:55:34 2006
 > @@ -93,6 +93,7 @@
 >  static bool_t
 >  rstat_reply(caddr_t replyp, struct sockaddr_in *raddrp)
 >  {
 > +	long longtime;
 >  	struct tm *tmp_time;
 >  	struct tm host_time;
 >  	struct tm host_uptime;
 > @@ -118,12 +119,14 @@
 >
 >  	printf("%-*s\t", HOST_WIDTH, host);
 >
 > -	tmp_time = localtime((time_t *)&host_stat->curtime.tv_sec);
 > +	longtime = host_stat->curtime.tv_sec;
 > +	tmp_time = localtime((time_t *)&longtime);
 >  	host_time = *tmp_time;
 >
 
 Just curious, but why not declare a variable as time_t instead of  
 long?  Seems like that would be more correct.
 
 >  	host_stat->curtime.tv_sec -= host_stat->boottime.tv_sec;
 >
 > -	tmp_time = gmtime((time_t *)&host_stat->curtime.tv_sec);
 > +	longtime = host_stat->curtime.tv_sec;
 > +	tmp_time = gmtime((time_t *)&longtime);
 >  	host_uptime = *tmp_time;
 >
 >  	#define updays (host_stat->curtime.tv_sec  / 86400)
 >
 

From: hotlips Internet admin <hostmaster@GTS.NET>
To: sean@mcneil.com (Sean McNeil)
Cc: bug-followup@FreeBSD.org
Subject: Re: amd64/92412: rcp.rstatd reports bogus packets/per/second info
Date: Mon, 30 Jan 2006 14:22:52 -0500 (EST)

 	it didn't seem to matter because of the "u_int tv_sec"
 	declaration in rstat_timeval in /usr/include/rpcsvc/rstat.h,
 	and the surrounding "(time_t *)&" - it should be as you suggest
 	however
 
 	in fact the problem mentioned seems to have been noticed
 	recently and is fixed somewhat more cleanly in current ...
 
 Cheers,
 Bruce Becker			+1 416 410 0879
 GTS Network Administration	Toronto, Ont.
 Email:	hostmaster@gts.net
Responsible-Changed-From-To: freebsd-amd64->freebsd-bugs 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Tue Feb 21 23:52:43 UTC 2006 
Responsible-Changed-Why:  
This does not sound amd64-specific. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=92412 

From: hotlips Internet admin <hostmaster@GTS.Infra-service.CA>
To: bug-followup@FreeBSD.org
Cc: jhb@freebsd.org
Subject: Re: kern/92412: [libexec] [patch] rpc.rstatd reports bogus
 packets-per-second info
Date: Tue, 8 Jul 2008 12:33:34 -0400 (EDT)

 Recently kern/122875 bug report provoked a change to libexec/rpc.rstatd
 (rather than a still-needed fix to sys/kern/kern_clock.c for RELENG_7 & HEAD) -
 
 Below is an updated patch to re-establish the required fixes
 so that it works properly...
 
 
 Bruce Becker			+1 416 410 0879
 GTS Network Administration	Toronto, Ont.
 Email:	hostmaster@GTS.Infra-service.CA
 
   --------- 8< --------- 8< --------- 8< --------- 8< --------- 8< ---------
 
 --- rstat_proc.c.2008062600	2008-06-26 22:20:37.000000000 -0400
 +++ rstat_proc.c.2008070600	2008-07-06 15:36:25.000000000 -0400
 @@ -125,6 +125,7 @@
       if (! stat_is_init)
           stat_init();
       sincelastreq = 0;
 +    stats_all.s2.if_opackets = stats_all.s3.if_opackets;
       return(&stats_all.s2);
   }
 
 @@ -134,6 +135,7 @@
       if (! stat_is_init)
           stat_init();
       sincelastreq = 0;
 +    stats_all.s1.if_opackets = stats_all.s3.if_opackets;
       return(&stats_all.s1);
   }
 
 @@ -205,13 +207,13 @@
   		exit(1);
   	}
   	for(i = 0; i < RSTAT_CPUSTATES ; i++)
 -		stats_all.s1.cp_time[i] = bsd_cp_time[cp_time_xlat[i]];
 +		stats_all.s3.cp_time[i] = bsd_cp_time[cp_time_xlat[i]];
 
           (void)getloadavg(avrun, sizeof(avrun) / sizeof(avrun[0]));
 
 -	stats_all.s2.avenrun[0] = avrun[0] * FSCALE;
 -	stats_all.s2.avenrun[1] = avrun[1] * FSCALE;
 -	stats_all.s2.avenrun[2] = avrun[2] * FSCALE;
 +	stats_all.s3.avenrun[0] = avrun[0] * FSCALE;
 +	stats_all.s3.avenrun[1] = avrun[1] * FSCALE;
 +	stats_all.s3.avenrun[2] = avrun[2] * FSCALE;
 
   	mib[0] = CTL_KERN;
   	mib[1] = KERN_BOOTTIME;
 @@ -221,13 +223,13 @@
   		exit(1);
   	}
 
 -	stats_all.s2.boottime.tv_sec = btm.tv_sec;
 -	stats_all.s2.boottime.tv_usec = btm.tv_usec;
 +	stats_all.s3.boottime.tv_sec = btm.tv_sec;
 +	stats_all.s3.boottime.tv_usec = btm.tv_usec;
 
 
   #ifdef DEBUG
 -	fprintf(stderr, "%d %d %d %d\n", stats_all.s1.cp_time[0],
 -	    stats_all.s1.cp_time[1], stats_all.s1.cp_time[2], stats_all.s1.cp_time[3]);
 +	fprintf(stderr, "%d %d %d %d\n", stats_all.s3.cp_time[0],
 +	    stats_all.s3.cp_time[1], stats_all.s3.cp_time[2], stats_all.s3.cp_time[3]);
   #endif
 
   #define	FETCH_CNT(stat, cnt) do {					\
 @@ -238,12 +240,12 @@
   	}								\
   } while (0)
 
 -	FETCH_CNT(stats_all.s1.v_pgpgin, vm.v_vnodepgsin);
 -	FETCH_CNT(stats_all.s1.v_pgpgout, vm.v_vnodepgsout);
 -	FETCH_CNT(stats_all.s1.v_pswpin, vm.v_swappgsin);
 -	FETCH_CNT(stats_all.s1.v_pswpout, vm.v_swappgsout);
 -	FETCH_CNT(stats_all.s1.v_intr, sys.v_intr);
 -	FETCH_CNT(stats_all.s2.v_swtch, sys.v_swtch);
 +	FETCH_CNT(stats_all.s3.v_pgpgin, vm.v_vnodepgsin);
 +	FETCH_CNT(stats_all.s3.v_pgpgout, vm.v_vnodepgsout);
 +	FETCH_CNT(stats_all.s3.v_pswpin, vm.v_swappgsin);
 +	FETCH_CNT(stats_all.s3.v_pswpout, vm.v_swappgsout);
 +	FETCH_CNT(stats_all.s3.v_intr, sys.v_intr);
 +	FETCH_CNT(stats_all.s3.v_swtch, sys.v_swtch);
   	gettimeofday(&tm, (struct timezone *) 0);
   	stats_all.s1.v_intr -= hz*(tm.tv_sec - btm.tv_sec) +
   	    hz*(tm.tv_usec - btm.tv_usec)/1000000;
 @@ -262,11 +264,11 @@
   		exit(1);
   	}
 
 -	stats_all.s1.if_ipackets = 0;
 -	stats_all.s1.if_opackets = 0;
 -	stats_all.s1.if_ierrors = 0;
 -	stats_all.s1.if_oerrors = 0;
 -	stats_all.s1.if_collisions = 0;
 +	stats_all.s3.if_ipackets = 0;
 +	stats_all.s3.if_opackets = 0;
 +	stats_all.s3.if_ierrors = 0;
 +	stats_all.s3.if_oerrors = 0;
 +	stats_all.s3.if_collisions = 0;
   	for (i = 1; i <= ifcount; i++) {
   		len = sizeof ifmd;
   		mib[3] = IFMIB_IFDATA;
 @@ -281,11 +283,11 @@
   			exit(1);
   		}
 
 -		stats_all.s1.if_ipackets += ifmd.ifmd_data.ifi_ipackets;
 -		stats_all.s1.if_opackets += ifmd.ifmd_data.ifi_opackets;
 -		stats_all.s1.if_ierrors += ifmd.ifmd_data.ifi_ierrors;
 -		stats_all.s1.if_oerrors += ifmd.ifmd_data.ifi_oerrors;
 -		stats_all.s1.if_collisions += ifmd.ifmd_data.ifi_collisions;
 +		stats_all.s3.if_ipackets += ifmd.ifmd_data.ifi_ipackets;
 +		stats_all.s3.if_opackets += ifmd.ifmd_data.ifi_opackets;
 +		stats_all.s3.if_ierrors += ifmd.ifmd_data.ifi_ierrors;
 +		stats_all.s3.if_oerrors += ifmd.ifmd_data.ifi_oerrors;
 +		stats_all.s3.if_collisions += ifmd.ifmd_data.ifi_collisions;
   	}
   	gettimeofday((struct timeval *)&stats_all.s3.curtime,
   		(struct timezone *) 0);
 

From: "G. Paul Ziemba" <p-fbsd-bugs@ziemba.us>
To: bug-followup@FreeBSD.org, hostmaster@whois.gts.net
Cc:  
Subject: Re: kern/92412: [libexec] [patch] rpc.rstatd reports bogus
 packets/per/second info
Date: Sun, 14 Apr 2013 01:30:06 -0700

 --vkogqOf2sHV7VnPd
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 Attached is an updated patch for 64-bit systems. I hope someone
 can apply it to HEAD - fix has been waiting for some years. Please?
 
 -- 
 G. Paul Ziemba
 FreeBSD unix:
  1:21AM  up  1:41, 1 user, load averages: 0.76, 0.89, 0.90
 
 --vkogqOf2sHV7VnPd
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="patch-usr-src-libexec-rpc.rstatd"
 
 --- rstat_proc.c.orig	2009-08-03 01:13:06.000000000 -0700
 +++ rstat_proc.c	2012-10-03 11:18:03.000000000 -0700
 @@ -125,6 +125,7 @@
      if (! stat_is_init)
          stat_init();
      sincelastreq = 0;
 +    stats_all.s2.if_opackets = stats_all.s3.if_opackets;
      return(&stats_all.s2);
  }
  
 @@ -134,6 +135,7 @@
      if (! stat_is_init)
          stat_init();
      sincelastreq = 0;
 +    stats_all.s1.if_opackets = stats_all.s3.if_opackets;
      return(&stats_all.s1);
  }
  
 @@ -168,6 +170,7 @@
  	struct clockinfo clockrate;
  	struct vmmeter cnt;
  	struct ifmibdata ifmd;
 +	struct timeval newcurtime;	/* XXX 64-bit */
  	double avrun[3];
  	struct timeval tm, btm;
  	int mib[6];
 @@ -205,13 +208,13 @@
  		exit(1);
  	}
  	for(i = 0; i < RSTAT_CPUSTATES ; i++)
 -		stats_all.s1.cp_time[i] = bsd_cp_time[cp_time_xlat[i]];
 +		stats_all.s3.cp_time[i] = bsd_cp_time[cp_time_xlat[i]];
  
          (void)getloadavg(avrun, sizeof(avrun) / sizeof(avrun[0]));
  
 -	stats_all.s2.avenrun[0] = avrun[0] * FSCALE;
 -	stats_all.s2.avenrun[1] = avrun[1] * FSCALE;
 -	stats_all.s2.avenrun[2] = avrun[2] * FSCALE;
 +	stats_all.s3.avenrun[0] = avrun[0] * FSCALE;
 +	stats_all.s3.avenrun[1] = avrun[1] * FSCALE;
 +	stats_all.s3.avenrun[2] = avrun[2] * FSCALE;
  
  	mib[0] = CTL_KERN;
  	mib[1] = KERN_BOOTTIME;
 @@ -221,13 +224,13 @@
  		exit(1);
  	}
  
 -	stats_all.s2.boottime.tv_sec = btm.tv_sec;
 -	stats_all.s2.boottime.tv_usec = btm.tv_usec;
 +	stats_all.s3.boottime.tv_sec = btm.tv_sec;
 +	stats_all.s3.boottime.tv_usec = btm.tv_usec;
  
  
  #ifdef DEBUG
 -	fprintf(stderr, "%d %d %d %d\n", stats_all.s1.cp_time[0],
 -	    stats_all.s1.cp_time[1], stats_all.s1.cp_time[2], stats_all.s1.cp_time[3]);
 +	fprintf(stderr, "%d %d %d %d\n", stats_all.s3.cp_time[0],
 +	    stats_all.s3.cp_time[1], stats_all.s3.cp_time[2], stats_all.s3.cp_time[3]);
  #endif
  
  #define	FETCH_CNT(stat, cnt) do {					\
 @@ -238,12 +241,12 @@
  	}								\
  } while (0)
  
 -	FETCH_CNT(stats_all.s1.v_pgpgin, vm.v_vnodepgsin);
 -	FETCH_CNT(stats_all.s1.v_pgpgout, vm.v_vnodepgsout);
 -	FETCH_CNT(stats_all.s1.v_pswpin, vm.v_swappgsin);
 -	FETCH_CNT(stats_all.s1.v_pswpout, vm.v_swappgsout);
 -	FETCH_CNT(stats_all.s1.v_intr, sys.v_intr);
 -	FETCH_CNT(stats_all.s2.v_swtch, sys.v_swtch);
 +	FETCH_CNT(stats_all.s3.v_pgpgin, vm.v_vnodepgsin);
 +	FETCH_CNT(stats_all.s3.v_pgpgout, vm.v_vnodepgsout);
 +	FETCH_CNT(stats_all.s3.v_pswpin, vm.v_swappgsin);
 +	FETCH_CNT(stats_all.s3.v_pswpout, vm.v_swappgsout);
 +	FETCH_CNT(stats_all.s3.v_intr, sys.v_intr);
 +	FETCH_CNT(stats_all.s3.v_swtch, sys.v_swtch);
  	gettimeofday(&tm, (struct timezone *) 0);
  	stats_all.s1.v_intr -= hz*(tm.tv_sec - btm.tv_sec) +
  	    hz*(tm.tv_usec - btm.tv_usec)/1000000;
 @@ -262,11 +265,11 @@
  		exit(1);
  	}
  
 -	stats_all.s1.if_ipackets = 0;
 -	stats_all.s1.if_opackets = 0;
 -	stats_all.s1.if_ierrors = 0;
 -	stats_all.s1.if_oerrors = 0;
 -	stats_all.s1.if_collisions = 0;
 +	stats_all.s3.if_ipackets = 0;
 +	stats_all.s3.if_opackets = 0;
 +	stats_all.s3.if_ierrors = 0;
 +	stats_all.s3.if_oerrors = 0;
 +	stats_all.s3.if_collisions = 0;
  	for (i = 1; i <= ifcount; i++) {
  		len = sizeof ifmd;
  		mib[3] = IFMIB_IFDATA;
 @@ -281,14 +284,15 @@
  			exit(1);
  		}
  
 -		stats_all.s1.if_ipackets += ifmd.ifmd_data.ifi_ipackets;
 -		stats_all.s1.if_opackets += ifmd.ifmd_data.ifi_opackets;
 -		stats_all.s1.if_ierrors += ifmd.ifmd_data.ifi_ierrors;
 -		stats_all.s1.if_oerrors += ifmd.ifmd_data.ifi_oerrors;
 -		stats_all.s1.if_collisions += ifmd.ifmd_data.ifi_collisions;
 -	}
 -	gettimeofday((struct timeval *)&stats_all.s3.curtime,
 -		(struct timezone *) 0);
 +		stats_all.s3.if_ipackets += ifmd.ifmd_data.ifi_ipackets;
 +		stats_all.s3.if_opackets += ifmd.ifmd_data.ifi_opackets;
 +		stats_all.s3.if_ierrors += ifmd.ifmd_data.ifi_ierrors;
 +		stats_all.s3.if_oerrors += ifmd.ifmd_data.ifi_oerrors;
 +		stats_all.s3.if_collisions += ifmd.ifmd_data.ifi_collisions;
 +	}
 +	gettimeofday(&newcurtime, (struct timezone *) NULL);
 +	stats_all.s3.curtime.tv_sec = newcurtime.tv_sec;
 +	stats_all.s3.curtime.tv_usec = newcurtime.tv_usec;
  	alarm(1);
  }
  
 
 --vkogqOf2sHV7VnPd--

From: hostmaster@whois.gts.net
To: "G. Paul Ziemba" <p-fbsd-bugs@ziemba.us>
Cc: bug-followup@FreeBSD.org
Subject: Re: kern/92412: [libexec] [patch] rpc.rstatd reports bogus
 packets/per/second info
Date: Sun, 14 Apr 2013 11:18:41 -0400 (EDT)

   This message is in MIME format.  The first part should be readable text,
   while the remaining parts are likely unreadable without MIME-aware tools.
 
 ---559023410-420219909-1365952722=:1386
 Content-Type: TEXT/PLAIN; charset=US-ASCII
 
 On Sun, 14 Apr 2013, G. Paul Ziemba wrote:
 
 |Attached is an updated patch for 64-bit systems. I hope someone
 |can apply it to HEAD - fix has been waiting for some years. Please?
 
 
 	here's what i use, which saves a call to
 	gettimeofday() and gives slightly more
 	accurate valuse for v_intr
 
 
 Bruce Becker			+1 416 410 0879
 GTS Network Administration	Toronto, Ont.
 Email:	hostmaster@GTS.Infra-service.CA
 ---559023410-420219909-1365952722=:1386
 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=rstat_proc.c.newer.diff
 Content-Transfer-Encoding: BASE64
 Content-ID: <alpine.GSO.2.00.1304141118410.1386@twin2.gts.net>
 Content-Description: 
 Content-Disposition: attachment; filename=rstat_proc.c.newer.diff
 
 LS0tIHJzdGF0X3Byb2MuYy5vcmlnCTIwMDktMDgtMDMgMDQ6MTM6MDYuMDAw
 MDAwMDAwIC0wNDAwDQorKysgcnN0YXRfcHJvYy5jCTIwMTMtMDQtMTQgMTE6
 MTE6MTIuMDAwMDAwMDAwIC0wNDAwDQpAQCAtMTI1LDYgKzEyNSw3IEBADQog
 ICAgIGlmICghIHN0YXRfaXNfaW5pdCkNCiAgICAgICAgIHN0YXRfaW5pdCgp
 Ow0KICAgICBzaW5jZWxhc3RyZXEgPSAwOw0KKyAgICBzdGF0c19hbGwuczIu
 aWZfb3BhY2tldHMgPSBzdGF0c19hbGwuczMuaWZfb3BhY2tldHM7DQogICAg
 IHJldHVybigmc3RhdHNfYWxsLnMyKTsNCiB9DQogDQpAQCAtMTM0LDYgKzEz
 NSw3IEBADQogICAgIGlmICghIHN0YXRfaXNfaW5pdCkNCiAgICAgICAgIHN0
 YXRfaW5pdCgpOw0KICAgICBzaW5jZWxhc3RyZXEgPSAwOw0KKyAgICBzdGF0
 c19hbGwuczEuaWZfb3BhY2tldHMgPSBzdGF0c19hbGwuczMuaWZfb3BhY2tl
 dHM7DQogICAgIHJldHVybigmc3RhdHNfYWxsLnMxKTsNCiB9DQogDQpAQCAt
 MjA1LDEzICsyMDcsMTMgQEANCiAJCWV4aXQoMSk7DQogCX0NCiAJZm9yKGkg
 PSAwOyBpIDwgUlNUQVRfQ1BVU1RBVEVTIDsgaSsrKQ0KLQkJc3RhdHNfYWxs
 LnMxLmNwX3RpbWVbaV0gPSBic2RfY3BfdGltZVtjcF90aW1lX3hsYXRbaV1d
 Ow0KKwkJc3RhdHNfYWxsLnMzLmNwX3RpbWVbaV0gPSBic2RfY3BfdGltZVtj
 cF90aW1lX3hsYXRbaV1dOw0KIA0KICAgICAgICAgKHZvaWQpZ2V0bG9hZGF2
 ZyhhdnJ1biwgc2l6ZW9mKGF2cnVuKSAvIHNpemVvZihhdnJ1blswXSkpOw0K
 IA0KLQlzdGF0c19hbGwuczIuYXZlbnJ1blswXSA9IGF2cnVuWzBdICogRlND
 QUxFOw0KLQlzdGF0c19hbGwuczIuYXZlbnJ1blsxXSA9IGF2cnVuWzFdICog
 RlNDQUxFOw0KLQlzdGF0c19hbGwuczIuYXZlbnJ1blsyXSA9IGF2cnVuWzJd
 ICogRlNDQUxFOw0KKwlzdGF0c19hbGwuczMuYXZlbnJ1blswXSA9IGF2cnVu
 WzBdICogRlNDQUxFOw0KKwlzdGF0c19hbGwuczMuYXZlbnJ1blsxXSA9IGF2
 cnVuWzFdICogRlNDQUxFOw0KKwlzdGF0c19hbGwuczMuYXZlbnJ1blsyXSA9
 IGF2cnVuWzJdICogRlNDQUxFOw0KIA0KIAltaWJbMF0gPSBDVExfS0VSTjsN
 CiAJbWliWzFdID0gS0VSTl9CT09UVElNRTsNCkBAIC0yMjEsMTMgKzIyMywx
 MyBAQA0KIAkJZXhpdCgxKTsNCiAJfQ0KIA0KLQlzdGF0c19hbGwuczIuYm9v
 dHRpbWUudHZfc2VjID0gYnRtLnR2X3NlYzsNCi0Jc3RhdHNfYWxsLnMyLmJv
 b3R0aW1lLnR2X3VzZWMgPSBidG0udHZfdXNlYzsNCisJc3RhdHNfYWxsLnMz
 LmJvb3R0aW1lLnR2X3NlYyA9IGJ0bS50dl9zZWM7DQorCXN0YXRzX2FsbC5z
 My5ib290dGltZS50dl91c2VjID0gYnRtLnR2X3VzZWM7DQogDQogDQogI2lm
 ZGVmIERFQlVHDQotCWZwcmludGYoc3RkZXJyLCAiJWQgJWQgJWQgJWRcbiIs
 IHN0YXRzX2FsbC5zMS5jcF90aW1lWzBdLA0KLQkgICAgc3RhdHNfYWxsLnMx
 LmNwX3RpbWVbMV0sIHN0YXRzX2FsbC5zMS5jcF90aW1lWzJdLCBzdGF0c19h
 bGwuczEuY3BfdGltZVszXSk7DQorCWZwcmludGYoc3RkZXJyLCAiJWQgJWQg
 JWQgJWRcbiIsIHN0YXRzX2FsbC5zMy5jcF90aW1lWzBdLA0KKwkgICAgc3Rh
 dHNfYWxsLnMzLmNwX3RpbWVbMV0sIHN0YXRzX2FsbC5zMy5jcF90aW1lWzJd
 LCBzdGF0c19hbGwuczMuY3BfdGltZVszXSk7DQogI2VuZGlmDQogDQogI2Rl
 ZmluZQlGRVRDSF9DTlQoc3RhdCwgY250KSBkbyB7CQkJCQlcDQpAQCAtMjM4
 LDE1ICsyNDAsMTIgQEANCiAJfQkJCQkJCQkJXA0KIH0gd2hpbGUgKDApDQog
 DQotCUZFVENIX0NOVChzdGF0c19hbGwuczEudl9wZ3BnaW4sIHZtLnZfdm5v
 ZGVwZ3Npbik7DQotCUZFVENIX0NOVChzdGF0c19hbGwuczEudl9wZ3Bnb3V0
 LCB2bS52X3Zub2RlcGdzb3V0KTsNCi0JRkVUQ0hfQ05UKHN0YXRzX2FsbC5z
 MS52X3Bzd3Bpbiwgdm0udl9zd2FwcGdzaW4pOw0KLQlGRVRDSF9DTlQoc3Rh
 dHNfYWxsLnMxLnZfcHN3cG91dCwgdm0udl9zd2FwcGdzb3V0KTsNCi0JRkVU
 Q0hfQ05UKHN0YXRzX2FsbC5zMS52X2ludHIsIHN5cy52X2ludHIpOw0KLQlG
 RVRDSF9DTlQoc3RhdHNfYWxsLnMyLnZfc3d0Y2gsIHN5cy52X3N3dGNoKTsN
 Ci0JZ2V0dGltZW9mZGF5KCZ0bSwgKHN0cnVjdCB0aW1lem9uZSAqKSAwKTsN
 Ci0Jc3RhdHNfYWxsLnMxLnZfaW50ciAtPSBoeioodG0udHZfc2VjIC0gYnRt
 LnR2X3NlYykgKw0KLQkgICAgaHoqKHRtLnR2X3VzZWMgLSBidG0udHZfdXNl
 YykvMTAwMDAwMDsNCisJRkVUQ0hfQ05UKHN0YXRzX2FsbC5zMy52X3BncGdp
 biwgdm0udl92bm9kZXBnc2luKTsNCisJRkVUQ0hfQ05UKHN0YXRzX2FsbC5z
 My52X3BncGdvdXQsIHZtLnZfdm5vZGVwZ3NvdXQpOw0KKwlGRVRDSF9DTlQo
 c3RhdHNfYWxsLnMzLnZfcHN3cGluLCB2bS52X3N3YXBwZ3Npbik7DQorCUZF
 VENIX0NOVChzdGF0c19hbGwuczMudl9wc3dwb3V0LCB2bS52X3N3YXBwZ3Nv
 dXQpOw0KKwlGRVRDSF9DTlQoc3RhdHNfYWxsLnMzLnZfaW50ciwgc3lzLnZf
 aW50cik7DQorCUZFVENIX0NOVChzdGF0c19hbGwuczMudl9zd3RjaCwgc3lz
 LnZfc3d0Y2gpOw0KIA0KIAkvKiB1cGRhdGUgZGlzayB0cmFuc2ZlcnMgKi8N
 CiAJdXBkYXRleGZlcnMoUlNUQVRfREtfTkRSSVZFLCBzdGF0c19hbGwuczEu
 ZGtfeGZlcik7DQpAQCAtMjYyLDExICsyNjEsMTEgQEANCiAJCWV4aXQoMSk7
 DQogCX0NCiANCi0Jc3RhdHNfYWxsLnMxLmlmX2lwYWNrZXRzID0gMDsNCi0J
 c3RhdHNfYWxsLnMxLmlmX29wYWNrZXRzID0gMDsNCi0Jc3RhdHNfYWxsLnMx
 LmlmX2llcnJvcnMgPSAwOw0KLQlzdGF0c19hbGwuczEuaWZfb2Vycm9ycyA9
 IDA7DQotCXN0YXRzX2FsbC5zMS5pZl9jb2xsaXNpb25zID0gMDsNCisJc3Rh
 dHNfYWxsLnMzLmlmX2lwYWNrZXRzID0gMDsNCisJc3RhdHNfYWxsLnMzLmlm
 X29wYWNrZXRzID0gMDsNCisJc3RhdHNfYWxsLnMzLmlmX2llcnJvcnMgPSAw
 Ow0KKwlzdGF0c19hbGwuczMuaWZfb2Vycm9ycyA9IDA7DQorCXN0YXRzX2Fs
 bC5zMy5pZl9jb2xsaXNpb25zID0gMDsNCiAJZm9yIChpID0gMTsgaSA8PSBp
 ZmNvdW50OyBpKyspIHsNCiAJCWxlbiA9IHNpemVvZiBpZm1kOw0KIAkJbWli
 WzNdID0gSUZNSUJfSUZEQVRBOw0KQEAgLTI4MSwxNCArMjgwLDE3IEBADQog
 CQkJZXhpdCgxKTsNCiAJCX0NCiANCi0JCXN0YXRzX2FsbC5zMS5pZl9pcGFj
 a2V0cyArPSBpZm1kLmlmbWRfZGF0YS5pZmlfaXBhY2tldHM7DQotCQlzdGF0
 c19hbGwuczEuaWZfb3BhY2tldHMgKz0gaWZtZC5pZm1kX2RhdGEuaWZpX29w
 YWNrZXRzOw0KLQkJc3RhdHNfYWxsLnMxLmlmX2llcnJvcnMgKz0gaWZtZC5p
 Zm1kX2RhdGEuaWZpX2llcnJvcnM7DQotCQlzdGF0c19hbGwuczEuaWZfb2Vy
 cm9ycyArPSBpZm1kLmlmbWRfZGF0YS5pZmlfb2Vycm9yczsNCi0JCXN0YXRz
 X2FsbC5zMS5pZl9jb2xsaXNpb25zICs9IGlmbWQuaWZtZF9kYXRhLmlmaV9j
 b2xsaXNpb25zOw0KKwkJc3RhdHNfYWxsLnMzLmlmX2lwYWNrZXRzICs9IGlm
 bWQuaWZtZF9kYXRhLmlmaV9pcGFja2V0czsNCisJCXN0YXRzX2FsbC5zMy5p
 Zl9vcGFja2V0cyArPSBpZm1kLmlmbWRfZGF0YS5pZmlfb3BhY2tldHM7DQor
 CQlzdGF0c19hbGwuczMuaWZfaWVycm9ycyArPSBpZm1kLmlmbWRfZGF0YS5p
 ZmlfaWVycm9yczsNCisJCXN0YXRzX2FsbC5zMy5pZl9vZXJyb3JzICs9IGlm
 bWQuaWZtZF9kYXRhLmlmaV9vZXJyb3JzOw0KKwkJc3RhdHNfYWxsLnMzLmlm
 X2NvbGxpc2lvbnMgKz0gaWZtZC5pZm1kX2RhdGEuaWZpX2NvbGxpc2lvbnM7
 DQogCX0NCi0JZ2V0dGltZW9mZGF5KChzdHJ1Y3QgdGltZXZhbCAqKSZzdGF0
 c19hbGwuczMuY3VydGltZSwNCi0JCShzdHJ1Y3QgdGltZXpvbmUgKikgMCk7
 DQorCWdldHRpbWVvZmRheSgmdG0sIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7
 DQorCXN0YXRzX2FsbC5zMy52X2ludHIgLT0gaHoqKHRtLnR2X3NlYyAtIGJ0
 bS50dl9zZWMpICsNCisJICAgIGh6Kih0bS50dl91c2VjIC0gYnRtLnR2X3Vz
 ZWMpLzEwMDAwMDA7DQorCXN0YXRzX2FsbC5zMy5jdXJ0aW1lLnR2X3NlYyA9
 IHRtLnR2X3NlYzsNCisJc3RhdHNfYWxsLnMzLmN1cnRpbWUudHZfdXNlYyA9
 IHRtLnR2X3VzZWM7DQogCWFsYXJtKDEpOw0KIH0NCiANCkBAIC00NzQsMyAr
 NDc2LDQgQEANCiAgICAgICAgIGlmIChmcm9tX2luZXRkKQ0KICAgICAgICAg
 ICAgICAgICBleGl0KDApOw0KIH0NCisNCg==
 
 ---559023410-420219909-1365952722=:1386--
>Unformatted:
