samedi, juillet 23 2011

Bug avec le pilote WL et Avahi

Si comme moi vous avez une carte wifi sur votre pc portable de type Broadcom (BCM43225 chez moi) alors vous allez avoir besoin du pilote "wl" (paquet kmod-wl chez rpmfusion...). Ce pilote fonctionne très bien mais la paquet utilise une version qui (pour le moment) a un léger bug qui peut vous engendrer une crise d'arrachage de cheveux en règle. L'idée principale est tout simplement que mon pc portable refuse catégoriquement de trouver les hôtes de mon réseau via le système d'auto-configuration de nom de domaine Avahi. Pour régler cela, je vais vous donner la marche à suivre.

Tout d'abord, pour faire un peu le "pro" je vais vous expliquer comment j'ai trouvé le bug... Rien de bien méchant, il suffisait de connaitre deux commandes: tcpdump et grep. Je vous l'explique par ce que je pense que vous pourrez apprécier de savoir faire cela pour d'autres cas.

Je savais que avahi fonctionnait simplement: au moment où une machine accroche un réseau, le démon avahi envoit un paquet "broadcast" contenant son adresse, son nom de domaine (nom de machine en fait), et quelques infos... Bref, de mon coté j'ai deux pc qui trounent: patrice-desktop et patrice-laptop.

Voilà ce que j'ai fait, bêtement: Sur le poste desktop, j'ai lancé (en root...)

tcpdump -i eth0 | grep mdns

Ce que fait cette commande est simple: afficher toutes les trames réseau qui arrivent sur l'interface réseau eth0 et filtrer seulement celle qui ont "mdns" dans les informations. En fait, sitôt que mon portable se connectera, il doit envoyer un broadcast pour dire "hého je suis patrice-laptop, et j'ai telle ip". Et dans les informations de paquet, il y aura "mdns" qui doit apparaitre, puisque c'est ce protocole qui est utilisé...

Pour faire simple, je relance simplement le service avahi-daemon sur le laptop:

su -c "service avahi-daemon restart"

et là... sur le pc de bureau je vois bien:

12:27:28.822446 IP patrice-laptop.local.mdns > 224.0.0.251.mdns: 0*- [0q] 29/0/0 (Cache flush) AAAA fe80::4e0f:6eff:fe24:6009, (Cache flush) PTR patrice-laptop.local., (Cache flush) A 10.0.0.2, (Cache flush) PTR patrice-laptop.local., (Cache flush) HINFO, PTR patrice-laptop [4c:0f:6e:24:60:09]._workstation._tcp.local., (Cache flush) SRV patrice-laptop.local.:9 0 0, (Cache flush) TXT "", PTR _workstation._tcp.local., PTR patrice-laptop._http._tcp.local., (Cache flush) SRV patrice-laptop.local.:45937 0 0, (Cache flush) TXT "u=guest", PTR _http._tcp.local., PTR Fichiers publics de patachou sur patrice-laptop.local._webdav._tcp.local., (Cache flush) SRV patrice-laptop.local.:45937 0 0, (Cache flush) TXT "u=guest" "path=/", PTR _webdav._tcp.local., PTR Virtualization Host patrice-laptop._libvirt._tcp.local., (Cache flush) SRV patrice-laptop.local.:0 0 0, (Cache flush) TXT "", PTR _libvirt._tcp.local., PTR patrice-laptop._ssh._tcp.local., (Cache flush) SRV patrice-laptop.local.:22 0 0, (Cache flush) TXT "", PTR _ssh._tcp.local., PTR patrice-laptop._udisks-ssh._tcp.local., (Cache flush) SRV patrice-laptop.local.:22 0 0, (Cache flush) TXT "", PTR _udisks-ssh._tcp.local. (855)

Ok , parfait mon laptop envoit les infos, mais faisons maintenant l'inverse, on lance la commande tcpdump sur le portable, et on relance avahi daemon sur le pc de bureau... et ba rien n'apparaissait...

J'ai donc prospecté, et j'ai appris que la version du pilote donné dans rpmfusion n'est pas patché pour corriger le souci. Alors on va palier le souci le temps que l'auteur (que j'ai prévenu) fasse la correction.

Tout d'abord, on récupère le pilote broadcom:

#on va utiliser un répertoire pour notre compilation
mkdir ~/broadcom
cd ~/broadcom

#les sources du  module pour 64 bits
wget http://www.broadcom.com/docs/linux_sta/hybrid-portsrc_x86_64-v5_100_82_38.tar.gz
tar zxf hybrid-portsrc_x86_64-v5_100_82_38.tar.gz

#pour les 32 bits utilisez ceci:
#wget http://www.broadcom.com/docs/linux_sta/hybrid-portsrc_x86_32-v5_100_82_38.tar.gz
#tar zxf hybrid-portsrc_x86_32-v5_100_82_38.tar.gz

#on récupère le patch
wget http://www.broadcom.com/docs/linux_sta/5_100_82_38.patch
patch -p0 < 5_100_82_38.patch

A partir de là, vous avez les sources prêtes à être compilées.

Et bien allons-y, on compile:

make

Maintenant que ça a compilé, et seulement si ça a compilé, on va supprimer le paquet kmod-wl et virer le module:

su -lc "rmmod wl; yum remove kmod-wl -y"

Et enfin, on va installer le module que nous avons compilé:

su -c "make install && insmod wl.ko"

Normalement, votre connexion va se relancer et vous aurez le wifi qui marchera... notez que vous devrez pour le moment refaire la manipulation de compilation à chaque fois que vous mettrez à jour votre noyau.

Ainsi j'ai enfin eut mon réseau qui troune avec "mdns" (donc avahi en fait) et je peux pinger, me connecter ou lister tous les postes de mon réseau sans connaitre leur ip :) Désolé mais j'adore.

Bon j'espère que le mainteneur du paquet kmod-wl a lut mon message... car c'est pas marrant pour tout le monde de devoir se compiler soit même un pilote... Quoique la méthode est pas si complexe...