miercuri, 4 aprilie 2012

Recuperarea unui router Linksys dupa instalare DD-WRT esuata

Linksys E2000 este unul dintre routerele wireless recente echipate cu transmitator dual-band si porturi gigabit de la Linksys, capabil de a transfera atat pe cablu cat si pe conexiunile fara fir date cu viteze mari si latenta mica. Acesta este construit cu hardware aproape identic cu modelul precedent, WRT320N, diferind vizual doar prin culoarea carcasei.


DD-WRT este probabil cea mai populara alternativa pentru firmware-ul de pe routere, oferind functionalitate extinsa, inclusand: suport rutare RIP/BGP/OSPF, IPv6, VLAN, etc. Totusi, utilizarea de firmware alternativ nu este suportata de producatori, motiv pentru care nu se ofera garantie pentru produsele care ruleaza firmware modificat.



Posibile incidente la instalarea DD-WRT



Desi operatia de instalare DD-WRT este destul de simpla, uneori pot aparea incidente nedorite, care ar putea sa faca routerul neoperabil:

  • omiterea citirii documentatiei privind instalarea pe modelul de router folosit
  • instalarea unei versiuni firmware (DD-WRT, OpenWRT, etc) nepotrivite
  • esecul finalizarii unei instalari
  • nerespectarea anumitor pasi in instalare


Cand se intampla acest lucru, routerele Linksys nu mai reusesc sa finalizeze secventa de pornire, indicand acest lucru prin palpairea continua a LED-ului ‘Power’.


Am trecut prin aceasta situatie de trei ori, pe routerele Linksys WRT54GL (modelul legendar, care a dus la cresterea popularitatii DD-WRT), WRT320N si E2000. Primele doua au putut fi recuperate usor din starea ‘bricked’ pentru ca aveau activat ‘boot wait’. Cand boot-wait este activ, este posibila trimiterea unui fisier cu firmware, pentru o scurta perioada dupa pornirea routerului, folosindu-se protocolul TFTP. In asemenea situatii se poate executa urmatoarea procedura de reinstalare a firmware-ului:
  • se obtine o copie a fisierului firmware original al routerului, de la producator. Pentru ca imi place sa folosesc nume de foldere scurte, am folosit ca locatie a fisierului firmware D:\Firmware, iar fisierului i-am dat numele ‘firmware.bin’
  • se configureaza PC-ul / laptopul cu adresa IP statica pe un port ethernet, folosind o adresa in reteaua 192.168.1.x. Eu am folosit 192.168.1.2
  • se conecteaza un port LAN cu laptopul prin cablu UTP
  • se deschide un prompt de comanda, se pregateste executarea comenzii tftp, dar fara a se pune in executie. Linia de comanda pregatita este tftp -i 192.168.1.1 PUT D:\Firmware\firmware.bin
  • se pastreaza accesibila aceasta fereastra, deoarece trebuie ca aceasta comanda sa fie trimisa la timp foarte scurt dupa pornirea routerului (1-3 secunde)
  • se porneste routerul, se pune in executie comanda de mai devreme.


De obicei, dupa aceasta procedura imaginea firmware este incarcata pe router, iar acesta poate fi re-programat ulterior dupa dorinta. Am fost sa aplic aceasta procedura pe trei routere din trei, insa numai pe doua am avut succes. Pe ultimul, un Linksys E2000, imaginea firmware pe care am incarcat-o nu era cea corecta si boot-wait nu era activat. Dupa aceasta operatie, routerul nu a mai finalizat pornirea si nu raspundea la comanda PING. Din acest motiv, nu am avut cum sa aplic metoda de repunere in functiune a routerului descrisa anterior.


Repararea dupa un update de firmware esuat

Din fericire, ultimele modele de routere Linksys sunt echipate cu un port serial (atentie: incompatibil cu cele de pe PC!), care poate fi folosit pentru transmiterea de comenzi catre CFE (Common Firmware Environment, echivalentul BIOS-ului de pe PC-uri). Cu ajutorul acestui port serial se poate instrui routerul sa incarce o anumita imagine firmware, apoi aceasta poate fi scrisa pe memoria flash, etc.

Portul serial poate fi accesat prin intermediul a trei contacte situate in conectorul WAN/Internet al acestora. In portul Internet, pe partea opusa contactelor ethernet, exista 4 contacte etichetate: 3V3, TX, RX si GND. TX, RX si GND se pot folosi pentru a face legatura cu PC-ul, insa doar prin intermediul unui adaptor capabil de a transmite semnale seriale in nivelele de voltaj TTL, in acest caz fiind vorba de 3.3V.
Portul serial de pe routerele Linksys

Pe forumul DD-WRT am urmarit discutii in care unii utilizatori spun ca au facut legatura intre router si PC cu ajutorul unui cablu telefonic Nokia CA-42 sau DKU-5, cabluri care includ convertorul USB - Serial TTL. Aceste cabluri au insa si o mica 'pretentie’: circuitul convertor e alimentat de obicei de catre periferic (nu de catre PC) sau de alta sursa externa, plus ca este necesara transformarea acestora, de obicei in mod ireversibil.


Pentru ca nu am gasit acest cablu, am cautat si am gasit destul de repede un cablu compatibil, modelul TTL-323R-3V3-WE, produs de FTID Chip. Acesta nu are nevoie de alte surse de alimentare in afara portului USB conectat cu PC-ul.

Cablul convertor USB - TTL-Serial FTDI TTL-232R-3V3


Cu ajutorul unui splitter de cablu telefonic am putut face cel mai usor legatura cu contactele portului serial din router, dupa ce l-am ajustat un pic (vedeti in fotografiile de mai jos felul in care am remodelat conectorul).

Element conectare, extras dintr-un splitter RJ11 telefonic
Element conectare, extras dintr-un splitter RJ11 telefonic

Am facut si un test important cu ajutorul unui multimetru: am verificat existenta unor scurt circuite, respectiv existenta contactului cu portul serial din router. Intre GND si RX, respectiv GND-TX multimetrul mi-a aratat 1.42M. Contactul cu 3V3 nu trebuie facut.

Ok, am conectat cablul convertor USB - TTL-Serial la PC, am instalat driverele gasite de sistemul de operare (+1 FTDI!), apoi am configurat o conexiune seriala in aplicatia terminal XShell (se pot folosi si altele: Putty, HyperTerminal, etc), cu parametrii: rata 115200, 8 biti de date, fara paritate, 1 bit stop.

Daca s-a facut cu succes conexiunea portului serial, dupa pornirea routerului vor aparea mesaje in aplicatia terminal. In procedura de recuperare, secventa de start trebuie oprita cat de curand posibil, prin apasarea in terminal a combinatiei Ctrl + C imediat dupa pornirea routerului. Mai jos puteti vedea comenzile si mesajele din timpul recuperarii unul Linksys E2000:

Mesajele de la pornire, intrerupte tastand Ctrl + C

CFE version 5.10.56.51 based on BBP 1.0.37 for BCM947XX (32bit,SP,LE)
Build Date: Fri Dec 3 17:23:34 CST 2010 (fpan@localhost.localdomain)
Copyright (C) 2000-2008 Broadcom Corporation.

Init Arena
Init Devs.

No DPN
This is a Serial Flash
Boot partition size = 262144(0x40000)
Found a 8MB ST compatible serial flash
Partition information:
boot #00 00000000 -> 0003FFFF (262144)
trx #01 00040000 -> 0004001B (28)
os #02 0004001C -> 007F0FFF (8064996)
nvram #03 007F1000 -> 007FFFFF (61440)
Partition information:
boot #00 00000000 -> 0003FFFF (262144)
trx #01 00040000 -> 007F0FFF (8065024)
nvram #02 007F1000 -> 007FFFFF (61440)
BCM47XX_GMAC_ID
et0: Broadcom BCM47XX 10/100/1000 Mbps Ethernet Controller 5.10.56.51
CPU type 0x19740: 354MHz
Tot mem: 32768 KBytes

CFE mem: 0x80700000 - 0x807A1360 (660320)
Data: 0x80733440 - 0x80736700 (12992)
BSS: 0x80736700 - 0x8073B360 (19552)
Heap: 0x8073B360 - 0x8079F360 (409600)
Stack: 0x8079F360 - 0x807A1360 (8192)
Text: 0x80700000 - 0x80733438 (209976)

Boot version: v5.4
The boot is CFE
Nothing...

### CLKDIV= 0x80a082c, SFlashClkDiv=8 clkdivsf=2 ###
### Change it to 0x20a082c (2) ###
CMD: [ifconfig eth0 -addr=192.168.1.1 -mask=255.255.255.0]
Device eth0: hwaddr 58-6D-8F-88-7E-05, ipaddr 192.168.1.1, mask 255.255.255.0
gateway not set, nameserver not set
Automatic startup canceled via Ctrl-C / ESC
CFE> ^C

Se pot face teste de comunicatie cu PC-ul:


CFE> ping 192.168.1.2
CMD: [ping 192.168.1.2]
192.168.1.2 (192.168.1.2) is alive
192.168.1.2 (192.168.1.2): 1 packets sent, 1 received
*** command status = 0

CFE> help
CMD: [help]
Available commands:

gpio Set GPIO.
upgrade Upgrade Firmware
et Broadcom Ethernet utility.
modify Modify flash data.
nvram NVRAM utility.
reboot Reboot.
flash Update a flash memory device
batch Load a batch file into memory and execute it
go Verify and boot OS image.
boot Load an executable file into memory and execute it
load Load an executable file into memory without executing it
save Save a region of memory to a remote file via TFTP
ping Ping a remote IP host.
arp Display or modify the ARP Table
ifconfig Configure the Ethernet interface
show clocks Show current values of the clocks.
show devices Display information about the installed devices.
unsetenv Delete an environment variable.
printenv Display the environment variables
setenv Set an environment variable.
help Obtain help for CFE commands

For more information about a command, enter 'help command-name'
*** command status = 0


Am incercat initial recuperarea conform unei proceduri pe care am descoperit-o pe forumul DD-WRT: copierea imaginii firmware in memoria routerului, urmata de scrierea ei in memoria flash. Comanda ‘load -tftp -raw -addr 0x807a60b0 -max=0x800000 :’ este insotita de executarea unei comenzi ‘tftp -i 192.168.1.1 PUT firmware.bin’ pe PC. Mai jos sunt comenzile si mesajele din consola:

CFE> load -tftp -raw -addr=0x807a60b0 -max=0x800000 :
CMD: [load -tftp -raw -addr=0x807a60b0 -max=0x800000 :]
Loader:raw Filesys:tftp Dev:eth0 File:: Options:(null)
Loading: _tftpd_open(): retries=0/3
.. 5444608 bytes read

### Start=1968183305 E=-1125051175 Delta=1201732816 ###
Entry at 0x807a60b0
*** command status = 0

Dupa copierea firmware-ului in RAM urmeaza scrierea pe memoria flash. Comanda ‘flash’ de mai are dupa parametrul size= valoarea egala cu marimea fisierului firmware, transformat in hexazecimal. Marimeapoate diferi intre diferite versiuni firmware

CFE> flash -ctheader -mem -size=0x531400 0x807a60b0 flash1.trx
CMD: [flash -ctheader -mem -size=0x531400 0x807a60b0 flash1.trx]
Invalid switch: -mem
*** command status = -8
CFE> help flash
CMD: [help flash]

SUMMARY

Update a flash memory device

USAGE

flash [options] filename [flashdevice]

Copies data from a source file name or device to a flash memory device.
The source device can be a disk file (FAT filesystem), a remote file
(TFTP) or a flash device. The destination device may be a flash or eeprom.
If the destination device is your boot flash (usually flash0), the flash
command will restart the firmware after the flash update is complete

OPTIONS

-noerase Don't erase flash before writing
-https select http server to upgrade
-offset=* Begin programming at this offset in the flash device
-size=* Size of source device when programming from flash to flash
-ctheader Check header of CyberTAN
-noheader Override header verification, flash binary without checking-mem;Use memory as source instead of a device

flash -ctheader : flash1.trx (upgrade code.bin/code2.bin)
flash -ctheader : flash1.trx2 (upgrade code.bin/code2.bin)
flash -noheader : flash1.trx (upgrade linux.trx)

*** command status = 0


Statusul non-zero indica o problema, explicata prin utilizarea unui parametru incorect: ‘-mem’. De aici deduc ca ghidul pe care l-am gasit nu este aplicabil. Din fericire, tot pe forumul DD-WRT am gasit si comanda compatibila cu Liknsys E2000, o comanda care le inlocuieste pe cele doua de mai sus, condensandu-le. Imediat dupa trimiterea comenzii catre router trebuie lansata expedierea fisierului firmware de pe PC (tftp -i 192.168.1.1 PUT firmware.bin), folosindu-se un firmware original de la producatorul routerului. Atentie la sintaxa corecta a comenzii, simbolul : trebuie sa aiba spatii si in stanga si in dreapta lui

CFE> ping 192.168.1.2
CMD: [ping 192.168.1.2]
192.168.1.2 (192.168.1.2) is alive
192.168.1.2 (192.168.1.2): 1 packets sent, 1 received
*** command status = 0
CFE> flash -ctheader : flash1.trx
CMD: [flash -ctheader : flash1.trx]
Reading :: _tftpd_open(): retries=0/3
Done. 5444608 bytes read
fname=flash1.trx
CODE Pattern is correct! (32XN)
Programming...done. 5444576 bytes written
*** command status = 0

Apoi am sters toti parametrii din nvram si am restartat routerul, avand incarcata in flash imaginea originala:


CFE> nvram erase
CMD: [nvram erase]
*** command status = 0
CFE> nvram commit
CMD: [nvram commit]
*** command status = 0
CFE> reboot
CMD: [reboot]

Mai jos sunt cateva din mesajele de consola afisate dupa pornirea cu firmware-ul original, versiunea 1.0.4:
---
Linux version 2.4.20 (fpan@localhost.localdomain) (gcc version 3.2.3 with Broadcom modifications) #8 Wed Dec 1 20:40:20 CST 2010
Found a 8MB ST compatible serial flash
Determined physical RAM map:
memory: 02000000 @ 00000000 (usable)
On node 0 totalpages: 8192
zone(0): 8192 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: root=/dev/mtdblock2 noinitrd console=ttyS0,115200
CPU: BCM4716 rev 1 at 354 MHz
---
Firmware version =>v1.0.04
sum3=5444608 garbage=992 n=1024
MD5=[bbd85881402fa71b01bd403da2d59ce6]
---

Super ofertă la eMag!

Related Posts Plugin for WordPress, Blogger...