# HG changeset patch # User y-iwamatsu@ab.jp.nec.com # Date 1207201836 -32400 # Node ID e0cbf339041149119780900979653ac57a302e8a # Parent 06ffa3eb5e3ff1cf517c15b40a8cd757bc827950 netfront: Support set_mac_address() Signed-off-by: Yosuke Iwamatsu diff -r 06ffa3eb5e3f -r e0cbf3390411 drivers/xen/netfront/netfront.c --- a/drivers/xen/netfront/netfront.c Mon Mar 31 18:07:41 2008 +0100 +++ b/drivers/xen/netfront/netfront.c Thu Apr 03 14:50:36 2008 +0900 @@ -366,10 +366,14 @@ static int talk_to_backend(struct xenbus struct xenbus_transaction xbt; int err; - err = xen_net_read_mac(dev, info->mac); - if (err) { - xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename); - goto out; + /* Read mac only in the first setup. */ + if (!is_valid_ether_addr(info->mac)) { + err = xen_net_read_mac(dev, info->mac); + if (err) { + xenbus_dev_fatal(dev, err, "parsing %s/mac", + dev->nodename); + goto out; + } } /* Create shared ring, alloc event channel. */ @@ -1688,6 +1692,20 @@ static struct net_device_stats *network_ return &np->stats; } +static int xennet_set_mac_address(struct net_device *dev, void *p) +{ + struct netfront_info *np = netdev_priv(dev); + struct sockaddr *addr = p; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + memcpy(np->mac, addr->sa_data, ETH_ALEN); + + return 0; +} + static int xennet_change_mtu(struct net_device *dev, int mtu) { int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN; @@ -2075,6 +2093,7 @@ static struct net_device * __devinit cre netdev->poll = netif_poll; netdev->set_multicast_list = network_set_multicast_list; netdev->uninit = netif_uninit; + netdev->set_mac_address = xennet_set_mac_address; netdev->change_mtu = xennet_change_mtu; netdev->weight = 64; netdev->features = NETIF_F_IP_CSUM;