Files
dev/configs/nixos/modules/network/vlans.nix

94 lines
2.2 KiB
Nix

{
config,
lib,
util,
...
}:
# Configures bridges for tagged VLANs on a physical interface that uses DHCP.
let
cfg = config.modules.network.vlans;
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
);
};
};
}