cregit-Linux how code gets into the kernel

Release 4.18 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 <net/netns/generic.h>

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


#define RATEEST_HSIZE	16


struct xt_rateest_net {
	
struct mutex hash_lock;
	
struct hlist_head hash[RATEEST_HSIZE];
};


static unsigned int xt_rateest_id;


static unsigned int jhash_rnd __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 McHardy34100.00%1100.00%
Total34100.00%1100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy3782.22%150.00%
Américo Wang817.78%150.00%
Total45100.00%2100.00%


static struct xt_rateest *__xt_rateest_lookup(struct xt_rateest_net *xn, const char *name) { struct xt_rateest *est; unsigned int h; h = xt_rateest_hash(name); hlist_for_each_entry(est, &xn->hash[h], list) { if (strcmp(est->name, name) == 0) { est->refcnt++; return est; } } return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy5375.71%133.33%
Américo Wang1724.29%266.67%
Total70100.00%3100.00%


struct xt_rateest *xt_rateest_lookup(struct net *net, const char *name) { struct xt_rateest_net *xn = net_generic(net, xt_rateest_id); struct xt_rateest *est; mutex_lock(&xn->hash_lock); est = __xt_rateest_lookup(xn, name); mutex_unlock(&xn->hash_lock); return est; }

Contributors

PersonTokensPropCommitsCommitProp
Américo Wang4979.03%266.67%
Patrick McHardy1320.97%133.33%
Total62100.00%3100.00%

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

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy5064.10%120.00%
Américo Wang2329.49%120.00%
Eric Dumazet33.85%240.00%
Paul E. McKenney22.56%120.00%
Total78100.00%5100.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 McHardy7193.42%125.00%
Jan Engelhardt45.26%250.00%
Eric Dumazet11.32%125.00%
Total76100.00%4100.00%


static int xt_rateest_tg_checkentry(const struct xt_tgchk_param *par) { struct xt_rateest_net *xn = net_generic(par->net, xt_rateest_id); struct xt_rateest_target_info *info = par->targinfo; struct xt_rateest *est; struct { struct nlattr opt; struct gnet_estimator est; } cfg; int ret; net_get_random_once(&jhash_rnd, sizeof(jhash_rnd)); mutex_lock(&xn->hash_lock); est = __xt_rateest_lookup(xn, info->name); if (est) { mutex_unlock(&xn->hash_lock); /* * 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(par->net, 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->rate_est, &est->lock, NULL, &cfg.opt); if (ret < 0) goto err2; info->est = est; xt_rateest_hash_insert(xn, est); mutex_unlock(&xn->hash_lock); return 0; err2: kfree(est); err1: mutex_unlock(&xn->hash_lock); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy27073.97%215.38%
Américo Wang5515.07%215.38%
Jan Engelhardt349.32%538.46%
Eric Dumazet30.82%215.38%
John Fastabend20.55%17.69%
Gao Feng10.27%17.69%
Total365100.00%13100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy2475.00%133.33%
Jan Engelhardt412.50%133.33%
Américo Wang412.50%133.33%
Total32100.00%3100.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), .usersize = offsetof(struct xt_rateest_target_info, est), .me = THIS_MODULE, };
static __net_init int xt_rateest_net_init(struct net *net) { struct xt_rateest_net *xn = net_generic(net, xt_rateest_id); int i; mutex_init(&xn->hash_lock); for (i = 0; i < ARRAY_SIZE(xn->hash); i++) INIT_HLIST_HEAD(&xn->hash[i]); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Américo Wang3552.24%150.00%
Patrick McHardy3247.76%150.00%
Total67100.00%2100.00%


static void __net_exit xt_rateest_net_exit(struct net *net) { struct xt_rateest_net *xn = net_generic(net, xt_rateest_id); int i; for (i = 0; i < ARRAY_SIZE(xn->hash); i++) WARN_ON_ONCE(!hlist_empty(&xn->hash[i])); }

Contributors

PersonTokensPropCommitsCommitProp
Américo Wang60100.00%1100.00%
Total60100.00%1100.00%

static struct pernet_operations xt_rateest_net_ops = { .init = xt_rateest_net_init, .exit = xt_rateest_net_exit, .id = &xt_rateest_id, .size = sizeof(struct xt_rateest_net), };
static int __init xt_rateest_tg_init(void) { int err = register_pernet_subsys(&xt_rateest_net_ops); if (err) return err; return xt_register_target(&xt_rateest_tg_reg); }

Contributors

PersonTokensPropCommitsCommitProp
Américo Wang2578.12%133.33%
Patrick McHardy412.50%133.33%
Jan Engelhardt39.38%133.33%
Total32100.00%3100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Patrick McHardy1257.14%133.33%
Américo Wang628.57%133.33%
Jan Engelhardt314.29%133.33%
Total21100.00%3100.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 McHardy74264.35%28.70%
Américo Wang33228.79%28.70%
Jan Engelhardt534.60%1043.48%
Willem de Bruijn110.95%14.35%
Eric Dumazet70.61%417.39%
Tejun Heo30.26%14.35%
Paul E. McKenney20.17%14.35%
John Fastabend20.17%14.35%
Gao Feng10.09%14.35%
Total1153100.00%23100.00%
Directory: net/netfilter
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.