Zuwenig Sendeleistung mit TP-Link WLAN-Karte

Veröffentlicht am Autor geierb

Ich habe hier eine PCIe-WLAN-Karte vom Typ “TL-WDN4800” mit Atheros-AR9380-Chip.

Laut iw list sendet die Karte im 5 GHz-Band nur mit 17 dBm statt der erlaubten 20 dBm:

[...]
 Frequencies:
 * 5180 MHz [36] (17.0 dBm)
 * 5200 MHz [40] (17.0 dBm)
 * 5220 MHz [44] (17.0 dBm)
[...]

Ursache ist ein auf der Karte verbautes EEPROM, in das von TP-Link die Einsatzregion (Regdomain) geschrieben wurde, laut dmesg “AU”, also Australien:

[Sun Oct 28 18:56:19 2018] ath: EEPROM regdomain: 0x21
[Sun Oct 28 18:56:19 2018] ath: EEPROM indicates we should expect a direct regpair map
[Sun Oct 28 18:56:19 2018] ath: Country alpha2 being used: AU
[Sun Oct 28 18:56:19 2018] ath: Regpair used: 0x21

Mit iw reg get kann man sich das auch noch mal hübsch anzeigen lassen:

global
country 98: DFS-ETSI
        (2402 - 2482 @ 40), (N/A, 20), (N/A)
        (5170 - 5250 @ 80), (N/A, 17), (N/A), NO-OUTDOOR, AUTO-BW
        (5250 - 5330 @ 80), (N/A, 20), (0 ms), NO-OUTDOOR, DFS, AUTO-BW
        (5490 - 5710 @ 160), (N/A, 24), (0 ms), DFS
        (5735 - 5835 @ 80), (N/A, 13), (N/A)

phy#0
country AU: DFS-ETSI
        (2402 - 2482 @ 40), (N/A, 20), (N/A)
        (5170 - 5250 @ 80), (N/A, 17), (N/A), AUTO-BW
        (5250 - 5330 @ 80), (N/A, 24), (0 ms), DFS, AUTO-BW
        (5490 - 5710 @ 160), (N/A, 24), (0 ms), DFS
        (5735 - 5835 @ 80), (N/A, 30), (N/A)

Die Karte darf damit maximal so senden, wie es in Australien erlaubt ist: Bei 5 GHz maximal 17 dBm. Und da ich in Deutschland bin, gilt die zusätzliche Einschränkung, die Deutschen Vorschriften nicht zu überschreiten. Die Karte wird also so senden, dass sie die Vorschriften beider Länder einhält. In der wireless-regdb kann man nachlesen, welche das genau sind.

Wie werde ich nun Australien mit all seinen Einschränkungen los?

Erster Versuch: EEPROM ändern.

http://blog.asiantuntijakaveri.fi/2014/08/one-of-my-atheros-ar9280-minipcie-cards.html und da https://blog.aheymans.xyz/2018/01/02/ath9k_eeprom/ wird beschrieben, wie man das EEPROM ausliest, die Regdomain ändert und dann wieder auf die Karte schreibt. Im Github-Repository https://github.com/andyvand/AtherosROMKit gibt’s im Verzeichnis “MacNB_iwleeprom” sogar ein gepatchtes iwleeprom-Programm, das das in einem Rutsch erledigt.

Nur funktioniert das leider mit Chips der AR9300-Reihe nicht, das EEPROM bleibt wie es ist.

Zweiter Versuch: EEPROM ignorieren.

Oben in der dmesg-Ausgabe sieht man, dass das ath-Modul das EEPROM ausliest. Die Länder-zu-Frequenzen-und-Sendeleistungs-Zuordnung macht das Kernelmodul cfg80211.

Für ath9k gibt zwar einen EEPROM-Ignorieren-Patch, nur müsste ich dazu jedes Mal den hübschen Debian-Kernel neu kompilieren. Das ist mir für ein paar dBm mehr Sendeleistung zu aufwändig.

Ein OpenWRT-Entwickler hat ein Tool geschrieben, das die kompilierten(!) Kernelmodul patcht und die Vorgaben zumindest etwas aufweicht: https://github.com/drizzt/reghack.git:

Aus ath9k werden die Einschränkungen zu Radar entfernt, aus cfg80211 die gröbsten Beschränkungen der Länder bei Frequenzen und Sendeleistung.

Aber: Unter Debian kann das Tool nur ath9k patchen, cfg80211 bleibt so wie es ist. In Australien.

Dritter Versuch: Australien ändern.

Welche Regeln in Australien gelten weiß der Linux-Kernel von crda (“central regulatory domain agent”). Crda sieht wiederum in einer kleinen Datenbank, der wireless regulatory database, kurz wireless-regdb nach, in der sämtliche Länder mit deren Vorgaben gespeichert sind. Wenn ich hier die deutschen Vorgaben Australien unterschiebe, müsste es also passen:

  1. Quellcode von wireless-regdb holen: apt-get source wireless-regdb
  2. cd wireless-regdb-2016.06.10
  3. Die Datei “db.txt” mit einem Editor öffnen und alles, was im Eintrag zu “country AU” steht löschen und durch alles, was im Eintrag zu “country DE” steht, ersetzen.
  4. Die wirless-regdb muss mit einem Schlüssel signiert werden, also schnell ein Schlüsselpaar erstellen: openssl genrsa -out ~/.wireless-regdb-root.key.priv.pem 2048
  5. Den öffentlichen Schlüssel als extra Datei speichern: openssl rsa -in ~/.wireless-regdb-root.key.priv.pem -out root.key.pub.pem -pubout -outform PEM
  6. Ein Pythonmodul wird noch gebraucht: apt-get install python-m2crypto
  7. Die wireless-regdb ins Binärformat umwandeln: make
  8. Alles an die richtigen Stellen kopieren: cp root.key.pub.pem /lib/crda/pubkeys; cp regulatory.bin /lib/crda
  9. Aktivieren: COUNTRY=AU crda (wenn “nl80211 not found” kommt muss das cfg80211-Modul geladen werden, im Erfolgsfall gibt’s keine Ausgabe)
  10. Testen: iw list
    [...]
     Frequencies:
     * 5180 MHz [36] (20.0 dBm)
     * 5200 MHz [40] (20.0 dBm)
     * 5220 MHz [44] (20.0 dBm)
    [...]
  11. Hurra!

Die selbstgebastelte Datei “regulatory.bin” am Besten irgendwo sichern, da ein Update des wireless-regdb-Pakets sie überschreibt. Zum Glück wird dieses Paket nur seltenst aktualisiert, und man kann es in aptitude zusätzlich noch auf “hold” setzen und damit von automatischen Updates ausschließen: aptitude hold wireless-regdb

 

Update:

Ich sehe gerade dass das auch im Debian-Wiki beschrieben ist: https://wiki.debianforum.de/Ausl%C3%A4ndische_WLan-Karte_mit_deutschen_Kan%C3%A4len_betreiben