forked from Minki/linux
netvsc: propagate MAC address change to VF slave
If VF is slaved to synthetic device, then any change to netvsc MAC address should be propagated to the slave device. If slave device doesn't support MAC address change then it should also be an error to attempt to change synthetic NIC MAC address. It also fixes the error unwind in the original code. If give a bad address, the old code would change the device MAC address anyway. Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com> Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5e20d55a23
commit
16ba326600
@ -1053,27 +1053,31 @@ static void netvsc_get_stats64(struct net_device *net,
|
||||
static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
|
||||
{
|
||||
struct net_device_context *ndc = netdev_priv(ndev);
|
||||
struct net_device *vf_netdev = rtnl_dereference(ndc->vf_netdev);
|
||||
struct netvsc_device *nvdev = rtnl_dereference(ndc->nvdev);
|
||||
struct sockaddr *addr = p;
|
||||
char save_adr[ETH_ALEN];
|
||||
unsigned char save_aatype;
|
||||
int err;
|
||||
|
||||
memcpy(save_adr, ndev->dev_addr, ETH_ALEN);
|
||||
save_aatype = ndev->addr_assign_type;
|
||||
|
||||
err = eth_mac_addr(ndev, p);
|
||||
if (err != 0)
|
||||
err = eth_prepare_mac_addr_change(ndev, p);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!nvdev)
|
||||
return -ENODEV;
|
||||
|
||||
if (vf_netdev) {
|
||||
err = dev_set_mac_address(vf_netdev, addr);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = rndis_filter_set_device_mac(nvdev, addr->sa_data);
|
||||
if (err != 0) {
|
||||
/* roll back to saved MAC */
|
||||
memcpy(ndev->dev_addr, save_adr, ETH_ALEN);
|
||||
ndev->addr_assign_type = save_aatype;
|
||||
if (!err) {
|
||||
eth_commit_mac_addr_change(ndev, p);
|
||||
} else if (vf_netdev) {
|
||||
/* rollback change on VF */
|
||||
memcpy(addr->sa_data, ndev->dev_addr, ETH_ALEN);
|
||||
dev_set_mac_address(vf_netdev, addr);
|
||||
}
|
||||
|
||||
return err;
|
||||
|
Loading…
Reference in New Issue
Block a user