From 9debdaf512bc510f7f5d5450c4902e7d1f713274 Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Thu, 2 Feb 2017 22:21:03 +0100 Subject: [PATCH] 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. --- .../tasks/network-interfaces-scripted.nix | 36 +++++++++++++++---- nixos/modules/tasks/network-interfaces.nix | 20 +++++++++++ nixos/tests/networking.nix | 2 +- 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 062598de83e..d94d9db54ca 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 28c7b358093..898207ef7a3 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 + + ''; + + }; + 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 83103f35d48..8b573869c15 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 [ ];