[U-Boot] [PATCH 1/1] sandbox: clone host Ethernet address

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Oct 15 00:15:45 UTC 2018


Wireless routers may not accept multiple MAC addresses to bind via the same
WLAN session. To make the sandbox usable in a wireless environment we
therefore should clone the host Ethernet address.

Without the patch DHCP is possible via cable but not via WLAN.

Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
 arch/sandbox/cpu/eth-raw-os.c         | 21 +++++++++++++++++++++
 arch/sandbox/include/asm/eth-raw-os.h | 11 +++++++++++
 drivers/net/sandbox-raw-bus.c         |  9 +++++++++
 drivers/net/sandbox-raw.c             | 10 ----------
 include/configs/sandbox.h             |  6 +-----
 5 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/arch/sandbox/cpu/eth-raw-os.c b/arch/sandbox/cpu/eth-raw-os.c
index 75bfaa4c90..f9295d5771 100644
--- a/arch/sandbox/cpu/eth-raw-os.c
+++ b/arch/sandbox/cpu/eth-raw-os.c
@@ -33,6 +33,27 @@ void sandbox_eth_raw_if_freenameindex(struct sandbox_eth_raw_if_nameindex *ptr)
 	if_freenameindex((struct if_nameindex *)ptr);
 }
 
+int sandbox_eth_raw_os_hwaddr(const char *ifname, unsigned char *hwaddr)
+{
+	int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
+	struct ifreq ifr;
+	int ret = 0;
+
+	if (fd < 0)
+		return -errno;
+	memset(&ifr, 0, sizeof(ifr));
+	strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+	ret = ioctl(fd, SIOCGIFHWADDR, &ifr);
+	if (ret < 0) {
+		ret = -errno;
+		goto out;
+	}
+	memcpy(hwaddr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
+out:
+	close(fd);
+	return ret;
+}
+
 int sandbox_eth_raw_os_is_local(const char *ifname)
 {
 	int fd = socket(AF_INET, SOCK_DGRAM, 0);
diff --git a/arch/sandbox/include/asm/eth-raw-os.h b/arch/sandbox/include/asm/eth-raw-os.h
index 0b511db70c..2efa702d96 100644
--- a/arch/sandbox/include/asm/eth-raw-os.h
+++ b/arch/sandbox/include/asm/eth-raw-os.h
@@ -45,6 +45,17 @@ struct sandbox_eth_raw_if_nameindex *sandbox_eth_raw_if_nameindex(void);
 /* Free the data structure of enumerated network interfaces */
 void sandbox_eth_raw_if_freenameindex(struct sandbox_eth_raw_if_nameindex *ptr);
 
+/**
+ * sandbox_eth_raw_os_hwaddr() - get MAC address
+ *
+ * Returns the MAC address.
+ *
+ * @ifname:	the interface name on the host
+ * @hwaddr:	MAC address
+ * Returns:	0 on success
+ */
+int sandbox_eth_raw_os_hwaddr(const char *ifname, unsigned char *hwaddr);
+
 /*
  * Check if the interface named "ifname" is a localhost interface or not.
  * ifname - the interface name on the host to check
diff --git a/drivers/net/sandbox-raw-bus.c b/drivers/net/sandbox-raw-bus.c
index 76d65afe6c..f41484abf8 100644
--- a/drivers/net/sandbox-raw-bus.c
+++ b/drivers/net/sandbox-raw-bus.c
@@ -26,7 +26,9 @@ static int eth_raw_bus_post_bind(struct udevice *dev)
 
 	dev_read_u32(dev, "skip-localhost", &skip_localhost);
 	for (i = ni; !(i->if_index == 0 && !i->if_name); i++) {
+		int ret;
 		int local = sandbox_eth_raw_os_is_local(i->if_name);
+		struct eth_pdata *pdata = dev->platdata;
 
 		if (local < 0)
 			continue;
@@ -39,6 +41,13 @@ static int eth_raw_bus_post_bind(struct udevice *dev)
 		device_bind_driver(dev, "eth_sandbox_raw", ub_ifname, &child);
 
 		device_set_name_alloced(child);
+
+		/* Clone the host Ethernet address */
+		pdata = child->platdata;
+		ret = sandbox_eth_raw_os_hwaddr(i->if_name, pdata->enetaddr);
+		if (ret)
+			net_random_ethaddr(pdata->enetaddr);
+
 		device_probe(child);
 		priv = dev_get_priv(child);
 		if (priv) {
diff --git a/drivers/net/sandbox-raw.c b/drivers/net/sandbox-raw.c
index 09cc678ebd..0d1fd4d931 100644
--- a/drivers/net/sandbox-raw.c
+++ b/drivers/net/sandbox-raw.c
@@ -130,21 +130,11 @@ static void sb_eth_raw_stop(struct udevice *dev)
 	sandbox_eth_raw_os_stop(priv);
 }
 
-static int sb_eth_raw_read_rom_hwaddr(struct udevice *dev)
-{
-	struct eth_pdata *pdata = dev_get_platdata(dev);
-
-	net_random_ethaddr(pdata->enetaddr);
-
-	return 0;
-}
-
 static const struct eth_ops sb_eth_raw_ops = {
 	.start			= sb_eth_raw_start,
 	.send			= sb_eth_raw_send,
 	.recv			= sb_eth_raw_recv,
 	.stop			= sb_eth_raw_stop,
-	.read_rom_hwaddr	= sb_eth_raw_read_rom_hwaddr,
 };
 
 static int sb_eth_raw_ofdata_to_platdata(struct udevice *dev)
diff --git a/include/configs/sandbox.h b/include/configs/sandbox.h
index e36a5fec0e..3feb7608af 100644
--- a/include/configs/sandbox.h
+++ b/include/configs/sandbox.h
@@ -95,11 +95,7 @@
 					"stderr=serial,vidconsole\0"
 #endif
 
-#define SANDBOX_ETH_SETTINGS		"ethaddr=00:00:11:22:33:44\0" \
-					"eth1addr=00:00:11:22:33:45\0" \
-					"eth3addr=00:00:11:22:33:46\0" \
-					"eth5addr=00:00:11:22:33:47\0" \
-					"ipaddr=1.2.3.4\0"
+#define SANDBOX_ETH_SETTINGS		"ipaddr=1.2.3.4\0"
 
 #define MEM_LAYOUT_ENV_SETTINGS \
 	"bootm_size=0x10000000\0" \
-- 
2.19.1



More information about the U-Boot mailing list