diff options
Diffstat (limited to 'src/checkpdfs.c')
-rw-r--r-- | src/checkpdfs.c | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/src/checkpdfs.c b/src/checkpdfs.c new file mode 100644 index 0000000..87577c7 --- /dev/null +++ b/src/checkpdfs.c @@ -0,0 +1,217 @@ +/*--------------------------------------------------------------- + * Copyright (c) 2017 + * Broadcom Corporation + * All Rights Reserved. + *--------------------------------------------------------------- + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * + * Redistributions of source code must retain the above + * copyright notice, this list of conditions and + * the following disclaimers. + * + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimers in the documentation and/or other materials + * provided with the distribution. + * + * + * Neither the name of Broadcom Coporation, + * nor the names of its contributors may be used to endorse + * or promote products derived from this Software without + * specific prior written permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ________________________________________________________________ + * + * pdfs.c + * Produce probability distribution functions, expected to be used + * for iperf client traffic emulations + * + * by Robert J. McMahon (rjmcmahon@rjmcmahon.com, bob.mcmahon@broadcom.com) + * ------------------------------------------------------------------- */ + +/* Produce normal and log normal + * + * Implements the Polar form of the Box-Muller Transformation + * + * +*/ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif +#include <stdio.h> +#include <stdlib.h> +#include <time.h> +#include <math.h> +#include <unistd.h> +#include "headers.h" +#include "util.h" +#include "pdfs.h" + +#define MAXBINS 1024 +#define TRUE 1 +#define FALSE 0 +#define MILLION 1000000 +#define BILLION 1000000000 + +#ifdef HAVE_CLOCK_GETTIME +static double timespec_diff(struct timespec tv1, struct timespec tv0); +#else +static double timeval_diff (struct timeval tv1, struct timeval tv0); +#endif + +int main (int argc, char **argv) { + int c, i; + int minbin = MAXBINS; + int maxbin = 0; + int bincount=MAXBINS; + time_t t; + int histogram[MAXBINS]; + float mean=100.0; + float variance=30.0; + int count = 10000; + int gaussian = TRUE; + int printout = FALSE; + int speedonly = FALSE; + int exectime; + int random = FALSE; + double total; + double binwidth=1.0; + + while ((c=getopt(argc, argv, "b:c:lm:prsv:w:")) != -1) + switch (c) { + case 'b': + bincount = atoi(optarg); + break; + case 'c': + count = atoi(optarg); + break; + case 'l': + gaussian = FALSE; + break; + case 'm': + mean = bitorbyte_atof(optarg); + break; + case 'p': + printout = TRUE; + break; + case 'r': + random = TRUE; + break; + case 's': + speedonly = TRUE; + break; + case 'v': + variance = bitorbyte_atof(optarg); + break; + case 'w': + binwidth = bitorbyte_atof(optarg); + break; + case '?': + default: + fprintf(stderr,"Usage -b bins, -c count, -l log normal, -m mean, -p print, -s speed only, -v variance"); + exit(-1); + } + if (bincount > MAXBINS) { + int max = MAXBINS; + fprintf(stderr, "Maximum number of bins is %d while %d requested\n", max, bincount); + abort(); + } + /* Intializes random number generator */ + if (random) { + srand((unsigned) time(&t)); + printf("seed = %ld\n", t); + } + memset(histogram, 0, sizeof(histogram)); +#ifdef HAVE_CLOCK_GETTIME + struct timespec t1; + clock_gettime(CLOCK_REALTIME, &t1); +#else + struct timeval t1; + gettimeofday( &t1, NULL ); +#endif + if (gaussian) { + for( i = 0 ; i < count ; i++ ) { + int result = round(normal(mean,variance)/binwidth); + if (!speedonly) { + if (result >= 0 && result < (MAXBINS - 1)) { + histogram[result]++; + if (result < minbin) + minbin = result; + if (result > maxbin) + maxbin = result; + } + } + } + } else { + for( i = 0 ; i < count ; i++ ) { + int result = round(lognormal(mean,variance)/binwidth); + if (!speedonly) { + if (result >= 0 && result < (MAXBINS - 1)) { + histogram[result]++; + if (result < minbin) + minbin = result; + if (result > maxbin) + maxbin = result; + } + } + } + } +#ifdef HAVE_CLOCK_GETTIME + struct timespec t2; + clock_gettime(CLOCK_REALTIME, &t2); + total = timespec_diff(t2, t1); +#else + struct timeval t2; + gettimeofday( &t2, NULL ); + total = timeval_diff(t2, t1); +#endif + if (printout) { + for( i = minbin ; i <= maxbin ; i++ ) + printf("%.0f %d\n", i * binwidth, histogram[i]); + } + exectime = round(1e9 * total / count); + if (!printout) { + printf("Total time=%f secs, count= %d, average generate time of %d nanoseconds\n", total, count, exectime); + } + return(0); +} +#ifdef HAVE_CLOCK_GETTIME +// tv1 assumed greater than tv0 +static double timespec_diff (struct timespec tv1, struct timespec tv0) { + double result; + if (tv1.tv_nsec < tv0.tv_nsec) { + tv1.tv_nsec += BILLION; + tv1.tv_sec--; + } + result = (double) (((tv1.tv_sec - tv0.tv_sec) * BILLION) + (tv1.tv_nsec - tv0.tv_nsec)); + return (result / 1e9); +} +#else +// tv1 assumed greater than tv0 +static double timeval_diff (struct timeval tv1, struct timeval tv0) { + double result; + if (tv1.tv_usec < tv0.tv_usec) { + tv1.tv_usec += MILLION; + tv1.tv_sec--; + } + result = (double) (((tv1.tv_sec - tv0.tv_sec) * MILLION) + (tv1.tv_usec - tv0.tv_usec)); + return (result / 1e6); +} +#endif |