|
@@ -1,3 +1,4 @@
|
|
|
+
|
|
|
/* (C) 1999-2001 Paul `Rusty' Russell
|
|
|
* (C) 2002-2004 Netfilter Core Team <coreteam@netfilter.org>
|
|
|
*
|
|
@@ -24,6 +25,7 @@
|
|
|
#include <net/netfilter/nf_conntrack_core.h>
|
|
|
#include <net/netfilter/ipv4/nf_conntrack_ipv4.h>
|
|
|
#include <net/netfilter/nf_nat_helper.h>
|
|
|
+#include <net/netfilter/ipv4/nf_defrag_ipv4.h>
|
|
|
|
|
|
int (*nf_nat_seq_adjust_hook)(struct sk_buff *skb,
|
|
|
struct nf_conn *ct,
|
|
@@ -63,23 +65,6 @@ static int ipv4_print_tuple(struct seq_file *s,
|
|
|
NIPQUAD(tuple->dst.u3.ip));
|
|
|
}
|
|
|
|
|
|
-/* Returns new sk_buff, or NULL */
|
|
|
-static int nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user)
|
|
|
-{
|
|
|
- int err;
|
|
|
-
|
|
|
- skb_orphan(skb);
|
|
|
-
|
|
|
- local_bh_disable();
|
|
|
- err = ip_defrag(skb, user);
|
|
|
- local_bh_enable();
|
|
|
-
|
|
|
- if (!err)
|
|
|
- ip_send_check(ip_hdr(skb));
|
|
|
-
|
|
|
- return err;
|
|
|
-}
|
|
|
-
|
|
|
static int ipv4_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,
|
|
|
unsigned int *dataoff, u_int8_t *protonum)
|
|
|
{
|
|
@@ -144,28 +129,6 @@ out:
|
|
|
return nf_conntrack_confirm(skb);
|
|
|
}
|
|
|
|
|
|
-static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
|
|
|
- struct sk_buff *skb,
|
|
|
- const struct net_device *in,
|
|
|
- const struct net_device *out,
|
|
|
- int (*okfn)(struct sk_buff *))
|
|
|
-{
|
|
|
- /* Previously seen (loopback)? Ignore. Do this before
|
|
|
- fragment check. */
|
|
|
- if (skb->nfct)
|
|
|
- return NF_ACCEPT;
|
|
|
-
|
|
|
- /* Gather fragments. */
|
|
|
- if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
|
|
|
- if (nf_ct_ipv4_gather_frags(skb,
|
|
|
- hooknum == NF_INET_PRE_ROUTING ?
|
|
|
- IP_DEFRAG_CONNTRACK_IN :
|
|
|
- IP_DEFRAG_CONNTRACK_OUT))
|
|
|
- return NF_STOLEN;
|
|
|
- }
|
|
|
- return NF_ACCEPT;
|
|
|
-}
|
|
|
-
|
|
|
static unsigned int ipv4_conntrack_in(unsigned int hooknum,
|
|
|
struct sk_buff *skb,
|
|
|
const struct net_device *in,
|
|
@@ -194,13 +157,6 @@ static unsigned int ipv4_conntrack_local(unsigned int hooknum,
|
|
|
/* Connection tracking may drop packets, but never alters them, so
|
|
|
make it the first hook. */
|
|
|
static struct nf_hook_ops ipv4_conntrack_ops[] __read_mostly = {
|
|
|
- {
|
|
|
- .hook = ipv4_conntrack_defrag,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = PF_INET,
|
|
|
- .hooknum = NF_INET_PRE_ROUTING,
|
|
|
- .priority = NF_IP_PRI_CONNTRACK_DEFRAG,
|
|
|
- },
|
|
|
{
|
|
|
.hook = ipv4_conntrack_in,
|
|
|
.owner = THIS_MODULE,
|
|
@@ -208,13 +164,6 @@ static struct nf_hook_ops ipv4_conntrack_ops[] __read_mostly = {
|
|
|
.hooknum = NF_INET_PRE_ROUTING,
|
|
|
.priority = NF_IP_PRI_CONNTRACK,
|
|
|
},
|
|
|
- {
|
|
|
- .hook = ipv4_conntrack_defrag,
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .pf = PF_INET,
|
|
|
- .hooknum = NF_INET_LOCAL_OUT,
|
|
|
- .priority = NF_IP_PRI_CONNTRACK_DEFRAG,
|
|
|
- },
|
|
|
{
|
|
|
.hook = ipv4_conntrack_local,
|
|
|
.owner = THIS_MODULE,
|
|
@@ -422,6 +371,7 @@ static int __init nf_conntrack_l3proto_ipv4_init(void)
|
|
|
int ret = 0;
|
|
|
|
|
|
need_conntrack();
|
|
|
+ nf_defrag_ipv4_enable();
|
|
|
|
|
|
ret = nf_register_sockopt(&so_getorigdst);
|
|
|
if (ret < 0) {
|