linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] usb: gadget: u_ether: fix race in setting MAC address in setup phase
@ 2021-11-29 22:12 Marian Postevca
  2021-12-03 12:50 ` Greg Kroah-Hartman
  0 siblings, 1 reply; 4+ messages in thread
From: Marian Postevca @ 2021-11-29 22:12 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Felipe Balbi; +Cc: linux-usb, linux-kernel, Marian Postevca

When listening for notifications through netlink of a new interface being
registered, sporadically, it is possible for the MAC to be read as zero.
The zero MAC address lasts a short period of time and then switches to a
valid random MAC address.

This causes problems for netd in Android, which assumes that the interface
is malfunctioning and will not use it.

In the good case we get this log:
InterfaceController::getCfg() ifName usb0
 hwAddr 92:a8:f0:73:79:5b ipv4Addr 0.0.0.0 flags 0x1002

In the error case we get these logs:
InterfaceController::getCfg() ifName usb0
 hwAddr 00:00:00:00:00:00 ipv4Addr 0.0.0.0 flags 0x1002

netd : interfaceGetCfg("usb0")
netd : interfaceSetCfg() -> ServiceSpecificException
 (99, "[Cannot assign requested address] : ioctl() failed")

The reason for the issue is the order in which the interface is setup,
it is first registered through register_netdev() and after the MAC
address is set.

Fixed by first setting the MAC address of the net_device and after that
calling register_netdev().

Signed-off-by: Marian Postevca <posteuca@mutex.one>
---
 drivers/usb/gadget/function/u_ether.c | 16 ++++++----------
 1 file changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index e0ad5aed6ac9..6f5d45ef2e39 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -17,6 +17,7 @@
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/if_vlan.h>
+#include <linux/etherdevice.h>
 
 #include "u_ether.h"
 
@@ -863,19 +864,23 @@ int gether_register_netdev(struct net_device *net)
 {
 	struct eth_dev *dev;
 	struct usb_gadget *g;
-	struct sockaddr sa;
 	int status;
 
 	if (!net->dev.parent)
 		return -EINVAL;
 	dev = netdev_priv(net);
 	g = dev->gadget;
+
+	net->addr_assign_type = NET_ADDR_RANDOM;
+	eth_hw_addr_set(net, dev->dev_mac);
+
 	status = register_netdev(net);
 	if (status < 0) {
 		dev_dbg(&g->dev, "register_netdev failed, %d\n", status);
 		return status;
 	} else {
 		INFO(dev, "HOST MAC %pM\n", dev->host_mac);
+		INFO(dev, "MAC %pM\n", dev->dev_mac);
 
 		/* two kinds of host-initiated state changes:
 		 *  - iff DATA transfer is active, carrier is "on"
@@ -883,15 +888,6 @@ int gether_register_netdev(struct net_device *net)
 		 */
 		netif_carrier_off(net);
 	}
-	sa.sa_family = net->type;
-	memcpy(sa.sa_data, dev->dev_mac, ETH_ALEN);
-	rtnl_lock();
-	status = dev_set_mac_address(net, &sa, NULL);
-	rtnl_unlock();
-	if (status)
-		pr_warn("cannot set self ethernet address: %d\n", status);
-	else
-		INFO(dev, "MAC %pM\n", dev->dev_mac);
 
 	return status;
 }
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] usb: gadget: u_ether: fix race in setting MAC address in setup phase
  2021-11-29 22:12 [PATCH] usb: gadget: u_ether: fix race in setting MAC address in setup phase Marian Postevca
@ 2021-12-03 12:50 ` Greg Kroah-Hartman
  2021-12-04 18:42   ` Marian Postevca
  0 siblings, 1 reply; 4+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-03 12:50 UTC (permalink / raw)
  To: Marian Postevca; +Cc: Felipe Balbi, linux-usb, linux-kernel

On Tue, Nov 30, 2021 at 12:12:29AM +0200, Marian Postevca wrote:
> When listening for notifications through netlink of a new interface being
> registered, sporadically, it is possible for the MAC to be read as zero.
> The zero MAC address lasts a short period of time and then switches to a
> valid random MAC address.
> 
> This causes problems for netd in Android, which assumes that the interface
> is malfunctioning and will not use it.
> 
> In the good case we get this log:
> InterfaceController::getCfg() ifName usb0
>  hwAddr 92:a8:f0:73:79:5b ipv4Addr 0.0.0.0 flags 0x1002
> 
> In the error case we get these logs:
> InterfaceController::getCfg() ifName usb0
>  hwAddr 00:00:00:00:00:00 ipv4Addr 0.0.0.0 flags 0x1002
> 
> netd : interfaceGetCfg("usb0")
> netd : interfaceSetCfg() -> ServiceSpecificException
>  (99, "[Cannot assign requested address] : ioctl() failed")
> 
> The reason for the issue is the order in which the interface is setup,
> it is first registered through register_netdev() and after the MAC
> address is set.
> 
> Fixed by first setting the MAC address of the net_device and after that
> calling register_netdev().
> 
> Signed-off-by: Marian Postevca <posteuca@mutex.one>
> ---
>  drivers/usb/gadget/function/u_ether.c | 16 ++++++----------
>  1 file changed, 6 insertions(+), 10 deletions(-)

What commit does this fix?  Should it go to stable kernel releases?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] usb: gadget: u_ether: fix race in setting MAC address in setup phase
  2021-12-03 12:50 ` Greg Kroah-Hartman
@ 2021-12-04 18:42   ` Marian Postevca
  2021-12-04 18:47     ` Greg Kroah-Hartman
  0 siblings, 1 reply; 4+ messages in thread
From: Marian Postevca @ 2021-12-04 18:42 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Felipe Balbi, linux-usb, linux-kernel

Greg Kroah-Hartman <gregkh@linuxfoundation.org> writes:

> On Tue, Nov 30, 2021 at 12:12:29AM +0200, Marian Postevca wrote:
>> When listening for notifications through netlink of a new interface being
>> registered, sporadically, it is possible for the MAC to be read as zero.
>> The zero MAC address lasts a short period of time and then switches to a
>> valid random MAC address.
>> 
>> This causes problems for netd in Android, which assumes that the interface
>> is malfunctioning and will not use it.
>> 
>> In the good case we get this log:
>> InterfaceController::getCfg() ifName usb0
>>  hwAddr 92:a8:f0:73:79:5b ipv4Addr 0.0.0.0 flags 0x1002
>> 
>> In the error case we get these logs:
>> InterfaceController::getCfg() ifName usb0
>>  hwAddr 00:00:00:00:00:00 ipv4Addr 0.0.0.0 flags 0x1002
>> 
>> netd : interfaceGetCfg("usb0")
>> netd : interfaceSetCfg() -> ServiceSpecificException
>>  (99, "[Cannot assign requested address] : ioctl() failed")
>> 
>> The reason for the issue is the order in which the interface is setup,
>> it is first registered through register_netdev() and after the MAC
>> address is set.
>> 
>> Fixed by first setting the MAC address of the net_device and after that
>> calling register_netdev().
>> 
>> Signed-off-by: Marian Postevca <posteuca@mutex.one>
>> ---
>>  drivers/usb/gadget/function/u_ether.c | 16 ++++++----------
>>  1 file changed, 6 insertions(+), 10 deletions(-)
>
> What commit does this fix?  Should it go to stable kernel releases?
>
> thanks,
>
> greg k-h

This fixes bcd4a1c40bee885e ("usb: gadget: u_ether: construct with
default values and add setters/getters").

I think it should go to stable kernel releases.

Should I send a second version of the patch with a Fixes tag?

Thanks

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] usb: gadget: u_ether: fix race in setting MAC address in setup phase
  2021-12-04 18:42   ` Marian Postevca
@ 2021-12-04 18:47     ` Greg Kroah-Hartman
  0 siblings, 0 replies; 4+ messages in thread
From: Greg Kroah-Hartman @ 2021-12-04 18:47 UTC (permalink / raw)
  To: Marian Postevca; +Cc: Felipe Balbi, linux-usb, linux-kernel

On Sat, Dec 04, 2021 at 08:42:52PM +0200, Marian Postevca wrote:
> Greg Kroah-Hartman <gregkh@linuxfoundation.org> writes:
> 
> > On Tue, Nov 30, 2021 at 12:12:29AM +0200, Marian Postevca wrote:
> >> When listening for notifications through netlink of a new interface being
> >> registered, sporadically, it is possible for the MAC to be read as zero.
> >> The zero MAC address lasts a short period of time and then switches to a
> >> valid random MAC address.
> >> 
> >> This causes problems for netd in Android, which assumes that the interface
> >> is malfunctioning and will not use it.
> >> 
> >> In the good case we get this log:
> >> InterfaceController::getCfg() ifName usb0
> >>  hwAddr 92:a8:f0:73:79:5b ipv4Addr 0.0.0.0 flags 0x1002
> >> 
> >> In the error case we get these logs:
> >> InterfaceController::getCfg() ifName usb0
> >>  hwAddr 00:00:00:00:00:00 ipv4Addr 0.0.0.0 flags 0x1002
> >> 
> >> netd : interfaceGetCfg("usb0")
> >> netd : interfaceSetCfg() -> ServiceSpecificException
> >>  (99, "[Cannot assign requested address] : ioctl() failed")
> >> 
> >> The reason for the issue is the order in which the interface is setup,
> >> it is first registered through register_netdev() and after the MAC
> >> address is set.
> >> 
> >> Fixed by first setting the MAC address of the net_device and after that
> >> calling register_netdev().
> >> 
> >> Signed-off-by: Marian Postevca <posteuca@mutex.one>
> >> ---
> >>  drivers/usb/gadget/function/u_ether.c | 16 ++++++----------
> >>  1 file changed, 6 insertions(+), 10 deletions(-)
> >
> > What commit does this fix?  Should it go to stable kernel releases?
> >
> > thanks,
> >
> > greg k-h
> 
> This fixes bcd4a1c40bee885e ("usb: gadget: u_ether: construct with
> default values and add setters/getters").
> 
> I think it should go to stable kernel releases.
> 
> Should I send a second version of the patch with a Fixes tag?

Yes please, and a cc: stable on the line after the fixes tag.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-12-04 19:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-29 22:12 [PATCH] usb: gadget: u_ether: fix race in setting MAC address in setup phase Marian Postevca
2021-12-03 12:50 ` Greg Kroah-Hartman
2021-12-04 18:42   ` Marian Postevca
2021-12-04 18:47     ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).