summaryrefslogtreecommitdiff
path: root/config/networking/bridges.nix
blob: d8cd9e7ea1e75fdac980e8f58558be43b280126b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
  config,
  lib,
  pkgs,
  ...
}: let
  nets = config.personal.networking.networks;
in {
  config = lib.mkMerge ([
      {
        systemd.services.hostapd.postStart = lib.mkForce (lib.mkBefore ''
          sleep 3
        '');
      }
      {
        # create a bridge on top of enp3s0 along with a dummy interface
        # for kea to work even when enp3s0 is disconnected
        # if you change this, you may want to change:
        # - the kea configuration in ./services/dhcp.nix
        # - the eth0 net configuration ./default.nix
        networking = {
          bridges.eth0.interfaces = ["enp3s0" "enp3s0-dummy"];
          localCommands = ''
            ip link add enp3s0-dummy type dummy
          '';
        };
        boot.kernelModules = ["dummy"];
        systemd.services.network-addresses-enp3s0-dummy.enable = false;
      }
    ]
    ++ (builtins.map (network: let
      bridge = network.interface;
      device = network.device;
    in {
      networking.bridges."${bridge}".interfaces = [];

      systemd.services."${bridge}-netdev".script = ''
        echo Setting forward delay to 0 for ${bridge}...
        ip link set ${bridge} type bridge forward_delay 0
      '';

      systemd.services.hostapd.postStart = lib.mkForce ''
        echo Setting ${device} to hairpin mode...
        ${pkgs.iproute2}/bin/bridge link set dev ${device} hairpin on
      '';
    }) [nets.wan nets.iot]));
}