]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/appletalk/aarp.c
[NET]: Make device event notification network namespace safe
[linux-2.6-omap-h63xx.git] / net / appletalk / aarp.c
index d89d62f3702fd2551f97e28dbcd7f897702bf333..e9a51a69870ef1b01f983241ac2188b4a3625696 100644 (file)
@@ -118,7 +118,9 @@ static void __aarp_send_query(struct aarp_entry *a)
 
        /* Set up the buffer */
        skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
-       skb->nh.raw      = skb->h.raw = skb_put(skb, sizeof(*eah));
+       skb_reset_network_header(skb);
+       skb_reset_transport_header(skb);
+       skb_put(skb, sizeof(*eah));
        skb->protocol    = htons(ETH_P_ATALK);
        skb->dev         = dev;
        eah              = aarp_hdr(skb);
@@ -163,7 +165,9 @@ static void aarp_send_reply(struct net_device *dev, struct atalk_addr *us,
 
        /* Set up the buffer */
        skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
-       skb->nh.raw      = skb->h.raw = skb_put(skb, sizeof(*eah));
+       skb_reset_network_header(skb);
+       skb_reset_transport_header(skb);
+       skb_put(skb, sizeof(*eah));
        skb->protocol    = htons(ETH_P_ATALK);
        skb->dev         = dev;
        eah              = aarp_hdr(skb);
@@ -212,7 +216,9 @@ static void aarp_send_probe(struct net_device *dev, struct atalk_addr *us)
 
        /* Set up the buffer */
        skb_reserve(skb, dev->hard_header_len + aarp_dl->header_length);
-       skb->nh.raw      = skb->h.raw = skb_put(skb, sizeof(*eah));
+       skb_reset_network_header(skb);
+       skb_reset_transport_header(skb);
+       skb_put(skb, sizeof(*eah));
        skb->protocol    = htons(ETH_P_ATALK);
        skb->dev         = dev;
        eah              = aarp_hdr(skb);
@@ -324,15 +330,19 @@ static void aarp_expire_timeout(unsigned long unused)
 static int aarp_device_event(struct notifier_block *this, unsigned long event,
                             void *ptr)
 {
+       struct net_device *dev = ptr;
        int ct;
 
+       if (dev->nd_net != &init_net)
+               return NOTIFY_DONE;
+
        if (event == NETDEV_DOWN) {
                write_lock_bh(&aarp_lock);
 
                for (ct = 0; ct < AARP_HASH_SIZE; ct++) {
-                       __aarp_expire_device(&resolved[ct], ptr);
-                       __aarp_expire_device(&unresolved[ct], ptr);
-                       __aarp_expire_device(&proxies[ct], ptr);
+                       __aarp_expire_device(&resolved[ct], dev);
+                       __aarp_expire_device(&unresolved[ct], dev);
+                       __aarp_expire_device(&proxies[ct], dev);
                }
 
                write_unlock_bh(&aarp_lock);
@@ -539,7 +549,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
        int hash;
        struct aarp_entry *a;
 
-       skb->nh.raw = skb->data;
+       skb_reset_network_header(skb);
 
        /* Check for LocalTalk first */
        if (dev->type == ARPHRD_LOCALTLK) {
@@ -706,6 +716,9 @@ static int aarp_rcv(struct sk_buff *skb, struct net_device *dev,
        struct atalk_addr sa, *ma, da;
        struct atalk_iface *ifa;
 
+       if (dev->nd_net != &init_net)
+               goto out0;
+
        /* We only do Ethernet SNAP AARP. */
        if (dev->type != ARPHRD_ETHER)
                goto out0;
@@ -1018,7 +1031,7 @@ static int aarp_seq_show(struct seq_file *seq, void *v)
        return 0;
 }
 
-static struct seq_operations aarp_seq_ops = {
+static const struct seq_operations aarp_seq_ops = {
        .start  = aarp_seq_start,
        .next   = aarp_seq_next,
        .stop   = aarp_seq_stop,