about summary refs log tree commit diff
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
parent2ffab7ba6a1f2290e37ca70f927366f28c6a606e (diff)
downloadnixlib-cabc0647d9555a24689e4d1483537149eab18e42.tar
nixlib-cabc0647d9555a24689e4d1483537149eab18e42.tar.gz
nixlib-cabc0647d9555a24689e4d1483537149eab18e42.tar.bz2
nixlib-cabc0647d9555a24689e4d1483537149eab18e42.tar.lz
nixlib-cabc0647d9555a24689e4d1483537149eab18e42.tar.xz
nixlib-cabc0647d9555a24689e4d1483537149eab18e42.tar.zst
nixlib-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.
-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 b1ab989f130f..1249fabc309a 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