- 论坛徽章:
- 6
|
回复 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就不需要做特殊处理了。
代码如下:- void xtables_register_match(struct xtables_match *me)
- {
- struct xtables_match **i, *old;
- if (strcmp(me->version, program_version) != 0) {
- fprintf(stderr, "%s: match `%s' v%s (I'm v%s).\n",
- program_name, me->name, me->version, program_version);
- exit(1);
- }
- /* Revision field stole a char from name. */
- if (strlen(me->name) >= XT_FUNCTION_MAXNAMELEN-1) {
- fprintf(stderr, "%s: target `%s' has invalid name\n",
- program_name, me->name);
- exit(1);
- }
- if (me->family >= NPROTO) {
- fprintf(stderr,
- "%s: BUG: match %s has invalid protocol family\n",
- program_name, me->name);
- exit(1);
- }
- /* ignore not interested match */
- if (me->family != afinfo.family)
- return;
- old = find_match(me->name, DURING_LOAD, NULL);
- if (old) {
- if (old->revision == me->revision) {
- fprintf(stderr,
- "%s: match `%s' already registered.\n",
- program_name, me->name);
- exit(1);
- }
- /* Now we have two (or more) options, check compatibility. */
- if (compatible_match_revision(old->name, old->revision)
- && old->revision > me->revision)
- return;
- /* Replace if compatible. */
- if (!compatible_match_revision(me->name, me->revision))
- return;
- /* Delete old one. */
- for (i = &xtables_matches; *i!=old; i = &(*i)->next);
- *i = old->next;
- }
- if (me->size != XT_ALIGN(me->size)) {
- fprintf(stderr, "%s: match `%s' has invalid size %u.\n",
- program_name, me->name, (unsigned int)me->size);
- exit(1);
- }
- /* Append to list. */
- for (i = &xtables_matches; *i; i = &(*i)->next);
- me->next = NULL;
- *i = me;
- me->m = NULL;
- me->mflags = 0;
- }
复制代码 |
|