xref: /aosp_15_r20/external/iproute2/netem/normal.c (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker /*
2*de1e4e89SAndroid Build Coastguard Worker  * Normal distribution table generator
3*de1e4e89SAndroid Build Coastguard Worker  * Taken from the uncopyrighted NISTnet code.
4*de1e4e89SAndroid Build Coastguard Worker  */
5*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h>
6*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h>
7*de1e4e89SAndroid Build Coastguard Worker #include <math.h>
8*de1e4e89SAndroid Build Coastguard Worker #include <string.h>
9*de1e4e89SAndroid Build Coastguard Worker #include <limits.h>
10*de1e4e89SAndroid Build Coastguard Worker 
11*de1e4e89SAndroid Build Coastguard Worker #include <linux/types.h>
12*de1e4e89SAndroid Build Coastguard Worker #include <linux/pkt_sched.h>
13*de1e4e89SAndroid Build Coastguard Worker 
14*de1e4e89SAndroid Build Coastguard Worker #define TABLESIZE 16384
15*de1e4e89SAndroid Build Coastguard Worker #define TABLEFACTOR NETEM_DIST_SCALE
16*de1e4e89SAndroid Build Coastguard Worker 
17*de1e4e89SAndroid Build Coastguard Worker static double
normal(double x,double mu,double sigma)18*de1e4e89SAndroid Build Coastguard Worker normal(double x, double mu, double sigma)
19*de1e4e89SAndroid Build Coastguard Worker {
20*de1e4e89SAndroid Build Coastguard Worker 	return .5 + .5*erf((x-mu)/(sqrt(2.0)*sigma));
21*de1e4e89SAndroid Build Coastguard Worker }
22*de1e4e89SAndroid Build Coastguard Worker 
23*de1e4e89SAndroid Build Coastguard Worker 
24*de1e4e89SAndroid Build Coastguard Worker int
main(int argc,char ** argv)25*de1e4e89SAndroid Build Coastguard Worker main(int argc, char **argv)
26*de1e4e89SAndroid Build Coastguard Worker {
27*de1e4e89SAndroid Build Coastguard Worker 	int i, n;
28*de1e4e89SAndroid Build Coastguard Worker 	double x;
29*de1e4e89SAndroid Build Coastguard Worker 	double table[TABLESIZE+1];
30*de1e4e89SAndroid Build Coastguard Worker 
31*de1e4e89SAndroid Build Coastguard Worker 	for (x = -10.0; x < 10.05; x += .00005) {
32*de1e4e89SAndroid Build Coastguard Worker 		i = rint(TABLESIZE * normal(x, 0.0, 1.0));
33*de1e4e89SAndroid Build Coastguard Worker 		table[i] = x;
34*de1e4e89SAndroid Build Coastguard Worker 	}
35*de1e4e89SAndroid Build Coastguard Worker 
36*de1e4e89SAndroid Build Coastguard Worker 
37*de1e4e89SAndroid Build Coastguard Worker 	printf("# This is the distribution table for the normal distribution.\n");
38*de1e4e89SAndroid Build Coastguard Worker 	for (i = n = 0; i < TABLESIZE; i += 4) {
39*de1e4e89SAndroid Build Coastguard Worker 		int value = (int) rint(table[i]*TABLEFACTOR);
40*de1e4e89SAndroid Build Coastguard Worker 		if (value < SHRT_MIN) value = SHRT_MIN;
41*de1e4e89SAndroid Build Coastguard Worker 		if (value > SHRT_MAX) value = SHRT_MAX;
42*de1e4e89SAndroid Build Coastguard Worker 
43*de1e4e89SAndroid Build Coastguard Worker 		printf(" %d", value);
44*de1e4e89SAndroid Build Coastguard Worker 		if (++n == 8) {
45*de1e4e89SAndroid Build Coastguard Worker 			putchar('\n');
46*de1e4e89SAndroid Build Coastguard Worker 			n = 0;
47*de1e4e89SAndroid Build Coastguard Worker 		}
48*de1e4e89SAndroid Build Coastguard Worker 	}
49*de1e4e89SAndroid Build Coastguard Worker 
50*de1e4e89SAndroid Build Coastguard Worker 	return 0;
51*de1e4e89SAndroid Build Coastguard Worker }
52