[NET] NETNS: Omit sock->sk_net without CONFIG_NET_NS.
[linux-3.10.git] / net / ipv4 / ip_input.c
index eb1fa27..4be0095 100644 (file)
@@ -172,7 +172,7 @@ int ip_call_ra_chain(struct sk_buff *skb)
                if (sk && inet_sk(sk)->num == protocol &&
                    (!sk->sk_bound_dev_if ||
                     sk->sk_bound_dev_if == dev->ifindex) &&
-                   sk->sk_net == dev->nd_net) {
+                   sock_net(sk) == dev_net(dev)) {
                        if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
                                if (ip_defrag(skb, IP_DEFRAG_CALL_RA_CHAIN)) {
                                        read_unlock(&ip_ra_lock);
@@ -199,6 +199,8 @@ int ip_call_ra_chain(struct sk_buff *skb)
 
 static int ip_local_deliver_finish(struct sk_buff *skb)
 {
+       struct net *net = dev_net(skb->dev);
+
        __skb_pull(skb, ip_hdrlen(skb));
 
        /* Point into the IP datagram, just past the header. */
@@ -214,7 +216,8 @@ static int ip_local_deliver_finish(struct sk_buff *skb)
                raw = raw_local_deliver(skb, protocol);
 
                hash = protocol & (MAX_INET_PROTOS - 1);
-               if ((ipprot = rcu_dereference(inet_protos[hash])) != NULL) {
+               ipprot = rcu_dereference(inet_protos[hash]);
+               if (ipprot != NULL && (net == &init_net || ipprot->netns_ok)) {
                        int ret;
 
                        if (!ipprot->no_policy) {
@@ -288,7 +291,7 @@ static inline int ip_rcv_options(struct sk_buff *skb)
        opt = &(IPCB(skb)->opt);
        opt->optlen = iph->ihl*4 - sizeof(struct iphdr);
 
-       if (ip_options_compile(dev->nd_net, opt, skb)) {
+       if (ip_options_compile(dev_net(dev), opt, skb)) {
                IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
                goto drop;
        }
@@ -375,9 +378,6 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
        struct iphdr *iph;
        u32 len;
 
-       if (dev->nd_net != &init_net)
-               goto drop;
-
        /* When the interface is in promisc. mode, drop all the crap
         * that it receives, do not try to analyse it.
         */