1*de1e4e89SAndroid Build Coastguard Worker /* 2*de1e4e89SAndroid Build Coastguard Worker * tc_core.c TC core library. 3*de1e4e89SAndroid Build Coastguard Worker * 4*de1e4e89SAndroid Build Coastguard Worker * This program is free software; you can redistribute it and/or 5*de1e4e89SAndroid Build Coastguard Worker * modify it under the terms of the GNU General Public License 6*de1e4e89SAndroid Build Coastguard Worker * as published by the Free Software Foundation; either version 7*de1e4e89SAndroid Build Coastguard Worker * 2 of the License, or (at your option) any later version. 8*de1e4e89SAndroid Build Coastguard Worker * 9*de1e4e89SAndroid Build Coastguard Worker * Authors: Alexey Kuznetsov, <[email protected]> 10*de1e4e89SAndroid Build Coastguard Worker * 11*de1e4e89SAndroid Build Coastguard Worker */ 12*de1e4e89SAndroid Build Coastguard Worker 13*de1e4e89SAndroid Build Coastguard Worker #include <stdio.h> 14*de1e4e89SAndroid Build Coastguard Worker #include <stdlib.h> 15*de1e4e89SAndroid Build Coastguard Worker #include <unistd.h> 16*de1e4e89SAndroid Build Coastguard Worker #include <syslog.h> 17*de1e4e89SAndroid Build Coastguard Worker #include <fcntl.h> 18*de1e4e89SAndroid Build Coastguard Worker #include <math.h> 19*de1e4e89SAndroid Build Coastguard Worker #include <sys/socket.h> 20*de1e4e89SAndroid Build Coastguard Worker #include <netinet/in.h> 21*de1e4e89SAndroid Build Coastguard Worker #include <arpa/inet.h> 22*de1e4e89SAndroid Build Coastguard Worker #include <string.h> 23*de1e4e89SAndroid Build Coastguard Worker 24*de1e4e89SAndroid Build Coastguard Worker #include "tc_core.h" 25*de1e4e89SAndroid Build Coastguard Worker tc_setup_estimator(unsigned int A,unsigned int time_const,struct tc_estimator * est)26*de1e4e89SAndroid Build Coastguard Workerint tc_setup_estimator(unsigned int A, unsigned int time_const, struct tc_estimator *est) 27*de1e4e89SAndroid Build Coastguard Worker { 28*de1e4e89SAndroid Build Coastguard Worker for (est->interval = 0; est->interval <= 5; est->interval++) { 29*de1e4e89SAndroid Build Coastguard Worker if (A <= (1<<est->interval)*(TIME_UNITS_PER_SEC/4)) 30*de1e4e89SAndroid Build Coastguard Worker break; 31*de1e4e89SAndroid Build Coastguard Worker } 32*de1e4e89SAndroid Build Coastguard Worker if (est->interval > 5) 33*de1e4e89SAndroid Build Coastguard Worker return -1; 34*de1e4e89SAndroid Build Coastguard Worker est->interval -= 2; 35*de1e4e89SAndroid Build Coastguard Worker for (est->ewma_log = 1; est->ewma_log < 32; est->ewma_log++) { 36*de1e4e89SAndroid Build Coastguard Worker double w = 1.0 - 1.0/(1<<est->ewma_log); 37*de1e4e89SAndroid Build Coastguard Worker 38*de1e4e89SAndroid Build Coastguard Worker if (A/(-log(w)) > time_const) 39*de1e4e89SAndroid Build Coastguard Worker break; 40*de1e4e89SAndroid Build Coastguard Worker } 41*de1e4e89SAndroid Build Coastguard Worker est->ewma_log--; 42*de1e4e89SAndroid Build Coastguard Worker if (est->ewma_log == 0 || est->ewma_log >= 31) 43*de1e4e89SAndroid Build Coastguard Worker return -1; 44*de1e4e89SAndroid Build Coastguard Worker return 0; 45*de1e4e89SAndroid Build Coastguard Worker } 46