Lines Matching defs:rl
345 ratelimit_init(struct ratelimit *rl)
348 mtx_init(&rl->rl_mtx, "ratelimit_lock", NULL, MTX_DEF);
349 callout_init_mtx(&rl->rl_gc, &rl->rl_mtx, 0);
350 arc4random_buf(rl->rl_secret, sizeof(rl->rl_secret));
352 LIST_INIT(&rl->rl_table[i]);
353 rl->rl_table_num = 0;
354 rl->rl_initialized = true;
358 ratelimit_deinit(struct ratelimit *rl)
360 if (!rl->rl_initialized)
362 mtx_lock(&rl->rl_mtx);
363 callout_stop(&rl->rl_gc);
364 ratelimit_gc(rl, true);
365 mtx_unlock(&rl->rl_mtx);
366 mtx_destroy(&rl->rl_mtx);
368 rl->rl_initialized = false;
379 ratelimit_gc_schedule(struct ratelimit *rl)
387 if (rl->rl_table_num > 0 && !callout_pending(&rl->rl_gc))
388 callout_reset(&rl->rl_gc, ELEMENT_TIMEOUT * hz,
389 ratelimit_gc_callout, rl);
393 ratelimit_gc(struct ratelimit *rl, bool force)
399 mtx_assert(&rl->rl_mtx, MA_OWNED);
401 if (rl->rl_table_num == 0)
407 LIST_FOREACH_SAFE(r, &rl->rl_table[i], r_entry, tr) {
409 rl->rl_table_num--;
416 ratelimit_gc_schedule(rl);
420 ratelimit_allow(struct ratelimit *rl, struct sockaddr *sa, struct vnet *vnet)
440 bucket = siphash13(rl->rl_secret, &key, len) & RATELIMIT_MASK;
441 mtx_lock(&rl->rl_mtx);
443 LIST_FOREACH(r, &rl->rl_table[bucket], r_entry) {
474 if (rl->rl_table_num >= RATELIMIT_SIZE_MAX)
481 rl->rl_table_num++;
484 LIST_INSERT_HEAD(&rl->rl_table[bucket], r, r_entry);
490 ratelimit_gc_schedule(rl);
494 mtx_unlock(&rl->rl_mtx);