net/ipv4/ip_sockglue.c

  1.  int ip_setsockopt(struct sock *sk, int level,
  2.   int optname, char __user *optval, int optlen)
  3.  {
  4.   int err;
  5.  
  6.   if (level != SOL_IP)
  7.   return -ENOPROTOOPT;
  8.  
  9.   err = do_ip_setsockopt(sk, level, optname, optval, optlen);
  10.  #ifdef CONFIG_NETFILTER
  11.   /* we need to exclude all possible ENOPROTOOPTs except default case */
  12.   if (err == -ENOPROTOOPT && optname != IP_HDRINCL &&
  13.   optname != IP_IPSEC_POLICY &&
  14.   optname != IP_XFRM_POLICY &&
  15.   !ip_mroute_opt(optname)) {
  16.   lock_sock(sk);
  17.   err = nf_setsockopt(sk, PF_INET, optname, optval, optlen);
  18.   release_sock(sk);
  19.   }
  20.  #endif
  21.   return err;
  22.  }