net/netfilter/nf_sockopt.c- static struct nf_sockopt_ops *nf_sockopt_find(struct sock *sk, int pf,
- int val, int get)
- {
- struct nf_sockopt_ops *ops;
-
- if (sock_net(sk) != &init_net)
- return ERR_PTR(-ENOPROTOOPT);
-
- if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0)
- return ERR_PTR(-EINTR);
-
- list_for_each_entry(ops, &nf_sockopts, list) {
- if (ops->pf == pf) {
- if (!try_module_get(ops->owner))
- goto out_nosup;
-
- if (get) {
- if (val >= ops->get_optmin &&
- val < ops->get_optmax)
- goto out;
- } else {
- if (val >= ops->set_optmin &&
- val < ops->set_optmax)
- goto out;
- }
- module_put(ops->owner);
- }
- }
- out_nosup:
- ops = ERR_PTR(-ENOPROTOOPT);
- out:
- mutex_unlock(&nf_sockopt_mutex);
- return ops;
- }
|