Merge to Fedora kernel-2.6.7-1.492
[linux-2.6.git] / net / ipv4 / devinet.c
index 37581ba..8749432 100644 (file)
@@ -728,6 +728,20 @@ int devinet_ioctl(unsigned int cmd, void __user *arg)
                        inet_del_ifa(in_dev, ifap, 0);
                        ifa->ifa_mask = sin->sin_addr.s_addr;
                        ifa->ifa_prefixlen = inet_mask_len(ifa->ifa_mask);
+
+                       /* See if current broadcast address matches
+                        * with current netmask, then recalculate
+                        * the broadcast address. Otherwise it's a
+                        * funny address, so don't touch it since
+                        * the user seems to know what (s)he's doing...
+                        */
+                       if ((dev->flags & IFF_BROADCAST) &&
+                           (ifa->ifa_prefixlen < 31) &&
+                           (ifa->ifa_broadcast ==
+                            (ifa->ifa_local|~ifa->ifa_mask))) {
+                               ifa->ifa_broadcast = (ifa->ifa_local |
+                                                     ~sin->sin_addr.s_addr);
+                       }
                        inet_insert_ifa(ifa);
                }
                break;