]> err.no Git - linux-2.6/blobdiff - net/ipv4/netfilter/nf_nat_core.c
Merge branch 'core/printk' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux...
[linux-2.6] / net / ipv4 / netfilter / nf_nat_core.c
index 9320c7ac5729b3e43c72e8fed574d7510b096221..d2a887fc8d9b1b53f1539bcfc8c446d248466522 100644 (file)
@@ -349,7 +349,7 @@ nf_nat_setup_info(struct nf_conn *ct,
 EXPORT_SYMBOL(nf_nat_setup_info);
 
 /* Returns true if succeeded. */
-static int
+static bool
 manip_pkt(u_int16_t proto,
          struct sk_buff *skb,
          unsigned int iphdroff,
@@ -360,7 +360,7 @@ manip_pkt(u_int16_t proto,
        const struct nf_nat_protocol *p;
 
        if (!skb_make_writable(skb, iphdroff + sizeof(*iph)))
-               return 0;
+               return false;
 
        iph = (void *)skb->data + iphdroff;
 
@@ -369,7 +369,7 @@ manip_pkt(u_int16_t proto,
        /* rcu_read_lock()ed by nf_hook_slow */
        p = __nf_nat_proto_find(proto);
        if (!p->manip_pkt(skb, iphdroff, target, maniptype))
-               return 0;
+               return false;
 
        iph = (void *)skb->data + iphdroff;
 
@@ -380,7 +380,7 @@ manip_pkt(u_int16_t proto,
                csum_replace4(&iph->check, iph->daddr, target->dst.u3.ip);
                iph->daddr = target->dst.u3.ip;
        }
-       return 1;
+       return true;
 }
 
 /* Do packet manipulations according to nf_nat_setup_info. */
@@ -556,7 +556,6 @@ static void nf_nat_cleanup_conntrack(struct nf_conn *ct)
 
        spin_lock_bh(&nf_nat_lock);
        hlist_del_rcu(&nat->bysource);
-       nat->ct = NULL;
        spin_unlock_bh(&nf_nat_lock);
 }
 
@@ -570,8 +569,8 @@ static void nf_nat_move_storage(void *new, void *old)
                return;
 
        spin_lock_bh(&nf_nat_lock);
-       hlist_replace_rcu(&old_nat->bysource, &new_nat->bysource);
        new_nat->ct = ct;
+       hlist_replace_rcu(&old_nat->bysource, &new_nat->bysource);
        spin_unlock_bh(&nf_nat_lock);
 }
 
@@ -589,6 +588,8 @@ static int __init nf_nat_init(void)
        size_t i;
        int ret;
 
+       need_ipv4_conntrack();
+
        ret = nf_ct_extend_register(&nat_extend);
        if (ret < 0) {
                printk(KERN_ERR "nf_nat_core: Unable to register extension\n");
@@ -618,6 +619,9 @@ static int __init nf_nat_init(void)
        nf_conntrack_untracked.status |= IPS_NAT_DONE_MASK;
 
        l3proto = nf_ct_l3proto_find_get((u_int16_t)AF_INET);
+
+       BUG_ON(nf_nat_seq_adjust_hook != NULL);
+       rcu_assign_pointer(nf_nat_seq_adjust_hook, nf_nat_seq_adjust);
        return 0;
 
  cleanup_extend:
@@ -644,6 +648,8 @@ static void __exit nf_nat_cleanup(void)
        nf_ct_free_hashtable(bysource, nf_nat_vmalloced, nf_nat_htable_size);
        nf_ct_l3proto_put(l3proto);
        nf_ct_extend_unregister(&nat_extend);
+       rcu_assign_pointer(nf_nat_seq_adjust_hook, NULL);
+       synchronize_net();
 }
 
 MODULE_LICENSE("GPL");