WEB开发网
开发学院网络安全防火墙 iptables 源码分析 阅读

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;
  }

上一页  5 6 7 8 9 10 

Tags:iptables 源码 分析

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接