2018-04-10 17:23:14 +02:00
|
|
|
/* Copyright (c) 2018, The Tor Project, Inc. */
|
|
|
|
/* See LICENSE for licensing information */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \file token_bucket.h
|
|
|
|
* \brief Headers for token_bucket.c
|
|
|
|
**/
|
|
|
|
|
|
|
|
#ifndef TOR_TOKEN_BUCKET_H
|
|
|
|
#define TOR_TOKEN_BUCKET_H
|
|
|
|
|
|
|
|
#include "torint.h"
|
|
|
|
|
|
|
|
typedef struct token_bucket_t {
|
|
|
|
uint32_t rate;
|
|
|
|
int32_t burst;
|
|
|
|
int32_t read_bucket;
|
|
|
|
int32_t write_bucket;
|
|
|
|
uint32_t last_refilled_at_ts;
|
|
|
|
} token_bucket_t;
|
|
|
|
|
|
|
|
#define TOKEN_BUCKET_MAX_BURST INT32_MAX
|
|
|
|
|
|
|
|
void token_bucket_init(token_bucket_t *bucket,
|
|
|
|
uint32_t rate,
|
|
|
|
uint32_t burst,
|
|
|
|
uint32_t now_ts);
|
|
|
|
|
|
|
|
void token_bucket_adjust(token_bucket_t *bucket,
|
|
|
|
uint32_t rate, uint32_t burst);
|
|
|
|
|
|
|
|
void token_bucket_reset(token_bucket_t *bucket,
|
|
|
|
uint32_t now_ts);
|
|
|
|
|
|
|
|
#define TB_READ 1
|
|
|
|
#define TB_WRITE 2
|
|
|
|
|
|
|
|
int token_bucket_refill(token_bucket_t *bucket,
|
|
|
|
uint32_t now_ts);
|
|
|
|
|
|
|
|
int token_bucket_dec_read(token_bucket_t *bucket,
|
|
|
|
ssize_t n);
|
|
|
|
int token_bucket_dec_write(token_bucket_t *bucket,
|
|
|
|
ssize_t n);
|
|
|
|
|
2018-04-10 18:33:30 +02:00
|
|
|
void token_bucket_dec(token_bucket_t *bucket,
|
|
|
|
ssize_t n_read, ssize_t n_written);
|
|
|
|
|
2018-04-10 17:23:14 +02:00
|
|
|
static inline size_t token_bucket_get_read(const token_bucket_t *bucket);
|
|
|
|
static inline size_t
|
|
|
|
token_bucket_get_read(const token_bucket_t *bucket)
|
|
|
|
{
|
|
|
|
const ssize_t b = bucket->read_bucket;
|
|
|
|
return b >= 0 ? b : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline size_t token_bucket_get_write(const token_bucket_t *bucket);
|
|
|
|
static inline size_t
|
|
|
|
token_bucket_get_write(const token_bucket_t *bucket)
|
|
|
|
{
|
|
|
|
const ssize_t b = bucket->write_bucket;
|
|
|
|
return b >= 0 ? b : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef TOKEN_BUCKET_PRIVATE
|
|
|
|
|
|
|
|
/* To avoid making the rates too small, we consider units of "steps",
|
|
|
|
* where a "step" is defined as this many timestamp ticks. Keep this
|
|
|
|
* a power of two if you can. */
|
|
|
|
#define TICKS_PER_STEP 16
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* TOR_TOKEN_BUCKET_H */
|
|
|
|
|