|
@@ -27,95 +27,14 @@ MODULE_DESCRIPTION("iptables mangle table");
|
|
|
(1 << NF_INET_LOCAL_OUT) | \
|
|
|
(1 << NF_INET_POST_ROUTING))
|
|
|
|
|
|
-/* Ouch - five different hooks? Maybe this should be a config option..... -- BC */
|
|
|
-static const struct
|
|
|
-{
|
|
|
- struct ipt_replace repl;
|
|
|
- struct ipt_standard entries[5];
|
|
|
- struct ipt_error term;
|
|
|
-} initial_table __net_initdata = {
|
|
|
- .repl = {
|
|
|
- .name = "mangle",
|
|
|
- .valid_hooks = MANGLE_VALID_HOOKS,
|
|
|
- .num_entries = 6,
|
|
|
- .size = sizeof(struct ipt_standard) * 5 + sizeof(struct ipt_error),
|
|
|
- .hook_entry = {
|
|
|
- [NF_INET_PRE_ROUTING] = 0,
|
|
|
- [NF_INET_LOCAL_IN] = sizeof(struct ipt_standard),
|
|
|
- [NF_INET_FORWARD] = sizeof(struct ipt_standard) * 2,
|
|
|
- [NF_INET_LOCAL_OUT] = sizeof(struct ipt_standard) * 3,
|
|
|
- [NF_INET_POST_ROUTING] = sizeof(struct ipt_standard) * 4,
|
|
|
- },
|
|
|
- .underflow = {
|
|
|
- [NF_INET_PRE_ROUTING] = 0,
|
|
|
- [NF_INET_LOCAL_IN] = sizeof(struct ipt_standard),
|
|
|
- [NF_INET_FORWARD] = sizeof(struct ipt_standard) * 2,
|
|
|
- [NF_INET_LOCAL_OUT] = sizeof(struct ipt_standard) * 3,
|
|
|
- [NF_INET_POST_ROUTING] = sizeof(struct ipt_standard) * 4,
|
|
|
- },
|
|
|
- },
|
|
|
- .entries = {
|
|
|
- IPT_STANDARD_INIT(NF_ACCEPT), /* PRE_ROUTING */
|
|
|
- IPT_STANDARD_INIT(NF_ACCEPT), /* LOCAL_IN */
|
|
|
- IPT_STANDARD_INIT(NF_ACCEPT), /* FORWARD */
|
|
|
- IPT_STANDARD_INIT(NF_ACCEPT), /* LOCAL_OUT */
|
|
|
- IPT_STANDARD_INIT(NF_ACCEPT), /* POST_ROUTING */
|
|
|
- },
|
|
|
- .term = IPT_ERROR_INIT, /* ERROR */
|
|
|
-};
|
|
|
-
|
|
|
static const struct xt_table packet_mangler = {
|
|
|
.name = "mangle",
|
|
|
.valid_hooks = MANGLE_VALID_HOOKS,
|
|
|
.me = THIS_MODULE,
|
|
|
.af = NFPROTO_IPV4,
|
|
|
+ .priority = NF_IP_PRI_MANGLE,
|
|
|
};
|
|
|
|
|
|
-/* The work comes in here from netfilter.c. */
|
|
|
-static unsigned int
|
|
|
-ipt_pre_routing_hook(unsigned int hook,
|
|
|
- struct sk_buff *skb,
|
|
|
- const struct net_device *in,
|
|
|
- const struct net_device *out,
|
|
|
- int (*okfn)(struct sk_buff *))
|
|
|
-{
|
|
|
- return ipt_do_table(skb, hook, in, out,
|
|
|
- dev_net(in)->ipv4.iptable_mangle);
|
|
|
-}
|
|
|
-
|
|
|
-static unsigned int
|
|
|
-ipt_post_routing_hook(unsigned int hook,
|
|
|
- struct sk_buff *skb,
|
|
|
- const struct net_device *in,
|
|
|
- const struct net_device *out,
|
|
|
- int (*okfn)(struct sk_buff *))
|
|
|
-{
|
|
|
- return ipt_do_table(skb, hook, in, out,
|
|
|
- dev_net(out)->ipv4.iptable_mangle);
|
|
|
-}
|
|
|
-
|
|
|
-static unsigned int
|
|
|
-ipt_local_in_hook(unsigned int hook,
|
|
|
- struct sk_buff *skb,
|
|
|
- const struct net_device *in,
|
|
|
- const struct net_device *out,
|
|
|
- int (*okfn)(struct sk_buff *))
|
|
|
-{
|
|
|
- return ipt_do_table(skb, hook, in, out,
|
|
|
- dev_net(in)->ipv4.iptable_mangle);
|
|
|
-}
|
|
|
-
|
|
|
-static unsigned int
|
|
|
-ipt_forward_hook(unsigned int hook,
|
|
|
- struct sk_buff *skb,
|
|
|
- const struct net_device *in,
|
|
|
- const struct net_device *out,
|
|
|
- int (*okfn)(struct sk_buff *))
|
|
|
-{
|
|
|
- return ipt_do_table(skb, hook, in, out,
|
|
|
- dev_net(in)->ipv4.iptable_mangle);
|
|
|
-}
|
|
|
-
|
|
|
static unsigned int
|
|
|
ipt_local_hook(unsigned int hook,
|
|
|
struct sk_buff *skb,
|
|
@@ -158,49 +77,34 @@ ipt_local_hook(unsigned int hook,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static struct nf_hook_ops ipt_ops[] __read_mostly = {
|
|
|
- {
|
|
|
- .hook = ipt_pre_routing_hook,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = NFPROTO_IPV4,
|
|
|
- .hooknum = NF_INET_PRE_ROUTING,
|
|
|
- .priority = NF_IP_PRI_MANGLE,
|
|
|
- },
|
|
|
- {
|
|
|
- .hook = ipt_local_in_hook,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = NFPROTO_IPV4,
|
|
|
- .hooknum = NF_INET_LOCAL_IN,
|
|
|
- .priority = NF_IP_PRI_MANGLE,
|
|
|
- },
|
|
|
- {
|
|
|
- .hook = ipt_forward_hook,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = NFPROTO_IPV4,
|
|
|
- .hooknum = NF_INET_FORWARD,
|
|
|
- .priority = NF_IP_PRI_MANGLE,
|
|
|
- },
|
|
|
- {
|
|
|
- .hook = ipt_local_hook,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = NFPROTO_IPV4,
|
|
|
- .hooknum = NF_INET_LOCAL_OUT,
|
|
|
- .priority = NF_IP_PRI_MANGLE,
|
|
|
- },
|
|
|
- {
|
|
|
- .hook = ipt_post_routing_hook,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = NFPROTO_IPV4,
|
|
|
- .hooknum = NF_INET_POST_ROUTING,
|
|
|
- .priority = NF_IP_PRI_MANGLE,
|
|
|
- },
|
|
|
-};
|
|
|
+/* The work comes in here from netfilter.c. */
|
|
|
+static unsigned int
|
|
|
+iptable_mangle_hook(unsigned int hook,
|
|
|
+ struct sk_buff *skb,
|
|
|
+ const struct net_device *in,
|
|
|
+ const struct net_device *out,
|
|
|
+ int (*okfn)(struct sk_buff *))
|
|
|
+{
|
|
|
+ if (hook == NF_INET_LOCAL_OUT)
|
|
|
+ return ipt_local_hook(hook, skb, in, out, okfn);
|
|
|
+
|
|
|
+ /* PREROUTING/INPUT/FORWARD: */
|
|
|
+ return ipt_do_table(skb, hook, in, out,
|
|
|
+ dev_net(in)->ipv4.iptable_mangle);
|
|
|
+}
|
|
|
+
|
|
|
+static struct nf_hook_ops *mangle_ops __read_mostly;
|
|
|
|
|
|
static int __net_init iptable_mangle_net_init(struct net *net)
|
|
|
{
|
|
|
- /* Register table */
|
|
|
+ struct ipt_replace *repl;
|
|
|
+
|
|
|
+ repl = ipt_alloc_initial_table(&packet_mangler);
|
|
|
+ if (repl == NULL)
|
|
|
+ return -ENOMEM;
|
|
|
net->ipv4.iptable_mangle =
|
|
|
- ipt_register_table(net, &packet_mangler, &initial_table.repl);
|
|
|
+ ipt_register_table(net, &packet_mangler, repl);
|
|
|
+ kfree(repl);
|
|
|
if (IS_ERR(net->ipv4.iptable_mangle))
|
|
|
return PTR_ERR(net->ipv4.iptable_mangle);
|
|
|
return 0;
|
|
@@ -225,9 +129,11 @@ static int __init iptable_mangle_init(void)
|
|
|
return ret;
|
|
|
|
|
|
/* Register hooks */
|
|
|
- ret = nf_register_hooks(ipt_ops, ARRAY_SIZE(ipt_ops));
|
|
|
- if (ret < 0)
|
|
|
+ mangle_ops = xt_hook_link(&packet_mangler, iptable_mangle_hook);
|
|
|
+ if (IS_ERR(mangle_ops)) {
|
|
|
+ ret = PTR_ERR(mangle_ops);
|
|
|
goto cleanup_table;
|
|
|
+ }
|
|
|
|
|
|
return ret;
|
|
|
|
|
@@ -238,7 +144,7 @@ static int __init iptable_mangle_init(void)
|
|
|
|
|
|
static void __exit iptable_mangle_fini(void)
|
|
|
{
|
|
|
- nf_unregister_hooks(ipt_ops, ARRAY_SIZE(ipt_ops));
|
|
|
+ xt_hook_unlink(&packet_mangler, mangle_ops);
|
|
|
unregister_pernet_subsys(&iptable_mangle_net_ops);
|
|
|
}
|
|
|
|