summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nixos/doc/manual/release-notes/rl-2003.xml8
-rw-r--r--nixos/modules/services/networking/zerotierone.nix17
-rw-r--r--nixos/modules/system/boot/networkd.nix75
-rw-r--r--nixos/tests/networking.nix60
4 files changed, 57 insertions, 103 deletions
diff --git a/nixos/doc/manual/release-notes/rl-2003.xml b/nixos/doc/manual/release-notes/rl-2003.xml
index a123be2ccf4..918906d27e7 100644
--- a/nixos/doc/manual/release-notes/rl-2003.xml
+++ b/nixos/doc/manual/release-notes/rl-2003.xml
@@ -712,14 +712,6 @@ auth required pam_succeed_if.so uid >= 1000 quiet
      For further reference, please read <link xlink:href="https://github.com/NixOS/nixpkgs/pull/68953">#68953</link> or the corresponding <link xlink:href="https://discourse.nixos.org/t/predictable-network-interface-names-in-initrd/4055">discourse thread</link>.
     </para>
    </listitem>
-   <listitem>
-    <para>
-     The <link linkend="opt-systemd.network.links">systemd.network.links</link> option is now respected
-     even when <link linkend="opt-systemd.network.enable">systemd-networkd</link> is disabled.
-     This mirrors the behaviour of systemd - It's udev that parses <literal>.link</literal> files,
-     not <command>systemd-networkd</command>.
-    </para>
-   </listitem>
   </itemizedlist>
  </section>
 </section>
diff --git a/nixos/modules/services/networking/zerotierone.nix b/nixos/modules/services/networking/zerotierone.nix
index cf39ed065a7..042c4d5addd 100644
--- a/nixos/modules/services/networking/zerotierone.nix
+++ b/nixos/modules/services/networking/zerotierone.nix
@@ -69,14 +69,13 @@ in
     environment.systemPackages = [ cfg.package ];
 
     # Prevent systemd from potentially changing the MAC address
-    systemd.network.links."50-zerotier" = {
-      matchConfig = {
-        OriginalName = "zt*";
-      };
-      linkConfig = {
-        AutoNegotiation = false;
-        MACAddressPolicy = "none";
-      };
-    };
+    environment.etc."systemd/network/50-zerotier.link".text = ''
+      [Match]
+      OriginalName=zt*
+
+      [Link]
+      AutoNegotiation=false
+      MACAddressPolicy=none
+    '';
   };
 }
diff --git a/nixos/modules/system/boot/networkd.nix b/nixos/modules/system/boot/networkd.nix
index 3078f84f6e9..6dfbe66fc64 100644
--- a/nixos/modules/system/boot/networkd.nix
+++ b/nixos/modules/system/boot/networkd.nix
@@ -355,14 +355,6 @@ let
   };
 
   linkOptions = commonNetworkOptions // {
-    # overwrite enable option from above
-    enable = mkOption {
-      default = true;
-      type = types.bool;
-      description = ''
-        Whether to enable this .link unit. It's handled by udev no matter if <command>systemd-networkd</command> is enabled or not
-      '';
-    };
 
     linkConfig = mkOption {
       default = {};
@@ -1053,49 +1045,44 @@ in
 
   };
 
-  config = mkMerge [
-    # .link units are honored by udev, no matter if systemd-networkd is enabled or not.
-    {
-      systemd.network.units = mapAttrs' (n: v: nameValuePair "${n}.link" (linkToUnit n v)) cfg.links;
-      environment.etc = unitFiles;
-    }
+  config = mkIf config.systemd.network.enable {
 
-    (mkIf config.systemd.network.enable {
+    users.users.systemd-network.group = "systemd-network";
 
-      users.users.systemd-network.group = "systemd-network";
+    systemd.additionalUpstreamSystemUnits = [
+      "systemd-networkd.service" "systemd-networkd-wait-online.service"
+    ];
 
-      systemd.additionalUpstreamSystemUnits = [
-        "systemd-networkd.service" "systemd-networkd-wait-online.service"
-      ];
+    systemd.network.units = mapAttrs' (n: v: nameValuePair "${n}.link" (linkToUnit n v)) cfg.links
+      // mapAttrs' (n: v: nameValuePair "${n}.netdev" (netdevToUnit n v)) cfg.netdevs
+      // mapAttrs' (n: v: nameValuePair "${n}.network" (networkToUnit n v)) cfg.networks;
 
-      systemd.network.units = mapAttrs' (n: v: nameValuePair "${n}.netdev" (netdevToUnit n v)) cfg.netdevs
-        // mapAttrs' (n: v: nameValuePair "${n}.network" (networkToUnit n v)) cfg.networks;
+    environment.etc = unitFiles;
 
-      systemd.services.systemd-networkd = {
-        wantedBy = [ "multi-user.target" ];
-        restartTriggers = attrNames unitFiles;
-        # prevent race condition with interface renaming (#39069)
-        requires = [ "systemd-udev-settle.service" ];
-        after = [ "systemd-udev-settle.service" ];
-      };
+    systemd.services.systemd-networkd = {
+      wantedBy = [ "multi-user.target" ];
+      restartTriggers = attrNames unitFiles;
+      # prevent race condition with interface renaming (#39069)
+      requires = [ "systemd-udev-settle.service" ];
+      after = [ "systemd-udev-settle.service" ];
+    };
 
-      systemd.services.systemd-networkd-wait-online = {
-        wantedBy = [ "network-online.target" ];
-      };
+    systemd.services.systemd-networkd-wait-online = {
+      wantedBy = [ "network-online.target" ];
+    };
 
-      systemd.services."systemd-network-wait-online@" = {
-        description = "Wait for Network Interface %I to be Configured";
-        conflicts = [ "shutdown.target" ];
-        requisite = [ "systemd-networkd.service" ];
-        after = [ "systemd-networkd.service" ];
-        serviceConfig = {
-          Type = "oneshot";
-          RemainAfterExit = true;
-          ExecStart = "${config.systemd.package}/lib/systemd/systemd-networkd-wait-online -i %I";
-        };
+    systemd.services."systemd-network-wait-online@" = {
+      description = "Wait for Network Interface %I to be Configured";
+      conflicts = [ "shutdown.target" ];
+      requisite = [ "systemd-networkd.service" ];
+      after = [ "systemd-networkd.service" ];
+      serviceConfig = {
+        Type = "oneshot";
+        RemainAfterExit = true;
+        ExecStart = "${config.systemd.package}/lib/systemd/systemd-networkd-wait-online -i %I";
       };
+    };
 
-      services.resolved.enable = mkDefault true;
-    })
-  ];
+    services.resolved.enable = mkDefault true;
+  };
 }
diff --git a/nixos/tests/networking.nix b/nixos/tests/networking.nix
index a519ca06594..933a4451af9 100644
--- a/nixos/tests/networking.nix
+++ b/nixos/tests/networking.nix
@@ -5,10 +5,11 @@
 , networkd }:
 
 with import ../lib/testing-python.nix { inherit system pkgs; };
+with pkgs.lib;
 
 let
-  router = { config, pkgs, lib, ... }:
-    with lib;
+  router = { config, pkgs, ... }:
+    with pkgs.lib;
     let
       vlanIfs = range 1 (length config.virtualisation.vlans);
     in {
@@ -84,7 +85,7 @@ let
     static = {
       name = "Static";
       nodes.router = router;
-      nodes.client = { pkgs, lib, ... }: with lib; {
+      nodes.client = { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 2 ];
         networking = {
           useNetworkd = networkd;
@@ -136,7 +137,7 @@ let
     dhcpSimple = {
       name = "SimpleDHCP";
       nodes.router = router;
-      nodes.client = { pkgs, lib, ... }: with lib; {
+      nodes.client = { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 2 ];
         networking = {
           useNetworkd = networkd;
@@ -192,7 +193,7 @@ let
     dhcpOneIf = {
       name = "OneInterfaceDHCP";
       nodes.router = router;
-      nodes.client = { pkgs, lib, ... }: with lib; {
+      nodes.client = { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 2 ];
         networking = {
           useNetworkd = networkd;
@@ -231,7 +232,7 @@ let
         '';
     };
     bond = let
-      node = address: { pkgs, lib, ... }: with lib; {
+      node = address: { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 2 ];
         networking = {
           useNetworkd = networkd;
@@ -267,7 +268,7 @@ let
         '';
     };
     bridge = let
-      node = { address, vlan }: { pkgs, lib, ... }: with lib; {
+      node = { address, vlan }: { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ vlan ];
         networking = {
           useNetworkd = networkd;
@@ -280,7 +281,7 @@ let
       name = "Bridge";
       nodes.client1 = node { address = "192.168.1.2"; vlan = 1; };
       nodes.client2 = node { address = "192.168.1.3"; vlan = 2; };
-      nodes.router = { pkgs, lib, ... }: with lib; {
+      nodes.router = { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 2 ];
         networking = {
           useNetworkd = networkd;
@@ -317,7 +318,7 @@ let
     macvlan = {
       name = "MACVLAN";
       nodes.router = router;
-      nodes.client = { pkgs, lib, ... }: with lib; {
+      nodes.client = { pkgs, ... }: with pkgs.lib; {
         environment.systemPackages = [ pkgs.iptables ]; # to debug firewall rules
         virtualisation.vlans = [ 1 ];
         networking = {
@@ -371,7 +372,7 @@ let
         '';
     };
     sit = let
-      node = { address4, remote, address6 }: { pkgs, lib, ... }: with lib; {
+      node = { address4, remote, address6 }: { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 ];
         networking = {
           useNetworkd = networkd;
@@ -413,7 +414,7 @@ let
         '';
     };
     vlan = let
-      node = address: { pkgs, lib, ... }: with lib; {
+      node = address: { pkgs, ... }: with pkgs.lib; {
         #virtualisation.vlans = [ 1 ];
         networking = {
           useNetworkd = networkd;
@@ -526,7 +527,7 @@ let
           '';
         };
       };
-      nodes.client_with_privacy = { pkgs, lib, ... }: with lib; {
+      nodes.client_with_privacy = { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 ];
         networking = {
           useNetworkd = networkd;
@@ -539,7 +540,7 @@ let
           };
         };
       };
-      nodes.client = { pkgs, lib, ... }: with lib; {
+      nodes.client = { pkgs, ... }: with pkgs.lib; {
         virtualisation.vlans = [ 1 ];
         networking = {
           useNetworkd = networkd;
@@ -602,9 +603,9 @@ let
 
       testScript = ''
         targetIPv4Table = """
-        10.0.0.0/16 proto static scope link mtu 1500
-        192.168.1.0/24 proto kernel scope link src 192.168.1.2
-        192.168.2.0/24 via 192.168.1.1 proto static
+        10.0.0.0/16 proto static scope link mtu 1500 
+        192.168.1.0/24 proto kernel scope link src 192.168.1.2 
+        192.168.2.0/24 via 192.168.1.1 proto static 
         """.strip()
 
         targetIPv6Table = """
@@ -654,33 +655,8 @@ let
             ), "The IPv6 routing table has not been properly cleaned:\n{}".format(ipv6Residue)
       '';
     };
-    # even with disabled networkd, systemd.network.links should work
-    # (as it's handled by udev, not networkd)
-    link = {
-      name = "Link";
-      nodes.client = { pkgs, ... }: {
-        virtualisation.vlans = [ 1 ];
-        networking = {
-          useNetworkd = networkd;
-          useDHCP = false;
-        };
-        systemd.network.links."50-foo" = {
-          matchConfig = {
-            Name = "foo";
-            Driver = "dummy";
-          };
-          linkConfig.MTUBytes = "1442";
-        };
-      };
-      testScript = ''
-        print(client.succeed("ip l add name foo type dummy"))
-        print(client.succeed("stat /etc/systemd/network/50-foo.link"))
-        client.succeed("udevadm settle")
-        assert "mtu 1442" in client.succeed("ip l show dummy0")
-      '';
-    };
   };
 
-in pkgs.lib.mapAttrs (pkgs.lib.const (attrs: makeTest (attrs // {
+in mapAttrs (const (attrs: makeTest (attrs // {
   name = "${attrs.name}-Networking-${if networkd then "Networkd" else "Scripted"}";
 }))) testCases