www.pudn.com > nat.rar > ip_nat_tuple.h


#ifndef _IP_CONNTRACK_TUPLE_H 
#define _IP_CONNTRACK_TUPLE_H 
 
union ip_conntrack_manip_proto 
{ 
	unsigned short all; 
 
	struct  
	{ 
		unsigned short port; 
	} tcp; 
	struct  
	{ 
		unsigned short port; 
	} udp; 
	struct  
	{ 
		unsigned short id; 
	} icmp; 
}; 
 
 
struct ip_conntrack_manip 
{ 
	unsigned long					ip; 
	union ip_conntrack_manip_proto	u; 
}; 
 
struct ip_conntrack_tuple 
{ 
	struct ip_conntrack_manip src; 
 
	struct  
	{ 
		unsigned long ip; 
		union { 
			unsigned short all; 
			struct  
			{ 
				unsigned short port; 
			} tcp; 
			struct  
			{ 
				unsigned short port; 
			} udp; 
			struct  
			{ 
				unsigned char type, code; 
			} icmp; 
		} u; 
		unsigned short proto; 
	} dst; 
}; 
 
enum ip_conntrack_dir 
{ 
	IP_CT_DIR_ORIGINAL, 
	IP_CT_DIR_REPLY, 
	IP_CT_DIR_MAX 
}; 
 
#define NIPQUAD(addr) \ 
	((unsigned char *)&addr)[0], \ 
	((unsigned char *)&addr)[1], \ 
	((unsigned char *)&addr)[2], \ 
	((unsigned char *)&addr)[3] 
 
#define HIPQUAD(addr) \ 
	((unsigned char *)&addr)[3], \ 
	((unsigned char *)&addr)[2], \ 
	((unsigned char *)&addr)[1], \ 
	((unsigned char *)&addr)[0] 
 
#if 1 
#define DEBUGP printf 
#else 
DEBUGP(format,args...)  
#endif 
 
#define DUMP_TUPLE(tp)						\ 
DEBUGP("tuple %p: %u %u.%u.%u.%u:%hu -> %u.%u.%u.%u:%hu\n",	\ 
       (tp), (tp)->dst.proto,				\ 
       NIPQUAD((tp)->src.ip), ntohs((tp)->src.u.all),		\ 
       NIPQUAD((tp)->dst.ip), ntohs((tp)->dst.u.all)) 
 
struct ip_conntrack_tuple_hash 
{ 
	struct list_head			list; 
	struct ip_conntrack_tuple	tuple; 
	struct ip_conntrack			*ctrack; 
}; 
 
static __inline int ip_ct_tuple_src_equal(const struct ip_conntrack_tuple *t1, 
				        const struct ip_conntrack_tuple *t2) 
{ 
	return t1->src.ip == t2->src.ip 
		&& t1->src.u.all == t2->src.u.all; 
} 
 
static __inline int ip_ct_tuple_dst_equal(const struct ip_conntrack_tuple *t1, 
				        const struct ip_conntrack_tuple *t2) 
{ 
	return t1->dst.ip == t2->dst.ip 
		&& t1->dst.u.all == t2->dst.u.all 
		&& t1->dst.proto == t2->dst.proto; 
} 
 
static __inline int ip_ct_tuple_equal(const struct ip_conntrack_tuple *t1, 
				    const struct ip_conntrack_tuple *t2) 
{ 
	return ip_ct_tuple_src_equal(t1, t2) && ip_ct_tuple_dst_equal(t1, t2); 
} 
 
static __inline int ip_ct_tuple_mask_cmp(const struct ip_conntrack_tuple *t, 
				       const struct ip_conntrack_tuple *tuple, 
				       const struct ip_conntrack_tuple *mask) 
{ 
	return !(((t->src.ip ^ tuple->src.ip) & mask->src.ip) 
		 || ((t->dst.ip ^ tuple->dst.ip) & mask->dst.ip) 
		 || ((t->src.u.all ^ tuple->src.u.all) & mask->src.u.all) 
		 || ((t->dst.u.all ^ tuple->dst.u.all) & mask->dst.u.all) 
		 || ((t->dst.proto ^ tuple->dst.proto) 
		     & mask->dst.proto)); 
} 
 
#endif /* _IP_CONNTRACK_TUPLE_H */