about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nixos/modules/services/networking/dhcpcd.nix6
-rw-r--r--pkgs/tools/networking/dhcpcd/check-interface.patch24
-rw-r--r--pkgs/tools/networking/dhcpcd/default.nix2
-rw-r--r--pkgs/tools/networking/dhcpcd/reload.patch22
4 files changed, 49 insertions, 5 deletions
diff --git a/nixos/modules/services/networking/dhcpcd.nix b/nixos/modules/services/networking/dhcpcd.nix
index ce9b4a3b15d41..757340b3c2cd7 100644
--- a/nixos/modules/services/networking/dhcpcd.nix
+++ b/nixos/modules/services/networking/dhcpcd.nix
@@ -36,7 +36,7 @@ let
       # Ethernet cards used for bridging.  Likewise for vif* and tap*
       # (Xen) and virbr* and vnet* (libvirt) and c-* and ctmp-* (NixOS
       # containers).
-      denyinterfaces ${toString ignoredInterfaces} peth* vif* tap* tun* virbr* vnet* vboxnet* c-* ctmp-*
+      denyinterfaces ${toString ignoredInterfaces} lo peth* vif* tap* tun* virbr* vnet* vboxnet* c-* ctmp-*
 
       ${config.networking.dhcpcd.extraConfig}
     '';
@@ -98,7 +98,6 @@ in
       { description = "DHCP Client";
 
         wantedBy = [ "network.target" ];
-        after = [ "systemd-udev-settle.service" ]; # FIXME
 
         # Stopping dhcpcd during a reconfiguration is undesirable
         # because it brings down the network interfaces configured by
@@ -112,9 +111,8 @@ in
         serviceConfig =
           { Type = "forking";
             PIDFile = "/run/dhcpcd.pid";
-            ExecStart = "@${dhcpcd}/sbin/dhcpcd dhcpcd --config ${dhcpcdConf}";
+            ExecStart = "@${dhcpcd}/sbin/dhcpcd dhcpcd --quiet --config ${dhcpcdConf}";
             ExecReload = "${dhcpcd}/sbin/dhcpcd --rebind";
-            StandardError = "null";
             Restart = "always";
           };
       };
diff --git a/pkgs/tools/networking/dhcpcd/check-interface.patch b/pkgs/tools/networking/dhcpcd/check-interface.patch
new file mode 100644
index 0000000000000..2b732b740ad40
--- /dev/null
+++ b/pkgs/tools/networking/dhcpcd/check-interface.patch
@@ -0,0 +1,24 @@
+Index: dhcpcd.c
+==================================================================
+--- a/dhcpcd.c
++++ b/dhcpcd.c
+@@ -747,14 +747,14 @@
+ 			if (ifp->hwlen != 0)
+ 				memcpy(ifl->hwaddr, ifp->hwaddr, ifl->hwlen);
+ 		} else {
+ 			TAILQ_REMOVE(ifs, ifp, next);
+ 			TAILQ_INSERT_TAIL(ctx->ifaces, ifp, next);
+-		}
+-		if (action == 1) {
+-			init_state(ifp, ctx->argc, ctx->argv);
+-			start_interface(ifp);
++			if (action == 1) {
++				init_state(ifp, ctx->argc, ctx->argv);
++				start_interface(ifp);
++			}
+ 		}
+ 	}
+ 
+ 	/* Free our discovered list */
+ 	while ((ifp = TAILQ_FIRST(ifs))) {
+
diff --git a/pkgs/tools/networking/dhcpcd/default.nix b/pkgs/tools/networking/dhcpcd/default.nix
index d247dbe38aa68..40f6538750f19 100644
--- a/pkgs/tools/networking/dhcpcd/default.nix
+++ b/pkgs/tools/networking/dhcpcd/default.nix
@@ -8,7 +8,7 @@ stdenv.mkDerivation rec {
     sha256 = "1v2m5wdr6x5cz6i0n1y63am9dhj5j7ylrk717scjgwwjdbq1x75n";
   };
 
-  patches = [ ./lxc_ro_promote_secondaries.patch ];
+  patches = [ ./lxc_ro_promote_secondaries.patch ./reload.patch ./check-interface.patch ];
 
   buildInputs = [ pkgconfig udev ];
 
diff --git a/pkgs/tools/networking/dhcpcd/reload.patch b/pkgs/tools/networking/dhcpcd/reload.patch
new file mode 100644
index 0000000000000..0ecb75a447609
--- /dev/null
+++ b/pkgs/tools/networking/dhcpcd/reload.patch
@@ -0,0 +1,22 @@
+--- a/dhcpcd.c
++++ b/dhcpcd.c
+@@ -143,16 +143,18 @@
+ 	if (ctx->ifac) {
+ 		for (ctx->ifac--; ctx->ifac >= 0; ctx->ifac--)
+ 			free(ctx->ifav[ctx->ifac]);
+ 		free(ctx->ifav);
+ 		ctx->ifav = NULL;
++		ctx->ifac = 0;
+ 	}
+ 	if (ctx->ifdc) {
+ 		for (ctx->ifdc--; ctx->ifdc >= 0; ctx->ifdc--)
+ 			free(ctx->ifdv[ctx->ifdc]);
+ 		free(ctx->ifdv);
+ 		ctx->ifdv = NULL;
++		ctx->ifdc = 0;
+ 	}
+ 
+ #ifdef INET
+ 	if (ctx->dhcp_opts) {
+ 		for (opt = ctx->dhcp_opts;
+