]> err.no Git - linux-2.6/blobdiff - net/ipv4/ip_input.c
svcrpc: fix proc/net/rpc/auth.unix.ip/content display
[linux-2.6] / net / ipv4 / ip_input.c
index eb1fa27dc0c4419ab236e06812e8fa96cecdb610..ff77a4a7f9ecae8d431020b1d05db46972720d97 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;
        }
@@ -300,7 +303,7 @@ static inline int ip_rcv_options(struct sk_buff *skb)
                                if (IN_DEV_LOG_MARTIANS(in_dev) &&
                                    net_ratelimit())
                                        printk(KERN_INFO "source route option "
-                                              "%u.%u.%u.%u -> %u.%u.%u.%u\n",
+                                              NIPQUAD_FMT " -> " NIPQUAD_FMT "\n",
                                               NIPQUAD(iph->saddr),
                                               NIPQUAD(iph->daddr));
                                in_dev_put(in_dev);
@@ -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.
         */
@@ -397,7 +397,7 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
        iph = ip_hdr(skb);
 
        /*
-        *      RFC1122: 3.1.2.2 MUST silently discard any IP frame that fails the checksum.
+        *      RFC1122: 3.2.1.2 MUST silently discard any IP frame that fails the checksum.
         *
         *      Is the datagram acceptable?
         *