summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorMathijs Kwik <mathijs@bluescreen303.nl>2013-12-30 00:40:02 -0800
committerMathijs Kwik <mathijs@bluescreen303.nl>2013-12-30 00:40:02 -0800
commit9b056e1e3ec4312ffd6043f13aa068da09908335 (patch)
treec56b9771780b570d962d0064e662b951fe44dc83 /nixos
parent0270be1eb65879cbe2d5a35c43b272ad34ac7715 (diff)
parentcabc0647d9555a24689e4d1483537149eab18e42 (diff)
downloadnixpkgs-9b056e1e3ec4312ffd6043f13aa068da09908335.tar
nixpkgs-9b056e1e3ec4312ffd6043f13aa068da09908335.tar.gz
nixpkgs-9b056e1e3ec4312ffd6043f13aa068da09908335.tar.bz2
nixpkgs-9b056e1e3ec4312ffd6043f13aa068da09908335.tar.lz
nixpkgs-9b056e1e3ec4312ffd6043f13aa068da09908335.tar.xz
nixpkgs-9b056e1e3ec4312ffd6043f13aa068da09908335.tar.zst
nixpkgs-9b056e1e3ec4312ffd6043f13aa068da09908335.zip
Merge pull request #1431 from wkennington/vlan
network-interfaces: Add support for creating vlans
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