Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *  xt_mark - Netfilter module to match NFMARK value
0004  *
0005  *  (C) 1999-2001 Marc Boucher <marc@mbsi.ca>
0006  *  Copyright © CC Computer Consultants GmbH, 2007 - 2008
0007  *  Jan Engelhardt <jengelh@medozas.de>
0008  */
0009 
0010 #include <linux/module.h>
0011 #include <linux/skbuff.h>
0012 
0013 #include <linux/netfilter/xt_mark.h>
0014 #include <linux/netfilter/x_tables.h>
0015 
0016 MODULE_LICENSE("GPL");
0017 MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
0018 MODULE_DESCRIPTION("Xtables: packet mark operations");
0019 MODULE_ALIAS("ipt_mark");
0020 MODULE_ALIAS("ip6t_mark");
0021 MODULE_ALIAS("ipt_MARK");
0022 MODULE_ALIAS("ip6t_MARK");
0023 MODULE_ALIAS("arpt_MARK");
0024 
0025 static unsigned int
0026 mark_tg(struct sk_buff *skb, const struct xt_action_param *par)
0027 {
0028     const struct xt_mark_tginfo2 *info = par->targinfo;
0029 
0030     skb->mark = (skb->mark & ~info->mask) ^ info->mark;
0031     return XT_CONTINUE;
0032 }
0033 
0034 static bool
0035 mark_mt(const struct sk_buff *skb, struct xt_action_param *par)
0036 {
0037     const struct xt_mark_mtinfo1 *info = par->matchinfo;
0038 
0039     return ((skb->mark & info->mask) == info->mark) ^ info->invert;
0040 }
0041 
0042 static struct xt_target mark_tg_reg __read_mostly = {
0043     .name           = "MARK",
0044     .revision       = 2,
0045     .family         = NFPROTO_UNSPEC,
0046     .target         = mark_tg,
0047     .targetsize     = sizeof(struct xt_mark_tginfo2),
0048     .me             = THIS_MODULE,
0049 };
0050 
0051 static struct xt_match mark_mt_reg __read_mostly = {
0052     .name           = "mark",
0053     .revision       = 1,
0054     .family         = NFPROTO_UNSPEC,
0055     .match          = mark_mt,
0056     .matchsize      = sizeof(struct xt_mark_mtinfo1),
0057     .me             = THIS_MODULE,
0058 };
0059 
0060 static int __init mark_mt_init(void)
0061 {
0062     int ret;
0063 
0064     ret = xt_register_target(&mark_tg_reg);
0065     if (ret < 0)
0066         return ret;
0067     ret = xt_register_match(&mark_mt_reg);
0068     if (ret < 0) {
0069         xt_unregister_target(&mark_tg_reg);
0070         return ret;
0071     }
0072     return 0;
0073 }
0074 
0075 static void __exit mark_mt_exit(void)
0076 {
0077     xt_unregister_match(&mark_mt_reg);
0078     xt_unregister_target(&mark_tg_reg);
0079 }
0080 
0081 module_init(mark_mt_init);
0082 module_exit(mark_mt_exit);