/* 将一个新的hook 结构添加nf_hooks数组的相应的成员链表中 */
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;
/* 1.根据协议号和hook点确认链表nf_hooks[reg->pf][reg->hooknum]
* 2.根据优先级找到在链表中的位置 */
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);
return 0;
}
/* 将一个hook结构从nf_hooks数组的相应的成员链表中删除 */
void nf_unregister_hook(struct nf_hook_ops *reg)
{
mutex_lock(&nf_hook_mutex);
/* 从链表中删除 */
list_del_rcu(®->list);
mutex_unlock(&nf_hook_mutex);
synchronize_net();
}
Linux Netfilte Hook注册
最新推荐文章于 2024-01-30 20:04:15 发布