====== 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. |