DWL 500/650 et DWL 1000AP sous Debian

Auteur: Olivier Garet, version du 18 août 2002
Adresse électronique: Olivier.Garet@univ-orleans.fr


C
ette 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.