====== WiFi con Linux e adattatori PC-Card o USB ======
Appunti sul funzionamento di alcuni adattatori WiFi PC-Card e USB su Debian Etch GNU/Linux kernel 2.6.18. Argomenti interessanti:
* Compatibilità: kernel Linux standard, moduli kernel extra, driver Windows con NDIS wrapper.
* Possibilità di crittografia WEP e WPA.
* Compatibilità con programmi di monitoraggio **[[http://www.kismetwireless.net/|Kismet]]**, **[[http://www.swscanner.org/|SWScanner]]** e **[[wifi_wavemon|Wavemon]]**.
^ Hardware ^ Driver ^ Mode Managed ^ Mode Master ^ WEP encryption ^ WPA key negotiation ^ Use as Kismet source ^ [[wifi#iwlist|iwlist signal/noise monitor]] ^
| Sitecom USB 54g Turbo WL-172 | **rt73usb** Linux kernel module | Yes | | Yes (104 bit) | WPA-PSK via iwpriv, EAPOL 1 and 2 | rt2500 | **Not in scanning mode** (iwlist or SWScanner). Quality and Signal level are reported by iwconfig only when **associated** to an AP. |
| Avaya Wireless PC Card ETS (Gold) | **orinoco** Linux kernel module | Yes | | Yes (104 bit) | No | orinoco_14 | |
| Avaya Wireless PC Card ETS (Gold) | Windows ndis driver | No | | No | No | No | |
| U.S. Robotics 22 Mbps Wireless PC Card (USR2210) | **acx** kernel module by acx100.sourceforge.net | No | | No | No | No | |
| U.S. Robotics 22 Mbps Wireless PC Card (USR2210) | Windows ndis driver | Yes | | Yes (104 bit) | No | No | |
| Leaptek WiFi USB | **zd1211rw** Linux kernel module | Yes | No | | | zd1211 (not reliable) | Quality and RSSI Signal level (poor resolution) |
| Intel Corporation PRO/Wireless 2200BG | **ipw2200** | Yes | | | | ipw2200 (no signal levels) | Quality and Signal level |
===== Sitecom Wireless Network USB Adapter 54g Turbo WL-172 =====
The USB stick is detected by the Linux kernel as follows:
# lsusb
Bus 001 Device 002: ID 0df6:90ac Sitecom Europe B.V.
A kind guy from the Sitecom support - whose name is Ivan - told me that the WiFi chip inside is a Ralink rt2561, I'm not very sure of this: as far I know the rt2561 chip is found on PCI and PC-Card adapters, where **USB adapters** mount the **rt2573** chip.
==== Kernel modules rt2x00 ====
**NOTE** wireless modules **rt2x00** are now in the vanilla kernel (at least in 2.6.26). We use the **''rt73usb''** one.
Compiling this modules requires the **the source tree of your running kernel**, and the relative **kernel headers**. In Debian this menas installing two packages: **linux-source-$(uname -r | cut -f1 -d-)** and **linux-headers-$(uname -r)**.
We tried the driver from the **[[http://rt2x00.serialmonkey.com/|rt2x00 Open Source Project]]**. This driver is not part of the vanilla Linux kernel, but it compiles with version 2.6.17 (we succeeded with 2.6.18).
Initially we tried the experimental **unified driver rt2x00**, which includes several kernel modules for rt2400pci, rt2500pci, rt2500usb, rt61 and rt73usb, but we was unable to compile it. We set ''CONFIG_RT2X00_DEBUGFS=n'' into the ''config'' file because in our kernel ''CONFIG_DEBUG_FS'' is not set, after the ''make'' we got a fatal **error: expected specifier-qualifier-list before ‘irq_handler_t’**.
So next we tried the **specific rt73** driver from the [[http://rt2x00.serialmonkey.com/rt73-cvs-daily.tar.gz|daily CVS tarball]] (here a **{{.:wifi:rt73-cvs-daily.tar.gz|local copy}}** dated 2007-03-27), this time the compile succeeded:
wget http://rt2x00.serialmonkey.com/rt73-cvs-daily.tar.gz
tar zxf rt73-cvs-daily.tar.gz
chown -R root.root rt73-cvs-2007030410
cd rt73-cvs-2007030410/Module
make
When the wireless interface is activated, the **rt73.ko** kernel module searches for two files: the firmware **rt73.bin** to be uploaded to the adapter and the default configuration file **rt73sta.dat**. Both files are expected to be into the **''/etc/Wireless/RT73STA/''** directory. This directory name is quite odd, we prefer **''/usr/local/lib/firmware/''** and some symbolic links:
mkdir -p /usr/local/lib/firmware
mkdir -p /etc/Wireless/RT73STA
cp -p rt73.bin /usr/local/lib/firmware
cp -p rt73sta.dat /usr/local/lib/firmware
chmod 640 /usr/local/lib/firmware/rt73sta.dat
ln -s /usr/local/lib/firmware/rt73.bin /etc/Wireless/RT73STA/rt73.bin
ln -s /usr/local/lib/firmware/rt73sta.dat /etc/Wireless/RT73STA/rt73sta.dat
Finally we installed the kernel module:
make install
This install the file **''/lib/modules/2.6.18/extra/rt73.ko''**, run the command **''depmod''** and add a file **''/etc/modprobe.conf''** containing this line:
alias ra0 rt73
Because this alias is rather useless, we removed it.
==== Mode Managed ====
Using the WiFi adapter in Managed mode is as simple as issuing:
modprobe rt73
ifconfig rausb0 up
iwconfig rausb0 essid any mode managed key 's:wep_secret'
The driver supports WEP keys of **40** or **104** bits (5 or 13 characters), as reported by **''iwlist''**:
# iwlist rausb0 encryption
rausb0 2 key sizes : 40, 104bits
4 keys available :
[1]: 3892-0604-F842-8032-D771-00AE-63 (104 bits)
[2]: off
[3]: off
[4]: off
Current Transmit Key: [1]
==== WPA key management ====
See this **[[http://www.hwupgrade.it/forum/showthread.php?t=1132453|excellent post]]**.
This driver supports the WPA key management with WPA-PSK (pre-shared key) **without the need of the wpa_supplicant utility**. We must provide the WPA configuration via the **rt73sta.dat** configuration file or using the **iwpriv** command: refer to the **''iwpriv_usage.txt''** file included into the driver tarball for options that can be specified in both ways.
For a WPA connection, set at least the following options into rt73sta.dat before activating the interface:
SSID=my_ssid
NetworkType=Infra
AuthMode=WPAPSK
EncrypType=TKIP
WPAPSK=wpa_secret
Note that **Infrastructure** is an alias for **Managed** mode. Alternatively, run the following commands directly or through a shell script:
modprobe rt73
ifconfig rausb0 up
iwpriv rausb0 set NetworkType=Infra
iwpriv rausb0 set AuthMode=WPAPSK
iwpriv rausb0 set EncrypType=TKIP
iwpriv rausb0 set SSID=my_ssid
iwpriv rausb0 set WPAPSK=wpa_secret
The negotiated key seems to be 256 bits:
# iwlist rausb0 key
rausb0 2 key sizes : 40, 104bits
4 keys available :
[1]: 95CB-3C00-EBDE-4296-4037-6A56-CCCF-561E-7A43-A328-9A03-A5AD-3010-A33E-EC99-DCAD (256 bits)
[2]: EC3E-59AB-3B48-9708-7693-A1BE-4487-3E4B-3D0C-286D-82D7-928A-B538-500A-BFD7-3AD1 (256 bits)
[3]: off
[4]: off
Current Transmit Key: [1]
**There was a problem** in the rt73 driver before 2007-03-21 with access points that announce - in their [[wp>IEEE_802.11|802.1x]] frames - an Extensible Authentication Protocol over LAN (**[[wp>Extensible_Authentication_Protocol|EAPOL]]**) version different than **1**. This is the case - for example - of many access points based on embedded Linux and the **[[http://hostap.epitest.fi/|hostap]]** program, which currently announces EAPOL version **2**.
It should be responsability of the client (the supplicant) to manage different EAPOL versions, but early versions of the driver had a **''#define EAPOL_VER 1''**. In more recent snapshots the problem is solved.
==== Kismet and rfmon mode ====
The adapter works fine also in **rfmon** mode (a special mode that reports all packets the wireless card sees, including management packets and packets from any network the radio can see). So Kismet can works with it, just configure the source as a Ralink 2500 into **''/etc/kismet/kismet.conf''**:
source=rt2500,rausb0,rausb0
===== Avaya Wireless PC Card ETS (Gold) =====
==== Driver nativi kernel ====
**Funziona** almeno in modalità **managed** e con **crittografia WEP**, purtroppo **non funziona la crittografia WPA** perché non supportata dal modulo kernel.
Con la scheda Avaya si utilizzano i moduli nativi del kernel **orinoco**, **orinoco_cs** e **hermes**. La scheda viene riconosciuta correttamente, l'hotswap può essere forzato con **''pccardctl {insert|eject}''**.
Per attivare la scheda non è necessario alcun firmware, si usa un comando del tipo:
pccardctl insert
iwconfig eth1 essid any mode Managed key off
ifup eth1
==== Driver Windows con ndiswrapper ====
**Non funziona**: la scheda non viene riconosciuta come periferica PCI e non viene evidenziata da **''lspci -n''**.
Il tentativo (fallito) di caricare il driver Windows con ndiswrapper prevede di mettere in blacklist i moduli nativi del kernel e mettere un alias per il device **wlan0** che carichi ndiswrapper:
cat >> /etc/modprobe.d/ndiswrapper << EOF
alias wlan0 ndiswrapper
blacklist orinoco_cs
blacklist orinoco
blacklist hermes
EOF
reboot
A questo punto si lancia ndiswrapper indicando il file **.INF** da caricare, ma si ha un errore:
ndiswrapper -i WLAGS48B.INF
ndiswrapper -l
wlags48b invalid driver!
modprobe wlan0
===== U.S. Robotics 22 Mbps Wireless PC Card (USR2210) =====
Questa scheda dovrebbe essere basata sul chip **Texas Instruments (TI) ACX100**.
==== Driver Windows con ndiswrapper ====
**Funziona** almeno in modalità managed, **non funziona la crittografia WPA**. Quando la scheda è inserita viene vista come periferica PCI:
pccardctl insert
lspci -n
...
05:00.0 0280: 104c:8400
Si è scaricato il driver per Windows XP **{{.:wifi:usr03_307_v3.0.0.0_4x.tar.gz|USR03_307_v3.0.0.0_4x}}** fornito dal sito ufficale U.S. Robotics. Per scompattare l'archivio autoinstallante si è usato ''cabestract'' e ''unshield'', quindi in una stessa directory (es: ''/lib/firmware/usrwlan/'') si sono radunati tutti i driver ed il file .INF per Windows XP:
* RADIO0d.BIN
* RADIO11.BIN
* USRWLAN.CAT
* USRWLAN.INF
* USRWLAN.SYS
* WLANGEN.BIN
A questo punto si esegue:
ndiswrapper -i USRWLAN.INF
ndiswrapper -l
installed drivers:
usrwlan driver installed, hardware (104C:8400) present
Si verifica che **wlan0** sia un alias di **ndiswrapper** in ''/etc/modprobe.d/ndiswrapper''
alias wlan0 ndiswrapper
quindi si carica il modulo e si configura la periferica WiFi:
modprobe wlan0
ifconfig wlan0 up
iwconfig wlan0 essid any mode Managed key s:wep_secret key open
ifup wlan0
Appena rilevato l'access point, la scheda viene automaticamente configurata:
# iwconfig wlan0
wlan0 IEEE 802.11b ESSID:"default"
Mode:Managed Frequency:2.437 GHz Access Point: 00:0D:88:F2:7D:CE
Bit Rate:22 Mb/s Tx-Power:0 dBm Sensitivity=0/3
RTS thr:4096 B Fragment thr:4095 B
Encryption key:3132-3334-3536-3738-3930-3132-33 Security mode:open
Power Management:off
Link Quality:71/100 Signal level:-50 dBm Noise level:-96 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Pare che la crittografia WPA non sia supportata dal driver Windows: appena si carica il modulo, dentro **kern.log** si legge:
ndiswrapper version 1.28 loaded (preempt=no,smp=no)
ndiswrapper: driver usrwlan (U.S.Robotics,02/25/2003,3.0.0.0) loaded
PCI: Enabling device 0000:05:00.0 (0000 -> 0003)
ndiswrapper: using IRQ 9
wlan0: vendor: 'USR 22M WLAN Adapter'
wlan0: ethernet device 00:c0:49:a7:b0:9e using NDIS driver usrwlan, 104C:8400.5.conf
wlan0: encryption modes supported: none
usbcore: registered new driver ndiswrapper
Il tentativo (fallito) di usare WPA:
wpa_passphrase MyPlace 8702024407 > /etc/wpa_supplicant.conf
wpa_supplicant -Dndiswrapper -iwlan0 -dd -c /etc/wpa_supplicant.conf
...
...
Selecting BSS from priority group 0
0: 00:18:84:20:a3:2a ssid='MyPlace' wpa_ie_len=0 rsn_ie_len=0 caps=0x11
skip - no WPA/RSN IE
1: 00:18:84:20:a3:29 ssid='FON_AP' wpa_ie_len=0 rsn_ie_len=0 caps=0x1
skip - no WPA/RSN IE
No suitable AP found.
Il problema dell'accesso WPA rimane anche con i driver WindowsXP **dwl650+_drivers_307** della scheda D-Link DWL 650+, basata sullo stesso chip. Pare che i driver per Windows supportino WPA, ma dopo averli caricati con ndiswrapper (il driver si chiama **airplus**) l'esecuzuione di ''wpa_supplicant'' restituisce:
Driver does not support WPA.
==== Driver kernel open source ====
**Non funziona**. Si sono provati i driver **{{.:wifi:acx-20070101.tar.gz|acx-20070101}}** per kernel 2.6.x (sito di riferimento [[http://acx100.sourceforge.net/|acx100.sourceforge.net]]), ma non inclusi nel kernel ufficiale.
Compilati dentro ''/usr/src/linux/'' come da istruzioni.
Il firmware è stato preso dall'archivio dei driver Windows di cui sopra, sono stati utilizzati due file: quello generico per il chip ACX100 e quello specifico per il tipo di radio (il tipo di radio viene rilevato al caricamento del modulo **''acx.ko''**).
cp DrvXP/WLANGEN.BIN /lib/firmware/tiacx100
cp DrvXP/RADIO11.BIN /lib/firmware/tiacx100r11
insmod /usr/src/linux/drivers/net/wireless/acx/acx.ko
Il kernel fornisce messaggi positivi, purtroppo però **non funziona** neanche in modalità managed senza crittografia.
===== Leaptek WiFi USB (zd1211b chip) =====
Adattatore WiFi USB basato sul chip ZyDAS ZD1211B. Utilizza il modulo kernel **zd1211rw**, ha bisogno di una copia del {{.:wifi:zd1211-1.3.tar.gz|firmware}} nella directory **''/lib/firmware/zd1211/''**.
Dopo aver inserito l'adattatore nella porta USB questi i messaggi mostrati da ''dmesg'':
usb 3-1: new high speed USB device using ehci_hcd and address 10
usb 3-1: configuration #1 chosen from 1 choice
zd1211rw 3-1:1.0: firmware version 4725
zd1211rw 3-1:1.0: zd1211b chip 0ace:1215 v4810 high 00-02-72 AL2230_RF pa0 g--
zd1211rw 3-1:1.0: eth1
Poi è possibile attivare l'interfaccia, effettuare lo scanning, ecc:
# ifconfig eth1 up
# iwconfig eth1
eth1 802.11g zd1211 ESSID:off/any
Mode:Managed Frequency:2.472 GHz Access Point: Invalid
Bit Rate=1 Mb/s
Encryption key:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
# iwlist eth1 scanning
eth1 Scan completed :
Cell 01 - Address: 00:18:0A:01:3E:39
ESSID:"MyWIFI"
Protocol:IEEE 802.11bg
Mode:Master
Channel:5
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
48 Mb/s; 54 Mb/s
Quality=100/100 Signal level=100/100
Extra: Last beacon: 490ms ago
Cell 02 - Address: 00:C0:49:A6:9C:14
ESSID:"pipnet"
Protocol:IEEE 802.11b
Mode:Master
Channel:5
Encryption key:on
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 22 Mb/s
Quality=100/100 Signal level=100/100
Extra: Last beacon: 570ms ago
Cell 03 - Address: 00:13:46:A0:2C:09
ESSID:"tnle"
Protocol:IEEE 802.11b
Channel:13
Encryption key:off
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 22 Mb/s
Quality=100/100 Signal level=47/100
Extra: Last beacon: 1090ms ago
Con il modulo **zd1211rw** del kernel 2.6.26 vengono attivati due device, un **wmaster0** (l'interfaccia //fisica//) e un **''wlan0_rename''** (l'interfaccia logica WiFi da usare con ''iwconfig'' e ''ifconfig''). Per dare un nome umano al device conviene aggiungere una riga in **''/etc/udev/rules.d/70-persistent-net.rules''**, per effettuare il match non basta il MAC address, serve anche **''ATTR{type}=="1"''**:
# USB device 0ace:1215 ZyDAS WLA-54L WiFi
SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="00:1a:ff:01:4b:2e", ATTR{type}=="1", NAME="eth2"
====== WiFi Management Tools ======
Esistono alcuni tool grafici per gestire lato utente le connessioni WiFi, in generale sono interfacce grafiche ai comandi **''iwlist''**, **''iwconfig''**, **''ifconfig''**, **''dhclient''**, ecc. Ecco una tabella comparativa:
^ [[http://www.gnome.org/projects/NetworkManager/|NetworkManager]] | È l'applet predefinita dell'ambiente Gnome, intende gestire sia le connessioni Ethernet che WiFi. Architettura client/server: **knetworkmanager** è il client per KDE. Secondo me cerca di fare troppe cose in automatico e mi pare che gli automatismi non siano disattivabili. Esegue continuamente lo scanning cambiando eventualmente la connessione al volo. Comoda la possibilità di essere eseguito dall'utente non privilegiato, basta che appartenga al gruppo **netdev**. |
^ [[http://w1.fi/wpa_supplicant/|wpa_gui]] | **wpa_supplicant** può essere usato come demone con i client **wpa_gui** e **wpa_cli** per gestire tutte le connessioni WiFi, non solo quelle WPA. È possibile La gestione da parte di utenti non privilegiati che appartengono ad un determinato gruppo (parametro **ctrl_interface GROUP** in **wpa_supplicant.conf**). È possibile anche permettere agli utenti il salvataggio delle impostazioni a livello globale (es. aggiunta di nuove reti) mettendo **update_config=1** nel file di configurazione; forse era meglio un file personalizzato per ogni utente, come fa NetworkManager. |
^ [[http://wicd.sourceforge.net/|wicd]] | Si presenta come progetto nuovo, agnostico rispetto al Desktop Environment, gestisce connessioni wired e WiFi, WEP e WPA, dispone di applet per systray. Pare che ancora non sia pacchettizato Debian. |
^ [[http://docs.kde.org/kde3/en/kdenetwork/kwifimanager/index.html|kwifimanager]] | Ben integrato con KDE, sarebbe buono, peccato che non supporti le connessioni WPA! Per effettuare operazioni privilegiate chiede la password di root. |
^ [[http://wifi-radar.systemimager.org/|wifi-radar]] | Anche questo tool non supporta del tutto WPA, ad esempio la PSK deve essere inserita manualmente in **wpa_supplicant.conf**. Inoltre effettua una continua scansione delle reti WiFi, consumando batteria e risorse. |