Currently the nat extension is always attached as soon as nat module is
loaded.  However, most NAT uses do not need the nat extension anymore.
Prepare to remove the add-nat-by-default by making those places that need
it attach it if its not present yet.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
        NF_CT_ASSERT(hooknum == NF_INET_POST_ROUTING);
 
        ct = nf_ct_get(skb, &ctinfo);
-       nat = nfct_nat(ct);
 
        NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED ||
                            ctinfo == IP_CT_RELATED_REPLY));
                return NF_DROP;
        }
 
-       nat->masq_index = out->ifindex;
+       nat = nf_ct_nat_ext_add(ct);
+       if (nat)
+               nat->masq_index = out->ifindex;
 
        /* Transfer from original range. */
        memset(&newrange.min_addr, 0, sizeof(newrange.min_addr));
 
                       const struct net_device *out)
 {
        enum ip_conntrack_info ctinfo;
+       struct nf_conn_nat *nat;
        struct in6_addr src;
        struct nf_conn *ct;
        struct nf_nat_range newrange;
                               &ipv6_hdr(skb)->daddr, 0, &src) < 0)
                return NF_DROP;
 
-       nfct_nat(ct)->masq_index = out->ifindex;
+       nat = nf_ct_nat_ext_add(ct);
+       if (nat)
+               nat->masq_index = out->ifindex;
 
        newrange.flags          = range->flags | NF_NAT_RANGE_MAP_IPS;
        newrange.min_addr.in6   = src;