From 38a069e58baa899a3e911bb931d80a1acad15b66 Mon Sep 17 00:00:00 2001 From: Ember 'n0emis' Keske Date: Fri, 11 Mar 2022 22:13:37 +0100 Subject: [PATCH] configure fastd --- default.nix | 33 +++++++++++++++++++++++++++++++-- modules/default.nix | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/default.nix b/default.nix index 5394efb..4388e13 100644 --- a/default.nix +++ b/default.nix @@ -38,7 +38,7 @@ in default = {}; type = with types; attrsOf (submodule { options = { - enable = mkEnableOption "ffnix Site"; + enable = mkEnableOption "ffnix Domain"; ipv4Prefix = mkOption { type = types.str; }; @@ -83,7 +83,36 @@ in }; tunnels = mkOption { default = {}; - type = (pkgs.formats.json {}).type; + type = types.submodule { + options = { + fastd = mkOption { + default = {}; + type = types.submodule { + options = { + enable = mkEnableOption "Fastd Tunnel"; + mtu = mkOption { + type = types.int; + default = 1406; + }; + port = mkOption { + type = types.int; + default = 10000; + }; + interfaceMac = mkOption { + type = types.str; + }; + extraConfig = mkOption { + description = '' + Additional config that will me merged with the fastd-instance config + ''; + default = {}; + type = (pkgs.formats.json {}).type; + }; + }; + }; + }; + }; + }; }; }; }); diff --git a/modules/default.nix b/modules/default.nix index 5ead52f..77ed7db 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -11,8 +11,10 @@ let mkIfName = type: if type == "bridge" then "br-${name}" else if type == "batman" then "bat-${name}" else + if type == "fastd" then "fd-${name}" else throw "unknown interface type ${type}, coud not generate name"; in { + #### NULL-ROUTES #### networks."10-lo" = { routes = if !domCfg.defaultNullRoute then [] else [ { @@ -34,13 +36,17 @@ let ]; }; + #### BRIDGE #### netdevs."30-${mkIfName "bridge"}".netdevConfig = { Name = mkIfName "bridge"; Kind = "bridge"; }; networks."30-${mkIfName "bridge"}" = { matchConfig.Name = mkIfName "bridge"; - linkConfig.RequiredForOnline = "no"; + linkConfig = { + RequiredForOnline = "no"; + MTUBytes = "${toString domCfg.mtu}"; + }; address = domCfg.addresses; routes = map (prefix: { routeConfig = { @@ -65,6 +71,7 @@ let }) (domCfg.ipv6Prefixes ++ [ domCfg.ipv4Prefix ]); }; + #### BATMAN #### netdevs."30-${mkIfName "batman"}" = mkIf (!cfg.batmanLegacy) { netdevConfig = { Kind = "batadv"; @@ -80,6 +87,35 @@ let matchConfig.Name = mkIfName "batman"; bridge = [ "${mkIfName "bridge"}" ]; }; + + #### FASTD #### + fdInstances."${mkIfName "fastd"}" = mkIf domCfg.tunnels.fastd.enable ({ + bind = mkDefault [ "any:${toString domCfg.tunnels.fastd.port}" ]; + mtu = domCfg.tunnels.fastd.mtu; + } // domCfg.tunnels.fastd.extraConfig); + links."30-${mkIfName "fastd"}" = mkIf domCfg.tunnels.fastd.enable { + matchConfig.OriginalName = mkIfName "fastd"; + linkConfig.MACAddress = domCfg.tunnels.fastd.interfaceMac; + }; + networks."30-${mkIfName "fastd"}" = mkIf (domCfg.tunnels.fastd.enable && !cfg.batmanLegacy) { + matchConfig.Name = mkIfName "fastd"; + networkConfig.BatmanAdvanced = mkIfName "batman"; + }; + services."${mkIfName "batman"}" = mkIf (domCfg.tunnels.fastd.enable && cfg.batmanLegacy) { + after = [ "fastd-${mkIfName "fastd"}.service" ]; + requiredBy = [ "fastd-${mkIfName "fastd"}.service" ]; + + script = '' + timeout 30 ${pkgs.bash}/bin/sh -c 'while ! ${pkgs.iproute2}/bin/ip link show dev ${mkIfName "fastd"} | grep UNKNOWN ; do sleep 1; done' + ${pkgs.batctl-legacy}/bin/batctl -m ${mkIfName "batman"} interface add ${mkIfName "fastd"} || true + ${pkgs.batctl-legacy}/bin/batctl -m ${mkIfName "batman"} gw_mode server || true + ''; + + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + }; + }; }; domConfigs = map (key: getAttr key (mapAttrs mkDomain activeDomains)) (attrNames activeDomains); @@ -91,5 +127,8 @@ in environment.etc."ffnix.json".source = pkgs.writeText "ffnix.json" (generators.toJSON {} activeDomains); systemd.network.netdevs = mergedConfigs.netdevs; systemd.network.networks = mergedConfigs.networks; + systemd.network.links = mergedConfigs.links; + systemd.services = mergedConfigs.services; + ffnix.fastd.instances = mergedConfigs.fdInstances; }; }