免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1370 | 回复: 2
打印 上一主题 下一主题

请教iptable的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-06 18:19 |只看该作者 |倒序浏览
如下面的代码,在find match的时候,同时注册了两个multiport,那么在敲命令的时候到底调用的是哪一个,用什么控制
还有能告诉我为什么这么设计就更好了
  1. _init(void)
  2. {
  3.         register_match(&multiport);
  4.         register_match(&multiport_v1);
  5. }
复制代码

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2012-04-07 10:08 |只看该作者
回复 1# ellisonfan
如下面的代码,在find match的时候,同时注册了两个multiport,那么在敲命令的时候到底调用的是哪一个,用什么控制
还有能告诉我为什么这么设计就更好了


其实find_match就是根据name字段来查找的,这个没什么好说的。
对于name相同多个的match,处理是在register_match的时候通过revision来区分的。
如果当前注册的newmatch->name与之前的某个oldmatch->name相同,那么就比较revision字段。如果newmatch->revision > oldmatch->revision,那么检查内核是否支持这个newmatch->revision,如果支持,那么就会删除oldmatch,同时插入newmatch。
也就是说在matchlist中,同一个name的match,只会出现一个,这样find_match就不需要做特殊处理了。
代码如下:
  1. void xtables_register_match(struct xtables_match *me)
  2. {
  3.         struct xtables_match **i, *old;

  4.         if (strcmp(me->version, program_version) != 0) {
  5.                 fprintf(stderr, "%s: match `%s' v%s (I'm v%s).\n",
  6.                         program_name, me->name, me->version, program_version);
  7.                 exit(1);
  8.         }

  9.         /* Revision field stole a char from name. */
  10.         if (strlen(me->name) >= XT_FUNCTION_MAXNAMELEN-1) {
  11.                 fprintf(stderr, "%s: target `%s' has invalid name\n",
  12.                         program_name, me->name);
  13.                 exit(1);
  14.         }

  15.         if (me->family >= NPROTO) {
  16.                 fprintf(stderr,
  17.                         "%s: BUG: match %s has invalid protocol family\n",
  18.                         program_name, me->name);
  19.                 exit(1);
  20.         }

  21.         /* ignore not interested match */
  22.         if (me->family != afinfo.family)
  23.                 return;

  24.         old = find_match(me->name, DURING_LOAD, NULL);
  25.         if (old) {
  26.                 if (old->revision == me->revision) {
  27.                         fprintf(stderr,
  28.                                 "%s: match `%s' already registered.\n",
  29.                                 program_name, me->name);
  30.                         exit(1);
  31.                 }

  32.                 /* Now we have two (or more) options, check compatibility. */
  33.                 if (compatible_match_revision(old->name, old->revision)
  34.                     && old->revision > me->revision)
  35.                         return;

  36.                 /* Replace if compatible. */
  37.                 if (!compatible_match_revision(me->name, me->revision))
  38.                         return;

  39.                 /* Delete old one. */
  40.                 for (i = &xtables_matches; *i!=old; i = &(*i)->next);
  41.                 *i = old->next;
  42.         }

  43.         if (me->size != XT_ALIGN(me->size)) {
  44.                 fprintf(stderr, "%s: match `%s' has invalid size %u.\n",
  45.                         program_name, me->name, (unsigned int)me->size);
  46.                 exit(1);
  47.         }

  48.         /* Append to list. */
  49.         for (i = &xtables_matches; *i; i = &(*i)->next);
  50.         me->next = NULL;
  51.         *i = me;

  52.         me->m = NULL;
  53.         me->mflags = 0;
  54. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-04-09 09:05 |只看该作者
嗯,多谢版主帮忙解惑,意思是不是在内核支持的情况下,它会只注册revision值比较大的,最后实际还是只注册了一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP