From 6f1cb78e44f7e11462d31a69e1c846da0e6a7dc7 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Mon, 19 Nov 2007 22:00:42 -0800 Subject: [PATCH] --- yaml --- r: 78154 b: refs/heads/master c: ad5d20a63940fcfb40af76ba06148f36d5d0b433 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/macvlan.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index ce6add95af73..4f6ad0290f9e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 59891d53f4a31402f8bd1f8c89e0e2c07d51b2cd +refs/heads/master: ad5d20a63940fcfb40af76ba06148f36d5d0b433 diff --git a/trunk/drivers/net/macvlan.c b/trunk/drivers/net/macvlan.c index 9f4d65c3095f..b7c9791009d0 100644 --- a/trunk/drivers/net/macvlan.c +++ b/trunk/drivers/net/macvlan.c @@ -213,6 +213,29 @@ static int macvlan_stop(struct net_device *dev) return 0; } +static int macvlan_set_mac_address(struct net_device *dev, void *p) +{ + struct macvlan_dev *vlan = netdev_priv(dev); + struct net_device *lowerdev = vlan->lowerdev; + struct sockaddr *addr = p; + int err; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + + if (!(dev->flags & IFF_UP)) + goto out; + + err = dev_unicast_add(lowerdev, addr->sa_data, ETH_ALEN); + if (err < 0) + return err; + dev_unicast_delete(lowerdev, dev->dev_addr, ETH_ALEN); + +out: + memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); + return 0; +} + static void macvlan_change_rx_flags(struct net_device *dev, int change) { struct macvlan_dev *vlan = netdev_priv(dev); @@ -300,6 +323,7 @@ static void macvlan_setup(struct net_device *dev) dev->stop = macvlan_stop; dev->change_mtu = macvlan_change_mtu; dev->change_rx_flags = macvlan_change_rx_flags; + dev->set_mac_address = macvlan_set_mac_address; dev->set_multicast_list = macvlan_set_multicast_list; dev->hard_start_xmit = macvlan_hard_start_xmit; dev->destructor = free_netdev;