DWL 500/650 et DWL 1000AP sous Debian
Auteur: Olivier Garet, version du 18 août 2002
Adresse électronique: Olivier.Garet@univ-orleans.fr
Cette page ne veut pas faire doublon avec les
documentations bien écrites qui existent déjà.
Elle pointe certains problèmes rencontrés sur un matériel précis et expose
les solutions trouvées.
Description du matériel
Le DWL 1000AP est un pont entre le réseau filaire éthernet et le réseau
sans fil.
C'est une solution assez économique (à peu près 200 euros) lorsqu'on possède
déjà un routeur (un "vrai" ou un PC).
Points faibles: ne peut se connecter directement sans fil à un autre AP,
support Linux non officiel.
Le DWL 650 est une carte PCMCIA basée sur un chipset Prism 2.x.
C'est une solution assez économique (à peu près 100 euros), le chipset
est de bonne qualité, bien reconnu et permet
même d'émuler une base.
Point faible: pas de connecteurs pour antenne prévu, mais c'est possible
pour un bidouilleur, voir http://theblackmoor.net/dlink.shtml.
Le DWL 500 est un kit composé d'une carte DWL 650 et d'un adaptateur PCI
(chipset Ricoh) dans lequel on insère la carte
DWL 650.
Attention ! La carte PCI monobloc DWL 520 n'est pas équivalente au DWL 500.
En particulier, elle ne fonctionne que si votre carte mère accepte les cartes
de type 2.2.
On peut acheter (à peu près 300 euros) le kit DWL 905 qui comprend un DWL
1000AP et deux cartes DWL 650.
La base: DWL 1000AP sous Linux
Johan Almqvist a écrit un script permettant de configurer l'AP sous Linux.
Configurateur
de Johan Almqvist
Le projet est à ses débuts: les adresses sont codées en dur dans le script.
Je me suis donc inspiré de son programme pour écrire ce petit script
dwl1000ap_set permettant de configurer les paramètres
réseaux de l'AP (adresse IP, masque de réseau, passerelle).
La syntaxe du programme est simple
dwl1000ap_set [arguments] Adresse_MAC (où Adresse_MAC est sous la forme
xx:xx:xx:xx:xx:xx)
Arguments possibles:
i=adresse IP (par défaut 10.0.0.100)
g=gateway (par défaut 10.0.0.138)
m=masque (par défaut 255.0.0.0)
Si tout va bien, le programme revoie le message "0 but true".
Ces programmes sont en Perl. Ils nécessitent le module SNMP pour perl.
( faire apt-get install libsnmp-perl )
Une fois la configuration basique du réseau faite, les paramètres wireless
(nom de l'AP, canal, sécurité) peuvent être changés par une interface Web,
simplement accessible à partir de l'adresse IP .
Pour configurer le DWL 1000AP, on peut opérer ainsi
Etape 1: Relier le DWL 1000AP par cable éthernet avec votre
réseau filaire (directement à un ordinateur par un cable croisé, ou à un
hub par un cable droit).
Etape 2: Si votre réseau filaire comporte un serveur DHCP
Aller lire à l'arrière du DWL 1000AP son adresse MAC et
dire au serveur DHCP quelle adresse IP doit être attribuée cette adresse
MAC.
Raccorder le DWL 1000AP au secteur.
Attention à la syntaxe de l'adresse MAC: sur mon Alcatel Speedtouch, j'ai
du donner l'adresse 01:xx:xx:xx:xx:xx:xx, et non xx:xx:xx:xx:xx:xx).
Etape 2: Si votre réseau filaire ne comporte pas de serveur
DHCP
Raccorder le DWL 1000AP au secteur. Aller lire à l'arrière
du DWL 1000AP son adresse MAC et configurer les paramètres réseau grâce au
script dwl1000ap_set .
Etape 3: Terminer la configuration à l'aide de l'interface
web accessible à l'adresse IP que vous avez choisie.
Remarque: si vous avez un serveur DHCP et que votre réseau comporte des
machines qui ne font pas appel à DHCP pour choisir leur numéro IP, alors
il est impératif de configurer le serveur DHCP pour l'adresse MAC du DWL
1000AP, sinon le DHCP va finir par lui attribuer une mauvaise adresse et
vous aurez des conflits, qu'un dwl1000ap_set ne réglerait
que temporairement.
Les cartes : DWL 650 et DWL 500 sous Linux
Matériel et logiciels utilisés
carte
|
ordinateur
|
Distribution
|
version de pcmcia_cs
|
version de linux-wlan-ng
|
DWL 650
|
Sony Vaio PCG-FX 201
|
Debian testing (Sarge) 14 août 2002
|
pcmcia-cs_3.1.34-5
|
linux-wlan-ng-0.1.13-pre4
|
DWL 500
|
Continental Edison Evolution VN1034
|
Debian Woody 3.0
|
pcmcia-cs_3.1.33-6
|
linux-wlan-ng-0.1.13-pre4
|
Documents utiles à l'installation et à la configuration du DWL 500/650
source pour linux-wlan-ng : ftp://ftp.linux-wlan.org/pub/linux-wlan-ng/
Debian
Link-sys WPC11 Mini-HOWTO (Gerardo Arnaez)
On peut reproduire quasiment pas à pas la procédure proposée dans
ce document.
Au moment de la compilation de linux-wlan-ng,
il faut savoir que le driver nécessaire au DWL 500 comme au DWL 650 est prism2_cs
(et pas prism2_pci ou prism2_plx). Si vous faites des erreurs dans vos choix
de module de noyau et que vous devez en recompiler un, pensez à faire un
make-kpkg clean avant.
Important: il est très utile d'avoir un noyau compilé avec le support
ACPI.
En effet, ce dernier permet parfois de pallier partiellement des défaillances
du BIOS,
en particulier en ce qui concerne la gestion des IRQ.
Le document ci-dessus suppose que vous avez un serveur DHCP sur le réseau.
Si vous n'en avez pas ou que vous souhaitez avoir une adresse IP
fixe, ignorez tout ce qui concerne pump. Il vous faudra configurer les fichiers
/etc/pcmcia/network.opts (adresse IP, masque,..)
/etc/pcmcia/wireless.opts (nom du réseau Wireless à contacter, canal)
/etc/pcmcia/wlan-ng.opts (nom du réseau Wireless à contacter, canal)
Même si la structure de ces fichiers est assez transparente, la
page ci-dessous peut aussi être utile.
Réseaux sans
fil avec Linux (DaniRC)
Si ça ne marche pas, il FAUT lire ça
Linux
PCMCIA HOWTO (David Hints)
et plus particulièrement Linux
PCMCIA HOWTO: Advanced topics
Problème rencontré et solution
J'ai rencontré le problème suivant lors de l'installation d'un DWL 500.
Tout semble se lancer correctement, mais un ping ailleurs que sur soi-même
reste
dans le vide et l'on a dans les logs (par exemple en faisant dmesg)
"p80211knetdev_hard_start_xmit: Tx attempt prior to association,
frame dropped."
Avec un cat /proc/interrupts , on voit un
truc pas normal:
CPU0
0: 34602 IO-APIC-edge timer
1: 638 IO-APIC-edge keyboard
2: 0 XT-PIC cascade
3: 0 IO-APIC-edge prism2_cs
5: 20 IO-APIC-edge usb-uhci, usb-uhci
9: 0 IO-APIC-level acpi
10: 0 IO-APIC-edge via82cxxx
12: 1644 IO-APIC-edge PS/2 Mouse
14: 6657 IO-APIC-edge ide0
15: 4 IO-APIC-edge ide1
19: 7655012 IO-APIC-level i82365
NMI: 0
LOC: 34556
ERR: 0
MIS: 0
En effet, on voit que le support PCMCIA ( i82365) est très sollicité
(7655012 !), alors que le module gérant la carte PCMCIA (prism2_cs) ne voit
rien passer.
On en déduit que ces deux là on du mal à communiquer.
Qu'à cela ne tienne, nous allons leur expliquer comment se trouver:
il suffit (!) de passer la bonne option dans le bon fichier.
Solution 1
On édite /etc/default/pcmcia
# Defaults for pcmcia (sourced by /etc/init.d/pcmcia)
PCMCIA=yes
PCIC=i82365
PCIC_OPTS="irq_list=19"
CORE_OPTS=
CARDMGR_OPTS=
On relance le tout: /usr/sbin/pcmcia restart
et maintenant
cat /proc/interrupts donne
CPU0
0: 21894 IO-APIC-edge timer
1: 276 IO-APIC-edge keyboard
2: 0 XT-PIC cascade
5: 19 IO-APIC-edge usb-uhci, usb-uhci
9: 0 IO-APIC-level acpi
10: 0 IO-APIC-edge via82cxxx
12: 405 IO-APIC-edge PS/2 Mouse
14: 5529 IO-APIC-edge ide0
15: 4 IO-APIC-edge ide1
19: 18 IO-APIC-level i82365, prism2_cs
NMI: 0
LOC: 21849
ERR: 0
MIS: 0
Et tout marche normalement...
Solution 2
Après avoir (difficilement) trouvé la première solution, j'ai trouvé cette
deuxième solution sur http://www.pccard.co.uk/support/pfaq/plinux.php
comme étant préconisée sur les Texas Instruments.
Je ne suis pas sûr de tout comprendre, mais ça marche.
On édite /etc/default/pcmcia
# Defaults for pcmcia (sourced by /etc/init.d/pcmcia)
PCMCIA=yes
PCIC=i82365
PCIC_OPTS="irq_mode=0 pci_csc=0 "
CORE_OPTS=
CARDMGR_OPTS=
On relance le tout: /usr/sbin/pcmcia restart
et maintenant
cat /proc/interrupts donne
CPU0
0: 35958 IO-APIC-edge timer
1: 5 IO-APIC-edge keyboard
2: 0 XT-PIC cascade
5: 229 IO-APIC-edge usb-uhci, usb-uhci
9: 0 IO-APIC-level acpi
10: 0 IO-APIC-edge via82cxxx
12: 6 IO-APIC-edge PS/2 Mouse
14: 4047 IO-APIC-edge ide0
15: 4 IO-APIC-edge ide1
19: 229 IO-APIC-level prism2_cs
NMI: 0
LOC: 35912
ERR: 0
MIS: 0
Et là encore, tout marche normalement
Tentatives d'explication
On voit que l'ACPI comble des manques dans la table de routage.
IOAPIC[0]: Set PCI routing entry (2-16 -> 0xa9 -> IRQ 16)
00:00:01[A] -> 2-16 -> vector 0xa9 -> IRQ 16
IOAPIC[0]: Set PCI routing entry (2-17 -> 0xb1 -> IRQ 17)
00:00:01[B] -> 2-17 -> vector 0xb1 -> IRQ 17
Pin 2-17 already programmed
IOAPIC[0]: Set PCI routing entry (2-18 -> 0xb9 -> IRQ 18)
00:00:09[B] -> 2-18 -> vector 0xb9 -> IRQ 18
IOAPIC[0]: Set PCI routing entry (2-19 -> 0xc1 -> IRQ 19)
00:00:09[C] -> 2-19 -> vector 0xc1 -> IRQ 19
Ce qui permet à l'adaptateur PCMCIA d'être correctement associé à une
IRQ (l'IRQ 19).
Linux PCMCIA Card Services 3.1.33
kernel build: 2.4.18 unknown
options: [pci] [cardbus] [apm]
Intel ISA/PCI/CardBus PCIC probe:
PCI: Enabling device 00:0f.0 (0000 -> 0002)
Ricoh RL5C475 rev 80 PCI-to-CardBus at slot 00:0f, mem 0x10000000
host opts [0]: [isa irq] [io 3/6/1] [mem 3/6/1] [pci irq 19] [lat
168/176] [bus 2/5]
De fait, Windows donne la même IRQ 19 à la carte Ricoh.
Dans l'absolu, il n'est pas nécessaire que i82365 et prism2_cs aient la
même IRQ pour que ça marche.
La preuve est que ce n'est pas le cas sur mon portable Sony et que ça marche
!
Encore faut-il que les tables de routage du BIOS soient correctes...
Notes:
1) La résolution de ce problème m'a demandé des heures ! Si on fait un google
sur
"p80211knetdev_hard_start_xmit: Tx attempt prior to association,
frame dropped."
on trouve beaucoup de questions sur des forums et peu de réponses.
Parmi les solutions proposées, il y a celles-ci.
- passer l'option PCIC_OPTS="irq_mode=0" ou
PCIC_OPTS="irq_mode=1"
- passer au noyau le paramètre "pci=biosirq".
Les deux ont échoué chez moi, le paramètre pci_csc semblant indispensable.
2) Sans l'option ACPI, mon adaptateur Ricoh n'obtenait même pas d'IRQ
...
Vous pouvez méditer ça en lisant, comme indiqué plus haut Linux
PCMCIA HOWTO: Advanced topics , ou en faisant
un man i82365 qui vous donnera
les options PCMCIA en liaison avec ces problèmes.