{ config, lib, ... }: let inherit (lib) mkIf mkEnableOption mkOption types ; cfg = config.nixos.hardware.network; in { options = { nixos.hardware.network = { enable = mkEnableOption "Enable the custom networking module"; interfaces = mkOption { type = types.attrsOf ( types.submodule { options = { allowedTCPPorts = mkOption { type = types.listOf types.int; default = [ ]; description = "List of allowed TCP ports for this interface."; }; allowedUDPPorts = mkOption { type = types.listOf types.int; default = [ ]; description = "List of allowed UDP ports for this interface."; }; }; } ); default = { }; description = "Network interface configurations."; }; extraHosts = mkOption { type = types.lines; default = ""; description = "Extra entries for /etc/hosts."; }; }; }; config = mkIf cfg.enable { assertions = [ { assertion = cfg.interfaces != { } -> config.networking.networkmanager.enable; message = "Network interfaces configured but NetworkManager is not enabled"; } ]; networking = { networkmanager.enable = true; nftables.enable = true; firewall = { enable = true; inherit (cfg) interfaces; }; extraHosts = cfg.extraHosts; }; systemd.services.NetworkManager = { wants = [ "nftables.service" ]; after = [ "nftables.service" ]; }; }; }