net/netfilter/nf_sockopt.c

  1.  static struct nf_sockopt_ops *nf_sockopt_find(struct sock *sk, int pf,
  2.   int val, int get)
  3.  {
  4.   struct nf_sockopt_ops *ops;
  5.  
  6.   if (sock_net(sk) != &init_net)
  7.   return ERR_PTR(-ENOPROTOOPT);
  8.  
  9.   if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0)
  10.   return ERR_PTR(-EINTR);
  11.  
  12.   list_for_each_entry(ops, &nf_sockopts, list) {
  13.   if (ops->pf == pf) {
  14.   if (!try_module_get(ops->owner))
  15.   goto out_nosup;
  16.  
  17.   if (get) {
  18.   if (val >= ops->get_optmin &&
  19.   val < ops->get_optmax)
  20.   goto out;
  21.   } else {
  22.   if (val >= ops->set_optmin &&
  23.   val < ops->set_optmax)
  24.   goto out;
  25.   }
  26.   module_put(ops->owner);
  27.   }
  28.   }
  29.  out_nosup:
  30.   ops = ERR_PTR(-ENOPROTOOPT);
  31.  out:
  32.   mutex_unlock(&nf_sockopt_mutex);
  33.   return ops;
  34.  }