设为首页 收藏本站
查看: 1564|回复: 0

[经验分享] 【netfilter/iptables(linux3.10)】ipt_replace 生成ipt_table_info

[复制链接]

尚未签到

发表于 2015-12-9 16:11:41 | 显示全部楼层 |阅读模式
1、首先来看一个表的结构和已经初始化过的ipt_replace结构


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







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


struct xt_table_info {
      /* Size per table */
     unsigned int size;
     /* Number of entries: FIXME. --RR */
     unsigned int number;
     /* Initial number of entries. Needed for module usage count */
     unsigned int initial_entries;
     /* Entry points and underflows */
     unsigned int hook_entry[NF_INET_NUMHOOKS];
     unsigned int underflow[NF_INET_NUMHOOKS];
     /*
     * Number of user chains. Since tables cannot have loops, at most
     * @stacksize jumps (number of user chains) can possibly be made.
     */
     unsigned int stacksize;
     unsigned int __percpu *stackptr;
     void ***jumpstack;
     /* ipt_entry tables: one per CPU */
     /* Note : this field MUST be the last one, see XT_TABLE_INFO_SZ */
     void *entries[1];
};


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


static int
translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
                const struct ipt_replace *repl)
{
     struct ipt_entry *iter;
     unsigned int i;
     int ret = 0;

     newinfo->size = repl->size;
     newinfo->number = repl->num_entries;

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

     duprintf("translate_table: size %u\n", newinfo->size);
     i = 0;
     /* Walk through entries, checking offsets. */
     xt_entry_foreach(iter, entry0, newinfo->size) { //根据repl结构中的偏移值给newinfo结构中的偏移赋值
          ret = check_entry_size_and_hooks(iter, newinfo, entry0,
                              entry0 + repl->size,
                              repl->hook_entry,
                              repl->underflow,
                              repl->valid_hooks);
          if (ret != 0)
               return ret;
          ++i;
          if (strcmp(ipt_get_target(iter)->u.user.name,
              XT_ERROR_TARGET) == 0)
               ++newinfo->stacksize;
     }

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

     /* Check hooks all assigned */ //上一个宏遍历了所有入口,并给所有入口赋了正确的值,如果这里再出现不可用的值则说明有错误
     for (i = 0; i valid_hooks & (1 hook_entry[i]);
               return -EINVAL;
          }
          if (newinfo->underflow[i] == 0xFFFFFFFF) {
               duprintf("Invalid underflow %u %u\n",
                    i, repl->underflow[i]);
               return -EINVAL;
          }
     }

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

     /* Finally, each sanity check must pass */
     i = 0;
     xt_entry_foreach(iter, entry0, newinfo->size) {
          ret = find_check_entry(iter, net, repl->name, repl->size);
          if (ret != 0)
               break;
          ++i;
     }

     if (ret != 0) {
          xt_entry_foreach(iter, entry0, newinfo->size) {
               if (i-- == 0)
                    break;
               cleanup_entry(iter, net);
          }
          return ret;
     }

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

     return ret;
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-148896-1-1.html 上篇帖子: 《linux/unix设计思想》有感 下篇帖子: Linux-3.14.12内存管理笔记【页面迁移】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表