summary refs log tree commit diff
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2017-02-02 22:21:03 +0100
committerProfpatsch <mail@profpatsch.de>2017-02-16 21:24:40 +0100
commit9debdaf512bc510f7f5d5450c4902e7d1f713274 (patch)
tree95047796efb8103b3192cd94a900b54235a9d4cc
parent03024b39b7d4b94724faa1a62f21aed3531bb35a (diff)
downloadnixlib-9debdaf512bc510f7f5d5450c4902e7d1f713274.tar
nixlib-9debdaf512bc510f7f5d5450c4902e7d1f713274.tar.gz
nixlib-9debdaf512bc510f7f5d5450c4902e7d1f713274.tar.bz2
nixlib-9debdaf512bc510f7f5d5450c4902e7d1f713274.tar.lz
nixlib-9debdaf512bc510f7f5d5450c4902e7d1f713274.tar.xz
nixlib-9debdaf512bc510f7f5d5450c4902e7d1f713274.tar.zst
nixlib-9debdaf512bc510f7f5d5450c4902e7d1f713274.zip
networking.bonds: add support for arbitrary driverOptions
Until now the four attributes available very selectively provided a small
subset, while copying upstream documentation.

We make driver options an arbitrary key-value set and point to kernel
documentation, which is always up-to-date. This way every option can be set.
The four already existing options are deprecated with a warning.
-rw-r--r--nixos/modules/tasks/network-interfaces-scripted.nix36
-rw-r--r--nixos/modules/tasks/network-interfaces.nix20
-rw-r--r--nixos/tests/networking.nix2
3 files changed, 50 insertions, 8 deletions
diff --git a/nixos/modules/tasks/network-interfaces-scripted.nix b/nixos/modules/tasks/network-interfaces-scripted.nix
index 062598de83e1..d94d9db54ca5 100644
--- a/nixos/modules/tasks/network-interfaces-scripted.nix
+++ b/nixos/modules/tasks/network-interfaces-scripted.nix
@@ -37,11 +37,24 @@ let
     ip link del "${i}" 2>/dev/null || true
   '';
 
-in
+  # warn that these attributes are deprecated (2017-2-2)
+  # Should be removed in the release after next
+  bondDeprecation = rec {
+    deprecated = [ "lacp_rate" "miimon" "mode" "xmit_hash_policy" ];
+    filterDeprecated = bond: (filterAttrs (attrName: attr:
+                         elem attrName deprecated && attr != null) bond);
+  };
 
-{
+  bondWarnings =
+    let oneBondWarnings = bondName: bond:
+          mapAttrsToList (bondText bondName) (bondDeprecation.filterDeprecated bond);
+        bondText = bondName: optName: _:
+          "${bondName}.${optName} is deprecated, use ${bondName}.driverOptions";
+    in {
+      warnings = flatten (mapAttrsToList oneBondWarnings cfg.bonds);
+    };
 
-  config = mkIf (!cfg.useNetworkd) {
+  normalConfig = {
 
     systemd.services =
       let
@@ -296,10 +309,11 @@ in
 
               echo "Creating new bond ${n}..."
               ip link add name "${n}" type bond \
-                ${optionalString (v.mode != null) "mode ${toString v.mode}"} \
-                ${optionalString (v.miimon != null) "miimon ${toString v.miimon}"} \
-                ${optionalString (v.xmit_hash_policy != null) "xmit_hash_policy ${toString v.xmit_hash_policy}"} \
-                ${optionalString (v.lacp_rate != null) "lacp_rate ${toString v.lacp_rate}"}
+              ${let opts = (mapAttrs (const toString)
+                             (bondDeprecation.filterDeprecated v))
+                           // v.driverOptions;
+                 in concatStringsSep "\n"
+                      (mapAttrsToList (set: val: "  ${set} ${val} \\") opts)}
 
               # !!! There must be a better way to wait for the interface
               while [ ! -d "/sys/class/net/${n}" ]; do sleep 0.1; done;
@@ -410,6 +424,14 @@ in
         KERNEL=="tun", TAG+="systemd"
       '';
 
+
   };
 
+in
+
+{
+  config = mkMerge [
+    bondWarnings
+    (mkIf (!cfg.useNetworkd) normalConfig)
+  ];
 }
diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix
index 28c7b358093d..898207ef7a3c 100644
--- a/nixos/modules/tasks/network-interfaces.nix
+++ b/nixos/modules/tasks/network-interfaces.nix
@@ -587,11 +587,28 @@ in
             description = "The interfaces to bond together";
           };
 
+          driverOptions = mkOption {
+            type = types.attrsOf types.str;
+            default = {};
+            example = literalExample {
+              interfaces = [ "eth0" "wlan0" ];
+              miimon = 100;
+              mode = "active-backup";
+            };
+            description = ''
+              Options for the bonding driver.
+              Documentation can be found in
+              <link xlink:href="https://www.kernel.org/doc/Documentation/networking/bonding.txt" />
+            '';
+
+          };
+
           lacp_rate = mkOption {
             default = null;
             example = "fast";
             type = types.nullOr types.str;
             description = ''
+              DEPRECATED, use `driverOptions`.
               Option specifying the rate in which we'll ask our link partner
               to transmit LACPDU packets in 802.3ad mode.
             '';
@@ -602,6 +619,7 @@ in
             example = 100;
             type = types.nullOr types.int;
             description = ''
+              DEPRECATED, use `driverOptions`.
               Miimon is the number of millisecond in between each round of polling
               by the device driver for failed links. By default polling is not
               enabled and the driver is trusted to properly detect and handle
@@ -614,6 +632,7 @@ in
             example = "active-backup";
             type = types.nullOr types.str;
             description = ''
+              DEPRECATED, use `driverOptions`.
               The mode which the bond will be running. The default mode for
               the bonding driver is balance-rr, optimizing for throughput.
               More information about valid modes can be found at
@@ -626,6 +645,7 @@ in
             example = "layer2+3";
             type = types.nullOr types.str;
             description = ''
+              DEPRECATED, use `driverOptions`.
               Selects the transmit hash policy to use for slave selection in
               balance-xor, 802.3ad, and tlb modes.
             '';
diff --git a/nixos/tests/networking.nix b/nixos/tests/networking.nix
index 83103f35d482..8b573869c157 100644
--- a/nixos/tests/networking.nix
+++ b/nixos/tests/networking.nix
@@ -236,8 +236,8 @@ let
           firewall.allowPing = true;
           useDHCP = false;
           bonds.bond = {
-            mode = "balance-rr";
             interfaces = [ "eth1" "eth2" ];
+            driverOptions.mode = "balance-rr";
           };
           interfaces.eth1.ip4 = mkOverride 0 [ ];
           interfaces.eth2.ip4 = mkOverride 0 [ ];