Jiri Pirko
2012-Jun-28 14:10 UTC
[patch net-next 0/4] net: introduce and use IFF_LIFE_ADDR_CHANGE
three drivers updated, but this can be used in many others. Jiri Pirko (4): net: introduce new priv_flag indicating iface capable of change mac when running virtio_net: use IFF_LIFE_ADDR_CHANGE priv_flag team: use IFF_LIFE_ADDR_CHANGE priv_flag dummy: use IFF_LIFE_ADDR_CHANGE priv_flag drivers/net/dummy.c | 15 ++------------- drivers/net/team/team.c | 9 +++++---- drivers/net/virtio_net.c | 11 +++++------ include/linux/if.h | 2 ++ net/ethernet/eth.c | 2 +- 5 files changed, 15 insertions(+), 24 deletions(-) -- 1.7.10.4
Jiri Pirko
2012-Jun-28 14:10 UTC
[patch net-next 1/4] net: introduce new priv_flag indicating iface capable of change mac when running
Introduce IFF_LIFE_ADDR_CHANGE priv_flag and use it to disable netif_running() check in eth_mac_addr() Signed-off-by: Jiri Pirko <jpirko at redhat.com> --- include/linux/if.h | 2 ++ net/ethernet/eth.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/linux/if.h b/include/linux/if.h index f995c66..fd9ee7c 100644 --- a/include/linux/if.h +++ b/include/linux/if.h @@ -81,6 +81,8 @@ #define IFF_UNICAST_FLT 0x20000 /* Supports unicast filtering */ #define IFF_TEAM_PORT 0x40000 /* device used as team port */ #define IFF_SUPP_NOFCS 0x80000 /* device supports sending custom FCS */ +#define IFF_LIFE_ADDR_CHANGE 0x100000 /* device supports hardware address + * change when it's running */ #define IF_GET_IFACE 0x0001 /* for querying only */ diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c index 36e5880..8f8ded4 100644 --- a/net/ethernet/eth.c +++ b/net/ethernet/eth.c @@ -283,7 +283,7 @@ int eth_mac_addr(struct net_device *dev, void *p) { struct sockaddr *addr = p; - if (netif_running(dev)) + if (!(dev->priv_flags & IFF_LIFE_ADDR_CHANGE) && netif_running(dev)) return -EBUSY; if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; -- 1.7.10.4
Jiri Pirko
2012-Jun-28 14:10 UTC
[patch net-next 2/4] virtio_net: use IFF_LIFE_ADDR_CHANGE priv_flag
Signed-off-by: Jiri Pirko <jpirko at redhat.com> --- drivers/net/virtio_net.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 36a16d5..6a0f526 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -679,12 +679,11 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p) { struct virtnet_info *vi = netdev_priv(dev); struct virtio_device *vdev = vi->vdev; - struct sockaddr *addr = p; + int ret; - if (!is_valid_ether_addr(addr->sa_data)) - return -EADDRNOTAVAIL; - memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - dev->addr_assign_type &= ~NET_ADDR_RANDOM; + ret = eth_mac_addr(dev, p); + if (ret) + return ret; if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) vdev->config->set(vdev, offsetof(struct virtio_net_config, mac), @@ -1063,7 +1062,7 @@ static int virtnet_probe(struct virtio_device *vdev) return -ENOMEM; /* Set up network device as normal. */ - dev->priv_flags |= IFF_UNICAST_FLT; + dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIFE_ADDR_CHANGE; dev->netdev_ops = &virtnet_netdev; dev->features = NETIF_F_HIGHDMA; -- 1.7.10.4
Jiri Pirko
2012-Jun-28 14:10 UTC
[patch net-next 3/4] team: use IFF_LIFE_ADDR_CHANGE priv_flag
Signed-off-by: Jiri Pirko <jpirko at redhat.com> --- drivers/net/team/team.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 5350eea..019d658 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -1188,10 +1188,11 @@ static int team_set_mac_address(struct net_device *dev, void *p) { struct team *team = netdev_priv(dev); struct team_port *port; - struct sockaddr *addr = p; + int err; - dev->addr_assign_type &= ~NET_ADDR_RANDOM; - memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); + err = eth_mac_addr(dev, p); + if (err) + return err; rcu_read_lock(); list_for_each_entry_rcu(port, &team->port_list, list) if (team->ops.port_change_mac) @@ -1393,7 +1394,7 @@ static void team_setup(struct net_device *dev) * bring us to promisc mode in case a unicast addr is added. * Let this up to underlay drivers. */ - dev->priv_flags |= IFF_UNICAST_FLT; + dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIFE_ADDR_CHANGE; dev->features |= NETIF_F_LLTX; dev->features |= NETIF_F_GRO; -- 1.7.10.4
Jiri Pirko
2012-Jun-28 14:10 UTC
[patch net-next 4/4] dummy: use IFF_LIFE_ADDR_CHANGE priv_flag
Signed-off-by: Jiri Pirko <jpirko at redhat.com> --- drivers/net/dummy.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c index bab0158..0352246 100644 --- a/drivers/net/dummy.c +++ b/drivers/net/dummy.c @@ -40,18 +40,6 @@ static int numdummies = 1; -static int dummy_set_address(struct net_device *dev, void *p) -{ - struct sockaddr *sa = p; - - if (!is_valid_ether_addr(sa->sa_data)) - return -EADDRNOTAVAIL; - - dev->addr_assign_type &= ~NET_ADDR_RANDOM; - memcpy(dev->dev_addr, sa->sa_data, ETH_ALEN); - return 0; -} - /* fake multicast ability */ static void set_multicast_list(struct net_device *dev) { @@ -118,7 +106,7 @@ static const struct net_device_ops dummy_netdev_ops = { .ndo_start_xmit = dummy_xmit, .ndo_validate_addr = eth_validate_addr, .ndo_set_rx_mode = set_multicast_list, - .ndo_set_mac_address = dummy_set_address, + .ndo_set_mac_address = eth_mac_addr, .ndo_get_stats64 = dummy_get_stats64, }; @@ -134,6 +122,7 @@ static void dummy_setup(struct net_device *dev) dev->tx_queue_len = 0; dev->flags |= IFF_NOARP; dev->flags &= ~IFF_MULTICAST; + dev->priv_flags |= IFF_LIFE_ADDR_CHANGE; dev->features |= NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_TSO; dev->features |= NETIF_F_HW_CSUM | NETIF_F_HIGHDMA | NETIF_F_LLTX; eth_hw_addr_random(dev); -- 1.7.10.4
Richard Cochran
2012-Jun-28 15:15 UTC
[patch net-next 0/4] net: introduce and use IFF_LIFE_ADDR_CHANGE
On Thu, Jun 28, 2012 at 04:10:35PM +0200, Jiri Pirko wrote:> three drivers updated, but this can be used in many others. > > Jiri Pirko (4): > net: introduce new priv_flag indicating iface capable of change mac > when running > virtio_net: use IFF_LIFE_ADDR_CHANGE priv_flag > team: use IFF_LIFE_ADDR_CHANGE priv_flag > dummy: use IFF_LIFE_ADDR_CHANGE priv_flagI think you must mean LIVE and not LIFE... Thanks, Richard> > drivers/net/dummy.c | 15 ++------------- > drivers/net/team/team.c | 9 +++++---- > drivers/net/virtio_net.c | 11 +++++------ > include/linux/if.h | 2 ++ > net/ethernet/eth.c | 2 +- > 5 files changed, 15 insertions(+), 24 deletions(-) > > -- > 1.7.10.4 > > -- > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Jiri Pirko
2012-Jun-28 15:41 UTC
[patch net-next 0/4] net: introduce and use IFF_LIFE_ADDR_CHANGE
Thu, Jun 28, 2012 at 05:15:07PM CEST, richardcochran at gmail.com wrote:>On Thu, Jun 28, 2012 at 04:10:35PM +0200, Jiri Pirko wrote: >> three drivers updated, but this can be used in many others. >> >> Jiri Pirko (4): >> net: introduce new priv_flag indicating iface capable of change mac >> when running >> virtio_net: use IFF_LIFE_ADDR_CHANGE priv_flag >> team: use IFF_LIFE_ADDR_CHANGE priv_flag >> dummy: use IFF_LIFE_ADDR_CHANGE priv_flag > >I think you must mean LIVE and not LIFE...Good point. I will change it and repost, but I will give it some time so people can express themselves. Thanks! Jirka> >Thanks, >Richard > > >> >> drivers/net/dummy.c | 15 ++------------- >> drivers/net/team/team.c | 9 +++++---- >> drivers/net/virtio_net.c | 11 +++++------ >> include/linux/if.h | 2 ++ >> net/ethernet/eth.c | 2 +- >> 5 files changed, 15 insertions(+), 24 deletions(-) >> >> -- >> 1.7.10.4 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe netdev" in >> the body of a message to majordomo at vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html
Michael S. Tsirkin
2012-Jun-28 19:21 UTC
[patch net-next 2/4] virtio_net: use IFF_LIFE_ADDR_CHANGE priv_flag
On Thu, Jun 28, 2012 at 04:10:37PM +0200, Jiri Pirko wrote:> Signed-off-by: Jiri Pirko <jpirko at redhat.com>FWIW Acked-by: Michael S. Tsirkin <mst at redhat.com>> --- > drivers/net/virtio_net.c | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > index 36a16d5..6a0f526 100644 > --- a/drivers/net/virtio_net.c > +++ b/drivers/net/virtio_net.c > @@ -679,12 +679,11 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p) > { > struct virtnet_info *vi = netdev_priv(dev); > struct virtio_device *vdev = vi->vdev; > - struct sockaddr *addr = p; > + int ret; > > - if (!is_valid_ether_addr(addr->sa_data)) > - return -EADDRNOTAVAIL; > - memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); > - dev->addr_assign_type &= ~NET_ADDR_RANDOM; > + ret = eth_mac_addr(dev, p); > + if (ret) > + return ret; > > if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC)) > vdev->config->set(vdev, offsetof(struct virtio_net_config, mac), > @@ -1063,7 +1062,7 @@ static int virtnet_probe(struct virtio_device *vdev) > return -ENOMEM; > > /* Set up network device as normal. */ > - dev->priv_flags |= IFF_UNICAST_FLT; > + dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIFE_ADDR_CHANGE; > dev->netdev_ops = &virtnet_netdev; > dev->features = NETIF_F_HIGHDMA; > > -- > 1.7.10.4
Apparently Analagous Threads
- [patch net-next 0/4] net: introduce and use IFF_LIFE_ADDR_CHANGE
- [patch net-next v2 0/4] net: introduce and use IFF_LIFE_ADDR_CHANGE
- [patch net-next v2 0/4] net: introduce and use IFF_LIFE_ADDR_CHANGE
- [RESEND][PATCH v2 0/2] Part 2: handle addr_assign_type for random addresses
- [RESEND][PATCH v2 0/2] Part 2: handle addr_assign_type for random addresses