[Ran] wl0_distance, dctrl

Didier Lebrun dl at vaour.net
Dim 10 Sep 22:16:28 CEST 2006


salut,

Pour établir une liaison avec les AP du Plateau Cordais situés entre 7
et 13 km, je me suis intéressé sérieusement à l'affaire des liens à
longue portée et des ACK timing.

En explorant le code de wificonf.c d'OpenWRT, j'ai vu que le réglage des
ACK timing d'OpenWRT se fait au moyen de deux registres du chipset
Broadcom: "shmem 0x10" et "macreg 0x684". Voir:
- http://forum.openwrt.org/viewtopic.php?id=4484
- http://forum.openwrt.org/viewtopic.php?id=6743
-
https://dev.openwrt.org/browser/branches/whiterussian/openwrt/package/wificonf/wificonf.c

Le registre shmem 0x10 sert à définir le délai d'attente des ACK en
microsecondes, en fonction de la distance aller et retour, avec la
formule "9 + distance / 150" arrondi à l'unité supérieure. Le contenu
du registre macreg 0x684 est calculé en ajoutant 510 à la valeur
ci-dessus, pour une raison que j'ignore.

Pour connaître l'état de ces registres, en héxadecimal, il suffit de taper:
~# wl shmem 0x10
shmem is 0x0014
~# wl macreg 0x684 2
macreg at offset 0x684 is 0x0212

Les valeurs ci-dessus correspondent à l'état des registres par défaut et
à un trajet aller-retour de 3000 m (distance = 1500 m), soit 10 µs, qui
est le timing standard du protocole 802.11.

Le programme dctrl, que François Laperruque avait évoqué il y a qq
temps, fait la même chose que la fonction set_distance() de wificonf.c.
Les développeurs d'OpenWRT l'ont utilisé pour faire des tests avant de
le transposer dans wificonf.c. dctrl prend toutefois comme argument la
longueur du trajet aller + retour, alors que wificonf.c reçoit en entrée
la distance simple, qui est donnée par la variable nvram wl0_distance.

En essayant tout ça sous Freifunk v1.2.5, je me suis aperçu que la
variable nvram wl0_distance n'a en réalité aucun effet sur l'état des
registres shmem 0x10 et macreg 0x684, qui conservent toujours leurs
valeurs par défaut:

~# nvram get wl0_distance
10000
~# wl shmem 0x10
shmem is 0x0014
~# wl macreg 0x684 2
macreg at offset 0x684 is 0x0212

Par contre, le programme dctrl les modifie effectivement:

~# dctrl 20000
~# wl shmem 0x10
shmem is 0x004c
~# wl macreg 0x684 2
macreg at offset 0x684 is 0x024a

J'ai essayé d'installer les packages wificonf, wl-adv et
freifunk-openwrt-compat, mais wl0_distance reste sans effet. Je
soupçonne que Freifunk a prévu un champ "Distance", sans avoir
implémenté son utilisation pour l'instant, sauf peut-être dans la
version 1.3 ? Il faudrait lire le code source de /sbin/wifi pour le
savoir, mais je ne l'ai pas trouvé. NB: si quelqu'un sait où on le
trouve, ça m'intéresse.

Pour remédier au problème en attendant, j'ai fabriqué un petit script
/etc/init.d/S41dcrtl, qui lance automatiquement la commande dctrl (voir
attachement). NB: dctrl utilise la librairie iwlib, ce qui suppose que
le package wireless-tools soit installé (ipkg install wireless-tools).

Avec tout ça et Netperf, j'ai pu tester l'effet des différents
paramètres sur une liaison de 12,63 km, avec un RSSI qui tourne autour
de -85 dB. J'ai fait uniquement des tests en upload, puisque l'appareil
en face n'est pas réglé pour l'instant et je n'ai pas accès à ses
réglages (c'est Laurent Breuillard qui l'administre). Il en ressort que:

* sans réglage particulier (mode G only, wl0_distance="", wl rate -1, wl
shortslot_override -1, wl cwmin 15, wl cwmax 1023), le débit plafonne à
0,55 Mbps env et le rate est à 1 Mbps
* wl shortslot_override 0 seul n'a pas d'incidence visible
* avec wl shortslot_override 0 + wl rate 9, Netperf ne répond plus (time
out); pareil avec wl rate 6, 5.5 ou 2 :-(
* en remettant shortslot_override -1 et wl rate -1 (valeurs par défaut)
et en lançant dctrl 25260 (12630 * 2), ça va déjà mieux: 1,15 à 1,35
Mbps :-)
* en conservant ces réglages de dctrl, et en rajoutant wl
shortslot_override 0, ça ne change rien
* toujours avec les mêmes réglages de dctrl, en fixant le rate à 9, le
débit atteint 1,70 à 2,00 Mbps env; toutes les autres valeurs de wl rate
donnent de moins bons résultats
* toujours avec les mêmes réglages de dctrl et le rate à 9, en mettant
wl cwmin 1 (on), ça s'améliore encore, pour atteindre 2,40 à 2,60 Mbps :-)
* en conservant ces paramètres et en essayant différentes valeurs de wl
cwmax (1024, 2047, 1535, 511), ça n'a pas d'effet visible

En conclusion, les paramètres efficaces, sur une liaison de 12,63 km, sont:
* dctrl 25260 (distance * 2)
* wl rate 9
* cwmin 1
Les autres réglages n'ont pas d'effet, sur cette distance au moins. Je 
suppose que wl shortslot_override 0 a cependant un effet jusqu'à une 
certaine distance. C'est en tout cas ce qu'on avait observé à WifiQuercy.

@+

-- 
Didier Lebrun
Le bourg - 81140 - Vaour (France)
tél: 05.63.53.73.41 (après-midi et soirée, même très tard ;-)
mailto:dl at vaour.net
http://didier.vaour.net/





-------------- section suivante --------------
Un texte encapsulé et encodé dans un jeu de caractères inconnu a été nettoyé...
Nom : S41dctrl
URL : <http://lists.vaour.net/pipermail/ran/attachments/20060910/c0197fda/attachment-0002.ksh>
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: dctrl
Type: application/octet-stream
Taille: 8399 octets
Desc: non disponible
URL: <http://lists.vaour.net/pipermail/ran/attachments/20060910/c0197fda/attachment-0001.obj>
-------------- section suivante --------------
Un texte encapsulé et encodé dans un jeu de caractères inconnu a été nettoyé...
Nom : dctrlshow
URL : <http://lists.vaour.net/pipermail/ran/attachments/20060910/c0197fda/attachment-0003.ksh>


More information about the Ran mailing list