1/* 2 * tc_cbq.c CBQ maintanance routines. 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#include "tc_cbq.h" 26 27unsigned tc_cbq_calc_maxidle(unsigned bndw, unsigned rate, unsigned avpkt, 28 int ewma_log, unsigned maxburst) 29{ 30 double maxidle; 31 double g = 1.0 - 1.0/(1<<ewma_log); 32 double xmt = (double)avpkt/bndw; 33 34 maxidle = xmt*(1-g); 35 if (bndw != rate && maxburst) { 36 double vxmt = (double)avpkt/rate - xmt; 37 vxmt *= (pow(g, -(double)maxburst) - 1); 38 if (vxmt > maxidle) 39 maxidle = vxmt; 40 } 41 return tc_core_time2tick(maxidle*(1<<ewma_log)*TIME_UNITS_PER_SEC); 42} 43 44unsigned tc_cbq_calc_offtime(unsigned bndw, unsigned rate, unsigned avpkt, 45 int ewma_log, unsigned minburst) 46{ 47 double g = 1.0 - 1.0/(1<<ewma_log); 48 double offtime = (double)avpkt/rate - (double)avpkt/bndw; 49 50 if (minburst == 0) 51 return 0; 52 if (minburst == 1) 53 offtime *= pow(g, -(double)minburst) - 1; 54 else 55 offtime *= 1 + (pow(g, -(double)(minburst-1)) - 1)/(1-g); 56 return tc_core_time2tick(offtime*TIME_UNITS_PER_SEC); 57} 58