blob: 5ce04f3987582cecc5a03c25a78c40f2a66bf072 [file] [log] [blame]
# A small Ethernet-over-IP service implementation.
# Yes, that's the Mikrotik EoIP implementation. This one is somewhat sketchy
# (notably, it pumps huge zero-padded frames into tap), so doesn't use it for
# production. We currently only use it in the edge01.waw test framework to
# bring vlans across test VMs.
{ config, pkgs, lib, ... }:
with lib;
let
eoip = pkgs.stdenv.mkDerivation {
pname = "eoip";
version = "20180119";
nativeBuildInputs = with pkgs; [ cmake ];
src = pkgs.fetchFromGitHub {
owner = "amphineko";
repo = "eoiptapd";
rev = "5573a905bcbc001b503308665f098e82f451dc33";
sha256 = "0np9dzcw5w6jarzdv2yh3mbzz0wgw10sjqyi6pxan4ipr75v1b8s";
};
installPhase = ''
mkdir -p $out/bin
cp eoiptapd $out/bin/eoiptapd
'';
};
cfg = config.hscloud.eoip;
in {
options.hscloud.eoip = {
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 = ''
EoIP interfaces to create.
'';
};
};
config.systemd.services = mapAttrs' (name: value: nameValuePair "${name}-eoip" {
wantedBy = [ "network.target" ];
wants = [
"${name}-netdev.service"
"network-addresses-${value.parent}.service"
];
after = [
"network-addresses-${value.parent}.service"
];
serviceConfig = {
Type = "simple";
ExecStart = "${eoip}/bin/eoiptapd -i ${name} -l ${value.localV4} -r ${value.remoteV4} -t ${toString value.id}";
Restart = "always";
RestartSec = "1";
};
}) cfg.interfaces;
}