GNU bug report logs -
#63516
Static networking should wait for interfaces to be up
Previous Next
Full log
Message #8 received at 63516 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Ludovic Courtès <ludovic.courtes <at> inria.fr> skribis:
> Before doing ‘addr-add’ in ‘network-set-up/linux’, should we wait for
> the interface to show up, by calling ‘get-links’ from Guile-Netlink or
> something like that?
Below is a simple workaround. How does that sound?
A better fix would be to poll(2) on the underlying AF_NETLINK socket.
In fact, we could also implement something like systemd’s
‘network-online.target’ by doing that. For that we’d need Guile-Netlink
to let us create SOCK_NONBLOCK sockets and to use real ports instead of
raw file descriptors; Fibers would then take care of the rest.
Thoughts?
Ludo’.
[Message part 2 (text/x-patch, inline)]
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index fd79c9e232..5d43d998c3 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -2794,10 +2794,39 @@ (define (network-set-up/linux config)
(scheme-file "set-up-network"
(with-extensions (list guile-netlink)
#~(begin
- (use-modules (ip addr) (ip link) (ip route))
+ (use-modules (ip addr) (ip link) (ip route)
+ (srfi srfi-1))
+
+ (define (wait-for-device device)
+ ;; Wait for DEVICE to show up.
+ ;; XXX: Polling is ridiculous. We should open a
+ ;; SOCK_NONBLOCK netlink socket and wait on it.
+ (let loop ((attempts 0))
+ (unless (find (lambda (link)
+ (string=? (link-name link)
+ device))
+ (get-links))
+ (if (< attempts 30)
+ (begin
+ (format #t
+ "waiting for \
+networking device '~a'...~%"
+ device)
+ ((@ (fibers) sleep) 1)
+ (loop (+ 1 attempts)))
+ (begin
+ (format #t "networking device '~a' \
+did not show up; bailing out~%"
+ device)
+ #f)))))
#$@(map (lambda (address)
#~(begin
+ ;; Before going any further, wait for the
+ ;; device to show up.
+ (wait-for-device
+ #$(network-address-device address))
+
(addr-add #$(network-address-device address)
#$(network-address-value address)
#:ipv6?
This bug report was last modified 2 years and 55 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.