~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to net/bridge/netfilter/ebt_mark_m.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  ebt_mark_m
 
3
 *
 
4
 *      Authors:
 
5
 *      Bart De Schuymer <bdschuym@pandora.be>
 
6
 *
 
7
 *  July, 2002
 
8
 *
 
9
 */
 
10
#include <linux/module.h>
 
11
#include <linux/netfilter/x_tables.h>
 
12
#include <linux/netfilter_bridge/ebtables.h>
 
13
#include <linux/netfilter_bridge/ebt_mark_m.h>
 
14
 
 
15
static bool
 
16
ebt_mark_mt(const struct sk_buff *skb, struct xt_action_param *par)
 
17
{
 
18
        const struct ebt_mark_m_info *info = par->matchinfo;
 
19
 
 
20
        if (info->bitmask & EBT_MARK_OR)
 
21
                return !!(skb->mark & info->mask) ^ info->invert;
 
22
        return ((skb->mark & info->mask) == info->mark) ^ info->invert;
 
23
}
 
24
 
 
25
static int ebt_mark_mt_check(const struct xt_mtchk_param *par)
 
26
{
 
27
        const struct ebt_mark_m_info *info = par->matchinfo;
 
28
 
 
29
        if (info->bitmask & ~EBT_MARK_MASK)
 
30
                return -EINVAL;
 
31
        if ((info->bitmask & EBT_MARK_OR) && (info->bitmask & EBT_MARK_AND))
 
32
                return -EINVAL;
 
33
        if (!info->bitmask)
 
34
                return -EINVAL;
 
35
        return 0;
 
36
}
 
37
 
 
38
 
 
39
#ifdef CONFIG_COMPAT
 
40
struct compat_ebt_mark_m_info {
 
41
        compat_ulong_t mark, mask;
 
42
        uint8_t invert, bitmask;
 
43
};
 
44
 
 
45
static void mark_mt_compat_from_user(void *dst, const void *src)
 
46
{
 
47
        const struct compat_ebt_mark_m_info *user = src;
 
48
        struct ebt_mark_m_info *kern = dst;
 
49
 
 
50
        kern->mark = user->mark;
 
51
        kern->mask = user->mask;
 
52
        kern->invert = user->invert;
 
53
        kern->bitmask = user->bitmask;
 
54
}
 
55
 
 
56
static int mark_mt_compat_to_user(void __user *dst, const void *src)
 
57
{
 
58
        struct compat_ebt_mark_m_info __user *user = dst;
 
59
        const struct ebt_mark_m_info *kern = src;
 
60
 
 
61
        if (put_user(kern->mark, &user->mark) ||
 
62
            put_user(kern->mask, &user->mask) ||
 
63
            put_user(kern->invert, &user->invert) ||
 
64
            put_user(kern->bitmask, &user->bitmask))
 
65
                return -EFAULT;
 
66
        return 0;
 
67
}
 
68
#endif
 
69
 
 
70
static struct xt_match ebt_mark_mt_reg __read_mostly = {
 
71
        .name           = "mark_m",
 
72
        .revision       = 0,
 
73
        .family         = NFPROTO_BRIDGE,
 
74
        .match          = ebt_mark_mt,
 
75
        .checkentry     = ebt_mark_mt_check,
 
76
        .matchsize      = sizeof(struct ebt_mark_m_info),
 
77
#ifdef CONFIG_COMPAT
 
78
        .compatsize     = sizeof(struct compat_ebt_mark_m_info),
 
79
        .compat_from_user = mark_mt_compat_from_user,
 
80
        .compat_to_user = mark_mt_compat_to_user,
 
81
#endif
 
82
        .me             = THIS_MODULE,
 
83
};
 
84
 
 
85
static int __init ebt_mark_m_init(void)
 
86
{
 
87
        return xt_register_match(&ebt_mark_mt_reg);
 
88
}
 
89
 
 
90
static void __exit ebt_mark_m_fini(void)
 
91
{
 
92
        xt_unregister_match(&ebt_mark_mt_reg);
 
93
}
 
94
 
 
95
module_init(ebt_mark_m_init);
 
96
module_exit(ebt_mark_m_fini);
 
97
MODULE_DESCRIPTION("Ebtables: Packet mark match");
 
98
MODULE_LICENSE("GPL");