作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如果我写了几个内核模块,并且在所有模块中都指定它们应该是第一个(或最后一个)被调用的 netfilter 钩子(Hook),那么它们实际被调用的顺序是什么?
netfilter_ops_out.hook = hook_func_out;
netfilter_ops_out.pf = PF_INET;
netfilter_ops_out.hooknum = NF_IP_LOCAL_OUT;
netfilter_ops_out.priority = NF_IP_PRI_FIRST;
ret = nf_register_hook(&netfilter_ops_out);
if (0 > ret) {
printk("Error registering netfilter hook: %d\n", ret);
return ret;
}
netfilter_ops_in.hook = hook_func_in;
netfilter_ops_in.pf = PF_INET;
netfilter_ops_in.hooknum = NF_IP_LOCAL_IN;
netfilter_ops_in.priority = NF_IP_PRI_LAST;
ret = nf_register_hook(&netfilter_ops_in);
if (0 > ret) {
printk("Error registering netfilter hook: %d\n", ret);
return ret;
}
在实验上,我制作了两个模块,insmod
以两种不同的顺序对它们进行编辑 - 但它们给出了相同的结果,这意味着有一些子顺序不仅仅是“先到先得”。 (它也不是按字母顺序排列的...)
最佳答案
从nf_register_hook()代码我们可以知道,如果两个hook属于同一个nf_hooks[reg->pf][reg->hooknum],则hook的执行顺序由优先级决定。如果优先级也相同,则顺序为“先到先得”。请参阅以下代码:
int nf_register_hook(struct nf_hook_ops *reg)
{
struct nf_hook_ops *elem;
int err;
err = mutex_lock_interruptible(&nf_hook_mutex);
if (err < 0)
return err;
list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) {
if (reg->priority < elem->priority)
break;
}
list_add_rcu(®->list, elem->list.prev);
mutex_unlock(&nf_hook_mutex);
#if defined(CONFIG_JUMP_LABEL)
static_key_slow_inc(&nf_hooks_needed[reg->pf][reg->hooknum]);
#endif
return 0;
}
关于linux - 如果 Netfilter Hook 都指定 NF_IP_PRI_LAST 或 NF_IP_PRI_FIRST,它们的顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14786148/
如果我写了几个内核模块,并且在所有模块中都指定它们应该是第一个(或最后一个)被调用的 netfilter 钩子(Hook),那么它们实际被调用的顺序是什么? netfilter_ops_out.hoo
我是一名优秀的程序员,十分优秀!