I – Conexión al puerto serie del Livebox2, How-to.

Autor: acki, sERASEr

Vamos a detallar los pasos para realizar una conexión al puerto serie del Livebox2, muy útil esto para muchos menesteres.

En primer lugar desmontamos el router, ello lo conseguimos si despegamos las cuatro gomas de asiento en la parte inferior del mismo, ocultas tras ellas tenemos tornillos tipo Torx, haceros con un destornillador de ese tipo y medida y obviamente desatornillar.

A continuación una vez abierto os muestro en la siguiente imagen el pinout del puerto serie:

Vosotros en lugar de pines vereis orificios alineados justo al lado del botón reset.

Podéis soldar pines si sois mañosos o bien cables directos a los orificios, no invertir polaridad dado que puede ser fatal, no tanto así si confundís TX con RX, pero mejor no equivocarse.

Yo uso un adaptador serial tipo USB, no me gusta poner enlaces a vendedores, pero bueno en este caso el adaptador es muy barato y apto, así pues merece la pena mostrároslo, es este:

Lo podeis comprar aqui:

http://cgi.ebay.es/CP2102-USB-to-RS232-TTL-232-Converter-Module-Chip-/220812904053?pt=LH_DefaultDomain_0&hash=item3369798675

Si optáis por un adaptador tipo USB como el que os he mostrado solo es necesario conectar GND, TX Y RX.

Por el contrario si optáis por un adaptador basado en puerto COM habréis de usar el
MAX 3232 para trabajar con tensión 3v3.

Ahora vamos a realizar la conexión, yo uso Hyperterminal, a veces da problemas con adaptadores USB, si es el caso usad Putty.

Los datos de conexión son los siguientes:

Velocidad: 57600
Bits de datos: 8
Paridad: ninguna
Bits de parada: 1
Control de flujo: xon/xoff

Usar el puerto COM por el cual sea reconocido vuestro adaptador serial.

Y eso es todo, ahora tendréis muchas posibilidades de trabajo con conexión por puerto serie.

Un saludo.

II – BOOTP en Livebox2, carga de recovery en RAM, downgrade

Autor: acki, sERASEr

Os voy a detallar como realizar una carga del firm Recovery en RAM mediante el método de flasheo denominado BOOTP.

Obviamente nos interesa cargar la versión de Recovery FAST3yyy_MRA_69223E con la cual podremos realizar downgrade sobre la última actualización denominada FAST3yyy_691288 con todas las ventajas que ello supone, no así con la FAST3yyy_MRA_69224A con la cual os obsequio a muchos usuarios Orange para conseguir tener sus routers encorsetados en sus configuraciones.

Ante todo decir que no es tan fácil como el método “load”, vamos a ello.

Primero de todo es muy interesante realizar el proceso con conexión por puerto serie, esto nos facilitara ver si todo va con normalidad, mediante conexión serial podréis observar todo el proceso con claridad, algo parecido a esto:

Código:
SAGEM Secure-boot v2.7 boxer 0.8 for ADI chipset

CPU: ADI Fusiv 160 Family
DRAM:  64 MB
Flash: 32 MB
Using default environment

In:    serial
Out:   serial
Err:   serial
voxEmac
Sagem boxer int OK.
manual recovery
force recovery bootp tftp
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
*** Unhandled DHCP Option in OFFER/ACK: 46
DHCP client bound to address 192.168.1.1
Using voxEmac device
TFTP from server 192.168.1.10; our IP address is 192.168.1.1
Filename '0101A8C0.img'.
Load address: 0x80800000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         ################
done
Bytes transferred = 3407872 (340000 hex)
Launch recovery code from ram
partition not moved
bootm 80800130
## Booting image at 80800130 ...
   Image Name:   FAST3yyy_MRA_69223E
   Created:      2010-01-08   7:08:47 UTC
   Image Type:   MIPS Linux Kernel Image (gzip compressed)
   Data Size:    3069766 Bytes =  2.9 MB
   Load Address: 80010000
   Entry Point:  801b6000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

Starting kernel ...

        .----------------------------------------------------------------.
        |                     CPU_ID = 0x6836                            |
        `----------------------------------------------------------------'

        .----------------------------------------------------------------.
        |           DYNAMICALLY DETECTED SDRAM_SIZE = 128 Mbytes         |
        `----------------------------------------------------------------'

        .----------------------------------------------------------------.
        |           DYNAMICALLY DETECTED FLASH_SIZE = 32  Mbytes         |
        `----------------------------------------------------------------'

Quien no pueda, quiera o sepa realizar la conexión por serial también podra realizar el proceso, pero estará a ciegas si algo sale mal y no se produce la carga del firm Recovery.

No me voy a extender en detalles sobre el uso servidores DHCP o TFTP, google es tu amigo.

Necesario:

-Servidor DHCP en pc.

-Servidor TFTP en pc.

-Firmware Recovery FAST3yyy_MRA_69223E renombrado a lo que os pida vuestro Livebox2, este renombramiento no es el mismo para todos los routers, podréis ver el nombre de archivo que os pide mediante conexión serial o el uso de wireshark.(En mi caso 0101A8C0.img)

Preparación:

-Configuramos con IP 192.168.1.10 y mascara de red 255.255.255.0 nuestro adaptador ethernet.

-Habilitamos servidor DHCP, yo en Windows uso este:

http://www.dhcpserver.de/dhcpsrv.htm

Mi fichero de configuración:

Código:
[SETTINGS]
IPPOOL_1=192.168.1.1-254
IPBIND_1=192.168.1.10
AssociateBindsToPools=1
DeleteOnRelease=0
ExpiredLeaseTimeout=3600

[GENERAL]
LEASETIME=86400
NODETYPE=8
SUBNETMASK=255.255.255.0
BOOTFILE=0101A8C0.img
NEXTSERVER=192.168.1.10
DNS_0=80.58.61.250
DNS_1=80.58.61.254
ROUTER_0=192.168.1.1

[DNS-SETTINGS]
EnableDNS=0
FORWARD=80.58.61.250

[TFTP-SETTINGS]
EnableTFTP=1
ROOT=C:\LBV2BOOTFLASH\wwwroot
WritePermission=1

[HTTP-SETTINGS]
EnableHTTP=0
ROOT=C:\LBV2BOOTFLASH\wwwroot
[00-30-DA-66-80-FB]
IPADDR=192.168.1.1
AutoConfig=12/06/2011 14:35:25
LeaseEnd=1323264925

-Arrancamos nuestro servidor TFTP ubicando 0101A8C0.img en el directorio TFTP.

-Conexión serial si disponemos de ella o el uso de wireshark para monitorizar si el router nos pide el mismo nombre de archivo que le hemos preparado.

Proceso:

-Mantener pulsado el boton reset, encendemos el router y no dejamos de presionar hasta ver la luz azul encenderse, esto indica la puesta en marcha del modo Recovery en el router.

-A partir de ahí, si estáis con serial veréis la carga en RAM del firmware Recovery, si no tenéis conexión serial habréis de esperar a ver si botea con el mismo.

Tened en cuenta que si reiniciáis sin realizar el flasheo al ser la carga en RAM esta no permanecerá, has de copiar en partición Recovery o Image los firmwares que posibilitan ser superuser.

Para flashear con el firmware 69127A(admite superuser) seguir este tutorial:

http://foro.seguridadwireless.net/puntos-de-acceso-routers-switchs-y-bridges/firmware-livebox-2-fast3yyy_69127a-e-instrucciones-para-downgradeupgrade/

Para flashear el firmware recovery FAST3yyy_MRA_69223E utilizad el tutorial anterior solo cambiando el comando final y teniendo en cuenta el tener el Recovery FAST3yyy_MRA_69223E.img.sz en carpeta TFTP:

Código:
loadapp app1 192.168.1.10 FAST3yyy_MRA_69223E.img.sz

Apendice:

Links de mi colección de firmwares Kiss

(a falta del 691252 que lo pondre)

-Recovery FAST3yyy_MRA_69223E

http://www.megaupload.com/?d=DTWJVX4W

-Recovery FAST3yyy_MRA_69224A

http://www.megaupload.com/?d=PEWF384T

-Image FAST3yyy_69127A

http://www.seguridadwireless.net/livebox/openrg.img

-Image FAST3yyy_691288

http://www.megaupload.com/?d=GMWSSXP0

III – Reemplazo de U-boot en Livebox2, utilidades, pros y contras.

Autor: acki, sERASEr

Decir que este es un proceso delicado, si bien es sencillo de realizar cualquier error o hecho inesperado puede convertir tu Livebox2 en un bonito ladrillo, no me hagas responsable si algo sale mal.

Se puede realizar el proceso con el firmware RECOVERY cargado en RAM mediante BOOTP,  también  con los firms RECOVERY y 69127A una vez que estos han arrancado normalmente.

Sustituir el U-boot Sagem de nuestro Livebox2 por el U-boot FUSIV-DIALFACE del router italiano Agif nos da otras posibilidades totalmente distintas a las que nos ofrece el bootloader original, aunque también tiene sus contras.

PROS:

-Fundamentalmente la ventaja es poder cargar otros firmwares, actualmente Open-wrt aunque algo limitado aun, esto es gracias al enorme trabajo desarrollado por acki, el cual ha tenido que sortear numerosísimos obstáculos para poder correr dicho firmware en el Livebox2.

CONTRAS:

-No es capaz de cargar firmwares originales, ni tan siquiera los del router origen de este U-boot.

-Riesgo de brick, si haces todo bien no debe haber problema, pero un corte de luz o cualquier otro inconveniente puede terminar con un preciso ladrillo blanco, aunque decir que el proceso de flasheo realmente dura apenas unos segundos, así pues el riesgo es mínimo si haces todo correctamente.

-Desaparece el arranque por BOOTP.

-No funciona el ethernet, así pues la vía de transmisión de archivos con el U-boot Agif se limita al uso de Kermit sobre el standard RS232, obviamente con una velocidad de transmisión de datos muchísimo menor que la ethernet.

Pocos PROS y muchos CONTRAS ¿verdad?

En definitiva, esto solo es viable para gente que quiera abandonar los firmwares de Orange para ayudar a desarrollar a acki imagenes Open-wrt, así como se abre un campo sin explorar sobre modificar firmwares originales.

Sopesa si te interesa seguir con el tema realmente o mejor parar aqui, aunque decir también que el proceso es totalmente reversible.

Vamos al tema:

Desde el prompt siendo super usuario con el servidor TFTP activo con el archivo en la carpeta por defecto teclear lo siguiente:

Código:
load -u tftp://192.168.1.10/boot_agif.bin -s 00

Reinicia y veras algo así si todo va bien:

Proceso satisfactorio

Y bueno ya puedes explorar las posibilidades que nos ofrece este U-boot.

Quiero dar las gracias por la cesión de un dumpeo de flash completo del router italiano Agif al usuario kikko del foro Zibri´s Forum: http://forum.zibri.org/ dado que sin el no hubiésemos podido llevar a cabo gran parte del trabajo acki expuesto.

Jamás uséis el U-boot original del router Agif, esto hace al Livebox2 entrar en un bucle de reinicios constantes, usa siempre el U-boot que nosotros colgamos aquí debidamente retocado.

acki teneis el U-boot Agif “domado” entre otros archivos:

http://newshell.bshellz.net/~acki/

IV – El kernel: Modificacion, compilacion, preparacion e instalacion

Autor: acki, sERASEr

Antes de entrar en materia, lo primero es descargar el kernel que proporciona Orange, nuestro parche contra el mismo y el toolchain (compilador, librerias y utilidades) para poder compilarlo. Tambien el cpio que utilizaremos como sistema de ficheros inicial.

- El kernel puede descargarse aqui
- El toolchain aqui
- El parche con nuestras modificaciones aqui
- El sistema de ficheros aqui

NOTA: Este sistema de ficheros, inicialmente era copiado del router. Ya no lo es. “Nacio” de mi primera compilacion exitosa del Openwrt, mas concretamente la version Kamikaze.

El siguiente paso es descomprimir el toolchain. Mi consejo es que utiliceis un sitio “neutro”, como /opt por ejemplo. Os creara un directorio llamado mips-linux-uclibc. Entramos en este directorio y veremos el “raiz” del toolchain:

Código:
bin  include  info  lib  libexec  man  mips-linux  mips-linux-uclibc

Como se puede ver, hay directorio bin, lib, include… todo lo necesario para compilar cualquier cosa, aunque en nuestro caso, solo haremos el kernel, que no tiene ninguna complicacion.

MODIFICACION:

Este es un kernel mangoneado -porque no se puede utilizar otra palabra mejor-. Aparte de make o make ARCH=mips clean, poco mas se puede hacer (bueno, si. Se puede hacer make modules y make modules_install). Olvidaros de configurarlo interactivamente. No hay ni (make) xconfig, menuconfig, oldconfig, etc. Quien quiera añadir opciones, modulos, etc, debera añadirselas manualmente al .config que viene “de fabrica”. Y por supuesto debera tener en cuenta que las opciones muchas veces tienen dependencias, que a su vez pueden tener otras dependencias, etc. Quien desee hacer algun cambio, tendra que hacer visita obligada a los ficheros Kconfig correspondientes. Mas aun, por alguna razon esoterica que ignoro, en ocasiones ni siquiera añadiendo al .config sera suficiente. Por mi propia experiencia he descubierto que algunas opciones NO LAS AÑADE en tiempo de compilacion al fichero include/linux/autoconf.h, lo que implica que las ignora por completo. Tendreis que tener mucho ojo con esto.

Como culturilla general sobre este kernel, nada mas añadire que…. Faltan ficheros. Otros sobran. Otros no estan donde deberian estar. Aun otros estan donde no deberian (ojo, no es lo mismo que la anterior). Otros estan horrible y horrorosamente (mal) modificados. En fin, una delicia. Afortunadamente, nuestro parche corrige algunos de estos problemas. Para aplicarlo hacemos:

Código:
# patch -p0 < livebox2_kernel.patch

Una vez aplicado el parche, sera necesario que editeis el fichero .config y busqueis y modifiqueis CONFIG_INITRAMFS_SOURCE haciendola apuntar al path donde hayamos copiado el sistema de ficheros cpio.

Por ejemplo:

Código:
CONFIG_INITRAMFS_SOURCE="/home/acki/filesystem.cpio"

NOTA: No cambieis la extension del fichero. El nombre puede cambiarse si quereis, pero la extension absolutamente NO.

COMPILACION:

- Primero, actualizaremos el path para que apunte tambien al /bin del toolchain (el que no sepa como hacer esto, mejor que no continue, en serio). Procurad no hacer este cambio permanente, porque de lo contrario tendreis problemas a la hora de compilar el OpenWRT.
- Entramos dentro del directorio donde hayamos extraido el kernel, y simplemente hacemos make. Para los puristas, lo normal seria hacer:

Código:
# make ARCH=mips CROSS_COMPILE=mips-linux-uclibc-

Porque, de hecho, si haceis algun cambio en el .config y quereis recompilar limpiamente (el clasico clean), debereis usar:

Código:
# make ARCH=mips clean

Porque si no lo haceis asi, intentara hacer un clean de la arquitectura x86, lo cual no es lo que pretendiais hacer.

Una vez compilado el kernel, que como vereis tarda unos pocos minutos, tendreis un hermoso vmlinux en el directorio raiz de los fuentes. Como veis no es un bzImage ni un zImage a los que estamos acostumbrados, y ademas podreis apreciar que tiene un tamaño desproporcionadamente grande. Todos tranquilos, no pasa nada. Es un kernel en bruto, con simbolos e informacion de debug y sin comprimir. Y ademas con un pequeño sistema de ficheros incrustado. Todo esto lo veremos a continuacion.

PREPARACION:

Una vez compilado el kernel, tenemos un vmlinux muy grande, como vimos antes. Ahora vamos a dejarlo en condiciones de ser instalado en el router. En primer lugar, necesitaremos tener instaladas las u-boot-tools. Para debian/ubuntu haremos lo siguiente:

Código:
# sudo apt-get install u-boot-tools

Para otras distribuciones, pues ya sabeis, yum, urpmi. zypper…etc.

Una vez instalado el paquete, ya dispondremos de la utilidad mkimage, la que nos creara uImages para usar con nuestro u-boot. Para ello vamos a proceder de la siguiente forma:

- Hacemos un strip al kernel (OJO, un strip MIPS, o sea el strip del toolchain).

Código:
# mips-linux-uclibc-strip vmlinux

Como podreis observar, el tamaño ahora es muchisimo menor.

- Ahora obtendremos los puntos de entrada (entry point) y de carga (load address) del kernel. Usaremos readelf. Aqui podemos usar el del toolchain o el estandar de nuestro linux. Al fin y al cabo el formato ELF es igual para todas las arquitecturas:

Citar
# readelf -l vmlinux

Elf file type is EXEC (Executable file)
Entry point 0x802fa000
There are 1 program headers, starting at offset 52

Program Headers:
Type                 Offset       VirtAddr      PhysAddr              FileSiz      MemSiz   Flg    Align
LOAD           0×002000 0×80010000 0×80010000 0×303086 0x3ab020 RWE 0×2000

* * * * * * * *

Asi, como se observa arriba en rojo, ya tenemos los puntos de carga y entrada.

- Aun nos queda un ultimo paso. Vamos a convertir el kernel a binario. Digamos simplemente que se eliminan las cabeceras ELF. Esto es totalmente necesario, NO saltarse este paso.Usaremos el comando objcopy del toolchain:

Código:
# mips-linux-uclibc-objcopy -O binary vmlinux vmlinux.bin

Por ultimo, comprimimos el kernel. Tecnicamente se puede usar compresion bzip2, gzip, lzma y lzo, como dira vuestro mkimage. Yo no he probado otra que no sea gzip, y desconozco las capacidades con las que fue compilado el u-boot. Seguramente funcionen, pero vosotros mismos Smiley

Código:
# gzip --best vmlinux.bin

Bien, ya tenemos el kernel en modo binario, comprimido y ademas conocemos la arquitectura y los puntos de carga y entrada. Ya podemos ejecutar mkimage y crear nuestra uImage para metersela al router.

Veamos:

Código:
# mkimage -A mips -O linux -T kernel -C gzip -a 0x80010000 -e 0x802fa000 -n "Pruebas" -d vmlinux.bin.gz uImage

Como podeis ver, todos los parametros estan claros. Por si acaso, asi sale en la ayuda del mkimage

Código:
          -A ==> set architecture to 'arch'
          -O ==> set operating system to 'os'
          -T ==> set image type to 'type'
          -C ==> set compression type 'comp'
          -a ==> set load address to 'addr' (hex)
          -e ==> set entry point to 'ep' (hex)
          -n ==> set image name to 'name'
          -d ==> use image data from 'datafile'

INSTALACION:

Ahora solo nos queda instalar esta uImage en el router. Es bastante sencillo, pero hay que poner especial cuidado en algunas cosas.

En primer lugar hay que subir la uImage. Desgraciadamente no tenemos red, asi que no nos queda mas remedio que usar el viejo kermit. Tambien, aprovecho para comentar que os recomiendo encarecidamente utilizar el putty como terminal para conectarse al router. NO USEIS el minicom. Tampoco useis el propio kermit como terminal al menos mientras enviais el fichero.

Bueno, procedemos a instalar ambos programas:

Código:
# sudo apt-get install ckermit putty

NOTA: Usad mejor el ckermit aunque tengais el gkermit instalado en vuestro sistema. Los de otras distribuciones, ya sabran como hacerlo tambien.

Una vez instalados ambos programas, creamos un fichero de configuracion para el kermit, que llamaremos por ejemplo kermit.cfg. Tal que asi:

Código:
set line /dev/ttyUSB0
set speed 57600
set carrier-watch off
set flow-control none
set prefixing all
set parity none
set stop-bits 1
set modem none
set file type bin
set file name lit

Ahora configuraremos el putty asi:

Bien. Conectemonos al router con putty. Tambien con kermit asi:

Código:
# kermit /<path>/kermit.cfg

Ahora en el prompt del router hacemos:

Código:
# loadb

Y en el kermit:

Código:
 C-Kermit>send /<path>/uImage

Y a esperar 6 o 7 minutos  Grin

Una vez finalizada la transferencia vereis algo asi en el router:

Citar
## Total Size      = 0x001FF96B = 2095467 Bytes
## Start Addr      = 0×80400000

Bien. El router tiene 16MB de flash, que el u-boot mapea desde la direccion 0XBF000000 hasta la 0xBFFFFFFF. La particion BOOT original del router va desde 0xBF000000 hasta 0xBF09FFFF (0xA0000 bytes), por lo que no se podran utilizar direcciones en ese rango. La primera direccion utilizable seria la 0xBF0A0000 entonces. Ademas, hay que tener en cuenta que el tamaño de sector de esta flash es de 128k, o sea, 128*1024 = 131072 = 0×20000. Esto implica que hay que grabar el kernel en cualquier direccion que sea multiplo de 0×20000 (aunque nosotros usaremos 0xBF0A0000 por razones que veremos mas adelante), dado que no se puede empezar a escribir en medio de un sector.. Usad la calculadora. Tomemos como ejemplo la primera direccion libre, la 0xBF0A0000, entonces:

0xBF0A0000 = 3205103616 / 131072 = 24453 EXACTO. Por lo tanto es multiplo y sirve.

Otra al azar:

0xBF57FB8A = 3210214282 / 131072 = 24491,9912872. Va a ser que no. Las mas aproximadas serian 24491 * 131072 y (24491+1) * 131072, o sea, 0xBF560000 y 0xBF580000

Espero que se haya entendido esto aunque solo sea por cultura general.  Grin Grin Grin

Volvamos a nuestro router. Lo primero que tenemos que hacer es borrar la parte de la flash que vamos a usar. Usaremos, como dije antes, la direccion la direccion 0xBF0A0000 (no la cambieis u os arrepentireis despues) y el tamaño que nos salio en la subida, en este caso 0x001FF96B (no olvidad el signo + porque asi alinea automaticamente a sector).

Código:
# erase 0xBF0A0000 +0x001FF96B

................................................ done
Erased 16 sectors

Una vez borrado, procedemos al ultimo paso. Copiar el kernel a flash (hasta ahora estaba en memoria). De nuevo, nos fijamos en los valores de la subida y hacemos (tardara un ratito, paciencia):

Código:
# cp.b 0x80400000 0xBF0A0000 0x001FF96B
Copy to Flash... done

Listo, ahora ejecutamos:

Código:
# bootm 0xBF0A0000

Y tenemos un bonito shell en el router.

V – OpenWRT: Modificacion, compilacion e instalacion

Autor: acki, sERASEr

Ahora que tenemos shell en nuestro router, vamos a instalar OpenWRT. Paso a paso.

Primero de todo, descargaremos:

- OpenWRT backfire 10.03 aqui
- Parche para incluir nuestro router en OpenWRT aqui

MODIFICACIONES:

Descomprimir los fuentes de OpenWRT. Despues aplicaremos nuestro parche:

Código:
# patch -p0 < livebox2_backfire.patch

COMPILACION DE OPENWRT:

En primer lugar, asegurarse que no tenemos en nuestro $PATH el toolchain que usamos para compilar el kernel. En otro caso, no compilara. Avisados estais.

Si preferis añadir mas paquetes a los pocos que yo inclui, haceis:

Código:
# make menuconfig

Y simplemente elegid los que querais.

Aparte de esto, para compilar simplemente es cuestion de hacer:

Código:
# make

Deberia compilar perfectamente (despues de hora y media o 2 horas, dependiendo de vuestra CPU y velocidad de conexion), pero yo os aconsejaria hacer esto:

Código:
# make V=99

De esta forma, la compilacion no sera silenciosa. Un monton de mensajes de compilacion, descarga, etc apareceran en vuestro terminal, pero en caso de error -esperemos que no- sera mas facil detectar donde.

Una vez la compilacion ha finalizado, encontrareis lo siguiente en el directorio bin/ de los fuentes del OpenWRT:

Código:
# ls -l
total 21040
-rw-rw-r-- 1 acki acki  2359296 2011-11-18 18:06 livebox2-root.jffs2-128k
-rw-rw-r-- 1 acki acki  2359296 2011-11-18 18:06 livebox2-root.jffs2-64k
-rw-rw-r-- 1 acki acki  1441792 2011-11-18 18:06 livebox2-root.squashfs
-rwxrwxr-x 1 acki acki  2012248 2011-11-18 18:06 livebox2-vmlinux.elf
-rw-rw-r-- 1 acki acki      229 2011-11-18 18:06 md5sums
-rw-rw-r-- 1 acki acki 13322032 2011-11-18 18:06 OpenWrt-ImageBuilder-livebox2-for-Linux-x86_64.tar.bz2
drwxrwxr-x 2 acki acki     4096 2011-11-18 18:06 packages
#

Estos ficheros son: Dos imagenes jffs2  (alineadas a 64k y 128k) y una imagen squashfs; un kernel “fantasma” que podemos borrar con total tranquilidad, porque nosotros vamos a usar “el nuestro”, el ImageBuilder, que nos servira para crear imagenes sin tener que recompilar, y un fichero con los md5 de los anteriores. Tambien un directorio con todos los paquetes que hayais elegido.

INSTALANDO Y (DES)CONFIGURANDO OPENWRT:

Ahora vamos a instalar OpenWRT en nuestro router. Tecnicamente, deberia hacerse desde el u-boot, pero nuestros intentos fueron baldios. Asi que lo haremos de una forma mas heterodoxa, pero prefectamente funcional.

Encendamos el router y arranquemos nuestro shell. Veamos esto:

Código:
# cat /proc/mtd
dev:    size           erasesize    name
mtd0: 000a0000 00020000 "boot"
mtd1: 00200000 00020000 "kernel"
mtd2: 00d60000 00020000 "jffs2"
#

Esto que vemos son las particiones de la flash. Una para el boot, otra para el kernel y otra que dedicaremos para nuestra imagen, que como podemos ver se corresponde con mtd2.
Bien, copiemos el fichero livebox2-root.jffs2-128k a un lapiz USB (o a un disco, como prefirais). Como vereis, al conectarlo, el router mostrara mensajes reconociendo el dispositivo como sda, y con una particion (si es que teneis solo una), sda1. Creamos un punto de montaje y la montamos:

Código:
# mkdir /mnt
# mount /dev/sda1 /mnt

Ahora, vamos a “volcar” el fichero sobre el dispositivo correspondiente, en nuestro caso el /dev/mtdblock2 (OJO, no confundirse o tendreis un hermoso brick):

Código:
# dd if=/mnt/livebox2-root.jffs2-128k of=/dev/mtdblock2

Facil, ¿Verdad?. Bien, vamos a comprobar que ha funcionado. Vamos a montar esta particion, de nuevo creando un punto de montaje antes:

Código:
# mkdir /jffs2
# mount -t jffs2 /dev/mtdblock2 /jffs2

Vereis que se produce un warning, no pasa nada, podeis ignorarlo. Id al directorio y ved los contenidos:

Código:
# ls /jffs2
bin      etc      lib      overlay  rom      sbin     tmp      var
dev      init     mnt      proc     root     sys      usr      www
#

Ahora lo que vamos a hacer es copiar el /dev del CRAMFS al Openwrt, es decir de SDRAM a FLASH. Tecnicamente, esto no deberia ser necesario dado que OpenWRT provee las 3 formas conocidas de /dev dinamico, pero yo no fui capaz de hacer funcionar ninguna. Si lo conseguis, postearlo aqui, por favor.

Se que podria usar cp, pero voy a usar el tar a la antigua usanza:

Código:
# tar cvf /tmp/devs.tar *

Ahora simplemente “des-tareamos” en /jffs2/dev

Código:
# cd /jffs2/dev
# tar xvf /tmp/devs.tar

Bueno, a partir de aqui, si se es un experto en OpenWRT probablemente sabras hacer esto mucho mejor que yo, pero sino, asi es como yo lo hice. Por pasos:

1.- Borraremos los contenidos de /jffs2/etc/modules y /jffs2/lib/modules/2.6.15 (si hay alguno). Recordemos que hemos compilado el kernel por separado. Este paso no es estrictamente necesario para que arranque, pero os aconsejo que lo hagais.
2.- Renombrad /jffs2/lib/firewall/uci_firewall.sh. Esto evitara un monton de errores en consola. Ademas, si ni siquiera tenemos lan, para que necesitamos un firewall ?
3.- Editar el /jffs2/etc/preinit y cambiar pi_suppress_stderr y pi_init_suppress_stderr de ‘n’ a ‘y’. De nuevo, esto no es necesario para que arranque, pero mejor no suprimir mensajes de stderr por si hubiera algun problema.
4.- Ir a /jffs2/lib/preinit y modificar los scripts para evitar que /dev se monte dinamicamente… o simplemente sobreescribir con mis modificaciones. Si podeis hacerlo mejor, posteadlo aqui.

Y nada mas. Todo lo que resta es compilar nuestro kernel de nuevo, comentando o eliminando primero la linea del .config donde hacemos referencia a la ubicacion de nuestro CPIO: CONFIG_INITRAMFS_SOURCE. Pues eso, compilamos e instalamos de nuevo el kernel (ver el hilo correspondiente si no recordamos).

(OPCIONAL) CAMBIAR EL PARTICIONADO DE LA FLASH:

Podeis cambiar el particionado de la flash si os apetece, o encontrais una buena razon para ello. Solamente es cuestion de ir a los fuentes del kernel y editar el fichero drivers/mtd/maps/livebox2.c. Particularmente, esta parte:

Código:
static struct mtd_partition fusiv_mtd_partitions[] = {
    {
      .name = "boot",
      .offset = 0x00000000,
      .size = 0x000a0000,
      .mask_flags = MTD_WRITEABLE, /*read only*/
    },{
      .name = "kernel", 
      .offset = MTDPART_OFS_APPEND,
      .size = 0x00200000,
      .mask_flags = MTD_WRITEABLE,
    },
#if defined CONFIG_SAGEM_LBV2ULT || defined CONFIG_SAGEM_BOXER
    ,{
      .name = "jffs2", 
      .offset = MTDPART_OFS_APPEND,
      .size = 0x00d60000,       
      .mask_flags = 0,
    },
#endif

Pero solamente si estais muy seguros de lo que haceis. No es necesario decir que hay que tener MUCHO CUIDADO

COMENTARIO FINAL:

Antes de embarcarme en este proyecto, tenia CERO PATATERO conocimiento de OpenWRT (y no es que tenga mucho ahora tampoco), y la documentacion es…hmmm… dejemoslo pasar Wink

En cualquier caso, sed comprensivos.

EPILOGO:

Para automatizar el arranque completamente, vamos al prompt delu-boot y escribimos:

Código:
setenv bootcmd 0x002a0000
setenv bootdelay 5
saveenv

Logicamente, el delay lo elegis vosotros.

VI – Modulos, GPIO, kernel varios

Autor: acki, sERASEr

MODULOS:

Ahora que ya hemos instalado OpenWRT en nuestro router, ¿ Por que no cargamos los modulos del firmware original y vemos que se puede hacer?

Primero, debereis localizar (y copiar) los modulos del firmware original. No voy a explicarlo aqui, deberia ser facil para cualquiera. Eso si, una vez copiados hay que renombrarlos de .o a .ko. Entonces ya se podran cargar.

Este es el orden descendiente de carga:

Citar
kos_lib.ko
kleds_mod.ko
fusivlib_lkm.ko
peri_ap_lkm.ko
bmdriver_lkm.ko
sysutil.ko
timers_lkm.ko
ethdriver_lkm.ko
uart2.ko
atmdriver_lkm.ko
btn200.ko —-> Este no deberia estar aqui, es para un hardware diferente!!!
btn160.ko
kstart_leds_lums_mod.ko
wlan.ko
wlan_acl.ko
wlan_scan_ap.ko
wlan_tkip.ko
wlan_wep.ko
wlan_xauth.ko
wlan_ccmp.ko
ath_hal.ko
ath_dfs.ko
ath_rate_atheros.ko
ath_pci.ko
ath_pktlog.ko
log_chardev.ko
rg_fastpath.ko
ethsw200.ko —-> Este no deberia estar aqui, es para un hardware diferente!!!
ethsw160.ko  —> Este es la CLAVE de todo!!!!!! (Ver mas abajo)
igmp_proxy_mod.ko
rg_fastpath_bridge.ko
rg_bridge.ko
tcp_mss.ko
mod_fuwredirect.ko
frag_cache_mod.ko
rg_dhcp_pktfil.ko
rg_ipv4.ko
pppoe_relay.ko
be_pppoa_mod.ko
hci_uart.ko
qos_ingress.ko
clip_mod.ko
dspvoice.ko
genVoice.ko
relay.ko
slash_proc_mod.ko
sagem_dect_upper.ko
extended_hid.ko
sagem_dect_ctrl.ko
ohci-hcd.ko  –> No es necesario como modulo. Ya esta incluido en el kernel
ehci-hcd.ko      –>  “   ”          “   ”        “   ”         ”       ”

hard_watchdog_module.ko

Bueno, como podeis ver, todos cargan menos el ethsw160.ko. Este es el driver para el switch Marvell 88E6061. Si os fijais en el intento de carga, os dareis cuenta que indica “card_id=768″ (correcto) y “switch_id=0xfff” (incorrecto, deberia ser 0×61). No se porque ocurre esto, y desgraciadamente tampoco he podido arreglarlo. Pero kernels mas modernos TIENEN un driver para este switch. Descargaros cualquier kernel superior a la version 2.6.27 y vereis en net/dsa:

Código:
dsa.c       Kconfig   mv88e6060.c        mv88e6131.c  mv88e6xxx.h  tag_dsa.c   tag_trailer.c
dsa_priv.h  Makefile  mv88e6123_61_65.c  mv88e6xxx.c  slave.c      tag_edsa.c

Estos mv88e6xxx.c y .h prometen, eh? Si claro… pero intentad hacerlo funcionar en nuestro kernel 2.6.15 y vereis que es practicamente imposible. La unica solucion seria portar la arquitectura de este router a un kernel mas moderno (ver mas abajo).

La mala noticia es que sin poder cargar este driver, no hay mucho que podamos hacer con nuestro router.

GPIO:

Se pueden controlar la mayoria de los botones y leds del router a voluntad. Simplemente echad un ojo a /proc/driver/gpio/bits

Código:
root@OpenWrt:/proc/driver/gpio# cat bits
bit24=-1 ()
bit23=-1 ()
bit22=-1 ()
bit21=-1 ()
bit20=-1 ()
bit1f=1 (12: Reset Hub Usb (active High) (out))
bit1e=1 (30: Reboot gateway: short press=reboot, long press= On/Off (in))
bit1d=0 (29: Command Power Off (active low) (out))
bit1c=0 (28: Ethernet Switch Reset (active low) (out))
bit1b=0 (24: Default Config Button (Active low) (in))
bit1a=0 (26: Wifi association button (in))
bit19=0 (25: Power fall warning for dying gasp function (active low /in))
bit18=1 (23: Dedicated MII2 Interface)
bit17=1 (22: Dedicated MII2 Interface)
bit16=1 (21: Dedicated MII2 Interface)
bit15=1 (20: Dedicated MII2 Interface)
bit14=1 (17: Overcurrent detection on VUSBH (in))
bit13=1 (16: AFE reset (active low) (out))
bit12=1 (18: USB Host 2 Power Enable (Active High) (out))
bit11=1 (15: USB Host Power Enable (Active High) (out))
bit10=1 (14: Line 2 relay (Active low) (out))
bitf=0 (19: Line 1 relay (Active low) (out))
bite=1 (13: Load command for CLIP (out))
bitd=0 (27: WAN Led Green (in/out))
bitc=0 (10: WAN Led Red (in/out))
bitb=0 (31: Update Blue Led (in/out))
bita=1 (11: Power On Led (in/out))
bit9=0 (9: Lan Led (in/out))
bit8=0 (8: Phone Led (in/out))
bit7=1 (7: Wifi Led (in/out))
bit6=1 (6: Config Bit 3 (in))
bit5=1 (5: Config Bit 2 (in))
bit4=1 (4: Config Bit 1 (in))
bit3=0 (2: FXO Chip Select (Active low) (out))
bit2=0 (1: FXS SPI Chip Select (Active low) (out))
bit1=0 (3: FXSs, FXO devices reset (Active low) (out))
bit0=-1 ()

Usad el tipico  echo valor > bits, por ejemplo:

Código:
root@OpenWrt:/proc/driver/gpio# echo "bitb=1" > bits

encendera el led azul (que suele significar una actualizacion de firmware, pero no en este caso Smiley)

Para mas detalles, mirad los fuentes en arch/mips/adi-fusiv/.

KERNEL VARIOS:

Yo he intentado portar la arquitectura del router a un kernel moderno. No fui capaz. Pero si hay algun valiente con los conocimientos necesarios, esta es la informacion que le puedo proporcionar sobre los ficheros que hay que copiar/modificar para ello.

Citar
arch/mips/adi_fusiv/*
include/asm-mips/mach-adi_fusiv/*
include/vendor/*
arch/mips/kernel/cpu-probe.c
arch/mips/kernel/lx4189.c
arch/mips/kernel/proc.c
arch/mips/kernel/gdb-low.S
arch/mips/kernel/gdb-stub.c
arch/mips/kernel/process.c
arch/mips/kernel/traps.c
arch/mips/mm/cache.c
arch/mips/mm/c-lx4189.c
arch/mips/mm/tlbex.c
include/uart2/uart2_wrapper.h
drivers/uart2/uart2_wrapper.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/ehci-vox160.c
drivers/usb/host/ohci-vox160.c
drivers/usb/gadget/epautoconf.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/gadget_chips.h
include/linux/sbi_defs.h
include/linux/sbi_ioctl.h
include/linux/sbi_k_160.h
include/linux/sbi_k_200.h
include/linux/sbi_k.h
include/linux/if_vlan.h
include/linux/pci_ids.h
include/main/sbi_u.h
include/main/init_sbi_ioctl.h
include/rg_os.h
include/igmp_proxy_consts.h
include/kos_chardev_id.h
include/openssl/opensslv.h
include/dyn_field.h
include/adi6843.h
include/timer.h
include/asm-mips/cpu-features.h
include/asm-mips/cpu.h
include/asm-mips/isadep.h
include/asm-mips/mmu_context.h
include/asm-mips/module.h
include/asm-mips/pgtable-32.h
include/asm-mips/pgtable-bits.h
include/asm-mips/pgtable.h
include/asm-mips/stackframe.h
include/asm-mips/string.h
include/net/route.h
include/openssl/opensslv.h
net/core/dev.c
net/core/skbuff.c
net/ipv4/route.c

Pues eso, todos estos mas los correspondientes Kconfigs, Makefiles, etc. No parece una tarea facil, verdad? Ademas, estos son los que yo encontre. Seguro que hay mas  …..

Alguien se atreve?