(*pskb)->nfcache |= e->nfcache; 
ipt_do_table(struct sk_buff **pskb,	     unsigned int hook,	     const struct net_device *in,	     const struct net_device *out,	     struct ipt_table *table,	     void *userdata){	static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long))));	u_int16_t offset;	struct iphdr *ip;	u_int16_t datalen;	int hotdrop = 0;	/* Initializing verdict to NF_DROP keeps gcc happy. */	unsigned int verdict = NF_DROP;	const char *indev, *outdev;	void *table_base;	struct ipt_entry *e, *back;	/* Initialization */	ip = (*pskb)->nh.iph;	datalen = (*pskb)->len - ip->ihl * 4;	indev = in ? in->name : nulldevname;	outdev = out ? out->name : nulldevname;	/* We handle fragments by dealing with the first fragment as	 * if it was a normal packet.  All other fragments are treated	 * normally, except that they will NEVER match rules that ask	 * things we don't know, ie. tcp syn flag or ports).  If the	 * rule is also a fragment-specific rule, non-fragments won't	 * match it. */	offset = ntohs(ip->frag_off) & IP_OFFSET;	read_lock_bh(&table->lock);	IP_NF_ASSERT(table->valid_hooks & (1 << hook));	table_base = (void *)table->private->entries		+ TABLE_OFFSET(table->private, smp_processor_id());	e = get_entry(table_base, table->private->hook_entry[hook]);#ifdef CONFIG_NETFILTER_DEBUG	/* Check noone else using our table */	if (((struct ipt_entry *)table_base)->comefrom != 0xdead57ac	    && ((struct ipt_entry *)table_base)->comefrom != 0xeeeeeeec) {		printk("ASSERT: CPU #%u, %s comefrom(%p) = %X\n",		       smp_processor_id(),		       table->name,		       &((struct ipt_entry *)table_base)->comefrom,		       ((struct ipt_entry *)table_base)->comefrom);	}	((struct ipt_entry *)table_base)->comefrom = 0x57acc001;#endif	/* For return from builtin chain */	back = get_entry(table_base, table->private->underflow[hook]);	do {		IP_NF_ASSERT(e);		IP_NF_ASSERT(back);		(*pskb)->nfcache |= e->nfcache;		if (ip_packet_match(ip, indev, outdev, &e->ip, offset)) {			struct ipt_entry_target *t;			if (IPT_MATCH_ITERATE(e, do_match,					      *pskb, in, out,					      offset, &hotdrop) != 0)				goto no_match;			ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1);			t = ipt_get_target(e);			IP_NF_ASSERT(t->u.kernel.target);			/* Standard target? */			if (!t->u.kernel.target->target) {				int v;				v = ((struct ipt_standard_target *)t)->verdict;				if (v < 0) {					/* Pop from stack? */					if (v != IPT_RETURN) {						verdict = (unsigned)(-v) - 1;						break;					}					e = back;					back = get_entry(table_base,							 back->comefrom);					continue;				}				if (table_base + v				    != (void *)e + e->next_offset) {					/* Save old back ptr in next entry */					struct ipt_entry *next						= (void *)e + e->next_offset;					next->comefrom						= (void *)back - table_base;					/* set back pointer to next entry */					back = next;				}				e = get_entry(table_base, v);			} else {				/* Targets which reenter must return                                   abs. verdicts */#ifdef CONFIG_NETFILTER_DEBUG				((struct ipt_entry *)table_base)->comefrom					= 0xeeeeeeec;#endif				verdict = t->u.kernel.target->target(pskb,								     in, out,								     hook,								     t->data,								     userdata);#ifdef CONFIG_NETFILTER_DEBUG				if (((struct ipt_entry *)table_base)->comefrom				    != 0xeeeeeeec				    && verdict == IPT_CONTINUE) {					printk("Target %s reentered!\n",					       t->u.kernel.target->name);					verdict = NF_DROP;				}				((struct ipt_entry *)table_base)->comefrom					= 0x57acc001;#endif				/* Target might have changed stuff. */				ip = (*pskb)->nh.iph;				datalen = (*pskb)->len - ip->ihl * 4;				if (verdict == IPT_CONTINUE)					e = (void *)e + e->next_offset;				else					/* Verdict */					break;			}		} else {		no_match:			e = (void *)e + e->next_offset;		}	} while (!hotdrop);#ifdef CONFIG_NETFILTER_DEBUG	((struct ipt_entry *)table_base)->comefrom = 0xdead57ac;#endif	read_unlock_bh(&table->lock);#ifdef DEBUG_ALLOW_ALL	return NF_ACCEPT;#else	if (hotdrop)		return NF_DROP;	else return verdict;#endif}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/6869c4d8e066e21623c812c448a05f1ed931c9c6/ip_tables.c/clean/net/ipv4/netfilter/ip_tables.c