Merge #361424: refactor lib.packagesFromDirectoryRecursive (v2)
[NixPkgs.git] / nixos / modules / services / networking / iwd.nix
blob2209841678b31cfac5fc359e897cb4b12f620e7e
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
8 let
9   inherit (lib)
10     mkEnableOption
11     mkPackageOption
12     mkIf
13     mkOption
14     types
15     recursiveUpdate
16     ;
18   cfg = config.networking.wireless.iwd;
19   ini = pkgs.formats.ini { };
20   defaults = {
21     # without UseDefaultInterface, sometimes wlan0 simply goes AWOL with NetworkManager
22     # https://iwd.wiki.kernel.org/interface_lifecycle#interface_management_in_iwd
23     General.UseDefaultInterface =
24       with config.networking.networkmanager;
25       (enable && (wifi.backend == "iwd"));
26   };
27   configFile = ini.generate "main.conf" (recursiveUpdate defaults cfg.settings);
31   options.networking.wireless.iwd = {
32     enable = mkEnableOption "iwd";
34     package = mkPackageOption pkgs "iwd" { };
36     settings = mkOption {
37       type = ini.type;
38       default = { };
40       example = {
41         Settings.AutoConnect = true;
43         Network = {
44           EnableIPv6 = true;
45           RoutePriorityOffset = 300;
46         };
47       };
49       description = ''
50         Options passed to iwd.
51         See {manpage}`iwd.config(5)` for supported options.
52       '';
53     };
54   };
56   config = mkIf cfg.enable {
57     assertions = [
58       {
59         assertion = !config.networking.wireless.enable;
60         message = ''
61           Only one wireless daemon is allowed at the time: networking.wireless.enable and networking.wireless.iwd.enable are mutually exclusive.
62         '';
63       }
64     ];
66     environment.etc."iwd/${configFile.name}".source = configFile;
68     # for iwctl
69     environment.systemPackages = [ cfg.package ];
71     services.dbus.packages = [ cfg.package ];
73     systemd.packages = [ cfg.package ];
75     systemd.network.links."80-iwd" = {
76       matchConfig.Type = "wlan";
77       linkConfig.NamePolicy = "keep kernel";
78     };
80     systemd.services.iwd = {
81       path = [ config.networking.resolvconf.package ];
82       wantedBy = [ "multi-user.target" ];
83       restartTriggers = [ configFile ];
84       serviceConfig.ReadWritePaths = "-/etc/resolv.conf";
85     };
86   };
88   meta.maintainers = with lib.maintainers; [ dtzWill ];