Skip to content

Commit 2ea3964

Browse files
martinetdkuba-moo
authored andcommitted
net: usb: usbnet: restore usb%d name exception for local mac addresses
commit 8a7d12d ("net: usb: usbnet: fix name regression") assumed that local addresses always came from the kernel, but some devices hand out local mac addresses so we ended up with point-to-point devices with a mac set by the driver, renaming to eth%d when they used to be named usb%d. Userspace should not rely on device name, but for the sake of stability restore the local mac address check portion of the naming exception: point to point devices which either have no mac set by the driver or have a local mac handed out by the driver will keep the usb%d name. (some USB LTE modems are known to hand out a stable mac from the locally administered range; that mac appears to be random (different for mulitple devices) and can be reset with device-specific commands, so while such devices would benefit from getting a OUI reserved, we have to deal with these and might as well preserve the existing behavior to avoid breaking fragile openwrt configurations and such on upgrade.) Link: https://lkml.kernel.org/r/[email protected] Fixes: 8a7d12d ("net: usb: usbnet: fix name regression") Cc: [email protected] Tested-by: Ahmed Naseef <[email protected]> Signed-off-by: Dominique Martinet <[email protected]> Acked-by: Oliver Neukum <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent fab0583 commit 2ea3964

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

drivers/net/usb/usbnet.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,17 @@ int usbnet_get_ethernet_addr(struct usbnet *dev, int iMACAddress)
178178
}
179179
EXPORT_SYMBOL_GPL(usbnet_get_ethernet_addr);
180180

181+
static bool usbnet_needs_usb_name_format(struct usbnet *dev, struct net_device *net)
182+
{
183+
/* Point to point devices which don't have a real MAC address
184+
* (or report a fake local one) have historically used the usb%d
185+
* naming. Preserve this..
186+
*/
187+
return (dev->driver_info->flags & FLAG_POINTTOPOINT) != 0 &&
188+
(is_zero_ether_addr(net->dev_addr) ||
189+
is_local_ether_addr(net->dev_addr));
190+
}
191+
181192
static void intr_complete (struct urb *urb)
182193
{
183194
struct usbnet *dev = urb->context;
@@ -1762,13 +1773,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
17621773
if (status < 0)
17631774
goto out1;
17641775

1765-
// heuristic: "usb%d" for links we know are two-host,
1766-
// else "eth%d" when there's reasonable doubt. userspace
1767-
// can rename the link if it knows better.
1776+
/* heuristic: rename to "eth%d" if we are not sure this link
1777+
* is two-host (these links keep "usb%d")
1778+
*/
17681779
if ((dev->driver_info->flags & FLAG_ETHER) != 0 &&
1769-
((dev->driver_info->flags & FLAG_POINTTOPOINT) == 0 ||
1770-
/* somebody touched it*/
1771-
!is_zero_ether_addr(net->dev_addr)))
1780+
!usbnet_needs_usb_name_format(dev, net))
17721781
strscpy(net->name, "eth%d", sizeof(net->name));
17731782
/* WLAN devices should always be named "wlan%d" */
17741783
if ((dev->driver_info->flags & FLAG_WLAN) != 0)

0 commit comments

Comments
 (0)