cregit-Linux how code gets into the kernel

Release 4.11 net/netfilter/xt_connmark.c

Directory: net/netfilter
/*
 *      xt_connmark - Netfilter module to operate on connection marks
 *
 *      Copyright (C) 2002,2004 MARA Systems AB <http://www.marasystems.com>
 *      by Henrik Nordstrom <hno@marasystems.com>
 *      Copyright © CC Computer Consultants GmbH, 2007 - 2008
 *      Jan Engelhardt <jengelh@medozas.de>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#include <linux/module.h>
#include <linux/skbuff.h>
#include <net/netfilter/nf_conntrack.h>
#include <net/netfilter/nf_conntrack_ecache.h>
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter/xt_connmark.h>

MODULE_AUTHOR("Henrik Nordstrom <hno@marasystems.com>");
MODULE_DESCRIPTION("Xtables: connection mark operations");
MODULE_LICENSE("GPL");
MODULE_ALIAS("ipt_CONNMARK");
MODULE_ALIAS("ip6t_CONNMARK");
MODULE_ALIAS("ipt_connmark");
MODULE_ALIAS("ip6t_connmark");


static unsigned int connmark_tg(struct sk_buff *skb, const struct xt_action_param *par) { const struct xt_connmark_tginfo1 *info = par->targinfo; enum ip_conntrack_info ctinfo; struct nf_conn *ct; u_int32_t newmark; ct = nf_ct_get(skb, &ctinfo); if (ct == NULL || nf_ct_is_untracked(ct)) return XT_CONTINUE; switch (info->mode) { case XT_CONNMARK_SET: newmark = (ct->mark & ~info->ctmask) ^ info->ctmark; if (ct->mark != newmark) { ct->mark = newmark; nf_conntrack_event_cache(IPCT_MARK, ct); } break; case XT_CONNMARK_SAVE: newmark = (ct->mark & ~info->ctmask) ^ (skb->mark & info->nfmask); if (ct->mark != newmark) { ct->mark = newmark; nf_conntrack_event_cache(IPCT_MARK, ct); } break; case XT_CONNMARK_RESTORE: newmark = (skb->mark & ~info->nfmask) ^ (ct->mark & info->ctmask); skb->mark = newmark; break; } return XT_CONTINUE; }

Contributors

PersonTokensPropCommitsCommitProp
Jan Engelhardt19697.03%250.00%
Florian Westphal52.48%125.00%
Harald Welte10.50%125.00%
Total202100.00%4100.00%


static int connmark_tg_check(const struct xt_tgchk_param *par) { int ret; ret = nf_ct_netns_get(par->net, par->family); if (ret < 0) pr_info("cannot load conntrack support for proto=%u\n", par->family); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jan Engelhardt4189.13%480.00%
Florian Westphal510.87%120.00%
Total46100.00%5100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Jan Engelhardt1878.26%150.00%
Florian Westphal521.74%150.00%
Total23100.00%2100.00%


static bool connmark_mt(const struct sk_buff *skb, struct xt_action_param *par) { const struct xt_connmark_mtinfo1 *info = par->matchinfo; enum ip_conntrack_info ctinfo; const struct nf_conn *ct; ct = nf_ct_get(skb, &ctinfo); if (ct == NULL || nf_ct_is_untracked(ct)) return false; return ((ct->mark & info->mask) == info->mark) ^ info->invert; }

Contributors

PersonTokensPropCommitsCommitProp
Jan Engelhardt6478.05%675.00%
Harald Welte1315.85%112.50%
Florian Westphal56.10%112.50%
Total82100.00%8100.00%


static int connmark_mt_check(const struct xt_mtchk_param *par) { int ret; ret = nf_ct_netns_get(par->net, par->family); if (ret < 0) pr_info("cannot load conntrack support for proto=%u\n", par->family); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jan Engelhardt4086.96%571.43%
Florian Westphal510.87%114.29%
Pablo Neira Ayuso12.17%114.29%
Total46100.00%7100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Pablo Neira Ayuso1252.17%120.00%
Jan Engelhardt626.09%360.00%
Florian Westphal521.74%120.00%
Total23100.00%5100.00%

static struct xt_target connmark_tg_reg __read_mostly = { .name = "CONNMARK", .revision = 1, .family = NFPROTO_UNSPEC, .checkentry = connmark_tg_check, .target = connmark_tg, .targetsize = sizeof(struct xt_connmark_tginfo1), .destroy = connmark_tg_destroy, .me = THIS_MODULE, }; static struct xt_match connmark_mt_reg __read_mostly = { .name = "connmark", .revision = 1, .family = NFPROTO_UNSPEC, .checkentry = connmark_mt_check, .match = connmark_mt, .matchsize = sizeof(struct xt_connmark_mtinfo1), .destroy = connmark_mt_destroy, .me = THIS_MODULE, };
static int __init connmark_mt_init(void) { int ret; ret = xt_register_target(&connmark_tg_reg); if (ret < 0) return ret; ret = xt_register_match(&connmark_mt_reg); if (ret < 0) { xt_unregister_target(&connmark_tg_reg); return ret; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jan Engelhardt4578.95%350.00%
Harald Welte1119.30%233.33%
Patrick McHardy11.75%116.67%
Total57100.00%6100.00%


static void __exit connmark_mt_exit(void) { xt_unregister_match(&connmark_mt_reg); xt_unregister_target(&connmark_tg_reg); }

Contributors

PersonTokensPropCommitsCommitProp
Harald Welte1047.62%120.00%
Jan Engelhardt1047.62%360.00%
Patrick McHardy14.76%120.00%
Total21100.00%5100.00%

module_init(connmark_mt_init); module_exit(connmark_mt_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
Jan Engelhardt53780.39%1560.00%
Harald Welte7310.93%28.00%
Florian Westphal304.49%28.00%
Patrick McHardy131.95%312.00%
Pablo Neira Ayuso131.95%14.00%
Robert P. J. Day10.15%14.00%
Jeff Kirsher10.15%14.00%
Total668100.00%25100.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.