Message ID | 1424910864-32266-1-git-send-email-tlfalcon@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
On 02/25/2015 06:34 PM, Thomas Falcon wrote: > @@ -1327,6 +1327,24 @@ static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev) > return ret; > } > > +static int ibmveth_set_mac_addr(struct net_device *dev, void *p) > +{ > + struct ibmveth_adapter *adapter = netdev_priv(dev); > + struct sockaddr *addr = p; > + u64 mac_address; > + int rc; > + > + if (!is_valid_ether_addr(addr->sa_data)) > + return -EADDRNOTAVAIL; > + > + ether_addr_copy(dev->dev_addr, addr->sa_data); > + > + mac_address = ibmveth_encode_mac_addr(dev->dev_addr); > + rc = h_change_logical_lan_mac(adapter->vdev->unit_address, mac_address); > + > + return rc; Do you still want to be changing dev->dev_addr if h_change_logical_lan_mac returns a failure? -Brian
Thu, Feb 26, 2015 at 02:08:06PM CET, brking@linux.vnet.ibm.com wrote: >On 02/25/2015 06:34 PM, Thomas Falcon wrote: >> @@ -1327,6 +1327,24 @@ static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev) >> return ret; >> } >> >> +static int ibmveth_set_mac_addr(struct net_device *dev, void *p) >> +{ >> + struct ibmveth_adapter *adapter = netdev_priv(dev); >> + struct sockaddr *addr = p; >> + u64 mac_address; >> + int rc; >> + >> + if (!is_valid_ether_addr(addr->sa_data)) >> + return -EADDRNOTAVAIL; >> + >> + ether_addr_copy(dev->dev_addr, addr->sa_data); >> + >> + mac_address = ibmveth_encode_mac_addr(dev->dev_addr); >> + rc = h_change_logical_lan_mac(adapter->vdev->unit_address, mac_address); >> + >> + return rc; > >Do you still want to be changing dev->dev_addr if h_change_logical_lan_mac >returns a failure? That should not be done. dev_addr should be in sync with real hw addr.
From: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> Date: Wed, 25 Feb 2015 18:34:24 -0600 > Add a function that will enable changing the MAC address > of an ibmveth interface while it is still running. > > Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> > --- > drivers/net/ethernet/ibm/ibmveth.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c > index 21978cc..6e44357 100644 > --- a/drivers/net/ethernet/ibm/ibmveth.c > +++ b/drivers/net/ethernet/ibm/ibmveth.c > @@ -1327,6 +1327,24 @@ static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev) > return ret; > } > > +static int ibmveth_set_mac_addr(struct net_device *dev, void *p) > +{ > + struct ibmveth_adapter *adapter = netdev_priv(dev); > + struct sockaddr *addr = p; > + u64 mac_address; > + int rc; > + > + if (!is_valid_ether_addr(addr->sa_data)) > + return -EADDRNOTAVAIL; > + > + ether_addr_copy(dev->dev_addr, addr->sa_data); > + > + mac_address = ibmveth_encode_mac_addr(dev->dev_addr); > + rc = h_change_logical_lan_mac(adapter->vdev->unit_address, mac_address); As others have said, if this hypervisor call fails you must not change dev->dev_addr. It must always be in sync with "the hardware."
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c index 21978cc..6e44357 100644 --- a/drivers/net/ethernet/ibm/ibmveth.c +++ b/drivers/net/ethernet/ibm/ibmveth.c @@ -1327,6 +1327,24 @@ static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev) return ret; } +static int ibmveth_set_mac_addr(struct net_device *dev, void *p) +{ + struct ibmveth_adapter *adapter = netdev_priv(dev); + struct sockaddr *addr = p; + u64 mac_address; + int rc; + + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + + ether_addr_copy(dev->dev_addr, addr->sa_data); + + mac_address = ibmveth_encode_mac_addr(dev->dev_addr); + rc = h_change_logical_lan_mac(adapter->vdev->unit_address, mac_address); + + return rc; +} + static const struct net_device_ops ibmveth_netdev_ops = { .ndo_open = ibmveth_open, .ndo_stop = ibmveth_close, @@ -1337,7 +1355,7 @@ static const struct net_device_ops ibmveth_netdev_ops = { .ndo_fix_features = ibmveth_fix_features, .ndo_set_features = ibmveth_set_features, .ndo_validate_addr = eth_validate_addr, - .ndo_set_mac_address = eth_mac_addr, + .ndo_set_mac_address = ibmveth_set_mac_addr, #ifdef CONFIG_NET_POLL_CONTROLLER .ndo_poll_controller = ibmveth_poll_controller, #endif
Add a function that will enable changing the MAC address of an ibmveth interface while it is still running. Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com> --- drivers/net/ethernet/ibm/ibmveth.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)