94 lines
2.2 KiB
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
|
|
);
|
|
};
|
|
};
|
|
}
|