www.pudn.com > nat.rar > ip_nat_proto.cpp


 
#include  
#include  
 
#include "list.h" 
#include "ip_nat_tuple.h" 
#include "Ip_conntrack.h" 
#include "nat.h" 
#include "ip_nat_proto.h" 
 
struct  list_head protocol_list = { &protocol_list, &protocol_list }; 
 
int ip_conntrack_protocol_register(struct ip_nat_protocol *proto) 
{ 
	int					ret = 0; 
	struct list_head	*i; 
	 
	for (i = protocol_list.next; i != &protocol_list; i = i->next)  
	{ 
		if (((struct ip_nat_protocol *)i)->proto == proto->proto)  
		{ 
			ret = -1; 
			break; 
		} 
	} 
	 
	if(i == &protocol_list) 
	{ 
		list_prepend(&protocol_list, proto); 
	} 
	 
	return ret; 
} 
 
static inline int proto_cmpfn(const struct ip_nat_protocol *curr, 
							  unsigned char  protocol) 
{ 
	return protocol == curr->proto; 
} 
 
struct ip_nat_protocol *find_proto(unsigned char protocol) 
{ 
	struct ip_nat_protocol *p; 
						 
	const struct list_head *h = (&protocol_list);		 
	do  
	{						 
		h = h->next;			 
		if (h == (&protocol_list))  
		{			 
			h = 0;			 
			break;				 
		}					 
	} while (!proto_cmpfn((const struct ip_nat_protocol *)h , protocol));	 
 
	p = (struct ip_nat_protocol *)h;					 
	if (!p) 
	{ 
		DEBUGP("Can't find proto %d\n",protocol); 
	} 
	 
	return p; 
}