batman-adv: use eth_hw_addr_random() instead of random_ether_addr()
Commit Message
From: Danny Kukawka <danny.kukawka@bisect.de>
Use eth_hw_addr_random() instead of calling random_ether_addr()
to set addr_assign_type correctly to NET_ADDR_RANDOM.
Remove dev_addr in interface_setup(), it's not needed anymore.
Reset the state to NET_ADDR_PERM as soon as the MAC get
changed via .ndo_set_mac_address.
v2: use bitops, adapt to eth_hw_addr_random()
Signed-off-by: Danny Kukawka <danny.kukawka@bisect.de>
[sven@narfation.org: Backported it to linux 2.6.29]
Signed-off-by: Sven Eckelmann <sven@narfation.org>
---
Important: This patch was already applied by David S. Miller in net-next.git
and will be part of linux 3.3. So we have to apply this one in next. This patch
should also never be sent to David (he already has it).
The merge of next into master will be a little bit messy. Just delete the
definition of dev_hw_addr_random in compat.h and use eth_hw_addr_random in
soft-interface.c
compat.h | 14 ++++++++++++++
soft-interface.c | 5 ++---
2 files changed, 16 insertions(+), 3 deletions(-)
Comments
On Saturday, February 18, 2012 05:18:46 Sven Eckelmann wrote:
> From: Danny Kukawka <danny.kukawka@bisect.de>
>
> Use eth_hw_addr_random() instead of calling random_ether_addr()
> to set addr_assign_type correctly to NET_ADDR_RANDOM.
>
> Remove dev_addr in interface_setup(), it's not needed anymore.
>
> Reset the state to NET_ADDR_PERM as soon as the MAC get
> changed via .ndo_set_mac_address.
Applied in revision 2e52993.
Thanks,
Marek
@@ -104,6 +104,10 @@ static inline int __param_set_copystring(const char *val,
}
#define param_set_copystring __param_set_copystring
+/* hack for dev->addr_assign_type &= ~NET_ADDR_RANDOM; */
+#define addr_assign_type ifindex
+#define NET_ADDR_RANDOM 0
+
#endif /* < KERNEL_VERSION(2, 6, 36) */
@@ -126,4 +130,14 @@ void free_rcu_tt_local_entry(struct rcu_head *rcu);
#endif /* < KERNEL_VERSION(3, 0, 0) */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
+
+static inline void eth_hw_addr_random(struct net_device *dev)
+{
+ random_ether_addr(dev->dev_addr);
+}
+
+#endif /* < KERNEL_VERSION(3, 0, 0) */
+
#endif /* _NET_BATMAN_ADV_COMPAT_H_ */
@@ -541,6 +541,7 @@ static int interface_set_mac_addr(struct net_device *dev, void *p)
}
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+ dev->addr_assign_type &= ~NET_ADDR_RANDOM;
return 0;
}
@@ -783,7 +784,6 @@ static const struct net_device_ops bat_netdev_ops = {
static void interface_setup(struct net_device *dev)
{
struct bat_priv *priv = netdev_priv(dev);
- char dev_addr[ETH_ALEN];
ether_setup(dev);
@@ -800,8 +800,7 @@ static void interface_setup(struct net_device *dev)
dev->hard_header_len = BAT_HEADER_LEN;
/* generate random address */
- random_ether_addr(dev_addr);
- memcpy(dev->dev_addr, dev_addr, ETH_ALEN);
+ eth_hw_addr_random(dev);
SET_ETHTOOL_OPS(dev, &bat_ethtool_ops);