[Buildroot] [PATCH] package/skeleton: add a startup script to wait for slow network interfaces

Yann E. MORIN yann.morin.1998 at free.fr
Sat Oct 3 13:31:45 UTC 2015


On some machines, the network interface is slow to appear. For example,
on the Raspberry Pi, the network interface eth0 is an ethernet-over-USB,
and our standard boot process is too fast, so our network startup script
is called before the USB bus is compeltely enumerated, thus it can't
configure eth0.

If Buildroot is configured to do a DHCP on an interface, install a
startup script, just before S40network, that waits for that interface.

Since Buildroot can only be configured to run DHCP on a single interface,
we do not need a script that waits for more than one interface.

Closes #8116.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998 at free.fr>
---
 package/skeleton/S39wait-for-network-if | 43 +++++++++++++++++++++++++++++++++
 package/skeleton/skeleton.mk            |  2 ++
 2 files changed, 45 insertions(+)
 create mode 100644 package/skeleton/S39wait-for-network-if

diff --git a/package/skeleton/S39wait-for-network-if b/package/skeleton/S39wait-for-network-if
new file mode 100644
index 0000000..010026e
--- /dev/null
+++ b/package/skeleton/S39wait-for-network-if
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# In case we have a slow-to-appear interface (e.g. eth-over-USB),
+# and we need to configure it, wait until it appears. But not too
+# long either. WAIT_DELAY is in seconds.
+WAIT_DELAY=15
+
+wait_for_IF() {
+    IF="$(sed -r -e '/^auto lo/d;' \
+                 -e '/^auto (.+)$/!d;' \
+                 -e 's//\1/;' \
+                 /etc/network/interfaces
+         )"
+    if [ -z "${IF}" -o -e "/sys/class/net/${IF}" ]; then
+        return 0
+    fi
+    printf "Waiting for interface %s to appear" "${IF}"
+    wait=${WAIT_DELAY}
+    while [ ${wait} -gt 0 ]; do
+        if [ -e "/sys/class/net/${IF}" ]; then
+            printf " yes\n"
+            return 0
+        fi
+        sleep 1
+        printf "."
+        : $((wait--))
+    done
+    printf " no.\n"
+    return 1
+}
+
+case "$1" in
+  start)
+	wait_for_IF
+	;;
+  stop)
+	;;
+  restart)
+	"$0" start
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart}"
+esac
diff --git a/package/skeleton/skeleton.mk b/package/skeleton/skeleton.mk
index 48e7085..733b86f 100644
--- a/package/skeleton/skeleton.mk
+++ b/package/skeleton/skeleton.mk
@@ -76,6 +76,8 @@ define SET_NETWORK_DHCP
 		echo "auto $(NETWORK_DHCP_IFACE)";                   \
 		echo "iface $(NETWORK_DHCP_IFACE) inet dhcp";        \
 	) >> $(TARGET_DIR)/etc/network/interfaces
+	$(INSTALL) -D -m 0755 package/skeleton/S39wait-for-network-if \
+		$(TARGET_DIR)/etc/init.d/S39wait-for-network-if
 endef
 endif
 
-- 
1.9.1



More information about the buildroot mailing list