|
@@ -16,7 +16,6 @@
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/skbuff.h>
|
|
|
#include <linux/icmp.h>
|
|
|
-#include <linux/sysctl.h>
|
|
|
#include <net/ipv6.h>
|
|
|
#include <net/inet_frag.h>
|
|
|
|
|
@@ -29,6 +28,7 @@
|
|
|
#include <net/netfilter/nf_conntrack_core.h>
|
|
|
#include <net/netfilter/nf_conntrack_zones.h>
|
|
|
#include <net/netfilter/ipv6/nf_conntrack_ipv6.h>
|
|
|
+#include <net/netfilter/ipv6/nf_defrag_ipv6.h>
|
|
|
#include <net/netfilter/nf_log.h>
|
|
|
|
|
|
static bool ipv6_pkt_to_tuple(const struct sk_buff *skb, unsigned int nhoff,
|
|
@@ -189,53 +189,6 @@ out:
|
|
|
return nf_conntrack_confirm(skb);
|
|
|
}
|
|
|
|
|
|
-static enum ip6_defrag_users nf_ct6_defrag_user(unsigned int hooknum,
|
|
|
- struct sk_buff *skb)
|
|
|
-{
|
|
|
- u16 zone = NF_CT_DEFAULT_ZONE;
|
|
|
-
|
|
|
- if (skb->nfct)
|
|
|
- zone = nf_ct_zone((struct nf_conn *)skb->nfct);
|
|
|
-
|
|
|
-#ifdef CONFIG_BRIDGE_NETFILTER
|
|
|
- if (skb->nf_bridge &&
|
|
|
- skb->nf_bridge->mask & BRNF_NF_BRIDGE_PREROUTING)
|
|
|
- return IP6_DEFRAG_CONNTRACK_BRIDGE_IN + zone;
|
|
|
-#endif
|
|
|
- if (hooknum == NF_INET_PRE_ROUTING)
|
|
|
- return IP6_DEFRAG_CONNTRACK_IN + zone;
|
|
|
- else
|
|
|
- return IP6_DEFRAG_CONNTRACK_OUT + zone;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-static unsigned int ipv6_defrag(unsigned int hooknum,
|
|
|
- struct sk_buff *skb,
|
|
|
- const struct net_device *in,
|
|
|
- const struct net_device *out,
|
|
|
- int (*okfn)(struct sk_buff *))
|
|
|
-{
|
|
|
- struct sk_buff *reasm;
|
|
|
-
|
|
|
- /* Previously seen (loopback)? */
|
|
|
- if (skb->nfct && !nf_ct_is_template((struct nf_conn *)skb->nfct))
|
|
|
- return NF_ACCEPT;
|
|
|
-
|
|
|
- reasm = nf_ct_frag6_gather(skb, nf_ct6_defrag_user(hooknum, skb));
|
|
|
- /* queued */
|
|
|
- if (reasm == NULL)
|
|
|
- return NF_STOLEN;
|
|
|
-
|
|
|
- /* error occured or not fragmented */
|
|
|
- if (reasm == skb)
|
|
|
- return NF_ACCEPT;
|
|
|
-
|
|
|
- nf_ct_frag6_output(hooknum, reasm, (struct net_device *)in,
|
|
|
- (struct net_device *)out, okfn);
|
|
|
-
|
|
|
- return NF_STOLEN;
|
|
|
-}
|
|
|
-
|
|
|
static unsigned int __ipv6_conntrack_in(struct net *net,
|
|
|
unsigned int hooknum,
|
|
|
struct sk_buff *skb,
|
|
@@ -287,13 +240,6 @@ static unsigned int ipv6_conntrack_local(unsigned int hooknum,
|
|
|
}
|
|
|
|
|
|
static struct nf_hook_ops ipv6_conntrack_ops[] __read_mostly = {
|
|
|
- {
|
|
|
- .hook = ipv6_defrag,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = NFPROTO_IPV6,
|
|
|
- .hooknum = NF_INET_PRE_ROUTING,
|
|
|
- .priority = NF_IP6_PRI_CONNTRACK_DEFRAG,
|
|
|
- },
|
|
|
{
|
|
|
.hook = ipv6_conntrack_in,
|
|
|
.owner = THIS_MODULE,
|
|
@@ -308,13 +254,6 @@ static struct nf_hook_ops ipv6_conntrack_ops[] __read_mostly = {
|
|
|
.hooknum = NF_INET_LOCAL_OUT,
|
|
|
.priority = NF_IP6_PRI_CONNTRACK,
|
|
|
},
|
|
|
- {
|
|
|
- .hook = ipv6_defrag,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = NFPROTO_IPV6,
|
|
|
- .hooknum = NF_INET_LOCAL_OUT,
|
|
|
- .priority = NF_IP6_PRI_CONNTRACK_DEFRAG,
|
|
|
- },
|
|
|
{
|
|
|
.hook = ipv6_confirm,
|
|
|
.owner = THIS_MODULE,
|
|
@@ -386,10 +325,6 @@ struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv6 __read_mostly = {
|
|
|
.nlattr_tuple_size = ipv6_nlattr_tuple_size,
|
|
|
.nlattr_to_tuple = ipv6_nlattr_to_tuple,
|
|
|
.nla_policy = ipv6_nla_policy,
|
|
|
-#endif
|
|
|
-#ifdef CONFIG_SYSCTL
|
|
|
- .ctl_table_path = nf_net_netfilter_sysctl_path,
|
|
|
- .ctl_table = nf_ct_ipv6_sysctl_table,
|
|
|
#endif
|
|
|
.me = THIS_MODULE,
|
|
|
};
|
|
@@ -403,16 +338,12 @@ static int __init nf_conntrack_l3proto_ipv6_init(void)
|
|
|
int ret = 0;
|
|
|
|
|
|
need_conntrack();
|
|
|
+ nf_defrag_ipv6_enable();
|
|
|
|
|
|
- ret = nf_ct_frag6_init();
|
|
|
- if (ret < 0) {
|
|
|
- pr_err("nf_conntrack_ipv6: can't initialize frag6.\n");
|
|
|
- return ret;
|
|
|
- }
|
|
|
ret = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_tcp6);
|
|
|
if (ret < 0) {
|
|
|
pr_err("nf_conntrack_ipv6: can't register tcp.\n");
|
|
|
- goto cleanup_frag6;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
ret = nf_conntrack_l4proto_register(&nf_conntrack_l4proto_udp6);
|
|
@@ -450,8 +381,6 @@ static int __init nf_conntrack_l3proto_ipv6_init(void)
|
|
|
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_udp6);
|
|
|
cleanup_tcp:
|
|
|
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_tcp6);
|
|
|
- cleanup_frag6:
|
|
|
- nf_ct_frag6_cleanup();
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -463,7 +392,6 @@ static void __exit nf_conntrack_l3proto_ipv6_fini(void)
|
|
|
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_icmpv6);
|
|
|
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_udp6);
|
|
|
nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_tcp6);
|
|
|
- nf_ct_frag6_cleanup();
|
|
|
}
|
|
|
|
|
|
module_init(nf_conntrack_l3proto_ipv6_init);
|