From 8e63819ab2b7ce91293699f0dc415c3bdec6992d Mon Sep 17 00:00:00 2001 From: Andrew Lunn Date: Sat, 2 Jan 2010 11:30:49 +0100 Subject: [PATCH] --- yaml --- r: 186584 b: refs/heads/master c: a9c2910aa15c5b2559e80d1406176f8456d3e34e h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/staging/batman-adv/soft-interface.c | 13 +++++++++++-- .../staging/batman-adv/translation-table.c | 15 +++++++++++++++ .../staging/batman-adv/translation-table.h | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index e521727cbca4..5b2f63ffbf16 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e70171957a3ac67fd62af0c66efe7b7749121899 +refs/heads/master: a9c2910aa15c5b2559e80d1406176f8456d3e34e diff --git a/trunk/drivers/staging/batman-adv/soft-interface.c b/trunk/drivers/staging/batman-adv/soft-interface.c index 8ae3483a6259..bc0217b1aeb1 100644 --- a/trunk/drivers/staging/batman-adv/soft-interface.c +++ b/trunk/drivers/staging/batman-adv/soft-interface.c @@ -145,9 +145,18 @@ struct net_device_stats *interface_stats(struct net_device *dev) 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) diff --git a/trunk/drivers/staging/batman-adv/translation-table.c b/trunk/drivers/staging/batman-adv/translation-table.c index 8c8136b71628..53a054e413d7 100644 --- a/trunk/drivers/staging/batman-adv/translation-table.c +++ b/trunk/drivers/staging/batman-adv/translation-table.c @@ -211,6 +211,21 @@ static void hna_local_del(struct hna_local_entry *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) { struct hna_local_entry *hna_local_entry; diff --git a/trunk/drivers/staging/batman-adv/translation-table.h b/trunk/drivers/staging/batman-adv/translation-table.h index f7da81129318..281125b729fb 100644 --- a/trunk/drivers/staging/batman-adv/translation-table.h +++ b/trunk/drivers/staging/batman-adv/translation-table.h @@ -23,6 +23,7 @@ int hna_local_init(void); 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_text(unsigned char *buff, int buff_len); void hna_local_purge(struct work_struct *work);