X-Git-Url: http://git.onelab.eu/?p=linux-2.6.git;a=blobdiff_plain;f=net%2Fnetfilter%2Fxt_MARK.c;fp=net%2Fnetfilter%2Fxt_MARK.c;h=0c11ee9550f37d901dc033d34ae522d8c48b246d;hp=ee9c34edc76c4e8d8b920013c8f4825b6de37a36;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c diff --git a/net/netfilter/xt_MARK.c b/net/netfilter/xt_MARK.c index ee9c34edc..0c11ee955 100644 --- a/net/netfilter/xt_MARK.c +++ b/net/netfilter/xt_MARK.c @@ -26,7 +26,6 @@ target_v0(struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, unsigned int hooknum, - const struct xt_target *target, const void *targinfo, void *userinfo) { @@ -43,7 +42,6 @@ target_v1(struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, unsigned int hooknum, - const struct xt_target *target, const void *targinfo, void *userinfo) { @@ -74,30 +72,53 @@ target_v1(struct sk_buff **pskb, static int checkentry_v0(const char *tablename, const void *entry, - const struct xt_target *target, void *targinfo, unsigned int targinfosize, unsigned int hook_mask) { struct xt_mark_target_info *markinfo = targinfo; + if (targinfosize != XT_ALIGN(sizeof(struct xt_mark_target_info))) { + printk(KERN_WARNING "MARK: targinfosize %u != %Zu\n", + targinfosize, + XT_ALIGN(sizeof(struct xt_mark_target_info))); + return 0; + } + + if (strcmp(tablename, "mangle") != 0) { + printk(KERN_WARNING "MARK: can only be called from \"mangle\" table, not \"%s\"\n", tablename); + return 0; + } + if (markinfo->mark > 0xffffffff) { printk(KERN_WARNING "MARK: Only supports 32bit wide mark\n"); return 0; } + return 1; } static int checkentry_v1(const char *tablename, const void *entry, - const struct xt_target *target, void *targinfo, unsigned int targinfosize, unsigned int hook_mask) { struct xt_mark_target_info_v1 *markinfo = targinfo; + if (targinfosize != XT_ALIGN(sizeof(struct xt_mark_target_info_v1))){ + printk(KERN_WARNING "MARK: targinfosize %u != %Zu\n", + targinfosize, + XT_ALIGN(sizeof(struct xt_mark_target_info_v1))); + return 0; + } + + if (strcmp(tablename, "mangle") != 0) { + printk(KERN_WARNING "MARK: can only be called from \"mangle\" table, not \"%s\"\n", tablename); + return 0; + } + if (markinfo->mode != XT_MARK_SET && markinfo->mode != XT_MARK_AND && markinfo->mode != XT_MARK_OR) { @@ -105,73 +126,66 @@ checkentry_v1(const char *tablename, markinfo->mode); return 0; } + if (markinfo->mark > 0xffffffff) { printk(KERN_WARNING "MARK: Only supports 32bit wide mark\n"); return 0; } + return 1; } static struct xt_target ipt_mark_reg_v0 = { .name = "MARK", .target = target_v0, - .targetsize = sizeof(struct xt_mark_target_info), - .table = "mangle", .checkentry = checkentry_v0, .me = THIS_MODULE, - .family = AF_INET, .revision = 0, }; static struct xt_target ipt_mark_reg_v1 = { .name = "MARK", .target = target_v1, - .targetsize = sizeof(struct xt_mark_target_info_v1), - .table = "mangle", .checkentry = checkentry_v1, .me = THIS_MODULE, - .family = AF_INET, .revision = 1, }; static struct xt_target ip6t_mark_reg_v0 = { .name = "MARK", .target = target_v0, - .targetsize = sizeof(struct xt_mark_target_info), - .table = "mangle", .checkentry = checkentry_v0, .me = THIS_MODULE, - .family = AF_INET6, .revision = 0, }; -static int __init xt_mark_init(void) +static int __init init(void) { int err; - err = xt_register_target(&ipt_mark_reg_v0); + err = xt_register_target(AF_INET, &ipt_mark_reg_v0); if (err) return err; - err = xt_register_target(&ipt_mark_reg_v1); + err = xt_register_target(AF_INET, &ipt_mark_reg_v1); if (err) - xt_unregister_target(&ipt_mark_reg_v0); + xt_unregister_target(AF_INET, &ipt_mark_reg_v0); - err = xt_register_target(&ip6t_mark_reg_v0); + err = xt_register_target(AF_INET6, &ip6t_mark_reg_v0); if (err) { - xt_unregister_target(&ipt_mark_reg_v0); - xt_unregister_target(&ipt_mark_reg_v1); + xt_unregister_target(AF_INET, &ipt_mark_reg_v0); + xt_unregister_target(AF_INET, &ipt_mark_reg_v1); } return err; } -static void __exit xt_mark_fini(void) +static void __exit fini(void) { - xt_unregister_target(&ipt_mark_reg_v0); - xt_unregister_target(&ipt_mark_reg_v1); - xt_unregister_target(&ip6t_mark_reg_v0); + xt_unregister_target(AF_INET, &ipt_mark_reg_v0); + xt_unregister_target(AF_INET, &ipt_mark_reg_v1); + xt_unregister_target(AF_INET6, &ip6t_mark_reg_v0); } -module_init(xt_mark_init); -module_exit(xt_mark_fini); +module_init(init); +module_exit(fini);