# 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; }