]>
jfr.im git - irc/evilnet/x3.git/blob - src/policer.c
1 /* policer.c - Leaky bucket
2 * Copyright 2000-2002 srvx Development Team
4 * This file is part of x3.
6 * x3 is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with srvx; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
24 /* This policer uses the "leaky bucket" (GCRA) algorithm. */
26 struct policer_params
{
31 struct policer_params
*
32 policer_params_new(void)
34 struct policer_params
*params
= malloc(sizeof(struct policer_params
));
35 params
->bucket_size
= 0.0;
36 params
->drain_rate
= 0.0;
41 policer_params_set(struct policer_params
*params
, const char *param
, const char *value
)
43 if (!irccasecmp(param
, "size")) {
44 params
->bucket_size
= strtod(value
, NULL
);
45 } else if (!irccasecmp(param
, "drain-rate")) {
46 params
->drain_rate
= strtod(value
, NULL
);
54 policer_params_delete(struct policer_params
*params
)
60 policer_conforms(struct policer
*pol
, time_t reqtime
, double weight
)
63 pol
->level
-= pol
->params
->drain_rate
* (reqtime
- pol
->last_req
);
64 if (pol
->level
< 0.0) pol
->level
= 0.0;
65 res
= pol
->level
< pol
->params
->bucket_size
;
67 pol
->last_req
= reqtime
;