about summary refs log tree commit diff
diff options
context:
space:
mode:
authorrnhmjoj <rnhmjoj@inventati.org>2021-06-01 23:19:40 +0200
committerrnhmjoj <rnhmjoj@inventati.org>2021-06-01 23:19:40 +0200
commit030a521adc9510207dd9f06b8d8b552ff7d999f9 (patch)
treee4aec46677f65db3f9e6de49c5eb7f8dea69782b
parent36d3d4575d05b74cad66c53807be42e5b6f99dc2 (diff)
nixos/wireless: make wireless.interfaces mandatory
This is the only way to solve issue #101963, for now.
-rw-r--r--nixos/doc/manual/release-notes/rl-2105.xml9
-rw-r--r--nixos/modules/services/networking/wpa_supplicant.nix27
2 files changed, 19 insertions, 17 deletions
diff --git a/nixos/doc/manual/release-notes/rl-2105.xml b/nixos/doc/manual/release-notes/rl-2105.xml
index 07b28147d6964..d04a690caf36f 100644
--- a/nixos/doc/manual/release-notes/rl-2105.xml
+++ b/nixos/doc/manual/release-notes/rl-2105.xml
@@ -194,6 +194,15 @@
   <itemizedlist>
    <listitem>
     <para>
+     Enabling wireless networking now requires specifying at least one network
+     interface using <xref linkend="opt-networking.wireless.interfaces"/>.
+     This is to avoid a race condition with the card initialisation (see
+     <link xlink:href="https://github.com/NixOS/nixpkgs/issues/101963">issue
+     #101963</link> for more information).
+    </para>
+   </listitem>
+   <listitem>
+    <para>
      If you are using <option>services.udev.extraRules</option> to assign
      custom names to network interfaces, this may stop working due to a change
      in the initialisation of dhcpcd and systemd networkd. To avoid this, either
diff --git a/nixos/modules/services/networking/wpa_supplicant.nix b/nixos/modules/services/networking/wpa_supplicant.nix
index 8a0685c3d96b2..d9308b37064a6 100644
--- a/nixos/modules/services/networking/wpa_supplicant.nix
+++ b/nixos/modules/services/networking/wpa_supplicant.nix
@@ -40,8 +40,7 @@ in {
         default = [];
         example = [ "wlan0" "wlan1" ];
         description = ''
-          The interfaces <command>wpa_supplicant</command> will use. If empty, it will
-          automatically use all wireless interfaces.
+          The interfaces <command>wpa_supplicant</command> will use.
         '';
       };
 
@@ -220,7 +219,14 @@ in {
   };
 
   config = mkIf cfg.enable {
-    assertions = flip mapAttrsToList cfg.networks (name: cfg: {
+    assertions = [
+      { assertion = cfg.interfaces != [];
+        message = ''
+          No network interfaces for wpa_supplicant have been configured.
+          Please, specify at least one using networking.wireless.interfaces.
+        '';
+      }
+    ] ++ flip mapAttrsToList cfg.networks (name: cfg: {
       assertion = with cfg; count (x: x != null) [ psk pskRaw auth ] <= 1;
       message = ''options networking.wireless."${name}".{psk,pskRaw,auth} are mutually exclusive'';
     });
@@ -255,20 +261,7 @@ in {
         then echo >&2 "<3>/etc/wpa_supplicant.conf present but ignored. Generated ${configFile} is used instead."
         fi
         iface_args="-s -u -D${cfg.driver} ${configStr}"
-        ${if ifaces == [] then ''
-          for i in $(cd /sys/class/net && echo *); do
-            DEVTYPE=
-            UEVENT_PATH=/sys/class/net/$i/uevent
-            if [ -e "$UEVENT_PATH" ]; then
-              source "$UEVENT_PATH"
-              if [ "$DEVTYPE" = "wlan" -o -e /sys/class/net/$i/wireless ]; then
-                args+="''${args:+ -N} -i$i $iface_args"
-              fi
-            fi
-          done
-        '' else ''
-          args="${concatMapStringsSep " -N " (i: "-i${i} $iface_args") ifaces}"
-        ''}
+        args="${concatMapStringsSep " -N " (i: "-i${i} $iface_args") ifaces}"
         exec wpa_supplicant $args
       '';
     };