extern void nf_conntrack_free(struct nf_conn *ct);
 extern struct nf_conn *
 nf_conntrack_alloc(const struct nf_conntrack_tuple *orig,
-                  const struct nf_conntrack_tuple *repl);
+                  const struct nf_conntrack_tuple *repl,
+                  gfp_t gfp);
 
 /* It's confirmed if it is, or has been in the hash table. */
 static inline int nf_ct_is_confirmed(struct nf_conn *ct)
 
 }
 
 struct nf_conn *nf_conntrack_alloc(const struct nf_conntrack_tuple *orig,
-                                  const struct nf_conntrack_tuple *repl)
+                                  const struct nf_conntrack_tuple *repl,
+                                  gfp_t gfp)
 {
        struct nf_conn *ct = NULL;
 
                }
        }
 
-       ct = kmem_cache_zalloc(nf_conntrack_cachep, GFP_ATOMIC);
+       ct = kmem_cache_zalloc(nf_conntrack_cachep, gfp);
        if (ct == NULL) {
                pr_debug("nf_conntrack_alloc: Can't alloc conntrack.\n");
                atomic_dec(&nf_conntrack_count);
                return NULL;
        }
 
-       ct = nf_conntrack_alloc(tuple, &repl_tuple);
+       ct = nf_conntrack_alloc(tuple, &repl_tuple, GFP_ATOMIC);
        if (ct == NULL || IS_ERR(ct)) {
                pr_debug("Can't allocate conntrack.\n");
                return (struct nf_conntrack_tuple_hash *)ct;
 
        struct nf_conn_help *help;
        struct nf_conntrack_helper *helper;
 
-       ct = nf_conntrack_alloc(otuple, rtuple);
+       ct = nf_conntrack_alloc(otuple, rtuple, GFP_KERNEL);
        if (ct == NULL || IS_ERR(ct))
                return -ENOMEM;