skb->nfcache |= NFC_IPVS_PROPERTY; 
skb->ipvs_property = 1; 
ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,	  const struct net_device *in, const struct net_device *out,	  int (*okfn)(struct sk_buff *)){	struct sk_buff  *skb = *pskb;	struct iphdr	*iph;	struct ip_vs_protocol *pp;	struct ip_vs_conn *cp;	int ihl;	EnterFunction(11);	if (skb->nfcache & NFC_IPVS_PROPERTY)		return NF_ACCEPT;	iph = skb->nh.iph;	if (unlikely(iph->protocol == IPPROTO_ICMP)) {		int related, verdict = ip_vs_out_icmp(pskb, &related);		if (related)			return verdict;		skb = *pskb;		iph = skb->nh.iph;	}	pp = ip_vs_proto_get(iph->protocol);	if (unlikely(!pp))		return NF_ACCEPT;	/* reassemble IP fragments */	if (unlikely(iph->frag_off & __constant_htons(IP_MF|IP_OFFSET) &&		     !pp->dont_defrag)) {		skb = ip_vs_gather_frags(skb, IP_DEFRAG_VS_OUT);		if (!skb)			return NF_STOLEN;		iph = skb->nh.iph;		*pskb = skb;	}	ihl = iph->ihl << 2;	/*	 * Check if the packet belongs to an existing entry	 */	cp = pp->conn_out_get(skb, pp, iph, ihl, 0);	if (unlikely(!cp)) {		if (sysctl_ip_vs_nat_icmp_send &&		    (pp->protocol == IPPROTO_TCP ||		     pp->protocol == IPPROTO_UDP)) {			__u16 _ports[2], *pptr;			pptr = skb_header_pointer(skb, ihl,						  sizeof(_ports), _ports);			if (pptr == NULL)				return NF_ACCEPT;	/* Not for me */			if (ip_vs_lookup_real_service(iph->protocol,						      iph->saddr, pptr[0])) {				/*				 * Notify the real server: there is no				 * existing entry if it is not RST				 * packet or not TCP packet.				 */				if (iph->protocol != IPPROTO_TCP				    || !is_tcp_reset(skb)) {					icmp_send(skb,ICMP_DEST_UNREACH,						  ICMP_PORT_UNREACH, 0);					return NF_DROP;				}			}		}		IP_VS_DBG_PKT(12, pp, skb, 0,			      "packet continues traversal as normal");		return NF_ACCEPT;	}	IP_VS_DBG_PKT(11, pp, skb, 0, "Outgoing packet");	if (!ip_vs_make_skb_writable(pskb, ihl))		goto drop;	/* mangle the packet */	if (pp->snat_handler && !pp->snat_handler(pskb, pp, cp))		goto drop;	skb = *pskb;	skb->nh.iph->saddr = cp->vaddr;	ip_send_check(skb->nh.iph);	IP_VS_DBG_PKT(10, pp, skb, 0, "After SNAT");	ip_vs_out_stats(cp, skb);	ip_vs_set_state(cp, IP_VS_DIR_OUTPUT, skb, pp);	ip_vs_conn_put(cp);	skb->nfcache |= NFC_IPVS_PROPERTY;	LeaveFunction(11);	return NF_ACCEPT;  drop:	ip_vs_conn_put(cp);	kfree_skb(*pskb);	return NF_STOLEN;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/6869c4d8e066e21623c812c448a05f1ed931c9c6/ip_vs_core.c/clean/net/ipv4/ipvs/ip_vs_core.c