iptables 源码分析
2007-03-07 12:42:27 来源:WEB开发网核心提示: 可见,在函数中,iptables 源码分析(10),由iptc_first_chain和iptc_next_chain实现了遍历,iptc_first_rule和iptc_next_rule实现了链中规是的遍历,#define TC_FIRST_CHAIN iptc_first_chain
可见,在函数中,由iptc_first_chain和iptc_next_chain实现了遍历,iptc_first_rule和iptc_next_rule实现了链中规是的遍历,print_firewall函数在遍历到规则的时候,向终端输出防火墙规则,其第二个参数iptc_get_target又用于获取规则的target。
前面提到过,在内核中,handler指针指向了从内核中返回的对应的表的信息,handler对应的结构中,涉及到链的结构成员主要有两个:
struct chain_cache *cache_chain_heads;
struct chain_cache *cache_chain_iteration;
前者用于指向第一个链,后者指向当前链。而struct chain_cache的定义如下:
struct chain_cache
{
char name[TABLE_MAXNAMELEN]; /*链名*/
STRUCT_ENTRY *start; /*该链的第一条规则*/
STRUCT_ENTRY *end; /*该链的最后一条规则*/
};
理解了这两个成员,和结构struct chain_cache,再来理解链的遍历函数就不难了。所谓链的遍历,就是将handler对应成员的值取出来。
#define TC_FIRST_CHAIN iptc_first_chain
#define TC_NEXT_CHAIN iptc_next_chain
函数TC_FIRST_CHAIN用于返回第一个链:
/* Iterator functions to run through the chains. */
const char *
TC_FIRST_CHAIN(TC_HANDLE_T *handle)
{
/*链首为空,则返回NULL*/
if ((*handle)->cache_chain_heads == NULL
&& !populate_cache(*handle))
return NULL;
/*当前链的指针指向链表首部*/
(*handle)->cache_chain_iteration
= &(*handle)->cache_chain_heads[0];
/*返回链的名称*/
return (*handle)->cache_chain_iteration->name;
}
/* Iterator functions to run through the chains. Returns NULL at end. */
const char *
TC_NEXT_CHAIN(TC_HANDLE_T *handle)
{
/*很简单,用heads开始,用++就可以实现遍历了*/
(*handle)->cache_chain_iteration++;
if ((*handle)->cache_chain_iteration - (*handle)->cache_chain_heads
== (*handle)->cache_num_chains)
return NULL;
return (*handle)->cache_chain_iteration->name;
}
更多精彩
赞助商链接