diff options
Diffstat (limited to 'net/ipv4/netfilter/arptable_filter.c')
-rw-r--r-- | net/ipv4/netfilter/arptable_filter.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/net/ipv4/netfilter/arptable_filter.c b/net/ipv4/netfilter/arptable_filter.c index bfe26f32b930..ae619de581b8 100644 --- a/net/ipv4/netfilter/arptable_filter.c +++ b/net/ipv4/netfilter/arptable_filter.c @@ -21,7 +21,6 @@ static const struct xt_table packet_filter = { .valid_hooks = FILTER_VALID_HOOKS, .me = THIS_MODULE, .af = NFPROTO_ARP, - .priority = NF_IP_PRI_FILTER, }; /* The work comes in here from netfilter.c */ @@ -35,7 +34,29 @@ arptable_filter_hook(unsigned int hook, struct sk_buff *skb, return arpt_do_table(skb, hook, in, out, net->ipv4.arptable_filter); } -static struct nf_hook_ops *arpfilter_ops __read_mostly; +static struct nf_hook_ops arpt_ops[] __read_mostly = { + { + .hook = arptable_filter_hook, + .owner = THIS_MODULE, + .pf = NFPROTO_ARP, + .hooknum = NF_ARP_IN, + .priority = NF_IP_PRI_FILTER, + }, + { + .hook = arptable_filter_hook, + .owner = THIS_MODULE, + .pf = NFPROTO_ARP, + .hooknum = NF_ARP_OUT, + .priority = NF_IP_PRI_FILTER, + }, + { + .hook = arptable_filter_hook, + .owner = THIS_MODULE, + .pf = NFPROTO_ARP, + .hooknum = NF_ARP_FORWARD, + .priority = NF_IP_PRI_FILTER, + }, +}; static int __net_init arptable_filter_net_init(struct net *net) { @@ -70,11 +91,9 @@ static int __init arptable_filter_init(void) if (ret < 0) return ret; - arpfilter_ops = xt_hook_link(&packet_filter, arptable_filter_hook); - if (IS_ERR(arpfilter_ops)) { - ret = PTR_ERR(arpfilter_ops); + ret = nf_register_hooks(arpt_ops, ARRAY_SIZE(arpt_ops)); + if (ret < 0) goto cleanup_table; - } return ret; cleanup_table: @@ -84,7 +103,7 @@ cleanup_table: static void __exit arptable_filter_fini(void) { - xt_hook_unlink(&packet_filter, arpfilter_ops); + nf_unregister_hooks(arpt_ops, ARRAY_SIZE(arpt_ops)); unregister_pernet_subsys(&arptable_filter_net_ops); } |