mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Implements token bucket filter for rate limiting.
This commit is contained in:
@@ -300,10 +300,10 @@ krt_trace_in(struct krt_proto *p, rte *e, char *msg)
|
||||
}
|
||||
|
||||
static inline void
|
||||
krt_trace_in_rl(struct rate_limit *rl, struct krt_proto *p, rte *e, char *msg)
|
||||
krt_trace_in_rl(struct tbf *f, struct krt_proto *p, rte *e, char *msg)
|
||||
{
|
||||
if (p->p.debug & D_PACKETS)
|
||||
log_rl(rl, L_TRACE "%s: %I/%d: %s", p->p.name, e->net->n.prefix, e->net->n.pxlen, msg);
|
||||
log_rl(f, L_TRACE "%s: %I/%d: %s", p->p.name, e->net->n.prefix, e->net->n.pxlen, msg);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -312,7 +312,7 @@ krt_trace_in_rl(struct rate_limit *rl, struct krt_proto *p, rte *e, char *msg)
|
||||
|
||||
#ifdef KRT_ALLOW_LEARN
|
||||
|
||||
static struct rate_limit rl_alien_seen, rl_alien_updated, rl_alien_created, rl_alien_ignored;
|
||||
static struct tbf rl_alien = TBF_DEFAULT_LOG_LIMITS;
|
||||
|
||||
/*
|
||||
* krt_same_key() specifies what (aside from the net) is the key in
|
||||
@@ -378,20 +378,20 @@ krt_learn_scan(struct krt_proto *p, rte *e)
|
||||
{
|
||||
if (krt_uptodate(m, e))
|
||||
{
|
||||
krt_trace_in_rl(&rl_alien_seen, p, e, "[alien] seen");
|
||||
krt_trace_in_rl(&rl_alien, p, e, "[alien] seen");
|
||||
rte_free(e);
|
||||
m->u.krt.seen = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
krt_trace_in_rl(&rl_alien_updated, p, e, "[alien] updated");
|
||||
krt_trace_in(p, e, "[alien] updated");
|
||||
*mm = m->next;
|
||||
rte_free(m);
|
||||
m = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
krt_trace_in_rl(&rl_alien_created, p, e, "[alien] created");
|
||||
krt_trace_in(p, e, "[alien] created");
|
||||
if (!m)
|
||||
{
|
||||
e->next = n->routes;
|
||||
@@ -637,7 +637,7 @@ krt_got_route(struct krt_proto *p, rte *e)
|
||||
krt_learn_scan(p, e);
|
||||
else
|
||||
{
|
||||
krt_trace_in_rl(&rl_alien_ignored, p, e, "[alien] ignored");
|
||||
krt_trace_in_rl(&rl_alien, p, e, "[alien] ignored");
|
||||
rte_free(e);
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -32,9 +32,6 @@ static FILE *dbgf;
|
||||
static list *current_log_list;
|
||||
static char *current_syslog_name; /* NULL -> syslog closed */
|
||||
|
||||
static const bird_clock_t rate_limit_time = 5;
|
||||
static const int rate_limit_count = 5;
|
||||
|
||||
|
||||
#ifdef USE_PTHREADS
|
||||
|
||||
@@ -154,7 +151,6 @@ vlog(int class, const char *msg, va_list args)
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* log - log a message
|
||||
* @msg: printf-like formatting string with message class information
|
||||
@@ -180,31 +176,21 @@ log_msg(char *msg, ...)
|
||||
}
|
||||
|
||||
void
|
||||
log_rl(struct rate_limit *rl, char *msg, ...)
|
||||
log_rl(struct tbf *f, char *msg, ...)
|
||||
{
|
||||
int last_hit = f->mark;
|
||||
int class = 1;
|
||||
va_list args;
|
||||
|
||||
bird_clock_t delta = now - rl->timestamp;
|
||||
if ((0 <= delta) && (delta < rate_limit_time))
|
||||
{
|
||||
rl->count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
rl->timestamp = now;
|
||||
rl->count = 1;
|
||||
}
|
||||
|
||||
if (rl->count > rate_limit_count)
|
||||
/* Rate limiting is a bit tricky here as it also logs '...' during the first hit */
|
||||
if (tbf_limit(f) && last_hit)
|
||||
return;
|
||||
|
||||
va_start(args, msg);
|
||||
if (*msg >= 1 && *msg <= 8)
|
||||
class = *msg++;
|
||||
vlog(class, msg, args);
|
||||
if (rl->count == rate_limit_count)
|
||||
vlog(class, "...", args);
|
||||
|
||||
va_start(args, msg);
|
||||
vlog(class, (f->mark ? "..." : msg), args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user