diff --git a/nixos/modules/services/networking/wpa_supplicant.nix b/nixos/modules/services/networking/wpa_supplicant.nix index 908c8730ad2a..4bae05b6dd30 100644 --- a/nixos/modules/services/networking/wpa_supplicant.nix +++ b/nixos/modules/services/networking/wpa_supplicant.nix @@ -8,17 +8,20 @@ let ${optionalString cfg.userControlled.enable '' ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=${cfg.userControlled.group} update_config=1''} - ${concatStringsSep "\n" (mapAttrsToList (ssid: networkConfig: let - psk = if networkConfig.psk != null - then ''"${networkConfig.psk}"'' - else networkConfig.pskRaw; - priority = networkConfig.priority; + ${concatStringsSep "\n" (mapAttrsToList (ssid: config: with config; let + key = if psk != null + then ''"${psk}"'' + else pskRaw; + baseAuth = if key != null + then ''psk=${key}'' + else ''key_mgmt=NONE''; in '' network={ ssid="${ssid}" - ${optionalString (psk != null) ''psk=${psk}''} - ${optionalString (psk == null) ''key_mgmt=NONE''} ${optionalString (priority != null) ''priority=${toString priority}''} + ${optionalString hidden "scan_ssid=1"} + ${if (auth != null) then auth else baseAuth} + ${extraConfig} } '') cfg.networks)} '' else "/etc/wpa_supplicant.conf"; @@ -70,6 +73,32 @@ in { Mutually exclusive with psk. ''; }; + + auth = mkOption { + type = types.nullOr types.str; + default = null; + example = '' + key_mgmt=WPA-EAP + eap=PEAP + identity="user@example.com" + password="secret" + ''; + description = '' + Use this option to configure advanced authentication methods like EAP. + See wpa_supplicant.conf(5) for example configurations. + + Mutually exclusive with psk and pskRaw. + ''; + }; + + hidden = mkOption { + type = types.bool; + default = false; + description = '' + Set this to true if the SSID of the network is hidden. + ''; + }; + priority = mkOption { type = types.nullOr types.int; default = null; @@ -83,6 +112,19 @@ in { policy, signal strength, etc. ''; }; + + extraConfig = mkOption { + type = types.str; + default = ""; + example = '' + bssid_blacklist=02:11:22:33:44:55 02:22:aa:44:55:66 + ''; + description = '' + Extra configuration lines appended to the network block. + See wpa_supplicant.conf(5) for available options. + ''; + }; + }; }); description = '' @@ -128,8 +170,8 @@ in { config = mkIf cfg.enable { assertions = flip mapAttrsToList cfg.networks (name: cfg: { - assertion = cfg.psk == null || cfg.pskRaw == null; - message = ''networking.wireless."${name}".psk and networking.wireless."${name}".pskRaw are mutually exclusive''; + assertion = with cfg; count (x: x != null) [ psk pskRaw auth ] <= 1; + message = ''options networking.wireless."${name}".{psk,pskRaw,auth} are mutually exclusive''; }); environment.systemPackages = [ pkgs.wpa_supplicant ];