summary refs log tree commit diff
path: root/nixos/modules/tasks/network-interfaces-scripted.nix
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 /nixos/modules/tasks/network-interfaces-scripted.nix
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.
Diffstat (limited to 'nixos/modules/tasks/network-interfaces-scripted.nix')
-rw-r--r--nixos/modules/tasks/network-interfaces-scripted.nix36
1 files changed, 29 insertions, 7 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)
+  ];
 }