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

[经验分享] 【netfilter/iptables(linux 3.10)】初始化 struct ipt_replace repl结构

[复制链接]

尚未签到

发表于 2015-12-10 00:28:16 | 显示全部楼层 |阅读模式
还是一filter表为例,在注册filter表之前需要将其初始化,初始化会用到一个repl结构,这个结构是根据filter表来初始化的。


1、repl结构
struct ipt_replace {
     /* Which table. */
     char name[XT_TABLE_MAXNAMELEN];

     /* Which hook entry points are valid: bitmask.  You can't
           change this. */
     unsigned int valid_hooks;

     /* Number of entries */
     unsigned int num_entries;

     /* Total size of new entries */
     unsigned int size;

     /* Hook entry points. */
     unsigned int hook_entry[NF_INET_NUMHOOKS];

     /* Underflow points. */
     unsigned int underflow[NF_INET_NUMHOOKS];

     /* Information about old entries: */
     /* Number of counters (must be equal to current number of entries). */
     unsigned int num_counters;
     /* The old entries' counters. */
     struct xt_counters __user *counters;

     /* The entries (hang off end: not really an array). */  可变长的数组
    struct ipt_entry entries[0];
};





2、首先简单的初始化filter表,给其中部分成员赋值
     static const struct xt_table packet_filter = {
     .name          = "filter",
     .valid_hooks     = FILTER_VALID_HOOKS,
     .me          = THIS_MODULE,
     .af          = NFPROTO_IPV4,
     .priority     = NF_IP_PRI_FILTER,
     };


3、根据packet_filter的值生成一个struct ipt_replace结构repl,这部分是用宏来实现的


     #define xt_alloc_initial_table(type, typ2) ({ \     unsigned int hook_mask = info->valid_hooks; \
     unsigned int nhooks = hweight32(hook_mask); \
     unsigned int bytes = 0, hooknum = 0, i = 0; \
     struct { \                                                                                        //该宏最后返回的是这样的一个结构,将该结构复制给repl,由于repl结构的最后一个元素是可变长的柔性数组,所以这里才可以这样赋值。
          struct type##_replace repl; \
          struct type##_standard entries[nhooks]; \
          struct type##_error term; \
     } *tbl = kzalloc(sizeof(*tbl), GFP_KERNEL); \
     if (tbl == NULL) \
          return NULL; \
     strncpy(tbl->repl.name, info->name, sizeof(tbl->repl.name)); \
     tbl->term = (struct type##_error)typ2##_ERROR_INIT;  \
     tbl->repl.valid_hooks = hook_mask; \
     tbl->repl.num_entries = nhooks + 1; \
     tbl->repl.size = nhooks * sizeof(struct type##_standard) + \
                      sizeof(struct type##_error); \
     for (; hook_mask != 0; hook_mask >>= 1, ++hooknum) { \
          if (!(hook_mask & 1)) \
               continue; \
          tbl->repl.hook_entry[hooknum] = bytes; \
          tbl->repl.underflow[hooknum]  = bytes; \
          tbl->entries[i++] = (struct type##_standard) \
               typ2##_STANDARD_INIT(NF_ACCEPT); \
          bytes += sizeof(struct type##_standard); \
     } \
     tbl; \
})



4、最后生成的repl结构如下图所示


http://onexin.iyunv.com/source/plugin/onexin_bigdata/file://C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/repl结构初始化.png

运维网声明 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-148924-1-1.html 上篇帖子: Linux下指定版本编译安装LAMP 下篇帖子: Linux 的启动流程 以及 Linux中profile、bashrc、bash_profile之间的区别和联系
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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