Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125792
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-01 15:34
个人简介

不晓得说啥子

文章分类

全部博文(42)

文章存档

2015年(41)

2014年(1)

我的朋友

分类: LINUX

2015-04-07 09:34:02

1、首先来看一个表的结构和已经初始化过的ipt_replace结构

                               
                                          
                            图1 xt_table中的private结构                                                                                                  图2  在一中已经生成了的一个repl结够      



     在一中提到过,packet_filter结构初始化时只是初始化了一部分信息,还有一个很重要的成员并没有初始化,那就是在xt_table中的ipt_table_info结构的private变量,该结构存放表的具体的规则信息

    

点击(此处)折叠或打开

  1. struct xt_table_info {
  2.      /* Size per table */
  3.      unsigned int size;
  4.      /* Number of entries: FIXME. --RR */
  5.      unsigned int number;
  6.      /* Initial number of entries. Needed for module usage count */
  7.      unsigned int initial_entries;
  8.      /* Entry points and underflows */
  9.      unsigned int hook_entry[NF_INET_NUMHOOKS];
  10.      unsigned int underflow[NF_INET_NUMHOOKS];
  11.      /*
  12.      * Number of user chains. Since tables cannot have loops, at most
  13.      * @stacksize jumps (number of user chains) can possibly be made.
  14.      */
  15.      unsigned int stacksize;
  16.      unsigned int __percpu *stackptr;
  17.      void ***jumpstack;
  18.      /* ipt_entry tables: one per CPU */
  19.      /* Note : this field MUST be the last one, see XT_TABLE_INFO_SZ */
  20.      void *entries[1];
  21. };

2、注册表的第二步就是需要从第一步中生成的repl结构得到一个ipt_table_info(newinfo)结构,该结构最终将会复制给packet_filter结构总得private结构,具体的函数是(translate_table(net, newinfo, loc_cpu_entry, repl))


点击(此处)折叠或打开

  1. static int
  2. translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
  3.                 const struct ipt_replace *repl)
  4. {
  5.      struct ipt_entry *iter;
  6.      unsigned int i;
  7.      int ret = 0;

  8.      newinfo->size = repl->size;
  9.      newinfo->number = repl->num_entries;

  10.      /* Init all hooks to impossible value. */ //将newinfo结构中的入口偏移地址设置为不可能的值
  11.      for (i = 0; i < NF_INET_NUMHOOKS; i++) {
  12.           newinfo->hook_entry[i] = 0xFFFFFFFF;
  13.           newinfo->underflow[i] = 0xFFFFFFFF;
  14.      }

  15.      duprintf("translate_table: size %u\n", newinfo->size);
  16.      i = 0;
  17.      /* Walk through entries, checking offsets. */
  18.      xt_entry_foreach(iter, entry0, newinfo->size) { //根据repl结构中的偏移值给newinfo结构中的偏移赋值
  19.           ret = check_entry_size_and_hooks(iter, newinfo, entry0,
  20.                               entry0 + repl->size,
  21.                               repl->hook_entry,
  22.                               repl->underflow,
  23.                               repl->valid_hooks);
  24.           if (ret != 0)
  25.                return ret;
  26.           ++i;
  27.           if (strcmp(ipt_get_target(iter)->u.user.name,
  28.               XT_ERROR_TARGET) == 0)
  29.                ++newinfo->stacksize;
  30.      }

  31.      if (i != repl->num_entries) {
  32.           duprintf("translate_table: %u not %u entries\n",
  33.                i, repl->num_entries);
  34.           return -EINVAL;
  35.      }

  36.      /* Check hooks all assigned */ //上一个宏遍历了所有入口,并给所有入口赋了正确的值,如果这里再出现不可用的值则说明有错误
  37.      for (i = 0; i < NF_INET_NUMHOOKS; i++) {
  38.           /* Only hooks which are valid */
  39.           if (!(repl->valid_hooks & (1 << i)))
  40.                continue;
  41.           if (newinfo->hook_entry[i] == 0xFFFFFFFF) {
  42.                duprintf("Invalid hook entry %u %u\n",
  43.                     i, repl->hook_entry[i]);
  44.                return -EINVAL;
  45.           }
  46.           if (newinfo->underflow[i] == 0xFFFFFFFF) {
  47.                duprintf("Invalid underflow %u %u\n",
  48.                     i, repl->underflow[i]);
  49.                return -EINVAL;
  50.           }
  51.      }

  52.      if (!mark_source_chains(newinfo, repl->valid_hooks, entry0)) //检查是否形成了规则环,如果有环则出错返回
  53.           return -ELOOP;

  54.      /* Finally, each sanity check must pass */
  55.      i = 0;
  56.      xt_entry_foreach(iter, entry0, newinfo->size) {
  57.           ret = find_check_entry(iter, net, repl->name, repl->size);
  58.           if (ret != 0)
  59.                break;
  60.           ++i;
  61.      }

  62.      if (ret != 0) {
  63.           xt_entry_foreach(iter, entry0, newinfo->size) {
  64.                if (i-- == 0)
  65.                     break;
  66.                cleanup_entry(iter, net);
  67.           }
  68.           return ret;
  69.      }

  70.      /* And one copy for every other CPU */
  71.      for_each_possible_cpu(i) {
  72.           if (newinfo->entries[i] && newinfo->entries[i] != entry0)
  73.                memcpy(newinfo->entries[i], entry0, newinfo->size);
  74.      }

  75.      return ret;
  76. }


阅读(1768) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

wangwq_1989_06_202016-06-22 19:03:36

感觉最右边的图 ipt_standard[下标],这个下标的值,我感觉和hook点没有关系呢(LOCAL_IN FORWARD LOCAL_OUT),就是一段连续的存储空间。不然的话和你的这幅图 不能统一起来http://blog.chinaunix.net/attachment/201504/3/29732842_14280323418x7T.jpg

wangwq_1989_06_202016-06-22 19:03:23

感觉最右边的图 ipt_standard[下标],这个下标的值,我感觉和hook点没有关系呢(LOCAL_IN FORWARD LOCAL_OUT),就是一段连续的存储空间。不然的话和你的这幅图 不能统一起来http://blog.chinaunix.net/attachment/201504/3/29732842_14280323418x7T.jpg