diff options
author | William A. Kennington III <william@wkennington.com> | 2013-12-29 21:52:30 -0600 |
---|---|---|
committer | William A. Kennington III <william@wkennington.com> | 2013-12-29 21:54:24 -0600 |
commit | cabc0647d9555a24689e4d1483537149eab18e42 (patch) | |
tree | 5391fc4020c952837320d81e89023acad7443d8a | |
parent | 2ffab7ba6a1f2290e37ca70f927366f28c6a606e (diff) |
network-interfaces: Add support for creating vlans
This patch adds support for vlan creation at machine startup, so that we can adjust interface settings for vlan devices using nix.
-rw-r--r-- | nixos/modules/tasks/network-interfaces.nix | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix index b1ab989f130f3..1249fabc309ae 100644 --- a/nixos/modules/tasks/network-interfaces.nix +++ b/nixos/modules/tasks/network-interfaces.nix @@ -219,6 +219,45 @@ in }; + networking.vlans = mkOption { + default = { }; + example = { + vlan0 = { + id = 3; + interface = "enp3s0"; + }; + vlan1 = { + id = 1; + interface = "wlan0"; + }; + }; + description = + '' + This option allows you to define vlan devices that tag packets + on top of a physical interface. The value of this option is an + attribute set. Each attribute specifies a vlan, with the name + specifying the name of the vlan interface. + ''; + + type = types.attrsOf types.optionSet; + + options = { + + id = mkOption { + example = 1; + type = types.int; + description = "The vlan identifier"; + }; + + interface = mkOption { + example = "enp4s0"; + type = types.string; + description = "The interface the vlan will transmit packets through."; + }; + + }; + }; + networking.useDHCP = mkOption { type = types.bool; default = true; @@ -421,10 +460,32 @@ in ''; }; + createVlanDevice = n: v: + let + deps = [ "sys-subsystem-net-devices-${v.interface}.device" ]; + in + { + description = "Vlan Interface ${n}"; + wantedBy = [ "network.target" "sys-subsystem-net-devices-${n}.device" ]; + bindsTo = deps; + after = deps; + serviceConfig.Type = "oneshot"; + serviceConfig.RemainAfterExit = true; + path = [ pkgs.iproute ]; + script = '' + ip link add link "${v.interface}" "${n}" type vlan id "${toString v.id}" + ip link set "${n}" up + ''; + postStop = '' + ip link delete "${n}" + ''; + }; + in listToAttrs ( map configureInterface interfaces ++ map createTunDevice (filter (i: i.virtual) interfaces)) // mapAttrs createBridgeDevice cfg.bridges + // mapAttrs createVlanDevice cfg.vlans // { "network-setup" = networkSetup; }; # Set the host and domain names in the activation script. Don't |