Es ist Wahnsinn, welche technischen Neuerung in der Welt passieren und man bekommt jahrelang davon nichts mit. Bei meiner Bastelei mit PostmarketOS bin ich über die Schnittstelle p2p0 gestolpert, die sich als WLAN meldet, und habe mich gefragt, was das ist. Jo, da zeigt sich, ich habe seit 10 Jahren nicht mitbekommen, dass es einen anderen Funknetzwerktyp gibt: Wi-Fi-Direct (Wikipedia-Eintrag). Dieser nutzt zwar sehr viel der Technik des normalen WLAN-Standards IEEE 802.11, aber bringt auch einige Neuerungen mit.

Struktur von Wifi-Netzwerken

Bei Wifi-Direct ist die Denkweise nicht mehr die hierarchische Struktur mit Access-Point und Client, sondern Geräte finden sich als Partner (Peer-to-Peer/P2P) zusammen und bilden Gruppen. Dabei wird auch immer ein Gruppeneigentümer (GO/Group-Owner) bestimmt, der technisch die Rolle des Access-Points übernimmt. Daher können auch Geräte, die kein Wifi-Direct können, einer solchen Gruppe beitreten.

Der einfachste Fall sind zwei Geräte, die sich miteinander verbinden – zum Beispiel Handy und Laptop oder Handy und Fotokamera oder Handy und Handy. Aber es können auch mehrere Geräte in einer Gruppe sein. Der Unterschied zum hierarchischen Modell mit Access-Point ist dabei, dass man auf dem Client nicht mehr den Zugang zum Netzwerk einrichtet, sondern ein Gerät wird vom Gruppeneigentümer oder einem Gruppenmitglied eingeladen und die Anmeldedaten zur Gruppe werden per WPS (Wifi Protected Setup) ausgetauscht. Die Berechtigung kann im einfachsten Fall über die Bestätigung per Knopfdruck (pbc/Push Button Configuration), etwas sicherer über einen PIN-Abgleich oder sehr komplex über NFC oder einen externen Vermittler (er/externel registrar) erfolgen; genauer Informationen gibt es im Dokument README-WPS (auch im Dateisystem unter /usr/share/doc/wpasupplicant/ zu finden).

Vorteile für IoT

Diese neue Form des Netzwerkaufbaus finde ich vor allem für IoT-Geräte sehr nützlich. An einem Drucker oder Fernseher kann man noch mit viel Mühe über eine primitive Eingabe einen Schlüssel (WPA-PSK/pre-shared key) eingeben, aber an einer Lampe oder einer Wetterstation schon nicht mehr. Wenn aber auf diesen Geräten die MAC-Adresse und eine PIN aufgedruckt sind, könnten diese Geräte sich nach dem Einschalten für einige Minuten auf die Suche nach Netzwerken begeben und vom Handy oder über die Weboberfläche vom Router aus könnte die Einladung mit PIN erfolgen.

Wenn die Suche nach Netzwerken nur nach dem Einschalten erfolgt, ist auch gewährleistet, dass der Initiator physischen Zugriff auf das Gerät hat und sich nicht einfach nur in der Umgebung aufhält. Ist eine Verbindung einmal konfiguriert, erfolgen keine neuen Versuche, so dass das Gerät nach einer bewussten Inbetriebnahme nicht übernommen werden kann. Ein Reset (ggf. inklusive des Löschens der Daten) könnte über einen Knopfdruck erfolgen oder bei einer LED-Lampe habe ich es schon mit fünfmaligem Ein- und Ausschalten binnen drei Sekunden gesehen.

Nutzung unter Linux

Ob ein Laptop Wifi-Direct unterstützt, kann man mit dem Befehl iw list (bei Debian im Paket iw) ermitteln. In dessen Ausgabe müssen bei Supported interface modes die Angaben P2P-client, P2P-GO oder P2P-device erscheinen. Unter Linux wird Wifi-Direct auch als P2P bezeichnet.

Unter Linux konfiguriert man Wifi-Direct mit wpa_supplicant. Ich nutze hierfür das Kommandozeilenprogramm wpa_cli, weshalb ich keine GUI-Programme im Folgenden beschreibe. Aufgrund der Zugriffsrechte kann es sein, dass wpa_cli mit sudo als Root gestartet werden muss. Durch die Konfiguration der neuen Verbindungen entstehen immer virtuelle WLAN-Geräte, deren Name mit p2p- beginnt. Deshalb sollte beim Aufruf von wpa_cli das Gerät angegeben werden, das man konfigurieren will: wpa_cli -i wlp59s0. Während der Ausführung kann man auch mit dem Befehl ifname das aktuelle Gerät und mit interface die Liste der verfügbaren Geräte anzeigen lassen und mit interface … das Gerät wechseln.

Es gibt auch noch ein Pseudogerät p2p-dev-…, bei dem mehr Meldungen zu den P2P-Vorgängen ausgegeben werden. Deshalb ist es das beste, alle Tätigkeiten von diesem Gerät aus zu starten: wpa_cli -i p2p-dev-wlp59s0.

Bei der Eingabe zu wpa_cli kann man mit help … die Kurzhilfe zu den Befehlen abfragen und auch mit Tabvervollständigung die Eingabe an einigen Stellen erleichtern.

Ersteinrichtung und Verbindung zwischen Linux-Laptop und Android

Zuerst der einfache Fall, bei dem der Linux-Laptop als Client und Android als GO (Gruppeneigentümer/Access-Point) fungiert. Der Einfachheit halber verwende ich auch keine PIN, sondern nur pbc, aber erkläre die PIN-Parameter dann im Abschnitt über p2p_connect.

Die Konfiguration von Wifi-Direct findet man bei Android über die Liste der verfügbaren WLANs und dort im Dreipunktemenü bei Erweitert. Dort sollte man im Dreipunktemenü als erstes mit Gerät umbenennen dem Gerät einen sinnvollen Namen geben. Ich habe meines einfach i9100 genannt. Mit der Zeit tauchen in der Liste verschiedene Geräte auf.

Unter Linux sollte man in der Konfiguration für wpa_supplicant mit dem Eintrag device_name=… dem Gerät einen sinnvollen Namen geben. Einmalig geht dies auch mit set device_name=zenbook bei wpa_cli.

  1. mit p2p_find 120 für zwei Minuten die Suche nach Geräten aktivieren, der Name des Laptops sollte auf dem Android-Handy erscheinen
  2. mit p2p_peers sich die Liste der gefundenen Geräte anzeigen lassen
  3. mit p2p_peer 8a:32:9b:26:83:4f sieht man die Informationen zum Gerät, u. a. device_name und manufacturer
  4. mit p2p_connect 8a:32:9b:26:83:4f pbc go_intent=0 die Verbindung aufbauen und am Handy den Aufbau bestätigen

Sollte der Verbindungsaufbau nicht funktionieren oder gar FAIL bei p2p_connect erscheinen, dann muss man bei den Geräteinformationen die Einträge age und flags prüfen. Die letzte Verbindung zum Gerät (age) sollte nur wenige Sekunden her sein und bei flags muss REPORTED stehen. Sollte dort PROBE_REQ_ONLY stehen, war die Erkennung nicht erfolgreich und mit p2p_find 120 sollte eine neue Suche gestartet werden.

Die Suche kann auch unbegrenzt ohne Zeitangabe durchgeführt werden und manuell mit p2p_stop_find beendet werden, wenn der gewünschte Partner gesichtet wurde.

Wenn der Verbindungsaufbau geklappt hat, kann man sich vom Handy per DHCP eine IPv4-Adresse holen oder mit ping -I p2p-wlp59s0-0 ip6-allnodes die IPv6-Adresse des Handys ermitteln.

Einstellungen für systemd-networkd

Für networkd habe ich als allgemeine Einstellung /etc/systemd/network/20-dhcp.network DHCP konfiguriert:

[Match]
Type=wlan ether

[Network]
DHCP=yes

Diese greift auch bei P2P-Verbindungen. Informationen kann man sich dann mit networkctl list und networkctl status p2p-wlp59s0-0 anzeigen lassen.

Der Linux-Laptop als GO mit Android

Wifi-Direct ermöglicht auch statische IP-Adressen oder auch nur mit IPv6 zu arbeiten. Aber bei Android (7.1/LineageOS 14.1) wird vorausgesetzt, dass der Gruppeneigentümer DHCP für IPv4 anbietet, sonst bleibt Android im Zustand »Eingeladen« und kappt die Verbindung nach etwa einer Minute wieder, obwohl die WLAN-Verbindung besteht.

Mit systemd-networkd kann man auch einen DHCP-Server mit Weiterleitung ins Internet einrichten:

[Match]
Type=wlan
WLANInterfaceType=p2p-go

[Network]
Address=10.42.42.1/24
DHCPServer=yes
IPForward=yes
IPMasquerade=yes

Der Verbindungsaufbau läuft dann wie folgt:

  1. mit wpa_cli die Suche starten: p2p_find 10
  2. wenn das Gerät gefunden wurde, dieses mit p2p_connect 02:37:6d:9e:ab:f3 pbc go_intent=15 einladen
  3. am Android die Einladung bestätigen

Liste von Befehlen für wpa_supplicant

  • p2p_find startet suche nach Geräten in der Umgebung, als Parameter kann auch eine Zeit in Sekunden angegeben werden, wie lange gesucht werden soll
  • p2p_stop_find beendet die Suche
  • p2p_peers listet die gefunden Geräte auf
  • p2p_peer 00:00:00:00:00:00 gibt Informationen zum Gerät 00:00:00:00:00:00 aus
  • p2p_flush löscht die Liste der bekannten Geräte und beendet die Suche
  • p2p_connect 00:00:00:00:00:00 pbc join Verbindung mit dem Master-Gerät 00:00:00:00:00:00 herstellen
  • p2p_group_remove p2p-wlp59s0-18 entfernt die Gerätegruppe vom Interface p2p-wlp59s0-18 (dieses kann mit interface ermittelt werden und sollte bei der Aktion nicht das aktuelle Interface (Befehl ifname) sein; ggf. mit interface wlp59s0 wechseln)
  • list_network zeigt für eine Netzwerkgruppe die WLAN-SSID an
  • wps_pbc auf dem Master für das Interface der Gruppe, um Verbindungen zu akzeptieren

flags=[REPORTED][NOT_YET_READY] PROBE_REQ_ONLY age=…

GO = Group Owner

• P2P Group • P2P Device • P2P Group Owner (GO) • P2P Client

WiFi Direct Configuration Scripts - Texas Instruments Wiki

p2p_connect

  • pbc: Knopfdruck, reine Bestätigung
  • mit PIN:

    • pin: wpa_supplicant generiert eine PIN und gibt diese aus
    • Eingabe einer PIN
    • keypad
    • display

      1. p2p_add_group [persistent]
      2. interface …
      3. set_network 0 ssid "…"
      4. set_network 0 psk "…" und p2p_get_passphrase
      5. wps_pbc oder wps_pin oder wps_pin PIN
      6. p2p_invite peer=…

pin display

  • wps_check_pin 1234
  • wps_pin get

  • p2p_connect … 1234|pin display: Am Handy muss die PIN eingegeben werden

  • p2p_connect … 1234|pin keypad: Am Handy wird die PIN angezeigt

    wps_pin 8a:32:9b:26:83:4f 43155408 p2p_prov_disc 8a:32:9b:26:83:4f keypad OK

mehrere Geräte

  1. p2p_connect … pbc go_intent=15 für Client 1
  2. ``

persistent

p2p_group_add persistent=… id des Netzwerks von list_networks