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