|
@@ -659,6 +659,12 @@ static void set_operstate(struct net_device *dev, unsigned char transition)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static unsigned int rtnl_dev_get_flags(const struct net_device *dev)
|
|
|
+{
|
|
|
+ return (dev->flags & ~(IFF_PROMISC | IFF_ALLMULTI)) |
|
|
|
+ (dev->gflags & (IFF_PROMISC | IFF_ALLMULTI));
|
|
|
+}
|
|
|
+
|
|
|
static unsigned int rtnl_dev_combine_flags(const struct net_device *dev,
|
|
|
const struct ifinfomsg *ifm)
|
|
|
{
|
|
@@ -667,7 +673,7 @@ static unsigned int rtnl_dev_combine_flags(const struct net_device *dev,
|
|
|
/* bugwards compatibility: ifi_change == 0 is treated as ~0 */
|
|
|
if (ifm->ifi_change)
|
|
|
flags = (flags & ifm->ifi_change) |
|
|
|
- (dev->flags & ~ifm->ifi_change);
|
|
|
+ (rtnl_dev_get_flags(dev) & ~ifm->ifi_change);
|
|
|
|
|
|
return flags;
|
|
|
}
|