]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
Added stats utility from netem
authorStephen Hemminger <shemminger@dxpl.pdx.osdl.net>
Thu, 15 Jun 2006 23:22:09 +0000 (16:22 -0700)
committerStephen Hemminger <shemminger@dxpl.pdx.osdl.net>
Thu, 15 Jun 2006 23:22:09 +0000 (16:22 -0700)
netem/Makefile
netem/maketable.c
netem/stats.c [new file with mode: 0644]

index 59c7e083732c74b29144a06457c0a2e97dedbb59..3732160d9a722a89c928e9a08eb10a1bf775bc6b 100644 (file)
@@ -15,6 +15,9 @@ $(DISTGEN):
 experimental.dist: maketable experimental.dat
        ./maketable experimental.dat > experimental.dist
 
+stats: stats.c
+       $(HOSTCC) $(CCOPTS) -I../include -o $@ $@.c -lm
+
 install: all
        mkdir -p $(DESTDIR)/usr/lib/tc
        for i in $(DISTDATA); \
index ce091768439a0dda71ee8444c8e8924cda9aebf4..dccd254624784ab3be64a2cba451bbccd7e8eb11 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Experimental data  distribution table generator
- * Taken from the uncopyrighted NISTnet code.
+ * Taken from the uncopyrighted NISTnet code (public domain).
  *
- * Rread in a series of "random" data values, either
+ * Read in a series of "random" data values, either
  * experimentally or generated from some probability distribution.
  * From this, create the inverse distribution table used to approximate
  * the distribution.
diff --git a/netem/stats.c b/netem/stats.c
new file mode 100644 (file)
index 0000000..ed70f16
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Experimental data  distribution table generator
+ * Taken from the uncopyrighted NISTnet code (public domain).
+ *
+ * Rread in a series of "random" data values, either
+ * experimentally or generated from some probability distribution.
+ * From this, report statistics.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <malloc.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+void
+stats(FILE *fp)
+{
+       struct stat info;
+       double *x;
+       int limit;
+       int n=0, i;
+       double mu=0.0, sigma=0.0, sumsquare=0.0, sum=0.0, top=0.0, rho=0.0;
+       double sigma2=0.0;
+
+       fstat(fileno(fp), &info);
+       if (info.st_size > 0) {
+               limit = 2*info.st_size/sizeof(double);  /* @@ approximate */
+       } else {
+               limit = 10000;
+       }
+       x = (double *)malloc(limit*sizeof(double));
+
+       for (i=0; i<limit; ++i){
+               fscanf(fp, "%lf", &x[i]);
+               if (feof(fp))
+                       break;
+               sumsquare += x[i]*x[i];
+               sum += x[i];
+               ++n;
+       }
+       mu = sum/(double)n;
+       sigma = sqrt((sumsquare - (double)n*mu*mu)/(double)(n-1));
+
+       for (i=1; i < n; ++i){
+               top += ((double)x[i]-mu)*((double)x[i-1]-mu);
+               sigma2 += ((double)x[i-1] - mu)*((double)x[i-1] - mu);
+
+       }
+       rho = top/sigma2;
+
+       printf("mu =    %12.6f\n", mu);
+       printf("sigma = %12.6f\n", sigma);
+       printf("rho =   %12.6f\n", rho);
+       /*printf("sigma2 = %10.4f\n", sqrt(sigma2/(double)(n-1)));*/
+       /*printf("correlation rho = %10.6f\n", top/((double)(n-1)*sigma*sigma));*/
+}
+
+
+int
+main(int argc, char **argv)
+{
+       FILE *fp;
+
+       if (argc > 1) {
+               fp = fopen(argv[1], "r");
+               if (!fp) {
+                       perror(argv[1]);
+                       exit(1);
+               }
+       } else {
+               fp = stdin;
+       }
+       stats(fp);
+       return 0;
+}