if (ct->helper) ip_conntrack_event_cache(IPCT_HELPER, *pskb); #ifdef CONFIG_IP_NF_NAT_NEEDED if (test_bit(IPS_SRC_NAT_DONE_BIT, &ct->status) || test_bit(IPS_DST_NAT_DONE_BIT, &ct->status)) ip_conntrack_event_cache(IPCT_NATINFO, *pskb); #endif ip_conntrack_event_cache(master_ct(ct) ? IPCT_RELATED : IPCT_NEW, *pskb);  
__ip_conntrack_confirm(struct sk_buff **pskb){	unsigned int hash, repl_hash;	struct ip_conntrack *ct;	enum ip_conntrack_info ctinfo;	ct = ip_conntrack_get(*pskb, &ctinfo);	/* ipt_REJECT uses ip_conntrack_attach to attach related	   ICMP/TCP RST packets in other direction.  Actual packet	   which created connection will be IP_CT_NEW or for an	   expected connection, IP_CT_RELATED. */	if (CTINFO2DIR(ctinfo) != IP_CT_DIR_ORIGINAL)		return NF_ACCEPT;	hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);	repl_hash = hash_conntrack(&ct->tuplehash[IP_CT_DIR_REPLY].tuple);	/* We're not in hash table, and we refuse to set up related	   connections for unconfirmed conns.  But packet copies and	   REJECT will give spurious warnings here. */	/* IP_NF_ASSERT(atomic_read(&ct->ct_general.use) == 1); */	/* No external references means noone else could have           confirmed us. */	IP_NF_ASSERT(!is_confirmed(ct));	DEBUGP("Confirming conntrack %p\n", ct);	write_lock_bh(&ip_conntrack_lock);	/* See if there's one in the list already, including reverse:           NAT could have grabbed it without realizing, since we're           not in the hash.  If there is, we lost race. */	if (!LIST_FIND(&ip_conntrack_hash[hash],		       conntrack_tuple_cmp,		       struct ip_conntrack_tuple_hash *,		       &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple, NULL)	    && !LIST_FIND(&ip_conntrack_hash[repl_hash],			  conntrack_tuple_cmp,			  struct ip_conntrack_tuple_hash *,			  &ct->tuplehash[IP_CT_DIR_REPLY].tuple, NULL)) {		/* Remove from unconfirmed list */		list_del(&ct->tuplehash[IP_CT_DIR_ORIGINAL].list);		list_prepend(&ip_conntrack_hash[hash],			     &ct->tuplehash[IP_CT_DIR_ORIGINAL]);		list_prepend(&ip_conntrack_hash[repl_hash],			     &ct->tuplehash[IP_CT_DIR_REPLY]);		/* Timer relative to confirmation time, not original		   setting time, otherwise we'd get timer wrap in		   weird delay cases. */		ct->timeout.expires += jiffies;		add_timer(&ct->timeout);		atomic_inc(&ct->ct_general.use);		set_bit(IPS_CONFIRMED_BIT, &ct->status);		CONNTRACK_STAT_INC(insert);		write_unlock_bh(&ip_conntrack_lock);		return NF_ACCEPT;	}	CONNTRACK_STAT_INC(insert_failed);	write_unlock_bh(&ip_conntrack_lock);	return NF_DROP;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/ac3247baf8ecadf168642e3898b0212c29c79715/ip_conntrack_core.c/buggy/net/ipv4/netfilter/ip_conntrack_core.c