cregit-Linux how code gets into the kernel

Release 4.10 net/netfilter/xt_connbytes.c

Directory: net/netfilter
/* Kernel module to match connection tracking byte counter.
 * GPL (C) 2002 Martin Devera (devik@cdi.cz).
 */

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/bitops.h>
#include <linux/skbuff.h>
#include <linux/math64.h>
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter/xt_connbytes.h>
#include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_acct.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
MODULE_DESCRIPTION("Xtables: Number of packets/bytes per connection matching");
MODULE_ALIAS("ipt_connbytes");
MODULE_ALIAS("ip6t_connbytes");


static bool connbytes_mt(const struct sk_buff *skb, struct xt_action_param *par) { const struct xt_connbytes_info *sinfo = par->matchinfo; const struct nf_conn *ct; enum ip_conntrack_info ctinfo; u_int64_t what = 0; /* initialize to make gcc happy */ u_int64_t bytes = 0; u_int64_t pkts = 0; const struct nf_conn_acct *acct; const struct nf_conn_counter *counters; ct = nf_ct_get(skb, &ctinfo); if (!ct) return false; acct = nf_conn_acct_find(ct); if (!acct) return false; counters = acct->counter; switch (sinfo->what) { case XT_CONNBYTES_PKTS: switch (sinfo->direction) { case XT_CONNBYTES_DIR_ORIGINAL: what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets); break; case XT_CONNBYTES_DIR_REPLY: what = atomic64_read(&counters[IP_CT_DIR_REPLY].packets); break; case XT_CONNBYTES_DIR_BOTH: what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets); what += atomic64_read(&counters[IP_CT_DIR_REPLY].packets); break; } break; case XT_CONNBYTES_BYTES: switch (sinfo->direction) { case XT_CONNBYTES_DIR_ORIGINAL: what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes); break; case XT_CONNBYTES_DIR_REPLY: what = atomic64_read(&counters[IP_CT_DIR_REPLY].bytes); break; case XT_CONNBYTES_DIR_BOTH: what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes); what += atomic64_read(&counters[IP_CT_DIR_REPLY].bytes); break; } break; case XT_CONNBYTES_AVGPKT: switch (sinfo->direction) { case XT_CONNBYTES_DIR_ORIGINAL: bytes = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes); pkts = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets); break; case XT_CONNBYTES_DIR_REPLY: bytes = atomic64_read(&counters[IP_CT_DIR_REPLY].bytes); pkts = atomic64_read(&counters[IP_CT_DIR_REPLY].packets); break; case XT_CONNBYTES_DIR_BOTH: bytes = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes) + atomic64_read(&counters[IP_CT_DIR_REPLY].bytes); pkts = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets) + atomic64_read(&counters[IP_CT_DIR_REPLY].packets); break; } if (pkts != 0) what = div64_u64(bytes, pkts); break; } if (sinfo->count.to >= sinfo->count.from) return what <= sinfo->count.to && what >= sinfo->count.from; else /* inverted */ return what < sinfo->count.to || what > sinfo->count.from; }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte28663.13%213.33%
eric dumazeteric dumazet6414.13%16.67%
patrick mchardypatrick mchardy4810.60%213.33%
florian westphalflorian westphal163.53%16.67%
holger eitzenbergerholger eitzenberger143.09%16.67%
krzysztof piotr oledzkikrzysztof piotr oledzki112.43%16.67%
jan engelhardtjan engelhardt81.77%533.33%
yasuyuki kozakaiyasuyuki kozakai51.10%16.67%
roman zippelroman zippel10.22%16.67%
Total453100.00%15100.00%


static int connbytes_mt_check(const struct xt_mtchk_param *par) { const struct xt_connbytes_info *sinfo = par->matchinfo; int ret; if (sinfo->what != XT_CONNBYTES_PKTS && sinfo->what != XT_CONNBYTES_BYTES && sinfo->what != XT_CONNBYTES_AVGPKT) return -EINVAL; if (sinfo->direction != XT_CONNBYTES_DIR_ORIGINAL && sinfo->direction != XT_CONNBYTES_DIR_REPLY && sinfo->direction != XT_CONNBYTES_DIR_BOTH) return -EINVAL; ret = nf_ct_netns_get(par->net, par->family); if (ret < 0) pr_info("cannot load conntrack support for proto=%u\n", par->family); /* * This filter cannot function correctly unless connection tracking * accounting is enabled, so complain in the hope that someone notices. */ if (!nf_ct_acct_enabled(par->net)) { pr_warn("Forcing CT accounting to be enabled\n"); nf_ct_set_acct(par->net, true); } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte5743.51%215.38%
jan engelhardtjan engelhardt2619.85%646.15%
tim gardnertim gardner2619.85%17.69%
yasuyuki kozakaiyasuyuki kozakai1410.69%17.69%
florian westphalflorian westphal53.82%17.69%
patrick mchardypatrick mchardy21.53%17.69%
joe perchesjoe perches10.76%17.69%
Total131100.00%13100.00%


static void connbytes_mt_destroy(const struct xt_mtdtor_param *par) { nf_ct_netns_put(par->net, par->family); }

Contributors

PersonTokensPropCommitsCommitProp
yasuyuki kozakaiyasuyuki kozakai1356.52%125.00%
florian westphalflorian westphal521.74%125.00%
jan engelhardtjan engelhardt521.74%250.00%
Total23100.00%4100.00%

static struct xt_match connbytes_mt_reg __read_mostly = { .name = "connbytes", .revision = 0, .family = NFPROTO_UNSPEC, .checkentry = connbytes_mt_check, .match = connbytes_mt, .destroy = connbytes_mt_destroy, .matchsize = sizeof(struct xt_connbytes_info), .me = THIS_MODULE, };
static int __init connbytes_mt_init(void) { return xt_register_match(&connbytes_mt_reg); }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte1168.75%240.00%
jan engelhardtjan engelhardt425.00%240.00%
patrick mchardypatrick mchardy16.25%120.00%
Total16100.00%5100.00%


static void __exit connbytes_mt_exit(void) { xt_unregister_match(&connbytes_mt_reg); }

Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte1066.67%125.00%
jan engelhardtjan engelhardt426.67%250.00%
patrick mchardypatrick mchardy16.67%125.00%
Total15100.00%4100.00%

module_init(connbytes_mt_init); module_exit(connbytes_mt_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
harald welteharald welte43056.80%25.88%
patrick mchardypatrick mchardy699.11%720.59%
jan engelhardtjan engelhardt699.11%1441.18%
eric dumazeteric dumazet648.45%12.94%
yasuyuki kozakaiyasuyuki kozakai364.76%25.88%
tim gardnertim gardner263.43%12.94%
florian westphalflorian westphal263.43%25.88%
krzysztof piotr oledzkikrzysztof piotr oledzki141.85%12.94%
holger eitzenbergerholger eitzenberger141.85%12.94%
roman zippelroman zippel50.66%12.94%
jiri slabyjiri slaby30.40%12.94%
joe perchesjoe perches10.13%12.94%
Total757100.00%34100.00%
Directory: net/netfilter
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.