mirror of
https://github.com/torvalds/linux
synced 2024-11-05 18:23:50 +00:00
netfilter: Factor out the hook list selection from nf_register_hook
- Add a new function find_nf_hook_list to select the nf_hook_list - Fail nf_register_hook when asked for a per netdevice hook list when support for per netdevice hook lists is not built into the kernel. - Move the hook list head selection outside of nf_hook_mutex as nothing in the selection requires the hook list, and error handling is simpler if a mutex is not held. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
4c0911566d
commit
0edcf282b0
1 changed files with 19 additions and 15 deletions
|
@ -62,27 +62,31 @@ EXPORT_SYMBOL(nf_hooks_needed);
|
|||
|
||||
static DEFINE_MUTEX(nf_hook_mutex);
|
||||
|
||||
static struct list_head *find_nf_hook_list(const struct nf_hook_ops *reg)
|
||||
{
|
||||
struct list_head *nf_hook_list = NULL;
|
||||
|
||||
if (reg->pf != NFPROTO_NETDEV)
|
||||
nf_hook_list = &nf_hooks[reg->pf][reg->hooknum];
|
||||
else if (reg->hooknum == NF_NETDEV_INGRESS) {
|
||||
#ifdef CONFIG_NETFILTER_INGRESS
|
||||
if (reg->dev)
|
||||
nf_hook_list = ®->dev->nf_hooks_ingress;
|
||||
#endif
|
||||
}
|
||||
return nf_hook_list;
|
||||
}
|
||||
|
||||
int nf_register_hook(struct nf_hook_ops *reg)
|
||||
{
|
||||
struct list_head *nf_hook_list;
|
||||
struct nf_hook_ops *elem;
|
||||
|
||||
mutex_lock(&nf_hook_mutex);
|
||||
switch (reg->pf) {
|
||||
case NFPROTO_NETDEV:
|
||||
#ifdef CONFIG_NETFILTER_INGRESS
|
||||
if (reg->hooknum == NF_NETDEV_INGRESS) {
|
||||
BUG_ON(reg->dev == NULL);
|
||||
nf_hook_list = ®->dev->nf_hooks_ingress;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
/* Fall through. */
|
||||
default:
|
||||
nf_hook_list = &nf_hooks[reg->pf][reg->hooknum];
|
||||
break;
|
||||
}
|
||||
nf_hook_list = find_nf_hook_list(reg);
|
||||
if (!nf_hook_list)
|
||||
return -ENOENT;
|
||||
|
||||
mutex_lock(&nf_hook_mutex);
|
||||
list_for_each_entry(elem, nf_hook_list, list) {
|
||||
if (reg->priority < elem->priority)
|
||||
break;
|
||||
|
|
Loading…
Reference in a new issue