Commit a9c2910a authored by Andrew Lunn's avatar Andrew Lunn Committed by Greg Kroah-Hartman

Staging: batman-adv: Allow the MAC address to be set

Some embedded devices have very limited sources of entropy for the
random number generator. It has been observed that the random MAC
address on the interface bat0 is not always random. When testing with
a collection of identical hardware, sometimes the bat0 device the same
MAC address on multiple devices, causing mayhem. This patch allows the
MAC address to be set by the user.
Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarSimon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent e7017195
...@@ -145,9 +145,18 @@ struct net_device_stats *interface_stats(struct net_device *dev) ...@@ -145,9 +145,18 @@ struct net_device_stats *interface_stats(struct net_device *dev)
return &priv->stats; return &priv->stats;
} }
int interface_set_mac_addr(struct net_device *dev, void *addr) int interface_set_mac_addr(struct net_device *dev, void *p)
{ {
return -EBUSY; struct sockaddr *addr = p;
if (!is_valid_ether_addr(addr->sa_data))
return -EADDRNOTAVAIL;
hna_local_remove(dev->dev_addr, "mac address changed");
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
hna_local_add(dev->dev_addr);
return 0;
} }
int interface_change_mtu(struct net_device *dev, int new_mtu) int interface_change_mtu(struct net_device *dev, int new_mtu)
......
...@@ -211,6 +211,21 @@ static void hna_local_del(struct hna_local_entry *hna_local_entry, ...@@ -211,6 +211,21 @@ static void hna_local_del(struct hna_local_entry *hna_local_entry,
_hna_local_del(hna_local_entry); _hna_local_del(hna_local_entry);
} }
void hna_local_remove(uint8_t *addr, char *message)
{
struct hna_local_entry *hna_local_entry;
unsigned long flags;
spin_lock_irqsave(&hna_local_hash_lock, flags);
hna_local_entry = (struct hna_local_entry *)
hash_find(hna_local_hash, addr);
if (hna_local_entry)
hna_local_del(hna_local_entry, message);
spin_unlock_irqrestore(&hna_local_hash_lock, flags);
}
void hna_local_purge(struct work_struct *work) void hna_local_purge(struct work_struct *work)
{ {
struct hna_local_entry *hna_local_entry; struct hna_local_entry *hna_local_entry;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
int hna_local_init(void); int hna_local_init(void);
void hna_local_add(uint8_t *addr); void hna_local_add(uint8_t *addr);
void hna_local_remove(uint8_t *addr, char *message);
int hna_local_fill_buffer(unsigned char *buff, int buff_len); int hna_local_fill_buffer(unsigned char *buff, int buff_len);
int hna_local_fill_buffer_text(unsigned char *buff, int buff_len); int hna_local_fill_buffer_text(unsigned char *buff, int buff_len);
void hna_local_purge(struct work_struct *work); void hna_local_purge(struct work_struct *work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment