]> Pileus Git - ~andy/linux/blobdiff - net/netfilter/xt_mark.c
xfrm: allow to avoid copying DSCP during encapsulation
[~andy/linux] / net / netfilter / xt_mark.c
index 1db07d8125f81c71c13bf0bb587c6ca4f6e82854..23345238711b515805a63687b774cdb4b6d788f4 100644 (file)
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
-MODULE_DESCRIPTION("Xtables: packet mark match");
+MODULE_DESCRIPTION("Xtables: packet mark operations");
 MODULE_ALIAS("ipt_mark");
 MODULE_ALIAS("ip6t_mark");
+MODULE_ALIAS("ipt_MARK");
+MODULE_ALIAS("ip6t_MARK");
+
+static unsigned int
+mark_tg(struct sk_buff *skb, const struct xt_action_param *par)
+{
+       const struct xt_mark_tginfo2 *info = par->targinfo;
+
+       skb->mark = (skb->mark & ~info->mask) ^ info->mark;
+       return XT_CONTINUE;
+}
 
 static bool
-mark_mt(const struct sk_buff *skb, const struct xt_match_param *par)
+mark_mt(const struct sk_buff *skb, struct xt_action_param *par)
 {
        const struct xt_mark_mtinfo1 *info = par->matchinfo;
 
        return ((skb->mark & info->mask) == info->mark) ^ info->invert;
 }
 
+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 mark_mt_reg __read_mostly = {
        .name           = "mark",
        .revision       = 1,
@@ -41,12 +61,23 @@ static struct xt_match mark_mt_reg __read_mostly = {
 
 static int __init mark_mt_init(void)
 {
-       return xt_register_match(&mark_mt_reg);
+       int 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 mark_mt_exit(void)
 {
        xt_unregister_match(&mark_mt_reg);
+       xt_unregister_target(&mark_tg_reg);
 }
 
 module_init(mark_mt_init);