diff options
Diffstat (limited to 'net/netfilter/xt_mark.c')
| -rw-r--r-- | net/netfilter/xt_mark.c | 107 |
1 files changed, 50 insertions, 57 deletions
diff --git a/net/netfilter/xt_mark.c b/net/netfilter/xt_mark.c index 2a0ac62b72c..23345238711 100644 --- a/net/netfilter/xt_mark.c +++ b/net/netfilter/xt_mark.c @@ -1,10 +1,13 @@ -/* Kernel module to match NFMARK values. */ - -/* (C) 1999-2001 Marc Boucher <marc@mbsi.ca> +/* + * xt_mark - Netfilter module to match NFMARK value + * + * (C) 1999-2001 Marc Boucher <marc@mbsi.ca> + * 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 version 2 as - * published by the Free Software Foundation. + * 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> @@ -15,77 +18,67 @@ MODULE_LICENSE("GPL"); MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>"); -MODULE_DESCRIPTION("iptables mark matching module"); +MODULE_DESCRIPTION("Xtables: packet mark operations"); MODULE_ALIAS("ipt_mark"); MODULE_ALIAS("ip6t_mark"); +MODULE_ALIAS("ipt_MARK"); +MODULE_ALIAS("ip6t_MARK"); -static int -match(const struct sk_buff *skb, - const struct net_device *in, - const struct net_device *out, - const void *matchinfo, - int offset, - unsigned int protoff, - int *hotdrop) +static unsigned int +mark_tg(struct sk_buff *skb, const struct xt_action_param *par) { - const struct xt_mark_info *info = matchinfo; + const struct xt_mark_tginfo2 *info = par->targinfo; - return ((skb->nfmark & info->mask) == info->mark) ^ info->invert; + skb->mark = (skb->mark & ~info->mask) ^ info->mark; + return XT_CONTINUE; } -static int -checkentry(const char *tablename, - const void *entry, - void *matchinfo, - unsigned int matchsize, - unsigned int hook_mask) +static bool +mark_mt(const struct sk_buff *skb, struct xt_action_param *par) { - struct xt_mark_info *minfo = (struct xt_mark_info *) matchinfo; - - if (matchsize != XT_ALIGN(sizeof(struct xt_mark_info))) - return 0; - - if (minfo->mark > 0xffffffff || minfo->mask > 0xffffffff) { - printk(KERN_WARNING "mark: only supports 32bit mark\n"); - return 0; - } + const struct xt_mark_mtinfo1 *info = par->matchinfo; - return 1; + return ((skb->mark & info->mask) == info->mark) ^ info->invert; } -static struct xt_match mark_match = { - .name = "mark", - .match = &match, - .checkentry = &checkentry, - .me = THIS_MODULE, +static struct xt_target mark_tg_reg __read_mostly = { + .name = "MARK", + .revision = 2, + .family = NFPROTO_UNSPEC, + .target = mark_tg, + .targetsize = sizeof(struct xt_mark_tginfo2), + .me = THIS_MODULE, }; -static struct xt_match mark6_match = { - .name = "mark", - .match = &match, - .checkentry = &checkentry, - .me = THIS_MODULE, +static struct xt_match mark_mt_reg __read_mostly = { + .name = "mark", + .revision = 1, + .family = NFPROTO_UNSPEC, + .match = mark_mt, + .matchsize = sizeof(struct xt_mark_mtinfo1), + .me = THIS_MODULE, }; -static int __init init(void) +static int __init mark_mt_init(void) { int ret; - ret = xt_register_match(AF_INET, &mark_match); - if (ret) - return ret; - - ret = xt_register_match(AF_INET6, &mark6_match); - if (ret) - xt_unregister_match(AF_INET, &mark_match); - return ret; + ret = xt_register_target(&mark_tg_reg); + if (ret < 0) + return ret; + ret = xt_register_match(&mark_mt_reg); + if (ret < 0) { + xt_unregister_target(&mark_tg_reg); + return ret; + } + return 0; } -static void __exit fini(void) +static void __exit mark_mt_exit(void) { - xt_unregister_match(AF_INET, &mark_match); - xt_unregister_match(AF_INET6, &mark6_match); + xt_unregister_match(&mark_mt_reg); + xt_unregister_target(&mark_tg_reg); } -module_init(init); -module_exit(fini); +module_init(mark_mt_init); +module_exit(mark_mt_exit); |
