Attenzione: Lo scopo di queste pagine è puramente documentale. Le informazioni qui presenti sono state ricavate tramite sperimentazione, studio e/o reverse enginering effettuati dal sottoscritto e da alcuni generosi utenti del forum ilpuntotecnicoeadsl che hanno voluto dedicare a tale scopo il proprio tempo. Lo scopo di tale studio è quello di espandere e migliorare le caratteristiche del prodotti citati. Tuttavia si sottolinea che, tali informazioni, sono puramente sperimentali, non avvalate da alcun supporto da parte della Telsey, da parte di Telecom Italia etc. Pertanto nessuna garanzia viene fornita circa l’attendibilità delle stesse. Si sconsiglia inoltre la modifica di hardware di cui non si dispone la proprietà (Es: Modem in comodato d’uso). Si ricorda infine che le modifiche citate nella maggior parte dei casi potrebbero portare all’invalidamento della garanzia da parte del produttore.
La presente guida suppone che siate in grado di accedere alla console del router tramite un apposito cavo seriale. Inoltre si suppone che le impostazioni di rete del PC siano correttamente configurate per accedre al router (Indirizzo IP in classe 192.168.1.1/24).
Inoltre le seguenti istruzioni sono state eseguite e testate su PC avente sistema operativo Linux Slackware. Non dovrebbero esserci problemi nell'applicazione delle stesse con qualunque altra distribuzione. E' possibile inoltre che le stesse possano funzionare anche in ambiente Windows+Cigwin, ma non posso garantirlo.
Lanciate minicom con il parametro -o (per evitare la fase di inizializzazione), premete CTRL-A,Z seguito dai tasti P e I per configurare i parametri corretti di trasmissione della porta seriale (115200 8N1).
Accendete il router e godetevi i messaggi di avvio. Al termine della sequenza di avvio premete INVIO per ottenere il prompt di login. Accedete con utente admin e password admin.
Per prima cosa killate il processo snmp che manda in continuazione messaggi di errore sullo stderr per segnalarci che non esiste connettività di rete.
ps
annotatevi il PID del processo che inizia per snmp e quindi fate
kill -9 PID_ANNOTATO_IN_PRECEDENZA
Adesso lanciate la shell di busybox
sh
Il prompt diventerà un #
Per poter effettuare i nostri esperimenti ci servirà uno spazio disco di adeguate dimensioni dove scrivere, inoltre ci piacerebbe potervi accedere anche dall'esterno tramite HTTP. Creiamo quindi un filesystem temporaneo di 4 MB in memoria e montiamolo nella directory /webs:
mount -t tmpfs -osize=4m tmpfs /webs
Attenzione: Prima di effettuare questa operazione verificate di NON essere all'interno della directory webs, oppure il mount avverrà in modalità ro.
pwd
Possiamo procedere a un primo backup del filesystem in maniera molto semplice: Rechiamoci nella directory /webs e creiamo un link simbolico a /dev/mtdblock0
ln -s /dev/mtdblock0 mtdblock0.gif
Il link simbolico ha l'estenzione .gif per fare in modo che il server http utilizzato ce la restituisca senza porsi ulteriori problemi. Adesso è possibile scaricare l'immagine dal PC:
wget http://192.168.1.1/mtdblock0.gif
Dovreste ottenere un file .gif che potete rinominare subito in mtdblock della dimensione di circa 2-3 MB (La versione di firmware presente sul mio Telsey è di 2809856 byte).
Il filesystem utilizzato è squashfs. Esso non è supportato nativamente dal kernel. Inoltre la versione ufficiale presente su sourceforge utilizza l'algoritmo di compressione zlib. Ovviamente la nostra immagine invece utilizza come algoritmo di compressione dei nodi lzma. Se avete interesse a montare sul costro PC questa immagine allora dovrete procurarvi la patch per il supporto squashfs (v2.0 o v3.0… la nostra immagine è v2.0) adeguato.
: Questa procedura a dispetto del titolo non permette il backup completo della flash (e cioè degli 8 Mb di cui essa è composta), ma soltanto degli ultimi 4 Mb della stessa (Che comprendono CFE, un'immagine completa di boot e la PSI_AREA). Aggiornare con le procedure che permettono il backup anche dei primi 4MB contenenti la seconda immagine di boot.
Ottenere il backup completo della flash è un poco più complicato. Infatti il kernel precompilato effettua una mappatura di una parte, e non di tutta la flash, sul device mtdblock0.
A tale scopo, ispirandomi a lavori similari presenti in rete, e utilizzando come base i sorgenti dello Speedport W500, ho modificato il modulo di gestione della flash, ottenendo in questo modo un modulo in grado di fare il mapping di tutta la flash sul device /dev/mtdblock1.
Purtroppo l'unico modo che ho trovato per poter spostare il file sul router è decisamente macchinoso.
Esso consiste nel generare, a partire dal modulo “ko” compilato, uno script di shell che esegua delle echo sulla porta /dev/ttyS0. Sfruttando quindi i parametri ”-ne” del comando echo è possibile trasportare il file compilato sul telsey.
In pratica: Da minicom:
cd /webs
Da PC:
Eseguite script.sh. Quando lo script avrà terminato il suo lavoro potrete verificare che sul router, nella directory webs, si trova ora un file chiamato bcm963xx-janniz.ko.
rm -i *
che potrà essere tranquillamente caricato (il caricamento del modulo genera un errore di hotplug che non ne pregiudica il funzionamento).
insmod bcm963xx-janniz.ko
A questo punto il device /dev/mtdblock1 riporta il contenuto dei primi 4 Mb della flash che andremo ad ottenere con il solito metodo del link.
Da minicom:
ln -s /dev/mtdblock1 mtdblock1.gif
Da PC:
wget http://192.168.1.1/mtdblock1.gif
L'immagine che otterrete sarà precisamente di 4 MB.
Il dump appena ottenuto è costituito da:
0x0 | 0xFFFF | CFE (64 KB) |
---|---|---|
0x10000 | 0x400000 | telecom.bin |
Il file binario che ho indicato con telecom.bin ha una struttura pressochè identica a un qualunque altro file di aggiornamento web prodotto dalla Broadcom ed in particolare rispecchia la struttura:
Tuttavia se utilizzato via CFE per tentare un restore dl firmware originale non funzionerà, principalmente a causa di un errore di checksum, che presumibilmente era presente nell'immagine originale ed è andato perduto all'atto del flash. Inoltre la struttura interna non è del tutto coerente con quanto specificato nell'header.
Un analisi superficiale dei 256 byte dell'intestazione rivela che in formato ASCII facilmente leggibile sono indicate:
L'intestazione ricavata dal backup della flash indica 3 immagini rispettivamente di circa 64KB, 2 MB e 500 KB, che starebbero ad indicare le immagini del CFE.bin, del rootfs, e del kernel. Tuttavia all'interno del bin sono presenti soltanti il rootfs e il kernel.
E' possibile in ogni caso ricostruire un file immagine adatto a flash via web funzionante adottando la seguente procedura:
A partire dal file mtdblock1 completo ricaviamoci i file CFE.bin:
dd if=mtdblock1 of=CFE.bin bs=65536 count=1
e telecom.bin
dd if=mtdblock1 of=telecom.bin bs=65536 skip=1
Indi, da telecom.bin otteniamo:
header:
dd if=telecom.bin of=header bs=256 count=1
rootfs.sqsh:
Le dimensioni di questa immagine sono contenute nel file header a partire dal byte 0x6A. Nel mio caso 2809856
dd if=telecom.bin of=rootfs.sqsh bs=1 count=2809856 skip=256
kernel:
Anche le dimensioni del kernel sono presenti in header, questa volta a partire dal byte 0x80. Nel mio caso 523403.
N.B: Il valore di skip viene calcolato a partire dai valori di count e di skip precedenti: 2809856+256.
dd if=telecom.bin of=kernel bs=1 count=523403 skip=2810112
Adesso possiamo rimettere tutto insieme. Procuratevi l'utility bcmImageBuilder (presente ad esempio nei sorgenti del già citato Speedport W500) ed eseguite
./bcmImageBuilder --chip 6348 --board MAGIC --blocksize 64 --output immagineDiBackup.bin --rootfsfile rootfs.sqsh --kernelfile kernel --cfefile CFE.bin
per costruire un file immagine valido per l'update via web. Attenzione: Il file CFE.bin va sempre indicato ma non sarà incluso nell'immagine creata a meno che non venga anche aggiunto il parametro -i. In tal caso l'aggiornamento effettuerà anche la riprogrammazione della porzione di flash contente CFE. Ma ve lo sconsiglio… visto che io mi sono fumato il mio W-gate in questa maniera
P.S: No! Non chiedetemelo, non vi manderò una immagine già pronta del firmware.
P.P.S: Ovviamente se ho scritto qualche cavolata siete invitati a farmelo presente…
P.P.P.S: La formattazione è abbastanza penosa lo so… e probabilmente anche la forma in alcuni passaggi… ma è notte ho sonno e non ho voglia di rileggere il tutto… Correggerò nelle revisioni successive :)