services: dhcp-client: Turn up the interfaces before calling 'dhclient'.

Somehow, as of Linux 4.0.2, the interfaces are down by default, which
prevents 'dhclient' from actually using them.

* gnu/services/networking.scm (dhcp-client-service): Call
  'set-network-interface-up' on each item of IFACES.
This commit is contained in:
Ludovic Courtès 2015-05-17 23:24:30 +02:00
parent 6944fdbdbd
commit 9bb34f9c92
1 changed files with 13 additions and 9 deletions

View File

@ -165,20 +165,24 @@ Protocol (DHCP) client, on all the non-loopback network interfaces."
(provision '(networking))
(start #~(lambda _
(false-if-exception (delete-file #$pid-file))
;; When invoked without any arguments, 'dhclient'
;; discovers all non-loopback interfaces *that are
;; up*. However, the relevant interfaces are
;; typically down at this point. Thus we perform our
;; own interface discovery here.
(let* ((valid? (negate loopback-network-interface?))
(ifaces (filter valid?
(all-network-interfaces)))
(pid (fork+exec-command
(cons* #$dhclient "-nw"
"-pf" #$pid-file
ifaces))))
(define valid?
(negate loopback-network-interface?))
(define ifaces
(filter valid? (all-network-interfaces)))
;; XXX: Make sure the interfaces are up so that
;; 'dhclient' can actually send/receive over them.
(for-each set-network-interface-up ifaces)
(false-if-exception (delete-file #$pid-file))
(let ((pid (fork+exec-command
(cons* #$dhclient "-nw"
"-pf" #$pid-file ifaces))))
(and (zero? (cdr (waitpid pid)))
(let loop ()
(catch 'system-error