blob: f28d64c1c3c8b582eb1b8d417b28c1cea4799757 [file] [log] [blame]
# 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;
}