# SPDX-FileCopyrightText: 2024 Tom Hubrecht # # SPDX-License-Identifier: EUPL-1.2 { lib, ... }: let inherit (lib) mkDefault mkIf mkOption ; inherit (lib.types) attrs attrsOf bool ints nullOr submodule str ; in { options.isp = { vlans = mkOption { type = attrsOf ( submodule ( { config, ... }: { options = { id = mkOption { type = ints.between 0 (4096 - 1); description = '' The VLAN id to use. ''; }; settings = mkOption { type = attrs; default = { }; description = '' Settings for the configuration of networkd. ''; }; internal = { network = mkOption { type = nullOr str; description = '' The internal network address of this VLAN. ''; }; prefix = mkOption { type = nullOr (ints.between 0 32); default = if config.userOnly then 27 else null; description = '' The prefix length of the network associated to this VLAN. ''; }; address = mkOption { type = nullOr str; description = '' The router address in the VLAN. It should be the first ipv4 in the network. ''; }; cidr = mkOption { type = nullOr str; default = with config.internal; if (prefix != null && network != null) then "${network}/${builtins.toString prefix}" else null; description = '' The CIDR notation of the network associated to the VLAN. ''; }; }; userOnly = mkOption { type = bool; default = false; description = '' Whether this VLAN is only used by a user in the context of the IPS. I.e. this is not an administration VLAN. ''; }; }; # The address is null by default when not on a user VLAN config.internal = mkIf (!config.userOnly) { address = mkDefault null; network = mkDefault null; }; } ) ); default = [ ]; description = '' The list of VLANs known to our ISP. ''; }; }; }