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)
 
        _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;
 
 
 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);