summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorWilliam A. Kennington III <william@wkennington.com>2013-12-29 21:52:30 -0600
committerWilliam A. Kennington III <william@wkennington.com>2013-12-29 21:54:24 -0600
commitcabc0647d9555a24689e4d1483537149eab18e42 (patch)
tree5391fc4020c952837320d81e89023acad7443d8a /nixos
parent2ffab7ba6a1f2290e37ca70f927366f28c6a606e (diff)
downloadnixpkgs-cabc0647d9555a24689e4d1483537149eab18e42.tar
nixpkgs-cabc0647d9555a24689e4d1483537149eab18e42.tar.gz
nixpkgs-cabc0647d9555a24689e4d1483537149eab18e42.tar.bz2
nixpkgs-cabc0647d9555a24689e4d1483537149eab18e42.tar.lz
nixpkgs-cabc0647d9555a24689e4d1483537149eab18e42.tar.xz
nixpkgs-cabc0647d9555a24689e4d1483537149eab18e42.tar.zst
nixpkgs-cabc0647d9555a24689e4d1483537149eab18e42.zip
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.
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/tasks/network-interfaces.nix61
1 files changed, 61 insertions, 0 deletions
diff --git a/nixos/modules/tasks/network-interfaces.nix b/nixos/modules/tasks/network-interfaces.nix
index b1ab989f130..1249fabc309 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