Canale WiFi 13 & 14 su Alpine Linux aka non posso connettermi al mio router aka configurazione crda

wireless-router

Riassunto

Durante lo sviluppo di un sistema di test embedded di sola lettura per una modifica della porta WLAN del Pi Zero WLAN che abbiamo fatto per un cliente, mi sono imbattuto in un problema interessante.

Il Pi Zero W ha improvvisamente smesso di connettersi al nostro router.

Dopo alcune indagini, sono riuscito a trovare la ragione e a risolvere il problema.

Il motivo: Domini normativi WLAN

In diversi paesi, diversi "canali" (= frequenze) WiFi sono disponibili per l'uso. 

Wikipedia ha una buona panoramica:

https://en.wikipedia.org/wiki/List_of_WLAN_channels#2.4_GHz_(802.11b/g/n)

Per 2,4 GHz i canali 12 e 13 non sono disponibili negli Stati Uniti, ma lo sono nella maggior parte degli altri paesi.

Se lasciate i vostri dispositivi WLAN / Raspberry Pi su impostazioni predefinite, essi assumeranno che non sono autorizzati a connettersi a questi canali. Non hanno modo di sapere dove sono finché non glielo dici, e quindi scelgono l'opzione sicura "worldwide" nel tuo interesse.

Se il tuo router, d'altra parte, è configurato sul canale 12 o 13, il tuo Raspberry Pi Zero W (o qualsiasi altro Pi, incluso il Pi 3 B+) non sarà in grado di vedere il tuo router.

Ma non ho impostato il mio router per utilizzare questo canale

Nemmeno io. Tutto funzionava bene fino alle 4 del mattino circa - poi il router ha improvvisamente deciso di passare a questo canale, dato che c'è meno interferenza da parte dei vicini.

Il vostro router potrebbe cambiare improvvisamente, e vi troverete a indagare su un problema difficile.

Come posso determinare se questo è il mio problema?

Utilizzare uno strumento di scansione WLAN.

Io uso inSSIDer per la casa. Purtroppo non sembra essere più gratuito, ma ci sono alternative là fuori.

immagine

Come potete vedere in questo screenshot la nostra rete usa canali 13 e 9. (Perché è una rete 802.11 n che usa il channel bonding per due canali di 20 MHz di larghezza).

Il canale 13 non è disponibile negli Stati Uniti, e quindi non sul Raspberry Pi di default.

La soluzione: CRDA

È necessario installare alcuni pacchetti, e impostarli in modo appropriato, per impostare il paese WiFi.

Su Raspbian, questo è molto facile e diretto, poiché tutti i pacchetti necessari sono stati preinstallati per voi.

Usate sudo raspi-config come strumento per impostare il paese WiFi.

Su Alpine Linux, è necessario un po' più di lavoro. Vi guiderò passo dopo passo in questo blogpost, per condividere ciò che ho imparato, e che mi ha richiesto circa un giorno intero di lavoro per imparare. Si spera che avrete finito in 20 minuti o meno.

Ci saranno altri post sul blog su Alpine Linux su Raspberry Pi, per ora ci concentriamo su questo specifico problema di connettività WiFi per i cittadini europei.

In esecuzione come root

Nel seguente tutorial, assumo che si eseguano le operazioni come utente radice.

Se non siete root, diventate root a seconda dei casi.

Una nota sul file system solo RAM di Alpine

Alpine Linux ha il grande vantaggio di poter essere eseguito completamente in sola lettura dalla scheda SD. Questo significa, per esempio, che è possibile scollegare il Raspberry Pi durante il funzionamento senza corrompere il file system.

Naturalmente ci deve essere la possibilità di applicare le vostre modifiche al sistema di base durante lo sviluppo.

Il comando è:

lbu commit -d

Importante: lbu commit potrebbe essere necessario essere impostato per salvare sottodirectory specifiche che vengono modificati (usando lbu include - fare riferimento al link qui sotto per i dettagli).

Fate riferimento alla pagina seguente per maggiori dettagli:

Impostare i repository

nota: per default solo vi è installato su Alpine Linux. Se vuoi aggiungere nano, usa il seguente comando:

apk aggiungere nano

Modifica i repository (cambia vi con nano se lo hai installato):

vi /etc/apk/repositories

Aggiungi/sostituisci quanto segue (leggi il commento in fondo per maggiori informazioni):

/media/mmcblk0p1/apks
http://dl-3.alpinelinux.org/alpine/edge/testing

http://dl-3.alpinelinux.org/alpine/edge/main

http://dl-3.alpinelinux.org/alpine/edge/community

Tutti e tre i repository di bordo sono necessari, poiché diversi pacchetti risiedono in diversi repository.

Installare i pacchetti necessari

Eseguite il seguente comando:

apk add wireless-regdb crda iw

Spiegazione:

  • wireless-regdb contiene i binari del database normativo wireless.
  • crda è lo strumento dello spazio utente che aggiorna le informazioni normative per il kernel
  • iw sono utilità di configurazione wireless, che userete per impostare il dominio normativo (paese)

Controllare il dominio normativo attuale

Corri:

iw reg get

Questo mostrerà il dominio corrente (molto probabilmente il paese 00: DFS-UNSET). Ecco uno screenshot di ciò a cui miriamo (nel nostro caso DE per la Germania):

immagine

Modifica delle regole di mdev

Di seguito, la posizione della nuova voce è molto importante - deve essere in cima, proprio prima di la linea $MODALIAS. Altrimenti questo non funzionerà!

vi /etc/mdev.conf

inserire la seguente nuova linea appena prima della linea $MODALIAS:

$COUNTRY=.. root:root 0660 */sbin/crda

Ecco uno screenshot del file modificato:

immagine

Riferimento:

Creare una nuova voce in modprobe.d

Corri:

toccare /etc/modprobe.d/cfg80211.conf

vi /etc/modprobe.d/cfg80211.conf

Inserite la seguente riga (se necessario adattate DE al vostro paese - codice di due lettere):

opzioni cfg80211 ieee80211_regdom=DE

Salvare il file.

Questo file assicurerà che il vostro dominio normativo sia applicato correttamente all'avvio.

Riferimento:

In alternativa: iw

In alternativa puoi impostare il dominio di regolamentazione usando iw (potrebbe essere necessario in aggiunta a quanto sopra? Il mio test mostra che questo non si attacca, però).

iw reg set DE

Ecco uno screenshot:

immagine

Finalizzare

Esegui (se necessario):

lbu commit -d

Riavviare. Il tuo Pi Zero W dovrebbe ora essere in grado di connettersi al canale 12 e al canale 13!

Una nota su crda

crda è non dovrebbe essere eseguito da voi, l'utente. Viene eseguito come applicazione di aiuto da iw.

Segue un hack rozzo che "potrebbe" funzionare durante il debug. Funziona, a volte. Raramente, in realtà.

iw reg set DE ; COUNTRY=DE /sbin/crda

spesso falliva per me con il seguente output:

non è riuscito a impostare il dominio di regolamentazione -22

Anche ora, dopo che posso impostare correttamente il paese, questo comando fallisce la maggior parte delle volte ... presumo che sia dovuto a condizioni di gara.

Per quanto ne so io, iw imposta alcune variabili d'ambiente, che a loro volta fanno sì che mdev esegua /sbin/crda, per inviare questi cambiamenti al kernel.

iw non è l'unico strumento che può cambiare il dominio di regolamentazione del kernel; anche wpa-supplicant dovrebbe essere in grado di farlo.

E, come avete visto, anche cfg80211.conf è in grado di farlo.

Il regulatory.bin è installato in /usr/lib/crda.

NON avete bisogno del pacchetto crda-dev per la soluzione descritta in questo post del blog.

Una nota sul file repository

Se rimuovete / commentate le fonti del repository che sono state aggiunte all'inizio, i pacchetti "spariscono" dal vostro sistema.

Avrò bisogno di indagare ulteriormente, dato che ho appena iniziato a lavorare con Alpine Linux.

Per ora, non rimuovere le linee del repository per i pacchetti che hai installato sul tuo sistema.