{ config, lib, util, ... }: # Configures bridges for tagged VLANs on a physical interface that uses DHCP. let cfg = config.modules.network.vlans; # NOLINT(let_order) in { options.modules.network.vlans = { interface = lib.mkOption { type = lib.types.str; example = "enp1s0"; description = '' Names the physical interface that carries untagged DHCP traffic and tagged VLANs. ''; }; ids = lib.mkOption { type = lib.types.listOf (lib.types.ints.between 1 4094); default = [ ]; example = [ 10 20 30 ]; description = '' Creates bridges for the specified tagged VLAN IDs. VLAN ID N creates bridge `br-vlanN`. ''; }; }; config = lib.mkIf (cfg.ids != [ ]) { networking = { useDHCP = false; networkmanager.unmanaged = [ "interface-name:${cfg.interface}" ] ++ map (id: "interface-name:${util.bridgeName id}") cfg.ids ++ map (id: "interface-name:vlan${toString id}") cfg.ids; }; systemd.network = { enable = true; netdevs = lib.mkMerge ( map (id: { "40-${util.bridgeName id}" = { netdevConfig = { Name = util.bridgeName id; Kind = "bridge"; }; }; "40-vlan${toString id}" = { netdevConfig = { Name = "vlan${toString id}"; Kind = "vlan"; }; vlanConfig.Id = id; }; }) cfg.ids ); networks = lib.mkMerge ( [ { "10-${cfg.interface}" = { matchConfig.Name = cfg.interface; networkConfig.DHCP = "yes"; vlan = map (id: "vlan${toString id}") cfg.ids; linkConfig.RequiredForOnline = "routable"; }; } ] ++ map (id: { "40-vlan${toString id}" = { matchConfig.Name = "vlan${toString id}"; networkConfig.Bridge = util.bridgeName id; linkConfig.RequiredForOnline = "no"; }; "40-${util.bridgeName id}" = { matchConfig.Name = util.bridgeName id; linkConfig.RequiredForOnline = "no"; }; }) cfg.ids ); }; }; }