| # Support for GRETap interfaces in NixOS' scripted networking. |
| # |
| # We currently only use it in the edge01.waw test framework to bring vlans |
| # across test VMs. |
| |
| { config, pkgs, lib, ... }: |
| |
| with lib; |
| |
| let |
| cfg = config.hscloud.gretap; |
| |
| in { |
| options.hscloud.gretap = { |
| interfaces = mkOption { |
| type = with types; attrsOf (submodule { |
| options = { |
| localV4 = mkOption { |
| type = types.str; |
| description = "Local outer IPv4 address"; |
| }; |
| remoteV4 = mkOption { |
| type = types.str; |
| description = "Remote outer IPv4 address"; |
| }; |
| id = mkOption { |
| type = types.int; |
| description = "Tunnel ID"; |
| }; |
| parent = mkOption { |
| type = types.str; |
| description = "Parent/outer device"; |
| }; |
| }; |
| }); |
| description = '' |
| GRETap interfaces to create. |
| ''; |
| }; |
| }; |
| |
| config.boot.kernelModules = [ "fou" ]; |
| config.systemd.services = mapAttrs' (name: value: nameValuePair "${name}-gretap" { |
| wants = if config.networking.useNetworkd then [ |
| "systemd-networkd.service" |
| ] else [ |
| "${name}-netdev.service" |
| "network-addresses-${value.parent}.service" |
| ]; |
| after = if config.networking.useNetworkd then [ |
| "systemd-networkd.service" |
| ] else [ |
| "network-addresses-${value.parent}.service" |
| ]; |
| before = if config.networking.useNetworkd then [] else [ |
| "network-addresses-${name}.service" |
| ]; |
| wantedBy = if config.networking.useNetworkd then [ |
| "network-online.target" |
| ] else [ |
| "network-addresses-${name}.service" |
| ]; |
| serviceConfig = { |
| Type = "oneshot"; |
| ExecStart = "${pkgs.iproute2}/bin/ip link add name ${name} type gretap remote ${value.remoteV4} local ${value.localV4} key ${toString value.id}"; |
| }; |
| }) cfg.interfaces; |
| } |