return -EINVAL;
        }
 
-       neigh->type = inet_addr_type(&init_net, addr);
+       neigh->type = inet_addr_type(dev->nd_net, addr);
 
        parms = in_dev->arp_parms;
        __neigh_parms_put(neigh->parms);
        switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {
        default:
        case 0:         /* By default announce any local IP */
-               if (skb && inet_addr_type(&init_net, ip_hdr(skb)->saddr) == RTN_LOCAL)
+               if (skb && inet_addr_type(dev->nd_net, ip_hdr(skb)->saddr) == RTN_LOCAL)
                        saddr = ip_hdr(skb)->saddr;
                break;
        case 1:         /* Restrict announcements of saddr in same subnet */
                if (!skb)
                        break;
                saddr = ip_hdr(skb)->saddr;
-               if (inet_addr_type(&init_net, saddr) == RTN_LOCAL) {
+               if (inet_addr_type(dev->nd_net, saddr) == RTN_LOCAL) {
                        /* saddr should be known to target */
                        if (inet_addr_onlink(in_dev, target, saddr))
                                break;
        int flag = 0;
        /*unsigned long now; */
 
-       if (ip_route_output_key(&init_net, &rt, &fl) < 0)
+       if (ip_route_output_key(dev->nd_net, &rt, &fl) < 0)
                return 1;
        if (rt->u.dst.dev != dev) {
                NET_INC_STATS_BH(LINUX_MIB_ARPFILTER);
 
        paddr = skb->rtable->rt_gateway;
 
-       if (arp_set_predefined(inet_addr_type(&init_net, paddr), haddr, paddr, dev))
+       if (arp_set_predefined(inet_addr_type(dev->nd_net, paddr), haddr, paddr, dev))
                return 0;
 
        n = __neigh_lookup(&arp_tbl, &paddr, dev, 1);
        u16 dev_type = dev->type;
        int addr_type;
        struct neighbour *n;
+       struct net *net = dev->nd_net;
 
        /* arp_rcv below verifies the ARP header and verifies the device
         * is ARP'able.
        /* Special case: IPv4 duplicate address detection packet (RFC2131) */
        if (sip == 0) {
                if (arp->ar_op == htons(ARPOP_REQUEST) &&
-                   inet_addr_type(&init_net, tip) == RTN_LOCAL &&
+                   inet_addr_type(net, tip) == RTN_LOCAL &&
                    !arp_ignore(in_dev, sip, tip))
                        arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
                                 dev->dev_addr, sha);
                        goto out;
                } else if (IN_DEV_FORWARD(in_dev)) {
                            if (addr_type == RTN_UNICAST  && rt->u.dst.dev != dev &&
-                            (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, &init_net, &tip, dev, 0))) {
+                            (arp_fwd_proxy(in_dev, rt) || pneigh_lookup(&arp_tbl, net, &tip, dev, 0))) {
                                n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
                                if (n)
                                        neigh_release(n);
                 */
                if (n == NULL &&
                    arp->ar_op == htons(ARPOP_REPLY) &&
-                   inet_addr_type(&init_net, sip) == RTN_UNICAST)
+                   inet_addr_type(net, sip) == RTN_UNICAST)
                        n = __neigh_lookup(&arp_tbl, &sip, dev, 1);
        }
 
 {
        struct arphdr *arp;
 
-       if (dev->nd_net != &init_net)
-               goto freeskb;
-
        /* ARP header, plus 2 device addresses, plus 2 IP addresses.  */
        if (!pskb_may_pull(skb, arp_hdr_len(dev)))
                goto freeskb;
 {
        struct net_device *dev = ptr;
 
-       if (dev->nd_net != &init_net)
-               return NOTIFY_DONE;
-
        switch (event) {
        case NETDEV_CHANGEADDR:
                neigh_changeaddr(&arp_tbl, dev);