Linksys Wrt54gl sous OpenWrt

De MicElectroLinGenMet.

(Retour Accueil ou Liste des articles)

Sommaire

Routeur Linksys Wrt54gl

Voir autres articles sur le Wrt54gl:


Présentation

Le WRT54GL est un routeur produit par Linksys. Il permet de partager une connexion Internet (modem non intégré) vers des ordinateurs via 4 ports ethernet et une liaison à la norme Wifi : IEEE 802.11B/G.

Voir article sur wikipedia ainsi que la page du WRT54GL sur le Wiki OpenWrt pour plus de détails.

Acheté le 17/8/2007, il était installé avec le firmware linksys 4.30.7 (Page des firmwares Linksys pour le Wrt54gl.)

Celui n'est pas resté plus d'une demi-heure puisque j'ai flashé le routeur avec un firmware OpenWrt.


ATTENTION: Installer un firmware non Linksys (ce qui n'est pas sans risque) sur ce routeur supprime toute garantie !!!

Installation OpenWrt version WhiteRussian (0.9)

J'ai suivi la documentation du Wiki OpenWrt sur la page InstallingWrt54gl pour l'installation de la dernière version d'OpenWrt.

Firmware installé: WhiteRussian (0.9) (version stable à ce moment là) openwrt-wrt54g-squashfs.bin disponible sur la page [1].

L'installation est on ne peut plus simple puisqu'il suffit de passer par l'interface web Linksys du WRT54GL et de choisir le fichier bin à flasher.

Decouverte du firmware OpenWrt

Un fois le firmware flashé, le Wrt54gl est accesible par une nouvelle interface Web mais aussi par un connection telnet qui donne accés un shell Linux.

Première connection

dan@vesta:~$ telnet 192.168.1.1
BusyBox v1.00 (2007.01.30-11:42+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
         |__| W I R E L E S S   F R E E D O M
 WHITE RUSSIAN (0.9) -------------------------------
  * 2 oz Vodka   Mix the Vodka and Kahlua together
  * 1 oz Kahlua  over ice, then float the cream or
  * 1/2oz cream  milk on the top.
 ---------------------------------------------------
root@OpenWrt:~#

Nom de machine

root@wrt54gl:~# uname -a
Linux wrt54gl 2.4.30 #1 Sat Feb 3 13:16:08 CET 2007 mips unknown

Type de processeur

root@wrt54gl:~# cat /proc/cpuinfo
system type             : Broadcom BCM947XX
processor               : 0
cpu model               : BCM3302 V0.8
BogoMIPS                : 199.47
wait instruction        : no
microsecond timers      : yes
tlb_entries             : 32
extra interrupt vector  : no
hardware watchpoint     : no
VCED exceptions         : not available
VCEI exceptions         : not available

Mémoire

root@wrt54gl:~# free   
              total         used         free       shared      buffers
  Mem:        14308        10368         3940            0          876
 Swap:            0            0            0
Total:        14308        10368         3940

Système fichiers

root@wrt54gl:~# mount
/dev/root on /rom type squashfs (ro)
none on /dev type devfs (rw)
none on /proc type proc (rw)
none on /tmp type tmpfs (rw,nosuid,nodev)
/tmp/root on /tmp/root type mini_fo (rw)
none on /dev/pts type devpts (rw)
/dev/mtdblock/4 on /jffs type jffs2 (rw)
/jffs on / type mini_fo (rw)
root@wrt54gl:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 1.0M      1.0M         0 100% /rom
none                      7.0M     20.0k      7.0M   0% /tmp
/tmp/root                 1.0M      1.0M         0 100% /tmp/root
/dev/mtdblock/4           2.2M    324.0k      1.9M  14% /jffs
/jffs                     1.0M      1.0M         0 100% /

Configuration réseau

Interfaces réseaux:

Manufacturer 	Model		Version 	LAN 	WAN 	WIFI 	Comments
Linksys 	WRT54GL 	v1.1		vlan0	vlan1 	eth1 	LAN is ports 0-3, WAN is port 4

   * eth1 	: Une interface wifi 802.11g (54Mbps) WLAN
   * eth0 	: Regroupe toutes les interfaces réseau 10/100 Mbps
   * br0 	: le bridge, par défaut, il regroupe vlan0 et eth1, cela permet de regrouper plusieurs interface réseau en une seule.
   * vlan0 	: la 4 prises réseaux du LAN
   * vlan1 	: la prise internet (WAN) 


root@wrt54gl:~# ifconfig -a
br0       Link encap:Ethernet  HWaddr 00:1C:10:14:09:85
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1084 errors:0 dropped:0 overruns:0 frame:0
          TX packets:886 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:81464 (79.5 KiB)  TX bytes:169446 (165.4 KiB)

eth0      Link encap:Ethernet  HWaddr 00:1C:10:14:09:85
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:1082 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1545 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:105134 (102.6 KiB)  TX bytes:396729 (387.4 KiB)
          Interrupt:4

eth1      Link encap:Ethernet  HWaddr 00:1C:10:14:09:87
          UP BROADCAST RUNNING ALLMULTI MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:88
          TX packets:17 errors:5 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:4228 (4.1 KiB)
          Interrupt:2 Base address:0x5000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

vlan0     Link encap:Ethernet  HWaddr 00:1C:10:14:09:85
          UP BROADCAST RUNNING ALLMULTI MULTICAST  MTU:1500  Metric:1
          RX packets:1084 errors:0 dropped:0 overruns:0 frame:0
          TX packets:886 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:85800 (83.7 KiB)  TX bytes:172990 (168.9 KiB)

vlan1     Link encap:Ethernet  HWaddr 00:1C:10:14:09:86
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:655 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:212220 (207.2 KiB)

Programmes (packages) installés

root@wrt54gl:~# ipkg list
base-files - 9 -
base-files-brcm - 2 -
bridge - 1.0.6-1 -
busybox - 1.00-5 -
dnsmasq - 2.35-1 -
dropbear - 0.48.1-1 -
haserl - 0.8.0-1 -
ipkg - 0.99.149-2 -
iptables - 1.3.3-2 -
iwlib - 28.pre7-1 -
kernel - 2.4.30-brcm-5 -
kmod-brcm-wl - 2.4.30-brcm-5 -
kmod-diag - 2.4.30-brcm-5 -
kmod-ipt-nat-default - 2.4.30-brcm-5 -
kmod-ppp - 2.4.30-brcm-5 -
kmod-pppoe - 2.4.30-brcm-5 -
kmod-switch - 2.4.30-brcm-1 -
kmod-wlcompat - 2.4.30-brcm-4 -
mtd - 5 -
nvram - 1 -
ppp - 2.4.3-7 -
ppp-mod-pppoe - 2.4.3-7 -
uclibc - 0.9.27-9 -
webif - 0.2-1 -
wificonf - 6 -
wireless-tools - 28.pre7-1 -
Successfully terminated.

La nvram

La NVRAM est une mémoire non volatif contenant les paramètres de base de l'appareil.

Contenu de la NVRAM à l'installation

Voir la description des variables contenus dans la nvram sur la page (OpenWrtNVRAM)

Messages au boot

root@wrt54gl:~# dmesg
CPU revision is: 00029008
Primary instruction cache 16kB, physically tagged, 2-way, linesize 16 bytes.
Primary data cache 8kB, 2-way, linesize 16 bytes.
Linux version 2.4.30 (nbd@ds10) (gcc version 3.4.4 (OpenWrt-1.0)) #1 Sat Feb 3 13:16:08 CET 2007
Setting the PFC value as 0x15
Determined physical RAM map:
memory: 01000000 @ 00000000 (usable)
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/mtdblock2 rootfstype=squashfs,jffs2 init=/etc/preinit noinitrd console=ttyS0,115200
CPU: BCM5352 rev 0 at 200 MHz
Using 100.000 MHz high precision timer.
Calibrating delay loop... 199.47 BogoMIPS
Memory: 14228k/16384k available (1455k kernel code, 2156k reserved, 104k data, 80k init, 0k highmem)
Dentry cache hash table entries: 2048 (order: 2, 16384 bytes)
Inode cache hash table entries: 1024 (order: 1, 8192 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 4096 (order: 2, 16384 bytes)
Checking for 'wait' instruction...  unavailable.
POSIX conformance testing by UNIFIX
PCI: no core
PCI: Fixing up bus 0
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
Registering mini_fo version $Id$
devfs: v1.12c (20020818) Richard Gooch (rgooch@atnf.csiro.au)
devfs: boot_options: 0x1
JFFS2 version 2.1. (C) 2001 Red Hat, Inc., designed by Axis Communications AB.
Squashfs 2.1-r2 (released 2004/12/15) (C) 2002-2004 Phillip Lougher
pty: 256 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ SERIAL_PCI enabled
ttyS00 at 0xb8000300 (irq = 3) is a 16550A
ttyS01 at 0xb8000400 (irq = 0) is a 16550A
b44.c:v0.93 (Mar, 2004)
PCI: Setting latency timer of device 00:01.0 to 64
eth0: Broadcom 47xx 10/100BaseT Ethernet 00:1c:10:14:09:85
Physically mapped flash: Found an alias at 0x400000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x800000 for the chip at 0x0
Physically mapped flash: Found an alias at 0xc00000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1000000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1400000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1800000 for the chip at 0x0
Physically mapped flash: Found an alias at 0x1c00000 for the chip at 0x0
 Amd/Fujitsu Extended Query Table v3.3 at 0x0040
number of CFI chips: 1
cfi_cmdset_0002: Disabling fast programming due to code brokenness.
Flash device: 0x400000 at 0x1c000000
bootloader size: 262144
Physically mapped flash: Filesystem type: squashfs, size=0xfb158
Updating TRX offsets and length:
old trx = [0x0000001c, 0x000008d8, 0x0007e400], len=0x0017a000 crc32=0x1f181132
new trx = [0x0000001c, 0x000008d8, 0x0007e400], len=0x00180000 crc32=0x9cbb6f33
Done
Creating 5 MTD partitions on "Physically mapped flash":
0x00000000-0x00040000 : "cfe"
0x00040000-0x003f0000 : "linux"
0x000be400-0x001c0000 : "rootfs"
mtd: partition "rootfs" doesn't start on an erase block boundary -- force read-only
0x003f0000-0x00400000 : "nvram"
0x001c0000-0x003f0000 : "OpenWrt"
Initializing Cryptographic API
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 1024 bind 2048)
ip_conntrack version 2.1 (5953 buckets, 5953 max) - 332 bytes per conntrack
ip_tables: (C) 2000-2002 Netfilter core team
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
NET4: Ethernet Bridge 008 for NET4.0
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFS: Mounted root (squashfs filesystem) readonly.
Mounted devfs on /dev
Freeing unused kernel memory: 80k freed
Algorithmics/MIPS FPU Emulator v1.5
diag: Detected 'Linksys WRT54G/GS/GL'
Probing device eth0: found!
b44: eth0: Link is up at 100 Mbps, full duplex.
b44: eth0: Flow control is off for TX and off for RX.
mini_fo: using base directory: /
mini_fo: using storage directory: /tmp/root
jffs2.bbc: SIZE compression mode activated.
PCI: Setting latency timer of device 00:05.0 to 64
eth1: Broadcom BCM4320 802.11 Wireless Controller 3.90.37.0
BFL_ENETADM not set in boardflags. Use force=1 to ignore.
device eth0 entered promiscuous mode
b44: eth0: Link is up at 100 Mbps, full duplex.
b44: eth0: Flow control is off for TX and off for RX.
vlan0: add 01:00:5e:00:00:01 mcast address to master interface
vlan0: dev_set_promiscuity(master, 1)
vlan0: dev_set_allmulti(master, 1)
device eth1 entered promiscuous mode
br0: port 2(eth1) entering learning state
br0: port 1(vlan0) entering learning state
br0: port 2(eth1) entering forwarding state
br0: topology change detected, propagating
br0: port 1(vlan0) entering forwarding state
br0: topology change detected, propagating
vlan1: Setting MAC address to  00 1c 10 14 09 86.
vlan1: add 01:00:5e:00:00:01 mcast address to master interface
mini_fo: using base directory: /
mini_fo: using storage directory: /jffs


Uptime

root@wrt54gl:~# uptime
14:59:20 up 30 days,  5:50, load average: 0.27, 2.43, 3.47


Configuration du système

(Voir aussi les pages "howto" et "WhiteRussian Configuration" sur le site OpenWrt.)

Activation du boot_wait

La première chose à faire à la 1ière connection est de mettre la variable nvram "boot_wait" à on.

Par défaut, le boot_wait est "OFF" sur Les routeurs WRT54GL, en fait, la plupart des routeurs ont "OFF" de boot_wait par défaut.

La mise à "ON" de la variable boot_wait augmente simplement le temps au boot pour attendre une connection d'un client tftp pour mise à jour du firmware.

Cela facilite le transfert de firmware par tftp si il n'y a plus d'autre moyen de flasher le routeur !


Activation de ssh

(Voir page DropbearPublicKeyAuthenticationHowto)

Pour activer le daemon ssh en place et lieu de telnet, il suffit de changer le mot de passe de root avec la commande passwd.

De plus, j'ai copié mes clefs ssh public de ma Debian dans le fichier /etc/dropbear/authorized_keys et de lui mettre les droits suivants:

chmod 0600 authorized_keys


Mise à l'heure

(Voir page OpenWrtDocs)

Au boot le Wrt54gl sur retrouve le 1 janvier 2000.

Pour le remttre à la l'heure, j'utilise la commande rdate fourni par BusyBox au lieu d'utilise un client ntp pour économiser la mémoire qui nous reste.

j'ai rajouter cette ligne en crontab pour une mise à l'heure journalière à 00:05:

5 0 * * * /usr/sbin/rdate -s ntp.unice.fr ou rdate.dedibox.com

ainsi qu'un script pour la mise à l'heure au boot:

cat /etc/init.d/S55rdate
#!/bin/sh
/usr/sbin/rdate -s ntp.unice.fr	
# chmod a+x /etc/init.d/S55rdate

Il est possible d'activer un serveur de temps en autorisant le service réseau time sur un Linux debian par exemple dans le fichier /etc/inetd.conf:

time stream tcp nowait root internal


Il faut aussi déclarer la "timezone" pour que l'heure corresponde au lieu du Wrt54gl.

Soit créer le fichier /etc/TZ file avec la zone de temps de Paris par exemple.

# echo "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00" > /etc/TZ

ou saisir cette valeur dans la nvram:

# nvram set time_zone="CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00"
# nvram commit


syslog

La syslog est un daemon qui renvoie les messages systèmes dans des journaux de type fichiers ou autres.

Sur le Wrt54gl le journal est stocké en ram et lisible avec la commande logread:

root@wrt54gl:~# logread
Aug 31 15:29:50 (none) kern.info dropbear[7030]: Child connection from 192.168.0.12:1396
Aug 31 15:29:56 (none) kern.notice dropbear[7030]: password auth succeeded for 'root' from  192.168.0.12:1396
Aug 31 15:30:01 (none) kern.notice crond[415]: USER root pid 7034 cmd /tmp/teleinfomysql >> /tmp/teleinfomysql.log 2>&1

Le 'buffer' de la log étant limité, il est possible de renvoyer les messages sur un autre serveur (par exemple un Linux Debian avec un daemon syslog autorisé à recevoir de l'extérieur).

Il suffit de configurer l'adresse de ce serveur dans la nvram:

# nvram set log_ipaddr=192.168.0.4
# nvram commit

Configuration du Wrt54gl en client wifi bridge

Le Wrg54gl ne sera plus un point d'accés wifi mais un client wifi qui se connectera sur une autre Ap comme le Netgear DG834G.

Il servira de pont entre cette AP et les périphériques connectés sur ses ports LAN.

Configuration inspirée de la page openwrtbridge.

Interfaces réseaux:
PHYSICALLY:
                       tagged    +-------------------+
               eth0 ============ | 5      SWITCH     |
                                 | 4   3   2   1   0 |
                                 +-------------------+
                                   |   |   |   |   |
                                   ...LAN 1-4...  WAN

LOGICALLY:
               vlan0 ------------- LAN 1-4 + eth1 (wifi)
               vlan1 ------------- WAN

Dans la nouvelle configuration réseau, les 4 ports LAN (wlan0) et le port WIFI (eth1) sont bridgés ensemble sous le même réseau que le Netgear DG834G.

L'interface bridge (br0) obtiendra une adresse IP par DHCP dans la plage 192.168.0.0/24.

L'interface WAN (vlan1) n'est pas utilisée mais sera configuré comme interface d'administration en 192.168.1.1.


Désactivation de certains services

Arrét du firewall:

# chmod a-x /etc/init.d/S45firewall

Arrét du serveur DHCP:

# chmod a-x /etc/init.d/S60dnsmasq


Modification configuration réseau dans la NVRAM

Extrait des paramètres importants:

lan_dhcp=1
lan_hwaddr=00:1C:10:XX:XX:XX
lan_hwnames=
lan_ifname=br0
lan_ifnames=vlan0 eth1	# Wifi (eth1) et ports lan (vlan0) sont sur même réseau 192.168.0.0
lan_ipaddr=0.0.0.0
lan_lease=86400
lan_netmask=0.0.0.0
lan_proto=dhcp		# Ne fonctionne pas, voir ci-dessous
wl0_channel=2
wl0_ifname=eth1
wl0_infra=1
wl0_key1=XXXXXXXXXXXXXXXXXXXXXXXXXX
wl0_key=1
wl0_mode=wet
wl0_radio=1
wl0_ssid=SSID
wl0_wep=enabled
wl0_wep_bit=64
wan_device=vlan1
wan_hostname=wrt54gl
wan_iface=vlan1
wan_ifname=vlan1
wan_ifnames=vlan1
wan_ipaddr=192.168.1.1	# Port wan (vlan1) en static 192.168.1.1
wan_netmask=255.255.255.0
wan_proto=static

Ne pas oublier de faire un nvram commit pour enregistrer les variables.

Contenu complet de la NVRAM mode client wifi bridge



Modification script réseau

Le parmètre nvram "lan_proto=dhcp" n'étant pas pris en compte, il est necessaire de rajouter une ligne dans le fichier /etc/init.d/S40network.

root@wrt54gl:~# cat /etc/init.d/S40network
#!/bin/sh
case "$1" in
 start|restart)
 rm -f /tmp/resolv.conf
 ln -s /tmp/resolv.conf.auto /tmp/resolv.conf
 ifup_interfaces=$(nvram get ifup_interfaces)
 ifup_interfaces=${ifup_interfaces:-"lan wan wifi"}
 for iface in $ifup_interfaces; do
       ifup $iface
       if [ "$iface" = "wifi" ]; then
               $iface up
               udhcpc -i br0 -b
       fi
 done
 ;;
esac


Configuration du Wrt54gl sans wifi

Utilisation du Wrt54gl uniquement sur interface ethernet, wifi désactivé.

Scripts pour activé/désactivé le wifi

cat /jffs/bin/wifi_disabled.sh
#!/bin/sh
nvram set ifup_interfaces="lan wan"		# Variable utilisé dans /etc/init.d/S40network
nvram set lan_ifname=vlan0
nvram set lan_ifnames=vlan0
nvram set wl0_radio=0
nvram commit


cat /jffs/bin/wifi_enabled.sh
#!/bin/sh
nvram set ifup_interfaces="lan wan wifi"	# Variable utilisé dans /etc/init.d/S40network
nvram set lan_ifname=br0
nvram set lan_ifnames="vlan0 eth1"
nvram set wl0_radio=1
nvram commit

Modification script réseau

/etc/init.d/S40network modifié pour udhcpc fonctionnant avec et sans wifi.

#!/bin/sh
case "$1" in
  start|restart)
  rm -f /tmp/resolv.conf
  ln -s /tmp/resolv.conf.auto /tmp/resolv.conf
  ifup_interfaces=$(nvram get ifup_interfaces)
  ifup_interfaces=${ifup_interfaces:-"lan wan wifi"}
  for iface in $ifup_interfaces; do
        ifup $iface
        if [ "$iface" = "wifi" ]; then
                $iface up
        fi
  done
  udhcpc -i $(nvram get lan_ifname) -b
  ;;
esac

Configuration aprés reboot

root@wrt54gl:~# ifconfig 
...


Commandes diverse

Nvram

root@wrt54gl:~# nvram
usage: nvram [get name] [set name=value] [unset name] [show]

Affiche la valeur d'une variable nvram:

# nvram get boot_wait
on

Modifie la valeur d'une variable nvram (Désactivation du wifi):

# nvram set wl0_radio=0

Supprime la variable:

# nvram unset variable

Affiche toute les variables de la nvram:

# nvram show 
wl_radius_port=1812
wl_mac_deny=
filter_dport_grp3=
filter_dport_grp4=
opo=0x0008
filter_dport_grp5=
filter=on
wan_unit=0
filter_dport_grp6=
os_ram_addr=80001000
...

Enregistre dans la nvram les variable modifiées par la commande 'get':

# nvram commit


NVRAM committing

When you set/get nvram settings, you are get/setting them in RAM. "nvram commit" writes them persistenly to the flash. But you don't have to commit in order to test,in fact it's safer not to because the flash memory has a limited write cycle life. (Don't be scared though, it's something like 1000-10.000 times; still better to only save it when really needed! NB In Faq it is however stated that this figure, according to manufacturers, can be in the range of 100,000 - 1,000,000) You can save your settings to RAM, check them out by ifdown/ifup'ing all your interfaces, and then "nvram commit" them if they are to your liking. If not, you can reboot and you're back to the last working configuration you had

Wifi

  • Scan AP wifi
root@wrt54gl:~# iwlist eth1 scanning
eth1      Scan completed :
         Cell 01 - Address: 00:09:5B:XX:XX:XX
                   ESSID:"XXXXXX"
                   Mode:Master
                   Channel:2
                   Quality:0/0  Signal level:-80 dBm  Noise level:-98 dBm
                   Encryption key:on
                   Bit Rate:1 Mb/s
                   Bit Rate:2 Mb/s
                   Bit Rate:5.5 Mb/s
                   Bit Rate:11 Mb/s
                   Bit Rate:22 Mb/s
                   Bit Rate:6 Mb/s
                   Bit Rate:9 Mb/s
                   Bit Rate:12 Mb/s
                   Bit Rate:18 Mb/s
                   Bit Rate:24 Mb/s
                   Bit Rate:36 Mb/s
                   Bit Rate:48 Mb/s
                   Bit Rate:54 Mb/s
         Cell 02 - Address: 00:18:39:26:5B:68
                   ESSID:"Free_degroupe"
                   Mode:Master
                   Channel:8
                   Quality:0/0  Signal level:-91 dBm  Noise level:-96 dBm
                   Encryption key:on
                   Bit Rate:1 Mb/s
                   Bit Rate:2 Mb/s
                   Bit Rate:5.5 Mb/s
                   Bit Rate:11 Mb/s
                   Bit Rate:18 Mb/s
                   Bit Rate:24 Mb/s
                   Bit Rate:36 Mb/s
                   Bit Rate:54 Mb/s
                   Bit Rate:6 Mb/s
                   Bit Rate:9 Mb/s
                   Bit Rate:12 Mb/s
                   Bit Rate:48 Mb/s
         Cell 03 - Address: 00:16:41:8C:3D:4C
                   ESSID:"Livebox-cc08"
                   Mode:Master
                   Channel:10
                   Quality:0/0  Signal level:-85 dBm  Noise level:-95 dBm
                   Encryption key:on
                   Bit Rate:1 Mb/s
                   Bit Rate:2 Mb/s
                   Bit Rate:5.5 Mb/s
                   Bit Rate:11 Mb/s
                   Bit Rate:6 Mb/s
                   Bit Rate:9 Mb/s
                   Bit Rate:12 Mb/s
                   Bit Rate:18 Mb/s
                   Bit Rate:24 Mb/s
                   Bit Rate:36 Mb/s
                   Bit Rate:48 Mb/s
                   Bit Rate:54 Mb/s
  • Interface wifi
root@wrt54gl:~# iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.

eth1      IEEE 802.11-DS  ESSID:"XXXXXX"  
          Mode:Repeater  Frequency:2.417 GHz  Access Point: 00:09:5B:XX:XX:XX   
          Tx-Power:18 dBm   
          RTS thr=2347 B   Fragment thr=2346 B   
          Encryption key:XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-X
          Link Signal level:-79 dBm  Noise level:-95 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:1  Invalid misc:0   Missed beacon:0

br0       no wireless extensions.

vlan0     no wireless extensions.

vlan1     no wireless extensions.
  • Modification puissance emetteur wifi:
root@wrt54gl:~# iwlist eth1 txpower
eth1      unknown transmit-power information.
Current Tx-Power:19 dBm       (79 mW)
root@wrt54gl:~# iwconfig eth1 txpower 50mW
root@wrt54gl:~# iwlist eth1 txpower
eth1      unknown transmit-power information.
Current Tx-Power:18 dBm       (63 mW)

Contrôle des LEDs

Il est possible de commander les leds du panneau en écrivant dans les fichiers virtuels dans "/proc":

root@wrt54gl:~# l /proc/diag/led/
-r--------    1 root     root            0 Aug 31 17:10 dmz
-r--------    1 root     root            0 Aug 31 17:10 power
-r--------    1 root     root            0 Aug 31 17:10 ses_orange
-r--------    1 root     root            0 Aug 31 17:10 ses_white
-r--------    1 root     root            0 Aug 31 17:10 wlan

Il suffit d'écrire un "0" pour éteindre une led, un 1 pour l'allumer ou "f" pour la faire "flasher".

root@wrt54gl:~# echo f > /proc/diag/led/ses_orange


Autre exemple permettant de vérifier que le wrt54gl est toujours en vie:

while sleep 1; do echo 1 > /proc/diag/led/ses_orange ; sleep 1; echo 0 > /proc/diag/led/ses_orange ; done &

Toutes les secondes la led ses_orange clignote.


Acceder aux ports série dur WRT

(source: http://wiki.openwrt.org/OpenWrtDocs/Hardware/Linksys/WRT54GL, http://www.rwhitby.net/projects/wrt54gs)

Le WRT54GL dispose d'un connecteur 10 broches sur le PCB appelé JP1 (JP2 sur certaines cartes V1.1). Ce connecteur fournit deux ports série TTL à 3.3V. Seuls sont disponibles les ports Rx et Tx sans contrõle de flux.

Connecteur série en JP2 (carte V1.1)
Connecteur soudé


Pour connecter ces port à un PC, il faut déjà souder un connecteur (type HE10-2x5) sur le CI du WRT54GL car seules les pastilles sont disponibles (ATTENTION: cette manipulation supprime toute garantie du routeur et à réaliser à vos risques et périls).


et ensuite réaliser une interface de type Max3232 pour adapter les signaux TTL 3.3V aux signaux RS232 (-12V/+12V) d'un PC.


Interface à base Max3232



Pour connecter un des ports série à un ucontroleur en 5V, il faudra adapter aussi les niveaux 3.3V en 5V.

Image:Serie_5Vto3-3V.gifImage:Serie_3-3Vto5V.gif

à tester ...


Brochage

Pin 2 +3.3V Pin 4 TX_0 Pin 6 RX_0 Pin 8 Not connected Pin 10 GND
Pin 1 +3.3V Pin 3 TX_1 Pin 5 RX_1 Pin 7 Not connected Pin 9 GND


Source: OpenWrt


Détail des ports série sur le WRT54GL

root@wrt54gl:~# dmesg|grep tty
Kernel command line: root=/dev/mtdblock2 rootfstype=squashfs,jffs2 init=/etc/preinit noinitrd console=ttyS0,115200
ttyS00 at 0xb8000300 (irq = 3) is a 16550A
ttyS01 at 0xb8000400 (irq = 0) is a 16550A

Le premier (/dev/tts/0) est utilisé par le système comme port console (115200,8N1) à garder comme secours au cas où le routeur devient inaccessible par le réseau.

Le deuxième (/dev/tts/1) est libre d'utilisation. Je l'ai testé avec un simple programme en C car la version actuel d'OpenWrt installée ne possède pas la commande stty. Ce port n'est pas par defaut configuré. Il n'y a pas de débit (baud) d'initialisé. Un simple "echo" dans celui-ci ne fonctionne pas.

root@wrt54gl:~# cat /proc/tty/driver/serial
serinfo:1.0 driver:5.05c revision:2001-07-08
0: uart:16550A port:B8000300 irq:3 baud:113636 tx:2852 rx:44 RTS|CTS|DTR|DSR|CD
1: uart:16550A port:B8000400 irq:0 tx:0 rx:0 CTS|DSR|CD

Aprés exécution du programme test:

root@wrt54gl:/# cat /proc/tty/driver/serial
serinfo:1.0 driver:5.05c revision:2001-07-08
0: uart:16550A port:B8000300 irq:3 baud:113636 tx:2881 rx:72 RTS|CTS|DTR|DSR|CD
1: uart:16550A port:B8000400 irq:0 baud:19230 tx:18 rx:0 RTS|CTS|DTR|DSR|CD



Test du port



Programme de test du port série ttyS1

Ceci est un simple programme pour tester vite fait le port (Celui-ci envoi (débit 19200,8N1) une chaine au PC et affiche chaque carractère reçu).

A compiler avec le SDK OpenWrt et transférer sur le Wrt (voir ci-dessous) .

// Simple test de l'interface série /dev/tts/1 du Wrt54gl.
// Celui-ci renvoi le caratère reçu.
// Utiliser "picocom -b 19200 -d 8 /dev/ttyS1" pour envoyer du PC des caratères sur le port série.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/fcntl.h>
 
int main(void)
{
        int             fd;
        unsigned char            c;
        struct termios  termios_p;
 
        /* Ouverture de la liaison serie */
        if ( (fd=open("/dev/tts/1",O_RDWR)) == -1 ) {
                perror("open");
                exit(-1);
        }
 
        /* Lecture des parametres courants */
        tcgetattr(fd,&termios_p);
        /* On ignore les BREAK et les caracteres avec erreurs de parite */
        termios_p.c_iflag = IGNBRK | IGNPAR;
        /* Pas de mode de sortie particulier */
        termios_p.c_oflag = 0;
        /* Liaison a 1200 bps avec 8 bits de donnees et pas de parite */
        termios_p.c_cflag = B19200 | CS8 | CLOCAL | CREAD ;
        /* Mode non-canonique sans echo */
        termios_p.c_lflag = 0;
        /* Caracteres immediatement disponibles */
        termios_p.c_cc[VMIN] = 1;
        termios_p.c_cc[VTIME] = 0;
	/* Efface les données reçues mais non lues. */
	tcflush(fd, TCIFLUSH);
        /* Sauvegarde des nouveaux parametres */
        tcsetattr(fd,TCSANOW,&termios_p);
 
        /* Ecriture sur port série */
        write(fd,"Wrt54gl écoute ...", 18);
 
        /* Boucle de lecture port série */
	printf("Attente trame ...\n") ;
        while ( 1 ) 
	{
                read(fd,&c,1);
		printf("%c", c) ;
		fflush ( stdout );
        }
 
        /* Fermeture */
        close(fd);
 
        /* Bye... */
        exit(0);
}


Port JTAG du WRT

Source: OpenWrtDocs/Hardware/Linksys/WRT54GL


Wrt54gl JTAG port


Compiler des programmes pour le Wrt54gl

Information détaillée sur cette page Writing and Compiling A Simple Program For OpenWrt.


Installation du SDK

Il faut en 1ier télécharger le SDK (version pour linux) OpenWrt-SDK-Linux-i686-1.tar.bz2 sur cette page pour la version White Russian 0.9]

Le décompresser dans le répertoire de son choix.


Description de l'exemple

J'ai suivi l'exemple "helloworld" sur la page ci-dessus pour réaliser un programme de test de l'interface série du Wrt54gl.

Organisation des sources:

dan@vesta:OpenWrt-SDK-Linux-i686-1$ find package/test/
package/test/
package/test/src
package/test/src/test.c
package/test/src/Makefile
package/test/Makefile


Le fichier test_20080217-1.tgz contient les sources, le binaire et le package généré pour le Wrt54gl sous OpenWrt WhiteRussian (0.9).
Décompresser fichier test_20080217-1.tgz dans le répertoire "package/" du SDK (OpenWrt-SDK-Linux).


Compilation

dan@vesta:OpenWrt-SDK-Linux-i686-1$ make V=99	(compilation + génération package)
...
dan@vesta:OpenWrt-SDK-Linux-i686-1$ find bin/packages/
bin/packages/test_20080217-1_mipsel.ipk

Copie du package créé sur le wrt54gl:
$ scp bin/packages/test_20080217-1_mipsel.ipk root@wrt54gl:/tmp

Possibilité de copier le binaire seul pour un programme simple:

$ scp build_mipsel/test/test root@wrt54gl:/tmp


Installation du package

root@wrt54gl:~# ipkg install test_20080217-1_mipsel.ipk 

Pour recompiler aprés modif., il faut supprimer le répertoire créé !! ou modifier directement les sources dans ce répertoire.

$ rm -rf ./build_mipsel/test
ou
$ make clean				(supprime tout les programmes dans ./build_mipsel.)


Execution du programme

root@wrt54gl:~# ./test

Utiliser le programme picocom pour envoyer du PC vers le Wrt54gl des caratères sur le port série

$ picocom -b 19200 -d 8 /dev/ttyS1


Autres exemples de programmes

Page Interface téléinfo. piloté par un Wrt54gl.


En cas de problème

Lien sur le site OpenWrt Troubleshooting.

Failsafe mode

Si le Wrt54gl ne démarre plus pour cause de scripts cassés ou partition corrompue, il est possible de recupérer l'appareil avec le mode Failsafe.

Comment entrer dans le mode failsafe

Il faut utiliser le bouton reset pour entrer dans ce mode seulement lorsque OpenWrt démarre mais pas pendant le bootloader ce qui peut casser le routeur.

Quand OpenWrt démarre, il allume la led DMZ pour le Wrt54gl et broadcast un packet UDP sur le port 4919 du réseau 192.168.1.x qui contient ce message:

"Press reset now, to enter Failsafe!"

Quand ce message apparait, il faut presser le bouton reset pendant 2 secondes et le message suivant doit être reçu:

Entering Failsafe!

Pour le Wrt54gl, si le reset est validé, la led DMZ flashe 3 fois par secondes.

Une fois dans le mode failsafe, le routeur ouvre un port telnet sur l'adresse 192.168.1.1 sur les ports LAN uniquement.


Ecoute du Wrt54gl sur le port 4919 avec tcpdump

vesta:~# tcpdump -vv -i eth0 src host 192.168.1.1 and port 4919 and udp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
22:40:39.981411 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 1029) 192.168.1.1.2048 > 192.168.1.255.4919: UDP, length 100




22/8/2007