[PATCH] Add linux.devname property to eth device

Gavin Schenk g.schenk at eckelmann.de
Tue Nov 21 07:40:47 PST 2017

When you have a static network environment but more than one network
device on your machine it is necessary to provide the <device> parameter
to the ip parameter at kernel cmd line.

The device name assigned by Linux cannot in general be predicted as it
depends on driver bind order.

This patch introduces a new property linux.devname to eth devices.
The value is added to bootargs per interface and can be changed in

Note that the device name is also used when dhcp is in use.

Signed-off-by: Gavin Schenk <g.schenk at eckelmann.de>

This is V2 of "[PATCH] Configure network device for nfsboot via nv var"

 include/net.h |  1 +
 net/eth.c     |  2 ++
 net/ifup.c    | 19 +++++++++++++++----
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/include/net.h b/include/net.h
index 632b6d541..0aa5569e0 100644
--- a/include/net.h
+++ b/include/net.h
@@ -62,6 +62,7 @@ struct eth_device {
 	IPaddr_t netmask;
 	IPaddr_t gateway;
 	char ethaddr[6];
+	char *linuxdevname;
 	char *bootarg;
diff --git a/net/eth.c b/net/eth.c
index dac2400b8..fe661c832 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -384,6 +384,8 @@ int eth_register(struct eth_device *edev)
 	dev_add_param_ip(dev, "netmask", NULL, NULL, &edev->netmask, edev);
 	dev_add_param_mac(dev, "ethaddr", eth_param_set_ethaddr, NULL,
 			edev->ethaddr, edev);
+	edev->linuxdevname = xstrdup("");
+	dev_add_param_string(dev, "linux.devname", NULL, NULL, &edev->linuxdevname, NULL);
 	edev->bootarg = xstrdup("");
 	dev_add_param_string(dev, "linux.bootargs", NULL, NULL, &edev->bootarg, NULL);
diff --git a/net/ifup.c b/net/ifup.c
index 5113d1383..106700e2e 100644
--- a/net/ifup.c
+++ b/net/ifup.c
@@ -50,6 +50,7 @@ int ifup(const char *name, unsigned flags)
 	int ret;
 	char *cmd, *cmd_discover;
 	const char *ip;
+	const char *linuxdevname;
 	struct stat s;
 	int i;
 	struct device_d *dev;
@@ -63,6 +64,7 @@ int ifup(const char *name, unsigned flags)
 	setenv("ip", "");
+	setenv("linuxdevname", "");
 	for (i = 0; i < ARRAY_SIZE(vars); i++)
 		setenv(vars[i], "");
@@ -95,6 +97,13 @@ int ifup(const char *name, unsigned flags)
 	if (ret)
 		goto out;
+	linuxdevname = getenv("linuxdevname");
+	if (!linuxdevname)
+		linuxdevname = "";
+	ret = dev_set_param(dev, "linux.devname", linuxdevname);
+	if (ret)
+		goto out;
 	ip = getenv("ip");
 	if (!ip)
 		ip = "";
@@ -114,11 +123,12 @@ int ifup(const char *name, unsigned flags)
 			if (ret)
 				goto out;
-		bootarg = basprintf("ip=%pI4:%pI4:%pI4:%pI4:::",
+		bootarg = basprintf("ip=%pI4:%pI4:%pI4:%pI4::%s:",
-				&edev->netmask);
+				&edev->netmask,
+				edev->linuxdevname);
 		dev_set_param(dev, "linux.bootargs", bootarg);
 	} else {
@@ -194,8 +204,9 @@ static int do_ifup(int argc, char *argv[])
 BAREBOX_CMD_HELP_TEXT("Each INTF must have a script /env/network/INTF that set the variables")
 BAREBOX_CMD_HELP_TEXT("ip (to 'static' or 'dynamic'), ipaddr, netmask, gateway, serverip and/or")
-BAREBOX_CMD_HELP_TEXT("ethaddr. A script /env/network/INTF-discover can contains for discovering")
-BAREBOX_CMD_HELP_TEXT("the ethernet device, e.g. 'usb'.")
+BAREBOX_CMD_HELP_TEXT("ethaddr, linuxdevname. A script /env/network/INTF-discover can contains")
+BAREBOX_CMD_HELP_TEXT("for discovering the ethernet device, e.g. 'usb'. If set, linuxdevname is")
+BAREBOX_CMD_HELP_TEXT("added to bootargs as device parameter.")
 BAREBOX_CMD_HELP_OPT ("-a",  "bring up all interfaces")

Eckelmann AG
Vorstand: Dipl.-Ing. Peter Frankenbach (Sprecher) Dipl.-Wi.-Ing. Philipp Eckelmann
Dr.-Ing. Marco Münchhof Dr.-Ing. Frank Uhlemann
Vorsitzender des Aufsichtsrats: Hubertus G. Krossa
Stv. Vorsitzender des Aufsichtsrats: Dr.-Ing. Gerd Eckelmann
Sitz der Gesellschaft: Berliner Str. 161, 65205 Wiesbaden, Amtsgericht Wiesbaden HRB 12636

More information about the barebox mailing list