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