cregit-Linux how code gets into the kernel

Release 4.8 net/netfilter/xt_RATEEST.c

Directory: net/netfilter
/*
 * (C) 2007 Patrick McHardy <kaber@trash.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/gen_stats.h>
#include <linux/jhash.h>
#include <linux/rtnetlink.h>
#include <linux/random.h>
#include <linux/slab.h>
#include <net/gen_stats.h>
#include <net/netlink.h>

#include <linux/netfilter/x_tables.h>
#include <linux/netfilter/xt_RATEEST.h>
#include <net/netfilter/xt_rateest.h>

static DEFINE_MUTEX(xt_rateest_mutex);


#define RATEEST_HSIZE	16

static struct hlist_head rateest_hash[RATEEST_HSIZE] __read_mostly;

static unsigned int jhash_rnd __read_mostly;

static bool rnd_inited __read_mostly;


static unsigned int xt_rateest_hash(const char *name) { return jhash(name, FIELD_SIZEOF(struct xt_rateest, name), jhash_rnd) & (RATEEST_HSIZE - 1); }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy34100.00%1100.00%
Total34100.00%1100.00%


static void xt_rateest_hash_insert(struct xt_rateest *est) { unsigned int h; h = xt_rateest_hash(est->name); hlist_add_head(&est->list, &rateest_hash[h]); }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy38100.00%1100.00%
Total38100.00%1100.00%


struct xt_rateest *xt_rateest_lookup(const char *name) { struct xt_rateest *est; unsigned int h; h = xt_rateest_hash(name); mutex_lock(&xt_rateest_mutex); hlist_for_each_entry(est, &rateest_hash[h], list) { if (strcmp(est->name, name) == 0) { est->refcnt++; mutex_unlock(&xt_rateest_mutex); return est; } } mutex_unlock(&xt_rateest_mutex); return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy82100.00%1100.00%
Total82100.00%1100.00%

EXPORT_SYMBOL_GPL(xt_rateest_lookup);
void xt_rateest_put(struct xt_rateest *est) { mutex_lock(&xt_rateest_mutex); if (--est->refcnt == 0) { hlist_del(&est->list); gen_kill_estimator(&est->bstats, &est->rstats); /* * gen_estimator est_timer() might access est->lock or bstats, * wait a RCU grace period before freeing 'est' */ kfree_rcu(est, rcu); } mutex_unlock(&xt_rateest_mutex); }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy5893.55%133.33%
paul e. mckenneypaul e. mckenney23.23%133.33%
eric dumazeteric dumazet23.23%133.33%
Total62100.00%3100.00%

EXPORT_SYMBOL_GPL(xt_rateest_put);
static unsigned int xt_rateest_tg(struct sk_buff *skb, const struct xt_action_param *par) { const struct xt_rateest_target_info *info = par->targinfo; struct gnet_stats_basic_packed *stats = &info->est->bstats; spin_lock_bh(&info->est->lock); stats->bytes += skb->len; stats->packets++; spin_unlock_bh(&info->est->lock); return XT_CONTINUE; }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy7193.42%125.00%
jan engelhardtjan engelhardt45.26%250.00%
eric dumazeteric dumazet11.32%125.00%
Total76100.00%4100.00%


static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par) { struct xt_rateest_target_info *info = par->targinfo; struct xt_rateest *est; struct { struct nlattr opt; struct gnet_estimator est; } cfg; int ret; if (unlikely(!rnd_inited)) { get_random_bytes(&jhash_rnd, sizeof(jhash_rnd)); rnd_inited = true; } est = xt_rateest_lookup(info->name); if (est) { /* * If estimator parameters are specified, they must match the * existing estimator. */ if ((!info->interval && !info->ewma_log) || (info->interval != est->params.interval || info->ewma_log != est->params.ewma_log)) { xt_rateest_put(est); return -EINVAL; } info->est = est; return 0; } ret = -ENOMEM; est = kzalloc(sizeof(*est), GFP_KERNEL); if (!est) goto err1; strlcpy(est->name, info->name, sizeof(est->name)); spin_lock_init(&est->lock); est->refcnt = 1; est->params.interval = info->interval; est->params.ewma_log = info->ewma_log; cfg.opt.nla_len = nla_attr_size(sizeof(cfg.est)); cfg.opt.nla_type = TCA_STATS_RATE_EST; cfg.est.interval = info->interval; cfg.est.ewma_log = info->ewma_log; ret = gen_new_estimator(&est->bstats, NULL, &est->rstats, &est->lock, NULL, &cfg.opt); if (ret < 0) goto err2; info->est = est; xt_rateest_hash_insert(est); return 0; err2: kfree(est); err1: return ret; }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy27283.69%222.22%
jan engelhardtjan engelhardt4915.08%555.56%
eric dumazeteric dumazet20.62%111.11%
john fastabendjohn fastabend20.62%111.11%
Total325100.00%9100.00%


static void xt_rateest_tg_destroy(const struct xt_tgdtor_param *par) { struct xt_rateest_target_info *info = par->targinfo; xt_rateest_put(info->est); }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy2485.71%150.00%
jan engelhardtjan engelhardt414.29%150.00%
Total28100.00%2100.00%

static struct xt_target xt_rateest_tg_reg __read_mostly = { .name = "RATEEST", .revision = 0, .family = NFPROTO_UNSPEC, .target = xt_rateest_tg, .checkentry = xt_rateest_tg_checkentry, .destroy = xt_rateest_tg_destroy, .targetsize = sizeof(struct xt_rateest_target_info), .me = THIS_MODULE, };
static int __init xt_rateest_tg_init(void) { unsigned int i; for (i = 0; i < ARRAY_SIZE(rateest_hash); i++) INIT_HLIST_HEAD(&rateest_hash[i]); return xt_register_target(&xt_rateest_tg_reg); }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy4293.33%150.00%
jan engelhardtjan engelhardt36.67%150.00%
Total45100.00%2100.00%


static void __exit xt_rateest_tg_fini(void) { xt_unregister_target(&xt_rateest_tg_reg); }

Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy1280.00%150.00%
jan engelhardtjan engelhardt320.00%150.00%
Total15100.00%2100.00%

MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Xtables: packet rate estimator"); MODULE_ALIAS("ipt_RATEEST"); MODULE_ALIAS("ip6t_RATEEST"); module_init(xt_rateest_tg_init); module_exit(xt_rateest_tg_fini);

Overall Contributors

PersonTokensPropCommitsCommitProp
patrick mchardypatrick mchardy78490.22%211.11%
jan engelhardtjan engelhardt738.40%1055.56%
eric dumazeteric dumazet50.58%316.67%
tejun heotejun heo30.35%15.56%
john fastabendjohn fastabend20.23%15.56%
paul e. mckenneypaul e. mckenney20.23%15.56%
Total869100.00%18100.00%
Directory: net/netfilter
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.