git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
net
/
bridge
/
netfilter
/
ebt_mark.c
diff --git
a/net/bridge/netfilter/ebt_mark.c
b/net/bridge/netfilter/ebt_mark.c
index
c93d35a
..
62d23c7
100644
(file)
--- a/
net/bridge/netfilter/ebt_mark.c
+++ b/
net/bridge/netfilter/ebt_mark.c
@@
-22,24
+22,37
@@
static int ebt_target_mark(struct sk_buff **pskb, unsigned int hooknr,
const void *data, unsigned int datalen)
{
struct ebt_mark_t_info *info = (struct ebt_mark_t_info *)data;
const void *data, unsigned int datalen)
{
struct ebt_mark_t_info *info = (struct ebt_mark_t_info *)data;
+ int action = info->target & -16;
- if ((*pskb)->nfmark != info->mark)
- (*pskb)->nfmark = info->mark;
+ if (action == MARK_SET_VALUE)
+ (*pskb)->mark = info->mark;
+ else if (action == MARK_OR_VALUE)
+ (*pskb)->mark |= info->mark;
+ else if (action == MARK_AND_VALUE)
+ (*pskb)->mark &= info->mark;
+ else
+ (*pskb)->mark ^= info->mark;
- return info->target;
+ return info->target
| ~EBT_VERDICT_BITS
;
}
static int ebt_target_mark_check(const char *tablename, unsigned int hookmask,
const struct ebt_entry *e, void *data, unsigned int datalen)
{
struct ebt_mark_t_info *info = (struct ebt_mark_t_info *)data;
}
static int ebt_target_mark_check(const char *tablename, unsigned int hookmask,
const struct ebt_entry *e, void *data, unsigned int datalen)
{
struct ebt_mark_t_info *info = (struct ebt_mark_t_info *)data;
+ int tmp;
if (datalen != EBT_ALIGN(sizeof(struct ebt_mark_t_info)))
return -EINVAL;
if (datalen != EBT_ALIGN(sizeof(struct ebt_mark_t_info)))
return -EINVAL;
- if (BASE_CHAIN && info->target == EBT_RETURN)
+ tmp = info->target | ~EBT_VERDICT_BITS;
+ if (BASE_CHAIN && tmp == EBT_RETURN)
return -EINVAL;
CLEAR_BASE_CHAIN_BIT;
return -EINVAL;
CLEAR_BASE_CHAIN_BIT;
- if (INVALID_TARGET)
+ if (tmp < -NUM_STANDARD_TARGETS || tmp >= 0)
+ return -EINVAL;
+ tmp = info->target & ~EBT_VERDICT_BITS;
+ if (tmp != MARK_SET_VALUE && tmp != MARK_OR_VALUE &&
+ tmp != MARK_AND_VALUE && tmp != MARK_XOR_VALUE)
return -EINVAL;
return 0;
}
return -EINVAL;
return 0;
}
@@
-52,16
+65,16
@@
static struct ebt_target mark_target =
.me = THIS_MODULE,
};
.me = THIS_MODULE,
};
-static int __init init(void)
+static int __init
ebt_mark_
init(void)
{
return ebt_register_target(&mark_target);
}
{
return ebt_register_target(&mark_target);
}
-static void __exit fini(void)
+static void __exit
ebt_mark_
fini(void)
{
ebt_unregister_target(&mark_target);
}
{
ebt_unregister_target(&mark_target);
}
-module_init(init);
-module_exit(fini);
+module_init(
ebt_mark_
init);
+module_exit(
ebt_mark_
fini);
MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");