usb: gadget: prevent change of Host MAC address of 'usb0' interface
authortaeju.park <taeju.park@lge.com>
Fri, 14 Sep 2012 05:09:03 +0000 (14:09 +0900)
committerBadhri Jagan Sridharan <Badhri@google.com>
Thu, 25 Sep 2014 01:59:50 +0000 (18:59 -0700)
On windows 7 platform, previously allocated ip address is maintained.
However, Host MAC address of 'usb0' interface is changed when the
tethering driver re-enumerated. Thus, the tethering network driver
can't be allocated ip address from dhcp. It causes connection delay
between host and phone for usb tethering.

This patch prevents from changing Host MAC address of 'usb0' interface.
In other words, this patch maintains the Host MAC address allocated when
first tethering driver although the driver is re-enumerated. However,
after reboot, the Host MAC address can be changed.

Change-Id: I43add9925e9d6d90c56cffbd3ed999104448f818
Signed-off-by: Badhri Jagan Sridharan <Badhri@google.com>
drivers/usb/gadget/u_ether.c

index 734d64b8e2c100d20aaf134ff066265e03c28f46..6a5065966494a5d068e0a5d5a860dffae31c092a 100644 (file)
@@ -718,6 +718,8 @@ static int eth_stop(struct net_device *net)
 
 /*-------------------------------------------------------------------------*/
 
+static u8 host_ethaddr[ETH_ALEN];
+
 /* initial value, changed by "ifconfig usb0 hw ether xx:xx:xx:xx:xx:xx" */
 static char *dev_addr;
 module_param(dev_addr, charp, S_IRUGO);
@@ -749,6 +751,17 @@ static int get_ether_addr(const char *str, u8 *dev_addr)
        return 1;
 }
 
+static int get_host_ether_addr(u8 *str, u8 *dev_addr)
+{
+       memcpy(dev_addr, str, ETH_ALEN);
+       if (is_valid_ether_addr(dev_addr))
+               return 0;
+
+       random_ether_addr(dev_addr);
+       memcpy(str, dev_addr, ETH_ALEN);
+       return 1;
+}
+
 static const struct net_device_ops eth_netdev_ops = {
        .ndo_open               = eth_open,
        .ndo_stop               = eth_stop,
@@ -804,9 +817,11 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
        if (get_ether_addr(dev_addr, net->dev_addr))
                dev_warn(&g->dev,
                        "using random %s ethernet address\n", "self");
-       if (get_ether_addr(host_addr, dev->host_mac))
-               dev_warn(&g->dev,
-                       "using random %s ethernet address\n", "host");
+
+       if (get_host_ether_addr(host_ethaddr, dev->host_mac))
+               dev_warn(&g->dev, "using random %s ethernet address\n", "host");
+       else
+               dev_warn(&g->dev, "using previous %s ethernet address\n", "host");
 
        if (ethaddr)
                memcpy(ethaddr, dev->host_mac, ETH_ALEN);