···101101 /* Have we seen traffic both ways yet? (bitset) */102102 unsigned long status;103103104104- u16 cpu;105104 possible_net_t ct_net;106105107106#if IS_ENABLED(CONFIG_NF_NAT)
···525525 nf_ct_remove_expectations(ct);526526}527527528528-/* must be called with local_bh_disable */529529-static void nf_ct_add_to_unconfirmed_list(struct nf_conn *ct)530530-{531531- struct ct_pcpu *pcpu;532532-533533- /* add this conntrack to the (per cpu) unconfirmed list */534534- ct->cpu = smp_processor_id();535535- pcpu = per_cpu_ptr(nf_ct_net(ct)->ct.pcpu_lists, ct->cpu);536536-537537- spin_lock(&pcpu->lock);538538- hlist_nulls_add_head(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode,539539- &pcpu->unconfirmed);540540- spin_unlock(&pcpu->lock);541541-}542542-543543-/* must be called with local_bh_disable */544544-static void nf_ct_del_from_unconfirmed_list(struct nf_conn *ct)545545-{546546- struct ct_pcpu *pcpu;547547-548548- /* We overload first tuple to link into unconfirmed list.*/549549- pcpu = per_cpu_ptr(nf_ct_net(ct)->ct.pcpu_lists, ct->cpu);550550-551551- spin_lock(&pcpu->lock);552552- BUG_ON(hlist_nulls_unhashed(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode));553553- hlist_nulls_del_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode);554554- spin_unlock(&pcpu->lock);555555-}556556-557528#define NFCT_ALIGN(len) (((len) + NFCT_INFOMASK) & ~NFCT_INFOMASK)558529559530/* Released via nf_ct_destroy() */···596625 if (unlikely(nf_ct_protonum(ct) == IPPROTO_GRE))597626 destroy_gre_conntrack(ct);598627599599- local_bh_disable();600628 /* Expectations will have been removed in clean_from_lists,601629 * except TFTP can create an expectation on the first packet,602630 * before connection is in the list, so we need to clean here,603631 * too.604632 */605633 nf_ct_remove_expectations(ct);606606-607607- if (unlikely(!nf_ct_is_confirmed(ct)))608608- nf_ct_del_from_unconfirmed_list(ct);609609-610610- local_bh_enable();611634612635 if (ct->master)613636 nf_ct_put(ct->master);···12131248 * user context, else we insert an already 'dead' hash, blocking12141249 * further use of that particular connection -JM.12151250 */12161216- nf_ct_del_from_unconfirmed_list(ct);12171251 ct->status |= IPS_CONFIRMED;1218125212191253 if (unlikely(nf_ct_is_dying(ct))) {···17671803 if (!exp)17681804 __nf_ct_try_assign_helper(ct, tmpl, GFP_ATOMIC);1769180517701770- /* Now it is inserted into the unconfirmed list, set refcount to 1. */18061806+ /* Now it is going to be associated with an sk_buff, set refcount to 1. */17711807 refcount_set(&ct->ct_general.use, 1);17721772- nf_ct_add_to_unconfirmed_list(ct);1773180817741809 local_bh_enable();17751810···25572594 nf_conntrack_ecache_pernet_fini(net);25582595 nf_conntrack_expect_pernet_fini(net);25592596 free_percpu(net->ct.stat);25602560- free_percpu(net->ct.pcpu_lists);25612597 }25622598}25632599···27672805{27682806 struct nf_conntrack_net *cnet = nf_ct_pernet(net);27692807 int ret = -ENOMEM;27702770- int cpu;2771280827722809 BUILD_BUG_ON(IP_CT_UNTRACKED == IP_CT_NUMBER);27732810 BUILD_BUG_ON_NOT_POWER_OF_2(CONNTRACK_LOCKS);27742811 atomic_set(&cnet->count, 0);2775281227762776- net->ct.pcpu_lists = alloc_percpu(struct ct_pcpu);27772777- if (!net->ct.pcpu_lists)27782778- goto err_stat;27792779-27802780- for_each_possible_cpu(cpu) {27812781- struct ct_pcpu *pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);27822782-27832783- spin_lock_init(&pcpu->lock);27842784- INIT_HLIST_NULLS_HEAD(&pcpu->unconfirmed, UNCONFIRMED_NULLS_VAL);27852785- }27862786-27872813 net->ct.stat = alloc_percpu(struct ip_conntrack_stat);27882814 if (!net->ct.stat)27892789- goto err_pcpu_lists;28152815+ return ret;2790281627912817 ret = nf_conntrack_expect_pernet_init(net);27922818 if (ret < 0)···2790284027912841err_expect:27922842 free_percpu(net->ct.stat);27932793-err_pcpu_lists:27942794- free_percpu(net->ct.pcpu_lists);27952795-err_stat:27962843 return ret;27972844}
+1-43
net/netfilter/nf_conntrack_netlink.c
···17521752static int17531753ctnetlink_dump_unconfirmed(struct sk_buff *skb, struct netlink_callback *cb)17541754{17551755- struct ctnetlink_list_dump_ctx *ctx = (void *)cb->ctx;17561756- struct nf_conn *ct, *last;17571757- struct nf_conntrack_tuple_hash *h;17581758- struct hlist_nulls_node *n;17591759- struct net *net = sock_net(skb->sk);17601760- int res, cpu;17611761-17621762- if (ctx->done)17631763- return 0;17641764-17651765- last = ctx->last;17661766-17671767- for (cpu = ctx->cpu; cpu < nr_cpu_ids; cpu++) {17681768- struct ct_pcpu *pcpu;17691769-17701770- if (!cpu_possible(cpu))17711771- continue;17721772-17731773- pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);17741774- spin_lock_bh(&pcpu->lock);17751775-restart:17761776- hlist_nulls_for_each_entry(h, n, &pcpu->unconfirmed, hnnode) {17771777- ct = nf_ct_tuplehash_to_ctrack(h);17781778-17791779- res = ctnetlink_dump_one_entry(skb, cb, ct, false);17801780- if (res < 0) {17811781- ctx->cpu = cpu;17821782- spin_unlock_bh(&pcpu->lock);17831783- goto out;17841784- }17851785- }17861786- if (ctx->last) {17871787- ctx->last = NULL;17881788- goto restart;17891789- }17901790- spin_unlock_bh(&pcpu->lock);17911791- }17921792- ctx->done = true;17931793-out:17941794- if (last)17951795- nf_ct_put(last);17961796-17971797- return skb->len;17551755+ return 0;17981756}1799175718001758static int