Post técnico de firmwares. (solo usuarios registrados)

#1
Hola de nuevo a todos,

Como ya sabéis, cuando tengo unas horas libres (habitualmente en las madrugadas) me gusta aprender y ejercitar la única neurona que tengo. En el foro Linksys hemos estado trabajando durante algunos meses con Tomato, un firmware robusto que nos ha permitido gracias a la distribución del código fuente realizar algunas modificaciones en funciones que algunos de nosotros considerabamos que eran necesarias en un router. Así hemos conseguido añadir algunas funciones que han hecho que el router WRT54GL con Tomato sea el favorito de los usuarios de ONO y de los programas P2P.
Adelantándome un poco a los futuros routers y necesidades de los internautas con la aparición de las primeras conexiones FTTH vemos que nuestro WRT54GL se va a quedar justo cuando queramos bajar programas a velocidades de sincronización elevadas ofrecidas por estas nuevas tecnologías.
Este post os mostrará documentos técnicos sobre firmware y la tendencia de los nuevos desarrollos y modelos de routers que se podrán beneficiar con las nuevas plataformas de programación.

Saludos
 
#2
El primer post que os puede servir de base para saber como está organizado el firmware en un router. Lo conseguí en la ultima presentación de OpenWRT en el OpenWrt Fosdem 2008 celebrado en Bruselas en Enero de este año.

Tuve la oportunidad de aprender y quedarme con la boca abierta durante las dos horas de presentación de OpenWRT, su estructura, el porqué desarrollaron un firmware así y el futuro del proyecto.

Aquí os dejo dos documentos que son cruciales para entender el firmware en un router y una valiosa herramienta de partida para cualquier zonero que quiera aprender y comenzar con sus pinitos en el mundo de la programación de dispositivos de comunicaciones.

Diseño y desarrollando con OpenWRT

Presentación OpenWRT... como convertirse en desarrollador de OpenWRT

Qué marcas y modelos de routers soportan OpenWRT? (en algunos momentos está fuera de juego...;) ).

Prerequisitos para entender algo. Usuario Linux nivel 3, Javascript e idioma Inglés (la presentación es más gráfica y con un inglés básico lo entenderéis bien).

Saludos ;)
 
#3
La información es libre :) y compartirla es inteligente, se buscan desarrolladores ...

http://downloads.openwrt.org/sources/
http://mirror2.openwrt.org/sources/
http://wireless.kernel.org/en/users/Drivers/b43
http://wiki.openwrt.org/OpenWrtDocs/Cus ... rdware/MMC
http://wiki.openwrt.org/OpenWrtDocs/Cus ... rdware/USB
http://duff.dk/wrt54gs/
http://broadcom.com/collateral/pb/5354-PB01-R.pdf
svn://svn.dd-wrt.com/DD-WRT

Compilar y depurar aplicaciones con las herramientas de programación de GNU. Un documento muy interesante para nível medio-bajo que te dará una visión de las diferentes herramientas de programación para software GNU. Enlace: http://dymas.ii.uam.es/~flh/macprog/GCC.pdf

Construcción de programas con make. Este documento pretende recoger toda la información necesaria para poder escribir ficheros Makefile usados para controlar la construcción de un programa con el comando make. Enlace: http://dymas.ii.uam.es/~flh/macprog/make.pdf

En esta sección de tutoriales tenéis herramientas muy aconsejables, en todos los casos se pide un conocimiento de Java y lenguaje C.. y C++ no está de más.
http://www.macprogramadores.org/tutoria ... .shtml#GCC

Saludos
 
#4
Comandos para tener a mano

ps w | muestra los módulos que están cargados
netstat -an | muestra las conexiones a Internet de nuestro router y los puertos.
top | muestra los procesos que están corriendo y el consumo de memoria y CPU
nmap -sP (ejemplo...10.10.2.0/16) | Nos localiza dispositivos en la red


Saludos
 
#5
Que se necesita para compilar o modificar Tomato?

Una distribución Linux, si se trabaja con Suse por ejemplo seleccionar el entorno de desarrollo durante la instalación o a través del YasT.

Si se trabaja con Ubuntu, seleccionar los siguientes paquetes en Synaptics o escribe desde el prompt:

victek@roller:~$ sudo apt-get install aptitude build-essential binutils flex bison autoconf gettext texinfo sharutils subversion libncurses5-dev ncurses-term zlib1g-dev g++ y pulsas Intro
*******************************************************************************************************
Reading package lists... Done
Building dependency tree
Reading state information... Done
aptitude is already the newest version.
binutils is already the newest version.
The following extra packages will be installed:
automake autotools-dev dpkg-dev g++-4.3 libapr1 libaprutil1
libstdc++6-4.3-dev libsvn1 m4
Suggested packages:
autoconf2.13 autobook autoconf-archive gnu-standards autoconf-doc libtool
bison-doc debian-keyring g++-multilib g++-4.3-multilib gcc-4.3-doc
libstdc++6-4.3-dbg cvs gettext-doc libstdc++6-4.3-doc mailx subversion-tools
db4.6-util texinfo-doc-nonfree texlive-base texlive-generic-recommended
texlive-latex-base
The following NEW packages will be installed:
autoconf automake autotools-dev bison build-essential dpkg-dev flex g++
g++-4.3 gettext libapr1 libaprutil1 libncurses5-dev libstdc++6-4.3-dev
libsvn1 m4 ncurses-term sharutils subversion texinfo zlib1g-dev
0 upgraded, 21 newly installed, 0 to remove and 0 not upgraded.
Need to get 13.9MB of archives.
After this operation, 58.9MB of additional disk space will be used.
Do you want to continue [Y/n]? y
Get:1 http://es.archive.ubuntu.com jaunty/main m4 1.4.11-1 [218kB]
Get:2 http://es.archive.ubuntu.com jaunty/main flex 2.5.35-6ubuntu1 [244kB]
Get:3 http://es.archive.ubuntu.com jaunty/main autoconf 2.63-2ubuntu1 [508kB]
Get:4 http://es.archive.ubuntu.com jaunty/main autotools-dev 20080123.2 [62.6kB]
Get:5 http://es.archive.ubuntu.com jaunty/main automake 1:1.10.2-0ubuntu3 [526kB]
Get:6 http://es.archive.ubuntu.com jaunty/main bison 1:2.3.dfsg-5 [347kB]
Get:7 http://es.archive.ubuntu.com jaunty/main libstdc++6-4.3-dev 4.3.3-5ubuntu4 [1356kB]
Get:8 http://es.archive.ubuntu.com jaunty/main g++-4.3 4.3.3-5ubuntu4 [4162kB]
Get:9 http://es.archive.ubuntu.com jaunty/main g++ 4:4.3.3-1ubuntu1 [1438B]
Get:10 http://es.archive.ubuntu.com jaunty/main dpkg-dev 1.14.24ubuntu1 [643kB]
Get:11 http://es.archive.ubuntu.com jaunty/main build-essential 11.4 [7172B]
Get:12 http://es.archive.ubuntu.com jaunty/main gettext 0.17-6ubuntu2 [1910kB]
Get:13 http://es.archive.ubuntu.com jaunty/main libapr1 1.2.12-5 [109kB]
Get:14 http://es.archive.ubuntu.com jaunty/main libaprutil1 1.2.12+dfsg-8 [72.0kB]
Get:15 http://es.archive.ubuntu.com jaunty/main libncurses5-dev 5.7+20090207-1ubuntu1 [1550kB]
Get:16 http://es.archive.ubuntu.com jaunty/main libsvn1 1.5.4dfsg1-1ubuntu2 [734kB]
Get:17 http://es.archive.ubuntu.com jaunty/main ncurses-term 5.7+20090207-1ubuntu1 [498kB]
Get:18 http://es.archive.ubuntu.com jaunty/main sharutils 1:4.6.3-1build1 [108kB]
Get:19 http://es.archive.ubuntu.com jaunty/main subversion 1.5.4dfsg1-1ubuntu2 [340kB]
Get:20 http://es.archive.ubuntu.com jaunty/main texinfo 4.11.dfsg.1-4 [347kB]
Get:21 http://es.archive.ubuntu.com jaunty/main zlib1g-dev 1:1.2.3.3.dfsg-12ubuntu2 [161kB]
Fetched 13.9MB in 9s (1471kB/s)
Selecting previously deselected package m4.
(Reading database ... 119314 files and directories currently installed.)
Unpacking m4 (from .../archives/m4_1.4.11-1_i386.deb) ...
Selecting previously deselected package flex.
Unpacking flex (from .../flex_2.5.35-6ubuntu1_i386.deb) ...
Selecting previously deselected package autoconf.
Unpacking autoconf (from .../autoconf_2.63-2ubuntu1_all.deb) ...
Selecting previously deselected package autotools-dev.
Unpacking autotools-dev (from .../autotools-dev_20080123.2_all.deb) ...
Selecting previously deselected package automake.
Unpacking automake (from .../automake_1%3a1.10.2-0ubuntu3_all.deb) ...
Selecting previously deselected package bison.
Unpacking bison (from .../bison_1%3a2.3.dfsg-5_i386.deb) ...
Selecting previously deselected package libstdc++6-4.3-dev.
Unpacking libstdc++6-4.3-dev (from .../libstdc++6-4.3-dev_4.3.3-5ubuntu4_i386.deb) ...
Selecting previously deselected package g++-4.3.
Unpacking g++-4.3 (from .../g++-4.3_4.3.3-5ubuntu4_i386.deb) ...
Selecting previously deselected package g++.
Unpacking g++ (from .../g++_4%3a4.3.3-1ubuntu1_i386.deb) ...
Selecting previously deselected package dpkg-dev.
Unpacking dpkg-dev (from .../dpkg-dev_1.14.24ubuntu1_all.deb) ...
Selecting previously deselected package build-essential.
Unpacking build-essential (from .../build-essential_11.4_i386.deb) ...
Selecting previously deselected package gettext.
Unpacking gettext (from .../gettext_0.17-6ubuntu2_i386.deb) ...
Selecting previously deselected package libapr1.
Unpacking libapr1 (from .../libapr1_1.2.12-5_i386.deb) ...
Selecting previously deselected package libaprutil1.
Unpacking libaprutil1 (from .../libaprutil1_1.2.12+dfsg-8_i386.deb) ...
Selecting previously deselected package libncurses5-dev.
Unpacking libncurses5-dev (from .../libncurses5-dev_5.7+20090207-1ubuntu1_i386.deb) ...
Selecting previously deselected package libsvn1.
Unpacking libsvn1 (from .../libsvn1_1.5.4dfsg1-1ubuntu2_i386.deb) ...
Selecting previously deselected package ncurses-term.
Unpacking ncurses-term (from .../ncurses-term_5.7+20090207-1ubuntu1_all.deb) ...
Selecting previously deselected package sharutils.
Unpacking sharutils (from .../sharutils_1%3a4.6.3-1build1_i386.deb) ...
Selecting previously deselected package subversion.
Unpacking subversion (from .../subversion_1.5.4dfsg1-1ubuntu2_i386.deb) ...
Selecting previously deselected package texinfo.
Unpacking texinfo (from .../texinfo_4.11.dfsg.1-4_i386.deb) ...
Selecting previously deselected package zlib1g-dev.
Unpacking zlib1g-dev (from .../zlib1g-dev_1%3a1.2.3.3.dfsg-12ubuntu2_i386.deb) ...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 added doc-base file(s)...
Registering documents with scrollkeeper...
Setting up m4 (1.4.11-1) ...
Setting up flex (2.5.35-6ubuntu1) ...
Setting up autoconf (2.63-2ubuntu1) ...
Setting up autotools-dev (20080123.2) ...
Setting up automake (1:1.10.2-0ubuntu3) ...
Setting up bison (1:2.3.dfsg-5) ...
Setting up dpkg-dev (1.14.24ubuntu1) ...
Setting up gettext (0.17-6ubuntu2) ...
Setting up libapr1 (1.2.12-5) ...
Setting up libaprutil1 (1.2.12+dfsg-:cool: ...
Setting up libncurses5-dev (5.7+20090207-1ubuntu1) ...
Setting up libsvn1 (1.5.4dfsg1-1ubuntu2) ...
Setting up ncurses-term (5.7+20090207-1ubuntu1) ...
Setting up sharutils (1:4.6.3-1build1) ...
Setting up subversion (1.5.4dfsg1-1ubuntu2) ...
Setting up texinfo (4.11.dfsg.1-4) ...
Setting up zlib1g-dev (1:1.2.3.3.dfsg-12ubuntu2) ...
Setting up g++-4.3 (4.3.3-5ubuntu4) ...
Setting up libstdc++6-4.3-dev (4.3.3-5ubuntu4) ...
Setting up g++ (4:4.3.3-1ubuntu1) ...
Setting up build-essential (11.4) ...
Processing triggers for libc6 ...
ldconfig deferred processing now taking place
**********************************************************************************************************

Y después cambia el dash por bash (volver al bash, es necesario al trabajar con el modificador echo -e en las makefiles)

victek@roller:~$ sudo ln -sf /bin/bash /bin/sh
[sudo] password for victek: (entra el password que usaste al crear el usuario)

Y ya está.

Aquí os dejo el enlace al repositorio git de Tomato, con las versiones oficiales y las versiones modificadas tambien: http://repo.or.cz/w/tomato.git

Y después de haber bajado una versión del código fuente de tomato qué?

Pues se compila desde el directorio /tomato/release/src ejecutando: make .. y a esperar el resultado final.

Saludos y suerte!
 
#6
Como construir un firmware para nuestro router :LOL: :LOL: :LOL:

Han aparecido nuevos modelos en el mercado (WRT160N) que todavía no tienen un soporte completo de firmware de terceros, en este ejemplo voy a crear un firmware para el WRT160N.
Usaré OpenWRT como librería base, tiene todos los módulos (más o menos) necesarios para crear el firmware para este router.
Qué necesito primero? Una máquina Linux, usaremos Ubuntu como sistema operativo y añadiremos todas las librerías que están en el post anterior más GNU AWK.

1º Voy al trunk de OpenWRT y me bajo todos los módulos a un directorio en mi ordenador con esta orden escrita desde una ventana de terminal. Nos bajará la última revisión de todos los módulos de OpenWRT.



Y llega al final de los cientos de modulos bajados indicándonos la versión del trunk que ha bajado.



Por si acaso voy a bajar el resto de repositorios de toda la gente que coopera en el proyecto, así por ejemplo puedo bajar el interface gráfico de x-wrt, para ello escribo

cd ~/trunk/
svn update
./scripts/feeds update

Y pasarán otros 5-10 minutos bajando más paquetes.

2º Ahora vamos a bajar un parche para que el sistema detecte que tenemos un equipo modelo WRT160N, es un pequeño parche.



3º Comenzamos con un make menuconfig y le decimos al configurador que el Target Profile será un router con MIMO.



4º Ahora ya le hacemos un make



5º Y ya podemos ver los ficheros bin que ha preparado para los diferentes modelos de router que soporta OpenWRT, en nuestro caso escogeremos el general.



En este paso puede estar unos 20-25 minutos trabajando, depende de la potencia de vuestro ordenador. Una vez haya terminado la imagen .bin se encuentra en el directorio /trunk/bin , la podeís instalar usando la utilidad de upgrade del propio menú del router.

Saludos
 
#8
wOOx dijo:
Muy, muy, util.... que bien viene que expliques estas cosas Victek, porque todo el mundo se a preguntado esto alguna vez ;)

Saludos.
Yo,por ejemplo,uno de ellos.
Victek,Yo tengo la distribucion Debian,¿Podre hacer esto?,Supongo que si,¿no?
Y otra cosa,¿Tambien se pueden compilar firmwares para comtrend con esto?
Gracias,saludos
 
#9
Cualquier distribución Linux, y sobretodo con Debian que es una de las mejores, solo debes añadir las librerías y móduolos que detallo. Si, para Comtrend es lo mismo, solo se deb modificar el kernel para la CPU 6348

Saludos
 
#10
Victek dijo:
Cualquier distribución Linux, y sobretodo con Debian que es una de las mejores, solo debes añadir las librerías y móduolos que detallo. Si, para Comtrend es lo mismo, solo se deb modificar el kernel para la CPU 6348

Saludos
Ok,muchas gracias,que hariamos sin ti,Victek!!!! :p :p
Saludos,y sobretodo,muchisimas gracias!!
 
#12
make kernel_menuconfig

Pero Timon_95, yo muestro lo que hago pero no pretendo comenzar a dar clases de como hacer esto o aquello... ;), te he ahorrado algunas horas de comienzo, ahora te toca a ti buscar la información y probar. Ve con cuidado, cualquier fallo pequeño puede dejar tu router inservible y precisarás el JTAG para recuperarlo.

Saludos
 
#13
No hay que hacer un make kernel_menuconfig para compilar OpenWRT para routers BCM63XX, simplemente seleccionar el target de esa plataforma en make menuconfig. Además tiene que estar soportado el nombre de la placa del router, o añadirla a mano que es relativamente sencillo. Mejor leerse un hilo que hay en el foro de OpenWRT.

No esperes que funcione el módem ADSL del router tampoco., el resto sí que funciona (Wireless, switch, USB si lo tiene).

El cable JTAG no es tan necesario, pero al menos un cable para la consola serie (el cable de móviles Nokia DKU-5 vale) hay que tener.

Saludos
 
#14
Para el Comtrend HG536 nuevo.. que es el CT5361 debe seleccionar make kernel_menuconfig y en dispositivos MTD/flash/ram/rom habilitar el soporte de escritura a 8bits adicionalmente al de 16 bits, hay cambios en la placa de este modelo al incorporar dos memorias de 8MB en lugar de la de de 16MB conocida..

Saludos
 
#15
Victek dijo:
make kernel_menuconfig

Pero Timon_95, yo muestro lo que hago pero no pretendo comenzar a dar clases de como hacer esto o aquello... ;), te he ahorrado algunas horas de comienzo, ahora te toca a ti buscar la información y probar. Ve con cuidado, cualquier fallo pequeño puede dejar tu router inservible y precisarás el JTAG para recuperarlo.

Saludos
Ok,gracias Victek,lo siento si he sido pesado.
Muchas gracias,a partir de ahora me buscare la vida(como supongo que harias tu en su momento).
Gracias por tu ayuda,saludos
 
#19
Ferdinandpc

Ten cuidado con el firmware, porque tienes que saber que hay un tanto por ciento de posibilidades de que el router, quede muerto y tengas que andar tirando de JTag.

Saludos.
 
Arriba