iproute2/tc/tc_cbq.c
<<
>>
Prefs
   1/*
   2 * tc_cbq.c             CBQ maintenance 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 <fcntl.h>
  17#include <math.h>
  18#include <sys/socket.h>
  19#include <netinet/in.h>
  20#include <arpa/inet.h>
  21#include <string.h>
  22
  23#include "utils.h"
  24#include "tc_core.h"
  25#include "tc_cbq.h"
  26
  27unsigned int tc_cbq_calc_maxidle(unsigned int bndw, unsigned int rate, unsigned int avpkt,
  28                             int ewma_log, unsigned int 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
  38                vxmt *= (pow(g, -(double)maxburst) - 1);
  39                if (vxmt > maxidle)
  40                        maxidle = vxmt;
  41        }
  42        return tc_core_time2tick(maxidle*(1<<ewma_log)*TIME_UNITS_PER_SEC);
  43}
  44
  45unsigned int tc_cbq_calc_offtime(unsigned int bndw, unsigned int rate, unsigned int avpkt,
  46                             int ewma_log, unsigned int minburst)
  47{
  48        double g = 1.0 - 1.0/(1<<ewma_log);
  49        double offtime = (double)avpkt/rate - (double)avpkt/bndw;
  50
  51        if (minburst == 0)
  52                return 0;
  53        if (minburst == 1)
  54                offtime *= pow(g, -(double)minburst) - 1;
  55        else
  56                offtime *= 1 + (pow(g, -(double)(minburst-1)) - 1)/(1-g);
  57        return tc_core_time2tick(offtime*TIME_UNITS_PER_SEC);
  58}
  59