bdb78ff17064d07cdfdee182c5abf6b38475ff49
[librecmc/librecmc.git] /
1 From 1bfbe1799b9ec5d00f7f032d6e7db1980e466aeb Mon Sep 17 00:00:00 2001
2 From: Lech Perczak <lech.perczak@gmail.com>
3 Date: Sat, 2 Apr 2022 02:19:57 +0200
4 Subject: [PATCH 3/3] rndis_host: limit scope of bogus MAC address detection to
5  ZTE devices
6 MIME-Version: 1.0
7 Content-Type: text/plain; charset=UTF-8
8 Content-Transfer-Encoding: 8bit
9
10 Reporting of bogus MAC addresses and ignoring configuration of new
11 destination address wasn't observed outside of a range of ZTE devices,
12 among which this seems to be the common bug. Align rndis_host driver
13 with implementation found in cdc_ether, which also limits this workaround
14 to ZTE devices.
15
16 Suggested-by: Bjørn Mork <bjorn@mork.no>
17 Cc: Kristian Evensen <kristian.evensen@gmail.com>
18 Cc: Oliver Neukum <oliver@neukum.org>
19 Signed-off-by: Lech Perczak <lech.perczak@gmail.com>
20 ---
21  drivers/net/usb/rndis_host.c | 17 ++++++++++++-----
22  1 file changed, 12 insertions(+), 5 deletions(-)
23
24 --- a/drivers/net/usb/rndis_host.c
25 +++ b/drivers/net/usb/rndis_host.c
26 @@ -418,10 +418,7 @@ generic_rndis_bind(struct usbnet *dev, s
27                 goto halt_fail_and_release;
28         }
29  
30 -       if (bp[0] & 0x02)
31 -               eth_hw_addr_random(net);
32 -       else
33 -               ether_addr_copy(net->dev_addr, bp);
34 +       ether_addr_copy(net->dev_addr, bp);
35  
36         /* set a nonzero filter to enable data transfers */
37         memset(u.set, 0, sizeof *u.set);
38 @@ -463,6 +460,16 @@ static int rndis_bind(struct usbnet *dev
39         return generic_rndis_bind(dev, intf, FLAG_RNDIS_PHYM_NOT_WIRELESS);
40  }
41  
42 +static int zte_rndis_bind(struct usbnet *dev, struct usb_interface *intf)
43 +{
44 +       int status = rndis_bind(dev, intf);
45 +
46 +       if (!status && (dev->net->dev_addr[0] & 0x02))
47 +               eth_hw_addr_random(dev->net);
48 +
49 +       return status;
50 +}
51 +
52  void rndis_unbind(struct usbnet *dev, struct usb_interface *intf)
53  {
54         struct rndis_halt       *halt;
55 @@ -615,7 +622,7 @@ static const struct driver_info     zte_rndi
56         .description =  "ZTE RNDIS device",
57         .flags =        FLAG_ETHER | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT,
58         .data =         RNDIS_DRIVER_DATA_DST_MAC_FIXUP,
59 -       .bind =         rndis_bind,
60 +       .bind =         zte_rndis_bind,
61         .unbind =       rndis_unbind,
62         .status =       rndis_status,
63         .rx_fixup =     rndis_rx_fixup,